From bc8bf7c7d7362270ee6a07341a06eeb19ac9417e Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Tue, 28 Nov 2023 21:43:54 -0500 Subject: [PATCH 001/281] oh my god my EYES --- code/__DEFINES/dcs/signals/signals_huds.dm | 2 + .../dcs/signals/signals_mob/signals_mob.dm | 3 - code/__DEFINES/hud.dm | 5 + code/__DEFINES/layers.dm | 65 ++- code/__DEFINES/lighting.dm | 45 +- code/__DEFINES/sight.dm | 5 +- code/__DEFINES/traits.dm | 6 + code/__HELPERS/_planes.dm | 49 ++ code/__HELPERS/cmp.dm | 3 + code/__HELPERS/colors.dm | 31 ++ code/__HELPERS/filters.dm | 6 + code/__HELPERS/unsorted.dm | 1 - code/_onclick/hud/fullscreen.dm | 2 +- code/_onclick/hud/hud.dm | 54 +++ code/_onclick/hud/plane_master.dm | 456 ++++++++++++++++++ code/controllers/subsystem/mapping.dm | 24 + code/datums/actions/mobs/adjust_vision.dm | 73 +++ code/datums/brain_damage/imaginary_friend.dm | 2 - code/datums/datum.dm | 63 +++ code/datums/status_effects/debuffs/debuffs.dm | 1 - code/datums/traits/good.dm | 2 +- code/game/atoms.dm | 15 - code/game/machinery/camera/camera.dm | 5 +- .../machinery/computer/camera_advanced.dm | 1 - code/game/objects/items.dm | 11 + code/game/turfs/openspace/openspace.dm | 1 + code/modules/antagonists/blob/blob_mobs.dm | 6 +- code/modules/antagonists/blob/overmind.dm | 6 +- .../antagonists/bloodsuckers/bloodsuckers.dm | 5 +- .../structures/bloodsucker_life.dm | 3 +- .../clock_items/wraith_spectacles.dm | 4 - .../clockcult/clock_mobs/_eminence.dm | 6 +- .../antagonists/demon/general_powers.dm | 5 +- code/modules/antagonists/devil/imp/imp.dm | 6 +- .../antagonists/disease/disease_mob.dm | 7 +- .../eldritch_cult/eldritch_items.dm | 3 +- code/modules/antagonists/horror/horror.dm | 5 +- code/modules/antagonists/morph/morph.dm | 6 +- code/modules/antagonists/revenant/revenant.dm | 10 +- .../revenant/revenant_abilities.dm | 11 +- .../antagonists/slaughter/slaughter.dm | 5 +- code/modules/cargo/bounties/special.dm | 2 +- code/modules/clothing/clothing.dm | 2 +- code/modules/clothing/glasses/_glasses.dm | 44 +- .../clothing/glasses/engine_goggles.dm | 10 +- code/modules/clothing/glasses/hud.dm | 21 +- .../mining/lavaland/necropolis_chests.dm | 6 +- code/modules/mining/minebot.dm | 11 +- code/modules/mob/camera/camera.dm | 5 +- code/modules/mob/dead/observer/observer.dm | 19 +- code/modules/mob/living/carbon/alien/alien.dm | 3 +- code/modules/mob/living/carbon/carbon.dm | 84 ++-- .../mob/living/carbon/human/inventory.dm | 4 +- .../human/species_types/shadowpeople.dm | 4 +- .../carbon/human/species_types/zombies.dm | 2 +- code/modules/mob/living/living.dm | 4 +- code/modules/mob/living/living_defines.dm | 1 - code/modules/mob/living/silicon/ai/ai.dm | 1 - code/modules/mob/living/silicon/ai/life.dm | 4 +- .../modules/mob/living/silicon/robot/robot.dm | 19 +- code/modules/mob/living/silicon/silicon.dm | 1 - .../mob/living/simple_animal/constructs.dm | 6 +- .../living/simple_animal/eldritch_demons.dm | 6 +- .../mob/living/simple_animal/friendly/cat.dm | 2 - .../mob/living/simple_animal/friendly/dog.dm | 6 +- .../simple_animal/friendly/drone/_drone.dm | 6 +- .../simple_animal/friendly/farm_animals.dm | 3 - .../mob/living/simple_animal/friendly/fox.dm | 1 - .../living/simple_animal/friendly/mouse.dm | 2 - .../living/simple_animal/friendly/penguin.dm | 1 - .../simple_animal/guardian/types/ranged.dm | 28 +- .../mob/living/simple_animal/hostile/alien.dm | 6 +- .../mob/living/simple_animal/hostile/bear.dm | 1 - .../living/simple_animal/hostile/eyeballs.dm | 4 + .../simple_animal/hostile/giant_spider.dm | 3 +- .../hostile/jungle/_jungle_mobs.dm | 6 +- .../simple_animal/hostile/killertomato.dm | 1 - .../simple_animal/hostile/megafauna/legion.dm | 4 + .../hostile/mining_mobs/hivelord.dm | 7 +- .../hostile/mining_mobs/mining_mobs.dm | 6 +- .../mob/living/simple_animal/hostile/rat.dm | 2 - .../living/simple_animal/hostile/regalrat.dm | 7 +- .../simple_animal/hostile/retaliate/bat.dm | 2 - .../hostile/retaliate/trianglespider.dm | 2 - .../living/simple_animal/hostile/skeleton.dm | 6 +- .../living/simple_animal/hostile/smspider.dm | 8 +- .../simple_animal/hostile/space_dragon.dm | 2 - .../living/simple_animal/hostile/statue.dm | 8 +- .../simple_animal/hostile/venus_human_trap.dm | 5 +- .../mob/living/simple_animal/simple_animal.dm | 4 +- code/modules/mob/mob.dm | 30 +- code/modules/mob/mob_defines.dm | 20 +- code/modules/mob/mob_helpers.dm | 5 + code/modules/mob/status_procs.dm | 28 ++ .../xenobiology/crossbreeding/_structures.dm | 2 +- code/modules/shuttle/navigation_computer.dm | 5 +- .../shuttle_creation/shuttle_creator_eye.dm | 5 +- .../spells/spell_types/self/night_vision.dm | 39 -- code/modules/surgery/organs/eyes.dm | 88 +++- yogstation.dme | 4 +- .../game/gamemodes/shadowling/shadowling.dm | 2 +- .../game/gamemodes/vampire/vampire_bat.dm | 2 - .../shadowling/shadowling_abilities.dm | 48 +- .../antagonists/slaughter/slaughter.dm | 2 - .../code/modules/clothing/glasses/_glasses.dm | 3 +- yogstation/code/modules/guardian/guardian.dm | 1 - .../carbon/human/species_types/darkspawn.dm | 2 +- .../human/species_types/preternis/organs.dm | 55 ++- .../carbon/human/species_types/szlachta.dm | 2 +- yogstation/code/modules/mob/living/living.dm | 2 +- .../surgery/organs/shadowling_organs.dm | 4 +- 111 files changed, 1337 insertions(+), 423 deletions(-) create mode 100644 code/__DEFINES/dcs/signals/signals_huds.dm create mode 100644 code/__HELPERS/_planes.dm create mode 100644 code/datums/actions/mobs/adjust_vision.dm delete mode 100644 code/modules/spells/spell_types/self/night_vision.dm diff --git a/code/__DEFINES/dcs/signals/signals_huds.dm b/code/__DEFINES/dcs/signals/signals_huds.dm new file mode 100644 index 000000000000..50e3069a6149 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_huds.dm @@ -0,0 +1,2 @@ +/// Sent from /datum/hud/proc/eye_z_changed() : (old_offset, new_offset) +#define COMSIG_HUD_OFFSET_CHANGED "hud_offset_changed" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob.dm index 14d26b0ac454..4423bfff8cc7 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob.dm @@ -80,9 +80,6 @@ #define COMSIG_MOB_SIGHT_CHANGE "mob_sight_changed" ///from base of mob/set_invis_see(): (new_invis, old_invis) #define COMSIG_MOB_SEE_INVIS_CHANGE "mob_see_invis_change" -///from base of mob/set_see_in_dark(): (new_range, old_range) -#define COMSIG_MOB_SEE_IN_DARK_CHANGE "mob_see_in_dark_change" - ///from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction) #define COMSIG_MOB_APPLY_DAMAGE "mob_apply_damage" diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index fdcc04a03b8f..900b77f28848 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -233,3 +233,8 @@ #define SCRN_OBJ_INSERT_FIRST "first" /// The filter name for the hover outline #define HOVER_OUTLINE_FILTER "hover_outline" +// Plane group keys, used to group swaths of plane masters that need to appear in subwindows +/// The primary group, holds everything on the main window +#define PLANE_GROUP_MAIN "main" +/// A secondary group, used when a client views a generic window +#define PLANE_GROUP_POPUP_WINDOW(screen) "popup-[REF(screen)]" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 3ce945e5eecc..c8598014fce9 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -1,6 +1,9 @@ //Defines for atom layers and planes //KEEP THESE IN A NICE ACSCENDING ORDER, PLEASE +//NEVER HAVE ANYTHING BELOW THIS PLANE ADJUST IF YOU NEED MORE SPACE +#define LOWEST_EVER_PLANE -100 + #define CLICKCATCHER_PLANE -99 #define PLANE_SPACE -95 @@ -8,13 +11,20 @@ #define PLANE_SPACE_PARALLAX -90 #define PLANE_SPACE_PARALLAX_RENDER_TARGET "PLANE_SPACE_PARALLAX" +#define GRAVITY_PULSE_PLANE -89 +#define GRAVITY_PULSE_RENDER_TARGET "*GRAVPULSE_RENDER_TARGET" + #define SINGULARITY_EFFECT_PLANE -80 #define SINGULARITY_RENDER_TARGET "*SINGULARITY_EFFECTS_PLANE" -#define FLOOR_PLANE -2 +#define RENDER_PLANE_TRANSPARENT -12 //Transparent plane that shows openspace underneath the floor +#define TRANSPARENT_FLOOR_PLANE -5 +#define FLOOR_PLANE -4 #define FLOOR_PLANE_RENDER_TARGET "FLOOR_PLANE" -#define GAME_PLANE -1 +#define WALL_PLANE -3 +#define GAME_PLANE -2 #define GAME_PLANE_RENDER_TARGET "GAME_PLANE" +#define WALL_PLANE_UPPER -1 #define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals #define BLACKNESS_PLANE_RENDER_TARGET "BLACKNESS_PLANE" @@ -99,6 +109,16 @@ #define EMISSIVE_LAYER 13 #define EMISSIVE_RENDER_TARGET "*EMISSIVE_PLANE" +/// This plane masks out lighting to create an "emissive" effect, ie for glowing lights in otherwise dark areas. +#define EMISSIVE_RENDER_PLATE 14 +#define EMISSIVE_RENDER_TARGET "*EMISSIVE_PLANE" + +// Ensures all the render targets that point at the emissive plate layer correctly +#define EMISSIVE_Z_BELOW_LAYER 1 +#define EMISSIVE_FLOOR_LAYER 2 +#define EMISSIVE_SPACE_LAYER 3 +#define EMISSIVE_WALL_LAYER 4 + #define EMISSIVE_UNBLOCKABLE_PLANE 14 #define EMISSIVE_UNBLOCKABLE_LAYER 14 #define EMISSIVE_UNBLOCKABLE_RENDER_TARGET "*EMISSIVE_UNBLOCKABLE_PLANE" @@ -109,11 +129,16 @@ #define RAD_TEXT_LAYER 15.1 - #define O_LIGHTING_VISUAL_PLANE 16 #define O_LIGHTING_VISUAL_LAYER 16 #define O_LIGHTING_VISUAL_RENDER_TARGET "O_LIGHT_VISUAL_PLANE" +#define RENDER_PLANE_LIGHTING 15 +/// Masks the lighting plane with turfs, so we never light up the void +/// Failing that, masks emissives and the overlay lighting plane +#define LIGHT_MASK_PLANE 16 +#define LIGHT_MASK_RENDER_TARGET "*LIGHT_MASK_PLANE" + #define ABOVE_LIGHTING_PLANE 200 //things that should render ignoring lightning #define ABOVE_LIGHTING_LAYER 17 #define ABOVE_LIGHTING_RENDER_TARGET "ABOVE_LIGHTING_PLANE" @@ -156,11 +181,45 @@ #define SPLASHSCREEN_PLANE 23 #define SPLASHSCREEN_RENDER_TARGET "SPLASHSCREEN_PLANE" +/// This plane master will temporarially remove relays to all other planes +/// Allows us to retain the effects of a plane while cutting off the changes it makes +#define PLANE_CRITICAL_NO_RELAY (1<<1) +/// We assume this plane master has a render target starting with *, it'll be removed, forcing it to render in place +#define PLANE_CRITICAL_CUT_RENDER (1<<2) + +#define PLANE_CRITICAL_FUCKO_PARALLAX (PLANE_CRITICAL_DISPLAY|PLANE_CRITICAL_NO_RELAY|PLANE_CRITICAL_CUT_RENDER) //-------------------- Rendering --------------------- +//Plane master critical flags +//Describes how different plane masters behave when they are being culled for performance reasons +/// This plane master will not go away if its layer is culled. useful for preserving effects +#define PLANE_CRITICAL_DISPLAY (1<<0) + #define RENDER_PLANE_GAME 100 #define RENDER_PLANE_NON_GAME 101 +///Slightly above the game plane but does not catch mouse clicks. Useful for certain visuals that should be clicked through, like seethrough trees +#define SEETHROUGH_PLANE -3 +#define ABOVE_GAME_PLANE -2 + +#define RENDER_PLANE_GAME_WORLD -1 + +#define DEFAULT_PLANE 0 //Marks out the default plane, even if we don't use it + +#define AREA_PLANE 2 +#define MASSIVE_OBJ_PLANE 3 +#define GHOST_PLANE 4 +#define POINT_PLANE 5 + +#define RENDER_PLANE_MASTER 110 + +// Lummox I swear to god I will find you +// NOTE! You can only ever have planes greater then -10000, if you add too many with large offsets you will brick multiz +// Same can be said for large multiz maps. Tread carefully mappers +#define HIGHEST_EVER_PLANE RENDER_PLANE_MASTER +/// The range unique planes can be in +#define PLANE_RANGE (HIGHEST_EVER_PLANE - LOWEST_EVER_PLANE) + ///1000 is an unimportant number, it's just to normalize copied layers #define RADIAL_CONTENT_LAYER 1000 diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 57271b6bcdee..a377464d4248 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -56,12 +56,16 @@ ///How many tiles standard fires glow. #define LIGHT_RANGE_FIRE 3 -#define LIGHTING_PLANE_ALPHA_VISIBLE 255 -#define LIGHTING_PLANE_ALPHA_NV_TRAIT 245 -#define LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE 192 -/// For lighting alpha, small amounts lead to big changes. even at 128 its hard to figure out what is dark and what is light, at 64 you almost can't even tell. -#define LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE 128 -#define LIGHTING_PLANE_ALPHA_INVISIBLE 0 +// Lighting cutoff defines +// These are a percentage of how much darkness to cut off (in rgb) +#define LIGHTING_CUTOFF_VISIBLE 0 +#define LIGHTING_CUTOFF_REAL_LOW 4.5 +#define LIGHTING_CUTOFF_MEDIUM 15 +#define LIGHTING_CUTOFF_HIGH 30 +#define LIGHTING_CUTOFF_FULLBRIGHT 100 + +/// What counts as being able to see in the dark +#define LIGHTING_NIGHTVISION_THRESHOLD 10 //lighting area defines /// dynamic lighting disabled (area stays at full brightness) @@ -114,3 +118,32 @@ do { \ source.lum_b = 1; \ }; \ } while (FALSE) + +// Emissive blocking. +/// Uses vis_overlays to leverage caching so that very few new items need to be made for the overlay. For anything that doesn't change outline or opaque area much or at all. +#define EMISSIVE_BLOCK_GENERIC 0 +/// Uses a dedicated render_target object to copy the entire appearance in real time to the blocking layer. For things that can change in appearance a lot from the base state, like humans. +#define EMISSIVE_BLOCK_UNIQUE 1 +/// Don't block any emissives. Useful for things like, pieces of paper? +#define EMISSIVE_BLOCK_NONE 2 + + +#define _EMISSIVE_COLOR(val) list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, val,val,val,0) +/// The color matrix applied to all emissive overlays. Should be solely dependent on alpha and not have RGB overlap with [EM_BLOCK_COLOR]. +#define EMISSIVE_COLOR _EMISSIVE_COLOR(1) +/// A globaly cached version of [EMISSIVE_COLOR] for quick access. +GLOBAL_LIST_INIT(emissive_color, EMISSIVE_COLOR) + +#define _EM_BLOCK_COLOR(val) list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,val, 0,0,0,0) +/// The color matrix applied to all emissive blockers. Should be solely dependent on alpha and not have RGB overlap with [EMISSIVE_COLOR]. +#define EM_BLOCK_COLOR _EM_BLOCK_COLOR(1) +/// A globaly cached version of [EM_BLOCK_COLOR] for quick access. +GLOBAL_LIST_INIT(em_block_color, EM_BLOCK_COLOR) + +/// A set of appearance flags applied to all emissive and emissive blocker overlays. +/// KEEP_APART to prevent parent hooking, KEEP_TOGETHER for children, and we reset the color and alpha of our parent so nothing gets overriden +#define EMISSIVE_APPEARANCE_FLAGS (KEEP_APART|KEEP_TOGETHER|RESET_COLOR|RESET_ALPHA) +/// The color matrix used to mask out emissive blockers on the emissive plane. Alpha should default to zero, be solely dependent on the RGB value of [EMISSIVE_COLOR], and be independant of the RGB value of [EM_BLOCK_COLOR]. +#define EM_MASK_MATRIX list(0,0,0,1/3, 0,0,0,1/3, 0,0,0,1/3, 0,0,0,0, 1,1,1,0) +/// A globaly cached version of [EM_MASK_MATRIX] for quick access. +GLOBAL_LIST_INIT(em_mask_matrix, EM_MASK_MATRIX) diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm index 862c851f187f..7952d9addd21 100644 --- a/code/__DEFINES/sight.dm +++ b/code/__DEFINES/sight.dm @@ -28,5 +28,8 @@ #define VISOR_TINT (1<<1) #define VISOR_VISIONFLAGS (1<<2) //all following flags only matter for glasses #define VISOR_DARKNESSVIEW (1<<3) -#define VISOR_INVISVIEW (1<<4) +#define VISOR_INVISVIEW (1<<3) +/// Bitfield of sight flags that show THINGS but no lighting +/// Since lighting is an underlay on turfs, this is everything but that +#define SEE_AVOID_TURF_BLACKNESS (SEE_MOBS|SEE_OBJS) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 0cdc86824d08..e812b802fcbd 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -492,3 +492,9 @@ #define TRAIT_BEING_BLADE_SHIELDED "being_blade_shielded" /// things with this trait are treated as having no access in /obj/proc/check_access(obj/item) #define TRAIT_ALWAYS_NO_ACCESS "alwaysnoaccess" +/// Gives us Night vision +#define TRAIT_TRUE_NIGHT_VISION "true_night_vision" +/// Gives us turf vision through walls and slight night vision +#define TRAIT_MESON_VISION "meson_vision" +/// Ignores darkness for hearing +#define TRAIT_HEAR_THROUGH_DARKNESS "hear_through_darkness" diff --git a/code/__HELPERS/_planes.dm b/code/__HELPERS/_planes.dm new file mode 100644 index 000000000000..c9d8c8de21cb --- /dev/null +++ b/code/__HELPERS/_planes.dm @@ -0,0 +1,49 @@ +/// Takes a plane to offset, and the multiplier to use, and well, does the offsetting +/// Respects a blacklist we use to remove redundant plane masters, such as hud objects +#define GET_NEW_PLANE(new_value, multiplier) (SSmapping.plane_offset_blacklist?["[new_value]"] ? new_value : (new_value) - (PLANE_RANGE * (multiplier))) +/// Takes a render target and an offset, returns a canonical render target string for it +#define OFFSET_RENDER_TARGET(render_target, offset) (_OFFSET_RENDER_TARGET(render_target, SSmapping.render_offset_blacklist?["[render_target]"] ? 0 : offset)) +/// Helper macro for the above +/// Honestly just exists to make the pattern of render target strings more readable +#define _OFFSET_RENDER_TARGET(render_target, offset) ("[(render_target)] #[(offset)]") +/// Takes a plane, returns TRUE if it is of critical priority, FALSE otherwise +#define PLANE_IS_CRITICAL(plane) ((SSmapping.plane_to_offset) ? !!SSmapping.critical_planes["[plane]"] : FALSE) +/// Implicit plane set. We take the turf from the object we're changing the plane of, and use ITS z as a spokesperson for our plane value +#define SET_PLANE_IMPLICIT(thing, new_value) SET_PLANE_EXPLICIT(thing, new_value, thing) +/// Takes a plane, returns the canonical, unoffset plane it represents +#define PLANE_TO_TRUE(plane) ((SSmapping.plane_offset_to_true) ? SSmapping.plane_offset_to_true["[plane]"] : plane) +/// Takes a plane, returns the offset it uses +#define PLANE_TO_OFFSET(plane) ((SSmapping.plane_to_offset) ? SSmapping.plane_to_offset["[plane]"] : plane) +/// Takes a z reference that we are unsure of, sanity checks it +/// Returns either its offset, or 0 if it's not a valid ref +/// Will return the reference's PLANE'S offset if we can't get anything out of the z level. We do our best +#define GET_TURF_PLANE_OFFSET(z_reference) ((SSmapping.max_plane_offset && isatom(z_reference)) ? (z_reference.z ? GET_Z_PLANE_OFFSET(z_reference.z) : PLANE_TO_OFFSET(z_reference.plane)) : 0) +/// Essentially just an unsafe version of GET_TURF_PLANE_OFFSET() +/// Takes a z value we returns its offset with a list lookup +/// Will runtime during parts of init. Be careful :) +#define GET_Z_PLANE_OFFSET(z) (SSmapping.z_level_to_plane_offset[z]) +/// Takes a true plane, returns the offset planes that would canonically represent it +#define TRUE_PLANE_TO_OFFSETS(plane) ((SSmapping.true_to_offset_planes) ? SSmapping.true_to_offset_planes["[plane]"] : list(plane)) +// This is an unrolled and optimized version of SET_PLANE, for use anywhere where you are unsure of a source's "turfness" +// We do also try and guess at what the thing's z level is, even if it's not a z +// The plane is cached to allow for fancy stuff to be eval'd once, rather then often +#define SET_PLANE_EXPLICIT(thing, new_value, source) \ + do {\ + if(SSmapping.max_plane_offset) {\ + var/_cached_plane = new_value;\ + var/turf/_our_turf = get_turf(source);\ + if(_our_turf){\ + thing.plane = GET_NEW_PLANE(_cached_plane, GET_Z_PLANE_OFFSET(_our_turf.z));\ + }\ + else if(source) {\ + thing.plane = GET_NEW_PLANE(_cached_plane, PLANE_TO_OFFSET(source.plane));\ + }\ + else {\ + thing.plane = _cached_plane;\ + }\ + }\ + else {\ + thing.plane = new_value;\ + }\ + }\ + while (FALSE) diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 73118506fcf1..06bca876d4bb 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -150,3 +150,6 @@ GLOBAL_VAR_INIT(cmp_field, "name") rhs = ispath(B, /datum/reagent) ? 0 : 1 return lhs - rhs + +/proc/cmp_filter_data_priority(list/A, list/B) + return A["priority"] - B["priority"] diff --git a/code/__HELPERS/colors.dm b/code/__HELPERS/colors.dm index 4a15f36ef6ff..134091a88f88 100644 --- a/code/__HELPERS/colors.dm +++ b/code/__HELPERS/colors.dm @@ -16,3 +16,34 @@ final_color += copytext(color, digit, digit + 1) return final_color + +/// Blends together two colors (passed as 3 or 4 length lists) using the screen blend mode +/// Much like multiply, screen effects the brightness of the resulting color +/// Screen blend will always lighten the resulting color, since before multiplication we invert the colors +/// This makes our resulting output brighter instead of darker +/proc/blend_screen_color(list/first_color, list/second_color) + var/list/output = new /list(4) + + // max out any non existant alphas + if(length(first_color) < 4) + first_color[4] = 255 + if(length(second_color) < 4) + second_color[4] = 255 + + // time to do our blending + for(var/i in 1 to 4) + output[i] = (1 - (1 - first_color[i] / 255) * (1 - second_color[i] / 255)) * 255 + return output + +/// Used to blend together two different color cutoffs +/// Uses the screen blendmode under the hood, essentially just [/proc/blend_screen_color] +/// But paired down and modified to work for our color range +/// Accepts the color cutoffs as two 3 length list(0-100,...) arguments +/proc/blend_cutoff_colors(list/first_color, list/second_color) + var/list/output = new /list(3) + + // Invert the colors, multiply to "darken" (actually lights), then uninvert to get back to what we want + for(var/i in 1 to 3) + output[i] = (1 - (1 - first_color[i] / 100) * (1 - second_color[i] / 100)) * 100 + + return output diff --git a/code/__HELPERS/filters.dm b/code/__HELPERS/filters.dm index 5bc143695e2b..29825367c33e 100644 --- a/code/__HELPERS/filters.dm +++ b/code/__HELPERS/filters.dm @@ -19,3 +19,9 @@ .["color"] = color if(!isnull(flags)) .["flags"] = flags + +/proc/color_matrix_filter(matrix/in_matrix, space) + . = list("type" = "color") + .["color"] = in_matrix + if(!isnull(space)) + .["space"] = space diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 74ec550f4a37..952e2d9d983e 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1206,7 +1206,6 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) name = "INTERNAL DVIEW MOB" invisibility = 101 density = FALSE - see_in_dark = 1e6 move_resist = INFINITY var/ready_to_die = FALSE diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 1162314ce15a..0fe15e009176 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -184,7 +184,7 @@ /atom/movable/screen/fullscreen/lighting_backdrop icon = 'icons/mob/screen_gen.dmi' icon_state = "flash" - transform = matrix(200, 0, 0, 0, 200, 0) + screen_loc = "WEST,SOUTH to EAST,NORTH" plane = LIGHTING_PLANE blend_mode = BLEND_OVERLAY show_when_dead = TRUE diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index f60a5fa86cdc..bc28261dc38e 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -63,6 +63,16 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/atom/movable/screen/healths var/atom/movable/screen/healthdoll var/atom/movable/screen/stamina + /// Think of multiz as a stack of z levels. Each index in that stack has its own group of plane masters + /// This variable is the plane offset our mob/client is currently "on" + /// We use it to track what we should show/not show + /// Goes from 0 to the max (z level stack size - 1) + var/current_plane_offset = 0 + /// Assoc list of key => "plane master groups" + /// This is normally just the main window, but it'll occasionally contain things like spyglasses windows + var/list/datum/plane_master_group/master_groups = list() + ///Assoc list of controller groups, associated with key string group name with value of the plane master controller ref + var/list/atom/movable/plane_master_controller/plane_master_controllers = list() // subtypes can override this to force a specific UI style var/ui_style @@ -634,3 +644,47 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /datum/action_group/listed/refresh_actions() . = ..() owner.palette_actions.refresh_actions() // We effect them, so we gotta refresh em + +/datum/hud/proc/should_use_scale() + return should_sight_scale(mymob.sight) + +/datum/hud/proc/should_sight_scale(sight_flags) + return (sight_flags & (SEE_TURFS | SEE_OBJS)) != SEE_TURFS + +/datum/hud/proc/eye_z_changed(atom/eye) + SIGNAL_HANDLER + update_parallax_pref() // If your eye changes z level, so should your parallax prefs + var/turf/eye_turf = get_turf(eye) + var/new_offset = GET_TURF_PLANE_OFFSET(eye_turf) + if(current_plane_offset == new_offset) + return + var/old_offset = current_plane_offset + current_plane_offset = new_offset + + SEND_SIGNAL(src, COMSIG_HUD_OFFSET_CHANGED, old_offset, new_offset) + if(should_use_scale()) + for(var/group_key as anything in master_groups) + var/datum/plane_master_group/group = master_groups[group_key] + group.transform_lower_turfs(src, new_offset) + +/// Returns the plane master that matches the input plane from the passed in group +/datum/hud/proc/get_plane_master(plane, group_key = PLANE_GROUP_MAIN) + var/plane_key = "[plane]" + var/datum/plane_master_group/group = master_groups[group_key] + return group.plane_masters[plane_key] + +/// Returns a list of all plane masters that match the input true plane, drawn from the passed in group (ignores z layer offsets) +/datum/hud/proc/get_true_plane_masters(true_plane, group_key = PLANE_GROUP_MAIN) + var/list/atom/movable/screen/plane_master/masters = list() + for(var/plane in TRUE_PLANE_TO_OFFSETS(true_plane)) + masters += get_plane_master(plane, group_key) + return masters + +/// Returns all the planes belonging to the passed in group key +/datum/hud/proc/get_planes_from(group_key) + var/datum/plane_master_group/group = master_groups[group_key] + return group.plane_masters + +/// Returns the corresponding plane group datum if one exists +/datum/hud/proc/get_plane_group(key) + return master_groups[key] diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index 401a350fba1d..fdd372ddbe0f 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -11,6 +11,30 @@ //--rendering relay vars-- /// list of planes we will relay this plane's render to var/list/render_relay_planes = list(RENDER_PLANE_GAME) + /// If this plane master is being forced to hide. + /// Hidden PMs will dump ANYTHING relayed or drawn onto them. Be careful with this + /// Remember: a hidden plane master will dump anything drawn directly to it onto the output render. It does NOT hide its contents + /// Use alpha for that + var/force_hidden = FALSE + /// If this plane master is outside of our visual bounds right now + var/is_outside_bounds = FALSE + /// Our offset from our "true" plane, see below + var/offset + /// list of current relays this plane is utilizing to render + var/list/atom/movable/render_plane_relay/relays = list() + /// if render relays have already be generated + var/relays_generated = FALSE + /// See [code\__DEFINES\layers.dm] for our bitflags + var/critical = NONE + /// The plane master group we're a member of, our "home" + var/datum/plane_master_group/home + /// blend mode to apply to the render relay in case you dont want to use the plane_masters blend_mode + var/blend_mode_override + /// Our real alpha value, so alpha can persist through being hidden/shown + var/true_alpha = 255 + /// Tracks if we're using our true alpha, or being manipulated in some other way + var/alpha_enabled = TRUE + /atom/movable/screen/plane_master/proc/Show(override) alpha = override || show_alpha @@ -30,6 +54,13 @@ blend_mode = BLEND_MULTIPLY alpha = 255 +/atom/movable/screen/plane_master/proc/disable_alpha() + alpha_enabled = FALSE + alpha = 0 + +/atom/movable/screen/plane_master/proc/enable_alpha() + alpha_enabled = TRUE + alpha = true_alpha /atom/movable/screen/plane_master/openspace/backdrop(mob/mymob) filters = list() filters += filter(type="alpha", render_source = LIGHTING_RENDER_TARGET, flags = MASK_INVERSE) @@ -52,6 +83,16 @@ plane = FLOOR_PLANE appearance_flags = PLANE_MASTER blend_mode = BLEND_OVERLAY + render_relay_planes = list(RENDER_PLANE_GAME, LIGHT_MASK_PLANE) + +/atom/movable/screen/plane_master/transparent_floor + name = "Transparent Floor" + // documentation = "Really just openspace, stuff that is a turf but has no color or alpha whatsoever.\ + //
We use this to draw to just the light mask plane, cause if it's not there we get holes of blackness over openspace" + plane = TRANSPARENT_FLOOR_PLANE + render_relay_planes = list(LIGHT_MASK_PLANE) + // Needs to be critical or it uh, it'll look white + critical = PLANE_CRITICAL_DISPLAY|PLANE_CRITICAL_NO_RELAY /atom/movable/screen/plane_master/floor/backdrop(mob/mymob) filters = list() @@ -77,6 +118,23 @@ filters += filter(type="displace", render_source = SINGULARITY_RENDER_TARGET, size=75) +/atom/movable/screen/plane_master/wall + name = "Wall" + // documentation = "Holds all walls. We render this onto the game world. Separate so we can use this + space and floor planes as a guide for where byond blackness is NOT." + plane = WALL_PLANE + render_relay_planes = list(RENDER_PLANE_GAME_WORLD, LIGHT_MASK_PLANE) + +/atom/movable/screen/plane_master/wall/Initialize(mapload, datum/plane_master_group/home, offset) + . = ..() + add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset), relay_layer = EMISSIVE_WALL_LAYER, relay_color = GLOB.em_block_color) + +/atom/movable/screen/plane_master/wall_upper + name = "Upper wall" + // documentation = "There are some walls that want to render above most things (mostly minerals since they shift over.\ + //
We draw them to their own plane so we can hijack them for our emissive mask stuff" + plane = WALL_PLANE_UPPER + render_relay_planes = list(RENDER_PLANE_GAME_WORLD, LIGHT_MASK_PLANE) + ///Contains all lighting objects /atom/movable/screen/plane_master/lighting name = "lighting plane master" @@ -149,6 +207,9 @@ /atom/movable/screen/plane_master/parallax_white name = "parallax whitifier plane master" plane = PLANE_SPACE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + render_relay_planes = list(RENDER_PLANE_GAME, LIGHT_MASK_PLANE) + critical = PLANE_CRITICAL_FUCKO_PARALLAX // goes funny when touched. no idea why I don't trust byond /atom/movable/screen/plane_master/lighting/backdrop(mob/mymob) mymob.overlay_fullscreen("lighting_backdrop_lit", /atom/movable/screen/fullscreen/lighting_backdrop/lit) @@ -185,6 +246,60 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT blend_mode = BLEND_MULTIPLY +/// Gets the relay atom we're using to connect to the target plane, if one exists +/atom/movable/screen/plane_master/proc/get_relay_to(target_plane) + for(var/atom/movable/render_plane_relay/relay in relays) + if(relay.plane == target_plane) + return relay + +/proc/get_plane_master_render_base(name) + return "*[name]: AUTOGENERATED RENDER TGT" + +/atom/movable/screen/plane_master/proc/generate_relay_to(target_plane, relay_loc, client/show_to, blend_override, relay_layer) + if(!length(relays) && !initial(render_target)) + render_target = OFFSET_RENDER_TARGET(get_plane_master_render_base(name), offset) + if(!relay_loc) + relay_loc = "CENTER" + // If we're using a submap (say for a popup window) make sure we draw onto it + if(home?.map) + relay_loc = "[home.map]:[relay_loc]" + var/blend_to_use = blend_override + if(isnull(blend_to_use)) + blend_to_use = blend_mode_override || initial(blend_mode) + + var/atom/movable/render_plane_relay/relay = new() + relay.render_source = render_target + relay.plane = target_plane + relay.screen_loc = relay_loc + // There are two rules here + // 1: layer needs to be positive (negative layers are treated as float layers) + // 2: lower planes (including offset ones) need to be layered below higher ones (because otherwise they'll render fucky) + // By multiplying LOWEST_EVER_PLANE by 30, we give 30 offsets worth of room to planes before they start going negative + // Bet + // We allow for manuel override if requested. careful with this + relay.layer = relay_layer || (plane + abs(LOWEST_EVER_PLANE * 30)) //layer must be positive but can be a decimal + relay.blend_mode = blend_to_use + relay.mouse_opacity = mouse_opacity + relay.name = render_target + relay.critical_target = PLANE_IS_CRITICAL(target_plane) + relays += relay + // Relays are sometimes generated early, before huds have a mob to display stuff to + // That's what this is for + if(show_to) + show_to.screen += relay + return relay + +/// Creates a connection between this plane master and the passed in plane +/// Helper for out of system code, shouldn't be used in this file +/// Build system to differenchiate between generated and non generated render relays +/atom/movable/screen/plane_master/proc/add_relay_to(target_plane, blend_override, relay_layer, relay_color) + if(get_relay_to(target_plane)) + return + render_relay_planes += target_plane + var/client/display_lad = home?.our_hud?.mymob?.canon_client + var/atom/movable/render_plane_relay/relay = generate_relay_to(target_plane, show_to = display_lad, blend_override = blend_override, relay_layer = relay_layer) + relay.color = relay_color + /** * Render relay object assigned to a plane master to be able to relay it's render onto other planes that are not it's own */ @@ -196,6 +311,11 @@ /// If we render into a critical plane master, or not var/critical_target = FALSE +/// Hook to allow planes to work around is_outside_bounds +/// Return false to allow a show, true otherwise +/atom/movable/screen/plane_master/proc/check_outside_bounds() + return is_outside_bounds + /atom/movable/screen/plane_master/fullscreen name = "Fullscreen" plane = FULLSCREEN_PLANE @@ -203,3 +323,339 @@ render_relay_planes = list(RENDER_PLANE_NON_GAME) mouse_opacity = MOUSE_OPACITY_TRANSPARENT allows_offsetting = FALSE + +/atom/movable/screen/plane_master/parallax + name = "Parallax" + // documentation = "Contains parallax, or to be more exact the screen objects that hold parallax.\ + //
Note the BLEND_MULTIPLY. The trick here is how low our plane value is. Because of that, we draw below almost everything in the game.\ + //
We abuse this to ensure we multiply against the Parallax whitifier plane, or space's plane. It's set to full white, so when you do the multiply you just get parallax out where it well, makes sense to be.\ + //
Also notice that the parent parallax plane is mirrored down to all children. We want to support viewing parallax across all z levels at once." + plane = PLANE_SPACE_PARALLAX + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + blend_mode = BLEND_MULTIPLY + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + + +/// Hides a plane master from the passeed in mob +/// Do your effect cleanup here +/atom/movable/screen/plane_master/proc/hide_from(mob/oldmob) + SHOULD_CALL_PARENT(TRUE) + var/client/their_client = oldmob?.client + if(!their_client) + return + their_client.screen -= src + their_client.screen -= relays + +/// Shows a plane master to the passed in mob +/// Override this to apply unique effects and such +/// Returns TRUE if the call is allowed, FALSE otherwise +/atom/movable/screen/plane_master/proc/show_to(mob/mymob) + SHOULD_CALL_PARENT(TRUE) + if(force_hidden) + return FALSE + var/client/our_client = mymob?.client + // Alright, let's get this out of the way + // Mobs can move z levels without their client. If this happens, we need to ensure critical display settings are respected + // This is done here. Mild to severe pain but it's nessesary + if(check_outside_bounds()) + if(!(critical & PLANE_CRITICAL_DISPLAY)) + return FALSE + if(!our_client) + return TRUE + our_client.screen += src + + if(!(critical & PLANE_CRITICAL_NO_RELAY)) + our_client.screen += relays + return TRUE + + return TRUE + + if(!our_client) + return TRUE + + our_client.screen += src + our_client.screen += relays + return TRUE + +/atom/movable/screen/plane_master/proc/outside_bounds(mob/relevant) + if(force_hidden || is_outside_bounds) + return + is_outside_bounds = TRUE + // If we're of critical importance, AND we're below the rendering layer + if(critical & PLANE_CRITICAL_DISPLAY) + // We here assume that your render target starts with * + if(critical & PLANE_CRITICAL_CUT_RENDER && render_target) + render_target = copytext_char(render_target, 2) + if(!(critical & PLANE_CRITICAL_NO_RELAY)) + return + var/client/our_client = relevant.client + if(our_client) + for(var/atom/movable/render_plane_relay/relay as anything in relays) + our_client.screen -= relay + + return + hide_from(relevant) + +/// Datum that represents one "group" of plane masters +/// So all the main window planes would be in one, all the spyglass planes in another +/// Etc +/datum/plane_master_group + /// Our key in the group list on /datum/hud + /// Should be unique for any group of plane masters in the world + var/key + /// Our parent hud + var/datum/hud/our_hud + /// List in the form "[plane]" = object, the plane masters we own + var/list/atom/movable/screen/plane_master/plane_masters = list() + /// The visual offset we are currently using + var/active_offset = 0 + /// What, if any, submap we render onto + var/map = "" + +/// Nice wrapper for the "[]"ing +/datum/plane_master_group/proc/get_plane(plane) + return plane_masters["[plane]"] + +///Contains all lighting objects +/atom/movable/screen/plane_master/rendering_plate/lighting + name = "Lighting plate" + // documentation = "Anything on this plane will be multiplied with the plane it's rendered onto (typically the game plane).\ + //
That's how lighting functions at base. Because it uses BLEND_MULTIPLY and occasionally color matrixes, it needs a backdrop of blackness.\ + //
See This byond post\ + //
Lemme see uh, we're masked by the emissive plane so it can actually function (IE: make things glow in the dark).\ + //
We're also masked by the overlay lighting plane, which contains all the movable lights in the game. It draws to us and also the game plane.\ + //
Masks us out so it has the breathing room to apply its effect.\ + //
Oh and we quite often have our alpha changed to achive night vision effects, or things of that sort." + plane = RENDER_PLANE_LIGHTING + blend_mode_override = BLEND_MULTIPLY + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + critical = PLANE_CRITICAL_DISPLAY + /// A list of light cutoffs we're actively using, (mass, r, g, b) to avoid filter churn + var/list/light_cutoffs + +/atom/movable/screen/plane_master/rendering_plate/lighting/proc/set_light_cutoff(light_cutoff, list/color_cutoffs) + var/list/new_cutoffs = list(light_cutoff) + new_cutoffs += color_cutoffs + if(new_cutoffs ~= light_cutoffs) + return + + remove_filter(list("light_cutdown", "light_cutup")) + + var/ratio = light_cutoff/100 + if(!color_cutoffs) + color_cutoffs = list(0, 0, 0) + + var/red = color_cutoffs[1] / 100 + var/green = color_cutoffs[2] / 100 + var/blue = color_cutoffs[3] / 100 + add_filter("light_cutdown", 3, color_matrix_filter(list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, -(ratio + red),-(ratio+green),-(ratio+blue),0))) + add_filter("light_cutup", 4, color_matrix_filter(list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, ratio+red,ratio+green,ratio+blue,0))) + +/*! + * This system works by exploiting BYONDs color matrix filter to use layers to handle emissive blockers. + * + * Emissive overlays are pasted with an atom color that converts them to be entirely some specific color. + * Emissive blockers are pasted with an atom color that converts them to be entirely some different color. + * Emissive overlays and emissive blockers are put onto the same plane. + * The layers for the emissive overlays and emissive blockers cause them to mask eachother similar to normal BYOND objects. + * A color matrix filter is applied to the emissive plane to mask out anything that isn't whatever the emissive color is. + * This is then used to alpha mask the lighting plane. + * + */ +/atom/movable/screen/plane_master/rendering_plate/lighting/Initialize(mapload) + . = ..() + add_filter("emissives", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(EMISSIVE_RENDER_TARGET, offset), flags = MASK_INVERSE)) + add_filter("object_lighting", 2, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(O_LIGHTING_VISUAL_RENDER_TARGET, offset), flags = MASK_INVERSE)) + set_light_cutoff(10) + +/// Breaks a connection between this plane master, and the passed in place +/atom/movable/screen/plane_master/proc/remove_relay_from(target_plane) + render_relay_planes -= target_plane + var/atom/movable/render_plane_relay/existing_relay = get_relay_to(target_plane) + if(!existing_relay) + return + relays -= existing_relay + if(!length(relays) && !initial(render_target)) + render_target = null + var/client/lad = home?.our_hud?.mymob?.canon_client + if(lad) + lad.screen -= existing_relay + +/atom/movable/screen/plane_master/rendering_plate/master/proc/offset_change(new_offset) + if(new_offset == offset) // If we're on our own z layer, relay to nothing, just draw + remove_relay_from(GET_NEW_PLANE(RENDER_PLANE_TRANSPARENT, offset - 1)) + else // Otherwise, regenerate the relay + add_relay_to(GET_NEW_PLANE(RENDER_PLANE_TRANSPARENT, offset - 1)) + +/atom/movable/screen/plane_master/rendering_plate/master/proc/on_offset_change(datum/source, old_offset, new_offset) + SIGNAL_HANDLER + offset_change(new_offset) + +/atom/movable/screen/plane_master/rendering_plate/lighting/proc/on_offset_change(datum/source, old_offset, new_offset) + SIGNAL_HANDLER + offset_change(new_offset) + +/atom/movable/screen/plane_master/rendering_plate/lighting/proc/offset_change(mob_offset) + // Offsets stack down remember. This implies that we're above the mob's view plane, and shouldn't render + if(offset < mob_offset) + disable_alpha() + else + enable_alpha() + +/atom/movable/screen/plane_master/rendering_plate/lighting/show_to(mob/mymob) + . = ..() + if(!.) + return + // This applies a backdrop to our lighting plane + // Why do plane masters need a backdrop sometimes? Read https://secure.byond.com/forum/?post=2141928 + // Basically, we need something to brighten + // unlit is perhaps less needed rn, it exists to provide a fullbright for things that can't see the lighting plane + // but we don't actually use invisibility to hide the lighting plane anymore, so it's pointless + var/atom/movable/screen/backdrop = mymob.overlay_fullscreen("lighting_backdrop_lit_[home.key]#[offset]", /atom/movable/screen/fullscreen/lighting_backdrop/lit) + // Need to make sure they're on our plane, ALL the time. We always need a backdrop + SET_PLANE_EXPLICIT(backdrop, PLANE_TO_TRUE(backdrop.plane), src) + backdrop = mymob.overlay_fullscreen("lighting_backdrop_unlit_[home.key]#[offset]", /atom/movable/screen/fullscreen/lighting_backdrop/unlit) + SET_PLANE_EXPLICIT(backdrop, PLANE_TO_TRUE(backdrop.plane), src) + // Sorry, this is a bit annoying + // Basically, we only want the lighting plane we can actually see to attempt to render + // If we don't our lower plane gets totally overriden by the black void of the upper plane + var/datum/hud/hud = home.our_hud + // show_to can be called twice successfully with no hide_from call. Ensure no runtimes off the registers from this + if(hud) + RegisterSignal(hud, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(on_offset_change), override = TRUE) + offset_change(hud?.current_plane_offset || 0) + set_light_cutoff(mymob.lighting_cutoff, mymob.lighting_color_cutoffs) + +/atom/movable/screen/plane_master/rendering_plate/lighting/hide_from(mob/oldmob) + . = ..() + oldmob.clear_fullscreen("lighting_backdrop_lit_[home.key]#[offset]") + oldmob.clear_fullscreen("lighting_backdrop_unlit_[home.key]#[offset]") + var/datum/hud/hud = home.our_hud + if(hud) + UnregisterSignal(hud, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(on_offset_change)) + +/atom/movable/screen/plane_master/rendering_plate/emissive_slate/Initialize(mapload, datum/plane_master_group/home, offset) + . = ..() + add_filter("em_block_masking", 2, color_matrix_filter(GLOB.em_mask_matrix)) + if(offset != 0) + add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset - 1), relay_layer = EMISSIVE_Z_BELOW_LAYER) + +/atom/movable/screen/plane_master/rendering_plate/light_mask + name = "Light Mask" + // documentation = "Any part of this plane that is transparent will be black below it on the game rendering plate.\ + //
This is done to ensure emissives and overlay lights don't light things up \"through\" the darkness that normally sits at the bottom of the lighting plane.\ + //
We relay copies of the space, floor and wall planes to it, so we can use them as masks. Then we just boost any existing alpha to 100% and we're done.\ + //
If we ever switch to a sight setup that shows say, mobs but not floors, we instead mask just overlay lighting and emissives.\ +
This avoids dumb seethrough without breaking stuff like thermals." + plane = LIGHT_MASK_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + // Fullwhite where there's any color, no alpha otherwise + color = list(255,255,255,255, 255,255,255,255, 255,255,255,255, 0,0,0,0, 0,0,0,0) + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + render_target = LIGHT_MASK_RENDER_TARGET + // We blend against the game plane, so she's gotta multiply! + blend_mode = BLEND_MULTIPLY + render_relay_planes = list(RENDER_PLANE_GAME) + +/atom/movable/screen/plane_master/rendering_plate/light_mask/show_to(mob/mymob) + . = ..() + if(!.) + return + + RegisterSignal(mymob, COMSIG_MOB_SIGHT_CHANGE, PROC_REF(handle_sight)) + handle_sight(mymob, mymob.sight, NONE) + +/atom/movable/screen/plane_master/rendering_plate/light_mask/hide_from(mob/oldmob) + . = ..() + var/atom/movable/screen/plane_master/overlay_lights = home.get_plane(GET_NEW_PLANE(O_LIGHTING_VISUAL_PLANE, offset)) + overlay_lights.remove_filter("lighting_mask") + var/atom/movable/screen/plane_master/emissive = home.get_plane(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset)) + emissive.remove_filter("lighting_mask") + remove_relay_from(GET_NEW_PLANE(RENDER_PLANE_GAME, offset)) + UnregisterSignal(oldmob, COMSIG_MOB_SIGHT_CHANGE) + +/atom/movable/screen/plane_master/rendering_plate/light_mask/proc/handle_sight(datum/source, new_sight, old_sight) + // If we can see something that shows "through" blackness, and we can't see turfs, disable our draw to the game plane + // And instead mask JUST the overlay lighting plane, since that will look fuckin wrong + var/atom/movable/screen/plane_master/overlay_lights = home.get_plane(GET_NEW_PLANE(O_LIGHTING_VISUAL_PLANE, offset)) + var/atom/movable/screen/plane_master/emissive = home.get_plane(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset)) + if(new_sight & SEE_AVOID_TURF_BLACKNESS && !(new_sight & SEE_TURFS)) + remove_relay_from(GET_NEW_PLANE(RENDER_PLANE_GAME, offset)) + overlay_lights.add_filter("lighting_mask", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(LIGHT_MASK_RENDER_TARGET, offset))) + emissive.add_filter("lighting_mask", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(LIGHT_MASK_RENDER_TARGET, offset))) + // If we CAN'T see through the black, then draw er down brother! + else + overlay_lights.remove_filter("lighting_mask") + emissive.remove_filter("lighting_mask") + // We max alpha here, so our darkness is actually.. dark + // Can't do it before cause it fucks with the filter + add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME, offset), relay_color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,1)) +// It would be nice to setup parallaxing for stairs and things when doing this +// So they look nicer. if you can't it's all good, if you think you can sanely look at monster's work +// It's hard, and potentially expensive. be careful +/datum/plane_master_group/proc/transform_lower_turfs(datum/hud/source, new_offset, use_scale = TRUE) + // Check if this feature is disabled for the client, in which case don't use scale. + // var/mob/our_mob = our_hud?.mymob + + // No offset? piss off + if(!SSmapping.max_plane_offset) + return + + active_offset = new_offset + + // Each time we go "down" a visual z level, we'll reduce the scale by this amount + // Chosen because mothblocks liked it, didn't cause motion sickness while also giving a sense of height + var/scale_by = 0.965 + if(!use_scale) + // This is a workaround for two things + // First of all, if a mob can see objects but not turfs, they will not be shown the holder objects we use for + // What I'd like to do is revert to images if this case throws, but image vis_contents is broken + // https://www.byond.com/forum/post/2821969 + // If that's ever fixed, please just use that. thanks :) + scale_by = 1 + + var/list/offsets = list() + // var/multiz_boundary = our_mob?.client?.prefs?.read_preference(/datum/preference/numeric/multiz_performance) + + // We accept negatives so going down "zooms" away the drop above as it goes + for(var/offset in -SSmapping.max_plane_offset to SSmapping.max_plane_offset) + // Multiz boundaries disable transforms + // if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (multiz_boundary < abs(offset))) + // offsets += null + // continue + + // No transformations if we're landing ON you + if(offset == 0) + offsets += null + continue + + var/scale = scale_by ** (offset) + var/matrix/multiz_shrink = matrix() + multiz_shrink.Scale(scale) + offsets += multiz_shrink + + // So we can talk in 1 -> max_offset * 2 + 1, rather then -max_offset -> max_offset + var/offset_offset = SSmapping.max_plane_offset + 1 + + for(var/plane_key in plane_masters) + var/atom/movable/screen/plane_master/plane = plane_masters[plane_key] + if(!plane.allows_offsetting) + continue + + var/visual_offset = plane.offset - new_offset + + // Basically uh, if we're showing something down X amount of levels, or up any amount of levels + // if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (visual_offset > multiz_boundary || visual_offset < 0)) + // plane.outside_bounds(our_mob) + // else if(plane.is_outside_bounds) + // plane.inside_bounds(our_mob) + + // if(!plane.multiz_scaled) + // continue + + if(plane.force_hidden || plane.is_outside_bounds || visual_offset < 0) + // We don't animate here because it should be invisble, but we do mark because it'll look nice + plane.transform = offsets[visual_offset + offset_offset] + continue + + animate(plane, transform = offsets[visual_offset + offset_offset], 0.05 SECONDS, easing = LINEAR_EASING) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 697a2fa61a3a..f572a652d1b0 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -26,6 +26,30 @@ SUBSYSTEM_DEF(mapping) var/list/station_minimaps = list() + /// Assoc list of string plane to the plane's offset value + var/list/plane_to_offset + + /// Used to maintain the plane cube + var/list/z_level_to_plane_offset = list() + + /// List of planes that do not allow for offsetting + var/list/plane_offset_blacklist + + /// The largest plane offset we've generated so far + var/max_plane_offset = 0 + + /// Assoc list of true string plane values to a list of all potential offset planess + var/list/true_to_offset_planes + + /// List of render targets that do not allow for offsetting + var/list/render_offset_blacklist + + /// List of plane masters that are of critical priority + var/list/critical_planes + + /// Assoc list of string plane values to their true, non offset representation + var/list/plane_offset_to_true + var/list/areas_in_z = list() var/loading_ruins = FALSE diff --git a/code/datums/actions/mobs/adjust_vision.dm b/code/datums/actions/mobs/adjust_vision.dm new file mode 100644 index 000000000000..906ef33fa73e --- /dev/null +++ b/code/datums/actions/mobs/adjust_vision.dm @@ -0,0 +1,73 @@ +#define VISION_ACTION_LIGHT_OFF 0 +#define VISION_ACTION_LIGHT_LOW 1 +#define VISION_ACTION_LIGHT_MID 2 +#define VISION_ACTION_LIGHT_HIG 3 + +/datum/action/adjust_vision + name = "Adjust Vision" + desc = "See better in the dark. Or don't. Your advanced vision allows either." + button_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "adjust_vision" + background_icon_state = "bg_default" + overlay_icon_state = "bg_default_border" + + + // These lists are used as the color cutoff for the action + // They need to be filled out for subtypes + var/list/low_light_cutoff + var/list/medium_light_cutoff + var/list/high_light_cutoff + var/light_level = VISION_ACTION_LIGHT_OFF + +/datum/action/adjust_vision/Grant(mob/living/grant_to) + . = ..() + set_light_level(VISION_ACTION_LIGHT_LOW) + RegisterSignal(grant_to, COMSIG_MOB_UPDATE_SIGHT, PROC_REF(on_update_sight)) + +/datum/action/adjust_vision/Remove(mob/living/remove_from) + set_light_level(VISION_ACTION_LIGHT_OFF) + UnregisterSignal(remove_from, COMSIG_MOB_UPDATE_SIGHT) + . = ..() + +/datum/action/adjust_vision/Trigger(trigger_flags) + . = ..() + if(!.) + return + + switch(light_level) + if (VISION_ACTION_LIGHT_OFF) + set_light_level(VISION_ACTION_LIGHT_LOW) + if (VISION_ACTION_LIGHT_LOW) + set_light_level(VISION_ACTION_LIGHT_MID) + if (VISION_ACTION_LIGHT_MID) + set_light_level(VISION_ACTION_LIGHT_HIG) + else + set_light_level(VISION_ACTION_LIGHT_OFF) + +/datum/action/adjust_vision/proc/set_light_level(new_level) + light_level = new_level + owner.update_sight() + +/datum/action/adjust_vision/proc/on_update_sight(datum/source) + SIGNAL_HANDLER + var/list/color_from + switch(light_level) + if (VISION_ACTION_LIGHT_LOW) + color_from = low_light_cutoff + if (VISION_ACTION_LIGHT_MID) + color_from = medium_light_cutoff + if (VISION_ACTION_LIGHT_HIG) + color_from = high_light_cutoff + else // just in case + color_from = list(0, 0, 0) + owner.lighting_color_cutoffs = blend_cutoff_colors(owner.lighting_color_cutoffs, color_from.Copy()) + +/datum/action/adjust_vision/bileworm + low_light_cutoff = list(18, 12, 0) + medium_light_cutoff = list(30, 20, 5) + high_light_cutoff = list(45, 30, 10) + +#undef VISION_ACTION_LIGHT_OFF +#undef VISION_ACTION_LIGHT_LOW +#undef VISION_ACTION_LIGHT_MID +#undef VISION_ACTION_LIGHT_HIG diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 7d5685af7c03..5a74bb46721e 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -58,8 +58,6 @@ real_name = "imaginary friend" move_on_shuttle = TRUE desc = "A wonderful yet fake friend." - see_in_dark = 0 - lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE sight = NONE mouse_opacity = MOUSE_OPACITY_OPAQUE see_invisible = SEE_INVISIBLE_LIVING diff --git a/code/datums/datum.dm b/code/datums/datum.dm index a2d370e2ee68..303ca4d21f04 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -46,6 +46,8 @@ * add_timer() returns the truthy value of -1 when not stoppable, and else a truthy numeric index */ var/list/cooldowns + /// List for handling persistent filters. + var/list/filter_data #ifdef TESTING var/running_find_references @@ -250,3 +252,64 @@ return SEND_SIGNAL(source, COMSIG_CD_RESET(index), S_TIMER_COOLDOWN_TIMELEFT(source, index)) TIMER_COOLDOWN_END(source, index) + +/** Update a filter's parameter and animate this change. If the filter doesnt exist we won't do anything. + * Basically a [datum/proc/modify_filter] call but with animations. Unmodified filter parameters are kept. + * + * Arguments: + * * name - Filter name + * * new_params - New parameters of the filter + * * time - time arg of the BYOND animate() proc. + * * easing - easing arg of the BYOND animate() proc. + * * loop - loop arg of the BYOND animate() proc. + */ +/datum/proc/transition_filter(name, list/new_params, time, easing, loop) + var/filter = get_filter(name) + if(!filter) + return + // This can get injected by the filter procs, we want to support them so bye byeeeee + new_params -= "type" + animate(filter, new_params, time = time, easing = easing, loop = loop) + modify_filter(name, new_params) + +/// Returns the filter associated with the passed key +/datum/proc/get_filter(name) + ASSERT(isatom(src) || istype(src, /image)) + if(filter_data && filter_data[name]) + var/atom/atom_cast = src // filters only work with images or atoms. + return atom_cast.filters[filter_data.Find(name)] + +/** Update a filter's parameter to the new one. If the filter doesnt exist we won't do anything. + * + * Arguments: + * * name - Filter name + * * new_params - New parameters of the filter + * * overwrite - TRUE means we replace the parameter list completely. FALSE means we only replace the things on new_params. + */ +/datum/proc/modify_filter(name, list/new_params, overwrite = FALSE) + var/filter = get_filter(name) + if(!filter) + return + if(overwrite) + filter_data[name] = new_params + else + for(var/thing in new_params) + filter_data[name][thing] = new_params[thing] + update_filters() + +/// Reapplies all the filters. +/datum/proc/update_filters() + ASSERT(isatom(src) || istype(src, /image)) + var/atom/atom_cast = src // filters only work with images or atoms. + atom_cast.filters = null + filter_data = sortTim(filter_data, GLOBAL_PROC_REF(cmp_filter_data_priority), TRUE) + for(var/filter_raw in filter_data) + var/list/data = filter_data[filter_raw] + var/list/arguments = data.Copy() + arguments -= "priority" + atom_cast.filters += filter(arglist(arguments)) + UNSETEMPTY(filter_data) + +/obj/item/update_filters() + . = ..() + update_item_action_buttons() diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 13601c2c4123..dbc2f2c6bff0 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -493,7 +493,6 @@ /datum/status_effect/cultghost/on_apply() owner.see_invisible = SEE_INVISIBLE_OBSERVER - owner.see_in_dark = 2 /datum/status_effect/cultghost/tick() if(owner.reagents) diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 6c9e33ccef9d..f9844d1661af 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -165,7 +165,7 @@ /datum/quirk/night_vision/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/organ/eyes/eyes = H.getorgan(/obj/item/organ/eyes) - if(!eyes || eyes.lighting_alpha) + if(!eyes || eyes.lighting_cutoff) return eyes.Insert(H) //refresh their eyesight and vision diff --git a/code/game/atoms.dm b/code/game/atoms.dm index a1def6de5e72..25ee96acc14a 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -85,8 +85,6 @@ ///Last fingerprints to touch this atom var/fingerprintslast - var/list/filter_data //For handling persistent filters - ///Economy cost of item var/custom_price ///Economy cost of item in premium vendor @@ -1502,25 +1500,12 @@ filter_data[name] = p update_filters() -/atom/movable/proc/update_filters() - filters = null - sortTim(filter_data,associative = TRUE) - for(var/f in filter_data) - var/list/data = filter_data[f] - var/list/arguments = data.Copy() - arguments -= "priority" - filters += filter(arglist(arguments)) - /obj/item/update_filters() . = ..() for(var/X in actions) var/datum/action/A = X A.build_all_button_icons() -/atom/movable/proc/get_filter(name) - if(filter_data && filter_data[name]) - return filters[filter_data.Find(name)] - /// Returns the indice in filters of the given filter name. /// If it is not found, returns null. /atom/proc/get_filter_index(name) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 1b20666ac44c..6a22487fe039 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -471,8 +471,5 @@ user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras if(isXRay()) user.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) - user.see_in_dark = max(user.see_in_dark, 8) - else - user.sight = 0 - user.see_in_dark = 2 + return 1 diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 3788a9b0e816..0ddf5f2005c8 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -174,7 +174,6 @@ /mob/camera/aiEye/remote/update_remote_sight(mob/living/user) user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras user.sight = SEE_TURFS | SEE_BLACKNESS - user.see_in_dark = 2 return TRUE /mob/camera/aiEye/remote/Destroy() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4c40cf4173ec..c7137fc51a82 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1135,3 +1135,14 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(item_heal_robotic(H, user, brute_heal, burn_heal)) return heal_robo_limb(I, H, user, brute_heal, burn_heal, amount, volume) return TRUE + +/** + * Updates all action buttons associated with this item + * + * Arguments: + * * update_flags - Which flags of the action should we update + * * force - Force buttons update even if the given button icon state has not changed + */ +/obj/item/proc/update_item_action_buttons(update_flags = ALL, force = FALSE) + for(var/datum/action/current_action as anything in actions) + current_action.build_all_button_icons(update_flags, force) diff --git a/code/game/turfs/openspace/openspace.dm b/code/game/turfs/openspace/openspace.dm index 5a06c4bc2234..292707fdebc1 100644 --- a/code/game/turfs/openspace/openspace.dm +++ b/code/game/turfs/openspace/openspace.dm @@ -5,6 +5,7 @@ baseturfs = /turf/open/openspace CanAtmosPassVertical = ATMOS_PASS_YES flags_1 = NO_RUST + plane = TRANSPARENT_FLOOR_PLANE //mouse_opacity = MOUSE_OPACITY_TRANSPARENT var/can_cover_up = TRUE var/can_build_on = TRUE diff --git a/code/modules/antagonists/blob/blob_mobs.dm b/code/modules/antagonists/blob/blob_mobs.dm index 3c9b7fa82a2e..3b9100bf680f 100644 --- a/code/modules/antagonists/blob/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob_mobs.dm @@ -15,8 +15,10 @@ maxbodytemp = 360 unique_name = 1 a_intent = INTENT_HARM - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // ... Blob colored lighting + lighting_cutoff_red = 20 + lighting_cutoff_green = 40 + lighting_cutoff_blue = 30 var/mob/camera/blob/overmind = null var/obj/structure/blob/factory/factory = null var/independent = FALSE diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm index dacff037b249..3c79ce8c687e 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -13,13 +13,15 @@ GLOBAL_LIST_EMPTY(blob_nodes) icon_state = "marker" mouse_opacity = MOUSE_OPACITY_ICON move_on_shuttle = 1 - see_in_dark = 8 invisibility = INVISIBILITY_OBSERVER layer = FLY_LAYER + // Vivid blue green, would be cool to make this change with strain + lighting_cutoff_red = 0 + lighting_cutoff_green = 35 + lighting_cutoff_blue = 20 pass_flags = PASSBLOB faction = list(ROLE_BLOB) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE hud_type = /datum/hud/blob_overmind var/obj/structure/blob/core/blob_core = null // The blob overmind's core var/blob_points = 0 diff --git a/code/modules/antagonists/bloodsuckers/bloodsuckers.dm b/code/modules/antagonists/bloodsuckers/bloodsuckers.dm index 58826b125266..4797081ec734 100644 --- a/code/modules/antagonists/bloodsuckers/bloodsuckers.dm +++ b/code/modules/antagonists/bloodsuckers/bloodsuckers.dm @@ -564,8 +564,9 @@ if(user_eyes) user_eyes.flash_protect = initial(user_eyes.flash_protect) user_eyes.sight_flags = initial(user_eyes.sight_flags) - user_eyes.see_in_dark = initial(user_eyes.see_in_dark) - user_eyes.lighting_alpha = initial(user_eyes.lighting_alpha) + user.lighting_cutoff_red += 5 + user.lighting_cutoff_green += 15 + user.lighting_cutoff_blue += 5 user.update_sight() /datum/antagonist/bloodsucker/proc/give_masquerade_infraction() diff --git a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm index 718b13382163..2d0673457ffa 100644 --- a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm @@ -215,8 +215,7 @@ if(current_eyes) current_eyes.flash_protect = max(initial(current_eyes.flash_protect) - 1, - 1) current_eyes.sight_flags = SEE_MOBS - current_eyes.see_in_dark = 8 - current_eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + current_eyes.setOrganDamage(0) //making sure if(my_clan?.get_clan() == CLAN_LASOMBRA && ishuman(bloodsuckeruser)) var/mob/living/carbon/human/bloodsucker = bloodsuckeruser diff --git a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm index bac0e1fac941..7a7febba425b 100644 --- a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm +++ b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm @@ -58,15 +58,11 @@ return TRUE /obj/item/clothing/glasses/wraith_spectacles/proc/set_vision_vars(update_vision) - lighting_alpha = null tint = 0 vision_flags = NONE - darkness_view = 2 if(!up) if(is_servant_of_ratvar(loc)) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE vision_flags = SEE_MOBS | SEE_TURFS | SEE_OBJS - darkness_view = 3 else tint = 3 if(update_vision && iscarbon(loc)) diff --git a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm index efcbd6f882ec..8ed7296d9442 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm @@ -11,11 +11,13 @@ icon_state = "eminence" mouse_opacity = MOUSE_OPACITY_OPAQUE move_on_shuttle = TRUE - see_in_dark = 8 invisibility = INVISIBILITY_OBSERVER layer = FLY_LAYER faction = list("ratvar") - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // VERY red, to fit the eyes + lighting_cutoff_red = 22 + lighting_cutoff_green = 5 + lighting_cutoff_blue = 5 var/turf/last_failed_turf var/static/superheated_walls = 0 var/lastWarning = 0 diff --git a/code/modules/antagonists/demon/general_powers.dm b/code/modules/antagonists/demon/general_powers.dm index 41834bb33b6a..ff8eb520ecd0 100644 --- a/code/modules/antagonists/demon/general_powers.dm +++ b/code/modules/antagonists/demon/general_powers.dm @@ -45,8 +45,9 @@ melee_damage_lower = 20 melee_damage_upper = 20 wound_bonus = -15 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + lighting_cutoff_red = 22 + lighting_cutoff_green = 5 + lighting_cutoff_blue = 5 loot = (/obj/effect/decal/cleanable/blood) del_on_death = TRUE diff --git a/code/modules/antagonists/devil/imp/imp.dm b/code/modules/antagonists/devil/imp/imp.dm index 7c76013f3401..b4474c51e689 100644 --- a/code/modules/antagonists/devil/imp/imp.dm +++ b/code/modules/antagonists/devil/imp/imp.dm @@ -31,8 +31,10 @@ obj_damage = 40 melee_damage_lower = 10 melee_damage_upper = 15 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // You KNOW we're doing a lightly purple red + lighting_cutoff_red = 30 + lighting_cutoff_green = 10 + lighting_cutoff_blue = 20 var/boost = 0 bloodcrawl = BLOODCRAWL_EAT var/list/consumed_mobs = list() diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm index a9c6d361e279..9ebd36567bdc 100644 --- a/code/modules/antagonists/disease/disease_mob.dm +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -13,14 +13,17 @@ the new instance inside the host to be updated to the template's stats. icon_state = "marker" mouse_opacity = MOUSE_OPACITY_ICON move_on_shuttle = FALSE - see_in_dark = 8 see_invisible = SEE_INVISIBLE_LIVING invisibility = INVISIBILITY_OBSERVER layer = BELOW_MOB_LAYER - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE sight = SEE_SELF|SEE_THRU initial_language_holder = /datum/language_holder/universal + // Pale green, bright enough to have good vision + lighting_cutoff_red = 5 + lighting_cutoff_green = 35 + lighting_cutoff_blue = 20 + var/freemove = TRUE var/freemove_end = 0 var/const/freemove_time = 1200 diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm index 693016e600dc..32d16a4ff7ee 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm @@ -303,7 +303,8 @@ desc = "Allows the user to swap between three hud types, science, medical, and diagnostic" icon_state = "godeye" item_state = "godeye" - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Blue, light blue + color_cutoffs = list(15, 30, 40) hud_type = DATA_HUD_SECURITY_BASIC /obj/item/clothing/glasses/hud/toggle/eldritch_eye/equipped(mob/living/user, slot) diff --git a/code/modules/antagonists/horror/horror.dm b/code/modules/antagonists/horror/horror.dm index 03ca12a00b9c..c476f05a1f97 100644 --- a/code/modules/antagonists/horror/horror.dm +++ b/code/modules/antagonists/horror/horror.dm @@ -9,8 +9,9 @@ maxHealth = 50 melee_damage_lower = 10 melee_damage_upper = 10 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + lighting_cutoff_red = 22 + lighting_cutoff_green = 5 + lighting_cutoff_blue = 5 stop_automated_movement = TRUE attacktext = "bites" speak_emote = list("gurgles") diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index 4513e199850e..25f2cf9fff4e 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -24,8 +24,10 @@ obj_damage = 50 melee_damage_lower = 20 melee_damage_upper = 20 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Oh you KNOW it's gonna be real green + lighting_cutoff_red = 10 + lighting_cutoff_green = 35 + lighting_cutoff_blue = 15 vision_range = 1 // Only attack when target is close wander = FALSE attack_vis_effect = ATTACK_EFFECT_BITE //nom nom nom diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index b0f30b70856b..f5eaa26713b7 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -27,8 +27,10 @@ sight = SEE_MOBS | SEE_OBJS | SEE_TURFS | SEE_SELF throwforce = 0 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Going for faint purple spoopy ghost + lighting_cutoff_red = 20 + lighting_cutoff_green = 15 + lighting_cutoff_blue = 35 response_help = "passes through" response_disarm = "swings through" response_harm = "punches through" @@ -72,10 +74,6 @@ flags_1 |= RAD_NO_CONTAMINATE_1 ADD_TRAIT(src, TRAIT_SIXTHSENSE, INNATE_TRAIT) - // Starting spells - var/datum/action/cooldown/spell/night_vision/revenant/vision = new(src) - vision.Grant(src) - var/datum/action/cooldown/spell/list_target/telepathy/revenant/telepathy = new(src) telepathy.Grant(src) diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 1253d94a738a..dae162f7c257 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -96,16 +96,7 @@ to_chat(src, span_revenwarning("You are not close enough to siphon [target ? "[target]'s":"[target.p_their()]"] soul. The link has been broken.")) draining = FALSE essence_drained = 0 - -//Toggle night vision: lets the revenant toggle its night vision -/datum/action/cooldown/spell/night_vision/revenant - name = "Toggle Darkvision" - panel = "Revenant Abilities" - background_icon_state = "bg_revenant" - button_icon = 'icons/mob/actions/actions_revenant.dmi' - button_icon_state = "r_nightvision" - toggle_span = "revennotice" - + //Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob /datum/action/cooldown/spell/list_target/telepathy/revenant name = "Revenant Transmit" diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 5b186f6696c5..adaa1d088467 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -33,8 +33,9 @@ obj_damage = 50 melee_damage_lower = 30 melee_damage_upper = 30 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + lighting_cutoff_red = 22 + lighting_cutoff_green = 5 + lighting_cutoff_blue = 5 bloodcrawl = BLOODCRAWL_EAT var/playstyle_string = "You are a slaughter demon, a terrible creature from another realm. You have a single desire: To kill. \ You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and disappearing from the station at will. \ diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm index 0072cb11f629..fce400e49f20 100644 --- a/code/modules/cargo/bounties/special.dm +++ b/code/modules/cargo/bounties/special.dm @@ -3,7 +3,7 @@ description = "Nanotrasen is interested in studying Xenomorph biology. Ship a set of organs to be thoroughly compensated." reward = 25000 required_count = 3 - wanted_types = list(/obj/item/organ/brain/alien, /obj/item/organ/alien, /obj/item/organ/body_egg/alien_embryo, /obj/item/organ/liver/alien, /obj/item/organ/tongue/alien, /obj/item/organ/eyes/night_vision/alien) + wanted_types = list(/obj/item/organ/brain/alien, /obj/item/organ/alien, /obj/item/organ/body_egg/alien_embryo, /obj/item/organ/liver/alien, /obj/item/organ/tongue/alien, /obj/item/organ/eyes/alien) /datum/bounty/item/syndicate_documents name = "Syndicate Documents" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index c2dc8a24625e..eddeb3420196 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -12,7 +12,7 @@ var/visor_flags_inv = 0 //same as visor_flags, but for flags_inv var/visor_flags_cover = 0 //same as above, but for flags_cover //what to toggle when toggled with weldingvisortoggle() - var/visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT | VISOR_VISIONFLAGS | VISOR_DARKNESSVIEW | VISOR_INVISVIEW + var/visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT | VISOR_VISIONFLAGS | VISOR_INVISVIEW lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi' righthand_file = 'icons/mob/inhands/clothing_righthand.dmi' var/alt_desc = null diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 7c433361c60d..2048bf937375 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -10,14 +10,24 @@ resistance_flags = NONE materials = list(/datum/material/glass = 250) var/vision_flags = 0 - var/darkness_view = 2//Base human is 2 var/invis_view = SEE_INVISIBLE_LIVING //admin only for now var/invis_override = 0 //Override to allow glasses to set higher than normal see_invis - var/lighting_alpha var/list/icon/current = list() //the current hud icons var/vision_correction = 0 //does wearing these glasses correct some of our vision defects? var/glass_colour_type //colors your vision when worn + /// A percentage of how much rgb to "max" on the lighting plane + /// This lets us brighten darkness without washing out bright color + var/lighting_cutoff = null + /// Similar to lighting_cutoff, except it has individual r g and b components in the same 0-100 scale + var/list/color_cutoffs = null +// Potentially replace glass_color_type with a setup that colors lighting by dropping segments of different componets +// Like the current idea, but applied without the mass cutoff (maybe? somehow?) +// That or just a light color to the lighting plane, that'd work too +// Enough to make it visible but not so much that it's a pain + +// That, or just make stuff that uses lighting_cutoff have colored offsets and all, like you were planning + /obj/item/clothing/glasses/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] is stabbing \the [src] into [user.p_their()] eyes! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS @@ -31,8 +41,6 @@ ..() if(visor_vars_to_toggle & VISOR_VISIONFLAGS) vision_flags ^= initial(vision_flags) - if(visor_vars_to_toggle & VISOR_DARKNESSVIEW) - darkness_view ^= initial(darkness_view) if(visor_vars_to_toggle & VISOR_INVISVIEW) invis_view ^= initial(invis_view) @@ -59,9 +67,9 @@ desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions." icon_state = "meson" item_state = "meson" - darkness_view = 2 vision_flags = SEE_TURFS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + // Mesons get to be lightly green + color_cutoffs = list(5, 15, 5) glass_colour_type = /datum/client_colour/glass_colour/lightgreen clothing_traits = list(TRAIT_MESONS) @@ -74,9 +82,10 @@ desc = "An optical meson scanner fitted with an amplified visible light spectrum overlay, providing greater visual clarity in darkness." icon_state = "nvgmeson" item_state = "nvgmeson" - darkness_view = 8 flash_protect = -1 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Night vision mesons get the same but more intense + color_cutoffs = list(10, 30, 10) + lighting_cutoff = LIGHTING_CUTOFF_HIGH glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/meson/gar @@ -137,18 +146,18 @@ desc = "A pair of snazzy goggles used to protect against chemical spills that happen in complete darkness. Fitted with an analyzer for scanning items and reagents." icon_state = "sciencehudnight" item_state = "sciencehudnight" - darkness_view = 8 flash_protect = -1 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + // Real vivid purple + color_cutoffs = list(50, 10, 30) /obj/item/clothing/glasses/night name = "night vision goggles" desc = "You can totally see in the dark now!" icon_state = "night" item_state = "glasses" - darkness_view = 8 flash_protect = -1 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Dark green + color_cutoffs = list(10, 30, 10) glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/science/suicide_act(mob/living/carbon/user) @@ -164,7 +173,6 @@ /obj/item/clothing/glasses/eyepatch/bigboss name = "faded eyepatch" desc = "Offers night vision and protection from flashes. Another mission, right boss?" - darkness_view = 8 flash_protect = 1 /obj/item/clothing/glasses/monocle @@ -187,7 +195,6 @@ desc = "Used by miners to detect ores deep within the rock." icon_state = "material" item_state = "glasses" - darkness_view = 0 /obj/item/clothing/glasses/material/mining/gar name = "gar material scanner" @@ -234,7 +241,6 @@ desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks flashes." icon_state = "sun" item_state = "sunglasses" - darkness_view = 1 flash_protect = 1 tint = 1 glass_colour_type = /datum/client_colour/glass_colour/gray @@ -317,7 +323,6 @@ item_state = "blindfold" flash_protect = 2 tint = 3 - darkness_view = 1 dog_fashion = /datum/dog_fashion/head /obj/item/clothing/glasses/blindfold/equipped(mob/living/carbon/human/user, slot) @@ -371,7 +376,8 @@ icon_state = "thermal" item_state = "glasses" vision_flags = SEE_MOBS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + // Going for an orange color here + color_cutoffs = list(25, 8, 5) flash_protect = -1 glass_colour_type = /datum/client_colour/glass_colour/red @@ -462,8 +468,8 @@ icon_state = "godeye" item_state = "godeye" vision_flags = SEE_TURFS - darkness_view = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Blue, light blue + color_cutoffs = list(15, 30, 40) resistance_flags = LAVA_PROOF | FIRE_PROOF clothing_flags = SCAN_REAGENTS var/datum/action/cooldown/expose/expose_ability diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index 23ac10427b4b..e672db3326c8 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -19,8 +19,8 @@ actions_types = list(/datum/action/item_action/toggle_mode) vision_flags = NONE - darkness_view = 2 invis_view = SEE_INVISIBLE_LIVING + color_cutoffs = null var/list/modes = list(MODE_NONE = MODE_MESON, MODE_MESON = MODE_TRAY, MODE_TRAY = MODE_RAD, MODE_RAD = MODE_NONE) var/mode = MODE_NONE @@ -42,14 +42,12 @@ switch(mode) if(MODE_MESON) vision_flags = SEE_TURFS - darkness_view = 1 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + color_cutoffs = list(15, 12, 0) if(MODE_TRAY) //undoes the last mode, meson vision_flags = NONE - darkness_view = 2 - lighting_alpha = null - + color_cutoffs = list() + if(ishuman(user)) var/mob/living/carbon/human/H = user if(H.glasses == src) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 33592b773bf9..b60bfafaa647 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -43,9 +43,9 @@ desc = "An advanced medical heads-up display that allows doctors to find patients in complete darkness." icon_state = "healthhudnight" item_state = "glasses" - darkness_view = 8 flash_protect = -1 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + // Blue green, dark + color_cutoffs = list(5, 15, 30) glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/hud/health/meson @@ -54,7 +54,6 @@ icon_state = "mesonhealth" item_state = "mesonhealth" vision_flags = SEE_TURFS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE clothing_traits = list(TRAIT_MESONS) glass_colour_type = /datum/client_colour/glass_colour/lightblue @@ -62,7 +61,6 @@ name = "medical HUDSunglasses" desc = "Sunglasses with a medical HUD." icon_state = "sunhudmed" - darkness_view = 1 flash_protect = 1 tint = 1 glass_colour_type = /datum/client_colour/glass_colour/blue @@ -84,9 +82,9 @@ desc = "A robotics diagnostic HUD fitted with a light amplifier." icon_state = "diagnostichudnight" item_state = "glasses" - darkness_view = 8 flash_protect = -1 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + // Pale yellow + color_cutoffs = list(30, 20, 5) glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/hud/diagnostic/sunglasses @@ -143,9 +141,10 @@ name = "security HUDSunglasses" desc = "Sunglasses with a security HUD." icon_state = "sunhudsec" - darkness_view = 1 flash_protect = 1 tint = 1 + // Red with a tint of green + color_cutoffs = list(35, 5, 5) glass_colour_type = /datum/client_colour/glass_colour/darkred /obj/item/clothing/glasses/hud/security/sunglasses/hos @@ -157,9 +156,7 @@ name = "night vision security HUD" desc = "An advanced heads-up display which provides ID data and vision in complete darkness." icon_state = "securityhudnight" - darkness_view = 8 flash_protect = -1 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/hud/security/sunglasses/gars @@ -228,7 +225,7 @@ icon_state = "thermal" hud_type = DATA_HUD_SECURITY_ADVANCED vision_flags = SEE_MOBS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + color_cutoffs = list(25, 8, 5) glass_colour_type = /datum/client_colour/glass_colour/red /obj/item/clothing/glasses/hud/toggle/thermal/attack_self(mob/user) @@ -236,13 +233,17 @@ switch (hud_type) if (DATA_HUD_MEDICAL_ADVANCED) icon_state = "meson" + color_cutoffs = list(5, 15, 5) change_glass_color(user, /datum/client_colour/glass_colour/green) if (DATA_HUD_SECURITY_ADVANCED) icon_state = "thermal" + color_cutoffs = list(25, 8, 5) change_glass_color(user, /datum/client_colour/glass_colour/red) else icon_state = "purple" + color_cutoffs = list(15, 0, 25) change_glass_color(user, /datum/client_colour/glass_colour/purple) + user.update_sight() user.update_inv_glasses() /obj/item/clothing/glasses/hud/toggle/thermal/emp_act(severity) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index faf393415081..843882860b8d 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -299,7 +299,7 @@ GLOBAL_LIST_EMPTY(aide_list) light_flags = LIGHT_ATTACHED layer = ABOVE_ALL_MOB_LAYER var/sight_flags = SEE_MOBS - var/lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + var/list/color_cutoffs = list(10, 25, 25) /obj/effect/wisp/orbit(atom/thing, radius, clockwise, rotation_speed, rotation_segments, pre_rotation, lockinorbit) . = ..() @@ -317,8 +317,8 @@ GLOBAL_LIST_EMPTY(aide_list) /obj/effect/wisp/proc/update_user_sight(mob/user) user.sight |= sight_flags - if(!isnull(lighting_alpha)) - user.lighting_alpha = min(user.lighting_alpha, lighting_alpha) + if(!isnull(color_cutoffs)) + user.lighting_color_cutoffs = blend_cutoff_colors(user.lighting_color_cutoffs, color_cutoffs) //Red/Blue Cubes /obj/item/warp_cube diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 5ccc373a53fb..c1ea6bfafaf4 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -205,12 +205,15 @@ var/mob/living/simple_animal/hostile/mining_drone/user = owner if(user.sight & SEE_TURFS) user.sight &= ~SEE_TURFS - user.lighting_alpha = initial(user.lighting_alpha) + user.lighting_cutoff_red += 5 + user.lighting_cutoff_green += 15 + user.lighting_cutoff_blue += 5 else user.sight |= SEE_TURFS - user.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - - user.sync_lighting_plane_alpha() + user.lighting_cutoff_red -= 5 + user.lighting_cutoff_green -= 15 + user.lighting_cutoff_blue -= 5 + user.sync_lighting_plane_cutoff() to_chat(user, span_notice("You toggle your meson vision [(user.sight & SEE_TURFS) ? "on" : "off"].")) diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index fe06cbf0f341..dbf07aed090f 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -7,11 +7,14 @@ move_resist = INFINITY status_flags = GODMODE // You can't damage it. mouse_opacity = MOUSE_OPACITY_TRANSPARENT - see_in_dark = 7 invisibility = INVISIBILITY_ABSTRACT // No one can see us sight = SEE_SELF move_on_shuttle = FALSE +/mob/camera/update_sight() + lighting_color_cutoffs = list(lighting_cutoff_red, lighting_cutoff_green, lighting_cutoff_blue) + return ..() + /mob/camera/experience_pressure_difference() return diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 6f2f8e73ed36..6ae0b1d9039b 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -12,8 +12,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) stat = DEAD density = FALSE see_invisible = SEE_INVISIBLE_OBSERVER - see_in_dark = 100 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + lighting_cutoff = LIGHTING_CUTOFF_MEDIUM invisibility = INVISIBILITY_OBSERVER hud_type = /datum/hud/ghost movement_type = GROUND | FLYING @@ -597,15 +596,15 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/verb/toggle_darkness() set name = "Toggle Darkness" set category = "Ghost" - switch(lighting_alpha) - if (LIGHTING_PLANE_ALPHA_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + switch(lighting_cutoff) + if (LIGHTING_CUTOFF_VISIBLE) + lighting_cutoff = LIGHTING_CUTOFF_MEDIUM + if (LIGHTING_CUTOFF_MEDIUM) + lighting_cutoff = LIGHTING_CUTOFF_HIGH + if (LIGHTING_CUTOFF_HIGH) + lighting_cutoff = LIGHTING_CUTOFF_FULLBRIGHT else - lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + lighting_cutoff = LIGHTING_CUTOFF_VISIBLE update_sight() diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 995728c0f2ad..b11914cd7329 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -6,7 +6,6 @@ faction = list(ROLE_ALIEN) ventcrawler = VENTCRAWLER_ALWAYS sight = SEE_MOBS - see_in_dark = 4 verb_say = "hisses" initial_language_holder = /datum/language_holder/alien bubble_icon = "alien" @@ -40,7 +39,7 @@ internal_organs += new /obj/item/organ/brain/alien internal_organs += new /obj/item/organ/alien/hivenode internal_organs += new /obj/item/organ/tongue/alien - internal_organs += new /obj/item/organ/eyes/night_vision/alien + internal_organs += new /obj/item/organ/eyes/alien internal_organs += new /obj/item/organ/liver/alien internal_organs += new /obj/item/organ/ears ..() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 243853dafa04..a3eb04ddc2ca 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -562,78 +562,56 @@ return if(stat == DEAD) if(SSmapping.level_trait(z, ZTRAIT_NOXRAY)) - sight = null + set_sight(null) else if(is_secret_level(z)) - sight = initial(sight) + set_sight(initial(sight)) else - sight = (SEE_TURFS|SEE_MOBS|SEE_OBJS) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_OBSERVER + set_sight(SEE_TURFS|SEE_MOBS|SEE_OBJS) + set_invis_see(SEE_INVISIBLE_OBSERVER) return - sight = initial(sight) - see_infrared = initial(see_infrared) - lighting_alpha = initial(lighting_alpha) - var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) - if(!E) - update_tint() - else - see_invisible = E.see_invisible - see_in_dark = E.see_in_dark - sight |= E.sight_flags - if(!isnull(E.lighting_alpha)) - lighting_alpha = E.lighting_alpha - - for(var/image/I in infra_images) - if(client) - client.images.Remove(I) - infra_images = list() - remove_client_colour(/datum/client_colour/monochrome_infra) - - if(client.eye != src) + var/new_sight = initial(sight) + lighting_cutoff = initial(lighting_cutoff) + lighting_color_cutoffs = list(lighting_cutoff_red, lighting_cutoff_green, lighting_cutoff_blue) + + if(client.eye && client.eye != src) var/atom/A = client.eye if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. return if(glasses) - var/obj/item/clothing/glasses/G = glasses - sight |= G.vision_flags - see_in_dark = max(G.darkness_view, see_in_dark) - if(G.invis_override) - see_invisible = G.invis_override + new_sight |= glasses.vision_flags + if(glasses.invis_override) + set_invis_see(glasses.invis_override) else - see_invisible = min(G.invis_view, see_invisible) - if(!isnull(G.lighting_alpha)) - lighting_alpha = min(lighting_alpha, G.lighting_alpha) - - if(HAS_TRAIT(src, TRAIT_INFRARED_VISION)) - add_client_colour(/datum/client_colour/monochrome_infra) - var/image/A = null - see_infrared = TRUE - lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) - - if(client) - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - A = image('icons/mob/simple_human.dmi', H, "fullwhite") - A.name = "white haze" - A.override = 1 - infra_images |= A - client.images |= A + set_invis_see(min(glasses.invis_view, see_invisible)) + if(!isnull(glasses.lighting_cutoff)) + lighting_cutoff = max(lighting_cutoff, glasses.lighting_cutoff) + if(!isnull(glasses.color_cutoffs)) + lighting_color_cutoffs = blend_cutoff_colors(lighting_color_cutoffs, glasses.color_cutoffs) + + + if(HAS_TRAIT(src, TRAIT_TRUE_NIGHT_VISION)) + lighting_cutoff = max(lighting_cutoff, LIGHTING_CUTOFF_HIGH) + + if(HAS_TRAIT(src, TRAIT_MESON_VISION)) + new_sight |= SEE_TURFS + lighting_cutoff = max(lighting_cutoff, LIGHTING_CUTOFF_MEDIUM) if(HAS_TRAIT(src, TRAIT_THERMAL_VISION)) - sight |= (SEE_MOBS) - lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + new_sight |= SEE_MOBS + lighting_cutoff = max(lighting_cutoff, LIGHTING_CUTOFF_MEDIUM) if(HAS_TRAIT(src, TRAIT_XRAY_VISION)) - sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) - see_in_dark = max(see_in_dark, 8) + new_sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS if(see_override) - see_invisible = see_override + set_invis_see(see_override) if(SSmapping.level_trait(z, ZTRAIT_NOXRAY)) - sight = null + new_sight = NONE + set_sight(new_sight) return ..() /mob/living/carbon/update_stamina_hud(shown_stamina_amount) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index f87e39120139..653d2abc967e 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -132,7 +132,7 @@ if(G.vision_correction) clear_fullscreen("nearsighted") clear_fullscreen("eye_damage") - if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) + if(G.vision_flags || G.invis_override || G.invis_view || !isnull(G.lighting_cutoff)) update_sight() update_inv_glasses() if(ITEM_SLOT_GLOVES) @@ -217,7 +217,7 @@ if(G.vision_correction) if(HAS_TRAIT(src, TRAIT_NEARSIGHT)) overlay_fullscreen("nearsighted", /atom/movable/screen/fullscreen/impaired, 1) - if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) + if(G.vision_flags || G.invis_override || G.invis_view || !isnull(G.lighting_cutoff)) update_sight() if(!QDELETED(src)) update_inv_glasses() diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index c4b8bd0be8d4..4aca5549e3d8 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -13,7 +13,7 @@ inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH,TRAIT_GENELESS,TRAIT_NOHUNGER) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC - mutanteyes = /obj/item/organ/eyes/night_vision + mutanteyes = /obj/item/organ/eyes/shadow /datum/species/shadow/spec_life(mob/living/carbon/human/H) @@ -89,7 +89,7 @@ no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE) species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYESPRITES,NOFLASH) inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) - mutanteyes = /obj/item/organ/eyes/night_vision/nightmare + mutanteyes = /obj/item/organ/eyes/shadow mutant_organs = list(/obj/item/organ/heart/nightmare) mutantbrain = /obj/item/organ/brain/nightmare diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 41ed79f0ff96..4f3a9832fafb 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -51,7 +51,7 @@ mutanthands = /obj/item/zombie_hand armor = 20 // 120 damage to KO a zombie, which kills it speedmod = 1.6 - mutanteyes = /obj/item/organ/eyes/night_vision/zombie + mutanteyes = /obj/item/organ/eyes/zombie var/heal_rate = 1 var/regen_cooldown = 0 changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 120de23ca684..cce17d6775e8 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1555,8 +1555,8 @@ GLOBAL_LIST_EMPTY(fire_appearances) updatehealth() if("resize") update_transform() - if("lighting_alpha") - sync_lighting_plane_alpha() + if("lighting_cutoff") + sync_lighting_plane_cutoff() /mob/living/vv_get_header() . = ..() diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 4288d6291183..217078bf717a 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -1,7 +1,6 @@ /mob/living see_invisible = SEE_INVISIBLE_LIVING sight = 0 - see_in_dark = 2 hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD) pressure_resistance = 10 infra_luminosity = 10 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 5d890506003f..70783b2399a6 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -23,7 +23,6 @@ status_flags = CANSTUN|CANPUSH a_intent = INTENT_HARM //so we always get pushed instead of trying to swap sight = SEE_TURFS | SEE_MOBS | SEE_OBJS - see_in_dark = 8 hud_type = /datum/hud/ai med_hud = DATA_HUD_MEDICAL_BASIC sec_hud = DATA_HUD_SECURITY_BASIC diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 7d9c128e622e..0c0cf4554fdf 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -111,17 +111,15 @@ /mob/living/silicon/ai/update_sight() see_invisible = initial(see_invisible) - see_in_dark = initial(see_in_dark) sight = initial(sight) if(aiRestorePowerRoutine && !available_ai_cores()) sight = sight&~SEE_TURFS sight = sight&~SEE_MOBS sight = sight&~SEE_OBJS - see_in_dark = 0 if(see_override) see_invisible = see_override - sync_lighting_plane_alpha() + sync_lighting_plane_cutoff() /mob/living/silicon/ai/proc/start_RestorePowerRoutine() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index ea28cd315e22..c5bc9df32716 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1065,14 +1065,13 @@ sight = initial(sight) else sight = (SEE_TURFS|SEE_MOBS|SEE_OBJS) - see_in_dark = 8 see_invisible = SEE_INVISIBLE_OBSERVER return see_invisible = initial(see_invisible) - see_in_dark = initial(see_in_dark) sight = initial(sight) - lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + lighting_cutoff = LIGHTING_CUTOFF_VISIBLE + lighting_color_cutoffs = list(lighting_cutoff_red, lighting_cutoff_green, lighting_cutoff_blue) if(client.eye != src) var/atom/A = client.eye @@ -1081,28 +1080,24 @@ if(sight_mode & BORGMESON) sight |= SEE_TURFS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - see_in_dark = 2 + lighting_color_cutoffs = blend_cutoff_colors(lighting_color_cutoffs, list(5, 15, 5)) if(sight_mode & BORGMESON_NIGHTVISION) sight |= SEE_TURFS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - see_in_dark = 8 + lighting_color_cutoffs = blend_cutoff_colors(lighting_color_cutoffs, list(5, 30, 5)) if(sight_mode & BORGMATERIAL) sight |= SEE_OBJS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - see_in_dark = 2 + lighting_color_cutoffs = blend_cutoff_colors(lighting_color_cutoffs, list(20, 25, 40)) if(sight_mode & BORGXRAY) sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) see_invisible = SEE_INVISIBLE_LIVING - see_in_dark = 8 if(sight_mode & BORGTHERM) sight |= SEE_MOBS see_invisible = min(see_invisible, SEE_INVISIBLE_LIVING) - see_in_dark = 8 + lighting_color_cutoffs = blend_cutoff_colors(lighting_color_cutoffs, list(25, 8, 5)) if(see_override) see_invisible = see_override @@ -1110,7 +1105,7 @@ if(SSmapping.level_trait(z, ZTRAIT_NOXRAY)) sight = null - sync_lighting_plane_alpha() + sync_lighting_plane_cutoff() /mob/living/silicon/robot/update_stat() if(status_flags & GODMODE) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index e8ef8b4249a7..a2743cbf2527 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -6,7 +6,6 @@ verb_exclaim = "declares" verb_yell = "alarms" initial_language_holder = /datum/language_holder/synthetic - see_in_dark = 8 infra_luminosity = 0 bubble_icon = "machine" weather_immunities = list("ash") diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 5334e54e44d1..33539a190172 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -16,8 +16,10 @@ stop_automated_movement = 1 status_flags = CANPUSH attack_sound = 'sound/weapons/punch1.ogg' - see_in_dark = 7 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Vivid red, cause cult theme + lighting_cutoff_red = 30 + lighting_cutoff_green = 5 + lighting_cutoff_blue = 20 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 diff --git a/code/modules/mob/living/simple_animal/eldritch_demons.dm b/code/modules/mob/living/simple_animal/eldritch_demons.dm index a8160ab84822..326c7bebc458 100644 --- a/code/modules/mob/living/simple_animal/eldritch_demons.dm +++ b/code/modules/mob/living/simple_animal/eldritch_demons.dm @@ -15,8 +15,10 @@ stop_automated_movement = 1 AIStatus = AI_OFF attack_sound = 'sound/weapons/punch1.ogg' - see_in_dark = 7 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Sort of greenish brown, to match the vibeTM + lighting_cutoff_red = 20 + lighting_cutoff_green = 25 + lighting_cutoff_blue = 5 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 925bbe3462b9..f69b10974dd4 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -13,8 +13,6 @@ emote_see = list("shakes its head.", "shivers.") speak_chance = 1 turns_per_move = 5 - see_in_dark = 6 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE ventcrawler = VENTCRAWLER_ALWAYS pass_flags = PASSTABLE | PASSCOMPUTER mob_biotypes = MOB_ORGANIC|MOB_BEAST diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 0a967ca90dbe..5e6046c6d1b8 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -15,8 +15,10 @@ emote_hear = list("barks!", "woofs!", "yaps.","pants.") emote_see = list("shakes its head.", "chases its tail.","shivers.") faction = list("neutral") - see_in_dark = 5 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // VERY red, to fit the eyes + lighting_cutoff_red = 22 + lighting_cutoff_green = 5 + lighting_cutoff_blue = 5 speak_chance = 1 turns_per_move = 10 gold_core_spawnable = FRIENDLY_SPAWN diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index fd63fa71afb3..5dcaab702f96 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -48,8 +48,10 @@ faction = list("neutral","silicon","turret") dextrous = TRUE dextrous_hud_type = /datum/hud/dextrous/drone - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - see_in_dark = 7 + // Going for a sort of pale green here + lighting_cutoff_red = 30 + lighting_cutoff_green = 35 + lighting_cutoff_blue = 25 can_be_held = TRUE held_items = list(null, null) ignores_capitalism = TRUE // Yogs -- Lets drones buy a damned smoke for christ's sake diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index ff77a98efdf5..b091a7a0d843 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -11,7 +11,6 @@ emote_see = list("shakes its head.", "stamps a foot.", "glares around.") speak_chance = 1 turns_per_move = 5 - see_in_dark = 6 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 4, /obj/item/clothing/head/yogs/goatpelt = 1) response_help = "pets" response_disarm = "gently pushes aside" @@ -127,7 +126,6 @@ emote_see = list("shakes its head.") speak_chance = 1 turns_per_move = 5 - see_in_dark = 6 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 6) response_help = "pets" response_disarm = "gently pushes aside" @@ -349,7 +347,6 @@ emote_see = list("nibbles at the ground.") speak_chance = 1 turns_per_move = 5 - see_in_dark = 6 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 4) response_help = "pets" response_disarm = "gently pushes aside" diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index efb43b056b3d..91b763b6e3a9 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -12,7 +12,6 @@ emote_see = list("shakes its head.", "shivers.") speak_chance = 1 turns_per_move = 5 - see_in_dark = 6 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 1) //3 -> 1, foxes aren't Big response_help = "pets" response_disarm = "gently pushes aside" diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 0db366f360e3..453cb5c9fd0f 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -29,7 +29,6 @@ GLOBAL_VAR_INIT(mouse_killed, 0) emote_see = list("runs in a circle.", "shakes.") speak_chance = 1 turns_per_move = 5 - see_in_dark = 8 maxHealth = 5 health = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/mouse = 1) @@ -41,7 +40,6 @@ GLOBAL_VAR_INIT(mouse_killed, 0) pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY mob_biotypes = MOB_ORGANIC|MOB_BEAST - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE can_be_held = TRUE //mouse gaming worn_slot_flags = ITEM_SLOT_HEAD var/body_color //brown, gray and white, leave blank for random diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm index d4042069e51d..e23795675f64 100644 --- a/code/modules/mob/living/simple_animal/friendly/penguin.dm +++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm @@ -10,7 +10,6 @@ emote_see = list("shakes its beak.", "flaps it's wings.","preens itself.") faction = list("penguin") minbodytemp = 0 - see_in_dark = 5 speak_chance = 1 turns_per_move = 10 icon = 'icons/mob/penguins.dmi' diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm index 9ff6b8827553..dac773498b73 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm @@ -63,23 +63,33 @@ if(namedatum) P.color = namedatum.color -/mob/living/simple_animal/hostile/guardian/ranged/ToggleLight() +/mob/living/simple_animal/hostile/guardian/ranged/toggle_light() var/msg - switch(lighting_alpha) - if (LIGHTING_PLANE_ALPHA_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + switch(lighting_cutoff) + if (LIGHTING_CUTOFF_VISIBLE) + lighting_cutoff_red = 10 + lighting_cutoff_green = 10 + lighting_cutoff_blue = 15 msg = "You activate your night vision." - if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + if (LIGHTING_CUTOFF_MEDIUM) + lighting_cutoff_red = 25 + lighting_cutoff_green = 25 + lighting_cutoff_blue = 35 msg = "You increase your night vision." - if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + if (LIGHTING_CUTOFF_HIGH) + lighting_cutoff_red = 35 + lighting_cutoff_green = 35 + lighting_cutoff_blue = 50 msg = "You maximize your night vision." else lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + lighting_cutoff_red = 0 + lighting_cutoff_green = 0 + lighting_cutoff_blue = 0 msg = "You deactivate your night vision." + sync_lighting_plane_cutoff() + to_chat(src, span_notice(msg)) - to_chat(src, span_notice("[msg]")) /mob/living/simple_animal/hostile/guardian/ranged/verb/Snare() diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index ead1ba836cb9..5561f20b757d 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -31,8 +31,10 @@ faction = list(ROLE_ALIEN) status_flags = CANPUSH minbodytemp = 0 - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Going for a dark purple here + lighting_cutoff_red = 30 + lighting_cutoff_green = 15 + lighting_cutoff_blue = 50 unique_name = 1 gold_core_spawnable = NO_SPAWN deathsound = 'sound/voice/hiss6.ogg' diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index b8af2e8da74f..a5588ada87b6 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -14,7 +14,6 @@ speak_chance = 1 taunt_chance = 25 turns_per_move = 5 - see_in_dark = 6 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/bear = 5, /obj/item/clothing/head/bearpelt = 1) response_help = "pets" response_disarm = "gently pushes aside" diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm index f14228d72160..f08e6b472af7 100644 --- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm +++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm @@ -26,3 +26,7 @@ faction = list("spooky") del_on_death = 1 random_color = FALSE + // Redish ethereal glow. These lads live on the cult ship + lighting_cutoff_red = 40 + lighting_cutoff_green = 20 + lighting_cutoff_blue = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index bfc88357e0b8..820234f07f18 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -46,8 +46,7 @@ attack_sound = 'sound/weapons/bite.ogg' unique_name = 1 gold_core_spawnable = HOSTILE_SPAWN - see_in_dark = 4 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + footstep_type = FOOTSTEP_MOB_CLAW var/busy = SPIDER_IDLE var/playable_spider = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm b/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm index 959bef634b01..af1afb4bac93 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm @@ -12,6 +12,8 @@ response_harm = "strikes" status_flags = NONE a_intent = INTENT_HARM - see_in_dark = 4 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Let's do a blue, since they'll be on green turfs if this shit is ever finished + lighting_cutoff_red = 5 + lighting_cutoff_green = 20 + lighting_cutoff_blue = 25 mob_size = MOB_SIZE_LARGE diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index 17658cc7c1b4..2a26a7060f8e 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -9,7 +9,6 @@ turns_per_move = 5 maxHealth = 30 health = 30 - see_in_dark = 3 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/killertomato = 2) response_help = "prods" response_disarm = "pushes aside" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 711b67818090..35c5c617a2b6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -52,6 +52,10 @@ Difficulty: Medium attack_action_types = list(/datum/action/innate/megafauna_attack/create_skull, /datum/action/innate/megafauna_attack/charge_target) small_sprite_type = /datum/action/small_sprite/megafauna/legion + // Purple, but bright cause we're gonna need to spot mobs on lavaland + lighting_cutoff_red = 35 + lighting_cutoff_green = 20 + lighting_cutoff_blue = 45 /datum/action/innate/megafauna_attack/create_skull name = "Create Legion Skull" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 5ee206d44c72..611a4a7d5b8a 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -279,9 +279,10 @@ weather_immunities = list(WEATHER_LAVA, WEATHER_ASH) obj_damage = 30 environment_smash = ENVIRONMENT_SMASH_STRUCTURES - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - + // Purple, but bright cause we're gonna need to spot mobs on lavaland + lighting_cutoff_red = 35 + lighting_cutoff_green = 20 + lighting_cutoff_blue = 45 /mob/living/simple_animal/hostile/big_legion/Initialize(mapload) .=..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm index ff2ab1ed7ed9..4d78888ddba4 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm @@ -16,8 +16,10 @@ var/crusher_loot var/throw_message = "bounces off of" var/fromtendril = FALSE - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Pale purple, should be red enough to see stuff on lavaland + lighting_cutoff_red = 25 + lighting_cutoff_green = 15 + lighting_cutoff_blue = 35 mob_size = MOB_SIZE_LARGE var/icon_aggro = null var/crusher_drop_mod = 25 diff --git a/code/modules/mob/living/simple_animal/hostile/rat.dm b/code/modules/mob/living/simple_animal/hostile/rat.dm index a99c17ffc4eb..518e8210049b 100644 --- a/code/modules/mob/living/simple_animal/hostile/rat.dm +++ b/code/modules/mob/living/simple_animal/hostile/rat.dm @@ -13,8 +13,6 @@ obj_damage = 5 speak_chance = 1 turns_per_move = 5 - see_in_dark = 6 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE maxHealth = 15 health = 15 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/mouse = 1) diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index c117420b0f4d..b63f5d550833 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -9,7 +9,6 @@ turns_per_move = 5 maxHealth = 70 health = 70 - see_in_dark = 15 obj_damage = 10 butcher_results = list(/obj/item/clothing/head/crown = 1,) response_help = "glares at" @@ -24,7 +23,11 @@ ventcrawler = VENTCRAWLER_ALWAYS unique_name = TRUE faction = list("rat") - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Slightly brown red, for the eyes + // Might be a bit too dim + lighting_cutoff_red = 22 + lighting_cutoff_green = 8 + lighting_cutoff_blue = 5 var/datum/action/cooldown/riot var/datum/action/cooldown/domain var/opening_airlock = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm index 25567bc1d6aa..cf4fad70e66d 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm @@ -14,8 +14,6 @@ maxHealth = 15 health = 15 spacewalk = TRUE - see_in_dark = 10 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE harm_intent_damage = 6 melee_damage_lower = 6 melee_damage_upper = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/trianglespider.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/trianglespider.dm index 2986111e54b5..f041887315e4 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/trianglespider.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/trianglespider.dm @@ -26,5 +26,3 @@ attack_sound = 'sound/weapons/bite.ogg' unique_name = 1 gold_core_spawnable = HOSTILE_SPAWN - see_in_dark = 4 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index ce1eb05e880d..5f342e06eccd 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -29,8 +29,10 @@ stat_attack = UNCONSCIOUS gold_core_spawnable = HOSTILE_SPAWN faction = list("skeleton") - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Going for a sort of pale bluegreen here, shooting for boneish + lighting_cutoff_red = 15 + lighting_cutoff_green = 25 + lighting_cutoff_blue = 35 deathmessage = "collapses into a pile of bones!" del_on_death = 1 loot = list(/obj/effect/decal/remains/human) diff --git a/code/modules/mob/living/simple_animal/hostile/smspider.dm b/code/modules/mob/living/simple_animal/hostile/smspider.dm index 52350aa77c05..ebe30b9a04a2 100644 --- a/code/modules/mob/living/simple_animal/hostile/smspider.dm +++ b/code/modules/mob/living/simple_animal/hostile/smspider.dm @@ -21,8 +21,10 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) robust_searching = 1 faction = list("hostile") - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Gold, supermatter tinted + lighting_cutoff_red = 30 + lighting_cutoff_green = 30 + lighting_cutoff_blue = 10 ventcrawler = VENTCRAWLER_ALWAYS deathmessage = "falls to the ground, its shard dulling to a miserable grey!" var/overcharged = FALSE // if true, spider will not die if it dusts a limb @@ -55,4 +57,4 @@ icon_living = "smspideroc" maxHealth = 25 health = 25 - overcharged = TRUE \ No newline at end of file + overcharged = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index 6ea19253f06b..3bab5bd24821 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -38,8 +38,6 @@ icon_dead = "spacedragon_dead" health_doll_icon = "spacedragon" obj_damage = 50 - see_in_dark = 7 //yogs - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE //yogs environment_smash = ENVIRONMENT_SMASH_NONE flags_1 = HEAR_1 | PREVENT_CONTENTS_EXPLOSION_1 mob_size = MOB_SIZE_LARGE diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 55c8f67fa8ba..ee396f27c7fa 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -36,8 +36,10 @@ animate_movement = NO_STEPS // Do not animate movement, you jump around as you're a scary statue. hud_possible = list(ANTAG_HUD) - see_in_dark = 13 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + // Dim purple, I want it to be possible to miss people in the dark but not easy to + lighting_cutoff_red = 15 + lighting_cutoff_green = 10 + lighting_cutoff_blue = 25 vision_range = 12 aggro_vision_range = 12 @@ -64,8 +66,6 @@ flicker.Grant(src) var/datum/action/cooldown/spell/aoe/blindness/blind = new(src) blind.Grant(src) - var/datum/action/cooldown/spell/night_vision/night_vision = new(src) - night_vision.Grant(src) // Set creator if(creator) diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 4ed3901312fe..ae31adfe8284 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -94,7 +94,10 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 0 sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + // Real green, cause of course + lighting_cutoff_red = 10 + lighting_cutoff_green = 35 + lighting_cutoff_blue = 20 faction = list("hostile","vines","plants") initial_language_holder = /datum/language_holder/venus del_on_death = TRUE diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index f8739d65a3d1..c4885bec37a1 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -480,12 +480,10 @@ sight = initial(sight) else sight = (SEE_TURFS|SEE_MOBS|SEE_OBJS) - see_in_dark = 8 see_invisible = SEE_INVISIBLE_OBSERVER return see_invisible = initial(see_invisible) - see_in_dark = initial(see_in_dark) sight = initial(sight) if(SSmapping.level_trait(z, ZTRAIT_NOXRAY)) sight = null @@ -493,7 +491,7 @@ var/atom/A = client.eye if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. return - sync_lighting_plane_alpha() + sync_lighting_plane_cutoff() /mob/living/simple_animal/get_idcard(hand_first) return access_card diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index c93719de7ff2..a1847ad7a880 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -259,19 +259,25 @@ //This entire if/else chain could be in two lines but isn't for readibilties sake. var/msg = message + var/msg_type = MSG_VISUAL + if(M.see_invisible < invisibility)//if src is invisible to M msg = blind_message + msg_type = MSG_AUDIBLE else if(T != loc && T != src) //if src is inside something and not a turf. + if(M != loc) // Only give the blind message to hearers that aren't the location + msg = blind_message + msg_type = MSG_AUDIBLE + else if(!HAS_TRAIT(M, TRAIT_HEAR_THROUGH_DARKNESS) && M.lighting_cutoff < LIGHTING_CUTOFF_HIGH && T.is_softly_lit() && !in_range(T,M)) //if it is too dark, unless we're right next to them. msg = blind_message - else if(M.lighting_alpha > LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE && T.is_softly_lit() && !in_range(T,M)) //if it is too dark. - msg = blind_message + msg_type = MSG_AUDIBLE if(!msg) continue if(visible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(M, visible_message_flags) && !is_blind(M)) M.create_chat_message(src, raw_message = raw_msg, runechat_flags = visible_message_flags) - M.show_message(msg, MSG_VISUAL, blind_message, MSG_AUDIBLE) + M.show_message(msg, msg_type, blind_message, MSG_AUDIBLE) @@ -1240,15 +1246,15 @@ ///Update the lighting plane and sight of this mob (sends COMSIG_MOB_UPDATE_SIGHT) /mob/proc/update_sight() SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) - sync_lighting_plane_alpha() + sync_lighting_plane_cutoff() ///Set the lighting plane hud alpha to the mobs lighting_alpha var -/mob/proc/sync_lighting_plane_alpha() - if(hud_used) - var/atom/movable/screen/plane_master/lighting/L = hud_used.plane_masters["[LIGHTING_PLANE]"] - if (L) - L.alpha = lighting_alpha - +/mob/proc/sync_lighting_plane_cutoff() + if(!hud_used) + return + for(var/atom/movable/screen/plane_master/rendering_plate/lighting/light as anything in hud_used.get_true_plane_masters(RENDER_PLANE_LIGHTING)) + light.set_light_cutoff(lighting_cutoff, lighting_color_cutoffs) + ///Update the mouse pointer of the attached client in this mob /mob/proc/update_mouse_pointer() if (!client) @@ -1266,6 +1272,10 @@ if(client.mouse_override_icon) client.mouse_pointer_icon = client.mouse_override_icon +/mob/proc/has_nightvision() + // Somewhat conservative, basically is your lighting plane bright enough that you the user can see stuff + var/light_offset = (lighting_color_cutoffs[1] + lighting_color_cutoffs[2] + lighting_color_cutoffs[3]) / 3 + lighting_cutoff + return light_offset >= LIGHTING_NIGHTVISION_THRESHOLD ///This mob is abile to read books /mob/proc/is_literate() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 469261640cb2..341dbcafdd13 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -17,8 +17,23 @@ mouse_drag_pointer = MOUSE_ACTIVE_POINTER throwforce = 10 blocks_emissive = EMISSIVE_BLOCK_GENERIC - - var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + // we never want to hide a turf because it's not lit + // We can rely on the lighting plane to handle that for us + see_in_dark = 1e6 + + /// Percentage of how much rgb to max the lighting plane at + /// This lets us brighten it without washing out color + /// Scale from 0-100, reset off update_sight() + var/lighting_cutoff = LIGHTING_CUTOFF_VISIBLE + // Individual color max for red, we can use this to color darkness without tinting the light + var/lighting_cutoff_red = 0 + // Individual color max for green, we can use this to color darkness without tinting the light + var/lighting_cutoff_green = 0 + // Individual color max for blue, we can use this to color darkness without tinting the light + var/lighting_cutoff_blue = 0 + /// A list of red, green and blue cutoffs + /// This is what actually gets applied to the mob, it's modified by things like glasses + var/list/lighting_color_cutoffs = null var/datum/mind/mind var/static/next_mob_id = 0 /// The current client inhabiting this mob. Managed by login/logout @@ -234,3 +249,4 @@ var/datum/focus var/fake_client = FALSE // Currently only used for examines + diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index d42751d8181b..e9b5fe3be285 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -612,3 +612,8 @@ if(chosen_bodypart.status < BODYPART_ROBOTIC) amount += chosen_bodypart.burn_dam return amount + +/mob/proc/default_lighting_cutoff() + if(client?.combo_hud_enabled && client?.prefs?.toggles & COMBOHUD_LIGHTING) + return LIGHTING_CUTOFF_FULLBRIGHT + return initial(lighting_cutoff) diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index 345156098958..a94f8efeaa0f 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -122,3 +122,31 @@ // 10C has 3 range (2 tiles) // 0C has 0 range (0 tiles) infra_luminosity = round(max((bodytemperature - T0C)/3, 0)) + +/// Sight here is the mob.sight var, which tells byond what to actually show to our client +/// See [code\__DEFINES\sight.dm] for more details +/mob/proc/set_sight(new_value) + SHOULD_CALL_PARENT(TRUE) + if(sight == new_value) + return + var/old_sight = sight + sight = new_value + + SEND_SIGNAL(src, COMSIG_MOB_SIGHT_CHANGE, new_value, old_sight) + +/mob/proc/add_sight(new_value) + set_sight(sight | new_value) + +/mob/proc/clear_sight(new_value) + set_sight(sight & ~new_value) + +/// see invisibility is the mob's capability to see things that ought to be hidden from it +/// Can think of it as a primitive version of changing the alpha of planes +/// We mostly use it to hide ghosts, no real reason why +/mob/proc/set_invis_see(new_sight) + SHOULD_CALL_PARENT(TRUE) + if(new_sight == see_invisible) + return + var/old_invis = see_invisible + see_invisible = new_sight + SEND_SIGNAL(src, COMSIG_MOB_SEE_INVIS_CHANGE, see_invisible, old_invis) diff --git a/code/modules/research/xenobiology/crossbreeding/_structures.dm b/code/modules/research/xenobiology/crossbreeding/_structures.dm index 32243aeb67a1..9b2584ab207b 100644 --- a/code/modules/research/xenobiology/crossbreeding/_structures.dm +++ b/code/modules/research/xenobiology/crossbreeding/_structures.dm @@ -424,7 +424,7 @@ GLOBAL_LIST_EMPTY(bluespace_slime_crystals) blood_amt -= 50 to_chat(user, span_notice("You touch the crystal, and see blood transforming into an organ!")) playsound(src, 'sound/magic/demon_consume.ogg', 50, 1) - var/type = pick(/obj/item/reagent_containers/food/snacks/meat/slab,/obj/item/organ/heart,/obj/item/organ/heart/freedom,/obj/item/organ/lungs,/obj/item/organ/lungs/plasmaman,/obj/item/organ/lungs/ethereal,/obj/item/organ/lungs/slime,/obj/item/organ/liver,/obj/item/organ/liver/plasmaman,/obj/item/organ/liver/alien,/obj/item/organ/eyes,/obj/item/organ/eyes/night_vision/alien,/obj/item/organ/eyes/night_vision,/obj/item/organ/eyes/night_vision/mushroom,/obj/item/organ/tongue,/obj/item/organ/stomach,/obj/item/organ/stomach/plasmaman,/obj/item/organ/stomach/cell/ethereal,/obj/item/organ/ears,/obj/item/organ/ears/cat,/obj/item/organ/ears/penguin) + var/type = pick(/obj/item/reagent_containers/food/snacks/meat/slab,/obj/item/organ/heart,/obj/item/organ/heart/freedom,/obj/item/organ/lungs,/obj/item/organ/lungs/plasmaman,/obj/item/organ/lungs/ethereal,/obj/item/organ/lungs/slime,/obj/item/organ/liver,/obj/item/organ/liver/plasmaman,/obj/item/organ/liver/alien,/obj/item/organ/eyes,/obj/item/organ/eyes/alien,/obj/item/organ/eyes/night_vision,/obj/item/organ/eyes/night_vision/mushroom,/obj/item/organ/tongue,/obj/item/organ/stomach,/obj/item/organ/stomach/plasmaman,/obj/item/organ/stomach/cell/ethereal,/obj/item/organ/ears,/obj/item/organ/ears/cat,/obj/item/organ/ears/penguin) new type(get_turf(src)) /obj/structure/slime_crystal/red/attacked_by(obj/item/I, mob/living/user) diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index c38dcbb9c178..ab2f851020b4 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -286,8 +286,9 @@ /mob/camera/aiEye/remote/shuttle_docker/update_remote_sight(mob/living/user) user.sight = BLIND|SEE_TURFS - user.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE - user.sync_lighting_plane_alpha() + // Pale blue, should look nice I think + user.lighting_color_cutoffs = list(30, 40, 50) + user.sync_lighting_plane_cutoff() return TRUE /datum/action/innate/shuttledocker_rotate diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm index f8c60e4eb9de..23742a544efe 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm @@ -15,8 +15,9 @@ /mob/camera/aiEye/remote/shuttle_creation/update_remote_sight(mob/living/user) user.sight = BLIND|SEE_TURFS - user.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE - user.sync_lighting_plane_alpha() + // Pale blue, should look nice I think + user.lighting_color_cutoffs = list(30, 40, 50) + user.sync_lighting_plane_cutoff() return TRUE /mob/camera/aiEye/remote/shuttle_creation/relaymove(mob/user, direct) diff --git a/code/modules/spells/spell_types/self/night_vision.dm b/code/modules/spells/spell_types/self/night_vision.dm deleted file mode 100644 index c3b3fc9977fa..000000000000 --- a/code/modules/spells/spell_types/self/night_vision.dm +++ /dev/null @@ -1,39 +0,0 @@ -//Toggle Night Vision -/datum/action/cooldown/spell/night_vision - name = "Toggle Nightvision" - desc = "Toggle your nightvision mode." - - cooldown_time = 1 SECONDS - spell_requirements = NONE - - /// The span the "toggle" message uses when sent to the user - var/toggle_span = "notice" - -/datum/action/cooldown/spell/night_vision/New(Target) - . = ..() - name = "[name] \[ON\]" - -/datum/action/cooldown/spell/night_vision/is_valid_target(atom/cast_on) - return isliving(cast_on) - -/datum/action/cooldown/spell/night_vision/cast(mob/living/cast_on) - . = ..() - to_chat(cast_on, "You toggle your night vision.") - - var/next_mode_text = "" - switch(cast_on.lighting_alpha) - if (LIGHTING_PLANE_ALPHA_VISIBLE) - cast_on.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - next_mode_text = "More" - if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) - cast_on.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - next_mode_text = "Full" - if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) - cast_on.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE - next_mode_text = "OFF" - else - cast_on.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE - next_mode_text = "ON" - - cast_on.update_sight() - name = "[initial(name)] \[[next_mode_text]\]" \ No newline at end of file diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index dd838e18ccfb..3a1fef1a4bcf 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -20,14 +20,16 @@ low_threshold_cleared = span_info("Your vision is cleared of any ailment.") var/sight_flags = 0 - var/see_in_dark = 2 var/tint = 0 var/eye_color = "" //set to a hex code to override a mob's eye color var/eye_icon_state = "eyes" var/old_eye_color = "fff" var/flash_protect = 0 var/see_invisible = SEE_INVISIBLE_LIVING - var/lighting_alpha + /// How much darkness to cut out of your view (basically, night vision) + var/lighting_cutoff = null + /// List of color cutoffs from eyes, or null if not applicable + var/list/color_cutoffs = null var/no_glasses var/damaged = TRUE //damaged indicates that our eyes are undergoing some level of negative effect,starts as true so it removes the impaired vision overlay if it is replacing damaged eyes @@ -40,8 +42,6 @@ HMN.eye_color = eye_color else eye_color = HMN.eye_color - if(HAS_TRAIT(HMN, TRAIT_NIGHT_VISION) && !lighting_alpha) - lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT M.update_tint() owner.update_sight() if(M.has_dna() && ishuman(M)) @@ -117,38 +117,64 @@ #undef OFFSET_X #undef OFFSET_Y +#define NIGHTVISION_LIGHT_OFF 0 +#define NIGHTVISION_LIGHT_LOW 1 +#define NIGHTVISION_LIGHT_MID 2 +#define NIGHTVISION_LIGHT_HIG 3 + /obj/item/organ/eyes/night_vision name = "shadow eyes" desc = "A spooky set of eyes that can see in the dark." - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + actions_types = list(/datum/action/item_action/organ_action/use) - var/night_vision = TRUE + // These lists are used as the color cutoff for the eye + // They need to be filled out for subtypes + var/list/low_light_cutoff + var/list/medium_light_cutoff + var/list/high_light_cutoff + var/light_level = NIGHTVISION_LIGHT_OFF + +/obj/item/organ/eyes/night_vision/Initialize(mapload) + . = ..() + if (PERFORM_ALL_TESTS(focus_only/nightvision_color_cutoffs) && type != /obj/item/organ/eyes/night_vision) + if(length(low_light_cutoff) != 3 || length(medium_light_cutoff) != 3 || length(high_light_cutoff) != 3) + stack_trace("[type] did not have fully filled out color cutoff lists") + if(low_light_cutoff) + color_cutoffs = low_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_LOW /obj/item/organ/eyes/night_vision/ui_action_click() sight_flags = initial(sight_flags) - switch(lighting_alpha) - if (LIGHTING_PLANE_ALPHA_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + switch(light_level) + if (NIGHTVISION_LIGHT_OFF) + color_cutoffs = low_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_LOW + if (NIGHTVISION_LIGHT_LOW) + color_cutoffs = medium_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_MID + if (NIGHTVISION_LIGHT_MID) + color_cutoffs = high_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_HIG else - lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE - sight_flags &= ~SEE_BLACKNESS + color_cutoffs = list() + light_level = NIGHTVISION_LIGHT_OFF owner.update_sight() -/obj/item/organ/eyes/night_vision/alien +#undef NIGHTVISION_LIGHT_OFF +#undef NIGHTVISION_LIGHT_LOW +#undef NIGHTVISION_LIGHT_MID +#undef NIGHTVISION_LIGHT_HIG + +/obj/item/organ/eyes/alien name = "alien eyes" desc = "It turned out they had them after all!" sight_flags = SEE_MOBS -/obj/item/organ/eyes/night_vision/zombie +/obj/item/organ/eyes/zombie name = "undead eyes" desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." -/obj/item/organ/eyes/night_vision/nightmare +/obj/item/organ/eyes/shadow name = "burning red eyes" desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread." icon_state = "burning_eyes" @@ -182,9 +208,10 @@ name = "\improper meson eyes" desc = "These cybernetic eyes will give you meson-vision. Looks like it could withstand seeing a supermatter crystal!." eye_color = "00FF00" - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + // We're gonna downshift green and blue a bit so darkness looks yellow + color_cutoffs = list(25, 8, 5) sight_flags = SEE_TURFS - see_in_dark = 4 + /obj/item/organ/eyes/robotic/xray/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = FALSE, initialising) . = ..() @@ -199,16 +226,15 @@ desc = "These cybernetic eyes will give you true X-ray vision. Blinking is futile." eye_color = "000" sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS - see_in_dark = 8 /obj/item/organ/eyes/robotic/thermals name = "thermal eyes" desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included." eye_color = "FC0" sight_flags = SEE_MOBS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + // We're gonna downshift green and blue a bit so darkness looks yellow + color_cutoffs = list(25, 8, 5) flash_protect = -1 - see_in_dark = 8 /obj/item/organ/eyes/robotic/flashlight name = "flashlight eyes" @@ -455,5 +481,15 @@ /obj/item/organ/eyes/polysmorph name = "polysmorph eyes" desc = "Eyes from a polysmorph, capable of retaining slightly more vision in low light environments" - lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT - see_in_dark = 5 + color_cutoffs = list(25, 5, 42) + +/obj/item/organ/eyes/zombie + name = "undead eyes" + desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." + color_cutoffs = list(25, 35, 5) + +/obj/item/organ/eyes/alien + name = "alien eyes" + desc = "It turned out they had them after all!" + sight_flags = SEE_MOBS + color_cutoffs = list(25, 5, 42) diff --git a/yogstation.dme b/yogstation.dme index 23b33a2472d9..dd062cd59f21 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -152,6 +152,7 @@ #include "code\__DEFINES\dcs\signals\signals_global.dm" #include "code\__DEFINES\dcs\signals\signals_global_object.dm" #include "code\__DEFINES\dcs\signals\signals_heretic.dm" +#include "code\__DEFINES\dcs\signals\signals_huds.dm" #include "code\__DEFINES\dcs\signals\signals_janitor.dm" #include "code\__DEFINES\dcs\signals\signals_mood.dm" #include "code\__DEFINES\dcs\signals\signals_moveloop.dm" @@ -201,6 +202,7 @@ #include "code\__DEFINES\{yogs_defines}\wires.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_logging.dm" +#include "code\__HELPERS\_planes.dm" #include "code\__HELPERS\_string_lists.dm" #include "code\__HELPERS\animations.dm" #include "code\__HELPERS\areas.dm" @@ -475,6 +477,7 @@ #include "code\datums\actions\items\stealth_box.dm" #include "code\datums\actions\items\toggles.dm" #include "code\datums\actions\items\vortex_recall.dm" +#include "code\datums\actions\mobs\adjust_vision.dm" #include "code\datums\actions\mobs\language_menu.dm" #include "code\datums\actions\mobs\ninja.dm" #include "code\datums\actions\mobs\small_sprite.dm" @@ -3601,7 +3604,6 @@ #include "code\modules\spells\spell_types\self\lichdom.dm" #include "code\modules\spells\spell_types\self\mime_vow.dm" #include "code\modules\spells\spell_types\self\mutate.dm" -#include "code\modules\spells\spell_types\self\night_vision.dm" #include "code\modules\spells\spell_types\self\personality_commune.dm" #include "code\modules\spells\spell_types\self\rod_form.dm" #include "code\modules\spells\spell_types\self\smoke.dm" diff --git a/yogstation/code/game/gamemodes/shadowling/shadowling.dm b/yogstation/code/game/gamemodes/shadowling/shadowling.dm index 44b224ba7e78..8c49e5e19ca0 100644 --- a/yogstation/code/game/gamemodes/shadowling/shadowling.dm +++ b/yogstation/code/game/gamemodes/shadowling/shadowling.dm @@ -146,7 +146,7 @@ Made by Xhuis inherent_traits = list(TRAIT_NOGUNS, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE, TRAIT_NOBREATH, TRAIT_RADIMMUNE, TRAIT_VIRUSIMMUNE, TRAIT_PIERCEIMMUNE) no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_EYES, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE) nojumpsuit = TRUE - mutanteyes = /obj/item/organ/eyes/night_vision/alien/sling + mutanteyes = /obj/item/organ/eyes/alien/sling burnmod = 1.5 //1.5x burn damage, 2x is excessive heatmod = 1.5 var/mutable_appearance/eyes_overlay diff --git a/yogstation/code/game/gamemodes/vampire/vampire_bat.dm b/yogstation/code/game/gamemodes/vampire/vampire_bat.dm index 75fd9ccf8341..80abc4fb8fad 100644 --- a/yogstation/code/game/gamemodes/vampire/vampire_bat.dm +++ b/yogstation/code/game/gamemodes/vampire/vampire_bat.dm @@ -13,8 +13,6 @@ maxHealth = 20 health = 20 speed = 0 - see_in_dark = 10 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE harm_intent_damage = 7 melee_damage_lower = 5 melee_damage_upper = 7 diff --git a/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm b/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm index 4990a34d07d3..d52ee24b9c75 100644 --- a/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm +++ b/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm @@ -993,30 +993,30 @@ spell_requirements = NONE -/datum/action/cooldown/spell/thrall_night_vision/cast(mob/living/carbon/human/user) - . = ..() - if(!.) - return FALSE - if(!is_shadow_or_thrall(user)) - return - var/obj/item/organ/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES) - if(!eyes) - return - eyes.sight_flags = initial(eyes.sight_flags) - switch(eyes.lighting_alpha) - if (LIGHTING_PLANE_ALPHA_VISIBLE) - eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - eyes.see_in_dark = 8 - if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) - eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) - eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE - else - eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE - eyes.see_in_dark = 2 //default - user.update_sight() - - return TRUE +// /datum/action/cooldown/spell/thrall_night_vision/cast(mob/living/carbon/human/user) +// . = ..() +// if(!.) +// return FALSE +// if(!is_shadow_or_thrall(user)) +// return +// var/obj/item/organ/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES) +// if(!eyes) +// return +// eyes.sight_flags = initial(eyes.sight_flags) +// switch(eyes.lighting_alpha) +// if (LIGHTING_PLANE_ALPHA_VISIBLE) +// eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE +// eyes.see_in_dark = 8 +// if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) +// eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE +// if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) +// eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE +// else +// eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE +// eyes.see_in_dark = 2 //default +// user.update_sight() + +// return TRUE /datum/action/cooldown/spell/lesser_shadowling_hivemind //Lets a thrall talk with their allies name = "Lesser Commune" diff --git a/yogstation/code/modules/antagonists/slaughter/slaughter.dm b/yogstation/code/modules/antagonists/slaughter/slaughter.dm index ed62fb6cd5ed..75e90ee01660 100644 --- a/yogstation/code/modules/antagonists/slaughter/slaughter.dm +++ b/yogstation/code/modules/antagonists/slaughter/slaughter.dm @@ -32,8 +32,6 @@ wound_bonus = -10 bare_wound_bonus = 0 sharpness = SHARP_EDGED - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE var/playstyle_string = "You are a slaughter demon, a terrible creature from another realm. You have a single desire: To kill. \ Alt-click blood pools to travel through them, appearing and disappearing from the station at will. \ diff --git a/yogstation/code/modules/clothing/glasses/_glasses.dm b/yogstation/code/modules/clothing/glasses/_glasses.dm index d79a523f5a98..9070e85df29d 100644 --- a/yogstation/code/modules/clothing/glasses/_glasses.dm +++ b/yogstation/code/modules/clothing/glasses/_glasses.dm @@ -3,7 +3,6 @@ desc = "Made in china" icon_state = "sun" item_state = "sunglasses" - darkness_view = 1 flash_protect = 0 tint = 1 glass_colour_type = /datum/client_colour/glass_colour/gray @@ -25,4 +24,4 @@ name = "eye patch" desc = "Arrrggg now you too can be a real pirate matey." icon_state = "eyepatch" - item_state = "eyepatch" \ No newline at end of file + item_state = "eyepatch" diff --git a/yogstation/code/modules/guardian/guardian.dm b/yogstation/code/modules/guardian/guardian.dm index d2d02ad0f4e6..f4f711438dd3 100644 --- a/yogstation/code/modules/guardian/guardian.dm +++ b/yogstation/code/modules/guardian/guardian.dm @@ -50,7 +50,6 @@ GLOBAL_LIST_INIT(guardian_projectile_damage, list( light_range = 3 light_on = FALSE hud_type = /datum/hud/guardian - see_in_dark = 8 var/list/barrier_images = list() var/custom_name = FALSE var/atk_cooldown = 10 diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/darkspawn.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/darkspawn.dm index 6d9808c035f0..0087efc26d69 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/darkspawn.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/darkspawn.dm @@ -13,7 +13,7 @@ no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE, ITEM_SLOT_HEAD) species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYESPRITES,NOFLASH) inherent_traits = list(TRAIT_NOGUNS, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE, TRAIT_NOBREATH, TRAIT_RADIMMUNE, TRAIT_VIRUSIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_NODISMEMBER, TRAIT_NOHUNGER) - mutanteyes = /obj/item/organ/eyes/night_vision/alien + mutanteyes = /obj/item/organ/eyes/alien var/list/upgrades = list() COOLDOWN_DECLARE(reflect_cd_1) COOLDOWN_DECLARE(reflect_cd_2) diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm index 6e47fd34d5c7..037da0f9230a 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm @@ -1,8 +1,11 @@ +#define NIGHTVISION_LIGHT_OFF 0 +#define NIGHTVISION_LIGHT_LOW 1 +#define NIGHTVISION_LIGHT_MID 2 +#define NIGHTVISION_LIGHT_HIG 3 + /obj/item/organ/eyes/robotic/preternis name = "preternis eyes" desc = "An experimental upgraded version of eyes that can see in the dark. They are designed to fit preternis" - see_in_dark = PRETERNIS_NV_ON - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE //preternis eyes need to be powered by a preternis to function, in a non preternis they slowly power down to blindness status = ORGAN_ROBOTIC organ_flags = ORGAN_SYNTHETIC @@ -17,22 +20,34 @@ var/powered = TRUE actions_types = list(/datum/action/item_action/organ_action/use) var/night_vision = TRUE + // These lists are used as the color cutoff for the eye + // They need to be filled out for subtypes + var/list/low_light_cutoff + var/list/medium_light_cutoff + var/list/high_light_cutoff + var/light_level = NIGHTVISION_LIGHT_OFF + + + /obj/item/organ/eyes/robotic/preternis/ui_action_click() if(damage > low_threshold) //no nightvision if your eyes are hurt return sight_flags = initial(sight_flags) - switch(lighting_alpha) - if (LIGHTING_PLANE_ALPHA_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + switch(light_level) + if (NIGHTVISION_LIGHT_OFF) + color_cutoffs = low_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_LOW + if (NIGHTVISION_LIGHT_LOW) + color_cutoffs = medium_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_MID + if (NIGHTVISION_LIGHT_MID) + color_cutoffs = high_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_HIG else - lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE - sight_flags &= ~SEE_BLACKNESS + color_cutoffs = list() + light_level = NIGHTVISION_LIGHT_OFF owner.update_sight() /obj/item/organ/eyes/robotic/preternis/on_life() @@ -52,19 +67,11 @@ //to simulate running out of power, they take damage owner.adjustOrganLoss(ORGAN_SLOT_EYES,0.5) - if(damage < low_threshold) - if(see_in_dark == PRETERNIS_NV_OFF) - see_in_dark = PRETERNIS_NV_ON - owner.update_sight() - else - //if your eyes start getting hurt no more nightvision - if(see_in_dark == PRETERNIS_NV_ON) - see_in_dark = PRETERNIS_NV_OFF - owner.update_sight() - if(lighting_alpha < LIGHTING_PLANE_ALPHA_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE - sight_flags &= ~SEE_BLACKNESS - owner.update_sight() +#undef NIGHTVISION_LIGHT_OFF +#undef NIGHTVISION_LIGHT_LOW +#undef NIGHTVISION_LIGHT_MID +#undef NIGHTVISION_LIGHT_HIG + /obj/item/organ/eyes/robotic/preternis/examine(mob/user) . = ..() diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/szlachta.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/szlachta.dm index dd1a717f7b14..be23ef61881f 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/szlachta.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/szlachta.dm @@ -17,7 +17,7 @@ inherent_traits = list(TRAIT_NOGUNS, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE, TRAIT_NOBREATH, TRAIT_RADIMMUNE, TRAIT_VIRUSIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_NODISMEMBER, TRAIT_MONKEYLIKE, TRAIT_NOCRITDAMAGE, TRAIT_GENELESS, TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_HARDLY_WOUNDED, TRAIT_HUSK) - mutanteyes = /obj/item/organ/eyes/night_vision/alien + mutanteyes = /obj/item/organ/eyes/alien /datum/species/szlachta/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() diff --git a/yogstation/code/modules/mob/living/living.dm b/yogstation/code/modules/mob/living/living.dm index 772af13c60b8..5a123f460b41 100644 --- a/yogstation/code/modules/mob/living/living.dm +++ b/yogstation/code/modules/mob/living/living.dm @@ -17,5 +17,5 @@ /mob/living/update_sight() . = ..() for(var/mob/living/simple_animal/hostile/guardian/holopara as anything in hasparasites()) - holopara.lighting_alpha = lighting_alpha + holopara.lighting_cutoff = lighting_cutoff holopara.update_sight() diff --git a/yogstation/code/modules/surgery/organs/shadowling_organs.dm b/yogstation/code/modules/surgery/organs/shadowling_organs.dm index 309ac0e96d12..1182b11f6ed6 100644 --- a/yogstation/code/modules/surgery/organs/shadowling_organs.dm +++ b/yogstation/code/modules/surgery/organs/shadowling_organs.dm @@ -1,5 +1,5 @@ //Snowflake spot for putting sling organ related stuff -/obj/item/organ/eyes/night_vision/alien/sling +/obj/item/organ/eyes/alien/sling name = "shadowling eyes" desc = "The eyes of a spooky shadowling!" @@ -62,7 +62,7 @@ playsound(S, 'sound/effects/bang.ogg', 50, 1) return FALSE var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) - eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + eyes.lighting_cutoff = LIGHTING_CUTOFF_VISIBLE eyes.sight_flags = initial(eyes.sight_flags) M.update_sight() M.remove_thrall() From 37f0215268108f74ea5c2f02379b727facb4bddd Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:01:43 -0500 Subject: [PATCH 002/281] fix this --- code/__DEFINES/lighting.dm | 15 ++++++--------- code/_onclick/hud/plane_master.dm | 32 +++++++++++++++---------------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index a377464d4248..b1c2408dd2c4 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -90,10 +90,13 @@ #define FLASH_LIGHT_POWER 3 #define FLASH_LIGHT_RANGE 3.8 +// Emissive blocking. /// Uses vis_overlays to leverage caching so that very few new items need to be made for the overlay. For anything that doesn't change outline or opaque area much or at all. -#define EMISSIVE_BLOCK_GENERIC 1 +#define EMISSIVE_BLOCK_GENERIC 0 /// Uses a dedicated render_target object to copy the entire appearance in real time to the blocking layer. For things that can change in appearance a lot from the base state, like humans. -#define EMISSIVE_BLOCK_UNIQUE 2 +#define EMISSIVE_BLOCK_UNIQUE 1 +/// Don't block any emissives. Useful for things like, pieces of paper? +#define EMISSIVE_BLOCK_NONE 2 /// Returns the red part of a #RRGGBB hex sequence as number #define GETREDPART(hexa) hex2num(copytext(hexa, 2, 4)) @@ -119,13 +122,7 @@ do { \ }; \ } while (FALSE) -// Emissive blocking. -/// Uses vis_overlays to leverage caching so that very few new items need to be made for the overlay. For anything that doesn't change outline or opaque area much or at all. -#define EMISSIVE_BLOCK_GENERIC 0 -/// Uses a dedicated render_target object to copy the entire appearance in real time to the blocking layer. For things that can change in appearance a lot from the base state, like humans. -#define EMISSIVE_BLOCK_UNIQUE 1 -/// Don't block any emissives. Useful for things like, pieces of paper? -#define EMISSIVE_BLOCK_NONE 2 + #define _EMISSIVE_COLOR(val) list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, val,val,val,0) diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index fdd372ddbe0f..50bc5e6d5cbe 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -87,7 +87,7 @@ /atom/movable/screen/plane_master/transparent_floor name = "Transparent Floor" - // documentation = "Really just openspace, stuff that is a turf but has no color or alpha whatsoever.\ + // documentation = "Really just openspace, stuff that is a turf but has no color or alpha whatsoever. //
We use this to draw to just the light mask plane, cause if it's not there we get holes of blackness over openspace" plane = TRANSPARENT_FLOOR_PLANE render_relay_planes = list(LIGHT_MASK_PLANE) @@ -130,7 +130,7 @@ /atom/movable/screen/plane_master/wall_upper name = "Upper wall" - // documentation = "There are some walls that want to render above most things (mostly minerals since they shift over.\ + // documentation = "There are some walls that want to render above most things (mostly minerals since they shift over. //
We draw them to their own plane so we can hijack them for our emissive mask stuff" plane = WALL_PLANE_UPPER render_relay_planes = list(RENDER_PLANE_GAME_WORLD, LIGHT_MASK_PLANE) @@ -326,9 +326,9 @@ /atom/movable/screen/plane_master/parallax name = "Parallax" - // documentation = "Contains parallax, or to be more exact the screen objects that hold parallax.\ - //
Note the BLEND_MULTIPLY. The trick here is how low our plane value is. Because of that, we draw below almost everything in the game.\ - //
We abuse this to ensure we multiply against the Parallax whitifier plane, or space's plane. It's set to full white, so when you do the multiply you just get parallax out where it well, makes sense to be.\ + // documentation = "Contains parallax, or to be more exact the screen objects that hold parallax. + //
Note the BLEND_MULTIPLY. The trick here is how low our plane value is. Because of that, we draw below almost everything in the game. + //
We abuse this to ensure we multiply against the Parallax whitifier plane, or space's plane. It's set to full white, so when you do the multiply you just get parallax out where it well, makes sense to be. //
Also notice that the parent parallax plane is mirrored down to all children. We want to support viewing parallax across all z levels at once." plane = PLANE_SPACE_PARALLAX appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR @@ -419,12 +419,12 @@ ///Contains all lighting objects /atom/movable/screen/plane_master/rendering_plate/lighting name = "Lighting plate" - // documentation = "Anything on this plane will be multiplied with the plane it's rendered onto (typically the game plane).\ - //
That's how lighting functions at base. Because it uses BLEND_MULTIPLY and occasionally color matrixes, it needs a backdrop of blackness.\ - //
See This byond post\ - //
Lemme see uh, we're masked by the emissive plane so it can actually function (IE: make things glow in the dark).\ - //
We're also masked by the overlay lighting plane, which contains all the movable lights in the game. It draws to us and also the game plane.\ - //
Masks us out so it has the breathing room to apply its effect.\ + // documentation = "Anything on this plane will be multiplied with the plane it's rendered onto (typically the game plane). + //
That's how lighting functions at base. Because it uses BLEND_MULTIPLY and occasionally color matrixes, it needs a backdrop of blackness. + //
See This byond post + //
Lemme see uh, we're masked by the emissive plane so it can actually function (IE: make things glow in the dark). + //
We're also masked by the overlay lighting plane, which contains all the movable lights in the game. It draws to us and also the game plane. + //
Masks us out so it has the breathing room to apply its effect. //
Oh and we quite often have our alpha changed to achive night vision effects, or things of that sort." plane = RENDER_PLANE_LIGHTING blend_mode_override = BLEND_MULTIPLY @@ -542,11 +542,11 @@ /atom/movable/screen/plane_master/rendering_plate/light_mask name = "Light Mask" - // documentation = "Any part of this plane that is transparent will be black below it on the game rendering plate.\ - //
This is done to ensure emissives and overlay lights don't light things up \"through\" the darkness that normally sits at the bottom of the lighting plane.\ - //
We relay copies of the space, floor and wall planes to it, so we can use them as masks. Then we just boost any existing alpha to 100% and we're done.\ - //
If we ever switch to a sight setup that shows say, mobs but not floors, we instead mask just overlay lighting and emissives.\ -
This avoids dumb seethrough without breaking stuff like thermals." + // documentation = "Any part of this plane that is transparent will be black below it on the game rendering plate. + //
This is done to ensure emissives and overlay lights don't light things up \"through\" the darkness that normally sits at the bottom of the lighting plane. + //
We relay copies of the space, floor and wall planes to it, so we can use them as masks. Then we just boost any existing alpha to 100% and we're done. + //
If we ever switch to a sight setup that shows say, mobs but not floors, we instead mask just overlay lighting and emissives. + //
This avoids dumb seethrough without breaking stuff like thermals." plane = LIGHT_MASK_PLANE appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR // Fullwhite where there's any color, no alpha otherwise From 1748bc149852a43fcc8c8cbc88bebf0d007f21b9 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:12:21 -0500 Subject: [PATCH 003/281] this too ggg --- code/__DEFINES/layers.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index c8598014fce9..7adfdd278ab6 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -107,7 +107,6 @@ #define EMISSIVE_PLANE 13 #define EMISSIVE_LAYER 13 -#define EMISSIVE_RENDER_TARGET "*EMISSIVE_PLANE" /// This plane masks out lighting to create an "emissive" effect, ie for glowing lights in otherwise dark areas. #define EMISSIVE_RENDER_PLATE 14 From 56d58505ca621c2ac8015ddd5c7150db5d28c914 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:59:11 -0500 Subject: [PATCH 004/281] remove this stupid --- code/modules/surgery/organs/eyes.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 3a1fef1a4bcf..a043d0794bef 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -136,9 +136,9 @@ /obj/item/organ/eyes/night_vision/Initialize(mapload) . = ..() - if (PERFORM_ALL_TESTS(focus_only/nightvision_color_cutoffs) && type != /obj/item/organ/eyes/night_vision) - if(length(low_light_cutoff) != 3 || length(medium_light_cutoff) != 3 || length(high_light_cutoff) != 3) - stack_trace("[type] did not have fully filled out color cutoff lists") + + if(length(low_light_cutoff) != 3 || length(medium_light_cutoff) != 3 || length(high_light_cutoff) != 3) + stack_trace("[type] did not have fully filled out color cutoff lists") if(low_light_cutoff) color_cutoffs = low_light_cutoff.Copy() light_level = NIGHTVISION_LIGHT_LOW From 8ad08b2b9998c29eb85da8f796677e202541b00d Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Tue, 28 Nov 2023 23:00:42 -0500 Subject: [PATCH 005/281] haha fuck --- code/__DEFINES/sight.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm index 7952d9addd21..97fc5aed3fb5 100644 --- a/code/__DEFINES/sight.dm +++ b/code/__DEFINES/sight.dm @@ -33,3 +33,7 @@ /// Bitfield of sight flags that show THINGS but no lighting /// Since lighting is an underlay on turfs, this is everything but that #define SEE_AVOID_TURF_BLACKNESS (SEE_MOBS|SEE_OBJS) + +#define VISOR_TINT (1<<1) +#define VISOR_VISIONFLAGS (1<<2) //all following flags only matter for glasses +#define VISOR_DARKNESSVIEW (1<<3) From 46b86dc327ad46a4a68d2638e8c9689895ce09fd Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 01:00:29 -0500 Subject: [PATCH 006/281] oh my fuck what am I doing --- code/__DEFINES/dcs/signals/mapping.dm | 2 + code/__DEFINES/dcs/signals/signals_global.dm | 2 + code/__DEFINES/dcs/signals/signals_huds.dm | 8 + .../dcs/signals/signals_mob/signals_living.dm | 4 + code/__DEFINES/layers.dm | 55 +- code/__DEFINES/misc.dm | 30 + code/__DEFINES/traits.dm | 5 + code/__HELPERS/_planes.dm | 75 +- code/__HELPERS/filters.dm | 305 +++++++- code/_onclick/hud/hud.dm | 38 +- code/_onclick/hud/plane_master.dm | 737 ++++-------------- code/_onclick/hud/plane_master_controller.dm | 103 +++ code/_onclick/hud/plane_master_group.dm | 199 +++++ code/_onclick/hud/plane_master_subtypes.dm | 447 +++++++++++ code/_onclick/hud/render_plate.dm | 386 +++++++++ code/controllers/subsystem/events.dm | 1 + code/controllers/subsystem/mapping.dm | 3 + code/datums/brain_damage/creepy_trauma.dm | 2 +- code/datums/brain_damage/mild.dm | 2 +- code/datums/components/hide_highest_offset.dm | 24 + code/datums/datum.dm | 36 + .../diseases/advance/symptoms/sensory.dm | 6 +- .../diseases/advance/symptoms/vision.dm | 4 +- code/datums/diseases/sleepy.dm | 4 +- code/datums/martial/flying_fang.dm | 2 +- .../status_effects/debuffs/drowsiness.dm | 2 +- code/datums/status_effects/debuffs/drunk.dm | 2 +- .../status_effects/debuffs/screen_blur.dm | 52 ++ code/game/atoms.dm | 19 +- code/game/machinery/slotmachine.dm | 2 +- code/game/objects/items.dm | 6 +- code/game/objects/items/crayons.dm | 2 +- .../structures/bloodsucker_life.dm | 2 +- .../antagonists/changeling/powers/headcrab.dm | 2 +- .../changeling/powers/tiny_prick.dm | 2 +- .../clock_items/wraith_spectacles.dm | 4 +- code/modules/antagonists/cult/runes.dm | 6 + .../antagonists/demon/general_powers.dm | 2 +- .../eldritch_cult/knowledge/mind_lore.dm | 4 +- .../antagonists/traitor/syndicate_contract.dm | 8 +- code/modules/client/multiz_parallax.dm | 16 + .../client/preferences/ambient_occlusion.dm | 8 +- code/modules/clothing/glasses/_glasses.dm | 2 +- code/modules/events/flutes.dm | 14 +- .../food_and_drinks/food/snacks_pie.dm | 4 +- code/modules/hydroponics/grown/nettle.dm | 2 +- code/modules/mining/ores_coins.dm | 2 +- code/modules/mob/living/blood.dm | 2 +- code/modules/mob/living/brain/status_procs.dm | 25 - .../mob/living/carbon/carbon_defense.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 2 +- .../mob/living/carbon/human/species.dm | 2 +- code/modules/mob/living/damage_procs.dm | 2 +- code/modules/mob/living/life.dm | 4 +- code/modules/mob/living/living.dm | 16 +- code/modules/mob/living/living_defines.dm | 2 + .../mob/living/simple_animal/status_procs.dm | 25 - code/modules/mob/status_procs.dm | 29 - code/modules/paperwork/paperplane.dm | 4 +- .../projectile/special/hallucination.dm | 2 +- .../chemistry/reagents/alcohol_reagents.dm | 2 +- .../chemistry/reagents/drink_reagents.dm | 4 +- .../chemistry/reagents/food_reagents.dm | 16 +- .../chemistry/reagents/medicine_reagents.dm | 8 +- .../chemistry/reagents/toxin_reagents.dm | 4 +- code/modules/spells/spell_types/hivemind.dm | 2 +- .../spells/spell_types/pointed/blind.dm | 2 +- code/modules/surgery/eye_surgery.dm | 2 +- code/modules/surgery/organs/augments_chest.dm | 4 +- code/modules/surgery/organs/eyes.dm | 4 +- code/modules/surgery/organs/stomach.dm | 2 +- yogstation.dme | 9 +- .../code/datums/martial/explosive_fist.dm | 2 +- .../simple_animal/hostile/floor_cluwne.dm | 4 +- 74 files changed, 2018 insertions(+), 807 deletions(-) create mode 100644 code/__DEFINES/dcs/signals/mapping.dm create mode 100644 code/_onclick/hud/plane_master_controller.dm create mode 100644 code/_onclick/hud/plane_master_group.dm create mode 100644 code/_onclick/hud/plane_master_subtypes.dm create mode 100644 code/_onclick/hud/render_plate.dm create mode 100644 code/datums/components/hide_highest_offset.dm create mode 100644 code/datums/status_effects/debuffs/screen_blur.dm create mode 100644 code/modules/client/multiz_parallax.dm delete mode 100644 code/modules/mob/living/simple_animal/status_procs.dm diff --git a/code/__DEFINES/dcs/signals/mapping.dm b/code/__DEFINES/dcs/signals/mapping.dm new file mode 100644 index 000000000000..d80d60365802 --- /dev/null +++ b/code/__DEFINES/dcs/signals/mapping.dm @@ -0,0 +1,2 @@ +// Sent when the max plane offset changes : (old_max_offset, new_max_offset) +#define COMSIG_PLANE_OFFSET_INCREASE "plane_offset_increase" diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 79e35ec3feed..d70d3e49b02c 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -74,3 +74,5 @@ #define COMSIG_GLOB_LIGHT_MECHANISM_COMPLETED "!light_mechanism_completed" /// Global Signal sent when the crew wins the revolution (No arguments). #define COMSIG_GLOB_REVOLUTION_VICTORY "!revolution_victory" +/// Global signal sent when narsie summon count is updated: (new count) +#define COMSIG_NARSIE_SUMMON_UPDATE "!narsie_summon_update" diff --git a/code/__DEFINES/dcs/signals/signals_huds.dm b/code/__DEFINES/dcs/signals/signals_huds.dm index 50e3069a6149..2d5d3eaa59cc 100644 --- a/code/__DEFINES/dcs/signals/signals_huds.dm +++ b/code/__DEFINES/dcs/signals/signals_huds.dm @@ -1,2 +1,10 @@ +/// Sent from /datum/hud/proc/on_eye_change(): (atom/old_eye, atom/new_eye) +#define COMSIG_HUD_EYE_CHANGED "hud_eye_changed" /// Sent from /datum/hud/proc/eye_z_changed() : (old_offset, new_offset) #define COMSIG_HUD_OFFSET_CHANGED "hud_offset_changed" +/// Sent from /atom/movable/screen/lobby/button/collapse/proc/collapse_buttons() : () +#define COMSIG_HUD_LOBBY_COLLAPSED "hud_lobby_collapsed" +/// Sent from /atom/movable/screen/lobby/button/collapse/proc/expand_buttons() : () +#define COMSIG_HUD_LOBBY_EXPANDED "hud_lobby_expanded" +/// Sent from /atom/movable/screen/lobby/button/ready/Click() : () +#define COMSIG_HUD_PLAYER_READY_TOGGLE "hud_player_ready_toggle" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm index b8dd7713d195..468c7e4ad071 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm @@ -138,3 +138,7 @@ ///from mind/transfer_to. Sent after the mind has been transferred: (mob/previous_body) #define COMSIG_MIND_TRANSFERRED "mind_transferred" +///From living/Life(). (deltatime, times_fired) +#define COMSIG_LIVING_LIFE "living_life" + /// Block the Life() proc from proceeding... this should really only be done in some really wacky situations. + #define COMPONENT_LIVING_CANCEL_LIFE_PROCESSING (1<<0) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 7adfdd278ab6..0c78ecdc9740 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -6,6 +6,9 @@ #define CLICKCATCHER_PLANE -99 +#define FIELD_OF_VISION_BLOCKER_PLANE -96 +#define FIELD_OF_VISION_BLOCKER_RENDER_TARGET "*FIELD_OF_VISION_BLOCKER_RENDER_TARGET" + #define PLANE_SPACE -95 #define PLANE_SPACE_RENDER_TARGET "PLANE_SPACE" #define PLANE_SPACE_PARALLAX -90 @@ -18,13 +21,21 @@ #define SINGULARITY_RENDER_TARGET "*SINGULARITY_EFFECTS_PLANE" #define RENDER_PLANE_TRANSPARENT -12 //Transparent plane that shows openspace underneath the floor -#define TRANSPARENT_FLOOR_PLANE -5 -#define FLOOR_PLANE -4 +#define TRANSPARENT_FLOOR_PLANE -11 +#define FLOOR_PLANE -10 #define FLOOR_PLANE_RENDER_TARGET "FLOOR_PLANE" -#define WALL_PLANE -3 -#define GAME_PLANE -2 +#define WALL_PLANE -9 +#define GAME_PLANE_FOV_HIDDEN -8 +#define GAME_PLANE_UPPER -7 +#define GAME_PLANE -6 #define GAME_PLANE_RENDER_TARGET "GAME_PLANE" -#define WALL_PLANE_UPPER -1 +#define WALL_PLANE_UPPER -5 +#define GAME_PLANE_UPPER_FOV_HIDDEN -4 +///Slightly above the game plane but does not catch mouse clicks. Useful for certain visuals that should be clicked through, like seethrough trees +#define SEETHROUGH_PLANE -3 +#define ABOVE_GAME_PLANE -2 + +#define RENDER_PLANE_GAME_WORLD -1 #define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals #define BLACKNESS_PLANE_RENDER_TARGET "BLACKNESS_PLANE" @@ -153,9 +164,23 @@ #define CAMERA_STATIC_LAYER 19 #define CAMERA_STATIC_RENDER_TARGET "CAMERA_STATIC_PLANE" +///---------------- MISC ----------------------- + +///Pipecrawling images +#define PIPECRAWL_IMAGES_PLANE 20 + +///AI Camera Static +#define CAMERA_STATIC_PLANE 21 + +///Anything that wants to be part of the game plane, but also wants to draw above literally everything else +#define HIGH_GAME_PLANE 22 + +#define FULLSCREEN_PLANE 23 + + #define RUNECHAT_PLANE 20 -#define BALLOON_CHAT_PLANE 20.9 +#define BALLOON_CHAT_PLANE 21 //HUD layer defines @@ -210,8 +235,26 @@ #define GHOST_PLANE 4 #define POINT_PLANE 5 +/// Plane related to the menu when pressing Escape. +/// Needed so that we can apply a blur effect to EVERYTHING, and guarantee we are above all UI. +#define ESCAPE_MENU_PLANE 105 + #define RENDER_PLANE_MASTER 110 +/// A value of /datum/preference/numeric/multiz_performance that disables the option +#define MULTIZ_PERFORMANCE_DISABLE -1 +/// We expect at most 3 layers of multiz +/// Increment this define if you make a huge map. We unit test for it too just to make it easy for you +/// If you modify this, you'll need to modify the tsx file too +#define MAX_EXPECTED_Z_DEPTH 3 + + +///Plane master controller keys +#define PLANE_MASTERS_GAME "plane_masters_game" +#define PLANE_MASTERS_NON_MASTER "plane_masters_non_master" +#define PLANE_MASTERS_COLORBLIND "plane_masters_colorblind" + + // Lummox I swear to god I will find you // NOTE! You can only ever have planes greater then -10000, if you add too many with large offsets you will brick multiz // Same can be said for large multiz maps. Tread carefully mappers diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 1f1efa711b5f..0ae3833d57f3 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -481,3 +481,33 @@ GLOBAL_LIST_INIT(donor_pdas, list(PDA_COLOR_NORMAL, PDA_COLOR_TRANSPARENT, PDA_C #define ui_vamprank_display "WEST:6,CENTER-2:-5" /// 6 pixels to the right, zero tiles & 5 pixels DOWN. #define ui_sunlight_display "WEST:6,CENTER-0:0" + +//singularity defines +/// Singularity is stage 1 (1x1) +#define STAGE_ONE 1 +/// Singularity is stage 2 (3x3) +#define STAGE_TWO 3 +/// Singularity is stage 3 (5x5) +#define STAGE_THREE 5 +/// Singularity is stage 4 (7x7) +#define STAGE_FOUR 7 +/// Singularity is stage 5 (9x9) +#define STAGE_FIVE 9 +/// Singularity is stage 6 (11x11) +#define STAGE_SIX 11 //From supermatter shard + +/** + * The point where gravity is negative enough to pull you upwards. + * That means walking checks for a ceiling instead of a floor, and you can fall "upwards" + * + * This should only be possible on multi-z maps because it works like shit on maps that aren't. + */ +#define NEGATIVE_GRAVITY -1 + +#define STANDARD_GRAVITY 1 //Anything above this is high gravity, anything below no grav until negative gravity +/// The gravity strength threshold for high gravity damage. +#define GRAVITY_DAMAGE_THRESHOLD 3 +/// The scaling factor for high gravity damage. +#define GRAVITY_DAMAGE_SCALING 0.5 +/// The maximum [BRUTE] damage a mob can take from high gravity per second. +#define GRAVITY_DAMAGE_MAXIMUM 1.5 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index e812b802fcbd..422b3acda456 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -498,3 +498,8 @@ #define TRAIT_MESON_VISION "meson_vision" /// Ignores darkness for hearing #define TRAIT_HEAR_THROUGH_DARKNESS "hear_through_darkness" +/// "Magic" trait that blocks the mob from moving or interacting with anything. Used for transient stuff like mob transformations or incorporality in special cases. +/// Will block movement, `Life()` (!!!), and other stuff based on the mob. +#define TRAIT_NO_TRANSFORM "block_transformations" +/// Does nothing on its own, applied via status effect. +#define TRAIT_STASIS "in_stasis" diff --git a/code/__HELPERS/_planes.dm b/code/__HELPERS/_planes.dm index c9d8c8de21cb..769c4283ea62 100644 --- a/code/__HELPERS/_planes.dm +++ b/code/__HELPERS/_planes.dm @@ -1,19 +1,19 @@ -/// Takes a plane to offset, and the multiplier to use, and well, does the offsetting -/// Respects a blacklist we use to remove redundant plane masters, such as hud objects -#define GET_NEW_PLANE(new_value, multiplier) (SSmapping.plane_offset_blacklist?["[new_value]"] ? new_value : (new_value) - (PLANE_RANGE * (multiplier))) -/// Takes a render target and an offset, returns a canonical render target string for it -#define OFFSET_RENDER_TARGET(render_target, offset) (_OFFSET_RENDER_TARGET(render_target, SSmapping.render_offset_blacklist?["[render_target]"] ? 0 : offset)) -/// Helper macro for the above -/// Honestly just exists to make the pattern of render target strings more readable -#define _OFFSET_RENDER_TARGET(render_target, offset) ("[(render_target)] #[(offset)]") -/// Takes a plane, returns TRUE if it is of critical priority, FALSE otherwise -#define PLANE_IS_CRITICAL(plane) ((SSmapping.plane_to_offset) ? !!SSmapping.critical_planes["[plane]"] : FALSE) -/// Implicit plane set. We take the turf from the object we're changing the plane of, and use ITS z as a spokesperson for our plane value -#define SET_PLANE_IMPLICIT(thing, new_value) SET_PLANE_EXPLICIT(thing, new_value, thing) -/// Takes a plane, returns the canonical, unoffset plane it represents -#define PLANE_TO_TRUE(plane) ((SSmapping.plane_offset_to_true) ? SSmapping.plane_offset_to_true["[plane]"] : plane) -/// Takes a plane, returns the offset it uses -#define PLANE_TO_OFFSET(plane) ((SSmapping.plane_to_offset) ? SSmapping.plane_to_offset["[plane]"] : plane) +// This file contains helper macros for plane operations +// See the planes section of Visuals.md for more detail, but essentially +// When we render multiz, we do it by placing all atoms on lower levels on well, lower planes +// This is done with stacks of plane masters (things we use to apply effects to planes) +// These macros exist to facilitate working with this system, and other associated small bits + +/// Takes an atom to change the plane of, a new plane value, and something that can be used as a reference to a z level as input +/// Modifies the new value to match the plane we actually want. Note, if you pass in an already offset plane the offsets will add up +/// Use PLANE_TO_TRUE() to avoid this +#define SET_PLANE(thing, new_value, z_reference) (thing.plane = MUTATE_PLANE(new_value, z_reference)) + +/// Takes a plane and a z reference, and offsets the plane by the mutation +/// The SSmapping.max_plane_offset bit here is technically redundant, but saves a bit of work in the base case +/// And the base case is important to me. Non multiz shouldn't get hit too bad by this code +#define MUTATE_PLANE(new_value, z_reference) ((SSmapping.max_plane_offset) ? GET_NEW_PLANE(new_value, GET_TURF_PLANE_OFFSET(z_reference)) : (new_value)) + /// Takes a z reference that we are unsure of, sanity checks it /// Returns either its offset, or 0 if it's not a valid ref /// Will return the reference's PLANE'S offset if we can't get anything out of the z level. We do our best @@ -22,8 +22,22 @@ /// Takes a z value we returns its offset with a list lookup /// Will runtime during parts of init. Be careful :) #define GET_Z_PLANE_OFFSET(z) (SSmapping.z_level_to_plane_offset[z]) -/// Takes a true plane, returns the offset planes that would canonically represent it -#define TRUE_PLANE_TO_OFFSETS(plane) ((SSmapping.true_to_offset_planes) ? SSmapping.true_to_offset_planes["[plane]"] : list(plane)) + +/// Takes a plane to offset, and the multiplier to use, and well, does the offsetting +/// Respects a blacklist we use to remove redundant plane masters, such as hud objects +#define GET_NEW_PLANE(new_value, multiplier) (SSmapping.plane_offset_blacklist?["[new_value]"] ? new_value : (new_value) - (PLANE_RANGE * (multiplier))) + +// Now for the more niche things + +/// Takes an object, new plane, and multipler, and offsets the plane +/// This is for cases where you have a multipler precalculated, and just want to use it +/// Often an optimization, sometimes a necessity +#define SET_PLANE_W_SCALAR(thing, new_value, multiplier) (thing.plane = GET_NEW_PLANE(new_value, multiplier)) + + +/// Implicit plane set. We take the turf from the object we're changing the plane of, and use ITS z as a spokesperson for our plane value +#define SET_PLANE_IMPLICIT(thing, new_value) SET_PLANE_EXPLICIT(thing, new_value, thing) + // This is an unrolled and optimized version of SET_PLANE, for use anywhere where you are unsure of a source's "turfness" // We do also try and guess at what the thing's z level is, even if it's not a z // The plane is cached to allow for fancy stuff to be eval'd once, rather then often @@ -47,3 +61,28 @@ }\ }\ while (FALSE) + +// Now for macros that exist to get info from SSmapping +// Mostly about details of planes, or z levels + +/// Takes a z level, gets the lowest plane offset in its "stack" +#define GET_LOWEST_STACK_OFFSET(z) ((SSmapping.max_plane_offset) ? SSmapping.z_level_to_lowest_plane_offset[z] : 0) +/// Takes a plane, returns the canonical, unoffset plane it represents +#define PLANE_TO_TRUE(plane) ((SSmapping.plane_offset_to_true) ? SSmapping.plane_offset_to_true["[plane]"] : plane) +/// Takes a plane, returns the offset it uses +#define PLANE_TO_OFFSET(plane) ((SSmapping.plane_to_offset) ? SSmapping.plane_to_offset["[plane]"] : plane) +/// Takes a plane, returns TRUE if it is of critical priority, FALSE otherwise +#define PLANE_IS_CRITICAL(plane) ((SSmapping.plane_to_offset) ? !!SSmapping.critical_planes["[plane]"] : FALSE) +/// Takes a true plane, returns the offset planes that would canonically represent it +#define TRUE_PLANE_TO_OFFSETS(plane) ((SSmapping.true_to_offset_planes) ? SSmapping.true_to_offset_planes["[plane]"] : list(plane)) +/// Takes a render target and an offset, returns a canonical render target string for it +#define OFFSET_RENDER_TARGET(render_target, offset) (_OFFSET_RENDER_TARGET(render_target, SSmapping.render_offset_blacklist?["[render_target]"] ? 0 : offset)) +/// Helper macro for the above +/// Honestly just exists to make the pattern of render target strings more readable +#define _OFFSET_RENDER_TARGET(render_target, offset) ("[(render_target)] #[(offset)]") + +// Known issues: +// Potentially too much client load? Hard to tell due to not having a potato pc to hand. +// This is solvable with lowspec preferences, which would not be hard to implement +// Player popups will now render their effects, like overlay lights. this is fixable, but I've not gotten to it +// I think overlay lights can render on the wrong z layer. s fucked diff --git a/code/__HELPERS/filters.dm b/code/__HELPERS/filters.dm index 29825367c33e..cd44409ddb23 100644 --- a/code/__HELPERS/filters.dm +++ b/code/__HELPERS/filters.dm @@ -1,3 +1,146 @@ +#define ICON_NOT_SET "Not Set" + +//This is stored as a nested list instead of datums or whatever because it json encodes nicely for usage in tgui +GLOBAL_LIST_INIT(master_filter_info, list( + "alpha" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "icon" = ICON_NOT_SET, + "render_source" = "", + "flags" = 0 + ), + "flags" = list( + "MASK_INVERSE" = MASK_INVERSE, + "MASK_SWAP" = MASK_SWAP + ) + ), + "angular_blur" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "size" = 1 + ) + ), + // Not implemented, but if this isn't uncommented some windows will just error + // Needs either a proper matrix editor, or just a hook to our existing one + // Issue is filterrific assumes variables will have the same value type if they share the same name, which this violates + // Gotta refactor this sometime + "color" = list( + "defaults" = list( + "color" = matrix(), + "space" = FILTER_COLOR_RGB + ) + ), + "displace" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "size" = null, + "icon" = ICON_NOT_SET, + "render_source" = "" + ) + ), + "drop_shadow" = list( + "defaults" = list( + "x" = 1, + "y" = -1, + "size" = 1, + "offset" = 0, + "color" = COLOR_HALF_TRANSPARENT_BLACK + ) + ), + "blur" = list( + "defaults" = list( + "size" = 1 + ) + ), + "layer" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "icon" = ICON_NOT_SET, + "render_source" = "", + "flags" = FILTER_OVERLAY, + "color" = "", + "transform" = null, + "blend_mode" = BLEND_DEFAULT + ) + ), + "motion_blur" = list( + "defaults" = list( + "x" = 0, + "y" = 0 + ) + ), + "outline" = list( + "defaults" = list( + "size" = 0, + "color" = COLOR_BLACK, + "flags" = NONE + ), + "flags" = list( + "OUTLINE_SHARP" = OUTLINE_SHARP, + "OUTLINE_SQUARE" = OUTLINE_SQUARE + ) + ), + "radial_blur" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "size" = 0.01 + ) + ), + "rays" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "size" = 16, + "color" = COLOR_WHITE, + "offset" = 0, + "density" = 10, + "threshold" = 0.5, + "factor" = 0, + "flags" = FILTER_OVERLAY | FILTER_UNDERLAY + ), + "flags" = list( + "FILTER_OVERLAY" = FILTER_OVERLAY, + "FILTER_UNDERLAY" = FILTER_UNDERLAY + ) + ), + "ripple" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "size" = 1, + "repeat" = 2, + "radius" = 0, + "falloff" = 1, + "flags" = NONE + ), + "flags" = list( + "WAVE_BOUNDED" = WAVE_BOUNDED + ) + ), + "wave" = list( + "defaults" = list( + "x" = 0, + "y" = 0, + "size" = 1, + "offset" = 0, + "flags" = NONE + ), + "flags" = list( + "WAVE_SIDEWAYS" = WAVE_SIDEWAYS, + "WAVE_BOUNDED" = WAVE_BOUNDED + ) + ) +)) + +#undef ICON_NOT_SET + +//Helpers to generate lists for filter helpers +//This is the only practical way of writing these that actually produces sane lists /proc/alpha_mask_filter(x, y, icon/icon, render_source, flags) . = list("type" = "alpha") if(!isnull(x)) @@ -11,6 +154,78 @@ if(!isnull(flags)) .["flags"] = flags +/proc/angular_blur_filter(x, y, size) + . = list("type" = "angular_blur") + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + if(!isnull(size)) + .["size"] = size + +/proc/color_matrix_filter(matrix/in_matrix, space) + . = list("type" = "color") + .["color"] = in_matrix + if(!isnull(space)) + .["space"] = space + +/proc/displacement_map_filter(icon, render_source, x, y, size = 32) + . = list("type" = "displace") + if(!isnull(icon)) + .["icon"] = icon + if(!isnull(render_source)) + .["render_source"] = render_source + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + if(!isnull(size)) + .["size"] = size + +/proc/drop_shadow_filter(x, y, size, offset, color) + . = list("type" = "drop_shadow") + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + if(!isnull(size)) + .["size"] = size + if(!isnull(offset)) + .["offset"] = offset + if(!isnull(color)) + .["color"] = color + +/proc/gauss_blur_filter(size) + . = list("type" = "blur") + if(!isnull(size)) + .["size"] = size + +/proc/layering_filter(icon, render_source, x, y, flags, color, transform, blend_mode) + . = list("type" = "layer") + if(!isnull(icon)) + .["icon"] = icon + if(!isnull(render_source)) + .["render_source"] = render_source + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + if(!isnull(color)) + .["color"] = color + if(!isnull(flags)) + .["flags"] = flags + if(!isnull(transform)) + .["transform"] = transform + if(!isnull(blend_mode)) + .["blend_mode"] = blend_mode + +/proc/motion_blur_filter(x, y) + . = list("type" = "motion_blur") + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + /proc/outline_filter(size, color, flags) . = list("type" = "outline") if(!isnull(size)) @@ -19,9 +234,87 @@ .["color"] = color if(!isnull(flags)) .["flags"] = flags - -/proc/color_matrix_filter(matrix/in_matrix, space) - . = list("type" = "color") - .["color"] = in_matrix - if(!isnull(space)) - .["space"] = space + +/proc/radial_blur_filter(size, x, y) + . = list("type" = "radial_blur") + if(!isnull(size)) + .["size"] = size + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + +/proc/rays_filter(size, color, offset, density, threshold, factor, x, y, flags) + . = list("type" = "rays") + if(!isnull(size)) + .["size"] = size + if(!isnull(color)) + .["color"] = color + if(!isnull(offset)) + .["offset"] = offset + if(!isnull(density)) + .["density"] = density + if(!isnull(threshold)) + .["threshold"] = threshold + if(!isnull(factor)) + .["factor"] = factor + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + if(!isnull(flags)) + .["flags"] = flags + +/proc/ripple_filter(radius, size, falloff, repeat, x, y, flags) + . = list("type" = "ripple") + if(!isnull(radius)) + .["radius"] = radius + if(!isnull(size)) + .["size"] = size + if(!isnull(falloff)) + .["falloff"] = falloff + if(!isnull(repeat)) + .["repeat"] = repeat + if(!isnull(flags)) + .["flags"] = flags + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + +/proc/wave_filter(x, y, size, offset, flags) + . = list("type" = "wave") + if(!isnull(size)) + .["size"] = size + if(!isnull(x)) + .["x"] = x + if(!isnull(y)) + .["y"] = y + if(!isnull(offset)) + .["offset"] = offset + if(!isnull(flags)) + .["flags"] = flags + +/proc/apply_wibbly_filters(atom/in_atom, length) + for(var/i in 1 to 7) + //This is a very baffling and strange way of doing this but I am just preserving old functionality + var/X + var/Y + var/rsq + do + X = 60*rand() - 30 + Y = 60*rand() - 30 + rsq = X*X + Y*Y + while(rsq<100 || rsq>900) // Yeah let's just loop infinitely due to bad luck what's the worst that could happen? + var/random_roll = rand() + in_atom.add_filter("wibbly-[i]", 5, wave_filter(x = X, y = Y, size = rand() * 2.5 + 0.5, offset = random_roll)) + var/filter = in_atom.get_filter("wibbly-[i]") + animate(filter, offset = random_roll, time = 0, loop = -1, flags = ANIMATION_PARALLEL) + animate(offset = random_roll - 1, time = rand() * 20 + 10) + +/proc/remove_wibbly_filters(atom/in_atom) + var/filter + for(var/i in 1 to 7) + filter = in_atom.get_filter("wibbly-[i]") + animate(filter) + in_atom.remove_filter("wibbly-[i]") diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index bc28261dc38e..0cb75cf7d1da 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -93,10 +93,9 @@ GLOBAL_LIST_INIT(available_ui_styles, list( hand_slots = list() - for(var/mytype in subtypesof(/atom/movable/screen/plane_master)) - var/atom/movable/screen/plane_master/instance = new mytype() - plane_masters["[instance.plane]"] = instance - instance.backdrop(mymob) + for(var/mytype in subtypesof(/atom/movable/plane_master_controller)) + var/atom/movable/plane_master_controller/controller_instance = new mytype(null,src) + plane_master_controllers[controller_instance.name] = controller_instance /datum/hud/Destroy() if(mymob.hud_used == src) @@ -249,11 +248,10 @@ GLOBAL_LIST_INIT(available_ui_styles, list( return TRUE /datum/hud/proc/plane_masters_update() - // Plane masters are always shown to OUR mob, never to observers - for(var/thing in plane_masters) - var/atom/movable/screen/plane_master/PM = plane_masters[thing] - PM.backdrop(mymob) - mymob.client.screen += PM + for(var/group_key in master_groups) + var/datum/plane_master_group/group = master_groups[group_key] + // Plane masters are always shown to OUR mob, never to observers + group.refresh_hud() /datum/hud/human/show_hud(version = 0,mob/viewmob) . = ..() @@ -662,10 +660,10 @@ GLOBAL_LIST_INIT(available_ui_styles, list( current_plane_offset = new_offset SEND_SIGNAL(src, COMSIG_HUD_OFFSET_CHANGED, old_offset, new_offset) - if(should_use_scale()) - for(var/group_key as anything in master_groups) - var/datum/plane_master_group/group = master_groups[group_key] - group.transform_lower_turfs(src, new_offset) + // if(should_use_scale()) + // for(var/group_key as anything in master_groups) + // var/datum/plane_master_group/group = master_groups[group_key] + // group.transform_lower_turfs(src, new_offset) /// Returns the plane master that matches the input plane from the passed in group /datum/hud/proc/get_plane_master(plane, group_key = PLANE_GROUP_MAIN) @@ -688,3 +686,17 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /// Returns the corresponding plane group datum if one exists /datum/hud/proc/get_plane_group(key) return master_groups[key] + +/datum/hud/proc/on_eye_change(datum/source, atom/old_eye, atom/new_eye) + SIGNAL_HANDLER + SEND_SIGNAL(src, COMSIG_HUD_EYE_CHANGED, old_eye, new_eye) + + if(old_eye) + UnregisterSignal(old_eye, COMSIG_MOVABLE_Z_CHANGED) + if(new_eye) + // By the time logout runs, the client's eye has already changed + // There's just no log of the old eye, so we need to override + // :sadkirby: + RegisterSignal(new_eye, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(eye_z_changed), override = TRUE) + eye_z_changed(new_eye) + diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index 50bc5e6d5cbe..13f94fa9f5aa 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -1,58 +1,120 @@ +// I hate this place +INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master) + /atom/movable/screen/plane_master screen_loc = "CENTER" icon_state = "blank" - appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + appearance_flags = PLANE_MASTER blend_mode = BLEND_OVERLAY - var/show_alpha = 255 - var/hide_alpha = 0 + plane = LOWEST_EVER_PLANE + /// Will be sent to the debug ui as a description for each plane + /// Also useful as a place to explain to coders how/why your plane works, and what it's meant to do + /// Plaintext and basic html are fine to use here. + /// I'll bonk you if I find you putting "lmao stuff" in here, make this useful. + var/documentation = "" + /// Our real alpha value, so alpha can persist through being hidden/shown + var/true_alpha = 255 + /// Tracks if we're using our true alpha, or being manipulated in some other way + var/alpha_enabled = TRUE + + /// The plane master group we're a member of, our "home" + var/datum/plane_master_group/home + /// If our plane master allows for offsetting /// Mostly used for planes that really don't need to be duplicated, like the hud planes var/allows_offsetting = TRUE + /// Our offset from our "true" plane, see below + var/offset + /// When rendering multiz, lower levels get their own set of plane masters + /// Real plane here represents the "true" plane value of something, ignoring the offset required to handle lower levels + var/real_plane + //--rendering relay vars-- /// list of planes we will relay this plane's render to var/list/render_relay_planes = list(RENDER_PLANE_GAME) + /// blend mode to apply to the render relay in case you dont want to use the plane_masters blend_mode + var/blend_mode_override + /// list of current relays this plane is utilizing to render + var/list/atom/movable/render_plane_relay/relays = list() + /// if render relays have already be generated + var/relays_generated = FALSE + + /// If this plane master should be hidden from the player at roundstart + /// We do this so PMs can opt into being temporary, to reduce load on clients + var/start_hidden = FALSE /// If this plane master is being forced to hide. /// Hidden PMs will dump ANYTHING relayed or drawn onto them. Be careful with this /// Remember: a hidden plane master will dump anything drawn directly to it onto the output render. It does NOT hide its contents /// Use alpha for that var/force_hidden = FALSE - /// If this plane master is outside of our visual bounds right now - var/is_outside_bounds = FALSE - /// Our offset from our "true" plane, see below - var/offset - /// list of current relays this plane is utilizing to render - var/list/atom/movable/render_plane_relay/relays = list() - /// if render relays have already be generated - var/relays_generated = FALSE + + /// If this plane should be scaled by multiz + /// Planes with this set should NEVER be relay'd into each other, as that will cause visual fuck + var/multiz_scaled = TRUE + + /// Bitfield that describes how this plane master will render if its z layer is being "optimized" + /// If a plane master is NOT critical, it will be completely dropped if we start to render outside a client's multiz boundary prefs + /// Of note: most of the time we will relay renders to non critical planes in this stage. so the plane master will end up drawing roughly "in order" with its friends + /// This is NOT done for parallax and other problem children, because the rules of BLEND_MULTIPLY appear to not behave as expected :( + /// This will also just make debugging harder, because we do fragile things in order to ensure things operate as epected. I'm sorry + /// Compile time /// See [code\__DEFINES\layers.dm] for our bitflags var/critical = NONE - /// The plane master group we're a member of, our "home" - var/datum/plane_master_group/home - /// blend mode to apply to the render relay in case you dont want to use the plane_masters blend_mode - var/blend_mode_override - /// Our real alpha value, so alpha can persist through being hidden/shown - var/true_alpha = 255 - /// Tracks if we're using our true alpha, or being manipulated in some other way - var/alpha_enabled = TRUE - -/atom/movable/screen/plane_master/proc/Show(override) - alpha = override || show_alpha + /// If this plane master is outside of our visual bounds right now + var/is_outside_bounds = FALSE -/atom/movable/screen/plane_master/proc/Hide(override) - alpha = override || hide_alpha +/atom/movable/screen/plane_master/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset = 0) + . = ..() + src.offset = offset + true_alpha = alpha + real_plane = plane + + if(!set_home(home)) + return INITIALIZE_HINT_QDEL + update_offset() + if(!documentation && !(istype(src, /atom/movable/screen/plane_master) || istype(src, /atom/movable/screen/plane_master/rendering_plate))) + stack_trace("Plane master created without a description. Document how your thing works so people will know in future, and we can display it in the debug menu") + if(start_hidden) + hide_plane(home.our_hud?.mymob) + generate_render_relays() + +/atom/movable/screen/plane_master/Destroy() + if(home) + // NOTE! We do not clear ourselves from client screens + // We relay on whoever qdel'd us to reset our hud, and properly purge us + home.plane_masters -= "[plane]" + home = null + . = ..() + QDEL_LIST(relays) -//Why do plane masters need a backdrop sometimes? Read https://secure.byond.com/forum/?post=2141928 -//Trust me, you need one. Period. If you don't think you do, you're doing something extremely wrong. -/atom/movable/screen/plane_master/proc/backdrop(mob/mymob) +/// Sets the plane group that owns us, it also determines what screen we render to +/// Returns FALSE if the set_home fails, TRUE otherwise +/atom/movable/screen/plane_master/proc/set_home(datum/plane_master_group/home) + if(!istype(home, /datum/plane_master_group)) + return FALSE + src.home = home + if(home.map) + screen_loc = "[home.map]:[screen_loc]" + assigned_map = home.map + return TRUE -///Things rendered on "openspace"; holes in multi-z -/atom/movable/screen/plane_master/openspace - name = "open space plane master" - plane = FLOOR_OPENSPACE_PLANE - appearance_flags = PLANE_MASTER - blend_mode = BLEND_MULTIPLY - alpha = 255 +/// Updates our "offset", basically what layer of multiz we're meant to render +/// Top is 0, goes up as you go down +/// It's taken into account by render targets and relays, so we gotta make sure they're on the same page +/atom/movable/screen/plane_master/proc/update_offset() + name = "[initial(name)] #[offset]" + SET_PLANE_W_SCALAR(src, real_plane, offset) + for(var/i in 1 to length(render_relay_planes)) + render_relay_planes[i] = GET_NEW_PLANE(render_relay_planes[i], offset) + if(initial(render_target)) + render_target = OFFSET_RENDER_TARGET(initial(render_target), offset) + +/atom/movable/screen/plane_master/proc/set_alpha(new_alpha) + true_alpha = new_alpha + if(!alpha_enabled) + return + alpha = new_alpha /atom/movable/screen/plane_master/proc/disable_alpha() alpha_enabled = FALSE @@ -61,290 +123,6 @@ /atom/movable/screen/plane_master/proc/enable_alpha() alpha_enabled = TRUE alpha = true_alpha -/atom/movable/screen/plane_master/openspace/backdrop(mob/mymob) - filters = list() - filters += filter(type="alpha", render_source = LIGHTING_RENDER_TARGET, flags = MASK_INVERSE) - filters += filter(type = "drop_shadow", color = "#04080FAA", size = -10) - filters += filter(type = "drop_shadow", color = "#04080FAA", size = -15) - filters += filter(type = "drop_shadow", color = "#04080FAA", size = -20) - -/atom/movable/screen/plane_master/proc/outline(_size, _color) - filters += filter(type = "outline", size = _size, color = _color) - -/atom/movable/screen/plane_master/proc/shadow(_size, _border, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA") - filters += filter(type = "drop_shadow", x = _x, y = _y, color = _color, size = _size, offset = _offset) - -/atom/movable/screen/plane_master/proc/clear_filters() - filters = list() - -///Contains just the floor -/atom/movable/screen/plane_master/floor - name = "floor plane master" - plane = FLOOR_PLANE - appearance_flags = PLANE_MASTER - blend_mode = BLEND_OVERLAY - render_relay_planes = list(RENDER_PLANE_GAME, LIGHT_MASK_PLANE) - -/atom/movable/screen/plane_master/transparent_floor - name = "Transparent Floor" - // documentation = "Really just openspace, stuff that is a turf but has no color or alpha whatsoever. - //
We use this to draw to just the light mask plane, cause if it's not there we get holes of blackness over openspace" - plane = TRANSPARENT_FLOOR_PLANE - render_relay_planes = list(LIGHT_MASK_PLANE) - // Needs to be critical or it uh, it'll look white - critical = PLANE_CRITICAL_DISPLAY|PLANE_CRITICAL_NO_RELAY - -/atom/movable/screen/plane_master/floor/backdrop(mob/mymob) - filters = list() - if(istype(mymob) && mymob.eye_blurry) - filters += GAUSSIAN_BLUR(clamp(mymob.eye_blurry*0.1,0.6,3)) - // Should be moved to the world render plate when render plates get ported in - filters += filter(type="displace", render_source = SINGULARITY_RENDER_TARGET, size=75) - -///Contains most things in the game world -/atom/movable/screen/plane_master/game_world - name = "game world plane master" - plane = GAME_PLANE - appearance_flags = PLANE_MASTER //should use client color - blend_mode = BLEND_OVERLAY - -/atom/movable/screen/plane_master/game_world/backdrop(mob/mymob) - filters = list() - if(istype(mymob) && mymob.client?.prefs?.read_preference(/datum/preference/toggle/ambient_occlusion)) - filters += AMBIENT_OCCLUSION - if(istype(mymob) && mymob.eye_blurry) - filters += GAUSSIAN_BLUR(clamp(mymob.eye_blurry*0.1,0.6,3)) - // Should be moved to the world render plate when render plates get ported in - filters += filter(type="displace", render_source = SINGULARITY_RENDER_TARGET, size=75) - - -/atom/movable/screen/plane_master/wall - name = "Wall" - // documentation = "Holds all walls. We render this onto the game world. Separate so we can use this + space and floor planes as a guide for where byond blackness is NOT." - plane = WALL_PLANE - render_relay_planes = list(RENDER_PLANE_GAME_WORLD, LIGHT_MASK_PLANE) - -/atom/movable/screen/plane_master/wall/Initialize(mapload, datum/plane_master_group/home, offset) - . = ..() - add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset), relay_layer = EMISSIVE_WALL_LAYER, relay_color = GLOB.em_block_color) - -/atom/movable/screen/plane_master/wall_upper - name = "Upper wall" - // documentation = "There are some walls that want to render above most things (mostly minerals since they shift over. - //
We draw them to their own plane so we can hijack them for our emissive mask stuff" - plane = WALL_PLANE_UPPER - render_relay_planes = list(RENDER_PLANE_GAME_WORLD, LIGHT_MASK_PLANE) - -///Contains all lighting objects -/atom/movable/screen/plane_master/lighting - name = "lighting plane master" - plane = LIGHTING_PLANE - blend_mode = BLEND_MULTIPLY - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/atom/movable/screen/plane_master/lighting/Initialize(mapload) - . = ..() - filters += filter(type="alpha", render_source = EMISSIVE_RENDER_TARGET, flags = MASK_INVERSE) - filters += filter(type="alpha", render_source = EMISSIVE_UNBLOCKABLE_RENDER_TARGET, flags = MASK_INVERSE) - filters += filter(type="alpha", render_source = O_LIGHTING_VISUAL_RENDER_TARGET, flags = MASK_INVERSE) - // Should be moved to the world render plate when render plates get ported in - filters += filter(type="displace", render_source = SINGULARITY_RENDER_TARGET, size=75) - -/** - * Things placed on this mask the lighting plane. Doesn't render directly. - * - * 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 - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - render_target = EMISSIVE_RENDER_TARGET - -/atom/movable/screen/plane_master/emissive/Initialize(mapload) - . = ..() - filters += filter(type="alpha", render_source=EMISSIVE_BLOCKER_RENDER_TARGET, flags=MASK_INVERSE) - // Should be moved to the world render plate when render plates get ported in - filters += filter(type="displace", render_source = SINGULARITY_RENDER_TARGET, size=75) - -/** - * 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 - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - render_target = EMISSIVE_UNBLOCKABLE_RENDER_TARGET - -/** - * Things placed on this layer mask the emissive layer. Doesn't render directly - * - * You really shouldn't be directly using this, use atom helpers instead - */ -/atom/movable/screen/plane_master/emissive_blocker - name = "emissive blocker plane master" - plane = EMISSIVE_BLOCKER_PLANE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - render_target = EMISSIVE_BLOCKER_RENDER_TARGET - -///Contains space parallax -/atom/movable/screen/plane_master/parallax - name = "parallax plane master" - plane = PLANE_SPACE_PARALLAX - blend_mode = BLEND_MULTIPLY - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/atom/movable/screen/plane_master/parallax/Initialize(mapload) - . = ..() - // Should be moved to the world render plate when render plates get ported in - filters += filter(type="displace", render_source = SINGULARITY_RENDER_TARGET, size=75) - -/atom/movable/screen/plane_master/parallax_white - name = "parallax whitifier plane master" - plane = PLANE_SPACE - appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR - render_relay_planes = list(RENDER_PLANE_GAME, LIGHT_MASK_PLANE) - critical = PLANE_CRITICAL_FUCKO_PARALLAX // goes funny when touched. no idea why I don't trust byond - -/atom/movable/screen/plane_master/lighting/backdrop(mob/mymob) - mymob.overlay_fullscreen("lighting_backdrop_lit", /atom/movable/screen/fullscreen/lighting_backdrop/lit) - mymob.overlay_fullscreen("lighting_backdrop_unlit", /atom/movable/screen/fullscreen/lighting_backdrop/unlit) - -/atom/movable/screen/plane_master/singularity_effect - name = "singularity plane master" - plane = SINGULARITY_EFFECT_PLANE - render_target = SINGULARITY_RENDER_TARGET - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/atom/movable/screen/plane_master/camera_static - name = "camera static plane master" - plane = CAMERA_STATIC_PLANE - appearance_flags = PLANE_MASTER - blend_mode = BLEND_OVERLAY - -/atom/movable/screen/plane_master/runechat - name = "runechat plane master" - plane = RUNECHAT_PLANE - appearance_flags = PLANE_MASTER - blend_mode = BLEND_OVERLAY - -/atom/movable/screen/plane_master/runechat/backdrop(mob/mymob) - filters = list() - if(istype(mymob) && mymob.client?.prefs?.read_preference(/datum/preference/toggle/ambient_occlusion)) - filters += AMBIENT_OCCLUSION - -/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 - -/// Gets the relay atom we're using to connect to the target plane, if one exists -/atom/movable/screen/plane_master/proc/get_relay_to(target_plane) - for(var/atom/movable/render_plane_relay/relay in relays) - if(relay.plane == target_plane) - return relay - -/proc/get_plane_master_render_base(name) - return "*[name]: AUTOGENERATED RENDER TGT" - -/atom/movable/screen/plane_master/proc/generate_relay_to(target_plane, relay_loc, client/show_to, blend_override, relay_layer) - if(!length(relays) && !initial(render_target)) - render_target = OFFSET_RENDER_TARGET(get_plane_master_render_base(name), offset) - if(!relay_loc) - relay_loc = "CENTER" - // If we're using a submap (say for a popup window) make sure we draw onto it - if(home?.map) - relay_loc = "[home.map]:[relay_loc]" - var/blend_to_use = blend_override - if(isnull(blend_to_use)) - blend_to_use = blend_mode_override || initial(blend_mode) - - var/atom/movable/render_plane_relay/relay = new() - relay.render_source = render_target - relay.plane = target_plane - relay.screen_loc = relay_loc - // There are two rules here - // 1: layer needs to be positive (negative layers are treated as float layers) - // 2: lower planes (including offset ones) need to be layered below higher ones (because otherwise they'll render fucky) - // By multiplying LOWEST_EVER_PLANE by 30, we give 30 offsets worth of room to planes before they start going negative - // Bet - // We allow for manuel override if requested. careful with this - relay.layer = relay_layer || (plane + abs(LOWEST_EVER_PLANE * 30)) //layer must be positive but can be a decimal - relay.blend_mode = blend_to_use - relay.mouse_opacity = mouse_opacity - relay.name = render_target - relay.critical_target = PLANE_IS_CRITICAL(target_plane) - relays += relay - // Relays are sometimes generated early, before huds have a mob to display stuff to - // That's what this is for - if(show_to) - show_to.screen += relay - return relay - -/// Creates a connection between this plane master and the passed in plane -/// Helper for out of system code, shouldn't be used in this file -/// Build system to differenchiate between generated and non generated render relays -/atom/movable/screen/plane_master/proc/add_relay_to(target_plane, blend_override, relay_layer, relay_color) - if(get_relay_to(target_plane)) - return - render_relay_planes += target_plane - var/client/display_lad = home?.our_hud?.mymob?.canon_client - var/atom/movable/render_plane_relay/relay = generate_relay_to(target_plane, show_to = display_lad, blend_override = blend_override, relay_layer = relay_layer) - relay.color = relay_color - -/** - * Render relay object assigned to a plane master to be able to relay it's render onto other planes that are not it's own - */ -/atom/movable/render_plane_relay - screen_loc = "CENTER" - layer = -1 - plane = 0 - appearance_flags = PASS_MOUSE | NO_CLIENT_COLOR | KEEP_TOGETHER - /// If we render into a critical plane master, or not - var/critical_target = FALSE - -/// Hook to allow planes to work around is_outside_bounds -/// Return false to allow a show, true otherwise -/atom/movable/screen/plane_master/proc/check_outside_bounds() - return is_outside_bounds - -/atom/movable/screen/plane_master/fullscreen - name = "Fullscreen" - plane = FULLSCREEN_PLANE - appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR - render_relay_planes = list(RENDER_PLANE_NON_GAME) - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - allows_offsetting = FALSE - -/atom/movable/screen/plane_master/parallax - name = "Parallax" - // documentation = "Contains parallax, or to be more exact the screen objects that hold parallax. - //
Note the BLEND_MULTIPLY. The trick here is how low our plane value is. Because of that, we draw below almost everything in the game. - //
We abuse this to ensure we multiply against the Parallax whitifier plane, or space's plane. It's set to full white, so when you do the multiply you just get parallax out where it well, makes sense to be. - //
Also notice that the parent parallax plane is mirrored down to all children. We want to support viewing parallax across all z levels at once." - plane = PLANE_SPACE_PARALLAX - appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR - blend_mode = BLEND_MULTIPLY - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - - -/// Hides a plane master from the passeed in mob -/// Do your effect cleanup here -/atom/movable/screen/plane_master/proc/hide_from(mob/oldmob) - SHOULD_CALL_PARENT(TRUE) - var/client/their_client = oldmob?.client - if(!their_client) - return - their_client.screen -= src - their_client.screen -= relays /// Shows a plane master to the passed in mob /// Override this to apply unique effects and such @@ -353,7 +131,8 @@ SHOULD_CALL_PARENT(TRUE) if(force_hidden) return FALSE - var/client/our_client = mymob?.client + + var/client/our_client = mymob?.canon_client // Alright, let's get this out of the way // Mobs can move z levels without their client. If this happens, we need to ensure critical display settings are respected // This is done here. Mild to severe pain but it's nessesary @@ -367,7 +146,6 @@ if(!(critical & PLANE_CRITICAL_NO_RELAY)) our_client.screen += relays return TRUE - return TRUE if(!our_client) @@ -376,7 +154,51 @@ our_client.screen += src our_client.screen += relays return TRUE - + +/// Hook to allow planes to work around is_outside_bounds +/// Return false to allow a show, true otherwise +/atom/movable/screen/plane_master/proc/check_outside_bounds() + return is_outside_bounds + +/// Hides a plane master from the passeed in mob +/// Do your effect cleanup here +/atom/movable/screen/plane_master/proc/hide_from(mob/oldmob) + SHOULD_CALL_PARENT(TRUE) + var/client/their_client = oldmob?.client + if(!their_client) + return + their_client.screen -= src + their_client.screen -= relays + + +/// Forces this plane master to hide, until unhide_plane is called +/// This allows us to disable unused PMs without breaking anything else +/atom/movable/screen/plane_master/proc/hide_plane(mob/cast_away) + force_hidden = TRUE + hide_from(cast_away) + +/// Disables any forced hiding, allows the plane master to be used as normal +/atom/movable/screen/plane_master/proc/unhide_plane(mob/enfold) + force_hidden = FALSE + show_to(enfold) + +/// Mirrors our force hidden state to the hidden state of the plane that came before, assuming it's valid +/// This allows us to mirror any hidden sets from before we were created, no matter how low that chance is +/atom/movable/screen/plane_master/proc/mirror_parent_hidden() + var/mob/our_mob = home?.our_hud?.mymob + var/atom/movable/screen/plane_master/true_plane = our_mob?.hud_used?.get_plane_master(plane) + if(true_plane == src || !true_plane) + return + + if(true_plane.force_hidden == force_hidden) + return + + // If one of us already exists and it's not hidden, unhide ourselves + if(true_plane.force_hidden) + hide_plane(our_mob) + else + unhide_plane(our_mob) + /atom/movable/screen/plane_master/proc/outside_bounds(mob/relevant) if(force_hidden || is_outside_bounds) return @@ -396,266 +218,19 @@ return hide_from(relevant) -/// Datum that represents one "group" of plane masters -/// So all the main window planes would be in one, all the spyglass planes in another -/// Etc -/datum/plane_master_group - /// Our key in the group list on /datum/hud - /// Should be unique for any group of plane masters in the world - var/key - /// Our parent hud - var/datum/hud/our_hud - /// List in the form "[plane]" = object, the plane masters we own - var/list/atom/movable/screen/plane_master/plane_masters = list() - /// The visual offset we are currently using - var/active_offset = 0 - /// What, if any, submap we render onto - var/map = "" - -/// Nice wrapper for the "[]"ing -/datum/plane_master_group/proc/get_plane(plane) - return plane_masters["[plane]"] - -///Contains all lighting objects -/atom/movable/screen/plane_master/rendering_plate/lighting - name = "Lighting plate" - // documentation = "Anything on this plane will be multiplied with the plane it's rendered onto (typically the game plane). - //
That's how lighting functions at base. Because it uses BLEND_MULTIPLY and occasionally color matrixes, it needs a backdrop of blackness. - //
See This byond post - //
Lemme see uh, we're masked by the emissive plane so it can actually function (IE: make things glow in the dark). - //
We're also masked by the overlay lighting plane, which contains all the movable lights in the game. It draws to us and also the game plane. - //
Masks us out so it has the breathing room to apply its effect. - //
Oh and we quite often have our alpha changed to achive night vision effects, or things of that sort." - plane = RENDER_PLANE_LIGHTING - blend_mode_override = BLEND_MULTIPLY - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - critical = PLANE_CRITICAL_DISPLAY - /// A list of light cutoffs we're actively using, (mass, r, g, b) to avoid filter churn - var/list/light_cutoffs - -/atom/movable/screen/plane_master/rendering_plate/lighting/proc/set_light_cutoff(light_cutoff, list/color_cutoffs) - var/list/new_cutoffs = list(light_cutoff) - new_cutoffs += color_cutoffs - if(new_cutoffs ~= light_cutoffs) - return - - remove_filter(list("light_cutdown", "light_cutup")) - - var/ratio = light_cutoff/100 - if(!color_cutoffs) - color_cutoffs = list(0, 0, 0) - - var/red = color_cutoffs[1] / 100 - var/green = color_cutoffs[2] / 100 - var/blue = color_cutoffs[3] / 100 - add_filter("light_cutdown", 3, color_matrix_filter(list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, -(ratio + red),-(ratio+green),-(ratio+blue),0))) - add_filter("light_cutup", 4, color_matrix_filter(list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, ratio+red,ratio+green,ratio+blue,0))) - -/*! - * This system works by exploiting BYONDs color matrix filter to use layers to handle emissive blockers. - * - * Emissive overlays are pasted with an atom color that converts them to be entirely some specific color. - * Emissive blockers are pasted with an atom color that converts them to be entirely some different color. - * Emissive overlays and emissive blockers are put onto the same plane. - * The layers for the emissive overlays and emissive blockers cause them to mask eachother similar to normal BYOND objects. - * A color matrix filter is applied to the emissive plane to mask out anything that isn't whatever the emissive color is. - * This is then used to alpha mask the lighting plane. - * - */ -/atom/movable/screen/plane_master/rendering_plate/lighting/Initialize(mapload) - . = ..() - add_filter("emissives", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(EMISSIVE_RENDER_TARGET, offset), flags = MASK_INVERSE)) - add_filter("object_lighting", 2, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(O_LIGHTING_VISUAL_RENDER_TARGET, offset), flags = MASK_INVERSE)) - set_light_cutoff(10) - -/// Breaks a connection between this plane master, and the passed in place -/atom/movable/screen/plane_master/proc/remove_relay_from(target_plane) - render_relay_planes -= target_plane - var/atom/movable/render_plane_relay/existing_relay = get_relay_to(target_plane) - if(!existing_relay) - return - relays -= existing_relay - if(!length(relays) && !initial(render_target)) - render_target = null - var/client/lad = home?.our_hud?.mymob?.canon_client - if(lad) - lad.screen -= existing_relay - -/atom/movable/screen/plane_master/rendering_plate/master/proc/offset_change(new_offset) - if(new_offset == offset) // If we're on our own z layer, relay to nothing, just draw - remove_relay_from(GET_NEW_PLANE(RENDER_PLANE_TRANSPARENT, offset - 1)) - else // Otherwise, regenerate the relay - add_relay_to(GET_NEW_PLANE(RENDER_PLANE_TRANSPARENT, offset - 1)) - -/atom/movable/screen/plane_master/rendering_plate/master/proc/on_offset_change(datum/source, old_offset, new_offset) - SIGNAL_HANDLER - offset_change(new_offset) - -/atom/movable/screen/plane_master/rendering_plate/lighting/proc/on_offset_change(datum/source, old_offset, new_offset) - SIGNAL_HANDLER - offset_change(new_offset) - -/atom/movable/screen/plane_master/rendering_plate/lighting/proc/offset_change(mob_offset) - // Offsets stack down remember. This implies that we're above the mob's view plane, and shouldn't render - if(offset < mob_offset) - disable_alpha() - else - enable_alpha() - -/atom/movable/screen/plane_master/rendering_plate/lighting/show_to(mob/mymob) - . = ..() - if(!.) - return - // This applies a backdrop to our lighting plane - // Why do plane masters need a backdrop sometimes? Read https://secure.byond.com/forum/?post=2141928 - // Basically, we need something to brighten - // unlit is perhaps less needed rn, it exists to provide a fullbright for things that can't see the lighting plane - // but we don't actually use invisibility to hide the lighting plane anymore, so it's pointless - var/atom/movable/screen/backdrop = mymob.overlay_fullscreen("lighting_backdrop_lit_[home.key]#[offset]", /atom/movable/screen/fullscreen/lighting_backdrop/lit) - // Need to make sure they're on our plane, ALL the time. We always need a backdrop - SET_PLANE_EXPLICIT(backdrop, PLANE_TO_TRUE(backdrop.plane), src) - backdrop = mymob.overlay_fullscreen("lighting_backdrop_unlit_[home.key]#[offset]", /atom/movable/screen/fullscreen/lighting_backdrop/unlit) - SET_PLANE_EXPLICIT(backdrop, PLANE_TO_TRUE(backdrop.plane), src) - // Sorry, this is a bit annoying - // Basically, we only want the lighting plane we can actually see to attempt to render - // If we don't our lower plane gets totally overriden by the black void of the upper plane - var/datum/hud/hud = home.our_hud - // show_to can be called twice successfully with no hide_from call. Ensure no runtimes off the registers from this - if(hud) - RegisterSignal(hud, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(on_offset_change), override = TRUE) - offset_change(hud?.current_plane_offset || 0) - set_light_cutoff(mymob.lighting_cutoff, mymob.lighting_color_cutoffs) - -/atom/movable/screen/plane_master/rendering_plate/lighting/hide_from(mob/oldmob) - . = ..() - oldmob.clear_fullscreen("lighting_backdrop_lit_[home.key]#[offset]") - oldmob.clear_fullscreen("lighting_backdrop_unlit_[home.key]#[offset]") - var/datum/hud/hud = home.our_hud - if(hud) - UnregisterSignal(hud, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(on_offset_change)) - -/atom/movable/screen/plane_master/rendering_plate/emissive_slate/Initialize(mapload, datum/plane_master_group/home, offset) - . = ..() - add_filter("em_block_masking", 2, color_matrix_filter(GLOB.em_mask_matrix)) - if(offset != 0) - add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset - 1), relay_layer = EMISSIVE_Z_BELOW_LAYER) - -/atom/movable/screen/plane_master/rendering_plate/light_mask - name = "Light Mask" - // documentation = "Any part of this plane that is transparent will be black below it on the game rendering plate. - //
This is done to ensure emissives and overlay lights don't light things up \"through\" the darkness that normally sits at the bottom of the lighting plane. - //
We relay copies of the space, floor and wall planes to it, so we can use them as masks. Then we just boost any existing alpha to 100% and we're done. - //
If we ever switch to a sight setup that shows say, mobs but not floors, we instead mask just overlay lighting and emissives. - //
This avoids dumb seethrough without breaking stuff like thermals." - plane = LIGHT_MASK_PLANE - appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR - // Fullwhite where there's any color, no alpha otherwise - color = list(255,255,255,255, 255,255,255,255, 255,255,255,255, 0,0,0,0, 0,0,0,0) - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - render_target = LIGHT_MASK_RENDER_TARGET - // We blend against the game plane, so she's gotta multiply! - blend_mode = BLEND_MULTIPLY - render_relay_planes = list(RENDER_PLANE_GAME) - -/atom/movable/screen/plane_master/rendering_plate/light_mask/show_to(mob/mymob) - . = ..() - if(!.) - return +/atom/movable/screen/plane_master/proc/inside_bounds(mob/relevant) + is_outside_bounds = FALSE + if(critical & PLANE_CRITICAL_DISPLAY) + // We here assume that your render target starts with * + if(critical & PLANE_CRITICAL_CUT_RENDER && render_target) + render_target = "*[render_target]" - RegisterSignal(mymob, COMSIG_MOB_SIGHT_CHANGE, PROC_REF(handle_sight)) - handle_sight(mymob, mymob.sight, NONE) + if(!(critical & PLANE_CRITICAL_NO_RELAY)) + return + var/client/our_client = relevant.client + if(our_client) + for(var/atom/movable/render_plane_relay/relay as anything in relays) + our_client.screen += relay -/atom/movable/screen/plane_master/rendering_plate/light_mask/hide_from(mob/oldmob) - . = ..() - var/atom/movable/screen/plane_master/overlay_lights = home.get_plane(GET_NEW_PLANE(O_LIGHTING_VISUAL_PLANE, offset)) - overlay_lights.remove_filter("lighting_mask") - var/atom/movable/screen/plane_master/emissive = home.get_plane(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset)) - emissive.remove_filter("lighting_mask") - remove_relay_from(GET_NEW_PLANE(RENDER_PLANE_GAME, offset)) - UnregisterSignal(oldmob, COMSIG_MOB_SIGHT_CHANGE) - -/atom/movable/screen/plane_master/rendering_plate/light_mask/proc/handle_sight(datum/source, new_sight, old_sight) - // If we can see something that shows "through" blackness, and we can't see turfs, disable our draw to the game plane - // And instead mask JUST the overlay lighting plane, since that will look fuckin wrong - var/atom/movable/screen/plane_master/overlay_lights = home.get_plane(GET_NEW_PLANE(O_LIGHTING_VISUAL_PLANE, offset)) - var/atom/movable/screen/plane_master/emissive = home.get_plane(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset)) - if(new_sight & SEE_AVOID_TURF_BLACKNESS && !(new_sight & SEE_TURFS)) - remove_relay_from(GET_NEW_PLANE(RENDER_PLANE_GAME, offset)) - overlay_lights.add_filter("lighting_mask", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(LIGHT_MASK_RENDER_TARGET, offset))) - emissive.add_filter("lighting_mask", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(LIGHT_MASK_RENDER_TARGET, offset))) - // If we CAN'T see through the black, then draw er down brother! - else - overlay_lights.remove_filter("lighting_mask") - emissive.remove_filter("lighting_mask") - // We max alpha here, so our darkness is actually.. dark - // Can't do it before cause it fucks with the filter - add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME, offset), relay_color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,1)) -// It would be nice to setup parallaxing for stairs and things when doing this -// So they look nicer. if you can't it's all good, if you think you can sanely look at monster's work -// It's hard, and potentially expensive. be careful -/datum/plane_master_group/proc/transform_lower_turfs(datum/hud/source, new_offset, use_scale = TRUE) - // Check if this feature is disabled for the client, in which case don't use scale. - // var/mob/our_mob = our_hud?.mymob - - // No offset? piss off - if(!SSmapping.max_plane_offset) return - - active_offset = new_offset - - // Each time we go "down" a visual z level, we'll reduce the scale by this amount - // Chosen because mothblocks liked it, didn't cause motion sickness while also giving a sense of height - var/scale_by = 0.965 - if(!use_scale) - // This is a workaround for two things - // First of all, if a mob can see objects but not turfs, they will not be shown the holder objects we use for - // What I'd like to do is revert to images if this case throws, but image vis_contents is broken - // https://www.byond.com/forum/post/2821969 - // If that's ever fixed, please just use that. thanks :) - scale_by = 1 - - var/list/offsets = list() - // var/multiz_boundary = our_mob?.client?.prefs?.read_preference(/datum/preference/numeric/multiz_performance) - - // We accept negatives so going down "zooms" away the drop above as it goes - for(var/offset in -SSmapping.max_plane_offset to SSmapping.max_plane_offset) - // Multiz boundaries disable transforms - // if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (multiz_boundary < abs(offset))) - // offsets += null - // continue - - // No transformations if we're landing ON you - if(offset == 0) - offsets += null - continue - - var/scale = scale_by ** (offset) - var/matrix/multiz_shrink = matrix() - multiz_shrink.Scale(scale) - offsets += multiz_shrink - - // So we can talk in 1 -> max_offset * 2 + 1, rather then -max_offset -> max_offset - var/offset_offset = SSmapping.max_plane_offset + 1 - - for(var/plane_key in plane_masters) - var/atom/movable/screen/plane_master/plane = plane_masters[plane_key] - if(!plane.allows_offsetting) - continue - - var/visual_offset = plane.offset - new_offset - - // Basically uh, if we're showing something down X amount of levels, or up any amount of levels - // if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (visual_offset > multiz_boundary || visual_offset < 0)) - // plane.outside_bounds(our_mob) - // else if(plane.is_outside_bounds) - // plane.inside_bounds(our_mob) - - // if(!plane.multiz_scaled) - // continue - - if(plane.force_hidden || plane.is_outside_bounds || visual_offset < 0) - // We don't animate here because it should be invisble, but we do mark because it'll look nice - plane.transform = offsets[visual_offset + offset_offset] - continue - - animate(plane, transform = offsets[visual_offset + offset_offset], 0.05 SECONDS, easing = LINEAR_EASING) + show_to(relevant) diff --git a/code/_onclick/hud/plane_master_controller.dm b/code/_onclick/hud/plane_master_controller.dm new file mode 100644 index 000000000000..cae4822c6fec --- /dev/null +++ b/code/_onclick/hud/plane_master_controller.dm @@ -0,0 +1,103 @@ +///Atom that manages and controls multiple planes. It's an atom so we can hook into add_filter etc. Multiple controllers can control one plane. +///Of note: plane master controllers are currently not very extensively used, because render plates fill a semi similar niche +///This could well change someday, and I'd like to keep this stuff around, so we use it for a few cases just out of convenience +/atom/movable/plane_master_controller + ///List of planes as defines in this controllers control + var/list/controlled_planes = list() + ///hud that owns this controller + var/datum/hud/owner_hud + +INITIALIZE_IMMEDIATE(/atom/movable/plane_master_controller) + +///Ensures that all the planes are correctly in the controlled_planes list. +/atom/movable/plane_master_controller/Initialize(mapload, datum/hud/hud) + . = ..() + if(!istype(hud)) + return + owner_hud = hud + +/atom/movable/plane_master_controller/proc/get_planes() + var/returned_planes = list() + for(var/true_plane in controlled_planes) + returned_planes += get_true_plane(true_plane) + return returned_planes + +/atom/movable/plane_master_controller/proc/get_true_plane(true_plane) + var/list/returned_planes = owner_hud.get_true_plane_masters(true_plane) + if(!length(returned_planes)) //If we looked for a hud that isn't instanced, just keep going + stack_trace("[plane] isn't a valid plane master layer for [owner_hud.type], are you sure it exists in the first place?") + return + + return returned_planes + +///Full override so we can just use filterrific +/atom/movable/plane_master_controller/add_filter(name, priority, list/params) + . = ..() + for(var/atom/movable/screen/plane_master/pm_iterator as anything in get_planes()) + pm_iterator.add_filter(name, priority, params) + +///Full override so we can just use filterrific +/atom/movable/plane_master_controller/remove_filter(name_or_names) + . = ..() + for(var/atom/movable/screen/plane_master/pm_iterator as anything in get_planes()) + pm_iterator.remove_filter(name_or_names) + +/atom/movable/plane_master_controller/update_filters() + . = ..() + for(var/atom/movable/screen/plane_master/pm_iterator as anything in get_planes()) + pm_iterator.update_filters() + +///Gets all filters for this controllers plane masters +/atom/movable/plane_master_controller/proc/get_filters(name) + . = list() + for(var/atom/movable/screen/plane_master/pm_iterator as anything in get_planes()) + . += pm_iterator.get_filter(name) + +///Transitions all filters owned by this plane master controller +/atom/movable/plane_master_controller/transition_filter(name, time, list/new_params, easing, loop) + . = ..() + for(var/atom/movable/screen/plane_master/pm_iterator as anything in get_planes()) + pm_iterator.transition_filter(name, new_params, time, easing, loop) + +///Full override so we can just use filterrific +/atom/movable/plane_master_controller/add_atom_colour(coloration, colour_priority) + . = ..() + for(var/atom/movable/screen/plane_master/pm_iterator as anything in get_planes()) + pm_iterator.add_atom_colour(coloration, colour_priority) + + +///Removes an instance of colour_type from the atom's atom_colours list +/atom/movable/plane_master_controller/remove_atom_colour(colour_priority, coloration) + . = ..() + for(var/atom/movable/screen/plane_master/pm_iterator as anything in get_planes()) + pm_iterator.remove_atom_colour(colour_priority, coloration) + + +///Resets the atom's color to null, and then sets it to the highest priority colour available +/atom/movable/plane_master_controller/update_atom_colour() + for(var/atom/movable/screen/plane_master/pm_iterator as anything in get_planes()) + pm_iterator.update_atom_colour() + + +/// Exists for convienience when referencing all game render plates +/atom/movable/plane_master_controller/game + name = PLANE_MASTERS_GAME + controlled_planes = list( + RENDER_PLANE_GAME + ) + +/// Exists for convienience when referencing all non-master render plates. +/// This is the whole game and the UI, but not the escape menu. +/atom/movable/plane_master_controller/non_master + name = PLANE_MASTERS_NON_MASTER + controlled_planes = list( + RENDER_PLANE_GAME, + RENDER_PLANE_NON_GAME, + ) + +/// Exists for convienience when referencing all game render plates +/atom/movable/plane_master_controller/colorblind + name = PLANE_MASTERS_COLORBLIND + controlled_planes = list( + RENDER_PLANE_MASTER + ) diff --git a/code/_onclick/hud/plane_master_group.dm b/code/_onclick/hud/plane_master_group.dm new file mode 100644 index 000000000000..e80588a19c36 --- /dev/null +++ b/code/_onclick/hud/plane_master_group.dm @@ -0,0 +1,199 @@ +/// Datum that represents one "group" of plane masters +/// So all the main window planes would be in one, all the spyglass planes in another +/// Etc +/datum/plane_master_group + /// Our key in the group list on /datum/hud + /// Should be unique for any group of plane masters in the world + var/key + /// Our parent hud + var/datum/hud/our_hud + /// List in the form "[plane]" = object, the plane masters we own + var/list/atom/movable/screen/plane_master/plane_masters = list() + /// The visual offset we are currently using + var/active_offset = 0 + /// What, if any, submap we render onto + var/map = "" + +/datum/plane_master_group/New(key, map = "") + . = ..() + src.key = key + src.map = map + build_plane_masters(0, SSmapping.max_plane_offset) + +/datum/plane_master_group/Destroy() + orphan_hud() + QDEL_LIST_ASSOC_VAL(plane_masters) + return ..() + +/// Display a plane master group to some viewer, so show all our planes to it +/datum/plane_master_group/proc/attach_to(datum/hud/viewing_hud) + if(viewing_hud.master_groups[key]) + stack_trace("Hey brother, our key [key] is already in use by a plane master group on the passed in hud, belonging to [viewing_hud.mymob]. Ya fucked up, why are there dupes") + return + + our_hud = viewing_hud + our_hud.master_groups[key] = src + show_hud() + // transform_lower_turfs(our_hud, active_offset) + +/// Hide the plane master from its current hud, fully clear it out +/datum/plane_master_group/proc/orphan_hud() + if(our_hud) + our_hud.master_groups -= key + hide_hud() + our_hud = null + +/// Well, refresh our group, mostly useful for plane specific updates +/datum/plane_master_group/proc/refresh_hud() + hide_hud() + show_hud() + +/// Fully regenerate our group, resetting our planes to their compile time values +/datum/plane_master_group/proc/rebuild_hud() + hide_hud() + QDEL_LIST_ASSOC_VAL(plane_masters) + build_plane_masters(0, SSmapping.max_plane_offset) + show_hud() + // transform_lower_turfs(our_hud, active_offset) + +/datum/plane_master_group/proc/hide_hud() + for(var/thing in plane_masters) + var/atom/movable/screen/plane_master/plane = plane_masters[thing] + plane.hide_from(our_hud.mymob) + +/datum/plane_master_group/proc/show_hud() + for(var/thing in plane_masters) + var/atom/movable/screen/plane_master/plane = plane_masters[thing] + show_plane(plane) + +/// This is mostly a proc so it can be overriden by popups, since they have unique behavior they want to do +/datum/plane_master_group/proc/show_plane(atom/movable/screen/plane_master/plane) + plane.show_to(our_hud.mymob) + +/// Nice wrapper for the "[]"ing +/datum/plane_master_group/proc/get_plane(plane) + return plane_masters["[plane]"] + +/// Returns a list of all the plane master types we want to create +/datum/plane_master_group/proc/get_plane_types() + return subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/rendering_plate + +/// Actually generate our plane masters, in some offset range (where offset is the z layers to render to, because each "layer" in a multiz stack gets its own plane master cube) +/datum/plane_master_group/proc/build_plane_masters(starting_offset, ending_offset) + for(var/atom/movable/screen/plane_master/mytype as anything in get_plane_types()) + for(var/plane_offset in starting_offset to ending_offset) + if(plane_offset != 0 && !initial(mytype.allows_offsetting)) + continue + var/atom/movable/screen/plane_master/instance = new mytype(null, null, src, plane_offset) + plane_masters["[instance.plane]"] = instance + prep_plane_instance(instance) + +/// Similarly, exists so subtypes can do unique behavior to planes on creation +/datum/plane_master_group/proc/prep_plane_instance(atom/movable/screen/plane_master/instance) + return + +// // It would be nice to setup parallaxing for stairs and things when doing this +// // So they look nicer. if you can't it's all good, if you think you can sanely look at monster's work +// // It's hard, and potentially expensive. be careful +// /datum/plane_master_group/proc/transform_lower_turfs(datum/hud/source, new_offset, use_scale = TRUE) +// // Check if this feature is disabled for the client, in which case don't use scale. +// var/mob/our_mob = our_hud?.mymob +// if(!our_mob?.client?.prefs?.read_preference(/datum/preference/toggle/multiz_parallax)) +// use_scale = FALSE + +// // No offset? piss off +// if(!SSmapping.max_plane_offset) +// return + +// active_offset = new_offset + +// // Each time we go "down" a visual z level, we'll reduce the scale by this amount +// // Chosen because mothblocks liked it, didn't cause motion sickness while also giving a sense of height +// var/scale_by = 0.965 +// if(!use_scale) +// // This is a workaround for two things +// // First of all, if a mob can see objects but not turfs, they will not be shown the holder objects we use for +// // What I'd like to do is revert to images if this case throws, but image vis_contents is broken +// // https://www.byond.com/forum/post/2821969 +// // If that's ever fixed, please just use that. thanks :) +// scale_by = 1 + +// var/list/offsets = list() +// var/multiz_boundary = our_mob?.client?.prefs?.read_preference(/datum/preference/numeric/multiz_performance) + +// // We accept negatives so going down "zooms" away the drop above as it goes +// for(var/offset in -SSmapping.max_plane_offset to SSmapping.max_plane_offset) +// // Multiz boundaries disable transforms +// if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (multiz_boundary < abs(offset))) +// offsets += null +// continue + +// // No transformations if we're landing ON you +// if(offset == 0) +// offsets += null +// continue + +// var/scale = scale_by ** (offset) +// var/matrix/multiz_shrink = matrix() +// multiz_shrink.Scale(scale) +// offsets += multiz_shrink + +// // So we can talk in 1 -> max_offset * 2 + 1, rather then -max_offset -> max_offset +// var/offset_offset = SSmapping.max_plane_offset + 1 + +// for(var/plane_key in plane_masters) +// var/atom/movable/screen/plane_master/plane = plane_masters[plane_key] +// if(!plane.allows_offsetting) +// continue + +// var/visual_offset = plane.offset - new_offset + +// // Basically uh, if we're showing something down X amount of levels, or up any amount of levels +// if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (visual_offset > multiz_boundary || visual_offset < 0)) +// plane.outside_bounds(our_mob) +// else if(plane.is_outside_bounds) +// plane.inside_bounds(our_mob) + +// if(!plane.multiz_scaled) +// continue + +// if(plane.force_hidden || plane.is_outside_bounds || visual_offset < 0) +// // We don't animate here because it should be invisble, but we do mark because it'll look nice +// plane.transform = offsets[visual_offset + offset_offset] +// continue + +// animate(plane, transform = offsets[visual_offset + offset_offset], 0.05 SECONDS, easing = LINEAR_EASING) + +/// Holds plane masters for popups, like camera windows +/// Note: We do not scale this plane, even though we could +/// This is because it's annoying to get turfs to position inside it correctly +/// If you wanna try someday feel free, but I can't manage it +/datum/plane_master_group/popup + +// /datum/plane_master_group/popup/transform_lower_turfs(datum/hud/source, new_offset, use_scale = TRUE) +// return ..(source, new_offset, FALSE) + +/// Holds the main plane master +/datum/plane_master_group/main + +// /datum/plane_master_group/main/transform_lower_turfs(datum/hud/source, new_offset, use_scale = TRUE) +// if(use_scale) +// return ..(source, new_offset, source.should_use_scale()) +// return ..() + +/// Hudless group. Exists for testing +/datum/plane_master_group/hudless + var/mob/our_mob + +/datum/plane_master_group/hudless/Destroy() + . = ..() + our_mob = null + +/datum/plane_master_group/hudless/hide_hud() + for(var/thing in plane_masters) + var/atom/movable/screen/plane_master/plane = plane_masters[thing] + plane.hide_from(our_mob) + +/// This is mostly a proc so it can be overriden by popups, since they have unique behavior they want to do +/datum/plane_master_group/hudless/show_plane(atom/movable/screen/plane_master/plane) + plane.show_to(our_mob) diff --git a/code/_onclick/hud/plane_master_subtypes.dm b/code/_onclick/hud/plane_master_subtypes.dm new file mode 100644 index 000000000000..8988b2f7f33c --- /dev/null +++ b/code/_onclick/hud/plane_master_subtypes.dm @@ -0,0 +1,447 @@ +/atom/movable/screen/plane_master/clickcatcher + name = "Click Catcher" + documentation = "Contains the screen object we use as a backdrop to catch clicks on portions of the screen that would otherwise contain nothing else. \ +
Will always be below almost everything else" + plane = CLICKCATCHER_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + multiz_scaled = FALSE + critical = PLANE_CRITICAL_DISPLAY + +/atom/movable/screen/plane_master/clickcatcher/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) + . = ..() + RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(offset_increased)) + offset_increased(SSmapping, 0, SSmapping.max_plane_offset) + +/atom/movable/screen/plane_master/clickcatcher/proc/offset_increased(datum/source, old_off, new_off) + SIGNAL_HANDLER + // We only want need the lowest level + // If my system better supported changing PM plane values mid op I'd do that, but I do NOT so + if(new_off > offset) + hide_plane(home?.our_hud?.mymob) + +/atom/movable/screen/plane_master/parallax_white + name = "Parallax whitifier" + documentation = "Essentially a backdrop for the parallax plane. We're rendered just below it, so we'll be multiplied by its well, parallax.\ +
If you want something to look as if it has parallax on it, draw it to this plane." + plane = PLANE_SPACE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + render_relay_planes = list(RENDER_PLANE_GAME, LIGHT_MASK_PLANE) + critical = PLANE_CRITICAL_FUCKO_PARALLAX // goes funny when touched. no idea why I don't trust byond + +/atom/movable/screen/plane_master/parallax_white/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) + . = ..() + add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset), relay_layer = EMISSIVE_SPACE_LAYER) + +///Contains space parallax +/atom/movable/screen/plane_master/parallax + name = "Parallax" + documentation = "Contains parallax, or to be more exact the screen objects that hold parallax.\ +
Note the BLEND_MULTIPLY. The trick here is how low our plane value is. Because of that, we draw below almost everything in the game.\ +
We abuse this to ensure we multiply against the Parallax whitifier plane, or space's plane. It's set to full white, so when you do the multiply you just get parallax out where it well, makes sense to be.\ +
Also notice that the parent parallax plane is mirrored down to all children. We want to support viewing parallax across all z levels at once." + plane = PLANE_SPACE_PARALLAX + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + blend_mode = BLEND_MULTIPLY + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + multiz_scaled = FALSE + +/atom/movable/screen/plane_master/parallax/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) + . = ..() + if(offset != 0) + // You aren't the source? don't change yourself + return + RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_offset_increase)) + RegisterSignal(SSdcs, COMSIG_NARSIE_SUMMON_UPDATE, PROC_REF(narsie_modified)) + if(GLOB.narsie_summon_count >= 1) + narsie_start_midway(GLOB.narsie_effect_last_modified) // We assume we're on the start, so we can use this number + offset_increase(0, SSmapping.max_plane_offset) + +/atom/movable/screen/plane_master/parallax/proc/on_offset_increase(datum/source, old_offset, new_offset) + SIGNAL_HANDLER + offset_increase(old_offset, new_offset) + +/atom/movable/screen/plane_master/parallax/proc/offset_increase(old_offset, new_offset) + // Parallax will be mirrored down to any new planes that are added, so it will properly render across mirage borders + for(var/offset in old_offset to new_offset) + if(offset != 0) + // Overlay so we don't multiply twice, and thus fuck up our rendering + add_relay_to(GET_NEW_PLANE(plane, offset), BLEND_OVERLAY) + +// Hacky shit to ensure parallax works in perf mode +/atom/movable/screen/plane_master/parallax/outside_bounds(mob/relevant) + if(offset == 0) + remove_relay_from(GET_NEW_PLANE(RENDER_PLANE_GAME, 0)) + is_outside_bounds = TRUE // I'm sorry :( + return + // If we can't render, and we aren't the bottom layer, don't render us + // This way we only multiply against stuff that's not fullwhite space + var/atom/movable/screen/plane_master/parent_parallax = home.our_hud.get_plane_master(PLANE_SPACE_PARALLAX) + var/turf/viewing_turf = get_turf(relevant) + if(!viewing_turf || offset != GET_LOWEST_STACK_OFFSET(viewing_turf.z)) + parent_parallax.remove_relay_from(plane) + else + parent_parallax.add_relay_to(plane, BLEND_OVERLAY) + return ..() + +/atom/movable/screen/plane_master/parallax/inside_bounds(mob/relevant) + if(offset == 0) + add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME, 0)) + is_outside_bounds = FALSE + return + // Always readd, just in case we lost it + var/atom/movable/screen/plane_master/parent_parallax = home.our_hud.get_plane_master(PLANE_SPACE_PARALLAX) + parent_parallax.add_relay_to(plane, BLEND_OVERLAY) + return ..() + +// Needs to handle rejoining on a lower z level, so we NEED to readd old planes +/atom/movable/screen/plane_master/parallax/check_outside_bounds() + // If we're outside bounds AND we're the 0th plane, we need to show cause parallax is hacked to hell + return offset != 0 && is_outside_bounds + +/// Starts the narsie animation midway, so we can catch up to everyone else quickly +/atom/movable/screen/plane_master/parallax/proc/narsie_start_midway(start_time) + var/time_elapsed = world.time - start_time + narsie_summoned_effect(max(16 SECONDS - time_elapsed, 0)) + +/// Starts the narsie animation, make us grey, then red +/atom/movable/screen/plane_master/parallax/proc/narsie_modified(datum/source, new_count) + SIGNAL_HANDLER + if(new_count >= 1) + narsie_summoned_effect(16 SECONDS) + else + narsie_unsummoned() + +/atom/movable/screen/plane_master/parallax/proc/narsie_summoned_effect(animate_time) + if(GLOB.narsie_summon_count >= 2) + var/static/list/nightmare_parallax = list(255,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, -130,0,0,0) + animate(src, color = nightmare_parallax, time = animate_time) + return + + var/static/list/grey_parallax = list(0.4,0.4,0.4,0, 0.4,0.4,0.4,0, 0.4,0.4,0.4,0, 0,0,0,1, -0.1,-0.1,-0.1,0) + // We're gonna animate ourselves grey + // Then, once it's done, about 40 seconds into the event itself, we're gonna start doin some shit. see below + animate(src, color = grey_parallax, time = animate_time) + +/atom/movable/screen/plane_master/parallax/proc/narsie_unsummoned() + animate(src, color = null, time = 8 SECONDS) + +/atom/movable/screen/plane_master/gravpulse + name = "Gravpulse" + documentation = "Ok so this one's fun. Basically, we want to be able to distort the game plane when a grav annom is around.\ +
So we draw the pattern we want to use to this plane, and it's then used as a render target by a distortion filter on the game plane.\ +
Note the blend mode and lack of relay targets. This plane exists only to distort, it's never rendered anywhere." + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + plane = GRAVITY_PULSE_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + blend_mode = BLEND_ADD + render_target = GRAVITY_PULSE_RENDER_TARGET + render_relay_planes = list() + +///Contains just the floor +/atom/movable/screen/plane_master/floor + name = "Floor" + documentation = "The well, floor. This is mostly used as a sorting mechanism, but it also lets us create a \"border\" around the game world plane, so its drop shadow will actually work." + plane = FLOOR_PLANE + render_relay_planes = list(RENDER_PLANE_GAME, LIGHT_MASK_PLANE) + +/atom/movable/screen/plane_master/transparent_floor + name = "Transparent Floor" + documentation = "Really just openspace, stuff that is a turf but has no color or alpha whatsoever.\ +
We use this to draw to just the light mask plane, cause if it's not there we get holes of blackness over openspace" + plane = TRANSPARENT_FLOOR_PLANE + render_relay_planes = list(LIGHT_MASK_PLANE) + // Needs to be critical or it uh, it'll look white + critical = PLANE_CRITICAL_DISPLAY|PLANE_CRITICAL_NO_RELAY + +/atom/movable/screen/plane_master/floor/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) + . = ..() + add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset), relay_layer = EMISSIVE_FLOOR_LAYER, relay_color = GLOB.em_block_color) + +/atom/movable/screen/plane_master/wall + name = "Wall" + documentation = "Holds all walls. We render this onto the game world. Separate so we can use this + space and floor planes as a guide for where byond blackness is NOT." + plane = WALL_PLANE + render_relay_planes = list(RENDER_PLANE_GAME_WORLD, LIGHT_MASK_PLANE) + +/atom/movable/screen/plane_master/wall/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) + . = ..() + add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset), relay_layer = EMISSIVE_WALL_LAYER, relay_color = GLOB.em_block_color) + +/atom/movable/screen/plane_master/game + name = "Lower game world" + documentation = "Exists mostly because of FOV shit. Basically, if you've just got a normal not ABOVE fov thing, and you don't want it masked, stick it here yeah?" + plane = GAME_PLANE + render_relay_planes = list(RENDER_PLANE_GAME_WORLD) + +/atom/movable/screen/plane_master/game_world_fov_hidden + name = "lower game world fov hidden" + documentation = "If you want something to be hidden by fov, stick it on this plane. We're masked by the fov blocker plane, so the items on us can actually well, disappear." + plane = GAME_PLANE_FOV_HIDDEN + render_relay_planes = list(RENDER_PLANE_GAME_WORLD) + +/atom/movable/screen/plane_master/game_world_fov_hidden/Initialize(mapload, datum/hud/hud_owner) + . = ..() + add_filter("vision_cone", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(FIELD_OF_VISION_BLOCKER_RENDER_TARGET, offset), flags = MASK_INVERSE)) + +/atom/movable/screen/plane_master/field_of_vision_blocker + name = "Field of vision blocker" + documentation = "This is one of those planes that's only used as a filter. It masks out things that want to be hidden by fov.\ +
Literally just contains FOV images, or masks." + plane = FIELD_OF_VISION_BLOCKER_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + render_target = FIELD_OF_VISION_BLOCKER_RENDER_TARGET + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + render_relay_planes = list() + // We do NOT allow offsetting, because there's no case where you would want to block only one layer, at least currently + allows_offsetting = FALSE + start_hidden = TRUE + // We mark as multiz_scaled FALSE so transforms don't effect us, and we draw to the planes below us as if they were us. + // This is safe because we will ALWAYS be on the top z layer, so it DON'T MATTER + multiz_scaled = FALSE + +/atom/movable/screen/plane_master/field_of_vision_blocker/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) + . = ..() + mirror_parent_hidden() + +/atom/movable/screen/plane_master/game_world_upper + name = "Upper game world" + documentation = "Ok so fov is kinda fucky, because planes in byond serve both as effect groupings and as rendering orderers. Since that's true, we need a plane that we can stick stuff that draws above fov blocked stuff on." + plane = GAME_PLANE_UPPER + render_relay_planes = list(RENDER_PLANE_GAME_WORLD) + +/atom/movable/screen/plane_master/wall_upper + name = "Upper wall" + documentation = "There are some walls that want to render above most things (mostly minerals since they shift over.\ +
We draw them to their own plane so we can hijack them for our emissive mask stuff" + plane = WALL_PLANE_UPPER + render_relay_planes = list(RENDER_PLANE_GAME_WORLD, LIGHT_MASK_PLANE) + +/atom/movable/screen/plane_master/wall_upper/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) + . = ..() + add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset), relay_layer = EMISSIVE_WALL_LAYER, relay_color = GLOB.em_block_color) + +/atom/movable/screen/plane_master/game_world_upper_fov_hidden + name = "Upper game world fov hidden" + documentation = "Just as we need a place to draw things \"above\" the hidden fov plane, we also need to be able to hide stuff that draws over the upper game plane." + plane = GAME_PLANE_UPPER_FOV_HIDDEN + render_relay_planes = list(RENDER_PLANE_GAME_WORLD) + +/atom/movable/screen/plane_master/game_world_upper_fov_hidden/Initialize(mapload, datum/hud/hud_owner) + . = ..() + // Dupe of the other hidden plane + add_filter("vision_cone", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(FIELD_OF_VISION_BLOCKER_RENDER_TARGET, offset), flags = MASK_INVERSE)) + +/atom/movable/screen/plane_master/seethrough + name = "Seethrough" + documentation = "Holds the seethrough versions (done using image overrides) of large objects. Mouse transparent, so you can click through them." + plane = SEETHROUGH_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + render_relay_planes = list(RENDER_PLANE_GAME_WORLD) + start_hidden = TRUE + +/atom/movable/screen/plane_master/game_world_above + name = "Above game world" + documentation = "We need a place that's unmasked by fov that also draws above the upper game world fov hidden plane. I told you fov was hacky man." + plane = ABOVE_GAME_PLANE + render_relay_planes = list(RENDER_PLANE_GAME_WORLD) + +/** + * Plane master that byond will by default draw to + * Shouldn't be used, exists to prevent people using plane 0 + * NOTE: If we used SEE_BLACKNESS on a map format that wasn't SIDE_MAP, this is where its darkness would land + * This would allow us to control it and do fun things. But we can't because side map doesn't support it, so this is just a stub + */ +/atom/movable/screen/plane_master/default + name = "Default" + documentation = "This is quite fiddly, so bear with me. By default (in byond) everything in the game is rendered onto plane 0. It's the default plane. \ +
But, because we've moved everything we control off plane 0, all that's left is stuff byond internally renders. \ +
What I'd like to do with this is capture byond blackness by giving mobs the SEE_BLACKNESS sight flag. \ +
But we CAN'T because SEE_BLACKNESS does not work with our rendering format. So I just eat it I guess" + plane = DEFAULT_PLANE + multiz_scaled = FALSE + start_hidden = TRUE // Doesn't DO anything, exists to hold this place + +/atom/movable/screen/plane_master/area + name = "Area" + documentation = "Holds the areas themselves, which ends up meaning it holds any overlays/effects we apply to areas. NOT snow or rad storms, those go on above lighting" + plane = AREA_PLANE + +/atom/movable/screen/plane_master/massive_obj + name = "Massive object" + documentation = "Huge objects need to render above everything else on the game plane, otherwise they'd well, get clipped and look not that huge. This does that." + plane = MASSIVE_OBJ_PLANE + +/atom/movable/screen/plane_master/point + name = "Point" + documentation = "I mean like, what do you want me to say? Points draw over pretty much everything else, so they get their own plane. Remember we layer render relays to draw planes in their proper order on render plates." + plane = POINT_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +///Contains all turf lighting +/atom/movable/screen/plane_master/turf_lighting + name = "Turf Lighting" + documentation = "Contains all lighting drawn to turfs. Not so complex, draws directly onto the lighting plate." + plane = LIGHTING_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + render_relay_planes = list(RENDER_PLANE_LIGHTING) + blend_mode_override = BLEND_ADD + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + critical = PLANE_CRITICAL_DISPLAY + +/// This will not work through multiz, because of a byond bug with BLEND_MULTIPLY +/// Bug report is up, waiting on a fix +/atom/movable/screen/plane_master/o_light_visual + name = "Overlight light visual" + documentation = "Holds overlay lighting objects, or the sort of lighting that's a well, overlay stuck to something.\ +
Exists because lighting updating is really slow, and movement needs to feel smooth.\ +
We draw to the game plane, and mask out space for ourselves on the lighting plane so any color we have has the chance to display." + plane = O_LIGHTING_VISUAL_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + render_target = O_LIGHTING_VISUAL_RENDER_TARGET + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + blend_mode = BLEND_MULTIPLY + critical = PLANE_CRITICAL_DISPLAY + +/atom/movable/screen/plane_master/above_lighting + name = "Above lighting" + plane = ABOVE_LIGHTING_PLANE + documentation = "Anything on the game plane that needs a space to draw on that will be above the lighting plane.\ +
Mostly little alerts and effects, also sometimes contains things that are meant to look as if they glow." + +/** + * Handles emissive overlays and emissive blockers. + */ +/atom/movable/screen/plane_master/emissive + name = "Emissive" + documentation = "Holds things that will be used to mask the lighting plane later on. Masked by the Emissive Mask plane to ensure we don't emiss out under a wall.\ +
Relayed onto the Emissive render plane to do the actual masking of lighting, since we need to be transformed and other emissive stuff needs to be transformed too.\ +
Don't want to double scale now." + plane = EMISSIVE_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + render_relay_planes = list(EMISSIVE_RENDER_PLATE) + critical = PLANE_CRITICAL_DISPLAY + +/atom/movable/screen/plane_master/pipecrawl + name = "Pipecrawl" + documentation = "Holds pipecrawl images generated during well, pipecrawling.\ +
Has a few effects and a funky color matrix designed to make things a bit more visually readable." + plane = PIPECRAWL_IMAGES_PLANE + start_hidden = TRUE + +/atom/movable/screen/plane_master/pipecrawl/Initialize(mapload, datum/hud/hud_owner) + . = ..() + // Makes everything on this plane slightly brighter + // Has a nice effect, makes thing stand out + color = list(1.2,0,0,0, 0,1.2,0,0, 0,0,1.2,0, 0,0,0,1, 0,0,0,0) + // This serves a similar purpose, I want the pipes to pop + add_filter("pipe_dropshadow", 1, drop_shadow_filter(x = -1, y= -1, size = 1, color = "#0000007A")) + mirror_parent_hidden() + +/atom/movable/screen/plane_master/camera_static + name = "Camera static" + documentation = "Holds camera static images. Usually only visible to people who can well, see static.\ +
We use images rather then vis contents because they're lighter on maptick, and maptick sucks butt." + plane = CAMERA_STATIC_PLANE + +/atom/movable/screen/plane_master/camera_static/show_to(mob/mymob) + . = ..() + if(!.) + return + var/datum/hud/our_hud = home.our_hud + if(isnull(our_hud)) + return + + // We'll hide the slate if we're not seeing through a camera eye + // This can call on a cycle cause we don't clear in hide_from + // Yes this is the best way of hooking into the hud, I hate myself too + RegisterSignal(our_hud, COMSIG_HUD_EYE_CHANGED, PROC_REF(eye_changed), override = TRUE) + eye_changed(our_hud, null, our_hud.mymob?.canon_client?.eye) + +/atom/movable/screen/plane_master/camera_static/proc/eye_changed(datum/hud/source, atom/old_eye, atom/new_eye) + SIGNAL_HANDLER + + if(!isaicamera(new_eye)) + if(!force_hidden) + hide_plane(source.mymob) + return + + if(force_hidden) + unhide_plane(source.mymob) + +/atom/movable/screen/plane_master/high_game + name = "High Game" + documentation = "Holds anything that wants to be displayed above the rest of the game plane, and doesn't want to be clickable. \ +
This includes atmos debug overlays, blind sound images, and mining scanners. \ +
Really only exists for its layering potential, we don't use this for any vfx" + plane = HIGH_GAME_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/atom/movable/screen/plane_master/ghost + name = "Ghost" + documentation = "Ghosts draw here, so they don't get mixed up in the visuals of the game world. Note, this is not not how we HIDE ghosts from people, that's done with invisible and see_invisible." + plane = GHOST_PLANE + render_relay_planes = list(RENDER_PLANE_NON_GAME) + +/atom/movable/screen/plane_master/fullscreen + name = "Fullscreen" + documentation = "Holds anything that applies to or above the full screen. \ +
Note, it's still rendered underneath hud objects, but this lets us control the order that things like death/damage effects render in." + plane = FULLSCREEN_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + render_relay_planes = list(RENDER_PLANE_NON_GAME) + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + allows_offsetting = FALSE + +/atom/movable/screen/plane_master/runechat + name = "Runechat" + documentation = "Holds runechat images, that text that pops up when someone say something. Uses a dropshadow to well, look nice." + plane = RUNECHAT_PLANE + render_relay_planes = list(RENDER_PLANE_NON_GAME) + +/atom/movable/screen/plane_master/runechat/show_to(mob/mymob) + . = ..() + if(!.) + return + remove_filter("AO") + if(istype(mymob) && mymob.canon_client?.prefs?.read_preference(/datum/preference/toggle/ambient_occlusion)) + add_filter("AO", 1, drop_shadow_filter(x = 0, y = -2, size = 4, color = "#04080FAA")) + +/atom/movable/screen/plane_master/balloon_chat + name = "Balloon chat" + documentation = "Holds ballon chat images, those little text bars that pop up for a second when you do some things. NOT runechat." + plane = BALLOON_CHAT_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + render_relay_planes = list(RENDER_PLANE_NON_GAME) + +/atom/movable/screen/plane_master/hud + name = "HUD" + documentation = "Contains anything that want to be rendered on the hud. Typically is just screen elements." + plane = HUD_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + render_relay_planes = list(RENDER_PLANE_NON_GAME) + allows_offsetting = FALSE + +/atom/movable/screen/plane_master/above_hud + name = "Above HUD" + documentation = "Anything that wants to be drawn ABOVE the rest of the hud. Typically close buttons and other elements that need to be always visible. Think preventing draggable action button memes." + plane = ABOVE_HUD_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + render_relay_planes = list(RENDER_PLANE_NON_GAME) + allows_offsetting = FALSE + +/atom/movable/screen/plane_master/splashscreen + name = "Splashscreen" + documentation = "Cinematics and the splash screen." + plane = SPLASHSCREEN_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + render_relay_planes = list(RENDER_PLANE_NON_GAME) + allows_offsetting = FALSE + +/atom/movable/screen/plane_master/escape_menu + name = "Escape Menu" + documentation = "Anything relating to the escape menu." + plane = ESCAPE_MENU_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + render_relay_planes = list(RENDER_PLANE_MASTER) + allows_offsetting = FALSE diff --git a/code/_onclick/hud/render_plate.dm b/code/_onclick/hud/render_plate.dm new file mode 100644 index 000000000000..9d5b5db99338 --- /dev/null +++ b/code/_onclick/hud/render_plate.dm @@ -0,0 +1,386 @@ +/*! + * Custom rendering solution to allow for advanced effects + * We (ab)use plane masters and render source/target to cheaply render 2+ planes as 1 + * if you want to read more read the _render_readme.md + */ + + +/** + * Render relay object assigned to a plane master to be able to relay it's render onto other planes that are not it's own + */ +/atom/movable/render_plane_relay + screen_loc = "CENTER" + layer = -1 + plane = 0 + appearance_flags = PASS_MOUSE | NO_CLIENT_COLOR | KEEP_TOGETHER + /// If we render into a critical plane master, or not + var/critical_target = FALSE + +/** + * ## Rendering plate + * + * Acts like a plane master, but for plane masters + * Renders other planes onto this plane, through the use of render objects + * Any effects applied onto this plane will act on the unified plane + * IE a bulge filter will apply as if the world was one object + * remember that once planes are unified on a render plate you cant change the layering of them! + */ +/atom/movable/screen/plane_master/rendering_plate + name = "Default rendering plate" + multiz_scaled = FALSE + +///this plate renders the final screen to show to the player +/atom/movable/screen/plane_master/rendering_plate/master + name = "Master rendering plate" + documentation = "The endpoint of all plane masters, you can think of this as the final \"view\" we draw.\ +
If offset is not 0 this will be drawn to the transparent plane of the floor above, but otherwise this is drawn to nothing, or shown to the player." + plane = RENDER_PLANE_MASTER + render_relay_planes = list() + +/atom/movable/screen/plane_master/rendering_plate/master/show_to(mob/mymob) + . = ..() + if(!.) + return + if(offset == 0) + return + // Non 0 offset render plates will relay up to the transparent plane above them, assuming they're not on the same z level as their target of course + var/datum/hud/hud = home.our_hud + // show_to can be called twice successfully with no hide_from call. Ensure no runtimes off the registers from this + if(hud) + RegisterSignal(hud, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(on_offset_change), override = TRUE) + offset_change(hud?.current_plane_offset || 0) + +/atom/movable/screen/plane_master/rendering_plate/master/hide_from(mob/oldmob) + . = ..() + if(offset == 0) + return + var/datum/hud/hud = home.our_hud + if(hud) + UnregisterSignal(hud, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(on_offset_change)) + +/atom/movable/screen/plane_master/rendering_plate/master/proc/on_offset_change(datum/source, old_offset, new_offset) + SIGNAL_HANDLER + offset_change(new_offset) + +/atom/movable/screen/plane_master/rendering_plate/master/proc/offset_change(new_offset) + if(new_offset == offset) // If we're on our own z layer, relay to nothing, just draw + remove_relay_from(GET_NEW_PLANE(RENDER_PLANE_TRANSPARENT, offset - 1)) + else // Otherwise, regenerate the relay + add_relay_to(GET_NEW_PLANE(RENDER_PLANE_TRANSPARENT, offset - 1)) + +///renders general in charachter game objects +/atom/movable/screen/plane_master/rendering_plate/game_plate + name = "Game rendering plate" + documentation = "Holds all objects that are ahhh, in character? is maybe the best way to describe it.\ +
We apply a displacement effect from the gravity pulse plane too, so we can warp the game world." + plane = RENDER_PLANE_GAME + render_relay_planes = list(RENDER_PLANE_MASTER) + +/atom/movable/screen/plane_master/rendering_plate/game_plate/Initialize(mapload, datum/hud/hud_owner) + . = ..() + add_filter("displacer", 1, displacement_map_filter(render_source = OFFSET_RENDER_TARGET(GRAVITY_PULSE_RENDER_TARGET, offset), size = 10)) + +// Blackness renders weird when you view down openspace, because of transforms and borders and such +// This is a consequence of not using lummy's grouped transparency, but I couldn't get that to work without totally fucking up +// Sight flags, and shooting vis_contents usage to the moon. So we're doin it different. +// If image vis contents worked (it should in 515), and we were ok with a maptick cost (wait for threaded maptick) this could be fixed +/atom/movable/screen/plane_master/rendering_plate/transparent + name = "Transparent plate" + documentation = "The master rendering plate from the offset below ours will be mirrored onto this plane. That way we achive a \"stack\" effect.\ +
This plane exists to uplayer the master rendering plate to the correct spot in our z layer's rendering order" + plane = RENDER_PLANE_TRANSPARENT + appearance_flags = PLANE_MASTER + +/atom/movable/screen/plane_master/rendering_plate/transparent/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) + . = ..() + // Don't display us if we're below everything else yeah? + AddComponent(/datum/component/plane_hide_highest_offset) + color = list(0.9,0,0,0, 0,0.9,0,0, 0,0,0.9,0, 0,0,0,1, 0,0,0,0) + +///Contains most things in the game world +/atom/movable/screen/plane_master/rendering_plate/game_world + name = "Game world plate" + documentation = "Contains most of the objects in the world. Mobs, machines, etc. Note the drop shadow, it gives a very nice depth effect." + plane = RENDER_PLANE_GAME_WORLD + appearance_flags = PLANE_MASTER //should use client color + blend_mode = BLEND_OVERLAY + +/atom/movable/screen/plane_master/rendering_plate/game_world/show_to(mob/mymob) + . = ..() + if(!.) + return + remove_filter("AO") + if(istype(mymob) && mymob.canon_client?.prefs?.read_preference(/datum/preference/toggle/ambient_occlusion)) + add_filter("AO", 1, drop_shadow_filter(x = 0, y = -2, size = 4, color = "#04080FAA")) + +///Contains all lighting objects +/atom/movable/screen/plane_master/rendering_plate/lighting + name = "Lighting plate" + documentation = "Anything on this plane will be multiplied with the plane it's rendered onto (typically the game plane).\ +
That's how lighting functions at base. Because it uses BLEND_MULTIPLY and occasionally color matrixes, it needs a backdrop of blackness.\ +
See This byond post\ +
Lemme see uh, we're masked by the emissive plane so it can actually function (IE: make things glow in the dark).\ +
We're also masked by the overlay lighting plane, which contains all the movable lights in the game. It draws to us and also the game plane.\ +
Masks us out so it has the breathing room to apply its effect.\ +
Oh and we quite often have our alpha changed to achive night vision effects, or things of that sort." + plane = RENDER_PLANE_LIGHTING + blend_mode_override = BLEND_MULTIPLY + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + critical = PLANE_CRITICAL_DISPLAY + /// A list of light cutoffs we're actively using, (mass, r, g, b) to avoid filter churn + var/list/light_cutoffs + +/*! + * This system works by exploiting BYONDs color matrix filter to use layers to handle emissive blockers. + * + * Emissive overlays are pasted with an atom color that converts them to be entirely some specific color. + * Emissive blockers are pasted with an atom color that converts them to be entirely some different color. + * Emissive overlays and emissive blockers are put onto the same plane. + * The layers for the emissive overlays and emissive blockers cause them to mask eachother similar to normal BYOND objects. + * A color matrix filter is applied to the emissive plane to mask out anything that isn't whatever the emissive color is. + * This is then used to alpha mask the lighting plane. + */ +/atom/movable/screen/plane_master/rendering_plate/lighting/Initialize(mapload, datum/hud/hud_owner) + . = ..() + add_filter("emissives", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(EMISSIVE_RENDER_TARGET, offset), flags = MASK_INVERSE)) + add_filter("object_lighting", 2, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(O_LIGHTING_VISUAL_RENDER_TARGET, offset), flags = MASK_INVERSE)) + set_light_cutoff(10) + +/atom/movable/screen/plane_master/rendering_plate/lighting/show_to(mob/mymob) + . = ..() + if(!.) + return + // This applies a backdrop to our lighting plane + // Why do plane masters need a backdrop sometimes? Read https://secure.byond.com/forum/?post=2141928 + // Basically, we need something to brighten + // unlit is perhaps less needed rn, it exists to provide a fullbright for things that can't see the lighting plane + // but we don't actually use invisibility to hide the lighting plane anymore, so it's pointless + var/atom/movable/screen/backdrop = mymob.overlay_fullscreen("lighting_backdrop_lit_[home.key]#[offset]", /atom/movable/screen/fullscreen/lighting_backdrop/lit) + // Need to make sure they're on our plane, ALL the time. We always need a backdrop + SET_PLANE_EXPLICIT(backdrop, PLANE_TO_TRUE(backdrop.plane), src) + backdrop = mymob.overlay_fullscreen("lighting_backdrop_unlit_[home.key]#[offset]", /atom/movable/screen/fullscreen/lighting_backdrop/unlit) + SET_PLANE_EXPLICIT(backdrop, PLANE_TO_TRUE(backdrop.plane), src) + + // Sorry, this is a bit annoying + // Basically, we only want the lighting plane we can actually see to attempt to render + // If we don't our lower plane gets totally overriden by the black void of the upper plane + var/datum/hud/hud = home.our_hud + // show_to can be called twice successfully with no hide_from call. Ensure no runtimes off the registers from this + if(hud) + RegisterSignal(hud, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(on_offset_change), override = TRUE) + offset_change(hud?.current_plane_offset || 0) + set_light_cutoff(mymob.lighting_cutoff, mymob.lighting_color_cutoffs) + + +/atom/movable/screen/plane_master/rendering_plate/lighting/hide_from(mob/oldmob) + . = ..() + oldmob.clear_fullscreen("lighting_backdrop_lit_[home.key]#[offset]") + oldmob.clear_fullscreen("lighting_backdrop_unlit_[home.key]#[offset]") + var/datum/hud/hud = home.our_hud + if(hud) + UnregisterSignal(hud, COMSIG_HUD_OFFSET_CHANGED, PROC_REF(on_offset_change)) + +/atom/movable/screen/plane_master/rendering_plate/lighting/proc/on_offset_change(datum/source, old_offset, new_offset) + SIGNAL_HANDLER + offset_change(new_offset) + +/atom/movable/screen/plane_master/rendering_plate/lighting/proc/offset_change(mob_offset) + // Offsets stack down remember. This implies that we're above the mob's view plane, and shouldn't render + if(offset < mob_offset) + disable_alpha() + else + enable_alpha() + +/atom/movable/screen/plane_master/rendering_plate/lighting/proc/set_light_cutoff(light_cutoff, list/color_cutoffs) + var/list/new_cutoffs = list(light_cutoff) + new_cutoffs += color_cutoffs + if(new_cutoffs ~= light_cutoffs) + return + + remove_filter(list("light_cutdown", "light_cutup")) + + var/ratio = light_cutoff/100 + if(!color_cutoffs) + color_cutoffs = list(0, 0, 0) + + var/red = color_cutoffs[1] / 100 + var/green = color_cutoffs[2] / 100 + var/blue = color_cutoffs[3] / 100 + add_filter("light_cutdown", 3, color_matrix_filter(list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, -(ratio + red),-(ratio+green),-(ratio+blue),0))) + add_filter("light_cutup", 4, color_matrix_filter(list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, ratio+red,ratio+green,ratio+blue,0))) + +/atom/movable/screen/plane_master/rendering_plate/emissive_slate + name = "Emissive Plate" + documentation = "This system works by exploiting BYONDs color matrix filter to use layers to handle emissive blockers.\ +
Emissive overlays are pasted with an atom color that converts them to be entirely some specific color.\ +
Emissive blockers are pasted with an atom color that converts them to be entirely some different color.\ +
Emissive overlays and emissive blockers are put onto the same plane (This one).\ +
The layers for the emissive overlays and emissive blockers cause them to mask eachother similar to normal BYOND objects.\ +
A color matrix filter is applied to the emissive plane to mask out anything that isn't whatever the emissive color is.\ +
This is then used to alpha mask the lighting plane." + plane = EMISSIVE_RENDER_PLATE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + render_target = EMISSIVE_RENDER_TARGET + render_relay_planes = list() + critical = PLANE_CRITICAL_DISPLAY + +/atom/movable/screen/plane_master/rendering_plate/emissive_slate/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset) + . = ..() + add_filter("em_block_masking", 2, color_matrix_filter(GLOB.em_mask_matrix)) + if(offset != 0) + add_relay_to(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset - 1), relay_layer = EMISSIVE_Z_BELOW_LAYER) + +/atom/movable/screen/plane_master/rendering_plate/light_mask + name = "Light Mask" + documentation = "Any part of this plane that is transparent will be black below it on the game rendering plate.\ +
This is done to ensure emissives and overlay lights don't light things up \"through\" the darkness that normally sits at the bottom of the lighting plane.\ +
We relay copies of the space, floor and wall planes to it, so we can use them as masks. Then we just boost any existing alpha to 100% and we're done.\ +
If we ever switch to a sight setup that shows say, mobs but not floors, we instead mask just overlay lighting and emissives.\ +
This avoids dumb seethrough without breaking stuff like thermals." + plane = LIGHT_MASK_PLANE + appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR + // Fullwhite where there's anything, no color otherwise + color = list(255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255, 0,0,0,0) + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + render_target = LIGHT_MASK_RENDER_TARGET + // We blend against the game plane, so she's gotta multiply! + blend_mode = BLEND_MULTIPLY + render_relay_planes = list(RENDER_PLANE_GAME) + +/atom/movable/screen/plane_master/rendering_plate/light_mask/show_to(mob/mymob) + . = ..() + if(!.) + return + + RegisterSignal(mymob, COMSIG_MOB_SIGHT_CHANGE, PROC_REF(handle_sight)) + handle_sight(mymob, mymob.sight, NONE) + +/atom/movable/screen/plane_master/rendering_plate/light_mask/hide_from(mob/oldmob) + . = ..() + var/atom/movable/screen/plane_master/overlay_lights = home.get_plane(GET_NEW_PLANE(O_LIGHTING_VISUAL_PLANE, offset)) + overlay_lights.remove_filter("lighting_mask") + var/atom/movable/screen/plane_master/emissive = home.get_plane(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset)) + emissive.remove_filter("lighting_mask") + remove_relay_from(GET_NEW_PLANE(RENDER_PLANE_GAME, offset)) + UnregisterSignal(oldmob, COMSIG_MOB_SIGHT_CHANGE) + +/atom/movable/screen/plane_master/rendering_plate/light_mask/proc/handle_sight(datum/source, new_sight, old_sight) + // If we can see something that shows "through" blackness, and we can't see turfs, disable our draw to the game plane + // And instead mask JUST the overlay lighting plane, since that will look fuckin wrong + var/atom/movable/screen/plane_master/overlay_lights = home.get_plane(GET_NEW_PLANE(O_LIGHTING_VISUAL_PLANE, offset)) + var/atom/movable/screen/plane_master/emissive = home.get_plane(GET_NEW_PLANE(EMISSIVE_RENDER_PLATE, offset)) + if(new_sight & SEE_AVOID_TURF_BLACKNESS && !(new_sight & SEE_TURFS)) + remove_relay_from(GET_NEW_PLANE(RENDER_PLANE_GAME, offset)) + overlay_lights.add_filter("lighting_mask", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(LIGHT_MASK_RENDER_TARGET, offset))) + emissive.add_filter("lighting_mask", 1, alpha_mask_filter(render_source = OFFSET_RENDER_TARGET(LIGHT_MASK_RENDER_TARGET, offset))) + // If we CAN'T see through the black, then draw er down brother! + else + overlay_lights.remove_filter("lighting_mask") + emissive.remove_filter("lighting_mask") + // We max alpha here, so our darkness is actually.. dark + // Can't do it before cause it fucks with the filter + add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME, offset), relay_color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,1)) + +///render plate for OOC stuff like ghosts, hud-screen effects, etc +/atom/movable/screen/plane_master/rendering_plate/non_game + name = "Non-Game rendering plate" + documentation = "Renders anything that's out of character. Mostly useful as a converse to the game rendering plate." + plane = RENDER_PLANE_NON_GAME + render_relay_planes = list(RENDER_PLANE_MASTER) + +/** + * Plane master proc called in Initialize() that creates relay objects, and sets them uo as needed + * Sets: + * * layer from plane to avoid z-fighting + * * planes to relay the render to + * * render_source so that the plane will render on these objects + * * mouse opacity to ensure proper mouse hit tracking + * * name for debugging purposes + * Other vars such as alpha will automatically be applied with the render source + */ +/atom/movable/screen/plane_master/proc/generate_render_relays() + var/relay_loc = "CENTER" + // If we're using a submap (say for a popup window) make sure we draw onto it + if(home?.map) + relay_loc = "[home.map]:[relay_loc]" + + var/list/generated_planes = list() + for(var/atom/movable/render_plane_relay/relay as anything in relays) + generated_planes += relay.plane + + for(var/relay_plane in (render_relay_planes - generated_planes)) + generate_relay_to(relay_plane, relay_loc) + + if(blend_mode != BLEND_MULTIPLY) + blend_mode = BLEND_DEFAULT + relays_generated = TRUE + +/// Creates a connection between this plane master and the passed in plane +/// Helper for out of system code, shouldn't be used in this file +/// Build system to differenchiate between generated and non generated render relays +/atom/movable/screen/plane_master/proc/add_relay_to(target_plane, blend_override, relay_layer, relay_color) + if(get_relay_to(target_plane)) + return + render_relay_planes += target_plane + var/client/display_lad = home?.our_hud?.mymob?.canon_client + var/atom/movable/render_plane_relay/relay = generate_relay_to(target_plane, show_to = display_lad, blend_override = blend_override, relay_layer = relay_layer) + relay.color = relay_color + +/proc/get_plane_master_render_base(name) + return "*[name]: AUTOGENERATED RENDER TGT" + +/atom/movable/screen/plane_master/proc/generate_relay_to(target_plane, relay_loc, client/show_to, blend_override, relay_layer) + if(!length(relays) && !initial(render_target)) + render_target = OFFSET_RENDER_TARGET(get_plane_master_render_base(name), offset) + if(!relay_loc) + relay_loc = "CENTER" + // If we're using a submap (say for a popup window) make sure we draw onto it + if(home?.map) + relay_loc = "[home.map]:[relay_loc]" + var/blend_to_use = blend_override + if(isnull(blend_to_use)) + blend_to_use = blend_mode_override || initial(blend_mode) + + var/atom/movable/render_plane_relay/relay = new() + relay.render_source = render_target + relay.plane = target_plane + relay.screen_loc = relay_loc + // There are two rules here + // 1: layer needs to be positive (negative layers are treated as float layers) + // 2: lower planes (including offset ones) need to be layered below higher ones (because otherwise they'll render fucky) + // By multiplying LOWEST_EVER_PLANE by 30, we give 30 offsets worth of room to planes before they start going negative + // Bet + // We allow for manuel override if requested. careful with this + relay.layer = relay_layer || (plane + abs(LOWEST_EVER_PLANE * 30)) //layer must be positive but can be a decimal + relay.blend_mode = blend_to_use + relay.mouse_opacity = mouse_opacity + relay.name = render_target + relay.critical_target = PLANE_IS_CRITICAL(target_plane) + relays += relay + // Relays are sometimes generated early, before huds have a mob to display stuff to + // That's what this is for + if(show_to) + show_to.screen += relay + return relay + +/// Breaks a connection between this plane master, and the passed in place +/atom/movable/screen/plane_master/proc/remove_relay_from(target_plane) + render_relay_planes -= target_plane + var/atom/movable/render_plane_relay/existing_relay = get_relay_to(target_plane) + if(!existing_relay) + return + relays -= existing_relay + if(!length(relays) && !initial(render_target)) + render_target = null + var/client/lad = home?.our_hud?.mymob?.canon_client + if(lad) + lad.screen -= existing_relay + +/// Gets the relay atom we're using to connect to the target plane, if one exists +/atom/movable/screen/plane_master/proc/get_relay_to(target_plane) + for(var/atom/movable/render_plane_relay/relay in relays) + if(relay.plane == target_plane) + return relay + + return null diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 3d0e1295dc5b..bc7305876274 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -185,3 +185,4 @@ SUBSYSTEM_DEF(events) /datum/controller/subsystem/events/proc/resetFrequency() frequency_lower = initial(frequency_lower) frequency_upper = initial(frequency_upper) + diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index f572a652d1b0..7a7f5eb69860 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -26,6 +26,9 @@ SUBSYSTEM_DEF(mapping) var/list/station_minimaps = list() + /// List of z level (as number) -> The lowest plane offset in that z stack + var/list/z_level_to_lowest_plane_offset = list() + /// Assoc list of string plane to the plane's offset value var/list/plane_to_offset diff --git a/code/datums/brain_damage/creepy_trauma.dm b/code/datums/brain_damage/creepy_trauma.dm index a8c87ab78a83..ad3cac664e2b 100644 --- a/code/datums/brain_damage/creepy_trauma.dm +++ b/code/datums/brain_damage/creepy_trauma.dm @@ -91,7 +91,7 @@ switch(rand(1, 100)) if(1 to 40) INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), pick("blink", "blink_r")) - owner.blur_eyes(10) + owner.adjust_eye_blur(10) to_chat(owner, span_userdanger("You sweat profusely and have a hard time focusing...")) if(41 to 80) INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "pale") diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 9eccabd5d59a..cf8b54ba9c48 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -117,7 +117,7 @@ owner.adjust_dizzy(20 SECONDS) if(4,5) owner.adjust_confusion(10 SECONDS) - owner.blur_eyes(10) + owner.adjust_eye_blur(10) if(6 to 9) owner.adjust_slurring(1 MINUTES) if(10) diff --git a/code/datums/components/hide_highest_offset.dm b/code/datums/components/hide_highest_offset.dm new file mode 100644 index 000000000000..eb5b5660db0f --- /dev/null +++ b/code/datums/components/hide_highest_offset.dm @@ -0,0 +1,24 @@ +/// Component that takes a plane master, and will hide it if it's the highest offset of its kind +/// This allows us to not show PMs to clients if they're not actively doing anything +/datum/component/plane_hide_highest_offset + +/datum/component/plane_hide_highest_offset/Initialize() + if(!istype(parent, /atom/movable/screen/plane_master)) + return + RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_offset_increase)) + offset_increase(SSmapping.max_plane_offset) + +/datum/component/plane_hide_highest_offset/proc/on_offset_increase(datum/source, old_offset, new_offset) + SIGNAL_HANDLER + offset_increase(new_offset) + +/datum/component/plane_hide_highest_offset/proc/offset_increase(new_offset) + var/atom/movable/screen/plane_master/plane_parent = parent + var/mob/our_mob = plane_parent.home?.our_hud?.mymob + var/our_offset = plane_parent.offset + if(!our_mob) + return + if(our_offset == new_offset) + plane_parent.hide_plane(our_mob) + else if(plane_parent.force_hidden) + plane_parent.unhide_plane(our_mob) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 303ca4d21f04..884218199d8f 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -313,3 +313,39 @@ /obj/item/update_filters() . = ..() update_item_action_buttons() + +/datum/proc/add_filter(name, priority, list/params) + LAZYINITLIST(filter_data) + var/list/copied_parameters = params.Copy() + copied_parameters["priority"] = priority + filter_data[name] = copied_parameters + update_filters() + +/// Returns the indice in filters of the given filter name. +/// If it is not found, returns null. +/datum/proc/get_filter_index(name) + return filter_data?.Find(name) + +/// Removes the passed filter, or multiple filters, if supplied with a list. +/datum/proc/remove_filter(name_or_names) + if(!filter_data) + return + + var/list/names = islist(name_or_names) ? name_or_names : list(name_or_names) + + for(var/name in names) + if(filter_data[name]) + filter_data -= name + update_filters() + +/datum/proc/clear_filters() + ASSERT(isatom(src) || istype(src, /image)) + var/atom/atom_cast = src // filters only work with images or atoms. + filter_data = null + atom_cast.filters = null + +/// Return text from this proc to provide extra context to hard deletes that happen to it +/// Optional, you should use this for cases where replication is difficult and extra context is required +/// Can be called more then once per object, use harddel_deets_dumped to avoid duplicate calls (I am so sorry) +/datum/proc/dump_harddel_info() + return diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 410a215652c7..bd4682516c3d 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -98,16 +98,16 @@ to_chat(M, span_notice("Your vision slowly returns...")) M.cure_blind(EYE_DAMAGE) M.cure_nearsighted(EYE_DAMAGE) - M.blur_eyes(35) + M.adjust_eye_blur(35) else if(HAS_TRAIT_FROM(M, TRAIT_NEARSIGHT, EYE_DAMAGE)) to_chat(M, span_notice("You can finally focus your eyes on distant objects.")) M.cure_nearsighted(EYE_DAMAGE) - M.blur_eyes(10) + M.adjust_eye_blur(10) else if(M.eye_blind || M.eye_blurry) M.set_blindness(0) - M.set_blurriness(0) + M.set_eye_blur(0) else if(eyes.damage > 0) eyes.applyOrganDamage(-1) else diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index 7d428afa0f53..c860a9f5a25d 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -57,10 +57,10 @@ Bonus to_chat(M, span_warning("Your eyes itch.")) if(3, 4) to_chat(M, span_warning("Your eyes burn!")) - M.blur_eyes(10) + M.adjust_eye_blur(10) eyes.applyOrganDamage(1) else - M.blur_eyes(20) + M.adjust_eye_blur(20) eyes.applyOrganDamage(5) if(eyes.damage >= 10) M.become_nearsighted(EYE_DAMAGE) diff --git a/code/datums/diseases/sleepy.dm b/code/datums/diseases/sleepy.dm index 0ca951fa8a04..209a4ef207c3 100644 --- a/code/datums/diseases/sleepy.dm +++ b/code/datums/diseases/sleepy.dm @@ -50,10 +50,10 @@ affected_mob.adjustStaminaLoss(10) if(prob(3)) to_chat(affected_mob, span_danger("Your eyes feel strained.")) - affected_mob.blur_eyes(6) + affected_mob.adjust_eye_blur(6) if(prob(3)) to_chat(affected_mob, span_warning("[pick("So tired...","You feel very sleepy.","You have a hard time keeping your eyes open.","You try to stay awake.")]")) - affected_mob.blur_eyes(6) + affected_mob.adjust_eye_blur(6) affected_mob.set_confusion_if_lower(4 SECONDS) affected_mob.adjustStaminaLoss(15) if(prob(5)) diff --git a/code/datums/martial/flying_fang.dm b/code/datums/martial/flying_fang.dm index 95e8eeef2bf2..a50a66ebb534 100644 --- a/code/datums/martial/flying_fang.dm +++ b/code/datums/martial/flying_fang.dm @@ -132,7 +132,7 @@ playsound(D, 'sound/weapons/genhit1.ogg', 50, TRUE, -1) D.apply_damage(disarm_damage, STAMINA, BODY_ZONE_HEAD, armor_block) D.apply_damage(disarm_damage, A.dna.species.attack_type, BODY_ZONE_HEAD, armor_block) - D.blur_eyes(4) + D.adjust_eye_blur(4) if(!istype(D.head, /obj/item/clothing/head/helmet)) D.dna.species.aiminginaccuracy += 25 addtimer(CALLBACK(src, PROC_REF(remove_bonk), D), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) diff --git a/code/datums/status_effects/debuffs/drowsiness.dm b/code/datums/status_effects/debuffs/drowsiness.dm index d2707049a8c2..c719573772e3 100644 --- a/code/datums/status_effects/debuffs/drowsiness.dm +++ b/code/datums/status_effects/debuffs/drowsiness.dm @@ -37,6 +37,6 @@ if(owner.resting && remove_duration(2 * initial(tick_interval))) return - owner.blur_eyes(4 SECONDS) + owner.adjust_eye_blur(4 SECONDS) if(prob(5)) owner.AdjustSleeping(10 SECONDS) diff --git a/code/datums/status_effects/debuffs/drunk.dm b/code/datums/status_effects/debuffs/drunk.dm index d305e194edb5..35c9764193da 100644 --- a/code/datums/status_effects/debuffs/drunk.dm +++ b/code/datums/status_effects/debuffs/drunk.dm @@ -171,7 +171,7 @@ // Over 71, we will constantly have blurry eyes if(drunk_value >= 71) - owner.blur_eyes(drunk_value * 2 - 140) + owner.adjust_eye_blur(drunk_value * 2 - 140) // Over 81, we will gain constant toxloss if(drunk_value >= 81) diff --git a/code/datums/status_effects/debuffs/screen_blur.dm b/code/datums/status_effects/debuffs/screen_blur.dm new file mode 100644 index 000000000000..abdd07d3cd59 --- /dev/null +++ b/code/datums/status_effects/debuffs/screen_blur.dm @@ -0,0 +1,52 @@ +/// This number is multiplied by the duration remaining (IN SECONDS, NOT DECISECONDS) +/// of the eye blur status effect to determine the intensity of the blur on the user +#define BLUR_DURATION_TO_INTENSITY 0.05 + +/// Applies a blur to the user's screen, increasing in strength depending on duration remaining. +/datum/status_effect/eye_blur + id = "eye_blur" + tick_interval = 1 SECONDS + alert_type = null + remove_on_fullheal = TRUE + +/datum/status_effect/eye_blur/on_creation(mob/living/new_owner, duration = 10 SECONDS) + src.duration = duration + return ..() + +/datum/status_effect/eye_blur/on_apply() + if(owner.mob_biotypes & (MOB_ROBOTIC|MOB_SPIRIT|MOB_SPECIAL)) + return FALSE + + // Refresh the blur when a client jumps into the mob, in case we get put on a clientless mob with no hud + RegisterSignal(owner, COMSIG_MOB_LOGIN, PROC_REF(update_blur)) + // Apply initial blur + update_blur() + return TRUE + +/datum/status_effect/eye_blur/on_remove() + UnregisterSignal(owner, COMSIG_MOB_LOGIN) + if(!owner.hud_used) + return + + var/atom/movable/plane_master_controller/game_plane_master_controller = owner.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] + game_plane_master_controller.remove_filter("eye_blur") + +/datum/status_effect/eye_blur/tick(seconds_between_ticks) + // Blur lessens the closer we are to expiring, so we update per tick. + update_blur() + +/// Updates the blur of the owner of the status effect. +/// Also a signal proc for [COMSIG_MOB_LOGIN], to trigger then when the mob gets a client. +/datum/status_effect/eye_blur/proc/update_blur(datum/source) + SIGNAL_HANDLER + + if(!owner.hud_used) + return + + var/time_left_in_seconds = (duration - world.time) / (1 SECONDS) + var/amount_of_blur = clamp(time_left_in_seconds * BLUR_DURATION_TO_INTENSITY, 0.6, 3) + + var/atom/movable/plane_master_controller/game_plane_master_controller = owner.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] + game_plane_master_controller.add_filter("eye_blur", 1, gauss_blur_filter(amount_of_blur)) + +#undef BLUR_DURATION_TO_INTENSITY diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 25ee96acc14a..44ff68c6c5ae 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1492,13 +1492,7 @@ victim.log_message(message, LOG_ATTACK, color="blue") -/atom/movable/proc/add_filter(name,priority,list/params) - if(!filter_data) - filter_data = list() - var/list/p = params.Copy() - p["priority"] = priority - filter_data[name] = p - update_filters() + /obj/item/update_filters() . = ..() @@ -1506,17 +1500,6 @@ var/datum/action/A = X A.build_all_button_icons() -/// Returns the indice in filters of the given filter name. -/// If it is not found, returns null. -/atom/proc/get_filter_index(name) - return filter_data?.Find(name) - -/atom/movable/proc/remove_filter(name) - if(filter_data && filter_data[name]) - filter_data -= name - update_filters() - - /atom/proc/intercept_zImpact(atom/movable/AM, levels = 1) return FALSE diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 536d61200dcb..4c06dfff4b67 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -289,7 +289,7 @@ if(did_player_win) add_filter("jackpot_rays", 3, ray_filter) animate(get_filter("jackpot_rays"), offset = 10, time = 3 SECONDS, loop = -1) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, remove_filter), "jackpot_rays"), 3 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum, remove_filter), "jackpot_rays"), 3 SECONDS) playsound(src, 'sound/machines/roulettejackpot.ogg', 50, TRUE) /obj/machinery/computer/slot_machine/proc/get_lines() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index c7137fc51a82..da5e2603479b 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -635,10 +635,10 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if (!eyes) return - M.adjust_blurriness(3) + M.adjust_eye_blur(3) eyes.applyOrganDamage(rand(2,4)) if(eyes.damage >= 10) - M.adjust_blurriness(15) + M.adjust_eye_blur(15) if(M.stat != DEAD) to_chat(M, span_danger("Your eyes start to bleed profusely!")) if(!(HAS_TRAIT(M, TRAIT_BLIND) || HAS_TRAIT(M, TRAIT_NEARSIGHT))) @@ -648,7 +648,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(M.stat != DEAD) if(M.drop_all_held_items()) to_chat(M, span_danger("You drop what you're holding and clutch at your eyes!")) - M.adjust_blurriness(10) + M.adjust_eye_blur(10) M.Unconscious(20) M.Paralyze(40) if (prob(eyes.damage - 10 + 1)) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 3e823857a4d9..443abb3556c8 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -674,7 +674,7 @@ to_chat(target, span_userdanger("[user] sprays [src] into your face!")) if(C.client) - C.blur_eyes(3) + C.adjust_eye_blur(3) C.blind_eyes(1) if(C.get_eye_protection() <= 0) // no eye protection? ARGH IT BURNS. C.adjust_confusion(3) diff --git a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm index 2d0673457ffa..549342f2173b 100644 --- a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm @@ -285,7 +285,7 @@ owner.current.adjust_jitter(3 SECONDS) // BLOOD_VOLUME_SURVIVE: [122] - Blur Vision if(bloodsucker_blood_volume < BLOOD_VOLUME_SURVIVE(owner.current)) - owner.current.blur_eyes((8 - 8 * (bloodsucker_blood_volume / BLOOD_VOLUME_BAD(owner.current)))* 2 SECONDS) + owner.current.adjust_eye_blur((8 - 8 * (bloodsucker_blood_volume / BLOOD_VOLUME_BAD(owner.current)))* 2 SECONDS) // The more blood, the better the Regeneration, get too low blood, and you enter Frenzy. if(bloodsucker_blood_volume < (FRENZY_THRESHOLD_ENTER + humanity_lost * 10) && !frenzied) diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index 920cad4f34d7..45765c9006be 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -31,7 +31,7 @@ if(eyes) to_chat(H, span_userdanger("You are blinded by a shower of blood!")) H.Stun(20) - H.blur_eyes(20) + H.adjust_eye_blur(20) eyes.applyOrganDamage(5) H.adjust_confusion(3 SECONDS) for(var/mob/living/silicon/S in range(2,user)) diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 5631ac7de2f6..0fc3a1fa17c4 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -235,7 +235,7 @@ to_chat(target, span_danger("Your eyes burn horrifically!")) target.become_nearsighted(EYE_DAMAGE) target.blind_eyes(20) - target.blur_eyes(40) + target.adjust_eye_blur(40) return TRUE /datum/action/changeling/sting/LSD diff --git a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm index 7a7febba425b..b2fc01309dae 100644 --- a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm +++ b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm @@ -53,7 +53,7 @@ to_chat(victim, span_userdanger("Your eyes explode with horrific pain!")) victim.emote("scream") eyes.applyOrganDamage(eyes.maxHealth) - victim.adjust_blurriness(30) + victim.adjust_eye_blur(30) victim.adjust_blindness(30) return TRUE @@ -157,7 +157,7 @@ eyes.applyOrganDamage(0.5) eye_damage_done += 0.5 if(eye_damage_done >= 20) - H.adjust_blurriness(2) + H.adjust_eye_blur(2) if(eye_damage_done >= nearsight_breakpoint) if(!HAS_TRAIT(H, TRAIT_NEARSIGHT)) to_chat(H, span_nzcrentr("Your vision doubles, then trembles. Darkness begins to close in. You can't keep this up!")) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 4884191cd10c..331b6cb47f54 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -525,6 +525,12 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/narsie/conceal() //can't hide this, and you wouldn't want to return +GLOBAL_VAR_INIT(narsie_effect_last_modified, 0) +GLOBAL_VAR_INIT(narsie_summon_count, 0) +/proc/set_narsie_count(new_count) + GLOB.narsie_summon_count = new_count + SEND_GLOBAL_SIGNAL(COMSIG_NARSIE_SUMMON_UPDATE, GLOB.narsie_summon_count) + /obj/effect/rune/narsie/attack_hand(mob/living/user) if(user.mind?.has_antag_datum(/datum/antagonist/cult/master)) req_cultists -= 4 //leader counts as 5 cultists if they are the invoker diff --git a/code/modules/antagonists/demon/general_powers.dm b/code/modules/antagonists/demon/general_powers.dm index ff8eb520ecd0..050712982846 100644 --- a/code/modules/antagonists/demon/general_powers.dm +++ b/code/modules/antagonists/demon/general_powers.dm @@ -109,7 +109,7 @@ ..() return TRUE playsound(caster, 'sound/magic/demon_attack1.ogg', 75, TRUE) - victim.blur_eyes(15) //huge array of relatively minor effects. + victim.adjust_eye_blur(15) //huge array of relatively minor effects. victim.adjust_jitter(5 SECONDS) victim.set_confusion_if_lower(5 SECONDS) victim.adjust_disgust(40) diff --git a/code/modules/antagonists/eldritch_cult/knowledge/mind_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/mind_lore.dm index a39b68b38f7c..195140c21169 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/mind_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/mind_lore.dm @@ -31,7 +31,7 @@ if(!ishuman(target)) return COMPONENT_BLOCK_HAND_USE var/mob/living/carbon/human/human_target = target - human_target.blur_eyes(1 SECONDS) + human_target.adjust_eye_blur(1 SECONDS) human_target.Knockdown(2 SECONDS) /datum/eldritch_knowledge/spell/eldritchbolt @@ -76,7 +76,7 @@ if(!ishuman(target)) return COMPONENT_BLOCK_HAND_USE var/mob/living/carbon/human/human_target = target - human_target.blur_eyes(2 SECONDS) + human_target.adjust_eye_blur(2 SECONDS) human_target.blind_eyes(1 SECONDS) /datum/eldritch_knowledge/spell/assault diff --git a/code/modules/antagonists/traitor/syndicate_contract.dm b/code/modules/antagonists/traitor/syndicate_contract.dm index 52fed5895983..2025c419f1ad 100644 --- a/code/modules/antagonists/traitor/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/syndicate_contract.dm @@ -163,7 +163,7 @@ M.flash_act() M.adjust_confusion(10 SECONDS) - M.blur_eyes(0.5 SECONDS) + M.adjust_eye_blur(0.5 SECONDS) to_chat(M, span_warning("You feel strange...")) sleep(6 SECONDS) to_chat(M, span_warning("That pod did something to you...")) @@ -172,7 +172,7 @@ to_chat(M, span_warning("Your head pounds... It feels like it's going to burst out your skull!")) M.flash_act() M.adjust_confusion(20 SECONDS) - M.blur_eyes(3) + M.adjust_eye_blur(3) sleep(3 SECONDS) to_chat(M, span_warning("Your head pounds...")) sleep(10 SECONDS) @@ -181,7 +181,7 @@ to_chat(M, "A million voices echo in your head... \"Your mind held many valuable secrets - \ we thank you for providing them. Your value is expended, and you will be ransomed back to your station. We always get paid, \ so it's only a matter of time before we ship you back...\"") - M.blur_eyes(1 SECONDS) + M.adjust_eye_blur(1 SECONDS) M.adjust_dizzy(1.5 SECONDS) M.adjust_confusion(20 SECONDS) @@ -220,7 +220,7 @@ M.forceMove(return_pod) M.flash_act() - M.blur_eyes(30) + M.adjust_eye_blur(30) M.adjust_dizzy(35 SECONDS) M.adjust_confusion(20 SECONDS) diff --git a/code/modules/client/multiz_parallax.dm b/code/modules/client/multiz_parallax.dm new file mode 100644 index 000000000000..f8bfad97bc26 --- /dev/null +++ b/code/modules/client/multiz_parallax.dm @@ -0,0 +1,16 @@ +// /// Whether or not to toggle multiz parallax, the parallax effect for lower z-levels. +// /datum/preference/toggle/multiz_parallax +// category = PREFERENCE_CATEGORY_GAME_PREFERENCES +// savefile_key = "multiz_parallax" +// savefile_identifier = PREFERENCE_PLAYER + +// /datum/preference/toggle/multiz_parallax/apply_to_client(client/client, value) +// // Update the plane master group's Z transforms. + +// var/datum/hud/my_hud = client.mob?.hud_used +// if(!my_hud) +// return + +// for(var/group_key as anything in my_hud.master_groups) +// var/datum/plane_master_group/group = my_hud.master_groups[group_key] +// group.transform_lower_turfs(my_hud, my_hud.current_plane_offset) diff --git a/code/modules/client/preferences/ambient_occlusion.dm b/code/modules/client/preferences/ambient_occlusion.dm index a81efca00bd8..cf8bf28c1e56 100644 --- a/code/modules/client/preferences/ambient_occlusion.dm +++ b/code/modules/client/preferences/ambient_occlusion.dm @@ -5,8 +5,6 @@ savefile_identifier = PREFERENCE_PLAYER /datum/preference/toggle/ambient_occlusion/apply_to_client(client/client, value) - var/atom/movable/screen/plane_master/game_world/plane_master = locate() in client?.screen - if (!plane_master) - return - - plane_master.backdrop(client.mob) + /// Backdrop for the game world plane. + for(var/atom/movable/screen/plane_master/plane_master as anything in client.mob?.hud_used?.get_true_plane_masters(GAME_PLANE)) + plane_master.show_to(client.mob) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 2048bf937375..90733df90106 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -59,7 +59,7 @@ to_chat(H, span_danger("[src] overloads and blinds you!")) H.flash_act(visual = 1) H.blind_eyes(3) - H.blur_eyes(5) + H.adjust_eye_blur(5) eyes.applyOrganDamage(5) /obj/item/clothing/glasses/meson diff --git a/code/modules/events/flutes.dm b/code/modules/events/flutes.dm index 10734d1859b7..ac328f006291 100644 --- a/code/modules/events/flutes.dm +++ b/code/modules/events/flutes.dm @@ -57,23 +57,23 @@ /datum/round_event/flutes/proc/flute_vis_flicker(mob/living/carbon/M) to_chat(M, span_warning("Your vision flickers.")) - M.blur_eyes(15) + M.adjust_eye_blur(15) /datum/round_event/flutes/proc/flute_headache(mob/living/carbon/M) to_chat(M, span_warning("You get an intense headache!")) - M.blur_eyes(15) + M.adjust_eye_blur(15) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 20, 30) M.adjustStaminaLoss(15) /datum/round_event/flutes/proc/flute_tremble(mob/living/carbon/M) to_chat(M, span_warning("Something trembles along the edge of your vision, your eyes water, with the familiar beat of blood racing through your head.")) - M.blur_eyes(30) + M.adjust_eye_blur(30) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 30, 35) M.adjustStaminaLoss(30) /datum/round_event/flutes/proc/flute_chanting(mob/living/carbon/M) to_chat(M, "You hear faint chanting.. You feel a heavy weight upon your shoulders, as something shifts it's gaze towards you..") - M.blur_eyes(30) + M.adjust_eye_blur(30) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50, 60) M.adjustStaminaLoss(50) ADD_TRAIT(M, TRAIT_UNSTABLE, M) @@ -82,7 +82,7 @@ /datum/round_event/flutes/proc/flute_starlight(mob/living/carbon/M) to_chat(M, span_warning("As the nearest stars light your skin and your station, you can make out the faint whispers being spoken in turn with the monotone flutes playing beyond you. You feel so tired, as the struts of metal piping, the walls, the floor twist in unnatural ways, as the lights dim.")) sleep(30 SECONDS) - M.blur_eyes(40) + M.adjust_eye_blur(40) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 65, 70, 80) ADD_TRAIT(M, TRAIT_UNSTABLE, M) //sanity = 50 @@ -108,7 +108,7 @@ to_chat(M, span_suicide("Your flesh undulates, and boils off your bones. You were blind, yet now you've seen a glimpse behind the cosmic curtain.")) //sanity = 25 REMOVE_TRAIT(M, TRAIT_UNSTABLE, M) - M.blur_eyes(5) + M.adjust_eye_blur(5) M.adjustStaminaLoss(90) M.adjustBruteLoss(60, 70, 75, 80, 85) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 65, 70, 75, 80, 90) @@ -120,7 +120,7 @@ ADD_TRAIT(M, TRAIT_UNSTABLE, M) //sanity = 1 M.SetSleeping(30) - M.blur_eyes(40) + M.adjust_eye_blur(40) M.adjustStaminaLoss(99) to_chat(M, span_narsie("Y'HAH HT'HU THRZHZU. UA'KLL GHRT AWN ZUU!")) M.adjustBruteLoss(60, 70, 75, 80, 85) diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index b0b63954b023..31298dfc77ce 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -49,7 +49,7 @@ creamoverlay.icon_state = "creampie_human" if(stunning) H.Paralyze(20) //splat! - H.adjust_blurriness(1) + H.adjust_eye_blur(1) H.visible_message(span_warning("[H] is creamed by [src]!"), span_userdanger("You've been creamed by [src]!")) playsound(H, "desceration", 50, TRUE) if(!H.creamed) // one layer at a time @@ -301,4 +301,4 @@ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("pie" = 1, "dark chocolate" = 3) - foodtype = GRAIN | SUGAR | CHOCOLATE \ No newline at end of file + foodtype = GRAIN | SUGAR | CHOCOLATE diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index f94de039f47a..f53b16f47ab1 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -114,4 +114,4 @@ to_chat(M, span_danger("You are blinded by the powerful acid of [src]!")) log_combat(user, M, "attacked", src) - M.adjust_blurriness(force/7) + M.adjust_eye_blur(force/7) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 646b2cf26cec..e0ac50704f6b 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -154,7 +154,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ if(C.is_eyes_covered()) C.visible_message(span_danger("[C]'s eye protection blocks the sand!"), span_warning("Your eye protection blocks the sand!")) return - C.adjust_blurriness(6) + C.adjust_eye_blur(6) C.adjustStaminaLoss(15)//the pain from your eyes burning does stamina damage C.adjust_confusion(5 SECONDS) to_chat(C, span_userdanger("\The [src] gets into your eyes! The pain, it burns!")) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 9f4d093d4f67..490124767faf 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -68,7 +68,7 @@ if(BLOOD_BAD) adjustOxyLoss(round((BLOOD_VOLUME_NORMAL(src) - blood_volume) * 0.02, 1)) if(prob(5)) - blur_eyes(6) + adjust_eye_blur(6) to_chat(src, span_warning("You feel very [word].")) if(BLOOD_SURVIVE) adjustOxyLoss(5) diff --git a/code/modules/mob/living/brain/status_procs.dm b/code/modules/mob/living/brain/status_procs.dm index 1c5aeb1f47c0..e69de29bb2d1 100644 --- a/code/modules/mob/living/brain/status_procs.dm +++ b/code/modules/mob/living/brain/status_procs.dm @@ -1,25 +0,0 @@ -//Here are the procs used to modify status effects of a mob. -//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness -// eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait. - -/////////////////////////////////// EYE_BLIND //////////////////////////////////// - -/mob/living/brain/blind_eyes() // no eyes to damage or heal - return - -/mob/living/brain/adjust_blindness() - return - -/mob/living/brain/set_blindness() - return - -/////////////////////////////////// EYE_BLURRY //////////////////////////////////// - -/mob/living/brain/blur_eyes() - return - -/mob/living/brain/adjust_blurriness() - return - -/mob/living/brain/set_blurriness() - return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index b69a40db20dc..861582d06371 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -533,7 +533,7 @@ if(eyes.damage > 10) blind_eyes(damage) - blur_eyes(damage * rand(3, 6)) + adjust_eye_blur(damage * rand(3, 6)) if(eyes.damage > 20) if(prob(eyes.damage - 20)) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 990eafe0c222..4ef4c703a43e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -98,7 +98,7 @@ else adjust_blindness(-1) if(eye_blurry) //blurry eyes heal slowly - adjust_blurriness(-1) + adjust_eye_blur(-1) if (getOrganLoss(ORGAN_SLOT_BRAIN) >= 60) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "brain_damage", /datum/mood_event/brain_damage) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 571facfad919..6f85af68780b 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1849,7 +1849,7 @@ GLOBAL_LIST_EMPTY(features_by_species) H.visible_message(span_danger("[H] has been knocked senseless!"), \ span_userdanger("[H] has been knocked senseless!")) H.set_confusion_if_lower(20 SECONDS) - H.adjust_blurriness(10) + H.adjust_eye_blur(10) if(prob(10)) H.gain_trauma(/datum/brain_trauma/mild/concussion) else diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 42afcb604854..7b8cba63935e 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -99,7 +99,7 @@ if(!HAS_TRAIT(src, TRAIT_RADIMMUNE)&& !(status_flags & GODMODE)) radiation += max(effect * hit_percent, 0) if(EFFECT_EYE_BLUR) - blur_eyes(effect * hit_percent) + adjust_eye_blur(effect * hit_percent) if(EFFECT_PARALYZE) Paralyze(effect * hit_percent) if(EFFECT_IMMOBILIZE) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 8baca92c259c..7a28d1d9a11d 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -121,9 +121,7 @@ eye_blind = max(eye_blind-1,1) if(eye_blurry) //blurry eyes heal slowly eye_blurry = max(eye_blurry-1, 0) - if(client) - update_eye_blur() - + /mob/living/proc/update_damage_hud() return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index cce17d6775e8..a02f43a97d97 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -606,7 +606,7 @@ set_nutrition(NUTRITION_LEVEL_FED + 50) bodytemperature = BODYTEMP_NORMAL set_blindness(0) - set_blurriness(0) + set_eye_blur(0) cure_nearsighted() cure_blind() @@ -1550,7 +1550,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) if(E) E.setOrganDamage(var_value) if("eye_blurry") - set_blurriness(var_value) + set_eye_blur(var_value) if("maxHealth") updatehealth() if("resize") @@ -1687,3 +1687,15 @@ GLOBAL_LIST_EMPTY(fire_appearances) // if(!resting) // get_up() set_resting(FALSE) + +/mob/living/proc/move_to_error_room() + var/obj/effect/landmark/error/error_landmark = locate(/obj/effect/landmark/error) in GLOB.landmarks_list + if(error_landmark) + forceMove(error_landmark.loc) + else + forceMove(locate(4,4,1)) //Even if the landmark is missing, this should put them in the error room. + //If you're here from seeing this error, I'm sorry. I'm so very sorry. The error landmark should be a sacred object that nobody has any business messing with, and someone did! + //Consider seeing a therapist. + var/ERROR_ERROR_LANDMARK_ERROR = "ERROR-ERROR: ERROR landmark missing!" + log_mapping(ERROR_ERROR_LANDMARK_ERROR) + CRASH(ERROR_ERROR_LANDMARK_ERROR) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 217078bf717a..f76206f6c8fd 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -148,3 +148,5 @@ var/num_hands = 2 ///How many usable hands does this mob currently have. Should only be changed through set_usable_hands() var/usable_hands = 2 + /// What our current gravity state is. Used to avoid duplicate animates and such + var/gravity_state = null diff --git a/code/modules/mob/living/simple_animal/status_procs.dm b/code/modules/mob/living/simple_animal/status_procs.dm deleted file mode 100644 index 62a262f9e605..000000000000 --- a/code/modules/mob/living/simple_animal/status_procs.dm +++ /dev/null @@ -1,25 +0,0 @@ - -/mob/living/simple_animal/blind_eyes() - return - -/mob/living/simple_animal/adjust_blindness() - return - -/mob/living/simple_animal/set_blindness() - return - - - -/mob/living/simple_animal/blur_eyes() - return - -/mob/living/simple_animal/adjust_blurriness() - return - -/mob/living/simple_animal/set_blurriness() - return - - - -/mob/living/simple_animal/become_blind() - return diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index a94f8efeaa0f..d74abe19e4ca 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -71,35 +71,6 @@ clear_alert("blind") clear_fullscreen("blind") -/** - * Make the mobs vision blurry - */ -/mob/proc/blur_eyes(amount) - if(amount>0) - eye_blurry = max(amount, eye_blurry) - update_eye_blur() - -/** - * Adjust the current blurriness of the mobs vision by amount - */ -/mob/proc/adjust_blurriness(amount) - eye_blurry = max(eye_blurry+amount, 0) - update_eye_blur() - -///Set the mobs blurriness of vision to an amount -/mob/proc/set_blurriness(amount) - eye_blurry = max(amount, 0) - update_eye_blur() - -///Apply the blurry overlays to a mobs clients screen -/mob/proc/update_eye_blur() - if(!client) - return - var/atom/movable/screen/plane_master/floor/OT = locate(/atom/movable/screen/plane_master/floor) in client.screen - var/atom/movable/screen/plane_master/game_world/GW = locate(/atom/movable/screen/plane_master/game_world) in client.screen - GW.backdrop(src) - OT.backdrop(src) - ///Adjust the disgust level of a mob /mob/proc/adjust_disgust(amount) return diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 84115fc68f1f..1f93cc578d6c 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -46,7 +46,7 @@ var/obj/item/organ/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES) user.Stun(200) user.visible_message(span_suicide("[user] jams [src] in [user.p_their()] nose. It looks like [user.p_theyre()] trying to commit suicide!")) - user.adjust_blurriness(6) + user.adjust_eye_blur(6) if(eyes) eyes.applyOrganDamage(rand(6,8)) sleep(1 SECONDS) @@ -114,7 +114,7 @@ if(H.is_eyes_covered()) return visible_message(span_danger("\The [src] hits [H] in the eye!")) - H.adjust_blurriness(6) + H.adjust_eye_blur(6) eyes.applyOrganDamage(rand(6,8)) H.Paralyze(40) H.emote("scream") diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm index 58234a8a9001..6c3538abcff4 100644 --- a/code/modules/projectiles/projectile/special/hallucination.dm +++ b/code/modules/projectiles/projectile/special/hallucination.dm @@ -152,7 +152,7 @@ /obj/projectile/hallucination/laser/hal_apply_effect() hal_target.adjustStaminaLoss(20) - hal_target.blur_eyes(2) + hal_target.adjust_eye_blur(2) /obj/projectile/hallucination/taser name = "electrode" diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 207e13497cf6..ccde5791f095 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -2383,7 +2383,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/inocybeshine/on_mob_life(mob/living/carbon/M) if(prob(10)) M.adjustStaminaLoss(10,0) - M.blur_eyes(3) + M.adjust_eye_blur(3) M.adjust_disgust(1) . = TRUE return ..() diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 2f8cd7d85297..3669ab2062c8 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -59,7 +59,7 @@ glass_desc = "It's just like a carrot but without crunching." /datum/reagent/consumable/carrotjuice/on_mob_life(mob/living/carbon/M) - M.adjust_blurriness(-1) + M.adjust_eye_blur(-1) M.adjust_blindness(-1) switch(current_cycle) if(1 to 20) @@ -1116,4 +1116,4 @@ taste_description = "citrus soda with cucumber" glass_icon_state = "cucumber_lemonade" glass_name = "cucumber lemonade" - glass_desc = "Lemonade, with added cucumber." \ No newline at end of file + glass_desc = "Lemonade, with added cucumber." diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 8e67b9a4c82f..c3b6234f5007 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -317,7 +317,7 @@ else if ( mouth_covered ) // Reduced effects if partially protected if(prob(50)) victim.emote("scream") - victim.blur_eyes(14) + victim.adjust_eye_blur(14) victim.blind_eyes(10) victim.set_confusion_if_lower(10 SECONDS) victim.damageoverlaytemp = 75 @@ -327,7 +327,7 @@ else if ( eyes_covered ) // Eye cover is better than mouth cover if(prob(20)) victim.emote("cough") - victim.blur_eyes(4) + victim.adjust_eye_blur(4) victim.set_confusion_if_lower(5 SECONDS) victim.damageoverlaytemp = 50 M.adjustStaminaLoss(3) @@ -335,7 +335,7 @@ else // Oh dear :D if(prob(60)) victim.emote("scream") - victim.blur_eyes(14) + victim.adjust_eye_blur(14) victim.blind_eyes(10) victim.set_confusion_if_lower(12 SECONDS) victim.damageoverlaytemp = 100 @@ -638,13 +638,13 @@ if(!M.eye_blurry) to_chat(M, "Tears well up in your eyes!") M.blind_eyes(2) - M.blur_eyes(5) + M.adjust_eye_blur(5) return ..() /datum/reagent/consumable/tearjuice/on_mob_life(mob/living/carbon/M) ..() if(M.eye_blurry) //Don't worsen vision if it was otherwise fine - M.blur_eyes(4) + M.adjust_eye_blur(4) if(prob(10)) to_chat(M, "Your eyes sting!") M.blind_eyes(2) @@ -680,7 +680,7 @@ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM, 150) M.adjustToxLoss(3*REM,0) M.adjustStaminaLoss(10*REM,0) - M.blur_eyes(5) + M.adjust_eye_blur(5) . = TRUE ..() @@ -942,3 +942,7 @@ nutriment_factor = 15 * REAGENTS_METABOLISM color = "#D9A066" // rgb: 217, 160, 102 taste_description = "peanuts" + +/// Gets just how much nutrition this reagent is worth for the passed mob +/datum/reagent/consumable/proc/get_nutriment_factor(mob/living/carbon/eater) + return nutriment_factor * REAGENTS_METABOLISM * 2 diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 24d73f8a1047..fa18ac543c5b 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -46,7 +46,7 @@ M.adjustToxLoss(-5, 0, TRUE) M.remove_status_effect(/datum/status_effect/hallucination) REMOVE_TRAITS_NOT_IN(M, list(SPECIES_TRAIT, ROUNDSTART_TRAIT, ORGAN_TRAIT)) - M.set_blurriness(0) + M.set_eye_blur(0) M.set_blindness(0) M.SetKnockdown(0, FALSE) M.SetStun(0, FALSE) @@ -821,15 +821,15 @@ to_chat(M, span_warning("Your vision slowly returns...")) M.cure_blind(EYE_DAMAGE) M.cure_nearsighted(EYE_DAMAGE) - M.blur_eyes(35) + M.adjust_eye_blur(35) else if(HAS_TRAIT_FROM(M, TRAIT_NEARSIGHT, EYE_DAMAGE)) to_chat(M, span_warning("The blackness in your peripheral vision fades.")) M.cure_nearsighted(EYE_DAMAGE) - M.blur_eyes(10) + M.adjust_eye_blur(10) else if(M.eye_blind || M.eye_blurry) M.set_blindness(0) - M.set_blurriness(0) + M.set_eye_blur(0) ..() /datum/reagent/medicine/atropine diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 7ce23f0c061f..26ed4a61e979 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -305,7 +305,7 @@ /datum/reagent/toxin/spore/on_mob_life(mob/living/carbon/C) C.damageoverlaytemp = 60 C.update_damage_hud() - C.blur_eyes(3) + C.adjust_eye_blur(3) return ..() /datum/reagent/toxin/spore_burning @@ -470,7 +470,7 @@ switch(pick(1, 2, 3, 4)) if(1) to_chat(M, span_danger("You can barely see!")) - M.blur_eyes(3) + M.adjust_eye_blur(3) if(2) M.emote("cough") if(3) diff --git a/code/modules/spells/spell_types/hivemind.dm b/code/modules/spells/spell_types/hivemind.dm index f1fd17b6b7d5..f8222acbeeb2 100644 --- a/code/modules/spells/spell_types/hivemind.dm +++ b/code/modules/spells/spell_types/hivemind.dm @@ -212,7 +212,7 @@ if(!hive.is_carbon_member(target)) power *= 0.5 target.blind_eyes(4*power) - target.blur_eyes(30*power) + target.adjust_eye_blur(30*power) target.minimumDeafTicks(15*power) //equivalent to 30s deafness max target.adjust_jitter(power SECONDS) target.silent += 10*power diff --git a/code/modules/spells/spell_types/pointed/blind.dm b/code/modules/spells/spell_types/pointed/blind.dm index f4c9b9c0958a..ba3bfbd87ba7 100644 --- a/code/modules/spells/spell_types/pointed/blind.dm +++ b/code/modules/spells/spell_types/pointed/blind.dm @@ -39,5 +39,5 @@ to_chat(cast_on, span_warning("Your eyes cry out in pain!")) cast_on.adjust_blindness(eye_blind_duration) - cast_on.blur_eyes(eye_blur_duration) + cast_on.adjust_eye_blur(eye_blur_duration) return TRUE diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index 9cfb874c4b65..94d02d6901fd 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -49,7 +49,7 @@ target.cure_blind(list(EYE_DAMAGE)) target.set_blindness(0) target.cure_nearsighted(list(EYE_DAMAGE)) - target.blur_eyes(35) //this will fix itself slowly. + target.adjust_eye_blur(35) //this will fix itself slowly. E.setOrganDamage(0) return TRUE diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 6c7d7c292465..48188b6399bc 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -348,7 +348,7 @@ if(EMP_HEAVY) owner.set_drugginess(40) owner.adjust_hallucinations(500 SECONDS) - owner.blur_eyes(20) + owner.adjust_eye_blur(20) owner.adjust_dizzy(10 SECONDS) time_on += 10 owner.adjustFireLoss(10) @@ -356,7 +356,7 @@ if(EMP_LIGHT) owner.set_drugginess(20) owner.adjust_hallucinations(200 SECONDS) - owner.blur_eyes(10) + owner.adjust_eye_blur(10) owner.adjust_dizzy(5 SECONDS) time_on += 5 owner.adjustFireLoss(5) diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index a043d0794bef..db6dab5339f3 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -55,7 +55,7 @@ HMN.update_body() M.cure_blind(list(EYE_DAMAGE)) // can't be blind from eye damage if there's no eye to be damaged, still blind from not having eyes though M.cure_nearsighted(list(EYE_DAMAGE)) // likewise for nearsightedness - M.set_blurriness(0) // no eyes to blur + M.set_eye_blur(0) // no eyes to blur M.update_tint() M.update_sight() @@ -201,7 +201,7 @@ to_chat(owner, span_danger("your eyes overload and blind you!")) owner.flash_act(override_blindness_check = 1) owner.blind_eyes(5) - owner.blur_eyes(8) + owner.adjust_eye_blur(8) eyes.applyOrganDamage(20 / severity) /obj/item/organ/eyes/robotic/xray diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index b46391ae3c4f..b2572da28bf1 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -63,7 +63,7 @@ H.adjust_dizzy(5 SECONDS) if(H.disgust >= DISGUST_LEVEL_DISGUSTED) if(prob(25)) - H.blur_eyes(3) //We need to add more shit down here + H.adjust_eye_blur(3) //We need to add more shit down here H.adjust_disgust(-0.5 * disgust_metabolism) switch(H.disgust) diff --git a/yogstation.dme b/yogstation.dme index dd062cd59f21..e05d5c5526c2 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -143,6 +143,7 @@ #include "code\__DEFINES\wounds.dm" #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" +#include "code\__DEFINES\dcs\signals\mapping.dm" #include "code\__DEFINES\dcs\signals\signal_species.dm" #include "code\__DEFINES\dcs\signals\signals_action.dm" #include "code\__DEFINES\dcs\signals\signals_area.dm" @@ -313,8 +314,12 @@ #include "code\_onclick\hud\parallax.dm" #include "code\_onclick\hud\picture_in_picture.dm" #include "code\_onclick\hud\plane_master.dm" +#include "code\_onclick\hud\plane_master_controller.dm" +#include "code\_onclick\hud\plane_master_group.dm" +#include "code\_onclick\hud\plane_master_subtypes.dm" #include "code\_onclick\hud\radial.dm" #include "code\_onclick\hud\radial_persistent.dm" +#include "code\_onclick\hud\render_plate.dm" #include "code\_onclick\hud\revenanthud.dm" #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" @@ -522,6 +527,7 @@ #include "code\datums\components\gunpoint.dm" #include "code\datums\components\heal_react.dm" #include "code\datums\components\heirloom.dm" +#include "code\datums\components\hide_highest_offset.dm" #include "code\datums\components\hot_ice.dm" #include "code\datums\components\ice_walk.dm" #include "code\datums\components\igniter.dm" @@ -773,6 +779,7 @@ #include "code\datums\status_effects\debuffs\jitteriness.dm" #include "code\datums\status_effects\debuffs\knuckleroot.dm" #include "code\datums\status_effects\debuffs\red_eye.dm" +#include "code\datums\status_effects\debuffs\screen_blur.dm" #include "code\datums\status_effects\debuffs\silenced.dm" #include "code\datums\status_effects\debuffs\speech_debuffs.dm" #include "code\datums\traits\_quirk.dm" @@ -2097,6 +2104,7 @@ #include "code\modules\client\client_defines.dm" #include "code\modules\client\client_procs.dm" #include "code\modules\client\message.dm" +#include "code\modules\client\multiz_parallax.dm" #include "code\modules\client\player_details.dm" #include "code\modules\client\preferences.dm" #include "code\modules\client\preferences_menu.dm" @@ -2879,7 +2887,6 @@ #include "code\modules\mob\living\simple_animal\parrot.dm" #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" -#include "code\modules\mob\living\simple_animal\status_procs.dm" #include "code\modules\mob\living\simple_animal\bot\atmosbot.dm" #include "code\modules\mob\living\simple_animal\bot\bot.dm" #include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" diff --git a/yogstation/code/datums/martial/explosive_fist.dm b/yogstation/code/datums/martial/explosive_fist.dm index bd2d3b791f14..2d400f84bbfd 100644 --- a/yogstation/code/datums/martial/explosive_fist.dm +++ b/yogstation/code/datums/martial/explosive_fist.dm @@ -366,7 +366,7 @@ var/armor_block = D.run_armor_check(hed, BOMB) D.apply_damage(A.get_punchdamagehigh() + 3, BURN, BODY_ZONE_HEAD, armor_block) //10 burn (vs bomb armor) D.emote("scream") - D.blur_eyes(4) + D.adjust_eye_blur(4) A.apply_damage(10, BURN, BODY_ZONE_CHEST, 0) //Take some unblockable damage since you're using your inner flame or something diff --git a/yogstation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm b/yogstation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm index 9f12c8ccc5a8..20c405f410d9 100644 --- a/yogstation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm +++ b/yogstation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm @@ -242,7 +242,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) switch(stage) if(STAGE_HAUNT) if(prob(5)) - H.blur_eyes(1) + H.adjust_eye_blur(1) if(prob(5)) H.playsound_local(src,'yogstation/sound/voice/cluwnelaugh2_reversed.ogg', 1) @@ -421,7 +421,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) H.invisibility = initial(H.invisibility) H.density = initial(H.density) H.anchored = initial(H.anchored) - H.blur_eyes(10) + H.adjust_eye_blur(10) animate(H.client,color = old_color, time = 2 SECONDS) eating = FALSE From 47bf5e5c6c96a3b7aa1e1b9869641d4aac0e3631 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 09:23:44 -0500 Subject: [PATCH 007/281] yea yea --- code/__DEFINES/misc.dm | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 0ae3833d57f3..6c09f9fd4a86 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -423,8 +423,14 @@ GLOBAL_LIST_INIT(donor_pdas, list(PDA_COLOR_NORMAL, PDA_COLOR_TRANSPARENT, PDA_C // Used by PDA and cartridge code to reduce repetitiveness of spritesheets #define PDAIMG(what) {""} +#define NEGATIVE_GRAVITY -1 + #define STANDARD_GRAVITY 1 //Anything above this is high gravity, anything below no grav #define GRAVITY_DAMAGE_TRESHOLD 3 //Starting with this value gravity will start to damage mobs +/// The scaling factor for high gravity damage. +#define GRAVITY_DAMAGE_SCALING 3.5 +/// The maximum [BRUTE] damage a mob can take from high gravity per second. +#define GRAVITY_DAMAGE_MAXIMUM 4.5 #define CAMERA_NO_GHOSTS 0 #define CAMERA_SEE_GHOSTS_BASIC 1 @@ -482,32 +488,5 @@ GLOBAL_LIST_INIT(donor_pdas, list(PDA_COLOR_NORMAL, PDA_COLOR_TRANSPARENT, PDA_C /// 6 pixels to the right, zero tiles & 5 pixels DOWN. #define ui_sunlight_display "WEST:6,CENTER-0:0" -//singularity defines -/// Singularity is stage 1 (1x1) -#define STAGE_ONE 1 -/// Singularity is stage 2 (3x3) -#define STAGE_TWO 3 -/// Singularity is stage 3 (5x5) -#define STAGE_THREE 5 -/// Singularity is stage 4 (7x7) -#define STAGE_FOUR 7 -/// Singularity is stage 5 (9x9) -#define STAGE_FIVE 9 -/// Singularity is stage 6 (11x11) -#define STAGE_SIX 11 //From supermatter shard -/** - * The point where gravity is negative enough to pull you upwards. - * That means walking checks for a ceiling instead of a floor, and you can fall "upwards" - * - * This should only be possible on multi-z maps because it works like shit on maps that aren't. - */ -#define NEGATIVE_GRAVITY -1 -#define STANDARD_GRAVITY 1 //Anything above this is high gravity, anything below no grav until negative gravity -/// The gravity strength threshold for high gravity damage. -#define GRAVITY_DAMAGE_THRESHOLD 3 -/// The scaling factor for high gravity damage. -#define GRAVITY_DAMAGE_SCALING 0.5 -/// The maximum [BRUTE] damage a mob can take from high gravity per second. -#define GRAVITY_DAMAGE_MAXIMUM 1.5 From 1a6eae0fc7f32c2f88d1271a5109bc4513fb152f Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 09:26:07 -0500 Subject: [PATCH 008/281] ywa ea --- code/__DEFINES/layers.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 0c78ecdc9740..feb7c65a2636 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -222,12 +222,6 @@ #define RENDER_PLANE_GAME 100 #define RENDER_PLANE_NON_GAME 101 -///Slightly above the game plane but does not catch mouse clicks. Useful for certain visuals that should be clicked through, like seethrough trees -#define SEETHROUGH_PLANE -3 -#define ABOVE_GAME_PLANE -2 - -#define RENDER_PLANE_GAME_WORLD -1 - #define DEFAULT_PLANE 0 //Marks out the default plane, even if we don't use it #define AREA_PLANE 2 From ce088701eccd880751886731cd1f32abbc3bec2d Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 09:27:58 -0500 Subject: [PATCH 009/281] we're gonna have to redo this arent we fuck me --- code/__DEFINES/layers.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index feb7c65a2636..9b6b8ab8b294 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -169,9 +169,6 @@ ///Pipecrawling images #define PIPECRAWL_IMAGES_PLANE 20 -///AI Camera Static -#define CAMERA_STATIC_PLANE 21 - ///Anything that wants to be part of the game plane, but also wants to draw above literally everything else #define HIGH_GAME_PLANE 22 @@ -184,7 +181,6 @@ //HUD layer defines -#define FULLSCREEN_PLANE 20 #define FLASH_LAYER 20 #define FULLSCREEN_LAYER 20.1 #define UI_DAMAGE_LAYER 20.2 From 2878993f312c3eb8b69c184d8cf71c58e38791bd Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 09:43:05 -0500 Subject: [PATCH 010/281] yea yea --- code/__DEFINES/sight.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm index 97fc5aed3fb5..7952d9addd21 100644 --- a/code/__DEFINES/sight.dm +++ b/code/__DEFINES/sight.dm @@ -33,7 +33,3 @@ /// Bitfield of sight flags that show THINGS but no lighting /// Since lighting is an underlay on turfs, this is everything but that #define SEE_AVOID_TURF_BLACKNESS (SEE_MOBS|SEE_OBJS) - -#define VISOR_TINT (1<<1) -#define VISOR_VISIONFLAGS (1<<2) //all following flags only matter for glasses -#define VISOR_DARKNESSVIEW (1<<3) From 35f76b66ca177bd298ea99420478d2168a0fd6a7 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 09:43:49 -0500 Subject: [PATCH 011/281] this too me idiot --- code/__DEFINES/dcs/signals/signals_mob/signals_living.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm index 468c7e4ad071..9ae610b43222 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm @@ -38,8 +38,6 @@ #define COMSIG_LIVING_SET_BODY_POSITION "living_set_body_position" ///From post-can inject check of syringe after attack (mob/user) #define COMSIG_LIVING_TRY_SYRINGE "living_try_syringe" -///From living/Life(seconds_per_tick = SSMOBS_DT, times_fired). (deltatime, times_fired) -#define COMSIG_LIVING_LIFE "living_life" ///From living/set_resting(): (new_resting, silent, instant) #define COMSIG_LIVING_RESTING "living_resting" From 9787e1b4eb60a361addd35f1b2e1b27f620d6210 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 12:41:55 -0500 Subject: [PATCH 012/281] fucks up everything again --- code/__DEFINES/layers.dm | 395 +++++++++++------- code/__DEFINES/traits.dm | 7 + code/_onclick/hud/blob_overmind.dm | 3 +- code/_onclick/hud/credits.dm | 2 +- code/_onclick/hud/devil.dm | 4 +- code/_onclick/hud/fullscreen.dm | 6 +- code/_onclick/hud/radial.dm | 4 +- code/_onclick/hud/robot.dm | 3 +- code/_onclick/hud/screen_objects.dm | 10 - code/_onclick/telekinesis.dm | 1 - code/datums/chatmessage.dm | 9 + code/datums/cinematic.dm | 1 - code/datums/components/storage/storage.dm | 3 - code/datums/mutations/olfaction.dm | 3 +- code/datums/weather/weather.dm | 2 +- code/game/area/areas.dm | 2 +- code/game/machinery/airlock_cycle_control.dm | 2 +- code/game/machinery/navbeacon.dm | 2 +- code/game/objects/effects/countdown.dm | 4 +- code/game/objects/effects/landmarks.dm | 11 +- code/game/objects/effects/misc.dm | 2 +- code/game/objects/effects/overlays.dm | 1 - .../effects/temporary_visuals/clockcult.dm | 2 +- .../temporary_visuals/projectiles/tracer.dm | 1 - code/game/objects/structures/wire_splicing.dm | 2 +- code/game/turfs/openspace/openspace.dm | 20 +- code/game/turfs/turf.dm | 3 + .../clock_effects/general_markers.dm | 2 +- .../antagonists/clockcult/clock_structure.dm | 2 +- .../antagonists/cult/cult_structures.dm | 4 +- .../antagonists/devil/true_devil/inventory.dm | 2 - code/modules/antagonists/revenant/revenant.dm | 2 +- .../components/binary_devices/circulator.dm | 10 +- .../components/unary_devices/vent_pump.dm | 2 - .../components/unary_devices/vent_scrubber.dm | 2 - .../atmospherics/machinery/other/meter.dm | 2 +- code/modules/buildmode/buttons.dm | 3 +- .../clothing/glasses/engine_goggles.dm | 1 - code/modules/flufftext/Hallucination.dm | 1 - code/modules/food_and_drinks/plate.dm | 4 +- code/modules/mapping/mapping_helpers.dm | 2 +- code/modules/mining/ores_coins.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 2 +- code/modules/mob/inventory.dm | 1 - code/modules/mob/living/carbon/inventory.dm | 1 - .../living/silicon/ai/freelook/cameranet.dm | 1 - .../mob/living/silicon/robot/inventory.dm | 1 - .../modules/mob/living/silicon/robot/robot.dm | 1 - .../simple_animal/friendly/drone/inventory.dm | 1 - .../friendly/drone/visuals_icons.dm | 2 - .../simple_animal/hostile/jungle/seedling.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 2 - code/modules/mob/living/ventcrawling.dm | 1 - code/modules/point/point.dm | 2 +- code/modules/power/generator.dm | 2 +- code/modules/power/singularity/singularity.dm | 2 +- .../shuttle_creation/shuttle_creator_eye.dm | 2 +- .../spells/spell_types/jaunt/wirecrawl.dm | 2 - code/modules/swarmers/swarmer_objs.dm | 2 +- .../code/datums/status_effects/neutral.dm | 2 - .../guardian/abilities/special/pocket.dm | 2 +- yogstation/code/modules/guardian/guardian.dm | 16 +- .../code/modules/mining/lavaland/bloodbook.dm | 8 +- yogstation/code/modules/spacepods/spacepod.dm | 2 +- 64 files changed, 336 insertions(+), 267 deletions(-) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 9b6b8ab8b294..8bb03d1c38e4 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -4,203 +4,318 @@ //NEVER HAVE ANYTHING BELOW THIS PLANE ADJUST IF YOU NEED MORE SPACE #define LOWEST_EVER_PLANE -100 -#define CLICKCATCHER_PLANE -99 - -#define FIELD_OF_VISION_BLOCKER_PLANE -96 +#define FIELD_OF_VISION_BLOCKER_PLANE -90 #define FIELD_OF_VISION_BLOCKER_RENDER_TARGET "*FIELD_OF_VISION_BLOCKER_RENDER_TARGET" -#define PLANE_SPACE -95 -#define PLANE_SPACE_RENDER_TARGET "PLANE_SPACE" -#define PLANE_SPACE_PARALLAX -90 -#define PLANE_SPACE_PARALLAX_RENDER_TARGET "PLANE_SPACE_PARALLAX" +#define CLICKCATCHER_PLANE -80 -#define GRAVITY_PULSE_PLANE -89 -#define GRAVITY_PULSE_RENDER_TARGET "*GRAVPULSE_RENDER_TARGET" +#define PLANE_SPACE -25 +#define PLANE_SPACE_PARALLAX -20 -#define SINGULARITY_EFFECT_PLANE -80 +#define SINGULARITY_EFFECT_PLANE -15 #define SINGULARITY_RENDER_TARGET "*SINGULARITY_EFFECTS_PLANE" +#define GRAVITY_PULSE_PLANE -13 +#define GRAVITY_PULSE_RENDER_TARGET "*GRAVPULSE_RENDER_TARGET" + #define RENDER_PLANE_TRANSPARENT -12 //Transparent plane that shows openspace underneath the floor + #define TRANSPARENT_FLOOR_PLANE -11 + #define FLOOR_PLANE -10 -#define FLOOR_PLANE_RENDER_TARGET "FLOOR_PLANE" + #define WALL_PLANE -9 -#define GAME_PLANE_FOV_HIDDEN -8 -#define GAME_PLANE_UPPER -7 -#define GAME_PLANE -6 -#define GAME_PLANE_RENDER_TARGET "GAME_PLANE" +#define GAME_PLANE -8 +#define GAME_PLANE_FOV_HIDDEN -7 +#define GAME_PLANE_UPPER -6 #define WALL_PLANE_UPPER -5 #define GAME_PLANE_UPPER_FOV_HIDDEN -4 + ///Slightly above the game plane but does not catch mouse clicks. Useful for certain visuals that should be clicked through, like seethrough trees #define SEETHROUGH_PLANE -3 #define ABOVE_GAME_PLANE -2 #define RENDER_PLANE_GAME_WORLD -1 -#define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals -#define BLACKNESS_PLANE_RENDER_TARGET "BLACKNESS_PLANE" +#define DEFAULT_PLANE 0 //Marks out the default plane, even if we don't use it + +#define AREA_PLANE 2 +#define MASSIVE_OBJ_PLANE 3 +#define GHOST_PLANE 4 +#define POINT_PLANE 5 + +//---------- LIGHTING ------------- +///Normal 1 per turf dynamic lighting underlays +#define LIGHTING_PLANE 10 + +///Lighting objects that are "free floating" +#define O_LIGHTING_VISUAL_PLANE 11 +#define O_LIGHTING_VISUAL_RENDER_TARGET "O_LIGHT_VISUAL_PLANE" + +#define EMISSIVE_PLANE 13 +/// This plane masks out lighting to create an "emissive" effect, ie for glowing lights in otherwise dark areas. +#define EMISSIVE_RENDER_PLATE 14 +#define EMISSIVE_RENDER_TARGET "*EMISSIVE_PLANE" +// Ensures all the render targets that point at the emissive plate layer correctly +#define EMISSIVE_Z_BELOW_LAYER 1 +#define EMISSIVE_FLOOR_LAYER 2 +#define EMISSIVE_SPACE_LAYER 3 +#define EMISSIVE_WALL_LAYER 4 + +#define RENDER_PLANE_LIGHTING 15 + +/// Masks the lighting plane with turfs, so we never light up the void +/// Failing that, masks emissives and the overlay lighting plane +#define LIGHT_MASK_PLANE 16 +#define LIGHT_MASK_RENDER_TARGET "*LIGHT_MASK_PLANE" + +///Things that should render ignoring lighting +#define ABOVE_LIGHTING_PLANE 17 + +///---------------- MISC ----------------------- + +///Pipecrawling images +#define PIPECRAWL_IMAGES_PLANE 20 + +///AI Camera Static +#define CAMERA_STATIC_PLANE 21 + +///Anything that wants to be part of the game plane, but also wants to draw above literally everything else +#define HIGH_GAME_PLANE 22 + +#define FULLSCREEN_PLANE 23 + +///--------------- FULLSCREEN RUNECHAT BUBBLES ------------ + +///Popup Chat Messages +#define RUNECHAT_PLANE 30 +/// Plane for balloon text (text that fades up) +#define BALLOON_CHAT_PLANE 31 + +//-------------------- HUD --------------------- +//HUD layer defines +#define HUD_PLANE 40 +#define ABOVE_HUD_PLANE 41 + +///Plane of the "splash" icon used that shows on the lobby screen +#define SPLASHSCREEN_PLANE 50 + +// The largest plane here must still be less than RENDER_PLANE_GAME + +//-------------------- Rendering --------------------- +#define RENDER_PLANE_GAME 100 +#define RENDER_PLANE_NON_GAME 101 + +// Only VERY special planes should be here, as they are above not just the game, but the UI planes as well. + +/// Plane related to the menu when pressing Escape. +/// Needed so that we can apply a blur effect to EVERYTHING, and guarantee we are above all UI. +#define ESCAPE_MENU_PLANE 105 + +#define RENDER_PLANE_MASTER 110 + +// Lummox I swear to god I will find you +// NOTE! You can only ever have planes greater then -10000, if you add too many with large offsets you will brick multiz +// Same can be said for large multiz maps. Tread carefully mappers +#define HIGHEST_EVER_PLANE RENDER_PLANE_MASTER +/// The range unique planes can be in +#define PLANE_RANGE (HIGHEST_EVER_PLANE - LOWEST_EVER_PLANE) + +// PLANE_SPACE layer(s) #define SPACE_LAYER 1.8 -//#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define + +//#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define. Most floors (FLOOR_PLANE) and walls (WALL_PLANE) use this. + +//FLOOR_PLANE layers +#define TURF_PLATING_DECAL_LAYER 2.001 +#define TURF_DECAL_LAYER 2.009 //Makes turf decals appear in DM how they will look inworld. +#define CULT_OVERLAY_LAYER 2.01 #define MID_TURF_LAYER 2.02 #define HIGH_TURF_LAYER 2.03 -#define TURF_PLATING_DECAL_LAYER 2.031 -#define TURF_DECAL_LAYER 2.039 //Makes turf decals appear in DM how they will look inworld. -#define ABOVE_OPEN_TURF_LAYER 2.04 +#define LATTICE_LAYER 2.04 +#define DISPOSAL_PIPE_LAYER 2.042 +#define WIRE_LAYER 2.044 +#define GLASS_FLOOR_LAYER 2.046 +#define TRAM_RAIL_LAYER 2.047 +#define ABOVE_OPEN_TURF_LAYER 2.049 + +//WALL_PLANE layers #define CLOSED_TURF_LAYER 2.05 + +// GAME_PLANE layers #define BULLET_HOLE_LAYER 2.06 #define ABOVE_NORMAL_TURF_LAYER 2.08 -#define LATTICE_LAYER 2.2 -#define DISPOSAL_PIPE_LAYER 2.25 #define GAS_PIPE_HIDDEN_LAYER 2.35 //layer = initial(layer) + piping_layer / 1000 in atmospherics/update_icon() to determine order of pipe overlap -#define WIRE_LAYER 2.4 +#define WIRE_BRIDGE_LAYER 2.44 #define WIRE_TERMINAL_LAYER 2.45 -#define UNDER_CATWALK 2.454 -#define CATWALK_LAYER 2.455 -#define GAS_SCRUBBER_LAYER 2.46 +#define GAS_SCRUBBER_LAYER 2.46 #define GAS_PIPE_VISIBLE_LAYER 2.47 //layer = initial(layer) + piping_layer / 1000 in atmospherics/update_icon() to determine order of pipe overlap #define GAS_FILTER_LAYER 2.48 #define GAS_PUMP_LAYER 2.49 +#define PLUMBING_PIPE_VISIBILE_LAYER 2.495//layer = initial(layer) + ducting_layer / 3333 in atmospherics/handle_layer() to determine order of duct overlap +#define BOT_PATH_LAYER 2.497 #define LOW_OBJ_LAYER 2.5 +///catwalk overlay of /turf/open/floor/plating/catwalk_floor +#define CATWALK_LAYER 2.51 #define LOW_SIGIL_LAYER 2.52 -#define SIGIL_LAYER 2.54 -#define HIGH_SIGIL_LAYER 2.56 +#define SIGIL_LAYER 2.53 +#define HIGH_SIGIL_LAYER 2.54 +#define HIGH_PIPE_LAYER 2.55 +// Anything above this layer is not "on" a turf for the purposes of washing +// I hate this life of ours +#define FLOOR_CLEAN_LAYER 2.56 +#define TRAM_STRUCTURE_LAYER 2.57 +#define TRAM_FLOOR_LAYER 2.58 +#define TRAM_WALL_LAYER 2.59 + #define BELOW_OPEN_DOOR_LAYER 2.6 -#define GAS_METER_LAYER 2.61 +///Anything below this layer is to be considered completely (visually) under water by the immerse layer. +#define WATER_LEVEL_LAYER 2.61 #define BLASTDOOR_LAYER 2.65 #define OPEN_DOOR_LAYER 2.7 -#define DOOR_HELPER_LAYER 2.71 //keep this above OPEN_DOOR_LAYER +#define DOOR_ACCESS_HELPER_LAYER 2.71 //keep this above OPEN_DOOR_LAYER, special layer used for /obj/effect/mapping_helpers/airlock/access +#define DOOR_HELPER_LAYER 2.72 //keep this above DOOR_ACCESS_HELPER_LAYER and OPEN_DOOR_LAYER since the others tend to have tiny sprites that tend to be covered up. #define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible #define TABLE_LAYER 2.8 +#define GATEWAY_UNDERLAY_LAYER 2.85 #define BELOW_OBJ_LAYER 2.9 #define LOW_ITEM_LAYER 2.95 //#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define -#define CLOSED_BLASTDOOR_LAYER 3.05 #define CLOSED_DOOR_LAYER 3.1 #define CLOSED_FIREDOOR_LAYER 3.11 -#define SHUTTER_LAYER 3.12 // HERE BE DRAGONS #define ABOVE_OBJ_LAYER 3.2 +#define CLOSED_BLASTDOOR_LAYER 3.3 // ABOVE WINDOWS AND DOORS +#define SHUTTER_LAYER 3.3 // HERE BE DRAGONS #define ABOVE_WINDOW_LAYER 3.3 #define SIGN_LAYER 3.4 +#define CORGI_ASS_PIN_LAYER 3.41 #define NOT_HIGH_OBJ_LAYER 3.5 #define HIGH_OBJ_LAYER 3.6 - #define BELOW_MOB_LAYER 3.7 + +// GAME_PLANE_FOV_HIDDEN layers +#define LOW_MOB_LAYER 3.75 #define LYING_MOB_LAYER 3.8 -#define SPACEPOD_LAYER 3.9 // yogs +#define VEHICLE_LAYER 3.9 +#define MOB_BELOW_PIGGYBACK_LAYER 3.94 //#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define +#define MOB_SHIELD_LAYER 4.01 +#define MOB_ABOVE_PIGGYBACK_LAYER 4.06 +#define MOB_UPPER_LAYER 4.07 +#define HITSCAN_PROJECTILE_LAYER 4.09 //above all mob but still hidden by FoV + +// GAME_PLANE_UPPER layers #define ABOVE_MOB_LAYER 4.1 #define WALL_OBJ_LAYER 4.25 +#define TRAM_SIGNAL_LAYER 4.26 +// WALL_PLANE_UPPER layers #define EDGED_TURF_LAYER 4.3 #define ON_EDGED_TURF_LAYER 4.35 -#define LARGE_MOB_LAYER 4.4 -#define ABOVE_ALL_MOB_LAYER 4.5 -#define SPACEVINE_LAYER 4.8 -#define SPACEVINE_MOB_LAYER 4.9 +// GAME_PLANE_UPPER_FOV_HIDDEN layers +#define SPACEVINE_LAYER 4.4 +#define LARGE_MOB_LAYER 4.5 +#define SPACEVINE_MOB_LAYER 4.6 + +// Intermediate layer used by both GAME_PLANE_FOV_HIDDEN and ABOVE_GAME_PLANE +#define ABOVE_ALL_MOB_LAYER 4.7 + +// ABOVE_GAME_PLANE layers +#define NAVIGATION_EYE_LAYER 4.9 //#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define #define GASFIRE_LAYER 5.05 #define RIPPLE_LAYER 5.1 -#define GHOST_LAYER 6 -#define LOW_LANDMARK_LAYER 9 -#define MID_LANDMARK_LAYER 9.1 -#define HIGH_LANDMARK_LAYER 9.2 -#define AREA_LAYER 10 -#define MASSIVE_OBJ_LAYER 11 -#define POINT_LAYER 12 +/** + * The layer of the visual overlay used in the submerge element. + * The vis overlay inherits the planes of the movables it's attached to (that also have KEEP_TOGETHER added) + * We just have to make sure the visual overlay is rendered above all the other overlays of those movables. + */ +#define WATER_VISUAL_OVERLAY_LAYER 1000 + +//---------- LIGHTING ------------- + +// LIGHTING_PLANE layers +// The layer of turf underlays starts at 0.01 and goes up by 0.01 +// Based off the z level. No I do not remember why, should check that +/// Typically overlays, that "hide" portions of the turf underlay layer +/// I'm allotting 100 z levels before this breaks. That'll never happen +/// --Lemon +#define LIGHTING_MASK_LAYER 10 +/// Misc things that draw on the turf lighting plane +/// Space, solar beams, etc +#define LIGHTING_PRIMARY_LAYER 15 +/// Stuff that needs to draw above everything else on this plane +#define LIGHTING_ABOVE_ALL 20 + + +//---------- EMISSIVES ------------- +//Layering order of these is not particularly meaningful. +//Important part is the seperation of the planes for control via plane_master #define EMISSIVE_BLOCKER_PLANE 12 #define EMISSIVE_BLOCKER_LAYER 12 #define EMISSIVE_BLOCKER_RENDER_TARGET "*EMISSIVE_BLOCKER_PLANE" -#define CHAT_LAYER 12.0001 // Do not insert layers between these two values -#define CHAT_LAYER_MAX 12.9999 +/// The layer you should use if you _really_ don't want an emissive overlay to be blocked. +#define EMISSIVE_LAYER_UNBLOCKABLE 9999 -#define EMISSIVE_PLANE 13 -#define EMISSIVE_LAYER 13 - -/// This plane masks out lighting to create an "emissive" effect, ie for glowing lights in otherwise dark areas. -#define EMISSIVE_RENDER_PLATE 14 -#define EMISSIVE_RENDER_TARGET "*EMISSIVE_PLANE" - -// Ensures all the render targets that point at the emissive plate layer correctly -#define EMISSIVE_Z_BELOW_LAYER 1 -#define EMISSIVE_FLOOR_LAYER 2 -#define EMISSIVE_SPACE_LAYER 3 -#define EMISSIVE_WALL_LAYER 4 - -#define EMISSIVE_UNBLOCKABLE_PLANE 14 -#define EMISSIVE_UNBLOCKABLE_LAYER 14 -#define EMISSIVE_UNBLOCKABLE_RENDER_TARGET "*EMISSIVE_UNBLOCKABLE_PLANE" - -#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 16 -#define O_LIGHTING_VISUAL_LAYER 16 -#define O_LIGHTING_VISUAL_RENDER_TARGET "O_LIGHT_VISUAL_PLANE" - -#define RENDER_PLANE_LIGHTING 15 -/// Masks the lighting plane with turfs, so we never light up the void -/// Failing that, masks emissives and the overlay lighting plane -#define LIGHT_MASK_PLANE 16 -#define LIGHT_MASK_RENDER_TARGET "*LIGHT_MASK_PLANE" - -#define ABOVE_LIGHTING_PLANE 200 //things that should render ignoring lightning -#define ABOVE_LIGHTING_LAYER 17 -#define ABOVE_LIGHTING_RENDER_TARGET "ABOVE_LIGHTING_PLANE" +///--------------- FULLSCREEN IMAGES ------------ -#define FLOOR_OPENSPACE_PLANE 17 -#define OPENSPACE_LAYER 17 +#define FLASH_LAYER 1 +#define FULLSCREEN_LAYER 2 +#define UI_DAMAGE_LAYER 3 +#define BLIND_LAYER 4 +#define CRIT_LAYER 5 +#define CURSE_LAYER 6 +#define ECHO_LAYER 7 +#define PARRY_LAYER 8 -#define BYOND_LIGHTING_PLANE 18 -#define BYOND_LIGHTING_LAYER 18 -#define BYOND_LIGHTING_RENDER_TARGET "BYOND_LIGHTING_PLANE" +#define FOV_EFFECT_LAYER 100 -#define CAMERA_STATIC_PLANE 19 -#define CAMERA_STATIC_LAYER 19 -#define CAMERA_STATIC_RENDER_TARGET "CAMERA_STATIC_PLANE" +///--------------- FULLSCREEN RUNECHAT BUBBLES ------------ +/// Bubble for typing indicators +#define TYPING_LAYER 500 -///---------------- MISC ----------------------- +#define RADIAL_BACKGROUND_LAYER 0 +///1000 is an unimportant number, it's just to normalize copied layers +#define RADIAL_CONTENT_LAYER 1000 -///Pipecrawling images -#define PIPECRAWL_IMAGES_PLANE 20 +#define ADMIN_POPUP_LAYER 1 -///Anything that wants to be part of the game plane, but also wants to draw above literally everything else -#define HIGH_GAME_PLANE 22 +///Layer for screentips +#define SCREENTIP_LAYER 4 -#define FULLSCREEN_PLANE 23 +/// Layer for tutorial instructions +#define TUTORIAL_INSTRUCTIONS_LAYER 5 +/// Layer for light overlays +#define LIGHT_DEBUG_LAYER 6 -#define RUNECHAT_PLANE 20 +#define LOBBY_BACKGROUND_LAYER 3 +#define LOBBY_BUTTON_LAYER 4 -#define BALLOON_CHAT_PLANE 21 +///Layer for lobby menu collapse button +#define LOBBY_BELOW_MENU_LAYER 2 +///Layer for lobby menu background image and main buttons (Join/Ready, Observe, Charater Prefs) +#define LOBBY_MENU_LAYER 3 +///Layer for lobby menu shutter, which covers up the menu to collapse/expand it +#define LOBBY_SHUTTER_LAYER 4 +///Layer for lobby menu buttons that are hanging away from and lower than the main panel +#define LOBBY_BOTTOM_BUTTON_LAYER 5 -//HUD layer defines +///cinematics are "below" the splash screen +#define CINEMATIC_LAYER -1 -#define FLASH_LAYER 20 -#define FULLSCREEN_LAYER 20.1 -#define UI_DAMAGE_LAYER 20.2 -#define BLIND_LAYER 20.3 -#define CRIT_LAYER 20.4 -#define CURSE_LAYER 20.5 -#define ECHO_LAYER 20.6 -#define FULLSCREEN_RENDER_TARGET "FULLSCREEN_PLANE" - -#define HUD_PLANE 21 -#define HUD_LAYER 21 -#define HUD_RENDER_TARGET "HUD_PLANE" -#define ABOVE_HUD_PLANE 22 -#define ABOVE_HUD_LAYER 22 -#define ABOVE_HUD_RENDER_TARGET "ABOVE_HUD_PLANE" - -#define SPLASHSCREEN_LAYER 23 -#define SPLASHSCREEN_PLANE 23 -#define SPLASHSCREEN_RENDER_TARGET "SPLASHSCREEN_PLANE" +///Plane master controller keys +#define PLANE_MASTERS_GAME "plane_masters_game" +#define PLANE_MASTERS_NON_MASTER "plane_masters_non_master" +#define PLANE_MASTERS_COLORBLIND "plane_masters_colorblind" +//Plane master critical flags +//Describes how different plane masters behave when they are being culled for performance reasons +/// This plane master will not go away if its layer is culled. useful for preserving effects +#define PLANE_CRITICAL_DISPLAY (1<<0) /// This plane master will temporarially remove relays to all other planes /// Allows us to retain the effects of a plane while cutting off the changes it makes #define PLANE_CRITICAL_NO_RELAY (1<<1) @@ -209,49 +324,9 @@ #define PLANE_CRITICAL_FUCKO_PARALLAX (PLANE_CRITICAL_DISPLAY|PLANE_CRITICAL_NO_RELAY|PLANE_CRITICAL_CUT_RENDER) -//-------------------- Rendering --------------------- -//Plane master critical flags -//Describes how different plane masters behave when they are being culled for performance reasons -/// This plane master will not go away if its layer is culled. useful for preserving effects -#define PLANE_CRITICAL_DISPLAY (1<<0) - -#define RENDER_PLANE_GAME 100 -#define RENDER_PLANE_NON_GAME 101 - -#define DEFAULT_PLANE 0 //Marks out the default plane, even if we don't use it - -#define AREA_PLANE 2 -#define MASSIVE_OBJ_PLANE 3 -#define GHOST_PLANE 4 -#define POINT_PLANE 5 - -/// Plane related to the menu when pressing Escape. -/// Needed so that we can apply a blur effect to EVERYTHING, and guarantee we are above all UI. -#define ESCAPE_MENU_PLANE 105 - -#define RENDER_PLANE_MASTER 110 - /// A value of /datum/preference/numeric/multiz_performance that disables the option #define MULTIZ_PERFORMANCE_DISABLE -1 /// We expect at most 3 layers of multiz /// Increment this define if you make a huge map. We unit test for it too just to make it easy for you /// If you modify this, you'll need to modify the tsx file too #define MAX_EXPECTED_Z_DEPTH 3 - - -///Plane master controller keys -#define PLANE_MASTERS_GAME "plane_masters_game" -#define PLANE_MASTERS_NON_MASTER "plane_masters_non_master" -#define PLANE_MASTERS_COLORBLIND "plane_masters_colorblind" - - -// Lummox I swear to god I will find you -// NOTE! You can only ever have planes greater then -10000, if you add too many with large offsets you will brick multiz -// Same can be said for large multiz maps. Tread carefully mappers -#define HIGHEST_EVER_PLANE RENDER_PLANE_MASTER -/// The range unique planes can be in -#define PLANE_RANGE (HIGHEST_EVER_PLANE - LOWEST_EVER_PLANE) - - -///1000 is an unimportant number, it's just to normalize copied layers -#define RADIAL_CONTENT_LAYER 1000 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 422b3acda456..61ad2ef71afa 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -503,3 +503,10 @@ #define TRAIT_NO_TRANSFORM "block_transformations" /// Does nothing on its own, applied via status effect. #define TRAIT_STASIS "in_stasis" +/* Traits for ventcrawling. + * Both give access to ventcrawling, but *_NUDE requires the user to be + * wearing no clothes and holding no items. If both present, *_ALWAYS + * takes precedence. + */ +#define TRAIT_VENTCRAWLER_ALWAYS "ventcrawler_always" +#define TRAIT_VENTCRAWLER_NUDE "ventcrawler_nude" diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm index 8a1c0a940299..d16cd8493823 100644 --- a/code/_onclick/hud/blob_overmind.dm +++ b/code/_onclick/hud/blob_overmind.dm @@ -131,8 +131,7 @@ blobpwrdisplay.icon_state = "block" blobpwrdisplay.screen_loc = ui_health blobpwrdisplay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT - blobpwrdisplay.layer = ABOVE_HUD_LAYER - blobpwrdisplay.plane = ABOVE_HUD_PLANE + SET_PLANE_EXPLICIT(blobpwrdisplay, ABOVE_HUD_PLANE, owner) infodisplay += blobpwrdisplay healths = new /atom/movable/screen/healths/blob(src) diff --git a/code/_onclick/hud/credits.dm b/code/_onclick/hud/credits.dm index 68470eb14c0b..bb48756d3b0a 100644 --- a/code/_onclick/hud/credits.dm +++ b/code/_onclick/hud/credits.dm @@ -34,7 +34,7 @@ GLOBAL_LIST(end_titles) mouse_opacity = MOUSE_OPACITY_TRANSPARENT alpha = 0 screen_loc = "2,2" - layer = SPLASHSCREEN_LAYER + plane = SPLASHSCREEN_PLANE var/matrix/target /atom/movable/screen/credit/Initialize(mapload, credited) diff --git a/code/_onclick/hud/devil.dm b/code/_onclick/hud/devil.dm index 618aa89189f4..ddbcbd5818d9 100644 --- a/code/_onclick/hud/devil.dm +++ b/code/_onclick/hud/devil.dm @@ -24,7 +24,7 @@ using.icon = ui_style using.icon_state = "swap_1_m" using.screen_loc = ui_swaphand_position(owner,1) - using.layer = HUD_LAYER + SET_PLANE_EXPLICIT(using, ABOVE_HUD_PLANE, owner) using.plane = HUD_PLANE static_inventory += using @@ -33,7 +33,7 @@ using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) - using.layer = HUD_LAYER + SET_PLANE_EXPLICIT(using, ABOVE_HUD_PLANE, owner) using.plane = HUD_PLANE static_inventory += using diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 0fe15e009176..44448a99468a 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -173,13 +173,13 @@ screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "flash" plane = SPLASHSCREEN_PLANE - layer = SPLASHSCREEN_LAYER - 1 + layer = CINEMATIC_LAYER color = "#000000" show_when_dead = TRUE /atom/movable/screen/fullscreen/cinematic_backdrop/Initialize(mapload) . = ..() - layer = SPLASHSCREEN_LAYER - 1 + layer = CINEMATIC_LAYER /atom/movable/screen/fullscreen/lighting_backdrop icon = 'icons/mob/screen_gen.dmi' @@ -204,7 +204,7 @@ /atom/movable/screen/fullscreen/see_through_darkness icon_state = "nightvision" plane = LIGHTING_PLANE - layer = LIGHTING_LAYER + layer = LIGHTING_ABOVE_ALL blend_mode = BLEND_ADD show_when_dead = TRUE diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 4b8ca93d56f5..f994cac81afc 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -326,8 +326,8 @@ GLOBAL_LIST_EMPTY(radial_menus) return current_user = M.client //Blank - menu_holder = image(icon='icons/effects/effects.dmi',loc=anchor,icon_state="nothing",layer = ABOVE_HUD_LAYER) - menu_holder.plane = ABOVE_HUD_PLANE + menu_holder = image(icon='icons/effects/effects.dmi',loc=anchor,icon_state="nothing",layer = RADIAL_BACKGROUND_LAYER) + SET_PLANE_EXPLICIT(menu_holder, ABOVE_HUD_PLANE, M) menu_holder.appearance_flags |= KEEP_APART menu_holder.vis_contents += elements + close_button current_user.images += menu_holder diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 37acb22e59e2..271097598806 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -224,8 +224,7 @@ A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" else A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" - A.layer = ABOVE_HUD_LAYER - A.plane = ABOVE_HUD_PLANE + SET_PLANE_IMPLICIT(A, ABOVE_HUD_PLANE) x++ if(x == 4) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index c6d23ad8b245..b7e32e87acff 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -9,7 +9,6 @@ /atom/movable/screen name = "" icon = 'icons/mob/screen_gen.dmi' - layer = HUD_LAYER plane = HUD_PLANE animate_movement = SLIDE_STEPS speech_span = SPAN_ROBOT @@ -48,7 +47,6 @@ maptext_width = 480 /atom/movable/screen/swap_hand - layer = HUD_LAYER plane = HUD_PLANE name = "swap hand" @@ -156,7 +154,6 @@ var/icon_empty // Icon when empty. For now used only by humans. var/icon_full // Icon when contains an item. For now used only by humans. var/list/object_overlays = list() - layer = HUD_LAYER plane = HUD_PLANE /atom/movable/screen/inventory/Click(location, control, params) @@ -264,7 +261,6 @@ /atom/movable/screen/close name = "close" - layer = ABOVE_HUD_LAYER plane = ABOVE_HUD_PLANE icon_state = "backpack_close" @@ -281,7 +277,6 @@ name = "drop" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_drop" - layer = HUD_LAYER plane = HUD_PLANE /atom/movable/screen/drop/Click() @@ -362,7 +357,6 @@ name = "resist" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_resist" - layer = HUD_LAYER plane = HUD_PLANE /atom/movable/screen/resist/Click() @@ -374,7 +368,6 @@ name = "rest" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_rest" - layer = HUD_LAYER plane = HUD_PLANE /atom/movable/screen/rest/Click() @@ -393,7 +386,6 @@ name = "storage" icon_state = "block" screen_loc = "7,7 to 10,8" - layer = HUD_LAYER plane = HUD_PLANE /atom/movable/screen/storage/Initialize(mapload, new_master) @@ -474,7 +466,6 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT alpha = 128 anchored = TRUE - layer = ABOVE_HUD_LAYER plane = ABOVE_HUD_PLANE /atom/movable/screen/zone_sel/MouseExited(location, control, params) @@ -657,7 +648,6 @@ icon = 'icons/blanks/blank_title.png' icon_state = "" screen_loc = "1,1" - layer = SPLASHSCREEN_LAYER plane = SPLASHSCREEN_PLANE var/client/holder diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 26489fe5537f..25fe8a0ac051 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -76,7 +76,6 @@ item_flags = NOBLUDGEON | ABSTRACT | DROPDEL //item_state = null w_class = WEIGHT_CLASS_GIGANTIC - layer = ABOVE_HUD_LAYER plane = ABOVE_HUD_PLANE var/atom/movable/focus = null diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 5694bfa0fd08..19197289cc66 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -21,6 +21,15 @@ /// The dimensions of the chat message icons #define CHAT_MESSAGE_ICON_SIZE 9 +///Base layer of chat elements +#define CHAT_LAYER 1 +///Highest possible layer of chat elements +#define CHAT_LAYER_MAX 2 +/// Maximum precision of float before rounding errors occur (in this context) +#define CHAT_LAYER_Z_STEP 0.0001 +/// The number of z-layer 'slices' usable by the chat message layering +#define CHAT_LAYER_MAX_Z (CHAT_LAYER_MAX - CHAT_LAYER) / CHAT_LAYER_Z_STEP + /** * # Chat Message Overlay * diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm index 22a76a7c2d0a..29ba4e960219 100644 --- a/code/datums/cinematic.dm +++ b/code/datums/cinematic.dm @@ -23,7 +23,6 @@ icon_state = "station_intact" plane = SPLASHSCREEN_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT - layer = SPLASHSCREEN_LAYER screen_loc = "BOTTOM,LEFT+50%" appearance_flags = APPEARANCE_UI | TILE_BOUND diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index bd557a8bd347..40cc6aa80321 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -357,7 +357,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) ND.sample_object.mouse_opacity = MOUSE_OPACITY_OPAQUE ND.sample_object.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" - ND.sample_object.layer = ABOVE_HUD_LAYER ND.sample_object.plane = ABOVE_HUD_PLANE cx++ if(cx - screen_start_x >= cols) @@ -373,7 +372,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip" O.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" O.maptext = "" - O.layer = ABOVE_HUD_LAYER O.plane = ABOVE_HUD_PLANE cx++ if(cx - screen_start_x >= cols) @@ -439,7 +437,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(QDELETED(O)) continue O.screen_loc = "[cx],[cy]" - O.layer = ABOVE_HUD_LAYER O.plane = ABOVE_HUD_PLANE cx++ if(cx > mx) diff --git a/code/datums/mutations/olfaction.dm b/code/datums/mutations/olfaction.dm index 3b9e3817b073..4bf2b3a0afd7 100644 --- a/code/datums/mutations/olfaction.dm +++ b/code/datums/mutations/olfaction.dm @@ -60,8 +60,7 @@ trail.Flip(dir) trail.Turn(180) - img = image(trail, loc = src, layer = HUD_LAYER) - img.layer = HUD_LAYER + img = image(trail, loc = src) img.plane = HUD_PLANE img.appearance_flags = NO_CLIENT_COLOR img.alpha = 0 diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index 1a8d9800b424..f9c6d963ebba 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -29,7 +29,7 @@ var/impacted_z_levels // The list of z-levels that this weather is actively affecting var/overlay_layer = AREA_LAYER //Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that. - var/overlay_plane = BLACKNESS_PLANE + var/overlay_plane = DEFAULT_PLANE var/aesthetic = FALSE //If the weather has no purpose other than looks var/immunity_type = WEATHER_STORM //Used by mobs to prevent them from being affected by the weather diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index afab00c7f397..1e4f2d754cd6 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -10,7 +10,7 @@ icon_state = "unknown" layer = AREA_LAYER //Keeping this on the default plane, GAME_PLANE, will make area overlays fail to render on FLOOR_PLANE. - plane = BLACKNESS_PLANE + plane = DEFAULT_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT invisibility = INVISIBILITY_LIGHTING diff --git a/code/game/machinery/airlock_cycle_control.dm b/code/game/machinery/airlock_cycle_control.dm index 852ac542b135..3f9c14a28861 100644 --- a/code/game/machinery/airlock_cycle_control.dm +++ b/code/game/machinery/airlock_cycle_control.dm @@ -184,7 +184,7 @@ var/matrix/TR = new TR.Translate(0, 16) TR.Multiply(new /matrix(s_dx, f_dx, 0, s_dy, f_dy, 0)) - var/mutable_appearance/M = mutable_appearance(icon, "hologram-line", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) + var/mutable_appearance/M = mutable_appearance(icon, "hologram-line", ABOVE_LIGHTING_PLANE) M.transform = TR add_overlay(M) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 6e14252d83cd..07fc5c3a3a63 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -8,7 +8,7 @@ name = "navigation beacon" desc = "A radio beacon used for bot navigation." level = 1 // underfloor - layer = UNDER_CATWALK + layer = LOW_OBJ_LAYER max_integrity = 500 armor = list(MELEE = 70, BULLET = 70, LASER = 70, ENERGY = 70, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80) diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index 7f5933b4c125..f9a73eba6e5d 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -7,7 +7,7 @@ invisibility = INVISIBILITY_OBSERVER anchored = TRUE - layer = GHOST_LAYER + plane = GHOST_PLANE color = "#ff0000" // text color var/text_size = 3 // larger values clip when the displayed text is larger than 2 digits. var/started = FALSE @@ -107,7 +107,7 @@ name = "gateway countdown" text_size = 1 color = "#BE8700" - layer = POINT_LAYER + plane = POINT_PLANE /obj/effect/countdown/clockworkgate/get_value() var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = attached_to diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 12efb829cb06..86c543b3a69d 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -3,7 +3,8 @@ icon = 'icons/effects/landmarks_static.dmi' icon_state = "x2" anchored = TRUE - layer = MID_LANDMARK_LAYER + layer = OBJ_LAYER + plane = GAME_PLANE invisibility = INVISIBILITY_ABSTRACT resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF @@ -415,7 +416,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/event_spawn name = "generic event spawn" icon_state = "generic_event" - layer = HIGH_LANDMARK_LAYER + layer = OBJ_LAYER /obj/effect/landmark/event_spawn/New() ..() @@ -428,7 +429,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/brazil name = "brazilian reception marker" icon_state = "x" - layer = HIGH_LANDMARK_LAYER + layer = OBJ_LAYER /obj/effect/landmark/brazil/New() ..() @@ -465,9 +466,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/centcom name = "centcomspawn" icon_state = "x" - layer = HIGH_LANDMARK_LAYER + layer = OBJ_LAYER /obj/effect/landmark/wiki name = "wiki sprite room" icon_state = "x" - layer = HIGH_LANDMARK_LAYER + layer = OBJ_LAYER diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index c7de6a2597cc..9e64edab098d 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -48,7 +48,7 @@ icon = 'icons/effects/alphacolors.dmi' icon_state = "white" plane = LIGHTING_PLANE - layer = LIGHTING_LAYER + layer = LIGHTING_ABOVE_ALL blend_mode = BLEND_ADD /obj/effect/abstract/marker diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index dfd44008cdbb..bff32277a9e5 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -82,7 +82,6 @@ name = "" icon = 'icons/effects/light_overlays/light_32.dmi' icon_state = "light" - layer = O_LIGHTING_VISUAL_LAYER plane = O_LIGHTING_VISUAL_PLANE appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm index 16d10fd03483..dc7e982f8698 100644 --- a/code/game/objects/effects/temporary_visuals/clockcult.dm +++ b/code/game/objects/effects/temporary_visuals/clockcult.dm @@ -262,7 +262,7 @@ icon_state = "eminence" mouse_opacity = MOUSE_OPACITY_TRANSPARENT resistance_flags = INDESTRUCTIBLE - layer = MASSIVE_OBJ_LAYER + plane = MASSIVE_OBJ_PLANE duration = 30 SECONDS /obj/effect/temp_visual/ratvar/command_point/Initialize(mapload, appearance) diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index 5dc526f1436e..495af7510ec4 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -61,7 +61,6 @@ /obj/effect/projectile/tracer/tracer/aiming icon_state = "pixelbeam_greyscale" - layer = ABOVE_LIGHTING_LAYER plane = ABOVE_LIGHTING_PLANE /obj/effect/projectile/tracer/wormhole diff --git a/code/game/objects/structures/wire_splicing.dm b/code/game/objects/structures/wire_splicing.dm index 63b2b327110e..15770ff8dfac 100644 --- a/code/game/objects/structures/wire_splicing.dm +++ b/code/game/objects/structures/wire_splicing.dm @@ -6,7 +6,7 @@ density = FALSE anchored = TRUE flags_1 = CONDUCT_1 - layer = UNDER_CATWALK + layer = CATWALK_LAYER var/messiness = 0 // How bad the splicing was, determines the chance of shock /obj/structure/wire_splicing/Initialize(mapload) diff --git a/code/game/turfs/openspace/openspace.dm b/code/game/turfs/openspace/openspace.dm index 292707fdebc1..154cccf79383 100644 --- a/code/game/turfs/openspace/openspace.dm +++ b/code/game/turfs/openspace/openspace.dm @@ -16,9 +16,25 @@ /turf/open/openspace/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() - plane = FLOOR_OPENSPACE_PLANE - layer = OPENSPACE_LAYER + + RegisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE, PROC_REF(on_atom_created)) + var/area/our_area = loc + if(istype(our_area, /area/space)) + force_no_gravity = TRUE return INITIALIZE_HINT_LATELOAD +/** + * Drops movables spawned on this turf after they are successfully initialized. + * so that spawned movables that should fall to gravity, will fall. + */ +/turf/open/openspace/proc/on_atom_created(datum/source, atom/created_atom) + SIGNAL_HANDLER + if(ismovable(created_atom)) + zfall_if_on_turf(created_atom) + +/turf/open/openspace/proc/zfall_if_on_turf(atom/movable/movable) + if(QDELETED(movable) || movable.loc != src) + return + zFall(movable) /turf/open/openspace/LateInitialize() update_multiz(TRUE, TRUE) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 57df5c8c6f31..d0aedb4525d9 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -57,6 +57,9 @@ GLOBAL_LIST_EMPTY(station_turfs) ///Lazylist of movable atoms providing opacity sources. var/list/atom/movable/opacity_sources + var/force_no_gravity = FALSE + + /turf/vv_edit_var(var_name, new_value) var/static/list/banned_edits = list("x", "y", "z") if(var_name in banned_edits) diff --git a/code/modules/antagonists/clockcult/clock_effects/general_markers.dm b/code/modules/antagonists/clockcult/clock_effects/general_markers.dm index eda88f27e706..b37f58ddd271 100644 --- a/code/modules/antagonists/clockcult/clock_effects/general_markers.dm +++ b/code/modules/antagonists/clockcult/clock_effects/general_markers.dm @@ -4,7 +4,7 @@ desc = "Some big guy. For you." clockwork_desc = "One of Ratvar's generals." alpha = 200 - layer = MASSIVE_OBJ_LAYER + plane = MASSIVE_OBJ_PLANE /obj/effect/clockwork/general_marker/Initialize(mapload) . = ..() diff --git a/code/modules/antagonists/clockcult/clock_structure.dm b/code/modules/antagonists/clockcult/clock_structure.dm index 768d550e5378..b4d71902b183 100644 --- a/code/modules/antagonists/clockcult/clock_structure.dm +++ b/code/modules/antagonists/clockcult/clock_structure.dm @@ -130,7 +130,7 @@ /obj/structure/destructible/clockwork/massive name = "massive construct" desc = "A very large construction." - layer = MASSIVE_OBJ_LAYER + plane = MASSIVE_OBJ_PLANE density = FALSE resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF | FREEZE_PROOF diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 7727d52ce3ff..716568c4736c 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -282,7 +282,7 @@ max_integrity = 200 break_sound = 'sound/effects/meteorimpact.ogg' break_message = span_warning("The pillar crumbles!") - layer = MASSIVE_OBJ_LAYER + plane = MASSIVE_OBJ_PLANE var/alt = 0 is_endgame = TRUE @@ -342,7 +342,7 @@ max_integrity = 600 break_sound = 'sound/effects/glassbr2.ogg' break_message = span_warning("The bloodstone resonates violently before crumbling to the floor!") - layer = MASSIVE_OBJ_LAYER + plane = MASSIVE_OBJ_PLANE light_color = "#FF0000" var/current_fullness = 0 var/anchor = FALSE //are we the bloodstone used to summon Nar'sie? used in the final part of the summoning diff --git a/code/modules/antagonists/devil/true_devil/inventory.dm b/code/modules/antagonists/devil/true_devil/inventory.dm index a3d0dbdf582b..61b09348b1dc 100644 --- a/code/modules/antagonists/devil/true_devil/inventory.dm +++ b/code/modules/antagonists/devil/true_devil/inventory.dm @@ -17,7 +17,6 @@ hands_overlays += r_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - r_hand.layer = ABOVE_HUD_LAYER r_hand.plane = ABOVE_HUD_PLANE r_hand.screen_loc = ui_hand_position(get_held_index_of_item(r_hand)) client.screen |= r_hand @@ -28,7 +27,6 @@ hands_overlays += l_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - l_hand.layer = ABOVE_HUD_LAYER l_hand.plane = ABOVE_HUD_PLANE l_hand.screen_loc = ui_hand_position(get_held_index_of_item(l_hand)) client.screen |= l_hand diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index f5eaa26713b7..b5ddf9a469cd 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -21,7 +21,7 @@ invisibility = INVISIBILITY_REVENANT health = INFINITY //Revenants don't use health, they use essence instead maxHealth = INFINITY - layer = GHOST_LAYER + plane = GHOST_PLANE healable = FALSE spacewalk = TRUE sight = SEE_MOBS | SEE_OBJS | SEE_TURFS | SEE_SELF diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 9c9a7203f343..24700606fdae 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -124,7 +124,7 @@ else if(!last_pressure_delta) set_light(1) - SSvis_overlays.add_vis_overlay(src, icon, "circ-off", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "circ-off", ABOVE_LIGHTING_PLANE, dir) return else if(last_pressure_delta > ONE_ATMOSPHERE) //fast @@ -132,15 +132,15 @@ set_light(3,2,"#4F82FF") else set_light(3,2,"#FF3232") - SSvis_overlays.add_vis_overlay(src, icon, "circ-ex[mode?"cold":"hot"]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "circ-run", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "circ-ex[mode?"cold":"hot"]", ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "circ-run", ABOVE_LIGHTING_PLANE, dir) else //slow if(mode) set_light(2,1,"#4F82FF") else set_light(2,1,"#FF3232") - SSvis_overlays.add_vis_overlay(src, icon, "circ-[mode?"cold":"hot"]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "circ-slow", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "circ-[mode?"cold":"hot"]", ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "circ-slow", ABOVE_LIGHTING_PLANE, dir) /obj/machinery/atmospherics/components/binary/circulator/wrench_act(mob/living/user, obj/item/I) if(user.a_intent == INTENT_HARM) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index bc6b484c6dd2..643b0a0f25f8 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -316,7 +316,6 @@ user.visible_message("[user] unwelded the vent.", span_notice("You unweld the vent."), span_italics("You hear welding.")) welded = FALSE update_appearance(UPDATE_ICON) - pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) pipe_vision_img.plane = ABOVE_HUD_PLANE investigate_log("was [welded ? "welded shut" : "unwelded"] by [key_name(user)]", INVESTIGATE_ATMOS) add_fingerprint(user) @@ -346,7 +345,6 @@ user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the vent", "You hear loud scraping noises.") welded = FALSE update_appearance(UPDATE_ICON) - pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) pipe_vision_img.plane = ABOVE_HUD_PLANE playsound(loc, 'sound/weapons/bladeslice.ogg', 100, 1) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 2729cb4f456a..c9e777161718 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -262,7 +262,6 @@ user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.") welded = FALSE update_appearance(UPDATE_ICON) - pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) pipe_vision_img.plane = ABOVE_HUD_PLANE investigate_log("was [welded ? "welded shut" : "unwelded"] by [key_name(user)]", INVESTIGATE_ATMOS) add_fingerprint(user) @@ -288,7 +287,6 @@ user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the scrubber.", "You hear loud scraping noises.") welded = FALSE update_appearance(UPDATE_ICON) - pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) pipe_vision_img.plane = ABOVE_HUD_PLANE playsound(loc, 'sound/weapons/bladeslice.ogg', 100, 1) diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index e05e29c009d4..b066398a892a 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -3,7 +3,7 @@ desc = "It measures something." icon = 'icons/obj/atmospherics/pipes/meter.dmi' icon_state = "meterX" - layer = GAS_METER_LAYER + layer = HIGH_PIPE_LAYER power_channel = AREA_USAGE_ENVIRON use_power = IDLE_POWER_USE idle_power_usage = 2 diff --git a/code/modules/buildmode/buttons.dm b/code/modules/buildmode/buttons.dm index 8468962b9c38..217a583cf147 100644 --- a/code/modules/buildmode/buttons.dm +++ b/code/modules/buildmode/buttons.dm @@ -2,7 +2,8 @@ icon = 'icons/misc/buildmode.dmi' var/datum/buildmode/bd // If we don't do this, we get occluded by item action buttons - layer = ABOVE_HUD_LAYER + plane = ABOVE_HUD_PLANE + /atom/movable/screen/buildmode/New(bld) bd = bld diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index e672db3326c8..de0761e3cfea 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -97,7 +97,6 @@ var/mutable_appearance/MA = new() MA.maptext = span_maptext("[strength]k") MA.color = "#04e604" - MA.layer = RAD_TEXT_LAYER MA.plane = GAME_PLANE pic.appearance = MA flick_overlay(pic, list(user.client), 10) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 8ede48819396..3984c220b126 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -1023,7 +1023,6 @@ GLOBAL_LIST_INIT(hallucination_list, list( slots_free += ui_storage2 if(slots_free.len) target.halitem.screen_loc = pick(slots_free) - target.halitem.layer = ABOVE_HUD_LAYER target.halitem.plane = ABOVE_HUD_PLANE switch(rand(1,6)) if(1) //revolver diff --git a/code/modules/food_and_drinks/plate.dm b/code/modules/food_and_drinks/plate.dm index 693d0727ba54..54fb5f412922 100644 --- a/code/modules/food_and_drinks/plate.dm +++ b/code/modules/food_and_drinks/plate.dm @@ -64,7 +64,7 @@ /obj/item/plate/proc/AddToPlate(obj/item/item_to_plate) vis_contents += item_to_plate item_to_plate.vis_flags |= VIS_INHERIT_PLANE - item_to_plate.layer = ABOVE_HUD_LAYER + item_to_plate.plane = ABOVE_HUD_PLANE RegisterSignal(item_to_plate, COMSIG_MOVABLE_MOVED, PROC_REF(ItemMoved)) RegisterSignal(item_to_plate, COMSIG_PARENT_QDELETING, PROC_REF(ItemMoved)) @@ -188,4 +188,4 @@ . = ..() AddComponent(/datum/component/caltrop, force) -#undef PLATE_SHARD_PIECES \ No newline at end of file +#undef PLATE_SHARD_PIECES diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 0858fb4ea0dd..1d065cb064eb 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -10,7 +10,7 @@ var/list/baseturf_to_replace var/baseturf - layer = POINT_LAYER + plane = POINT_PLANE /obj/effect/baseturf_helper/Initialize(mapload) . = ..() diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index e0ac50704f6b..f1e05ac9a6e7 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -603,7 +603,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ flick("coin_[cmineral]_flip", src) icon_state = "coin_[cmineral]_[coinflip]" if(flash) - SSvis_overlays.add_vis_overlay(src, icon, "flash", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, unique = TRUE) + SSvis_overlays.add_vis_overlay(src, icon, "flash", ABOVE_LIGHTING_PLANE, unique = TRUE) playsound(loc, 'sound/items/coinflip.ogg', 50, TRUE) var/oldloc = loc sleep(1.5 SECONDS) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 6ae0b1d9039b..2a9e8ea0c618 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -8,7 +8,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) desc = "It's a g-g-g-g-ghooooost!" //jinkies! icon = 'icons/mob/mob.dmi' icon_state = "ghost" - layer = GHOST_LAYER + layer = GHOST_PLANE stat = DEAD density = FALSE see_invisible = SEE_INVISIBLE_OBSERVER diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 79ca3f7ade87..92623189667e 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -185,7 +185,6 @@ dropItemToGround(get_item_for_held_index(hand_index), force = TRUE) I.forceMove(src) held_items[hand_index] = I - I.layer = ABOVE_HUD_LAYER I.plane = ABOVE_HUD_PLANE I.equipped(src, ITEM_SLOT_HANDS, no_sound) if(I.pulledby) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index f56a8d5d5274..21becca2178d 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -70,7 +70,6 @@ if(observe.client) observe.client.screen -= I I.forceMove(src) - I.layer = ABOVE_HUD_LAYER I.plane = ABOVE_HUD_PLANE I.appearance_flags |= NO_CLIENT_COLOR var/not_handled = FALSE diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index efd4184eee1f..cb0791cd757a 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -165,5 +165,4 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) mouse_opacity = MOUSE_OPACITY_ICON invisibility = INVISIBILITY_ABSTRACT - layer = CAMERA_STATIC_LAYER plane = CAMERA_STATIC_PLANE diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 90f8eab243b4..2751c0d0dd26 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -81,7 +81,6 @@ held_items[module_num] = item_module item_module.equipped(src, ITEM_SLOT_HANDS) item_module.mouse_opacity = initial(item_module.mouse_opacity) - item_module.layer = ABOVE_HUD_LAYER item_module.plane = ABOVE_HUD_PLANE item_module.cyborg_equip(src) item_module.forceMove(src) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index c5bc9df32716..86ab220b480f 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -127,7 +127,6 @@ robot_modules_background = new() robot_modules_background.icon_state = "block" - robot_modules_background.layer = HUD_LAYER //Objects that appear on screen are on layer ABOVE_HUD_LAYER, UI should be just below it. robot_modules_background.plane = HUD_PLANE ident = rand(1, 999) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index 1124de738d39..56652f0ea487 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -66,7 +66,6 @@ I.screen_loc = null // will get moved if inventory is visible I.forceMove(src) - I.layer = ABOVE_HUD_LAYER I.plane = ABOVE_HUD_PLANE switch(slot) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm index b6fe86efe0db..9400e17ebc50 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm @@ -35,7 +35,6 @@ hands_overlays += r_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - r_hand.layer = ABOVE_HUD_LAYER r_hand.plane = ABOVE_HUD_PLANE r_hand.screen_loc = ui_hand_position(get_held_index_of_item(r_hand)) client.screen |= r_hand @@ -48,7 +47,6 @@ hands_overlays += l_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - l_hand.layer = ABOVE_HUD_LAYER l_hand.plane = ABOVE_HUD_PLANE l_hand.screen_loc = ui_hand_position(get_held_index_of_item(l_hand)) client.screen |= l_hand diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm index 7607ed386e14..09cf499c80b0 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm @@ -57,7 +57,7 @@ name = "beam of solar energy" icon_state = "solar_beam" icon = 'icons/effects/beam.dmi' - layer = LIGHTING_LAYER + plane = LIGHTING_PLANE duration = 5 randomdir = FALSE diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index c4885bec37a1..8d832a895dd1 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -546,12 +546,10 @@ var/obj/item/l_hand = get_item_for_held_index(1) var/obj/item/r_hand = get_item_for_held_index(2) if(r_hand) - r_hand.layer = ABOVE_HUD_LAYER r_hand.plane = ABOVE_HUD_PLANE r_hand.screen_loc = ui_hand_position(get_held_index_of_item(r_hand)) client.screen |= r_hand if(l_hand) - l_hand.layer = ABOVE_HUD_LAYER l_hand.plane = ABOVE_HUD_PLANE l_hand.screen_loc = ui_hand_position(get_held_index_of_item(l_hand)) client.screen |= l_hand diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index 33e5cc3d4d90..4eebe8f0b7e4 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -107,7 +107,6 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( var/obj/machinery/atmospherics/A = X //all elements in totalMembers are necessarily of this type. if(in_view_range(client.mob, A)) if(!A.pipe_vision_img) - A.pipe_vision_img = image(A, A.loc, layer = ABOVE_HUD_LAYER, dir = A.dir) A.pipe_vision_img.plane = ABOVE_HUD_PLANE client.images += A.pipe_vision_img pipes_shown += A.pipe_vision_img diff --git a/code/modules/point/point.dm b/code/modules/point/point.dm index bda5e2a63407..d28d1811d82f 100644 --- a/code/modules/point/point.dm +++ b/code/modules/point/point.dm @@ -68,7 +68,7 @@ name = "pointer" icon = 'icons/mob/screen_gen.dmi' icon_state = "arrow" - layer = POINT_LAYER + plane = POINT_PLANE duration = POINT_TIME /obj/effect/temp_visual/point/Initialize(mapload, set_invis = 0) diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 5fdb7e9646cf..789edf8a813b 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -56,7 +56,7 @@ var/L = min(round(lastgenlev/100000), 11) if(L != 0) - SSvis_overlays.add_vis_overlay(src, icon, "teg-op[L]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "teg-op[L]", ABOVE_LIGHTING_PLANE, dir) #define GENRATE 800 // generator output coefficient from Q diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 3689d4eb9d73..31633999f379 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -19,7 +19,7 @@ anchored = TRUE density = TRUE move_resist = INFINITY - layer = MASSIVE_OBJ_LAYER + plane = MASSIVE_OBJ_PLANE light_range = 6 appearance_flags = LONG_GLIDE var/current_size = 1 diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm index 23742a544efe..fe5faeee75f4 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator_eye.dm @@ -51,6 +51,6 @@ if(eye_user?.client) eye_user.client.images -= user_image var/image/I = image(icon, loc, icon_state, FLY_LAYER, dir) - I.plane = MASSIVE_OBJ_LAYER + I.plane = MASSIVE_OBJ_PLANE user_image = I eye_user.client.images += user_image diff --git a/code/modules/spells/spell_types/jaunt/wirecrawl.dm b/code/modules/spells/spell_types/jaunt/wirecrawl.dm index a1829b04dbf6..d05bebe338b7 100644 --- a/code/modules/spells/spell_types/jaunt/wirecrawl.dm +++ b/code/modules/spells/spell_types/jaunt/wirecrawl.dm @@ -221,7 +221,6 @@ if(istype(object, /obj/structure/cable)) var/obj/structure/cable/display = object if(!display.wire_vision_img) - display.wire_vision_img = image(display, display.loc, layer = ABOVE_HUD_LAYER, dir = display.dir) display.wire_vision_img.plane = ABOVE_HUD_PLANE client.images += display.wire_vision_img wires_shown += display.wire_vision_img @@ -229,7 +228,6 @@ else if(istype(object, /obj/machinery/power)) var/obj/machinery/power/display = object if(!display.wire_vision_img) - display.wire_vision_img = image(display, display.loc, layer = ABOVE_HUD_LAYER, dir = display.dir) display.wire_vision_img.plane = ABOVE_HUD_PLANE client.images += display.wire_vision_img wires_shown += display.wire_vision_img diff --git a/code/modules/swarmers/swarmer_objs.dm b/code/modules/swarmers/swarmer_objs.dm index 69cda8ec6278..c5801983b834 100644 --- a/code/modules/swarmers/swarmer_objs.dm +++ b/code/modules/swarmers/swarmer_objs.dm @@ -46,7 +46,7 @@ icon_state = "swarmer_console" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) max_integrity = 400 - layer = MASSIVE_OBJ_LAYER + plane = MASSIVE_OBJ_PLANE light_color = LIGHT_COLOR_CYAN light_range = 10 anchored = TRUE diff --git a/yogstation/code/datums/status_effects/neutral.dm b/yogstation/code/datums/status_effects/neutral.dm index 258cf221dc3c..809cb5ab86c2 100644 --- a/yogstation/code/datums/status_effects/neutral.dm +++ b/yogstation/code/datums/status_effects/neutral.dm @@ -46,7 +46,6 @@ var/icon/temp = icon(sniffee.icon, sniffee.icon_state) var/image/scent_glow = image(temp, layer = ABOVE_MOB_LAYER, loc = sniffee) scent_glow.copy_overlays(sniffee) - scent_glow.layer = HUD_LAYER scent_glow.plane = HUD_PLANE scent_glow.appearance_flags = NO_CLIENT_COLOR scent_glow.color = scent_color @@ -90,7 +89,6 @@ if(!red_thirst) red_thirst = owner.overlay_fullscreen("thirsting", /atom/movable/screen/fullscreen/brute, 4) red_thirst.alpha = 0 - red_thirst.layer = HUD_LAYER red_thirst.plane = HUD_PLANE animate(red_thirst, alpha = 255, time = 1 SECONDS, easing = EASE_IN) //fade IN to_chat(owner, span_userdanger("As the scent of your prey overwhelms your sense of smell, the thrill of the hunt empowers you!")) diff --git a/yogstation/code/modules/guardian/abilities/special/pocket.dm b/yogstation/code/modules/guardian/abilities/special/pocket.dm index 438e87521f7d..e98154ac2949 100644 --- a/yogstation/code/modules/guardian/abilities/special/pocket.dm +++ b/yogstation/code/modules/guardian/abilities/special/pocket.dm @@ -288,7 +288,7 @@ GLOBAL_LIST_EMPTY(pocket_mirrors) G.status_flags &= ~GODMODE /obj/effect/manifestation - layer = ABOVE_LIGHTING_LAYER + plane = ABOVE_LIGHTING_PLANE appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE alpha = 0 mouse_opacity = FALSE diff --git a/yogstation/code/modules/guardian/guardian.dm b/yogstation/code/modules/guardian/guardian.dm index f4f711438dd3..1848f7508bd1 100644 --- a/yogstation/code/modules/guardian/guardian.dm +++ b/yogstation/code/modules/guardian/guardian.dm @@ -112,17 +112,17 @@ GLOBAL_LIST_INIT(guardian_projectile_damage, list( if (sx - range - 1 < 1 || sx + range + 1 > world.maxx || sy - range - 1 < 1 || sy + range + 1 > world.maxy) return for (var/turf/T in getline(locate(sx - range, sy + range + 1, sz), locate(sx + range, sy + range + 1, sz))) - barrier_images += image('yogstation/icons/effects/effects.dmi', T, "barrier", ABOVE_LIGHTING_LAYER, SOUTH) + barrier_images += image('yogstation/icons/effects/effects.dmi', T, "barrier", ABOVE_LIGHTING_PLANE, SOUTH) for (var/turf/T in getline(locate(sx - range, sy - range - 1, sz), locate(sx + range, sy - range - 1, sz))) - barrier_images += image('yogstation/icons/effects/effects.dmi', T, "barrier", ABOVE_LIGHTING_LAYER, NORTH) + barrier_images += image('yogstation/icons/effects/effects.dmi', T, "barrier", ABOVE_LIGHTING_PLANE, NORTH) for (var/turf/T in getline(locate(sx - range - 1, sy - range, sz), locate(sx - range - 1, sy + range, sz))) - barrier_images += image('yogstation/icons/effects/effects.dmi', T, "barrier", ABOVE_LIGHTING_LAYER, EAST) + barrier_images += image('yogstation/icons/effects/effects.dmi', T, "barrier", ABOVE_LIGHTING_PLANE, EAST) for (var/turf/T in getline(locate(sx + range + 1, sy - range, sz), locate(sx + range + 1, sy + range, sz))) - barrier_images += image('yogstation/icons/effects/effects.dmi', T, "barrier", ABOVE_LIGHTING_LAYER, WEST) - barrier_images += image('yogstation/icons/effects/effects.dmi', locate(sx - range - 1 , sy + range + 1, sz), "barrier", ABOVE_LIGHTING_LAYER, SOUTHEAST) - barrier_images += image('yogstation/icons/effects/effects.dmi', locate(sx + range + 1, sy + range + 1, sz), "barrier", ABOVE_LIGHTING_LAYER, SOUTHWEST) - barrier_images += image('yogstation/icons/effects/effects.dmi', locate(sx + range + 1, sy - range - 1, sz), "barrier", ABOVE_LIGHTING_LAYER, NORTHWEST) - barrier_images += image('yogstation/icons/effects/effects.dmi', locate(sx - range - 1, sy - range - 1, sz), "barrier", ABOVE_LIGHTING_LAYER, NORTHEAST) + barrier_images += image('yogstation/icons/effects/effects.dmi', T, "barrier", ABOVE_LIGHTING_PLANE, WEST) + barrier_images += image('yogstation/icons/effects/effects.dmi', locate(sx - range - 1 , sy + range + 1, sz), "barrier", ABOVE_LIGHTING_PLANE, SOUTHEAST) + barrier_images += image('yogstation/icons/effects/effects.dmi', locate(sx + range + 1, sy + range + 1, sz), "barrier", ABOVE_LIGHTING_PLANE, SOUTHWEST) + barrier_images += image('yogstation/icons/effects/effects.dmi', locate(sx + range + 1, sy - range - 1, sz), "barrier", ABOVE_LIGHTING_PLANE, NORTHWEST) + barrier_images += image('yogstation/icons/effects/effects.dmi', locate(sx - range - 1, sy - range - 1, sz), "barrier", ABOVE_LIGHTING_PLANE, NORTHEAST) for (var/image/I in barrier_images) I.layer = ABOVE_LIGHTING_PLANE I.plane = FLOOR_PLANE diff --git a/yogstation/code/modules/mining/lavaland/bloodbook.dm b/yogstation/code/modules/mining/lavaland/bloodbook.dm index 747c487ddc94..d1a7b56caf97 100644 --- a/yogstation/code/modules/mining/lavaland/bloodbook.dm +++ b/yogstation/code/modules/mining/lavaland/bloodbook.dm @@ -756,7 +756,7 @@ desc = "A blood-red prison." density = FALSE anchored = TRUE - layer = MASSIVE_OBJ_LAYER + plane= MASSIVE_OBJ_PLANE icon = 'icons/obj/projectiles.dmi' icon_state = "leaper" max_integrity = 500 @@ -782,14 +782,14 @@ /obj/structure/prop anchored = TRUE density = FALSE - layer = MASSIVE_OBJ_LAYER + plane = MASSIVE_OBJ_PLANE max_integrity = 500 /obj/structure/prop/killrock name = "ruby spire" desc = "An unrelenting claw." anchored = TRUE - layer = MASSIVE_OBJ_LAYER + plane = MASSIVE_OBJ_PLANE icon = 'icons/obj/cult_64x64.dmi' icon_state = "bloodstone-enter1" var/stage = 1 @@ -870,7 +870,7 @@ /obj/structure/slash icon = 'icons/effects/effects.dmi' icon_state = "slash" - layer = POINT_LAYER + plane = POINT_PLANE color = "#ffa600" /obj/structure/slash/Initialize(mapload) diff --git a/yogstation/code/modules/spacepods/spacepod.dm b/yogstation/code/modules/spacepods/spacepod.dm index 73b9bf4e6306..4622fc26379b 100644 --- a/yogstation/code/modules/spacepods/spacepod.dm +++ b/yogstation/code/modules/spacepods/spacepod.dm @@ -14,7 +14,7 @@ GLOBAL_LIST_INIT(spacepods_list, list()) density = 1 opacity = FALSE dir = NORTH // always points north because why not - layer = SPACEPOD_LAYER + layer = VEHICLE_LAYER bound_width = 64 bound_height = 64 animate_movement = NO_STEPS // we do our own gliding here From 3577d656cf1b981287520b371e17fe8af1543087 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 12:53:51 -0500 Subject: [PATCH 013/281] fix this --- code/datums/chatmessage.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 19197289cc66..67f4f5102aa1 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -25,10 +25,6 @@ #define CHAT_LAYER 1 ///Highest possible layer of chat elements #define CHAT_LAYER_MAX 2 -/// Maximum precision of float before rounding errors occur (in this context) -#define CHAT_LAYER_Z_STEP 0.0001 -/// The number of z-layer 'slices' usable by the chat message layering -#define CHAT_LAYER_MAX_Z (CHAT_LAYER_MAX - CHAT_LAYER) / CHAT_LAYER_Z_STEP /** * # Chat Message Overlay From e1bbb247569730dca9e2c32d8f41c0611bf3817f Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 12:59:22 -0500 Subject: [PATCH 014/281] ye the --- code/modules/awaymissions/super_secret_room.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm index f6e18b6ec5b5..7c8af5490bb9 100644 --- a/code/modules/awaymissions/super_secret_room.dm +++ b/code/modules/awaymissions/super_secret_room.dm @@ -4,7 +4,8 @@ verb_say = "intones" icon = 'icons/obj/structures.dmi' icon_state = "speaking_tile" - layer = 5 + layer = FLY_LAYER + plane = ABOVE_GAME_PLANE resistance_flags = INDESTRUCTIBLE var/speaking = FALSE var/times_spoken_to = 0 From 76428ae4600fce4c7ef716fe82cd2328b4b92571 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 17:55:01 -0500 Subject: [PATCH 015/281] yeah we update these thanks tg --- code/__DEFINES/construction.dm | 18 + code/__DEFINES/dcs/signals/signals_global.dm | 2 + code/__DEFINES/dcs/signals/signals_turf.dm | 2 + code/__DEFINES/flags.dm | 18 + code/__DEFINES/is_helpers.dm | 9 + code/__DEFINES/lighting.dm | 4 + code/__DEFINES/map_switch.dm | 8 + code/__DEFINES/mapping.dm | 6 + code/__DEFINES/movement.dm | 53 +++ code/__DEFINES/multiz.dm | 8 + code/__DEFINES/obj_flags.dm | 5 + code/__DEFINES/space.dm | 5 + code/__DEFINES/traits.dm | 3 + code/__DEFINES/turfs.dm | 7 + code/__HELPERS/lighting.dm | 73 ++++ code/__HELPERS/string_lists.dm | 31 ++ code/_onclick/hud/hud.dm | 272 +++++++++----- code/_onclick/hud/plane_master_group.dm | 136 +++---- code/_onclick/hud/screen_objects.dm | 3 + code/controllers/subsystem/mapping.dm | 7 + code/datums/elements/turf_transparency.dm | 280 +++++++++++++++ code/game/atoms.dm | 3 + code/game/atoms_movable.dm | 179 +++++++++- code/game/objects/effects/effects.dm | 1 + code/game/turfs/baseturfs/baseturfs.dm | 127 +++++++ code/game/turfs/open.dm | 64 ++++ code/game/turfs/simulated/floor/plating.dm | 5 + code/game/turfs/space/space.dm | 335 +++++++++++------- code/game/turfs/turf.dm | 28 +- .../environmental/LINDA_turf_tile.dm | 2 + code/modules/client/client_procs.dm | 9 + .../client/preferences/multiz_parallax.dm | 16 + .../client/preferences/multiz_performance.dm | 21 ++ code/modules/lighting/static_lighting_area.dm | 59 +++ code/modules/mob/mob_movement.dm | 2 +- code/modules/visual/render_step.dm | 92 +++++ yogstation.dme | 12 + yogstation/code/game/turfs/change_turf.dm | 12 +- 38 files changed, 1618 insertions(+), 299 deletions(-) create mode 100644 code/__DEFINES/map_switch.dm create mode 100644 code/__DEFINES/mapping.dm create mode 100644 code/__DEFINES/multiz.dm create mode 100644 code/__DEFINES/space.dm create mode 100644 code/__HELPERS/lighting.dm create mode 100644 code/__HELPERS/string_lists.dm create mode 100644 code/datums/elements/turf_transparency.dm create mode 100644 code/game/turfs/baseturfs/baseturfs.dm create mode 100644 code/modules/client/preferences/multiz_parallax.dm create mode 100644 code/modules/client/preferences/multiz_performance.dm create mode 100644 code/modules/lighting/static_lighting_area.dm create mode 100644 code/modules/visual/render_step.dm diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 8658a984936d..bdaf1343ac68 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -2,6 +2,24 @@ //Defines for construction states +//rcd constants for the design list +/// The mode of operation to design an specific type of rcd design +#define RCD_DESIGN_MODE "rcd_design_mode" + /// For changing turfs + #define RCD_TURF (1 << 0) + /// Full tile windows + #define RCD_WINDOWGRILLE (1 << 1) + /// Windoors & Airlocks + #define RCD_AIRLOCK (1 << 2) + /// Literarly anything that is spawned on top of a turf such as tables, machines etc + #define RCD_STRUCTURE (1 << 3) + /// For wallmounts like air alarms, fire alarms & apc + #define RCD_WALLFRAME (1 << 4) + /// For deconstructing an structure + #define RCD_DECONSTRUCT (1 << 5) +/// The typepath of the structure the rcd is trying to build +#define RCD_DESIGN_PATH "rcd_design_path" + //girder construction states #define GIRDER_NORMAL 0 #define GIRDER_REINF_STRUTS 1 diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index d70d3e49b02c..1026950b9e5b 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -76,3 +76,5 @@ #define COMSIG_GLOB_REVOLUTION_VICTORY "!revolution_victory" /// Global signal sent when narsie summon count is updated: (new count) #define COMSIG_NARSIE_SUMMON_UPDATE "!narsie_summon_update" +/// Global signal when starlight color is changed (old_star, new_star) +#define COMSIG_STARLIGHT_COLOR_CHANGED "!starlight_color_changed" diff --git a/code/__DEFINES/dcs/signals/signals_turf.dm b/code/__DEFINES/dcs/signals/signals_turf.dm index 08b1a59d7bc0..256f71cc5a94 100644 --- a/code/__DEFINES/dcs/signals/signals_turf.dm +++ b/code/__DEFINES/dcs/signals/signals_turf.dm @@ -14,3 +14,5 @@ #define COMSIG_TURF_PREPARE_STEP_SOUND "turf_prepare_step_sound" ///from base of datum/thrownthing/finalize(): (turf/turf, atom/movable/thrownthing) when something is thrown and lands on us #define COMSIG_TURF_MOVABLE_THROW_LANDED "turf_movable_throw_landed" +///from base of turf/multiz_turf_del(): (turf/source, direction) +#define COMSIG_TURF_MULTIZ_DEL "turf_multiz_del" diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 92c389063f8a..20b0012fbc8d 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -211,3 +211,21 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define IGNORE_SLOWDOWNS (1<<4) #define IGNORE_ALL (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM|IGNORE_INCAPACITATED|IGNORE_SLOWDOWNS) + +//TURF FLAGS +/// If a turf cant be jaunted through. +#define NOJAUNT (1<<0) +/// If a turf is an usused reservation turf awaiting assignment +#define UNUSED_RESERVATION_TURF (1<<1) +/// If a turf is a reserved turf +#define RESERVATION_TURF (1<<2) +/// Blocks lava rivers being generated on the turf. +#define NO_LAVA_GEN (1<<3) +/// Blocks ruins spawning on the turf. +#define NO_RUINS (1<<4) +/// Blocks this turf from being rusted +#define NO_RUST (1<<5) +/// Is this turf is "solid". Space and lava aren't for instance +#define IS_SOLID (1<<6) +/// This turf will never be cleared away by other objects on Initialize. +#define NO_CLEARING (1<<7) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 128866d2f223..1f75466f98bc 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -240,3 +240,12 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isfugitive(M) (istype(M) && M.mind?.has_antag_datum(/datum/antagonist/fugitive)) #define isProbablyWallMounted(O) (O.pixel_x > 20 || O.pixel_x < -20 || O.pixel_y > 20 || O.pixel_y < -20) + +GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( + /turf/open/openspace, + /turf/open/space/openspace + ))) + +#define istransparentturf(A) (HAS_TRAIT(A, TURF_Z_TRANSPARENT_TRAIT)) + +#define isopenspaceturf(A) (is_type_in_typecache(A, GLOB.turfs_openspace)) diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index b1c2408dd2c4..2bfb2d8313bc 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -26,6 +26,10 @@ #define LIGHTING_FALLOFF 1 /// use lambertian shading for light sources #define LIGHTING_LAMBERTIAN 0 +/// light UNDER the floor. primarily used for starlight, shouldn't fuck with this +#define LIGHTING_HEIGHT_SPACE -0.5 +/// light ON the floor +#define LIGHTING_HEIGHT_FLOOR 0 /// height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone #define LIGHTING_HEIGHT 1 /// Value used to round lumcounts, values smaller than 1/129 don't matter (if they do, thanks sinking points), greater values will make lighting less precise, but in turn increase performance, VERY SLIGHTLY. diff --git a/code/__DEFINES/map_switch.dm b/code/__DEFINES/map_switch.dm new file mode 100644 index 000000000000..dbb0059786ee --- /dev/null +++ b/code/__DEFINES/map_switch.dm @@ -0,0 +1,8 @@ +/// Uses the left operator when compiling, uses the right operator when not compiling. +// Currently uses the CBT macro, but if http://www.byond.com/forum/post/2831057 is ever added, +// or if map tools ever agree on a standard, this should switch to use that. +#ifdef CBT +#define MAP_SWITCH(compile_time, map_time) ##compile_time +#else +#define MAP_SWITCH(compile_time, map_time) ##map_time +#endif diff --git a/code/__DEFINES/mapping.dm b/code/__DEFINES/mapping.dm new file mode 100644 index 000000000000..3c08679e2a4b --- /dev/null +++ b/code/__DEFINES/mapping.dm @@ -0,0 +1,6 @@ +// Defines for SSmapping's multiz_levels +/// TRUE if we're ok with going up +#define Z_LEVEL_UP 1 +/// TRUE if we're ok with going down +#define Z_LEVEL_DOWN 2 +#define LARGEST_Z_LEVEL_INDEX Z_LEVEL_DOWN diff --git a/code/__DEFINES/movement.dm b/code/__DEFINES/movement.dm index c26cc24925b4..ecbd6e8fc6d6 100644 --- a/code/__DEFINES/movement.dm +++ b/code/__DEFINES/movement.dm @@ -14,3 +14,56 @@ GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) /// The whole result is then clamped to within the range above. /// Not very readable but it works #define DELAY_TO_GLIDE_SIZE(delay) (clamp(((32 / max((delay) / world.tick_lag, 1)) * GLOB.glide_size_multiplier), MIN_GLIDE_SIZE, MAX_GLIDE_SIZE)) + + +/** + * currently_z_moving defines. Higher numbers mean higher priority. + * This one is for falling down open space from stuff such as deleted tile, pit grate... + */ +#define CURRENTLY_Z_FALLING 1 +/// currently_z_moving is set to this in zMove() if 0. +#define CURRENTLY_Z_MOVING_GENERIC 2 +/// This one is for falling down open space from movement. +#define CURRENTLY_Z_FALLING_FROM_MOVE 3 +/// This one is for going upstairs. +#define CURRENTLY_Z_ASCENDING 4 + +/// possible bitflag return values of [atom/proc/intercept_zImpact] calls +/// Stops the movable from falling further and crashing on the ground. Example: stairs. +#define FALL_INTERCEPTED (1<<0) +/// Suppresses the "[movable] falls through [old_turf]" message because it'd make little sense in certain contexts like climbing stairs. +#define FALL_NO_MESSAGE (1<<1) +/// Used when the whole intercept_zImpact forvar loop should be stopped. For example: when someone falls into the supermatter and becomes dust. +#define FALL_STOP_INTERCEPTING (1<<2) +/// Used when the grip on a pulled object shouldn't be broken. +#define FALL_RETAIN_PULL (1<<3) + +/// Runs check_pulling() by the end of [/atom/movable/proc/zMove] for every movable that's pulling something. Should be kept enabled unless you know what you are doing. +#define ZMOVE_CHECK_PULLING (1<<0) +/// Checks if pulledby is nearby. if not, stop being pulled. +#define ZMOVE_CHECK_PULLEDBY (1<<1) +/// flags for different checks done in [/atom/movable/proc/can_z_move]. Should be self-explainatory. +#define ZMOVE_FALL_CHECKS (1<<2) +#define ZMOVE_CAN_FLY_CHECKS (1<<3) +#define ZMOVE_INCAPACITATED_CHECKS (1<<4) +/// Doesn't call zPassIn() and zPassOut() +#define ZMOVE_IGNORE_OBSTACLES (1<<5) +/// Gives players chat feedbacks if they're unable to move through z levels. +#define ZMOVE_FEEDBACK (1<<6) +/// Whether we check the movable (if it exists) the living mob is buckled on or not. +#define ZMOVE_ALLOW_BUCKLED (1<<7) +/// If the movable is actually ventcrawling vertically. +#define ZMOVE_VENTCRAWLING (1<<8) +/// Includes movables that're either pulled by the source or mobs buckled to it in the list of moving movables. +#define ZMOVE_INCLUDE_PULLED (1<<9) +/// Skips check for whether the moving atom is anchored or not. +#define ZMOVE_ALLOW_ANCHORED (1<<10) + +#define ZMOVE_CHECK_PULLS (ZMOVE_CHECK_PULLING|ZMOVE_CHECK_PULLEDBY) + +/// Flags used in "Move Upwards" and "Move Downwards" verbs. +#define ZMOVE_FLIGHT_FLAGS (ZMOVE_CAN_FLY_CHECKS|ZMOVE_INCAPACITATED_CHECKS|ZMOVE_CHECK_PULLS|ZMOVE_ALLOW_BUCKLED) +/// Used when walking upstairs +#define ZMOVE_STAIRS_FLAGS (ZMOVE_CHECK_PULLEDBY|ZMOVE_ALLOW_BUCKLED) +/// Used for falling down open space. +#define ZMOVE_FALL_FLAGS (ZMOVE_FALL_CHECKS|ZMOVE_ALLOW_BUCKLED) diff --git a/code/__DEFINES/multiz.dm b/code/__DEFINES/multiz.dm new file mode 100644 index 000000000000..370eaa8ba459 --- /dev/null +++ b/code/__DEFINES/multiz.dm @@ -0,0 +1,8 @@ +/// Attempt to get the turf below the provided one according to Z traits +#define GET_TURF_BELOW(turf) ( \ + (turf.turf_flags & RESERVATION_TURF) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_below(turf) : \ + (!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_DOWN]) ? null : get_step((turf), DOWN)) +/// Attempt to get the turf above the provided one according to Z traits +#define GET_TURF_ABOVE(turf) ( \ + (turf.turf_flags & RESERVATION_TURF) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_above(turf) : \ + (!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_UP]) ? null : get_step((turf), UP)) diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 4c5d348b082c..420a92373891 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -86,3 +86,8 @@ #define ADD_CLOTHING_TRAIT(mob, trait) ADD_TRAIT(mob, trait, "[CLOTHING_TRAIT]_[REF(src)]") /// Wrapper for removing clothing based traits #define REMOVE_CLOTHING_TRAIT(mob, trait) REMOVE_TRAIT(mob, trait, "[CLOTHING_TRAIT]_[REF(src)]") + +#define BLOCK_Z_OUT_DOWN (1<<5) // Should this object block z falling from loc? +#define BLOCK_Z_OUT_UP (1<<6) // Should this object block z uprise from loc? +#define BLOCK_Z_IN_DOWN (1<<7) // Should this object block z falling from above? +#define BLOCK_Z_IN_UP (1<<8) // Should this object block z uprise from below? diff --git a/code/__DEFINES/space.dm b/code/__DEFINES/space.dm new file mode 100644 index 000000000000..eff2aebff3e7 --- /dev/null +++ b/code/__DEFINES/space.dm @@ -0,0 +1,5 @@ +#define SPACE_SIGNAL_GPSTAG "Distant Signal" + +/// Every mob in the game will have a screen object sitting inside them with a reference matching this +/// So you can render_source against it and never need to update it again +#define SPACE_OVERLAY_RENDER_TARGET(offset) "*space_overlay_target[offset]" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 61ad2ef71afa..fbd330ae2e86 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -510,3 +510,6 @@ */ #define TRAIT_VENTCRAWLER_ALWAYS "ventcrawler_always" #define TRAIT_VENTCRAWLER_NUDE "ventcrawler_nude" +#define TRAIT_SPACEWALK "spacewalk" +///Turf trait for when a turf is transparent +#define TURF_Z_TRANSPARENT_TRAIT "turf_z_transparent" diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 549af806ee03..9f54a7fcfbb9 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -10,3 +10,10 @@ #define ALL_TURFS(...) block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz)) #define IS_OPAQUE_TURF(turf) (turf.directional_opacity == ALL_CARDINALS) + +/// The pipes, disposals, and wires are hidden +#define UNDERFLOOR_HIDDEN 0 +/// The pipes, disposals, and wires are visible but cannot be interacted with +#define UNDERFLOOR_VISIBLE 1 +/// The pipes, disposals, and wires are visible and can be interacted with +#define UNDERFLOOR_INTERACTABLE 2 diff --git a/code/__HELPERS/lighting.dm b/code/__HELPERS/lighting.dm new file mode 100644 index 000000000000..96087ba17377 --- /dev/null +++ b/code/__HELPERS/lighting.dm @@ -0,0 +1,73 @@ +/// Produces a mutable appearance glued to the [EMISSIVE_PLANE] dyed to be the [EMISSIVE_COLOR]. +/proc/emissive_appearance(icon, icon_state = "", atom/offset_spokesman, layer = FLOAT_LAYER, alpha = 255, appearance_flags = NONE, offset_const) + var/mutable_appearance/appearance = mutable_appearance(icon, icon_state, layer, offset_spokesman, EMISSIVE_PLANE, 255, appearance_flags | EMISSIVE_APPEARANCE_FLAGS, offset_const) + if(alpha == 255) + appearance.color = GLOB.emissive_color + else + var/alpha_ratio = alpha/255 + appearance.color = _EMISSIVE_COLOR(alpha_ratio) + + //Test to make sure emissives with broken or missing icon states are created + if(PERFORM_ALL_TESTS(focus_only/invalid_emissives)) + if(icon_state && !icon_exists(icon, icon_state, scream = FALSE)) //Scream set to False so we can have a custom stack_trace + stack_trace("An emissive appearance was added with non-existant icon_state \"[icon_state]\" in [icon]!") + + return appearance + +// This is a semi hot proc, so we micro it. saves maybe 150ms +// sorry :) +/proc/fast_emissive_blocker(atom/make_blocker) + var/mutable_appearance/blocker = new() + blocker.icon = make_blocker.icon + blocker.icon_state = make_blocker.icon_state + // blocker.layer = FLOAT_LAYER // Implied, FLOAT_LAYER is default for appearances + blocker.appearance_flags |= make_blocker.appearance_flags | EMISSIVE_APPEARANCE_FLAGS + blocker.dir = make_blocker.dir + if(make_blocker.alpha == 255) + blocker.color = GLOB.em_block_color + else + var/alpha_ratio = make_blocker.alpha/255 + blocker.color = _EM_BLOCK_COLOR(alpha_ratio) + + // Note, we are ok with null turfs, that's not an error condition we'll just default to 0, the error would be + // Not passing ANYTHING in, key difference + SET_PLANE_EXPLICIT(blocker, EMISSIVE_PLANE, make_blocker) + return blocker + +/// Produces a mutable appearance glued to the [EMISSIVE_PLANE] dyed to be the [EM_BLOCK_COLOR]. +/proc/emissive_blocker(icon, icon_state = "", atom/offset_spokesman, layer = FLOAT_LAYER, alpha = 255, appearance_flags = NONE, offset_const) + var/mutable_appearance/appearance = mutable_appearance(icon, icon_state, layer, offset_spokesman, EMISSIVE_PLANE, alpha, appearance_flags | EMISSIVE_APPEARANCE_FLAGS, offset_const) + if(alpha == 255) + appearance.color = GLOB.em_block_color + else + var/alpha_ratio = alpha/255 + appearance.color = _EM_BLOCK_COLOR(alpha_ratio) + return appearance + +/// Takes a non area atom and a threshold +/// Makes it block emissive with any pixels with more alpha then that threshold, with the rest allowing the light to pass +/// Returns a list of objects, automatically added to your vis_contents, that apply this effect +/// QDEL them when appropriate +/proc/partially_block_emissives(atom/make_blocker, alpha_to_leave) + var/static/uid = 0 + uid++ + if(!make_blocker.render_target) + make_blocker.render_target = "partial_emissive_block_[uid]" + + // First, we cut away a constant amount + var/cut_away = (alpha_to_leave - 1) / 255 + var/atom/movable/render_step/color/alpha_threshold_down = new(null, make_blocker, list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,-cut_away)) + alpha_threshold_down.render_target = "*emissive_block_alpha_down_[uid]" + // Then we multiply what remains by the amount we took away + var/atom/movable/render_step/color/alpha_threshold_up = new(null, alpha_threshold_down, list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,alpha_to_leave, 0,0,0,0)) + alpha_threshold_up.render_target = "*emissive_block_alpha_up_[uid]" + // Now we just feed that into an emissive blocker + var/atom/movable/render_step/emissive_blocker/em_block = new(null, alpha_threshold_up) + var/list/hand_back = list() + hand_back += alpha_threshold_down + hand_back += alpha_threshold_up + hand_back += em_block + // Cast to movable so we can use vis_contents. will work for turfs, but not for areas + var/atom/movable/vis_cast = make_blocker + vis_cast.vis_contents += hand_back + return hand_back diff --git a/code/__HELPERS/string_lists.dm b/code/__HELPERS/string_lists.dm new file mode 100644 index 000000000000..99ce28fba1df --- /dev/null +++ b/code/__HELPERS/string_lists.dm @@ -0,0 +1,31 @@ +GLOBAL_LIST_EMPTY(string_lists) + +/** + * Caches lists with non-numeric stringify-able values (text or typepath). + */ +/proc/string_list(list/values) + var/string_id = values.Join("-") + + . = GLOB.string_lists[string_id] + + if(.) + return . + + return GLOB.string_lists[string_id] = values + +///A wrapper for baseturf string lists, to offer support of non list values, and a stack_trace if we have major issues +/proc/baseturfs_string_list(list/values, turf/baseturf_holder) + if(!islist(values)) + return values //baseturf things + // return values + if(length(values) > 10) + stack_trace("The baseturfs list of [baseturf_holder] at [baseturf_holder.x], [baseturf_holder.y], [baseturf_holder.x] is [length(values)], it should never be this long, investigate. I've set baseturfs to a flashing wall as a visual queue") + baseturf_holder.ChangeTurf(/turf/closed/indestructible/baseturfs_ded, list(/turf/closed/indestructible/baseturfs_ded), flags = CHANGETURF_FORCEOP) + return string_list(list(/turf/closed/indestructible/baseturfs_ded)) //I want this reported god damn it + return string_list(values) + +/turf/closed/indestructible/baseturfs_ded + name = "Report this" + desc = "It looks like base turfs went to the fucking moon, TELL YOUR LOCAL CODER TODAY" + icon = 'icons/turf/debug.dmi' + icon_state = "fucked_baseturfs" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 0cb75cf7d1da..1cf9e183c40e 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -22,10 +22,10 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /datum/hud var/mob/mymob - var/hud_shown = TRUE //Used for the HUD toggle (F12) - var/hud_version = HUD_STYLE_STANDARD //Current displayed version of the HUD - var/inventory_shown = FALSE //Equipped item inventory - var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) + var/hud_shown = TRUE //Used for the HUD toggle (F12) + var/hud_version = HUD_STYLE_STANDARD //Current displayed version of the HUD + var/inventory_shown = FALSE //Equipped item inventory + var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) var/atom/movable/screen/blobpwrdisplay @@ -33,6 +33,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/atom/movable/screen/alien_queen_finder var/atom/movable/screen/devil/soul_counter/devilsouldisplay + var/atom/movable/screen/combo/combo_display var/atom/movable/screen/action_intent var/atom/movable/screen/zone_select @@ -47,11 +48,37 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...) /// Screen objects that never exit view. var/list/always_visible_inventory = list() - var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...) var/list/inv_slots[SLOTS_AMT] // /atom/movable/screen/inventory objects, ordered by their slot ID. var/list/hand_slots // /atom/movable/screen/inventory/hand objects, assoc list of "[held_index]" = object + + /// Assoc list of key => "plane master groups" + /// This is normally just the main window, but it'll occasionally contain things like spyglasses windows + var/list/datum/plane_master_group/master_groups = list() + ///Assoc list of controller groups, associated with key string group name with value of the plane master controller ref + var/list/atom/movable/plane_master_controller/plane_master_controllers = list() var/list/atom/movable/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object + /// Think of multiz as a stack of z levels. Each index in that stack has its own group of plane masters + /// This variable is the plane offset our mob/client is currently "on" + /// We use it to track what we should show/not show + /// Goes from 0 to the max (z level stack size - 1) + var/current_plane_offset = 0 + + ///UI for screentips that appear when you mouse over things + var/atom/movable/screen/screentip/screentip_text + + /// Whether to use text or images for click hints. + /// Same behavior as `screentips_enabled`--very hot, updated when the preference is updated. + var/screentip_images = TRUE + /// If this client is being shown atmos debug overlays or not + var/atmos_debug_overlays = FALSE + + /// The color to use for the screentips. + /// This is updated by the preference for cheaper reads than would be + /// had with a proc call, especially on one of the hottest procs in the + /// game (MouseEntered). + var/screentip_color + var/atom/movable/screen/button_palette/toggle_palette var/atom/movable/screen/palette_scroll/down/palette_down var/atom/movable/screen/palette_scroll/up/palette_up @@ -61,22 +88,17 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/list/floating_actions var/atom/movable/screen/healths - var/atom/movable/screen/healthdoll var/atom/movable/screen/stamina - /// Think of multiz as a stack of z levels. Each index in that stack has its own group of plane masters - /// This variable is the plane offset our mob/client is currently "on" - /// We use it to track what we should show/not show - /// Goes from 0 to the max (z level stack size - 1) - var/current_plane_offset = 0 - /// Assoc list of key => "plane master groups" - /// This is normally just the main window, but it'll occasionally contain things like spyglasses windows - var/list/datum/plane_master_group/master_groups = list() - ///Assoc list of controller groups, associated with key string group name with value of the plane master controller ref - var/list/atom/movable/plane_master_controller/plane_master_controllers = list() - + var/atom/movable/screen/healthdoll + var/atom/movable/screen/spacesuit // subtypes can override this to force a specific UI style var/ui_style + // List of weakrefs to objects that we add to our screen that we don't expect to DO anything + // They typically use * in their render target. They exist solely so we can reuse them, + // and avoid needing to make changes to all idk 300 consumers if we want to change the appearance + var/list/asset_refs_for_reuse = list() + /datum/hud/New(mob/owner) mymob = owner @@ -93,10 +115,88 @@ GLOBAL_LIST_INIT(available_ui_styles, list( hand_slots = list() + var/datum/plane_master_group/main/main_group = new(PLANE_GROUP_MAIN) + main_group.attach_to(src) + for(var/mytype in subtypesof(/atom/movable/plane_master_controller)) var/atom/movable/plane_master_controller/controller_instance = new mytype(null,src) plane_master_controllers[controller_instance.name] = controller_instance + owner.overlay_fullscreen("see_through_darkness", /atom/movable/screen/fullscreen/see_through_darkness) + + // Register onto the global spacelight appearances + // So they can be render targeted by anything in the world + for(var/obj/starlight_appearance/starlight as anything in GLOB.starlight_objects) + register_reuse(starlight) + + RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_plane_increase)) + RegisterSignal(mymob, COMSIG_MOB_LOGIN, PROC_REF(client_refresh)) + RegisterSignal(mymob, COMSIG_MOB_LOGOUT, PROC_REF(clear_client)) + RegisterSignal(mymob, COMSIG_MOB_SIGHT_CHANGE, PROC_REF(update_sightflags)) + RegisterSignal(mymob, COMSIG_VIEWDATA_UPDATE, PROC_REF(on_viewdata_update)) + update_sightflags(mymob, mymob.sight, NONE) + +/datum/hud/proc/client_refresh(datum/source) + SIGNAL_HANDLER + RegisterSignal(mymob.canon_client, COMSIG_CLIENT_SET_EYE, PROC_REF(on_eye_change)) + on_eye_change(null, null, mymob.canon_client.eye) + +/datum/hud/proc/clear_client(datum/source) + SIGNAL_HANDLER + if(mymob.canon_client) + UnregisterSignal(mymob.canon_client, COMSIG_CLIENT_SET_EYE) + +/datum/hud/proc/on_viewdata_update(datum/source, view) + SIGNAL_HANDLER + + view_audit_buttons() + +/datum/hud/proc/on_eye_change(datum/source, atom/old_eye, atom/new_eye) + SIGNAL_HANDLER + SEND_SIGNAL(src, COMSIG_HUD_EYE_CHANGED, old_eye, new_eye) + + if(old_eye) + UnregisterSignal(old_eye, COMSIG_MOVABLE_Z_CHANGED) + if(new_eye) + // By the time logout runs, the client's eye has already changed + // There's just no log of the old eye, so we need to override + // :sadkirby: + RegisterSignal(new_eye, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(eye_z_changed), override = TRUE) + eye_z_changed(new_eye) + +/datum/hud/proc/update_sightflags(datum/source, new_sight, old_sight) + SIGNAL_HANDLER + // If neither the old and new flags can see turfs but not objects, don't transform the turfs + // This is to ensure parallax works when you can't see holder objects + if(should_sight_scale(new_sight) == should_sight_scale(old_sight)) + return + + for(var/group_key as anything in master_groups) + var/datum/plane_master_group/group = master_groups[group_key] + group.transform_lower_turfs(src, current_plane_offset) + +/datum/hud/proc/should_use_scale() + return should_sight_scale(mymob.sight) + +/datum/hud/proc/should_sight_scale(sight_flags) + return (sight_flags & (SEE_TURFS | SEE_OBJS)) != SEE_TURFS + +/datum/hud/proc/eye_z_changed(atom/eye) + SIGNAL_HANDLER + update_parallax_pref() // If your eye changes z level, so should your parallax prefs + var/turf/eye_turf = get_turf(eye) + var/new_offset = GET_TURF_PLANE_OFFSET(eye_turf) + if(current_plane_offset == new_offset) + return + var/old_offset = current_plane_offset + current_plane_offset = new_offset + + SEND_SIGNAL(src, COMSIG_HUD_OFFSET_CHANGED, old_offset, new_offset) + if(should_use_scale()) + for(var/group_key as anything in master_groups) + var/datum/plane_master_group/group = master_groups[group_key] + group.transform_lower_turfs(src, new_offset) + /datum/hud/Destroy() if(mymob.hud_used == src) mymob.hud_used = null @@ -111,10 +211,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list( QDEL_NULL(module_store_icon) QDEL_LIST(static_inventory) + // all already deleted by static inventory clear inv_slots.Cut() action_intent = null zone_select = null pull_icon = null + rest_icon = null + hand_slots.Cut() QDEL_LIST(toggleable_inventory) QDEL_LIST(hotkeybuttons) @@ -124,18 +227,53 @@ GLOBAL_LIST_INIT(available_ui_styles, list( healths = null stamina = null healthdoll = null - devilsouldisplay = null + spacesuit = null blobpwrdisplay = null alien_plasma_display = null alien_queen_finder = null - QDEL_LIST_ASSOC_VAL(plane_masters) - QDEL_LIST(screenoverlays) + QDEL_LIST_ASSOC_VAL(master_groups) + QDEL_LIST_ASSOC_VAL(plane_master_controllers) QDEL_LIST(always_visible_inventory) mymob = null + return ..() +/datum/hud/proc/on_plane_increase(datum/source, old_max_offset, new_max_offset) + SIGNAL_HANDLER + for(var/i in old_max_offset + 1 to new_max_offset) + register_reuse(GLOB.starlight_objects[i + 1]) + build_plane_groups(old_max_offset + 1, new_max_offset) + +/// Creates the required plane masters to fill out new z layers (because each "level" of multiz gets its own plane master set) +/datum/hud/proc/build_plane_groups(starting_offset, ending_offset) + for(var/group_key in master_groups) + var/datum/plane_master_group/group = master_groups[group_key] + group.build_plane_masters(starting_offset, ending_offset) + +/// Returns the plane master that matches the input plane from the passed in group +/datum/hud/proc/get_plane_master(plane, group_key = PLANE_GROUP_MAIN) + var/plane_key = "[plane]" + var/datum/plane_master_group/group = master_groups[group_key] + return group.plane_masters[plane_key] + +/// Returns a list of all plane masters that match the input true plane, drawn from the passed in group (ignores z layer offsets) +/datum/hud/proc/get_true_plane_masters(true_plane, group_key = PLANE_GROUP_MAIN) + var/list/atom/movable/screen/plane_master/masters = list() + for(var/plane in TRUE_PLANE_TO_OFFSETS(true_plane)) + masters += get_plane_master(plane, group_key) + return masters + +/// Returns all the planes belonging to the passed in group key +/datum/hud/proc/get_planes_from(group_key) + var/datum/plane_master_group/group = master_groups[group_key] + return group.plane_masters + +/// Returns the corresponding plane group datum if one exists +/datum/hud/proc/get_plane_group(key) + return master_groups[key] + /mob/proc/create_mob_hud() if(!client || hud_used) return @@ -163,7 +301,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( // This code is the absolute fucking worst, I want it to go die in a fire // Seriously, why - screenmob.client.screen = list() + screenmob.client.clear_screen() screenmob.client.apply_clickcatcher() var/display_hud_version = version @@ -234,6 +372,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( reorganize_alerts(screenmob) screenmob.reload_fullscreen() update_parallax_pref(screenmob) + update_reuse(screenmob) // ensure observers get an accurate and up-to-date view if (!viewmob) @@ -278,13 +417,29 @@ GLOBAL_LIST_INIT(available_ui_styles, list( if (initial(ui_style) || ui_style == new_ui_style) return - for(var/atom/item in static_inventory + toggleable_inventory + hotkeybuttons + infodisplay + screenoverlays + always_visible_inventory + inv_slots) + for(var/atom/item in static_inventory + toggleable_inventory + hotkeybuttons + infodisplay + always_visible_inventory + inv_slots) if (item.icon == ui_style) item.icon = new_ui_style ui_style = new_ui_style build_hand_slots() +/datum/hud/proc/register_reuse(atom/movable/screen/reuse) + asset_refs_for_reuse += WEAKREF(reuse) + mymob?.client?.screen += reuse + +/datum/hud/proc/unregister_reuse(atom/movable/screen/reuse) + asset_refs_for_reuse -= WEAKREF(reuse) + mymob?.client?.screen -= reuse + +/datum/hud/proc/update_reuse(mob/show_to) + for(var/datum/weakref/screen_ref as anything in asset_refs_for_reuse) + var/atom/movable/screen/reuse = screen_ref.resolve() + if(isnull(reuse)) + asset_refs_for_reuse -= screen_ref + continue + show_to.client?.screen += reuse + //Triggered when F12 is pressed (Unless someone changed something in the DMF) /mob/verb/button_pressed_F12() set name = "F12" @@ -292,9 +447,9 @@ GLOBAL_LIST_INIT(available_ui_styles, list( if(hud_used && client) hud_used.show_hud() //Shows the next hud preset - to_chat(usr, "Switched HUD mode. Press F12 to toggle.") + to_chat(usr, span_info("Switched HUD mode. Press F12 to toggle.")) else - to_chat(usr, "This mob type does not use a HUD.") + to_chat(usr, span_warning("This mob type does not use a HUD.")) //(re)builds the hand ui slots, throwing away old ones @@ -308,7 +463,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( hand_slots = list() var/atom/movable/screen/inventory/hand/hand_box for(var/i in 1 to mymob.held_items.len) - hand_box = new /atom/movable/screen/inventory/hand(src) + hand_box = new /atom/movable/screen/inventory/hand(null, src) hand_box.name = mymob.get_held_index_name(i) hand_box.icon = ui_style hand_box.icon_state = "hand_[mymob.held_index_to_dir(i)]" @@ -316,7 +471,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( hand_box.held_index = i hand_slots["[i]"] = hand_box static_inventory += hand_box - hand_box.update_appearance(UPDATE_ICON) + hand_box.update_appearance() var/i = 1 for(var/atom/movable/screen/swap_hand/SH in static_inventory) @@ -331,7 +486,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /datum/hud/proc/update_locked_slots() return - /datum/hud/proc/position_action(atom/movable/screen/movable/action_button/button, position) // This is kinda a hack, I'm sorry. // Basically, FLOATING is never a valid position to pass into this proc. It exists as a generic marker for manually positioned buttons @@ -369,7 +523,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( palette_actions.insert_action(button, palette_actions.index_of(relative_to)) if(SCRN_OBJ_FLOATING) // If we don't have it as a define, this is a screen_loc, and we should be floating floating_actions += button - var/client/our_client = mymob.client + var/client/our_client = mymob.canon_client if(!our_client) position_action(button, button.linked_action.default_button_position) return @@ -410,7 +564,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /// Ensures all of our buttons are properly within the bounds of our client's view, moves them if they're not /datum/hud/proc/view_audit_buttons() - var/our_view = mymob?.client?.view + var/our_view = mymob?.canon_client?.view if(!our_view) return listed_actions.check_against_view() @@ -526,7 +680,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-[pixel_north_offset]" /datum/action_group/proc/check_against_view() - var/owner_view = owner?.mymob?.client?.view + var/owner_view = owner?.mymob?.canon_client?.view if(!owner_view) return // Unlikey as it is, we may have been changed. Want to start from our target position and fail down @@ -642,61 +796,3 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /datum/action_group/listed/refresh_actions() . = ..() owner.palette_actions.refresh_actions() // We effect them, so we gotta refresh em - -/datum/hud/proc/should_use_scale() - return should_sight_scale(mymob.sight) - -/datum/hud/proc/should_sight_scale(sight_flags) - return (sight_flags & (SEE_TURFS | SEE_OBJS)) != SEE_TURFS - -/datum/hud/proc/eye_z_changed(atom/eye) - SIGNAL_HANDLER - update_parallax_pref() // If your eye changes z level, so should your parallax prefs - var/turf/eye_turf = get_turf(eye) - var/new_offset = GET_TURF_PLANE_OFFSET(eye_turf) - if(current_plane_offset == new_offset) - return - var/old_offset = current_plane_offset - current_plane_offset = new_offset - - SEND_SIGNAL(src, COMSIG_HUD_OFFSET_CHANGED, old_offset, new_offset) - // if(should_use_scale()) - // for(var/group_key as anything in master_groups) - // var/datum/plane_master_group/group = master_groups[group_key] - // group.transform_lower_turfs(src, new_offset) - -/// Returns the plane master that matches the input plane from the passed in group -/datum/hud/proc/get_plane_master(plane, group_key = PLANE_GROUP_MAIN) - var/plane_key = "[plane]" - var/datum/plane_master_group/group = master_groups[group_key] - return group.plane_masters[plane_key] - -/// Returns a list of all plane masters that match the input true plane, drawn from the passed in group (ignores z layer offsets) -/datum/hud/proc/get_true_plane_masters(true_plane, group_key = PLANE_GROUP_MAIN) - var/list/atom/movable/screen/plane_master/masters = list() - for(var/plane in TRUE_PLANE_TO_OFFSETS(true_plane)) - masters += get_plane_master(plane, group_key) - return masters - -/// Returns all the planes belonging to the passed in group key -/datum/hud/proc/get_planes_from(group_key) - var/datum/plane_master_group/group = master_groups[group_key] - return group.plane_masters - -/// Returns the corresponding plane group datum if one exists -/datum/hud/proc/get_plane_group(key) - return master_groups[key] - -/datum/hud/proc/on_eye_change(datum/source, atom/old_eye, atom/new_eye) - SIGNAL_HANDLER - SEND_SIGNAL(src, COMSIG_HUD_EYE_CHANGED, old_eye, new_eye) - - if(old_eye) - UnregisterSignal(old_eye, COMSIG_MOVABLE_Z_CHANGED) - if(new_eye) - // By the time logout runs, the client's eye has already changed - // There's just no log of the old eye, so we need to override - // :sadkirby: - RegisterSignal(new_eye, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(eye_z_changed), override = TRUE) - eye_z_changed(new_eye) - diff --git a/code/_onclick/hud/plane_master_group.dm b/code/_onclick/hud/plane_master_group.dm index e80588a19c36..4775d3553fce 100644 --- a/code/_onclick/hud/plane_master_group.dm +++ b/code/_onclick/hud/plane_master_group.dm @@ -95,74 +95,74 @@ // // It would be nice to setup parallaxing for stairs and things when doing this // // So they look nicer. if you can't it's all good, if you think you can sanely look at monster's work // // It's hard, and potentially expensive. be careful -// /datum/plane_master_group/proc/transform_lower_turfs(datum/hud/source, new_offset, use_scale = TRUE) -// // Check if this feature is disabled for the client, in which case don't use scale. -// var/mob/our_mob = our_hud?.mymob -// if(!our_mob?.client?.prefs?.read_preference(/datum/preference/toggle/multiz_parallax)) -// use_scale = FALSE - -// // No offset? piss off -// if(!SSmapping.max_plane_offset) -// return - -// active_offset = new_offset - -// // Each time we go "down" a visual z level, we'll reduce the scale by this amount -// // Chosen because mothblocks liked it, didn't cause motion sickness while also giving a sense of height -// var/scale_by = 0.965 -// if(!use_scale) -// // This is a workaround for two things -// // First of all, if a mob can see objects but not turfs, they will not be shown the holder objects we use for -// // What I'd like to do is revert to images if this case throws, but image vis_contents is broken -// // https://www.byond.com/forum/post/2821969 -// // If that's ever fixed, please just use that. thanks :) -// scale_by = 1 - -// var/list/offsets = list() -// var/multiz_boundary = our_mob?.client?.prefs?.read_preference(/datum/preference/numeric/multiz_performance) - -// // We accept negatives so going down "zooms" away the drop above as it goes -// for(var/offset in -SSmapping.max_plane_offset to SSmapping.max_plane_offset) -// // Multiz boundaries disable transforms -// if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (multiz_boundary < abs(offset))) -// offsets += null -// continue - -// // No transformations if we're landing ON you -// if(offset == 0) -// offsets += null -// continue - -// var/scale = scale_by ** (offset) -// var/matrix/multiz_shrink = matrix() -// multiz_shrink.Scale(scale) -// offsets += multiz_shrink - -// // So we can talk in 1 -> max_offset * 2 + 1, rather then -max_offset -> max_offset -// var/offset_offset = SSmapping.max_plane_offset + 1 - -// for(var/plane_key in plane_masters) -// var/atom/movable/screen/plane_master/plane = plane_masters[plane_key] -// if(!plane.allows_offsetting) -// continue - -// var/visual_offset = plane.offset - new_offset - -// // Basically uh, if we're showing something down X amount of levels, or up any amount of levels -// if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (visual_offset > multiz_boundary || visual_offset < 0)) -// plane.outside_bounds(our_mob) -// else if(plane.is_outside_bounds) -// plane.inside_bounds(our_mob) - -// if(!plane.multiz_scaled) -// continue - -// if(plane.force_hidden || plane.is_outside_bounds || visual_offset < 0) -// // We don't animate here because it should be invisble, but we do mark because it'll look nice -// plane.transform = offsets[visual_offset + offset_offset] -// continue - -// animate(plane, transform = offsets[visual_offset + offset_offset], 0.05 SECONDS, easing = LINEAR_EASING) +/datum/plane_master_group/proc/transform_lower_turfs(datum/hud/source, new_offset, use_scale = TRUE) + // Check if this feature is disabled for the client, in which case don't use scale. + var/mob/our_mob = our_hud?.mymob + if(!our_mob?.client?.prefs?.read_preference(/datum/preference/toggle/multiz_parallax)) + use_scale = FALSE + + // No offset? piss off + if(!SSmapping.max_plane_offset) + return + + active_offset = new_offset + + // Each time we go "down" a visual z level, we'll reduce the scale by this amount + // Chosen because mothblocks liked it, didn't cause motion sickness while also giving a sense of height + var/scale_by = 0.965 + if(!use_scale) + // This is a workaround for two things + // First of all, if a mob can see objects but not turfs, they will not be shown the holder objects we use for + // What I'd like to do is revert to images if this case throws, but image vis_contents is broken + // https://www.byond.com/forum/post/2821969 + // If that's ever fixed, please just use that. thanks :) + scale_by = 1 + + var/list/offsets = list() + var/multiz_boundary = our_mob?.client?.prefs?.read_preference(/datum/preference/numeric/multiz_performance) + + // We accept negatives so going down "zooms" away the drop above as it goes + for(var/offset in -SSmapping.max_plane_offset to SSmapping.max_plane_offset) + // Multiz boundaries disable transforms + if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (multiz_boundary < abs(offset))) + offsets += null + continue + + // No transformations if we're landing ON you + if(offset == 0) + offsets += null + continue + + var/scale = scale_by ** (offset) + var/matrix/multiz_shrink = matrix() + multiz_shrink.Scale(scale) + offsets += multiz_shrink + + // So we can talk in 1 -> max_offset * 2 + 1, rather then -max_offset -> max_offset + var/offset_offset = SSmapping.max_plane_offset + 1 + + for(var/plane_key in plane_masters) + var/atom/movable/screen/plane_master/plane = plane_masters[plane_key] + if(!plane.allows_offsetting) + continue + + var/visual_offset = plane.offset - new_offset + + // Basically uh, if we're showing something down X amount of levels, or up any amount of levels + if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (visual_offset > multiz_boundary || visual_offset < 0)) + plane.outside_bounds(our_mob) + else if(plane.is_outside_bounds) + plane.inside_bounds(our_mob) + + if(!plane.multiz_scaled) + continue + + if(plane.force_hidden || plane.is_outside_bounds || visual_offset < 0) + // We don't animate here because it should be invisble, but we do mark because it'll look nice + plane.transform = offsets[visual_offset + offset_offset] + continue + + animate(plane, transform = offsets[visual_offset + offset_offset], 0.05 SECONDS, easing = LINEAR_EASING) /// Holds plane masters for popups, like camera windows /// Note: We do not scale this plane, even though we could diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index b7e32e87acff..78637e568ee2 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -19,6 +19,9 @@ /// A reference to the owner HUD, if any. VAR_PRIVATE/datum/hud/hud = null + /// If FALSE, this will not be cleared when calling /client/clear_screen() + var/clear_with_screen = TRUE + /atom/movable/screen/New(datum/hud/new_hud) . = ..() if(istype(new_hud)) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 7a7f5eb69860..7403efe086d3 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -55,6 +55,9 @@ SUBSYSTEM_DEF(mapping) var/list/areas_in_z = list() + ///list of lists, inner lists are of the form: list("up or down link direction" = TRUE) + var/list/multiz_levels = list() + var/loading_ruins = FALSE var/list/turf/unused_turfs = list() //Not actually unused turfs they're unused but reserved for use for whatever requests them. "[zlevel_of_turf]" = list(turfs) var/list/datum/turf_reservations //list of turf reservations @@ -650,3 +653,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) for(var/turf/to_contain as anything in Z_TURFS(z_level)) var/area/our_area = to_contain.loc our_area.contained_turfs += to_contain + +/datum/controller/subsystem/mapping/proc/get_reservation_from_turf(turf/T) + RETURN_TYPE(/datum/turf_reservation) + return used_turfs[T] diff --git a/code/datums/elements/turf_transparency.dm b/code/datums/elements/turf_transparency.dm new file mode 100644 index 000000000000..b050dd0866f0 --- /dev/null +++ b/code/datums/elements/turf_transparency.dm @@ -0,0 +1,280 @@ +/// List of z pillars (datums placed in the bottom left of XbyX squares that control transparency in that space) +/// The pillars are stored in triple depth lists indexed by (world_size % pillar_size) + 1 +/// They are created at transparent turf request, and deleted when no turfs remain +GLOBAL_LIST_EMPTY(pillars_by_z) +#define Z_PILLAR_RADIUS 20 +// Takes a position, transforms it into a z pillar key +#define Z_PILLAR_TRANSFORM(pos) (ROUND_UP(pos / Z_PILLAR_RADIUS)) +// Takes a z pillar key, hands back the actual posiiton it represents +// A key of 1 becomes 1, a key of 2 becomes Z_PILLAR_RADIUS + 1, etc. +#define Z_KEY_TO_POSITION(key) (((key - 1) * Z_PILLAR_RADIUS) + 1) + +/// Returns a z pillar to insert turfs into +/proc/request_z_pillar(x, y, z) + var/list/pillars_by_z = GLOB.pillars_by_z + if(length(pillars_by_z) < z) + pillars_by_z.len = z + var/list/our_z = pillars_by_z[z] + if(!our_z) + our_z = list() + pillars_by_z[z] = our_z + + //Now that we've got the z layer sorted, we're gonna check the X line + var/x_key = Z_PILLAR_TRANSFORM(x) + if(length(our_z) < x_key) + our_z.len = x_key + var/list/our_x = our_z[x_key] + if(!our_x) + our_x = list() + our_z[x_key] = our_x + + //And now the y layer + var/y_key = Z_PILLAR_TRANSFORM(y) + if(length(our_x) < y_key) + our_x.len = y_key + var/datum/z_pillar/our_lad = our_x[y_key] + if(!our_lad) + our_lad = new(x_key, y_key, z) + our_x[y_key] = our_lad + return our_lad + +/// Exists to be placed on the turf of walls and such to hold the vis_contents of the tile below +/// Otherwise the lower turf might get shifted around, which is dumb. do this instead. +/obj/effect/abstract/z_holder + var/datum/z_pillar/pillar + var/turf/show_for + appearance_flags = PIXEL_SCALE + plane = HUD_PLANE + anchored = TRUE + move_resist = INFINITY + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/effect/abstract/z_holder/Destroy() + if(pillar) + pillar.drawing_object -= show_for + pillar = null + show_for = null + return ..() + +/obj/effect/abstract/z_holder/proc/display(turf/display, datum/z_pillar/behalf_of) + if(pillar) + CRASH("We attempted to use a z holder to display when it was already in use, what'd you do") + + pillar = behalf_of + show_for = display + vis_contents += display + behalf_of.drawing_object[display] = src + +/// Grouping datum that manages transparency for a block of space +/// Setup to ease debugging, and to make add/remove operations cheaper +/datum/z_pillar + var/x_pos + var/y_pos + var/z_pos + /// Assoc list in the form displayed turf -> list of sources + var/list/turf_sources = list() + /// Assoc list of turfs using z holders in the form displayed turf -> z holder + var/list/drawing_object = list() + +/datum/z_pillar/New(x_pos, y_pos, z_pos) + . = ..() + src.x_pos = x_pos + src.y_pos = y_pos + src.z_pos = z_pos + +/datum/z_pillar/Destroy() + GLOB.pillars_by_z[z_pos][x_pos][y_pos] = null + // Just to be totally clear, this is code that exists to + // A: make sure cleanup is actually possible for this datum, just in case someone goes insane + // B: allow for easier debugging and making sure everything behaves as expected when fully removed + // It is not meant to be relied on, please don't actually it's not very fast + for(var/turf/displaying in turf_sources) + for(var/turf/displaying_for in turf_sources[displaying]) + hide_turf(displaying, displaying_for) + return ..() + +/// Displays a turf from the z level below us on our level +/datum/z_pillar/proc/display_turf(turf/to_display, turf/source) + var/list/sources = turf_sources[to_display] + + if(sources) // If we aren't the first to request this turf, return + sources |= source + var/obj/effect/abstract/z_holder/holding = drawing_object[to_display] + if(!holding) + return + + var/turf/visual_target = GET_TURF_ABOVE(to_display) + /// Basically, if we used to be under a non transparent turf, but are no longer in that position + /// Then we add to the transparent turf we're now under, and nuke the old object + if(!istransparentturf(visual_target)) + return + + holding.vis_contents -= to_display + qdel(holding) + drawing_object -= to_display + visual_target.vis_contents += to_display + return + + // Otherwise, we need to create a new set of sources. let's do that yeah? + sources = list() + turf_sources[to_display] = sources + sources |= source + + var/turf/visual_target = GET_TURF_ABOVE(to_display) + if(istransparentturf(visual_target) || isopenspaceturf(visual_target)) + visual_target.vis_contents += to_display + else + var/obj/effect/abstract/z_holder/hold_this = new(visual_target) + hold_this.display(to_display, src) + +/// Hides an existing turf from our vis_contents, or the vis_contents of the source if applicable +/datum/z_pillar/proc/hide_turf(turf/to_hide, turf/source) + var/list/sources = turf_sources[to_hide] + if(!sources) + return + sources -= source + // More sources remain + if(length(sources)) + return + + turf_sources -= to_hide + var/obj/effect/abstract/z_holder/holding = drawing_object[to_hide] + if(holding) + qdel(holding) + else + var/turf/visual_target = GET_TURF_ABOVE(to_hide) + visual_target.vis_contents -= to_hide + + if(!length(turf_sources) && !QDELETED(src)) + qdel(src) + +/// Called when a transparent turf is cleared. We wait a tick, then check to see what +/// Kind of turf replaced our former holder, and resetup our visuals as desired +/// We do not need to do this for non transparent holders, because they will have their abstract object cleared +/// When a transparent holder comes back. +/datum/z_pillar/proc/parent_cleared(turf/visual, turf/current_holder) + addtimer(CALLBACK(src, PROC_REF(refresh_orphan), visual, current_holder)) + +/// Runs the actual refresh of some formerly orphaned via vis_loc deletiong turf +/// We'll only reup if we either have no souece, or if the source is a transparent turf +/datum/z_pillar/proc/refresh_orphan(turf/orphan, turf/parent) + var/list/sources = turf_sources[orphan] + if(!length(sources)) + return + + var/obj/effect/abstract/z_holder/holding = drawing_object[orphan] + if(holding) + return + + if(istransparentturf(parent) || isopenspaceturf(parent)) + parent.vis_contents += orphan + else + var/obj/effect/abstract/z_holder/hold_this = new(parent) + hold_this.display(orphan, src) + +/datum/element/turf_z_transparency + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY + +///This proc sets up the signals to handle updating viscontents when turfs above/below update. Handle plane and layer here too so that they don't cover other obs/turfs in Dream Maker +/datum/element/turf_z_transparency/Attach(datum/target, mapload) + . = ..() + if(!isturf(target)) + return ELEMENT_INCOMPATIBLE + + var/turf/our_turf = target + + RegisterSignal(target, COMSIG_TURF_MULTIZ_DEL, PROC_REF(on_multiz_turf_del)) + RegisterSignal(target, COMSIG_TURF_MULTIZ_NEW, PROC_REF(on_multiz_turf_new)) + + ADD_TRAIT(our_turf, TURF_Z_TRANSPARENT_TRAIT, ELEMENT_TRAIT(type)) + + if(!mapload) + update_multi_z(our_turf) + +/datum/element/turf_z_transparency/Detach(datum/source) + . = ..() + var/turf/our_turf = source + clear_multiz(our_turf) + + UnregisterSignal(our_turf, list(COMSIG_TURF_MULTIZ_NEW, COMSIG_TURF_MULTIZ_DEL)) + REMOVE_TRAIT(our_turf, TURF_Z_TRANSPARENT_TRAIT, ELEMENT_TRAIT(type)) + +///Updates the viscontents or underlays below this tile. +/datum/element/turf_z_transparency/proc/update_multi_z(turf/our_turf) + var/turf/below_turf = GET_TURF_BELOW(our_turf) + if(below_turf) // If we actually have something below us, display it. + for(var/turf/partner in range(1, below_turf)) + // We use our z here to ensure the pillar is actually on our level + var/datum/z_pillar/z_boss = request_z_pillar(partner.x, partner.y, our_turf.z) + z_boss.display_turf(partner, our_turf) + else + our_turf.underlays += get_baseturf_underlay(our_turf) + + // This shit is stupid + // z transparency is for making something SHOW WHAT'S BENEATH it, or if nothing is, show + // the appropriate underlay + // IT IS NOT FOR MAKING YOUR CLOSED TURF SEETHROUGH + // these are different concerns, and should not be HANDLED TOGETHER + // similarly, if you rip this out, rework diagonal closed turfs to work with this system + // it will make them look significantly nicer, and should let you tie into their logic more easily + // Just please don't break behavior yeah? thanks, I love you <3 + if(isclosedturf(our_turf)) //Show girders below closed turfs + var/mutable_appearance/girder_underlay = mutable_appearance('icons/obj/structures.dmi', "girder", layer = TURF_LAYER-0.01) + girder_underlay.appearance_flags = RESET_ALPHA | RESET_COLOR + our_turf.underlays += girder_underlay + var/mutable_appearance/plating_underlay = mutable_appearance('icons/turf/floors.dmi', "plating", layer = TURF_LAYER-0.02) + plating_underlay.appearance_flags = RESET_ALPHA | RESET_COLOR + our_turf.underlays += plating_underlay + return TRUE + +/datum/element/turf_z_transparency/proc/clear_multiz(turf/our_turf) + var/turf/below_turf = GET_TURF_BELOW(our_turf) + if(below_turf) // If we actually have something below us, we need to clear ourselves from it + for(var/turf/partner in range(1, below_turf)) + // We use our z here to ensure the pillar is actually on our level + var/datum/z_pillar/z_boss = request_z_pillar(partner.x, partner.y, our_turf.z) + z_boss.hide_turf(partner, our_turf) + if(partner == below_turf) + z_boss.parent_cleared(below_turf, our_turf) + else + our_turf.underlays -= get_baseturf_underlay(our_turf) + + if(isclosedturf(our_turf)) //Show girders below closed turfs + var/mutable_appearance/girder_underlay = mutable_appearance('icons/obj/structures.dmi', "girder", layer = TURF_LAYER-0.01) + girder_underlay.appearance_flags = RESET_ALPHA | RESET_COLOR + our_turf.underlays -= girder_underlay + var/mutable_appearance/plating_underlay = mutable_appearance('icons/turf/floors.dmi', "plating", layer = TURF_LAYER-0.02) + plating_underlay.appearance_flags = RESET_ALPHA | RESET_COLOR + our_turf.underlays -= plating_underlay + +/datum/element/turf_z_transparency/proc/on_multiz_turf_del(turf/our_turf, turf/below_turf, dir) + SIGNAL_HANDLER + + if(dir != DOWN) + return + + update_multi_z(our_turf) + +/datum/element/turf_z_transparency/proc/on_multiz_turf_new(turf/our_turf, turf/below_turf, dir) + SIGNAL_HANDLER + + if(dir != DOWN) + return + + update_multi_z(our_turf) + +///Called when there is no real turf below this turf +/datum/element/turf_z_transparency/proc/get_baseturf_underlay(turf/our_turf) + var/turf/path = SSmapping.level_trait(our_turf.z, ZTRAIT_BASETURF) || /turf/open/space + if(!ispath(path)) + path = text2path(path) + if(!ispath(path)) + warning("Z-level [our_turf.z] has invalid baseturf '[SSmapping.level_trait(our_turf.z, ZTRAIT_BASETURF)]'") + path = /turf/open/space + var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), initial(path.icon_state), layer = TURF_LAYER-0.02, offset_spokesman = our_turf, plane = PLANE_SPACE) + underlay_appearance.appearance_flags = RESET_ALPHA | RESET_COLOR + return underlay_appearance + +#undef Z_PILLAR_RADIUS +#undef Z_PILLAR_TRANSFORM +#undef Z_KEY_TO_POSITION diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 44ff68c6c5ae..941865b02e93 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -12,6 +12,9 @@ ///If non-null, overrides a/an/some in all cases var/article + /// How many tiles "up" this light is. 1 is typical, should only really change this if it's a floor light + var/light_height = LIGHTING_HEIGHT + ///First atom flags var var/flags_1 = NONE ///Intearaction flags diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index e1f80cde837e..ebfd1e4aa26e 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -45,6 +45,10 @@ var/zfalling = FALSE + ///is the mob currently ascending or descending through z levels? + var/currently_z_moving + + /// Either FALSE, [EMISSIVE_BLOCK_GENERIC], or [EMISSIVE_BLOCK_UNIQUE] var/blocks_emissive = FALSE ///Internal holder for emissive blocker object, do not use directly use blocks_emissive @@ -126,15 +130,24 @@ vis_contents.Cut() /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) + // This one is incredible. + // `if (x) else { /* code */ }` is surprisingly fast, and it's faster than a switch, which is seemingly not a jump table. + // From what I can tell, a switch case checks every single branch individually, although sane, is slow in a hot proc like this. + // So, we make the most common `blocks_emissive` value, EMISSIVE_BLOCK_GENERIC, 0, getting to the fast else branch quickly. + // If it fails, then we can check over every value it can be (here, EMISSIVE_BLOCK_UNIQUE is the only one that matters). + // This saves several hundred milliseconds of init time. + if (blocks_emissive) + if (blocks_emissive == EMISSIVE_BLOCK_UNIQUE) + if(em_block) + SET_PLANE(em_block, EMISSIVE_PLANE, src) + else if(!QDELETED(src)) + render_target = ref(src) + em_block = new(null, src) + return em_block + // Implied else if (blocks_emissive == EMISSIVE_BLOCK_NONE) -> return + // EMISSIVE_BLOCK_GENERIC == 0 + else + return fast_emissive_blocker(src) /atom/movable/proc/can_zFall(turf/source, levels = 1, turf/target, direction) if(!direction) @@ -1044,3 +1057,151 @@ if(. <= GRAB_AGGRESSIVE) ADD_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT) ADD_TRAIT(pulling, TRAIT_HANDS_BLOCKED, CHOKEHOLD_TRAIT) +/* + * The core multi-z movement proc. Used to move a movable through z levels. + * If target is null, it'll be determined by the can_z_move proc, which can potentially return null if + * conditions aren't met (see z_move_flags defines in __DEFINES/movement.dm for info) or if dir isn't set. + * Bear in mind you don't need to set both target and dir when calling this proc, but at least one or two. + * This will set the currently_z_moving to CURRENTLY_Z_MOVING_GENERIC if unset, and then clear it after + * Forcemove(). + * + * + * Args: + * * dir: the direction to go, UP or DOWN, only relevant if target is null. + * * target: The target turf to move the src to. Set by can_z_move() if null. + * * z_move_flags: bitflags used for various checks in both this proc and can_z_move(). See __DEFINES/movement.dm. + */ +/atom/movable/proc/zMove(dir, turf/target, z_move_flags = ZMOVE_FLIGHT_FLAGS) + if(!target) + target = can_z_move(dir, get_turf(src), null, z_move_flags) + if(!target) + set_currently_z_moving(FALSE, TRUE) + return FALSE + + var/list/moving_movs = get_z_move_affected(z_move_flags) + + for(var/atom/movable/movable as anything in moving_movs) + movable.currently_z_moving = currently_z_moving || CURRENTLY_Z_MOVING_GENERIC + movable.forceMove(target) + movable.set_currently_z_moving(FALSE, TRUE) + // This is run after ALL movables have been moved, so pulls don't get broken unless they are actually out of range. + if(z_move_flags & ZMOVE_CHECK_PULLS) + for(var/atom/movable/moved_mov as anything in moving_movs) + if(z_move_flags & ZMOVE_CHECK_PULLEDBY && moved_mov.pulledby && (moved_mov.z != moved_mov.pulledby.z || get_dist(moved_mov, moved_mov.pulledby) > 1)) + moved_mov.pulledby.stop_pulling() + if(z_move_flags & ZMOVE_CHECK_PULLING) + moved_mov.check_pulling(TRUE) + return TRUE + +/// Returns a list of movables that should also be affected when src moves through zlevels, and src. +/atom/movable/proc/get_z_move_affected(z_move_flags) + . = list(src) + if(buckled_mobs) + . |= buckled_mobs + if(!(z_move_flags & ZMOVE_INCLUDE_PULLED)) + return + for(var/mob/living/buckled as anything in buckled_mobs) + if(buckled.pulling) + . |= buckled.pulling + if(pulling) + . |= pulling + +/** + * Checks if the destination turf is elegible for z movement from the start turf to a given direction and returns it if so. + * Args: + * * direction: the direction to go, UP or DOWN, only relevant if target is null. + * * start: Each destination has a starting point on the other end. This is it. Most of the times the location of the source. + * * z_move_flags: bitflags used for various checks. See __DEFINES/movement.dm. + * * rider: A living mob in control of the movable. Only non-null when a mob is riding a vehicle through z-levels. + */ +/atom/movable/proc/can_z_move(direction, turf/start, turf/destination, z_move_flags = ZMOVE_FLIGHT_FLAGS, mob/living/rider) + if(!start) + start = get_turf(src) + if(!start) + return FALSE + if(!direction) + if(!destination) + return FALSE + direction = get_dir_multiz(start, destination) + if(direction != UP && direction != DOWN) + return FALSE + if(!destination) + destination = get_step_multiz(start, direction) + if(!destination) + if(z_move_flags & ZMOVE_FEEDBACK) + to_chat(rider || src, span_warning("There's nowhere to go in that direction!")) + return FALSE + if(z_move_flags & ZMOVE_FALL_CHECKS && (throwing || (movement_type & (FLYING|FLOATING)) || !has_gravity(start))) + return FALSE + if(z_move_flags & ZMOVE_CAN_FLY_CHECKS && !(movement_type & (FLYING|FLOATING)) && has_gravity(start)) + if(z_move_flags & ZMOVE_FEEDBACK) + if(rider) + to_chat(rider, span_warning("[src] is is not capable of flight.")) + else + to_chat(src, span_warning("You are not Superman.")) + return FALSE + if((!(z_move_flags & ZMOVE_IGNORE_OBSTACLES) && !(start.zPassOut(direction) && destination.zPassIn(direction))) || (!(z_move_flags & ZMOVE_ALLOW_ANCHORED) && anchored)) + if(z_move_flags & ZMOVE_FEEDBACK) + to_chat(rider || src, span_warning("You couldn't move there!")) + return FALSE + return destination //used by some child types checks and zMove() + +/// Sets the currently_z_moving variable to a new value. Used to allow some zMovement sources to have precedence over others. +/atom/movable/proc/set_currently_z_moving(new_z_moving_value, forced = FALSE) + if(forced) + currently_z_moving = new_z_moving_value + return TRUE + var/old_z_moving_value = currently_z_moving + currently_z_moving = max(currently_z_moving, new_z_moving_value) + return currently_z_moving > old_z_moving_value + +/// Generates a space underlay for a turf +/// This provides proper lighting support alongside just looking nice +/// Accepts the appearance to make "spaceish", and the turf we're doing this for +/proc/generate_space_underlay(mutable_appearance/underlay_appearance, turf/generate_for) + underlay_appearance.icon = 'icons/turf/space.dmi' + underlay_appearance.icon_state = "space" + SET_PLANE(underlay_appearance, PLANE_SPACE, generate_for) + if(!generate_for.render_target) + generate_for.render_target = ref(generate_for) + var/atom/movable/render_step/emissive_blocker/em_block = new(null, generate_for) + underlay_appearance.overlays += em_block + // We used it because it's convienient and easy, but it's gotta go now or it'll hang refs + QDEL_NULL(em_block) + // We're gonna build a light, and mask it with the base turf's appearance + // grab a 32x32 square of it + // I would like to use GLOB.starbright_overlays here + // But that breaks down for... some? reason. I think recieving a render relay breaks keep_together or something + // So we're just gonna accept that this'll break with starlight color changing. hardly matters since this is really only for offset stuff, but I'd love to fix it someday + var/mutable_appearance/light = new(GLOB.starlight_objects[GET_TURF_PLANE_OFFSET(generate_for) + 1]) + light.render_target = "" + light.appearance_flags |= KEEP_TOGETHER + // Now apply a copy of the turf, set to multiply + // This will multiply against our light, so we only light up the bits that aren't "on" the wall + var/mutable_appearance/mask = new(generate_for.appearance) + mask.blend_mode = BLEND_MULTIPLY + mask.render_target = "" + mask.pixel_x = 0 + mask.pixel_y = 0 + mask.pixel_w = 0 + mask.pixel_z = 0 + mask.transform = null + mask.underlays = list() // Begone foul lighting overlay + SET_PLANE(mask, FLOAT_PLANE, generate_for) + mask.layer = FLOAT_LAYER + + // Bump the opacity to full, will this work? + mask.color = list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,255, 0,0,0,0) + light.overlays += mask + underlay_appearance.overlays += light + + // Now, we're going to make a copy of the mask. Instead of using it to multiply against our light + // We're going to use it to multiply against the turf lighting plane. Going to mask away the turf light + // And rely on LIGHTING_MASK_LAYER to ensure we mask ONLY that bit + var/mutable_appearance/turf_mask = new(mask.appearance) + SET_PLANE(turf_mask, LIGHTING_PLANE, generate_for) + turf_mask.layer = LIGHTING_MASK_LAYER + /// Any color becomes white. Anything else is black, and it's fully opaque + /// Ought to work + turf_mask.color = list(255,255,255,0, 255,255,255,0, 255,255,255,0, 0,0,0,0, 0,0,0,255) + underlay_appearance.overlays += turf_mask diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 04ed1950154f..338fa9dabf2e 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -6,6 +6,7 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF move_resist = INFINITY obj_flags = 0 + blocks_emissive = EMISSIVE_BLOCK_GENERIC /obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) return diff --git a/code/game/turfs/baseturfs/baseturfs.dm b/code/game/turfs/baseturfs/baseturfs.dm new file mode 100644 index 000000000000..195b52de1106 --- /dev/null +++ b/code/game/turfs/baseturfs/baseturfs.dm @@ -0,0 +1,127 @@ +/// Places the given turf on the bottom of the turf stack. +/turf/proc/place_on_bottom(turf/bottom_turf) + baseturfs = baseturfs_string_list( + list(initial(bottom_turf.baseturfs), bottom_turf) + baseturfs, + src + ) + +/// Places a turf at the top of the stack +/turf/proc/place_on_top(turf/added_layer, flags) + var/list/turf/new_baseturfs = list() + + new_baseturfs.Add(baseturfs) + if(isopenturf(src)) + new_baseturfs.Add(type) + + return ChangeTurf(added_layer, new_baseturfs, flags) + +/// Places a turf on top - for map loading +/turf/proc/load_on_top(turf/added_layer, flags) + var/area/our_area = get_area(src) + flags = our_area.PlaceOnTopReact(list(baseturfs), added_layer, flags) + + if(flags & CHANGETURF_SKIP) // We haven't been initialized + if(flags_1 & INITIALIZED_1) + stack_trace("CHANGETURF_SKIP was used in a PlaceOnTop call for a turf that's initialized. This is a mistake. [src]([type])") + assemble_baseturfs() + + var/turf/new_turf + if(!length(baseturfs)) + baseturfs = list(baseturfs) + + var/list/old_baseturfs = baseturfs.Copy() + if(!isclosedturf(src)) + old_baseturfs += type + + new_turf = ChangeTurf(added_layer, null, flags) + new_turf.assemble_baseturfs(initial(added_layer.baseturfs)) // The baseturfs list is created like roundstart + if(!length(new_turf.baseturfs)) + new_turf.baseturfs = list(baseturfs) + + // The old baseturfs are put underneath, and we sort out the unwanted ones + new_turf.baseturfs = baseturfs_string_list(old_baseturfs + (new_turf.baseturfs - GLOB.blacklisted_automated_baseturfs), new_turf) + return new_turf + +/// Tries to find the given type in baseturfs. +/// If found, returns how deep it is for use in other baseturf procs, or null if it cannot be found. +/// For example, this number can be passed into ScrapeAway to scrape everything until that point. +/turf/proc/depth_to_find_baseturf(baseturf_type) + if(!islist(baseturfs)) + return baseturfs == baseturf_type ? 1 : null + var/index = baseturfs.Find(baseturf_type) + if (index == 0) + return null + return baseturfs.len - index + 1 + +/// Returns the baseturf at the given depth. +/// For example, baseturf_at_depth(1) will give the baseturf that would show up when scraping once. +/turf/proc/baseturf_at_depth(index) + TEST_ONLY_ASSERT(isnum(index), "baseturf_at_depth must be given a number, received [index]") + if (islist(baseturfs)) + return LAZYACCESS(baseturfs, baseturfs.len - index + 1) + else if (index == 1) + return baseturfs + else + return null + +/// Replaces all instances of needle_type in baseturfs with replacement_type +/turf/proc/replace_baseturf(needle_type, replacement_type) + if (islist(baseturfs)) + var/list/new_baseturfs + + while (TRUE) + var/found_index = baseturfs.Find(needle_type) + if (found_index == 0) + break + + new_baseturfs ||= baseturfs.Copy() + new_baseturfs[found_index] = replacement_type + + if (!isnull(new_baseturfs)) + baseturfs = baseturfs_string_list(new_baseturfs, src) + else if (baseturfs == needle_type) + baseturfs = replacement_type + +/// Removes all baseturfs that are found in the given typecache. +/turf/proc/remove_baseturfs_from_typecache(list/typecache) + if (islist(baseturfs)) + var/list/new_baseturfs + + for (var/baseturf in baseturfs) + if (!typecache[baseturf]) + continue + + new_baseturfs ||= baseturfs.Copy() + new_baseturfs -= baseturf + + if (!isnull(new_baseturfs)) + baseturfs = baseturfs_string_list(new_baseturfs, src) + else if (typecache[baseturfs]) + baseturfs = /turf/baseturf_bottom + +/// Returns the total number of baseturfs +/turf/proc/count_baseturfs() + return islist(baseturfs) ? length(baseturfs) : 1 + +/// Inserts a baseturf at the given level. +/// "Level" here doesn't mean depth. +/// For example, `insert_baseturf(2, /turf/open/floor/plating)` will make it so +/// the 2nd to last turf in the list is plating. +/// This is different from *depth*, since depth is the level from the top. +/turf/proc/insert_baseturf(level, turf_type) + if (!islist(baseturfs)) + assemble_baseturfs() + if(!islist(baseturfs)) + baseturfs = list(baseturfs) + + var/list/baseturfs_copy = baseturfs.Copy() + baseturfs_copy.Insert(level, turf_type) + baseturfs = baseturfs_string_list(baseturfs_copy, src) + +/// Places a baseturf ontop of a searched for baseturf. +/turf/proc/stack_ontop_of_baseturf(floor, roof) + if (!islist(baseturfs)) + baseturfs = list(baseturfs) + var/floor_position = baseturfs.Find(floor) + if(floor_position != 0) + insert_baseturf(floor_position + 1, roof) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index affcf0cd9e5d..0d23d1d6f8e9 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -36,6 +36,19 @@ /turf/open/zAirOut(direction, turf/source) return (direction == UP) +/** + * Replace an open turf with another open turf while avoiding the pitfall of replacing plating with a floor tile, leaving a hole underneath. + * This replaces the current turf if it is plating and is passed plating, is tile and is passed tile. + * It places the new turf on top of itself if it is plating and is passed a tile. + * It also replaces the turf if it is tile and is passed plating, essentially destroying the over turf. + * Flags argument is passed directly to ChangeTurf or PlaceOnTop + */ +/turf/open/proc/replace_floor(turf/open/new_floor_path, flags) + if (!overfloor_placed && initial(new_floor_path.overfloor_placed)) + place_on_top(new_floor_path, flags = flags) + return + ChangeTurf(new_floor_path, flags = flags) + /turf/open/indestructible name = "floor" icon = 'icons/turf/floors.dmi' @@ -618,3 +631,54 @@ flammability = initial(flammability) return flammability = new_flammability + +/// Builds with rods. This doesn't exist to be overriden, just to remove duplicate logic for turfs that want +/// To support floor tile creation +/// I'd make it a component, but one of these things is space. So no. +/turf/open/proc/build_with_rods(obj/item/stack/rods/used_rods, mob/user) + var/obj/structure/lattice/catwalk_bait = locate(/obj/structure/lattice, src) + var/obj/structure/lattice/catwalk/existing_catwalk = locate(/obj/structure/lattice/catwalk, src) + if(existing_catwalk) + to_chat(user, span_warning("There is already a catwalk here!")) + return + + if(catwalk_bait) + if(used_rods.use(1)) + qdel(catwalk_bait) + to_chat(user, span_notice("You construct a catwalk.")) + playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + new /obj/structure/lattice/catwalk(src) + else + to_chat(user, span_warning("You need two rods to build a catwalk!")) + return + + if(used_rods.use(1)) + to_chat(user, span_notice("You construct a lattice.")) + playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + new /obj/structure/lattice(src) + else + to_chat(user, span_warning("You need one rod to build a lattice.")) + +/// Very similar to build_with_rods, this exists to allow consistent behavior between different types in terms of how +/// Building floors works +/turf/open/proc/build_with_floor_tiles(obj/item/stack/tile/plasteel/used_tiles, user) + var/obj/structure/lattice/lattice = locate(/obj/structure/lattice, src) + if(!has_valid_support() && !lattice) + balloon_alert(user, "needs support, place rods!") + return + if(!used_tiles.use(1)) + balloon_alert(user, "need a floor tile to build!") + return + + playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) + var/turf/open/floor/plating/new_plating = place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + if(lattice) + qdel(lattice) + else + new_plating.lattice_underneath = FALSE + +/turf/open/proc/has_valid_support() + for (var/direction in GLOB.cardinals) + if(istype(get_step(src, direction), /turf/open/floor)) + return TRUE + return FALSE diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 5fdd9fa14468..cfffea5f0cf6 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -188,3 +188,8 @@ if(locate(/obj/structure/lattice/catwalk, src)) return FALSE return TRUE +///not an actual turf its used just for rcd ui purposes +/turf/open/floor/plating/rcd + name = "Floor/Wall" + icon = 'icons/mob/radial.dmi' + icon_state = "wallfloor" diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index f45f1085b16f..33e4221dbf82 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -1,59 +1,88 @@ +///The base color of light space emits +GLOBAL_VAR_INIT(base_starlight_color, default_starlight_color()) +///The color of light space is currently emitting +GLOBAL_VAR_INIT(starlight_color, default_starlight_color()) +/proc/default_starlight_color() + var/turf/open/space/read_from = /turf/open/space + return initial(read_from.light_color) + +///The range of the light space is displaying +GLOBAL_VAR_INIT(starlight_range, default_starlight_range()) +/proc/default_starlight_range() + var/turf/open/space/read_from = /turf/open/space + return initial(read_from.light_range) + +///The power of the light space is throwin out +GLOBAL_VAR_INIT(starlight_power, default_starlight_power()) +/proc/default_starlight_power() + var/turf/open/space/read_from = /turf/open/space + return initial(read_from.light_power) + +/proc/set_base_starlight(star_color = null, range = null, power = null) + GLOB.base_starlight_color = star_color + set_starlight(star_color, range, power) + +/proc/set_starlight(star_color = null, range = null, power = null) + if(isnull(star_color)) + star_color = GLOB.starlight_color + var/old_star_color = GLOB.starlight_color + GLOB.starlight_color = star_color + // set light color on all lit turfs + for(var/turf/open/space/spess as anything in GLOB.starlight) + spess.set_light(l_range = range, l_power = power, l_color = star_color) + + if(star_color == old_star_color) + return + + // Update the base overlays + for(var/obj/light as anything in GLOB.starlight_objects) + light.color = star_color + // Send some signals that'll update everything that uses the color + SEND_GLOBAL_SIGNAL(COMSIG_STARLIGHT_COLOR_CHANGED, old_star_color, star_color) + +GLOBAL_LIST_EMPTY(starlight) + /turf/open/space icon = 'icons/turf/space.dmi' - icon_state = "0" + icon_state = "space" name = "\proper space" - intact = 0 + overfloor_placed = FALSE + underfloor_accessibility = UNDERFLOOR_INTERACTABLE temperature = TCMB thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT heat_capacity = 700000 - - FASTDMM_PROP(\ - pipe_astar_cost = 3\ - ) + var/starlight_source_count = 0 var/destination_z var/destination_x var/destination_y - var/global/datum/gas_mixture/immutable/space/space_gas = new + var/static/datum/gas_mixture/immutable/space/space_gas = new + // We do NOT want atmos adjacent turfs + init_air = FALSE + run_later = TRUE plane = PLANE_SPACE layer = SPACE_LAYER - light_power = 0.25 - dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + light_power = 1 + light_range = 2 + light_color = COLOR_STARLIGHT + light_height = LIGHTING_HEIGHT_SPACE + light_on = FALSE + space_lit = TRUE bullet_bounce_sound = null + vis_flags = VIS_INHERIT_ID //when this be added to vis_contents of something it be associated with something on clicking, important for visualisation of turf in openspace and interraction with openspace that show you turf. -/turf/open/space/basic/New() //Do not convert to Initialize - //This is used to optimize the map loader - return + force_no_gravity = TRUE -/turf/open/space/Initialize(mapload) +/turf/open/space/basic/New() //Do not convert to Initialize SHOULD_CALL_PARENT(FALSE) - icon_state = SPACE_ICON_STATE - air = space_gas - update_air_ref() - vis_contents.Cut() //removes inherited overlays - visibilityChanged() - - if (PERFORM_ALL_TESTS(focus_only/multiple_space_initialization)) - if(flags_1 & INITIALIZED_1) - stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 - - var/area/A = loc - if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) - add_overlay(/obj/effect/fullbright) - - if(requires_activation) - SSair.add_to_active(src) - - if (light_system == STATIC_LIGHT && light_power && light_range) - update_light() - - if (opacity) - directional_opacity = ALL_CARDINALS + //This is used to optimize the map loader + return - return INITIALIZE_HINT_NORMAL +/turf/open/space/Destroy() + GLOB.starlight -= src + return ..() //ATTACK GHOST IGNORING PARENT RETURN VALUE /turf/open/space/attack_ghost(mob/dead/observer/user) @@ -61,9 +90,6 @@ var/turf/T = locate(destination_x, destination_y, destination_z) user.forceMove(T) -/turf/open/space/Initalize_Atmos(times_fired) - return - /turf/open/space/TakeTemperature(temp) /turf/open/space/RemoveLattice() @@ -80,20 +106,32 @@ /turf/open/space/remove_air(amount) return null +/// Updates starlight. Called when we're unsure of a turf's starlight state +/// Returns TRUE if we succeed, FALSE otherwise /turf/open/space/proc/update_starlight() - if(CONFIG_GET(flag/starlight)) - for(var/t in RANGE_TURFS(1,src)) //RANGE_TURFS is in code\__HELPERS\game.dm - if(isspaceturf(t)) - //let's NOT update this that much pls - continue - set_light(2) - return - set_light(0) - -/turf/open/space/attack_paw(mob/user) - return attack_hand(user) + for(var/t in RANGE_TURFS(1, src)) //RANGE_TURFS is in code\__HELPERS\game.dm + // I've got a lot of cordons near spaceturfs, be good kids + if(isspaceturf(t) || istype(t, /turf/cordon)) + //let's NOT update this that much pls + continue + enable_starlight() + return TRUE + GLOB.starlight -= src + set_light(l_on = FALSE) + return FALSE + +/// Turns on the stars, if they aren't already +/turf/open/space/proc/enable_starlight() + if(!light_on) + set_light(l_on = TRUE, l_range = GLOB.starlight_range, l_power = GLOB.starlight_power, l_color = GLOB.starlight_color) + GLOB.starlight += src + +/turf/open/space/attack_paw(mob/user, list/modifiers) + return attack_hand(user, modifiers) /turf/open/space/proc/CanBuildHere() + if(destination_z) + return FALSE return TRUE /turf/open/space/handle_slip() @@ -104,54 +142,24 @@ if(!CanBuildHere()) return if(istype(C, /obj/item/stack/rods)) - var/obj/item/stack/rods/R = C - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - var/obj/structure/lattice/catwalk/W = locate(/obj/structure/lattice/catwalk, src) - if(W) - to_chat(user, span_warning("There is already a catwalk here!")) - return - if(L) - if(R.use(1)) - to_chat(user, span_notice("You construct a catwalk.")) - playsound(src, 'sound/weapons/genhit.ogg', 50, 1) - new/obj/structure/lattice/catwalk(src) - else - to_chat(user, span_warning("You need one rod to build a catwalk!")) - return - if(R.use(1)) - to_chat(user, span_notice("You construct a lattice.")) - playsound(src, 'sound/weapons/genhit.ogg', 50, 1) - ReplaceWithLattice() - else - to_chat(user, span_warning("You need one rod to build a lattice.")) - return - if(istype(C, /obj/item/stack/tile/plasteel)) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - var/obj/item/stack/tile/plasteel/S = C - if(S.use(1)) - qdel(L) - playsound(src, 'sound/weapons/genhit.ogg', 50, 1) - to_chat(user, span_notice("You build a floor.")) - PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - else - to_chat(user, span_warning("You need one floor tile to build a floor!")) - else - to_chat(user, span_warning("The plating is going to need some support! Place metal rods first.")) + build_with_rods(C, user) + else if(istype(C, /obj/item/stack/tile/plasteel)) + build_with_floor_tiles(C, user) -/turf/open/space/Entered(atom/movable/A) - ..() - if ((!(A) || src != A.loc)) + +/turf/open/space/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + . = ..() + if(!arrived || src != arrived.loc) return - if(destination_z && destination_x && destination_y && !(A.pulledby || !A.can_be_z_moved)) + if(destination_z && destination_x && destination_y && !arrived.pulledby && !arrived.currently_z_moving) var/tx = destination_x var/ty = destination_y var/turf/DT = locate(tx, ty, destination_z) var/itercount = 0 while(DT.density || istype(DT.loc,/area/shuttle)) // Extend towards the center of the map, trying to look for a better place to arrive if (itercount++ >= 100) - log_game("SPACE Z-TRANSIT ERROR: Could not find a safe place to land [A] within 100 iterations.") + log_game("SPACE Z-TRANSIT ERROR: Could not find a safe place to land [arrived] within 100 iterations.") break if (tx < 128) tx++ @@ -163,18 +171,13 @@ ty-- DT = locate(tx, ty, destination_z) - var/atom/movable/AM = A.pulling - A.forceMove(DT) - if(AM) - var/turf/T = get_step(A.loc,turn(A.dir, 180)) - AM.can_be_z_moved = FALSE - AM.forceMove(T) - A.start_pulling(AM) - AM.can_be_z_moved = TRUE + arrived.zMove(null, DT, ZMOVE_ALLOW_BUCKLED) - //now we're on the new z_level, proceed the space drifting - stoplag()//Let a diagonal move finish, if necessary - A.newtonian_move(A.inertia_dir) + var/atom/movable/current_pull = arrived.pulling + while (current_pull) + var/turf/target_turf = get_step(current_pull.pulledby.loc, REVERSE_DIR(current_pull.pulledby.dir)) || current_pull.pulledby.loc + current_pull.zMove(null, target_turf, ZMOVE_ALLOW_BUCKLED) + current_pull = current_pull.pulling /turf/open/space/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent) @@ -185,46 +188,25 @@ /turf/open/space/can_have_cabling() if(locate(/obj/structure/lattice/catwalk, src)) - return 1 - return 0 + return TRUE + return FALSE /turf/open/space/is_transition_turf() if(destination_x || destination_y || destination_z) - return 1 + return TRUE /turf/open/space/acid_act(acidpwr, acid_volume) - return 0 + return FALSE /turf/open/space/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - underlay_appearance.icon = 'icons/turf/space.dmi' - underlay_appearance.icon_state = SPACE_ICON_STATE - underlay_appearance.plane = PLANE_SPACE + generate_space_underlay(underlay_appearance, asking_turf) return TRUE - -/turf/open/space/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(!CanBuildHere()) - return FALSE - - switch(the_rcd.mode) - if(RCD_FLOORWALL) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1) - else - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) - return FALSE - -/turf/open/space/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_FLOORWALL) - to_chat(user, span_notice("You build a floor.")) - PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - return TRUE +/turf/open/space/rust_heretic_act() return FALSE -/turf/open/space/ReplaceWithLattice() +/turf/open/space/attempt_lattice_replacement() var/dest_x = destination_x var/dest_y = destination_y var/dest_z = destination_z @@ -232,3 +214,98 @@ destination_x = dest_x destination_y = dest_y destination_z = dest_z + +/turf/open/space/can_cross_safely(atom/movable/crossing) + return HAS_TRAIT(crossing, TRAIT_SPACEWALK) + +/turf/open/space/openspace + icon = 'icons/turf/floors.dmi' + icon_state = MAP_SWITCH("pure_white", "invisible") + plane = TRANSPARENT_FLOOR_PLANE + +/turf/open/space/openspace/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker + . = ..() + if(PERFORM_ALL_TESTS(focus_only/openspace_clear) && !GET_TURF_BELOW(src)) + stack_trace("[src] was inited as openspace with nothing below it at ([x], [y], [z])") + icon_state = "pure_white" + // We make the assumption that the space plane will never be blacklisted, as an optimization + if(SSmapping.max_plane_offset) + plane = TRANSPARENT_FLOOR_PLANE - (PLANE_RANGE * SSmapping.z_level_to_plane_offset[z]) + return INITIALIZE_HINT_LATELOAD + +/turf/open/space/openspace/LateInitialize() + . = ..() + AddElement(/datum/element/turf_z_transparency) + +/turf/open/space/openspace/Destroy() + // Signals persist through destroy, GO HOME + var/turf/below = GET_TURF_BELOW(src) + if(below) + UnregisterSignal(below, COMSIG_TURF_CHANGE) + return ..() + +/turf/open/space/openspace/zAirIn() + return TRUE + +/turf/open/space/openspace/zAirOut() + return TRUE + +/turf/open/space/openspace/zPassIn(direction) + if(direction == DOWN) + for(var/obj/contained_object in contents) + if(contained_object.obj_flags & BLOCK_Z_IN_DOWN) + return FALSE + return TRUE + if(direction == UP) + for(var/obj/contained_object in contents) + if(contained_object.obj_flags & BLOCK_Z_IN_UP) + return FALSE + return TRUE + return FALSE + +/turf/open/space/openspace/zPassOut(direction) + if(direction == DOWN) + for(var/obj/contained_object in contents) + if(contained_object.obj_flags & BLOCK_Z_OUT_DOWN) + return FALSE + return TRUE + if(direction == UP) + for(var/obj/contained_object in contents) + if(contained_object.obj_flags & BLOCK_Z_OUT_UP) + return FALSE + return TRUE + return FALSE + +/turf/open/space/openspace/enable_starlight() + var/turf/below = GET_TURF_BELOW(src) + // Override = TRUE beacuse we could have our starlight updated many times without a failure, which'd trigger this + RegisterSignal(below, COMSIG_TURF_CHANGE, PROC_REF(on_below_change), override = TRUE) + if(!isspaceturf(below) || light_on) + return + set_light(l_on = TRUE, l_range = GLOB.starlight_range, l_power = GLOB.starlight_power, l_color = GLOB.starlight_color) + GLOB.starlight += src + +/turf/open/space/openspace/update_starlight() + . = ..() + if(.) + return + // If we're here, the starlight is not to be + var/turf/below = GET_TURF_BELOW(src) + UnregisterSignal(below, COMSIG_TURF_CHANGE) + +/turf/open/space/openspace/proc/on_below_change(turf/source, path, list/new_baseturfs, flags, list/post_change_callbacks) + SIGNAL_HANDLER + if(isspaceturf(source) && !ispath(path, /turf/open/space)) + GLOB.starlight += src + set_light(l_on = TRUE, l_range = GLOB.starlight_range, l_power = GLOB.starlight_power, l_color = GLOB.starlight_color) + else if(!isspaceturf(source) && ispath(path, /turf/open/space)) + GLOB.starlight -= src + set_light(l_on = FALSE) + +/turf/open/space/replace_floor(turf/open/new_floor_path, flags) + if (!initial(new_floor_path.overfloor_placed)) + ChangeTurf(new_floor_path, flags = flags) + return + // Create plating under tiled floor we try to create directly onto space + place_on_top(/turf/open/floor/plating, flags = flags) + place_on_top(new_floor_path, flags = flags) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index d0aedb4525d9..0c4bd62332b5 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_EMPTY(station_turfs) icon = 'icons/turf/floors.dmi' level = 1 luminosity = 1 - + light_height = LIGHTING_HEIGHT_FLOOR var/dynamic_lighting = DYNAMIC_LIGHTING_ENABLED var/intact = 1 @@ -16,12 +16,25 @@ GLOBAL_LIST_EMPTY(station_turfs) // This shouldn't be modified directly, use the helper procs. var/list/baseturfs = /turf/baseturf_bottom + /// Turf bitflags, see code/__DEFINES/flags.dm + var/turf_flags = NONE + var/temperature = T20C var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to + /// If there's a tile over a basic floor that can be ripped out + var/overfloor_placed = FALSE + /// How accessible underfloor pieces such as wires, pipes, etc are on this turf. Can be HIDDEN, VISIBLE, or INTERACTABLE. + var/underfloor_accessibility = UNDERFLOOR_HIDDEN + /// If there is a lattice underneat this turf. Used for the attempt_lattice_replacement proc to determine if it should place lattice. + var/lattice_underneath = TRUE + var/blocks_air = FALSE + // Optimization, not for setting outside of initialize + var/init_air = TRUE + flags_1 = CAN_BE_DIRTY_1 var/list/image/blueprint_data //for the station blueprints, images of objects eg: pipes @@ -59,6 +72,10 @@ GLOBAL_LIST_EMPTY(station_turfs) var/force_no_gravity = FALSE + ///Bool, whether this turf will always be illuminated no matter what area it is in + ///Makes it look blue, be warned + var/space_lit = FALSE + /turf/vv_edit_var(var_name, new_value) var/static/list/banned_edits = list("x", "y", "z") @@ -159,8 +176,6 @@ GLOBAL_LIST_EMPTY(station_turfs) return user.Move_Pulled(src) -/turf/proc/multiz_turf_del(turf/T, dir) - /turf/proc/multiz_turf_new(turf/T, dir) //zPassIn doesn't necessarily pass an atom! @@ -652,3 +667,10 @@ GLOBAL_LIST_EMPTY(station_turfs) /// Called when attempting to set fire to a turf /turf/proc/IgniteTurf(power, fire_color="red") return + +/// Returns whether it is safe for an atom to move across this turf +/turf/proc/can_cross_safely(atom/movable/crossing) + return TRUE + +/turf/proc/multiz_turf_del(turf/T, dir) + SEND_SIGNAL(src, COMSIG_TURF_MULTIZ_DEL, T, dir) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 1fd2e701d888..7db5896f21d8 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -33,6 +33,8 @@ var/list/atmos_overlay_types //gas IDs of current active gas overlays is_openturf = TRUE + /// exists so things like space can ask to take 100% of a tile's gas + var/run_later = FALSE /turf/open/Initialize(mapload) if(!blocks_air) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 31adecb27a05..1ddb1a1cbc2d 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -1116,3 +1116,12 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(holder) holder.particool = new /datum/particle_editor(in_atom) holder.particool.ui_interact(mob) +/// Clears the client's screen, aside from ones that opt out +/client/proc/clear_screen() + for (var/object in screen) + if (istype(object, /atom/movable/screen)) + var/atom/movable/screen/screen_object = object + if (!screen_object.clear_with_screen) + continue + + screen -= object diff --git a/code/modules/client/preferences/multiz_parallax.dm b/code/modules/client/preferences/multiz_parallax.dm new file mode 100644 index 000000000000..d4f77e206b2a --- /dev/null +++ b/code/modules/client/preferences/multiz_parallax.dm @@ -0,0 +1,16 @@ +/// Whether or not to toggle multiz parallax, the parallax effect for lower z-levels. +/datum/preference/toggle/multiz_parallax + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "multiz_parallax" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/toggle/multiz_parallax/apply_to_client(client/client, value) + // Update the plane master group's Z transforms. + + var/datum/hud/my_hud = client.mob?.hud_used + if(!my_hud) + return + + for(var/group_key as anything in my_hud.master_groups) + var/datum/plane_master_group/group = my_hud.master_groups[group_key] + group.transform_lower_turfs(my_hud, my_hud.current_plane_offset) diff --git a/code/modules/client/preferences/multiz_performance.dm b/code/modules/client/preferences/multiz_performance.dm new file mode 100644 index 000000000000..7591401f2d8d --- /dev/null +++ b/code/modules/client/preferences/multiz_performance.dm @@ -0,0 +1,21 @@ +/// Boundary for how many z levels down to render properly before we start going cheapo mode +/datum/preference/numeric/multiz_performance + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "multiz_performance" + savefile_identifier = PREFERENCE_PLAYER + + minimum = MULTIZ_PERFORMANCE_DISABLE + maximum = MAX_EXPECTED_Z_DEPTH - 1 + +/datum/preference/numeric/multiz_performance/create_default_value() + return -1 + +/datum/preference/numeric/multiz_performance/apply_to_client(client/client, value) + // Update the plane master group's layering + var/datum/hud/my_hud = client.mob?.hud_used + if(!my_hud) + return + + for(var/group_key as anything in my_hud.master_groups) + var/datum/plane_master_group/group = my_hud.master_groups[group_key] + group.transform_lower_turfs(my_hud, my_hud.current_plane_offset) diff --git a/code/modules/lighting/static_lighting_area.dm b/code/modules/lighting/static_lighting_area.dm new file mode 100644 index 000000000000..e05868d0b829 --- /dev/null +++ b/code/modules/lighting/static_lighting_area.dm @@ -0,0 +1,59 @@ +/// List of plane offset + 1 -> object to display to use +/// Fills with offsets as they are generated +/// Holds a list of objects that represent starlight. The idea is to render_source them +/// So modifying starlight requires touching only one place (NOTE: this doesn't work for the area overlays) +/// In order to modify them you need to use set_starlight. Areas don't work with render sources it looks like +GLOBAL_LIST_INIT_TYPED(starlight_objects, /obj, list(starlight_object(0))) +/obj/starlight_appearance + icon = 'icons/effects/alphacolors.dmi' + icon_state = "white" + layer = LIGHTING_PRIMARY_LAYER + blend_mode = BLEND_ADD + screen_loc = "1,1" + +/proc/starlight_object(offset) + var/obj/starlight_appearance/glow = new() + SET_PLANE_W_SCALAR(glow, LIGHTING_PLANE, offset) + glow.layer = LIGHTING_PRIMARY_LAYER + glow.blend_mode = BLEND_ADD + glow.color = GLOB.starlight_color + glow.render_target = SPACE_OVERLAY_RENDER_TARGET(offset) + return glow + +/// List of plane offset + 1 -> mutable appearance to use +/// Fills with offsets as they are generated +/// They mirror their appearance from the starlight objects, which lets us save +/// time updating them +GLOBAL_LIST_INIT_TYPED(starlight_overlays, /obj, list(starlight_overlay(0))) + +/proc/starlight_overlay(offset) + var/mutable_appearance/glow = new /mutable_appearance() + SET_PLANE_W_SCALAR(glow, LIGHTING_PLANE, offset) + glow.layer = LIGHTING_PRIMARY_LAYER + glow.blend_mode = BLEND_ADD + glow.render_source = SPACE_OVERLAY_RENDER_TARGET(offset) + return glow + +/area + ///Whether this area allows static lighting and thus loads the lighting objects + var/static_lighting = TRUE + +//Non static lighting areas. +//Any lighting area that wont support static lights. +//These areas will NOT have corners generated. + +///regenerates lighting objects for turfs in this area, primary use is VV changes +/area/proc/create_area_lighting_objects() + for(var/turf/T in src) + if(T.space_lit) + continue + T.lighting_build_overlay() + CHECK_TICK + +///Removes lighting objects from turfs in this area if we have them, primary use is VV changes +/area/proc/remove_area_lighting_objects() + for(var/turf/T in src) + if(T.space_lit) + continue + T.lighting_clear_overlay() + CHECK_TICK diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index e62c604fd91f..5ebf5ca364d6 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -528,7 +528,7 @@ return ..() ///Move a mob between z levels, if it's valid to move z's on this turf -/mob/proc/zMove(dir, feedback = FALSE) +/mob/proc/zMoveMob(dir, feedback = FALSE) if(dir != UP && dir != DOWN) return FALSE var/turf/target = get_step_multiz(src, dir) diff --git a/code/modules/visual/render_step.dm b/code/modules/visual/render_step.dm new file mode 100644 index 000000000000..2dae53b44ba0 --- /dev/null +++ b/code/modules/visual/render_step.dm @@ -0,0 +1,92 @@ +/** + * Internal atom that uses render relays to apply "appearance things" to a render source + * Branch, subtypes have behavior +*/ +/atom/movable/render_step + name = "render step" + plane = DEFAULT_PLANE + layer = FLOAT_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + //Why? + //render_targets copy the transform of the target as well, but vis_contents also applies the transform + //we'll display using that, so we gotta reset + appearance_flags = KEEP_APART|KEEP_TOGETHER|RESET_TRANSFORM + +/atom/movable/render_step/Initialize(mapload, atom/source) + . = ..() + verbs.Cut() //Cargo cultttttt + + if(!source) + return + + render_source = source.render_target + SET_PLANE_EXPLICIT(src, initial(plane), source) + RegisterSignal(source, COMSIG_PARENT_QDELETING, PROC_REF(on_source_deleting)) + +/atom/movable/render_step/ex_act(severity) + return FALSE + +/atom/movable/render_step/singularity_act() + return + +/atom/movable/render_step/singularity_pull() + return + +/atom/movable/render_step/blob_act() + return + +//Prevents people from moving these after creation, because they shouldn't be. +/atom/movable/render_step/forceMove(atom/destination, no_tp=FALSE, harderforce = FALSE) + if(harderforce) + return ..() + +/atom/movable/render_step/proc/on_source_deleting(atom/source) + SIGNAL_HANDLER + + if(!QDELING(src)) + qdel(src) + +/** + * Render step that modfies an atom's color + * Useful for creating coherent emissive blockers out of things like glass floors by lowering alpha statically using matrixes + * Other stuff too I'm sure + */ +/atom/movable/render_step/color + name = "color step" + //RESET_COLOR is obvious I hope + appearance_flags = KEEP_APART|KEEP_TOGETHER|RESET_COLOR|RESET_TRANSFORM + +/atom/movable/render_step/color/Initialize(mapload, atom/source, color) + . = ..() + src.color = color + +/** + * Render step that makes the passed in render source block emissives + * + * Copies an appearance vis render_target and render_source on to the emissive blocking plane. + * This means that the atom in question will block any emissive sprites. + * This should only be used internally. If you are directly creating more of these, you're + * almost guaranteed to be doing something wrong. + */ +/atom/movable/render_step/emissive_blocker + name = "emissive blocker" + plane = EMISSIVE_PLANE + appearance_flags = EMISSIVE_APPEARANCE_FLAGS|RESET_TRANSFORM + +/atom/movable/render_step/emissive_blocker/Initialize(mapload, atom/source) + . = ..() + src.color = GLOB.em_block_color + +/** + * Render step that makes the passed in render source GLOW + * + * Copies an appearance vis render_target and render_source on to the emissive plane + */ +/atom/movable/render_step/emissive + name = "emissive" + plane = EMISSIVE_PLANE + appearance_flags = EMISSIVE_APPEARANCE_FLAGS|RESET_TRANSFORM + +/atom/movable/render_step/emissive/Initialize(mapload, source) + . = ..() + src.color = GLOB.emissive_color diff --git a/yogstation.dme b/yogstation.dme index e05d5c5526c2..cc5e642104a2 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -79,6 +79,8 @@ #include "code\__DEFINES\logging.dm" #include "code\__DEFINES\machines.dm" #include "code\__DEFINES\magic.dm" +#include "code\__DEFINES\map_switch.dm" +#include "code\__DEFINES\mapping.dm" #include "code\__DEFINES\maps.dm" #include "code\__DEFINES\materials.dm" #include "code\__DEFINES\maths.dm" @@ -91,6 +93,7 @@ #include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\movement.dm" #include "code\__DEFINES\movespeed_modification.dm" +#include "code\__DEFINES\multiz.dm" #include "code\__DEFINES\nanites.dm" #include "code\__DEFINES\networks.dm" #include "code\__DEFINES\obj_flags.dm" @@ -118,6 +121,7 @@ #include "code\__DEFINES\shuttles.dm" #include "code\__DEFINES\sight.dm" #include "code\__DEFINES\sound.dm" +#include "code\__DEFINES\space.dm" #include "code\__DEFINES\spaceman_dmm.dm" #include "code\__DEFINES\span.dm" #include "code\__DEFINES\speech_channels.dm" @@ -223,6 +227,7 @@ #include "code\__HELPERS\icon_smoothing.dm" #include "code\__HELPERS\icons.dm" #include "code\__HELPERS\level_traits.dm" +#include "code\__HELPERS\lighting.dm" #include "code\__HELPERS\maths.dm" #include "code\__HELPERS\matrices.dm" #include "code\__HELPERS\mobs.dm" @@ -240,6 +245,7 @@ #include "code\__HELPERS\screen_objs.dm" #include "code\__HELPERS\shell.dm" #include "code\__HELPERS\stat_tracking.dm" +#include "code\__HELPERS\string_lists.dm" #include "code\__HELPERS\text.dm" #include "code\__HELPERS\time.dm" #include "code\__HELPERS\traits.dm" @@ -678,6 +684,7 @@ #include "code\datums\elements\regenerator.dm" #include "code\datums\elements\rust.dm" #include "code\datums\elements\squish.dm" +#include "code\datums\elements\turf_transparency.dm" #include "code\datums\elements\update_icon_blocker.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" @@ -1512,6 +1519,7 @@ #include "code\game\turfs\closed.dm" #include "code\game\turfs\open.dm" #include "code\game\turfs\turf.dm" +#include "code\game\turfs\baseturfs\baseturfs.dm" #include "code\game\turfs\openspace\openspace.dm" #include "code\game\turfs\simulated\chasm.dm" #include "code\game\turfs\simulated\dirtystation.dm" @@ -2135,6 +2143,8 @@ #include "code\modules\client\preferences\jobless_role.dm" #include "code\modules\client\preferences\mood.dm" #include "code\modules\client\preferences\mood_enabling.dm" +#include "code\modules\client\preferences\multiz_parallax.dm" +#include "code\modules\client\preferences\multiz_performance.dm" #include "code\modules\client\preferences\names.dm" #include "code\modules\client\preferences\ooc.dm" #include "code\modules\client\preferences\parallax.dm" @@ -2602,6 +2612,7 @@ #include "code\modules\lighting\lighting_setup.dm" #include "code\modules\lighting\lighting_source.dm" #include "code\modules\lighting\lighting_turf.dm" +#include "code\modules\lighting\static_lighting_area.dm" #include "code\modules\mapping\map_template.dm" #include "code\modules\mapping\mapping_helpers.dm" #include "code\modules\mapping\minimap.dm" @@ -3796,6 +3807,7 @@ #include "code\modules\vending\toys.dm" #include "code\modules\vending\wardrobes.dm" #include "code\modules\vending\youtool.dm" +#include "code\modules\visual\render_step.dm" #include "code\modules\VR\vr_human.dm" #include "code\modules\VR\vr_sleeper.dm" #include "code\modules\zombie\items.dm" diff --git a/yogstation/code/game/turfs/change_turf.dm b/yogstation/code/game/turfs/change_turf.dm index 45ea3eca74db..3e0fdf6d164e 100644 --- a/yogstation/code/game/turfs/change_turf.dm +++ b/yogstation/code/game/turfs/change_turf.dm @@ -5,4 +5,14 @@ if(islist(baseturfs)) return ChangeTurf(baseturfs[1],baseturfs[1],flags) else - return ChangeTurf(baseturfs, baseturfs, flags) // The bottom baseturf will never go away \ No newline at end of file + return ChangeTurf(baseturfs, baseturfs, flags) // The bottom baseturf will never go away + + +/// Attempts to replace a tile with lattice. Amount is the amount of tiles to scrape away. +/turf/proc/attempt_lattice_replacement(amount = 2) + if(lattice_underneath) + var/turf/new_turf = ScrapeAway(amount, flags = CHANGETURF_INHERIT_AIR) + if(!istype(new_turf, /turf/open/floor)) + new /obj/structure/lattice(src) + else + ScrapeAway(amount, flags = CHANGETURF_INHERIT_AIR) From 64eaab46e624a1d5799bf6d645a433f785614d15 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 18:25:09 -0500 Subject: [PATCH 016/281] bye runtimes not me --- _maps/_basemap.dm | 2 +- code/_onclick/hud/parallax.dm | 42 +++++++++++++++++------------ code/modules/surgery/organs/eyes.dm | 3 +++ 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 48b96c8948f7..aadbfa88a035 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 046cdc245ab6..fab37f81b666 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -14,9 +14,15 @@ /datum/hud/proc/create_parallax(mob/viewmob) var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client + if (!apply_parallax_pref(viewmob)) //don't want shit computers to crash when specing someone with insane parallax, so use the viewer's pref + for(var/atom/movable/screen/plane_master/parallax as anything in get_true_plane_masters(PLANE_SPACE_PARALLAX)) + parallax.hide_plane(screenmob) return + for(var/atom/movable/screen/plane_master/parallax as anything in get_true_plane_masters(PLANE_SPACE_PARALLAX)) + parallax.unhide_plane(screenmob) + if(!length(C.parallax_layers_cached)) C.parallax_layers_cached = list() C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, C.view) @@ -35,28 +41,30 @@ C.parallax_layers.len = C.parallax_layers_max C.screen |= (C.parallax_layers) - var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] - if(screenmob != mymob) - C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen - C.screen += PM - PM.color = list( - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 1, 1, 1, 1, - 0, 0, 0, 0 - ) - + // We could do not do parallax for anything except the main plane group + // This could be changed, but it would require refactoring this whole thing + // And adding non client particular hooks for all the inputs, and I do not have the time I'm sorry :( + for(var/atom/movable/screen/plane_master/plane_master as anything in screenmob.hud_used.get_true_plane_masters(PLANE_SPACE)) + if(screenmob != mymob) + C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen + C.screen += plane_master + plane_master.color = list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 1, 1, 1, 1, + 0, 0, 0, 0 + ) /datum/hud/proc/remove_parallax(mob/viewmob) var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client C.screen -= (C.parallax_layers_cached) - var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] - if(screenmob != mymob) - C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen - C.screen += PM - PM.color = initial(PM.color) + for(var/atom/movable/screen/plane_master/plane_master as anything in screenmob.hud_used.get_true_plane_masters(PLANE_SPACE)) + if(screenmob != mymob) + C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen + C.screen += plane_master + plane_master.color = initial(plane_master.color) C.parallax_layers = null /datum/hud/proc/apply_parallax_pref(mob/viewmob) diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index db6dab5339f3..64fccd134caa 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -182,6 +182,9 @@ /obj/item/organ/eyes/night_vision/mushroom name = "fung-eye" desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced." + low_light_cutoff = list(0, 15, 20) + medium_light_cutoff = list(0, 20, 35) + high_light_cutoff = list(0, 40, 50) ///Robotic From 2526e4bd85831f60e3dbe63530b4db2d454f5e77 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 18:46:07 -0500 Subject: [PATCH 017/281] yeah ok --- code/__DEFINES/construction.dm | 6 --- code/__DEFINES/flags.dm | 2 - code/game/objects/structures/ladders.dm | 2 +- code/game/turfs/simulated/chasm.dm | 6 ++- code/game/turfs/turf.dm | 4 +- code/modules/mapping/ruins.dm | 4 +- .../space_management/multiz_helpers.dm | 6 +-- .../space_management/space_reservation.dm | 7 +++ .../mapping/space_management/traits.dm | 52 ++++++++++++++++--- code/modules/power/reactor/reactor.dm | 4 +- 10 files changed, 66 insertions(+), 27 deletions(-) diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index bdaf1343ac68..5578cf9a927b 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -7,16 +7,10 @@ #define RCD_DESIGN_MODE "rcd_design_mode" /// For changing turfs #define RCD_TURF (1 << 0) - /// Full tile windows - #define RCD_WINDOWGRILLE (1 << 1) /// Windoors & Airlocks - #define RCD_AIRLOCK (1 << 2) - /// Literarly anything that is spawned on top of a turf such as tables, machines etc #define RCD_STRUCTURE (1 << 3) /// For wallmounts like air alarms, fire alarms & apc #define RCD_WALLFRAME (1 << 4) - /// For deconstructing an structure - #define RCD_DECONSTRUCT (1 << 5) /// The typepath of the structure the rcd is trying to build #define RCD_DESIGN_PATH "rcd_design_path" diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 20b0012fbc8d..aa70ac67f0ea 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -223,8 +223,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define NO_LAVA_GEN (1<<3) /// Blocks ruins spawning on the turf. #define NO_RUINS (1<<4) -/// Blocks this turf from being rusted -#define NO_RUST (1<<5) /// Is this turf is "solid". Space and lava aren't for instance #define IS_SOLID (1<<6) /// This turf will never be cleared away by other objects on Initialize. diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index 27ee9e973cb2..7521fc6b8047 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -32,7 +32,7 @@ var/obj/structure/ladder/L if (!down) - L = locate() in SSmapping.get_turf_below(T) + L = locate() in GET_TURF_BELOW(T) if (L) down = L L.up = src // Don't waste effort looping the other way diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 482a7a9a7a7e..1c38a9af75a8 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -12,7 +12,7 @@ /turf/open/chasm/Initialize(mapload) . = ..() - AddComponent(/datum/component/chasm, SSmapping.get_turf_below(src)) + apply_components(mapload) /turf/open/chasm/proc/set_target(turf/target) var/datum/component/chasm/chasm_component = GetComponent(/datum/component/chasm) @@ -126,3 +126,7 @@ var/turf/T = pick(get_area_turfs(/area/fabric_of_reality)) if(T) set_target(T) + +/// Handles adding the chasm component to the turf (So stuff falls into it!) +/turf/open/chasm/proc/apply_components(mapload) + AddComponent(/datum/component/chasm, GET_TURF_BELOW(src), mapload) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 0c4bd62332b5..6a75bcefe155 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -119,7 +119,7 @@ GLOBAL_LIST_EMPTY(station_turfs) if(T) T.multiz_turf_new(src, DOWN) SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, DOWN) - T = SSmapping.get_turf_below(src) + T = GET_TURF_BELOW(src) if(T) T.multiz_turf_new(src, UP) SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, UP) @@ -142,7 +142,7 @@ GLOBAL_LIST_EMPTY(station_turfs) var/turf/T = SSmapping.get_turf_above(src) if(T) T.multiz_turf_del(src, DOWN) - T = SSmapping.get_turf_below(src) + T = GET_TURF_BELOW(src) if(T) T.multiz_turf_del(src, UP) if(force) diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index f6ed99bf937d..b6f3b8750112 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -121,7 +121,7 @@ for(var/v in current_pick.always_spawn_with) if(current_pick.always_spawn_with[v] == PLACE_BELOW) var/turf/T = locate(1,1,target_z) - if(!SSmapping.get_turf_below(T)) + if(!GET_TURF_BELOW(T)) if(forced_z) continue outer else @@ -181,7 +181,7 @@ if(PLACE_DEFAULT) forced_ruins[linked] = -1 if(PLACE_BELOW) - forced_ruins[linked] = SSmapping.get_turf_below(placed_turf) + forced_ruins[linked] = GET_TURF_BELOW(placed_turf) forced_z = 0 //Update the availible list diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm index ca7cd8d52042..6d2f648c227c 100644 --- a/code/modules/mapping/space_management/multiz_helpers.dm +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -1,12 +1,12 @@ /proc/get_step_multiz(ref, dir) + var/turf/us = get_turf(ref) if(dir & UP) dir &= ~UP - return get_step(SSmapping.get_turf_above(get_turf(ref)), dir) + return get_step(GET_TURF_ABOVE(us), dir) if(dir & DOWN) dir &= ~DOWN - return get_step(SSmapping.get_turf_below(get_turf(ref)), dir) + return get_step(GET_TURF_BELOW(us), dir) return get_step(ref, dir) - /proc/get_dir_multiz(turf/us, turf/them) us = get_turf(us) them = get_turf(them) diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index 12137ebf4ca5..cfe9b5043b89 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -13,6 +13,13 @@ var/turf_type = /turf/open/space ///Distance away from the cordon where we can put a "sort-cordon" and run some extra code (see make_repel). 0 makes nothing happen var/pre_cordon_distance = 0 + /// The z stack size of the reservation. Note that reservations are ALWAYS reserved from the bottom up + var/z_size = 0 + /// List of the bottom left turfs. Indexed by what their z index for this reservation is + var/list/bottom_left_turfs = list() + + /// List of the top right turfs. Indexed by what their z index for this reservation is + var/list/top_right_turfs = list() /datum/turf_reservation/transit turf_type = /turf/open/space/transit diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index 9ba8d96d5e1c..11f4ccaf203e 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -49,14 +49,50 @@ . += S.z_value break -// Attempt to get the turf below the provided one according to Z traits -/datum/controller/subsystem/mapping/proc/get_turf_below(turf/T) - if (!T) - return - var/offset = level_trait(T.z, ZTRAIT_DOWN) - if (!offset) - return - return locate(T.x, T.y, T.z + offset) +/// Calculates the effective bounds information for the given turf. Returns a list of the information, or null if not applicable. +/datum/turf_reservation/proc/calculate_turf_bounds_information(turf/target) + for(var/z_idx in 1 to z_size) + var/turf/bottom_left = bottom_left_turfs[z_idx] + var/turf/top_right = top_right_turfs[z_idx] + var/bl_x = bottom_left.x + var/bl_y = bottom_left.y + var/tr_x = top_right.x + var/tr_y = top_right.y + + if(target.x < bl_x) + continue + + if(target.y < bl_y) + continue + + if(target.x > tr_x) + continue + + if(target.y > tr_y) + continue + + var/list/return_information = list() + return_information["z_idx"] = z_idx + return_information["offset_x"] = target.x - bl_x + return_information["offset_y"] = target.y - bl_y + return return_information + return null + +/// Gets the turf below the given target. Returns null if there is no turf below the target +/datum/turf_reservation/proc/get_turf_below(turf/target) + var/list/bounds_info = calculate_turf_bounds_information(target) + if(isnull(bounds_info)) + return null + + var/z_idx = bounds_info["z_idx"] + // check what z level, if its the max, then there is no turf below + if(z_idx == z_size) + return null + + var/offset_x = bounds_info["offset_x"] + var/offset_y = bounds_info["offset_y"] + var/turf/bottom_left = bottom_left_turfs[z_idx + 1] + return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) // Attempt to get the turf above the provided one according to Z traits /datum/controller/subsystem/mapping/proc/get_turf_above(turf/T) diff --git a/code/modules/power/reactor/reactor.dm b/code/modules/power/reactor/reactor.dm index 5874490f5f25..da2b5fdafabb 100644 --- a/code/modules/power/reactor/reactor.dm +++ b/code/modules/power/reactor/reactor.dm @@ -593,10 +593,10 @@ T.assume_air(coolant_input) T.assume_air(moderator_input) T.assume_air(coolant_output) - var/turf/lower_turf = SSmapping.get_turf_below(T) + var/turf/lower_turf = GET_TURF_BELOW(T) if(lower_turf) // reactor fuel will melt down into the lower levels on multi-z maps like icemeta new /obj/structure/reactor_corium(lower_turf) - var/turf/lowest_turf = SSmapping.get_turf_below(lower_turf) + var/turf/lowest_turf = GET_TURF_BELOW(lower_turf) if(lowest_turf) // WE NEED TO GO DEEPER new /obj/structure/reactor_corium(lower_turf) explosion(get_turf(src), 0, 5, 10, 20, TRUE, TRUE) From 5544943c748b1fe12d0c58427fafdca5d0276bd4 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 18:54:42 -0500 Subject: [PATCH 018/281] yes yes --- code/game/objects/structures/ladders.dm | 2 +- code/game/turfs/turf.dm | 4 ++-- .../space_management/multiz_helpers.dm | 1 + .../mapping/space_management/traits.dm | 22 ++++++++++++------- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index 7521fc6b8047..6c8863004e56 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -38,7 +38,7 @@ L.up = src // Don't waste effort looping the other way L.update_appearance(UPDATE_ICON) if (!up) - L = locate() in SSmapping.get_turf_above(T) + L = locate() in GET_TURF_ABOVE(T) if (L) up = L L.down = src // Don't waste effort looping the other way diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 6a75bcefe155..0c9fcaea7f07 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -115,7 +115,7 @@ GLOBAL_LIST_EMPTY(station_turfs) if (light_system == STATIC_LIGHT && light_power && light_range) update_light() - var/turf/T = SSmapping.get_turf_above(src) + var/turf/T = GET_TURF_ABOVE(src) if(T) T.multiz_turf_new(src, DOWN) SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, DOWN) @@ -139,7 +139,7 @@ GLOBAL_LIST_EMPTY(station_turfs) if(!changing_turf) stack_trace("Incorrect turf deletion") changing_turf = FALSE - var/turf/T = SSmapping.get_turf_above(src) + var/turf/T = GET_TURF_ABOVE(src) if(T) T.multiz_turf_del(src, DOWN) T = GET_TURF_BELOW(src) diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm index 6d2f648c227c..a481aa005978 100644 --- a/code/modules/mapping/space_management/multiz_helpers.dm +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -7,6 +7,7 @@ dir &= ~DOWN return get_step(GET_TURF_BELOW(us), dir) return get_step(ref, dir) + /proc/get_dir_multiz(turf/us, turf/them) us = get_turf(us) them = get_turf(them) diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index 11f4ccaf203e..7545b2508a95 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -94,15 +94,21 @@ var/turf/bottom_left = bottom_left_turfs[z_idx + 1] return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) -// Attempt to get the turf above the provided one according to Z traits -/datum/controller/subsystem/mapping/proc/get_turf_above(turf/T) - if (!T) - return - var/offset = level_trait(T.z, ZTRAIT_UP) - if (!offset) - return - return locate(T.x, T.y, T.z + offset) +/// Gets the turf above the given target. Returns null if there is no turf above the target +/datum/turf_reservation/proc/get_turf_above(turf/target) + var/list/bounds_info = calculate_turf_bounds_information(target) + if(isnull(bounds_info)) + return null + var/z_idx = bounds_info["z_idx"] + // check what z level, if its the min, then there is no turf above + if(z_idx == 1) + return null + + var/offset_x = bounds_info["offset_x"] + var/offset_y = bounds_info["offset_y"] + var/turf/bottom_left = bottom_left_turfs[z_idx - 1] + return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) // Prefer not to use this one too often /datum/controller/subsystem/mapping/proc/get_station_center() var/station_z = levels_by_trait(ZTRAIT_STATION)[1] From 025f5c25922a706e2d5feeae6f831631b44234f0 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 19:03:37 -0500 Subject: [PATCH 019/281] why am I updating this god save me --- .../space_management/multiz_helpers.dm | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm index a481aa005978..34f2774b5aa8 100644 --- a/code/modules/mapping/space_management/multiz_helpers.dm +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -7,7 +7,7 @@ dir &= ~DOWN return get_step(GET_TURF_BELOW(us), dir) return get_step(ref, dir) - + /proc/get_dir_multiz(turf/us, turf/them) us = get_turf(us) them = get_turf(them) @@ -16,23 +16,34 @@ if(us.z == them.z) return get_dir(us, them) else - var/turf/T = us.above() + var/turf/T = GET_TURF_ABOVE(us) var/dir = NONE if(T && (T.z == them.z)) dir = UP else - T = us.below() + T = GET_TURF_BELOW(us) if(T && (T.z == them.z)) dir = DOWN else return get_dir(us, them) return (dir | get_dir(us, them)) -/turf/proc/above() - return get_step_multiz(src, UP) +/proc/get_lowest_turf(atom/ref) + var/turf/us = get_turf(ref) + var/turf/next = GET_TURF_BELOW(us) + while(next) + us = next + next = GET_TURF_BELOW(us) + return us -/turf/proc/below() - return get_step_multiz(src, DOWN) +// I wish this was lisp +/proc/get_highest_turf(atom/ref) + var/turf/us = get_turf(ref) + var/turf/next = GET_TURF_ABOVE(us) + while(next) + us = next + next = GET_TURF_ABOVE(us) + return us /proc/dir_inverse_multiz(dir) var/holder = dir & (UP|DOWN) @@ -46,3 +57,9 @@ holder = UP dir |= holder return dir + +/turf/proc/above() + return get_step_multiz(src, UP) + +/turf/proc/below() + return get_step_multiz(src, DOWN) From 7fd3733984fefbc9c3a2e1ffc270ef0b51b646eb Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 19:10:43 -0500 Subject: [PATCH 020/281] this is just like call of duty bro --- code/datums/mutable_appearance.dm | 53 +++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index f248da2a7323..c066b96cea41 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -4,18 +4,45 @@ // Mutable appearances are children of images, just so you know. -/mutable_appearance/New() +// Mutable appearances erase template vars on new, because they accept an appearance to copy as an arg +// If we have nothin to copy, we set the float plane +/mutable_appearance/New(mutable_appearance/to_copy) ..() - plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE - // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var + if(!to_copy) + plane = FLOAT_PLANE -// Helper similar to image() -/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE) - var/mutable_appearance/MA = new() - MA.icon = icon - MA.icon_state = icon_state - MA.layer = layer - MA.plane = plane - MA.alpha = alpha - MA.appearance_flags |= appearance_flags - return MA +/** Helper similar to image() + * + * icon - Our appearance's icon + * icon_state - Our appearance's icon state + * layer - Our appearance's layer + * atom/offset_spokesman - An atom to use as reference for the z position of this appearance. + * Only required if a plane is passed in. If this is not passed in we accept offset_const as a substitute + * plane - The plane to use for the appearance. If this is not FLOAT_PLANE we require context for the offset to use + * alpha - Our appearance's alpha + * appearance_flags - Our appearance's appearance_flags + * offset_const - A constant to offset our plane by, so it renders on the right "z layer" +**/ +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, atom/offset_spokesman, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE, offset_const) + var/mutable_appearance/appearance = new() + appearance.icon = icon + appearance.icon_state = icon_state + appearance.layer = layer + appearance.alpha = alpha + appearance.appearance_flags |= appearance_flags + if(plane != FLOAT_PLANE) + // You need to pass in some non null object to reference + if(isatom(offset_spokesman)) + // Note, we are ok with null turfs, that's not an error condition we'll just default to 0, the error would be + // Not passing ANYTHING in, key difference + SET_PLANE_EXPLICIT(appearance, plane, offset_spokesman) + // That or I'll let you pass in a static offset. Don't be stupid now + else if(!isnull(offset_const)) + SET_PLANE_W_SCALAR(appearance, plane, offset_const) + // otherwise if you're setting plane you better have the guts to back it up + else + stack_trace("No plane offset passed in as context for a non floating mutable appearance, things are gonna go to hell on multiz maps") + else if(!isnull(offset_spokesman) && !isatom(offset_spokesman)) + stack_trace("Why did you pass in offset_spokesman as [offset_spokesman]? We need an atom to properly offset planes") + + return appearance From df2f3124ab11949fa47d9a472f4fa06ef4da1a02 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 19:18:35 -0500 Subject: [PATCH 021/281] nah we back --- code/datums/mutable_appearance.dm | 53 ++++++++----------------------- 1 file changed, 13 insertions(+), 40 deletions(-) diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index c066b96cea41..f248da2a7323 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -4,45 +4,18 @@ // Mutable appearances are children of images, just so you know. -// Mutable appearances erase template vars on new, because they accept an appearance to copy as an arg -// If we have nothin to copy, we set the float plane -/mutable_appearance/New(mutable_appearance/to_copy) +/mutable_appearance/New() ..() - if(!to_copy) - plane = FLOAT_PLANE + plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE + // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var -/** Helper similar to image() - * - * icon - Our appearance's icon - * icon_state - Our appearance's icon state - * layer - Our appearance's layer - * atom/offset_spokesman - An atom to use as reference for the z position of this appearance. - * Only required if a plane is passed in. If this is not passed in we accept offset_const as a substitute - * plane - The plane to use for the appearance. If this is not FLOAT_PLANE we require context for the offset to use - * alpha - Our appearance's alpha - * appearance_flags - Our appearance's appearance_flags - * offset_const - A constant to offset our plane by, so it renders on the right "z layer" -**/ -/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, atom/offset_spokesman, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE, offset_const) - var/mutable_appearance/appearance = new() - appearance.icon = icon - appearance.icon_state = icon_state - appearance.layer = layer - appearance.alpha = alpha - appearance.appearance_flags |= appearance_flags - if(plane != FLOAT_PLANE) - // You need to pass in some non null object to reference - if(isatom(offset_spokesman)) - // Note, we are ok with null turfs, that's not an error condition we'll just default to 0, the error would be - // Not passing ANYTHING in, key difference - SET_PLANE_EXPLICIT(appearance, plane, offset_spokesman) - // That or I'll let you pass in a static offset. Don't be stupid now - else if(!isnull(offset_const)) - SET_PLANE_W_SCALAR(appearance, plane, offset_const) - // otherwise if you're setting plane you better have the guts to back it up - else - stack_trace("No plane offset passed in as context for a non floating mutable appearance, things are gonna go to hell on multiz maps") - else if(!isnull(offset_spokesman) && !isatom(offset_spokesman)) - stack_trace("Why did you pass in offset_spokesman as [offset_spokesman]? We need an atom to properly offset planes") - - return appearance +// Helper similar to image() +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE) + var/mutable_appearance/MA = new() + MA.icon = icon + MA.icon_state = icon_state + MA.layer = layer + MA.plane = plane + MA.alpha = alpha + MA.appearance_flags |= appearance_flags + return MA From fba7c4d2707fd6415c09f9d877fda9d8c6b19b5b Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 21:59:47 -0500 Subject: [PATCH 022/281] keep this up and you'll get a gold star me --- code/_onclick/hud/render_plate.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/hud/render_plate.dm b/code/_onclick/hud/render_plate.dm index 9d5b5db99338..359e3b9aa0bb 100644 --- a/code/_onclick/hud/render_plate.dm +++ b/code/_onclick/hud/render_plate.dm @@ -280,7 +280,7 @@ emissive.remove_filter("lighting_mask") // We max alpha here, so our darkness is actually.. dark // Can't do it before cause it fucks with the filter - add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME, offset), relay_color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,1)) + ///add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME, offset), relay_color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,1)) ///render plate for OOC stuff like ghosts, hud-screen effects, etc /atom/movable/screen/plane_master/rendering_plate/non_game From fcf38325f9b364c3236e7755cdf770f95adc33e7 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 23:50:30 -0500 Subject: [PATCH 023/281] im a twisted fucking cycle path yes --- code/__DEFINES/dcs/signals/signals_client.dm | 14 + code/__DEFINES/lag_switch.dm | 20 ++ code/__DEFINES/maps.dm | 2 + code/__DEFINES/sight.dm | 63 +++- code/__DEFINES/traits.dm | 2 + code/__HELPERS/_lists.dm | 26 ++ code/_globalvars/lists/mobs.dm | 1 + code/_onclick/hud/parallax.dm | 295 +++++++++--------- code/_onclick/hud/random_layer.dm | 52 +++ code/_onclick/hud/render_plate.dm | 2 +- .../configuration/entries/general.dm | 4 + code/controllers/lag_switch.dm | 146 +++++++++ code/controllers/subsystem/parallax.dm | 95 ++++-- code/datums/components/connect_mob_behalf.dm | 59 ++++ code/game/atom_invisibility.dm | 72 +++++ code/game/objects/items/robot/robot_items.dm | 2 +- code/modules/admin/holder2.dm | 2 + code/modules/client/client_defines.dm | 20 ++ code/modules/client/client_procs.dm | 55 +--- .../modules/mob/living/silicon/robot/robot.dm | 2 +- yogstation.dme | 6 + 21 files changed, 719 insertions(+), 221 deletions(-) create mode 100644 code/__DEFINES/dcs/signals/signals_client.dm create mode 100644 code/__DEFINES/lag_switch.dm create mode 100644 code/_onclick/hud/random_layer.dm create mode 100644 code/controllers/lag_switch.dm create mode 100644 code/datums/components/connect_mob_behalf.dm create mode 100644 code/game/atom_invisibility.dm diff --git a/code/__DEFINES/dcs/signals/signals_client.dm b/code/__DEFINES/dcs/signals/signals_client.dm new file mode 100644 index 000000000000..07e5251cad3b --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_client.dm @@ -0,0 +1,14 @@ +// from /client/proc/change_view() : (new_size) +#define COMSIG_VIEW_SET "view_set" + +// from /client/proc/handle_popup_close() : (window_id) +#define COMSIG_POPUP_CLEARED "popup_cleared" + +/// Called after one or more verbs are added: (list of verbs added) +#define COMSIG_CLIENT_VERB_ADDED "client_verb_added" + +/// Called after one or more verbs are added: (list of verbs added) +#define COMSIG_CLIENT_VERB_REMOVED "client_verb_removed" + +/// Called after a client logs into a mob: (mob) +#define COMSIG_CLIENT_MOB_LOGIN "client_mob_changed" diff --git a/code/__DEFINES/lag_switch.dm b/code/__DEFINES/lag_switch.dm new file mode 100644 index 000000000000..2115ce4a5dd4 --- /dev/null +++ b/code/__DEFINES/lag_switch.dm @@ -0,0 +1,20 @@ +// All of the possible Lag Switch lag mitigation measures +// If you add more do not forget to update MEASURES_AMOUNT accordingly +/// Stops ghosts flying around freely, they can still jump and orbit, staff exempted +#define DISABLE_DEAD_KEYLOOP 1 +/// Stops ghosts using zoom/t-ray verbs and resets their view if zoomed out, staff exempted +#define DISABLE_GHOST_ZOOM_TRAY 2 +/// Disable runechat and enable the bubbles, speaking mobs with TRAIT_BYPASS_MEASURES exempted +#define DISABLE_RUNECHAT 3 +/// Disable icon2html procs from verbs like examine, mobs calling with TRAIT_BYPASS_MEASURES exempted +#define DISABLE_USR_ICON2HTML 4 +/// Prevents anyone from joining the game as anything but observer +#define DISABLE_NON_OBSJOBS 5 +/// Limit IC/dchat spam to one message every x seconds per client, TRAIT_BYPASS_MEASURES exempted +#define SLOWMODE_SAY 6 +/// Disables parallax, as if everyone had disabled their preference, TRAIT_BYPASS_MEASURES exempted +#define DISABLE_PARALLAX 7 +/// Disables footsteps, TRAIT_BYPASS_MEASURES exempted +#define DISABLE_FOOTSTEPS 8 + +#define MEASURES_AMOUNT 8 // The total number of switches defined above diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 6bacc65b3ea1..635b395df8bc 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -140,3 +140,5 @@ require only minor tweaks. #define PLACE_LAVA_RUIN "lavaland" #define PLACE_ICE_RUIN "icesurface" #define PLACE_ICE_UNDERGROUND_RUIN "iceunderground" +///boolean - does this z disable parallax? +#define ZTRAIT_NOPARALLAX "No Parallax" diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm index 7952d9addd21..645e00941359 100644 --- a/code/__DEFINES/sight.dm +++ b/code/__DEFINES/sight.dm @@ -1,3 +1,5 @@ +#define INVISIBILITY_NONE 0 + #define SEE_INVISIBLE_MINIMUM 5 #define INVISIBILITY_LIGHTING 20 @@ -10,6 +12,8 @@ //#define SEE_INVISIBLE_LEVEL_TWO 45 //currently unused //#define INVISIBILITY_LEVEL_TWO 45 //currently unused +#define INVISIBILITY_REVENANT 50 + #define INVISIBILITY_OBSERVER 60 #define SEE_INVISIBLE_OBSERVER 60 @@ -17,19 +21,58 @@ #define INVISIBILITY_ABSTRACT 101 //only used for abstract objects (e.g. spacevine_controller), things that are not really there. -#define BORGMESON (1<<0) -#define BORGMESON_NIGHTVISION (1<<1) -#define BORGTHERM (1<<2) -#define BORGXRAY (1<<3) -#define BORGMATERIAL (1<<4) +#define BORGMESON (1<<0) +#define BORGTHERM (1<<1) +#define BORGXRAY (1<<2) +#define BORGMATERIAL (1<<3) //for clothing visor toggles, these determine which vars to toggle -#define VISOR_FLASHPROTECT (1<<0) -#define VISOR_TINT (1<<1) -#define VISOR_VISIONFLAGS (1<<2) //all following flags only matter for glasses -#define VISOR_DARKNESSVIEW (1<<3) -#define VISOR_INVISVIEW (1<<3) +#define VISOR_FLASHPROTECT (1<<0) +#define VISOR_TINT (1<<1) +#define VISOR_VISIONFLAGS (1<<2) //all following flags only matter for glasses +#define VISOR_INVISVIEW (1<<3) + +// BYOND internal values for the sight flags +// See [https://www.byond.com/docs/ref/#/mob/var/sight] +/// can't see anything +//#define BLIND (1<<0) +/// can see all mobs, no matter what +//#define SEE_MOBS (1<<2) +/// can see all objs, no matter what +//#define SEE_OBJS (1<<3) +// can see all turfs (and areas), no matter what +//#define SEE_TURFS (1<<4) +/// can see self, no matter what +//#define SEE_SELF (1<<5) +/// can see infra-red objects (different sort of luminosity, essentially a copy of it, one we do not use) +//#define SEE_INFRA (1<<6) +/// if an object is located on an unlit area, but some of its pixels are +/// in a lit area (via pixel_x,y or smooth movement), can see those pixels +//#define SEE_PIXELS (1<<8) +/// can see through opaque objects +//#define SEE_THRU (1<<9) +/// render dark tiles as blackness (Note, this basically means we draw dark tiles to plane 0) +/// we can then hijack that plane with a plane master, and start drawing it anywhere we want +/// NOTE: this does not function with the SIDE_MAP map format. So we can't. :( +//#define SEE_BLACKNESS (1<<10) /// Bitfield of sight flags that show THINGS but no lighting /// Since lighting is an underlay on turfs, this is everything but that #define SEE_AVOID_TURF_BLACKNESS (SEE_MOBS|SEE_OBJS) + +//------------------------ +// INVISIBILITY PRIORITIES + +#define INVISIBILITY_PRIORITY_ADMIN 100 +#define INVISIBILITY_PRIORITY_TURRET_COVER 20 +#define INVISIBILITY_PRIORITY_BASIC_ANTI_INVISIBILITY 10 +#define INVISIBILITY_PRIORITY_NONE 0 + +//------------------------ +// INVISIBILITY SOURCE IDS +// Though don't feel the need to add one here if you have a simple effect that +// gets added and/or removed in only one place near eachother in the code. + +#define INVISIBILITY_SOURCE_INVISIMIN "invisimin" +#define INVISIBILITY_SOURCE_STEALTHMODE "stealthmode" + diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index fbd330ae2e86..ba56ac55edb0 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -513,3 +513,5 @@ #define TRAIT_SPACEWALK "spacewalk" ///Turf trait for when a turf is transparent #define TURF_Z_TRANSPARENT_TRAIT "turf_z_transparent" +/// This mob overrides certian SSlag_switch measures with this special trait +#define TRAIT_BYPASS_MEASURES "bypass_lagswitch_measures" diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 5b5e11d4cafd..0331c7010150 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -739,3 +739,29 @@ ///sort any value in a list /proc/sort_list(list/list_to_sort, cmp=/proc/cmp_text_asc) return sortTim(list_to_sort.Copy(), cmp) + +/** + * Picks a random element from a list based on a weighting system. + * For example, given the following list: + * A = 6, B = 3, C = 1, D = 0 + * A would have a 60% chance of being picked, + * B would have a 30% chance of being picked, + * C would have a 10% chance of being picked, + * and D would have a 0% chance of being picked. + * You should only pass integers in. + */ +/proc/pick_weight(list/list_to_pick) + var/total = 0 + var/item + for(item in list_to_pick) + if(!list_to_pick[item]) + list_to_pick[item] = 0 + total += list_to_pick[item] + + total = rand(1, total) + for(item in list_to_pick) + total -= list_to_pick[item] + if(total <= 0 && list_to_pick[item]) + return item + + return null diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index f0b9240d33e0..1d5863f3ce2b 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -7,6 +7,7 @@ GLOBAL_LIST_EMPTY(stealthminID) //reference list with IDs that store ckeys, //This is for procs to replace all the goddamn 'in world's that are chilling around the code GLOBAL_LIST_EMPTY(player_list) //all mobs **with clients attached**. +GLOBAL_LIST_EMPTY(keyloop_list) //as above but can be limited to boost performance GLOBAL_LIST_EMPTY(mob_list) //all mobs, including clientless GLOBAL_LIST_EMPTY(mob_directory) //mob_id -> mob GLOBAL_LIST_EMPTY(alive_mob_list) //all alive mobs, including clientless. Excludes /mob/dead/new_player diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index fab37f81b666..506226b41ead 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -1,16 +1,4 @@ -/client - var/list/parallax_layers - var/list/parallax_layers_cached - var/atom/movable/movingmob - var/turf/previous_turf - var/dont_animate_parallax //world.time of when we can state animate()ing parallax again - var/last_parallax_shift //world.time of last update - var/parallax_throttle = 0 //ds between updates - var/parallax_movedir = 0 - var/parallax_layers_max = 4 - var/parallax_animate_timer - /datum/hud/proc/create_parallax(mob/viewmob) var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client @@ -25,15 +13,12 @@ if(!length(C.parallax_layers_cached)) C.parallax_layers_cached = list() - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, C.view) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, C.view) - if(HAS_TRAIT(SSstation, STATION_TRAIT_MOONSCORCH)) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet/moonscorch(null, C.view) - else - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, src) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, src) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, src) if(SSparallax.random_layer) - C.parallax_layers_cached += new SSparallax.random_layer - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, C.view) + C.parallax_layers_cached += new SSparallax.random_layer.type(null, src, FALSE, SSparallax.random_layer) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, src) C.parallax_layers = C.parallax_layers_cached.Copy() @@ -69,44 +54,60 @@ /datum/hud/proc/apply_parallax_pref(mob/viewmob) var/mob/screenmob = viewmob || mymob + var/turf/screen_location = get_turf(screenmob) + + if(SSmapping.level_trait(screen_location?.z, ZTRAIT_NOPARALLAX)) + for(var/atom/movable/screen/plane_master/white_space as anything in get_true_plane_masters(PLANE_SPACE)) + white_space.hide_plane(screenmob) + return FALSE + + for(var/atom/movable/screen/plane_master/white_space as anything in get_true_plane_masters(PLANE_SPACE)) + white_space.unhide_plane(screenmob) + + if (SSlag_switch.measures[DISABLE_PARALLAX] && !HAS_TRAIT(viewmob, TRAIT_BYPASS_MEASURES)) + return FALSE + var/client/C = screenmob.client - if(C.prefs) - var/pref = C.prefs.read_preference(/datum/preference/choiced/parallax) - if (isnull(pref)) - pref = PARALLAX_HIGH - switch(pref) - if (PARALLAX_INSANE) - C.parallax_throttle = FALSE - C.parallax_layers_max = 5 - return TRUE - - if (PARALLAX_MED) - C.parallax_throttle = PARALLAX_DELAY_MED - C.parallax_layers_max = 3 - return TRUE - - if (PARALLAX_LOW) - C.parallax_throttle = PARALLAX_DELAY_LOW - C.parallax_layers_max = 1 - return TRUE - - if (PARALLAX_DISABLE) - return FALSE - - //This is high parallax. - C.parallax_throttle = PARALLAX_DELAY_DEFAULT - C.parallax_layers_max = 4 - return TRUE + // Default to HIGH + var/parallax_selection = C?.prefs.read_preference(/datum/preference/choiced/parallax) || PARALLAX_HIGH + + switch(parallax_selection) + if (PARALLAX_INSANE) + C.parallax_layers_max = 5 + C.do_parallax_animations = TRUE + return TRUE + + if(PARALLAX_HIGH) + C.parallax_layers_max = 4 + C.do_parallax_animations = TRUE + return TRUE + + if (PARALLAX_MED) + C.parallax_layers_max = 3 + C.do_parallax_animations = TRUE + return TRUE + + if (PARALLAX_LOW) + C.parallax_layers_max = 1 + C.do_parallax_animations = FALSE + return TRUE + + if (PARALLAX_DISABLE) + return FALSE /datum/hud/proc/update_parallax_pref(mob/viewmob) - remove_parallax(viewmob) - create_parallax(viewmob) - update_parallax() + var/mob/screen_mob = viewmob || mymob + if(!screen_mob.client) + return + remove_parallax(screen_mob) + create_parallax(screen_mob) + update_parallax(screen_mob) // This sets which way the current shuttle is moving (returns true if the shuttle has stopped moving so the caller can append their animation) -/datum/hud/proc/set_parallax_movedir(new_parallax_movedir, skip_windups) +/datum/hud/proc/set_parallax_movedir(new_parallax_movedir = 0, skip_windups, mob/viewmob) . = FALSE - var/client/C = mymob.client + var/mob/screenmob = viewmob || mymob + var/client/C = screenmob.client if(new_parallax_movedir == C.parallax_movedir) return var/animatedir = new_parallax_movedir @@ -178,29 +179,25 @@ L.transform = newtransform - animate(L, transform = L.transform, time = 0 SECONDS, loop = -1, flags = ANIMATION_END_NOW) + animate(L, transform = L.transform, time = 0, loop = -1, flags = ANIMATION_END_NOW) animate(transform = matrix(), time = T) -/datum/hud/proc/update_parallax() - var/client/C = mymob.client - if(!C) - return - var/turf/posobj = get_turf_global(C.eye) // yogs - replace get_turf with get_turf_global +/datum/hud/proc/update_parallax(mob/viewmob) + var/mob/screenmob = viewmob || mymob + var/client/C = screenmob.client + var/turf/posobj = get_turf(C.eye) if(!posobj) return - var/area/areaobj = posobj.loc + var/area/areaobj = posobj.loc // Update the movement direction of the parallax if necessary (for shuttles) - set_parallax_movedir(areaobj.parallax_movedir, FALSE) + set_parallax_movedir(areaobj.parallax_movedir, FALSE, screenmob) - var/force + var/force = FALSE if(!C.previous_turf || (C.previous_turf.z != posobj.z)) C.previous_turf = posobj force = TRUE - if (!force && world.time < C.last_parallax_shift+C.parallax_throttle) - return - //Doing it this way prevents parallax layers from "jumping" when you change Z-Levels. var/offset_x = posobj.x - C.previous_turf.x var/offset_y = posobj.y - C.previous_turf.y @@ -208,83 +205,105 @@ if(!offset_x && !offset_y && !force) return - var/last_delay = world.time - C.last_parallax_shift - last_delay = min(last_delay, C.parallax_throttle) + var/glide_rate = round(world.icon_size / screenmob.glide_size * world.tick_lag, world.tick_lag) C.previous_turf = posobj - C.last_parallax_shift = world.time - for(var/thing in C.parallax_layers) - var/atom/movable/screen/parallax_layer/L = thing - L.update_status(mymob) - if (L.view_sized != C.view) - L.update_o(C.view) + var/largest_change = max(abs(offset_x), abs(offset_y)) + var/max_allowed_dist = (glide_rate / world.tick_lag) + 1 + // If we aren't already moving/don't allow parallax, have made some movement, and that movement was smaller then our "glide" size, animate + var/run_parralax = (C.do_parallax_animations && glide_rate && !areaobj.parallax_movedir && C.dont_animate_parallax <= world.time && largest_change <= max_allowed_dist) + for(var/atom/movable/screen/parallax_layer/parallax_layer as anything in C.parallax_layers) + var/our_speed = parallax_layer.speed var/change_x var/change_y - - if(L.absolute) - L.offset_x = -(posobj.x - SSparallax.planet_x_offset) * L.speed - L.offset_y = -(posobj.y - SSparallax.planet_y_offset) * L.speed + if(parallax_layer.absolute) + // We use change here so the typically large absolute objects (just lavaland for now) don't jitter so much + change_x = (posobj.x - SSparallax.planet_x_offset) * our_speed + parallax_layer.offset_x + change_y = (posobj.y - SSparallax.planet_y_offset) * our_speed + parallax_layer.offset_y else - change_x = offset_x * L.speed - L.offset_x -= change_x - change_y = offset_y * L.speed - L.offset_y -= change_y - - if(L.offset_x > 240) - L.offset_x -= 480 - if(L.offset_x < -240) - L.offset_x += 480 - if(L.offset_y > 240) - L.offset_y -= 480 - if(L.offset_y < -240) - L.offset_y += 480 - - - if(!areaobj.parallax_movedir && C.dont_animate_parallax <= world.time && (offset_x || offset_y) && abs(offset_x) <= max(C.parallax_throttle/world.tick_lag+1,1) && abs(offset_y) <= max(C.parallax_throttle/world.tick_lag+1,1) && (round(abs(change_x)) > 1 || round(abs(change_y)) > 1)) - L.transform = matrix(1, 0, offset_x*L.speed, 0, 1, offset_y*L.speed) - animate(L, transform=matrix(), time = last_delay) - - L.screen_loc = "CENTER-7:[round(L.offset_x,1)],CENTER-7:[round(L.offset_y,1)]" + change_x = offset_x * our_speed + change_y = offset_y * our_speed + + // This is how we tile parralax sprites + // It doesn't use change because we really don't want to animate this + if(parallax_layer.offset_x - change_x > 240) + parallax_layer.offset_x -= 480 + else if(parallax_layer.offset_x - change_x < -240) + parallax_layer.offset_x += 480 + if(parallax_layer.offset_y - change_y > 240) + parallax_layer.offset_y -= 480 + else if(parallax_layer.offset_y - change_y < -240) + parallax_layer.offset_y += 480 + + // Now that we have our offsets, let's do our positioning + parallax_layer.offset_x -= change_x + parallax_layer.offset_y -= change_y + + parallax_layer.screen_loc = "CENTER-7:[round(parallax_layer.offset_x, 1)],CENTER-7:[round(parallax_layer.offset_y, 1)]" + + // We're going to use a transform to "glide" that last movement out, so it looks nicer + // Don't do any animates if we're not actually moving enough distance yeah? thanks lad + if(run_parralax && (largest_change * our_speed > 1)) + parallax_layer.transform = matrix(1,0,change_x, 0,1,change_y) + animate(parallax_layer, transform=matrix(), time = glide_rate) /atom/movable/proc/update_parallax_contents() - if(length(client_mobs_in_contents)) - for(var/thing in client_mobs_in_contents) - var/mob/M = thing - if(M && M.client && M.hud_used && length(M.client.parallax_layers)) - M.hud_used.update_parallax() - -/mob/proc/update_parallax_teleport() //used for arrivals shuttle - if(client && client.eye && hud_used && length(client.parallax_layers)) + for(var/mob/client_mob as anything in client_mobs_in_contents) + if(length(client_mob?.client?.parallax_layers) && client_mob.hud_used) + client_mob.hud_used.update_parallax() + +/mob/proc/update_parallax_teleport() //used for arrivals shuttle + if(client?.eye && hud_used && length(client.parallax_layers)) var/area/areaobj = get_area(client.eye) hud_used.set_parallax_movedir(areaobj.parallax_movedir, TRUE) +// We need parallax to always pass its args down into initialize, so we immediate init it +INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) /atom/movable/screen/parallax_layer icon = 'icons/effects/parallax.dmi' var/speed = 1 var/offset_x = 0 var/offset_y = 0 - var/view_sized var/absolute = FALSE blend_mode = BLEND_ADD plane = PLANE_SPACE_PARALLAX screen_loc = "CENTER-7,CENTER-7" mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/atom/movable/screen/parallax_layer/Initialize(mapload, view) +/atom/movable/screen/parallax_layer/Initialize(mapload, datum/hud/hud_owner, template = FALSE) . = ..() - if (!view) - view = world.view + // Parallax layers are independant of hud, they care about client + // Not doing this will just create a bunch of hard deletes + hud = null + + if(template) + return + + var/client/boss = hud_owner?.mymob?.canon_client + + if(!boss) // If this typepath all starts to harddel your culprit is likely this + return INITIALIZE_HINT_QDEL + + // I do not want to know bestie + var/view = boss.view || world.view update_o(view) + RegisterSignal(boss, COMSIG_VIEW_SET, PROC_REF(on_view_change)) + +/atom/movable/screen/parallax_layer/proc/on_view_change(datum/source, new_size) + SIGNAL_HANDLER + update_o(new_size) /atom/movable/screen/parallax_layer/proc/update_o(view) if (!view) view = world.view + var/static/parallax_scaler = world.icon_size / 480 + + // Turn the view size into a grid of correctly scaled overlays var/list/viewscales = getviewsize(view) - var/countx = CEILING((viewscales[1]/2)/(480/world.icon_size), 1)+1 - var/county = CEILING((viewscales[2]/2)/(480/world.icon_size), 1)+1 + var/countx = CEILING((viewscales[1] / 2) * parallax_scaler, 1) + 1 + var/county = CEILING((viewscales[2] / 2) * parallax_scaler, 1) + 1 var/list/new_overlays = new for(var/x in -countx to countx) for(var/y in -county to county) @@ -295,10 +314,6 @@ new_overlays += texture_overlay cut_overlays() add_overlay(new_overlays) - view_sized = view - -/atom/movable/screen/parallax_layer/proc/update_status(mob/M) - return /atom/movable/screen/parallax_layer/layer_1 icon_state = "layer1" @@ -315,21 +330,6 @@ speed = 1.4 layer = 3 -/atom/movable/screen/parallax_layer/random - blend_mode = BLEND_OVERLAY - speed = 3 - layer = 3 - -/atom/movable/screen/parallax_layer/random/space_gas - icon_state = "random_layer1" - -/atom/movable/screen/parallax_layer/random/space_gas/Initialize(mapload, view) - . = ..() - src.add_atom_colour(SSparallax.random_parallax_color, ADMIN_COLOUR_PRIORITY) - -/atom/movable/screen/parallax_layer/random/asteroids - icon_state = "random_layer2" - /atom/movable/screen/parallax_layer/planet icon_state = "planet" blend_mode = BLEND_OVERLAY @@ -337,15 +337,30 @@ speed = 3 layer = 30 -/atom/movable/screen/parallax_layer/planet/moonscorch - icon_state = "rheus_moon" - -/atom/movable/screen/parallax_layer/planet/update_status(mob/M) - var/turf/T = get_turf(M) - if(is_station_level(T.z)) - invisibility = 0 - else - invisibility = INVISIBILITY_ABSTRACT +/atom/movable/screen/parallax_layer/planet/Initialize(mapload, datum/hud/hud_owner) + . = ..() + var/client/boss = hud_owner?.mymob?.canon_client + if(!boss) + return + var/static/list/connections = list( + COMSIG_MOVABLE_Z_CHANGED = PROC_REF(on_z_change), + COMSIG_MOB_LOGOUT = PROC_REF(on_mob_logout), + ) + AddComponent(/datum/component/connect_mob_behalf, boss, connections) + on_z_change(hud_owner?.mymob) + +/atom/movable/screen/parallax_layer/planet/proc/on_mob_logout(mob/source) + SIGNAL_HANDLER + var/client/boss = source.canon_client + on_z_change(boss.mob) + +/atom/movable/screen/parallax_layer/planet/proc/on_z_change(mob/source) + SIGNAL_HANDLER + var/client/boss = source.client + var/turf/posobj = get_turf(boss?.eye) + if(!posobj) + return + SetInvisibility(is_station_level(posobj.z) ? INVISIBILITY_NONE : INVISIBILITY_ABSTRACT, id=type) /atom/movable/screen/parallax_layer/planet/update_o() - return //Shit wont move + return //Shit won't move diff --git a/code/_onclick/hud/random_layer.dm b/code/_onclick/hud/random_layer.dm new file mode 100644 index 000000000000..379c0cbe2d9b --- /dev/null +++ b/code/_onclick/hud/random_layer.dm @@ -0,0 +1,52 @@ +/// Parallax layers that vary between rounds. Has some code to make sure we all have the same one +/atom/movable/screen/parallax_layer/random + blend_mode = BLEND_OVERLAY + speed = 2 + layer = 3 + +/atom/movable/screen/parallax_layer/random/Initialize(mapload, datum/hud/hud_owner, template, atom/movable/screen/parallax_layer/random/twin) + . = ..() + + if(twin) + copy_parallax(twin) + +/// Make this layer unique, with color or position or something +/atom/movable/screen/parallax_layer/random/proc/get_random_look() + return + +/// Copy a parallax instance to ensure parity between everyones parallax +/atom/movable/screen/parallax_layer/random/proc/copy_parallax(atom/movable/screen/parallax_layer/random/twin) + return + +/// For applying minor effects related to parallax. If you want big stuff, put it in a station trait or something +/atom/movable/screen/parallax_layer/random/proc/apply_global_effects() + return + +/// Gassy background with a few random colors +/atom/movable/screen/parallax_layer/random/space_gas + icon_state = "space_gas" + + /// The colors we can be + var/possible_colors = list(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE) + /// The color we are + var/parallax_color + +/atom/movable/screen/parallax_layer/random/space_gas/get_random_look() + parallax_color = parallax_color || pick(possible_colors) + +/atom/movable/screen/parallax_layer/random/space_gas/copy_parallax(atom/movable/screen/parallax_layer/random/space_gas/twin) + parallax_color = twin.parallax_color + add_atom_colour(parallax_color, ADMIN_COLOUR_PRIORITY) + +/// Space gas but green for the radioactive nebula station trait +/atom/movable/screen/parallax_layer/random/space_gas/radioactive + parallax_color = list(0,0,0,0, 0,2,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) //very vibrant green + +/atom/movable/screen/parallax_layer/random/space_gas/radioactive/apply_global_effects() + . = ..() + set_base_starlight("#189156") + +/// Big asteroid rocks appear in the background +/atom/movable/screen/parallax_layer/random/asteroids + icon_state = "asteroids" + layer = 4 diff --git a/code/_onclick/hud/render_plate.dm b/code/_onclick/hud/render_plate.dm index 359e3b9aa0bb..ae05da8839a7 100644 --- a/code/_onclick/hud/render_plate.dm +++ b/code/_onclick/hud/render_plate.dm @@ -280,7 +280,7 @@ emissive.remove_filter("lighting_mask") // We max alpha here, so our darkness is actually.. dark // Can't do it before cause it fucks with the filter - ///add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME, offset), relay_color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,1)) + ///add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME, offset), relay_color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,1)) -- this makes the walls pitch black (cant see stuff on them) ///render plate for OOC stuff like ghosts, hud-screen effects, etc /atom/movable/screen/plane_master/rendering_plate/non_game diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 2252e5ea54de..d221400577f3 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -308,6 +308,10 @@ max_val = 1 integer = FALSE +/datum/config_entry/number/auto_lag_switch_pop //Number of clients at which drastic lag mitigation measures kick in + config_entry_value = null + min_val = 0 + /datum/config_entry/number/soft_popcap config_entry_value = null min_val = 0 diff --git a/code/controllers/lag_switch.dm b/code/controllers/lag_switch.dm new file mode 100644 index 000000000000..c79db0518601 --- /dev/null +++ b/code/controllers/lag_switch.dm @@ -0,0 +1,146 @@ +/// The subsystem for controlling drastic performance enhancements aimed at reducing server load for a smoother albeit slightly duller gaming experience +SUBSYSTEM_DEF(lag_switch) + name = "Lag Switch" + flags = SS_NO_FIRE + + /// If the lag switch measures should attempt to trigger automatically, TRUE if a config value exists + var/auto_switch = FALSE + /// Amount of connected clients at which the Lag Switch should engage, set via config or admin panel + var/trigger_pop = INFINITY - 1337 + /// List of bools corresponding to code/__DEFINES/lag_switch.dm + var/static/list/measures[MEASURES_AMOUNT] + /// List of measures that toggle automatically + var/list/auto_measures = list(DISABLE_GHOST_ZOOM_TRAY, DISABLE_RUNECHAT, DISABLE_USR_ICON2HTML, DISABLE_PARALLAX, DISABLE_FOOTSTEPS) + /// Timer ID for the automatic veto period + var/veto_timer_id + /// Cooldown between say verb uses when slowmode is enabled + var/slowmode_cooldown = 3 SECONDS + +/datum/controller/subsystem/lag_switch/Initialize() + for(var/i in 1 to measures.len) + measures[i] = FALSE + var/auto_switch_pop = CONFIG_GET(number/auto_lag_switch_pop) + if(auto_switch_pop) + auto_switch = TRUE + trigger_pop = auto_switch_pop + RegisterSignal(SSdcs, COMSIG_GLOB_CLIENT_CONNECT, PROC_REF(client_connected)) + return SS_INIT_SUCCESS + +/datum/controller/subsystem/lag_switch/proc/client_connected(datum/source, client/connected) + SIGNAL_HANDLER + if(TGS_CLIENT_COUNT < trigger_pop) + return + + auto_switch = FALSE + UnregisterSignal(SSdcs, COMSIG_GLOB_CLIENT_CONNECT) + veto_timer_id = addtimer(CALLBACK(src, PROC_REF(set_all_measures), TRUE, TRUE), 20 SECONDS, TIMER_STOPPABLE) + message_admins("Lag Switch population threshold reached. Automatic activation of lag mitigation measures occuring in 20 seconds. (CANCEL)") + log_admin("Lag Switch population threshold reached. Automatic activation of lag mitigation measures occuring in 20 seconds.") + +/// (En/Dis)able automatic triggering of switches based on client count +/datum/controller/subsystem/lag_switch/proc/toggle_auto_enable() + auto_switch = !auto_switch + if(auto_switch) + RegisterSignal(SSdcs, COMSIG_GLOB_CLIENT_CONNECT, PROC_REF(client_connected)) + else + UnregisterSignal(SSdcs, COMSIG_GLOB_CLIENT_CONNECT) + +/// Called from an admin chat link +/datum/controller/subsystem/lag_switch/proc/cancel_auto_enable_in_progress() + if(!veto_timer_id) + return FALSE + + deltimer(veto_timer_id) + veto_timer_id = null + return TRUE + +/// Update the slowmode timer length and clear existing ones if reduced +/datum/controller/subsystem/lag_switch/proc/change_slowmode_cooldown(length) + if(!length) + return FALSE + + var/length_secs = length SECONDS + if(length_secs <= 0) + length_secs = 1 // one tick because cooldowns do not like 0 + + if(length_secs < slowmode_cooldown) + for(var/client/C as anything in GLOB.clients) + COOLDOWN_RESET(C, say_slowmode) + + slowmode_cooldown = length_secs + if(measures[SLOWMODE_SAY]) + to_chat(world, span_boldannounce("Slowmode timer has been changed to [length] seconds by an admin.")) + return TRUE + +/// Handle the state change for individual measures +/datum/controller/subsystem/lag_switch/proc/set_measure(measure_key, state) + if(isnull(measure_key) || isnull(state)) + stack_trace("SSlag_switch.set_measure() was called with a null arg") + return FALSE + if(isnull(LAZYACCESS(measures, measure_key))) + stack_trace("SSlag_switch.set_measure() was called with a measure_key not in the list of measures") + return FALSE + if(measures[measure_key] == state) + return TRUE + + measures[measure_key] = state + + switch(measure_key) + if(DISABLE_DEAD_KEYLOOP) + if(state) + for(var/mob/user as anything in GLOB.player_list) + if(user.stat == DEAD && !user.client?.holder) + GLOB.keyloop_list -= user + deadchat_broadcast(span_big("To increase performance Observer freelook is now disabled. Please use Orbit, Teleport, and Jump to look around."), message_type = DEADCHAT_ANNOUNCEMENT) + else + GLOB.keyloop_list |= GLOB.player_list + deadchat_broadcast("Observer freelook has been re-enabled. Enjoy your wooshing.", message_type = DEADCHAT_ANNOUNCEMENT) + if(DISABLE_GHOST_ZOOM_TRAY) + if(state) // if enabling make sure current ghosts are updated + for(var/mob/dead/observer/ghost in GLOB.dead_mob_list) + if(!ghost.client) + continue + if(!ghost.client.holder && ghost.client.view_size.getView() != ghost.client.view_size.default) + ghost.client.view_size.resetToDefault() + if(SLOWMODE_SAY) + if(state) + to_chat(world, span_boldannounce("Slowmode for IC/dead chat has been enabled with [slowmode_cooldown/10] seconds between messages.")) + else + for(var/client/C as anything in GLOB.clients) + COOLDOWN_RESET(C, say_slowmode) + to_chat(world, span_boldannounce("Slowmode for IC/dead chat has been disabled by an admin.")) + if(DISABLE_NON_OBSJOBS) + world.update_status() + if(DISABLE_PARALLAX) + if (state) + to_chat(world, span_boldannounce("Parallax has been disabled for performance concerns.")) + else + to_chat(world, span_boldannounce("Parallax has been re-enabled.")) + + for (var/mob/mob as anything in GLOB.mob_list) + mob.hud_used?.update_parallax_pref() + if (DISABLE_FOOTSTEPS) + if (state) + to_chat(world, span_boldannounce("Footstep sounds have been disabled for performance concerns.")) + else + to_chat(world, span_boldannounce("Footstep sounds have been re-enabled.")) + + return TRUE + +/// Helper to loop over all measures for mass changes +/datum/controller/subsystem/lag_switch/proc/set_all_measures(state, automatic = FALSE) + if(isnull(state)) + stack_trace("SSlag_switch.set_all_measures() was called with a null state arg") + return FALSE + + if(automatic) + message_admins("Lag Switch enabling automatic measures now.") + log_admin("Lag Switch enabling automatic measures now.") + veto_timer_id = null + for(var/i in 1 to auto_measures.len) + set_measure(auto_measures[i], state) + return TRUE + + for(var/i in 1 to measures.len) + set_measure(i, state) + return TRUE diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm index 9f2f57d48c60..c756723308b8 100644 --- a/code/controllers/subsystem/parallax.dm +++ b/code/controllers/subsystem/parallax.dm @@ -1,24 +1,34 @@ +/// Define for the pickweight value where you get no parallax +#define PARALLAX_NONE "parallax_none" + SUBSYSTEM_DEF(parallax) name = "Parallax" wait = 2 - flags = SS_POST_FIRE_TIMING | SS_BACKGROUND + flags = SS_POST_FIRE_TIMING | SS_BACKGROUND | SS_NO_INIT priority = FIRE_PRIORITY_PARALLAX runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT var/list/currentrun var/planet_x_offset = 128 var/planet_y_offset = 128 - var/random_layer - var/random_parallax_color + /// A random parallax layer that we sent to every player + var/atom/movable/screen/parallax_layer/random/random_layer + /// Weighted list with the parallax layers we could spawn + var/random_parallax_weights = list( + /atom/movable/screen/parallax_layer/random/space_gas = 35, + /atom/movable/screen/parallax_layer/random/asteroids = 35, + PARALLAX_NONE = 30, + ) + +//These are cached per client so needs to be done asap so people joining at roundstart do not miss these. +/datum/controller/subsystem/parallax/PreInit() + . = ..() + + set_random_parallax_layer(pick_weight(random_parallax_weights)) -/datum/controller/subsystem/parallax/Initialize(timeofday) - if(prob(70)) //70% chance to pick a special extra layer - random_layer = pick(/atom/movable/screen/parallax_layer/random/space_gas, /atom/movable/screen/parallax_layer/random/asteroids) - random_parallax_color = pick(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE)//Special color for random_layer1. Has to be done here so everyone sees the same color. planet_y_offset = rand(100, 160) planet_x_offset = rand(100, 160) - return SS_INIT_SUCCESS -/datum/controller/subsystem/parallax/fire(resumed = 0) +/datum/controller/subsystem/parallax/fire(resumed = FALSE) if (!resumed) src.currentrun = GLOB.clients.Copy() @@ -26,24 +36,65 @@ SUBSYSTEM_DEF(parallax) var/list/currentrun = src.currentrun while(length(currentrun)) - var/client/C = currentrun[currentrun.len] + var/client/processing_client = currentrun[currentrun.len] currentrun.len-- - if (!C || !C.eye) + if (QDELETED(processing_client) || !processing_client.eye) if (MC_TICK_CHECK) return continue - var/atom/movable/A = C.eye - if(!istype(A)) + + var/atom/movable/movable_eye = processing_client.eye + if(!istype(movable_eye)) + continue + + while(isloc(movable_eye.loc) && !isturf(movable_eye.loc)) + movable_eye = movable_eye.loc + //get the last movable holding the mobs eye + + if(movable_eye == processing_client.movingmob) + if (MC_TICK_CHECK) + return continue - for (A; isloc(A.loc) && !isturf(A.loc); A = A.loc); - - if(A != C.movingmob) - if(C.movingmob != null) - C.movingmob.client_mobs_in_contents -= C.mob - UNSETEMPTY(C.movingmob.client_mobs_in_contents) - LAZYINITLIST(A.client_mobs_in_contents) - A.client_mobs_in_contents += C.mob - C.movingmob = A + + //eye and the last recorded eye are different, and the last recorded eye isnt just the clients mob + if(!isnull(processing_client.movingmob)) + LAZYREMOVE(processing_client.movingmob.client_mobs_in_contents, processing_client.mob) + LAZYADD(movable_eye.client_mobs_in_contents, processing_client.mob) + + processing_client.movingmob = movable_eye if (MC_TICK_CHECK) return currentrun = null + +/// Generate a random layer for parallax +/datum/controller/subsystem/parallax/proc/set_random_parallax_layer(picked_parallax) + if(picked_parallax == PARALLAX_NONE) + return + + random_layer = new picked_parallax(null, /* hud_owner = */ null, /* template = */ TRUE) + RegisterSignal(random_layer, COMSIG_PARENT_QDELETING, PROC_REF(clear_references)) + random_layer.get_random_look() + +/// Change the random parallax layer after it's already been set. update_player_huds = TRUE will also replace them in the players client images, if it was set +/datum/controller/subsystem/parallax/proc/swap_out_random_parallax_layer(atom/movable/screen/parallax_layer/new_type, update_player_huds = TRUE) + set_random_parallax_layer(new_type) + + if(!update_player_huds) + return + + //Parallax is one of the first things to be set (during client join), so rarely is anything fast enough to swap it out + //That's why we need to swap the layers out for fast joining clients :/ + for(var/client/client as anything in GLOB.clients) + client.parallax_layers_cached?.Cut() + client.mob?.hud_used?.update_parallax_pref(client.mob) + +/datum/controller/subsystem/parallax/proc/clear_references() + SIGNAL_HANDLER + + random_layer = null + +/// Called at the end of SSstation setup, in-case we want to run some code that would otherwise be too early to run (like GLOB. stuff) +/datum/controller/subsystem/parallax/proc/post_station_setup() + random_layer?.apply_global_effects() + +#undef PARALLAX_NONE diff --git a/code/datums/components/connect_mob_behalf.dm b/code/datums/components/connect_mob_behalf.dm new file mode 100644 index 000000000000..1c1a8a652342 --- /dev/null +++ b/code/datums/components/connect_mob_behalf.dm @@ -0,0 +1,59 @@ +/// This component behaves similar to connect_loc_behalf, but working off clients and mobs instead of loc +/// To be clear, we hook into a signal on a tracked client's mob +/// We retain the ability to react to that signal on a seperate listener, which makes this quite powerful +/datum/component/connect_mob_behalf + dupe_mode = COMPONENT_DUPE_UNIQUE + + /// An assoc list of signal -> procpath to register to the mob our client "owns" + var/list/connections + /// The master client we're working with + var/client/tracked + /// The mob we're currently tracking + var/mob/tracked_mob + +/datum/component/connect_mob_behalf/Initialize(client/tracked, list/connections) + . = ..() + if (!istype(tracked)) + return COMPONENT_INCOMPATIBLE + src.connections = connections + src.tracked = tracked + +/datum/component/connect_mob_behalf/RegisterWithParent() + RegisterSignal(tracked, COMSIG_PARENT_QDELETING, PROC_REF(handle_tracked_qdel)) + update_signals() + +/datum/component/connect_mob_behalf/UnregisterFromParent() + unregister_signals() + UnregisterSignal(tracked, COMSIG_PARENT_QDELETING) + + tracked = null + tracked_mob = null + +/datum/component/connect_mob_behalf/proc/handle_tracked_qdel() + SIGNAL_HANDLER + qdel(src) + +/datum/component/connect_mob_behalf/proc/update_signals() + unregister_signals() + // Yes this is a runtime silencer + // We could be in a position where logout is sent to two things, one thing intercepts it, then deletes the client's new mob + // It's rare, and the same check in connect_loc_behalf is more fruitful, but it's still worth doing + if(QDELETED(tracked?.mob)) + return + tracked_mob = tracked.mob + RegisterSignal(tracked_mob, COMSIG_MOB_LOGOUT, PROC_REF(on_logout)) + for (var/signal in connections) + parent.RegisterSignal(tracked_mob, signal, connections[signal]) + +/datum/component/connect_mob_behalf/proc/unregister_signals() + if(isnull(tracked_mob)) + return + + parent.UnregisterSignal(tracked_mob, connections) + UnregisterSignal(tracked_mob, COMSIG_MOB_LOGOUT) + + tracked_mob = null + +/datum/component/connect_mob_behalf/proc/on_logout(mob/source) + SIGNAL_HANDLER + update_signals() diff --git a/code/game/atom_invisibility.dm b/code/game/atom_invisibility.dm new file mode 100644 index 000000000000..53fbe895817c --- /dev/null +++ b/code/game/atom_invisibility.dm @@ -0,0 +1,72 @@ +// Index defines +#define INVISIBILITY_VALUE 1 +#define INVISIBILITY_PRIORITY 2 + +/atom + VAR_PRIVATE/list/invisibility_sources + VAR_PRIVATE/current_invisibility_priority = -INFINITY + +/atom/proc/RecalculateInvisibility() + PRIVATE_PROC(TRUE) + + if(!invisibility_sources) + current_invisibility_priority = -INFINITY + invisibility = initial(invisibility) + return + + var/highest_priority + var/list/highest_priority_invisibility_data + for(var/entry in invisibility_sources) + var/list/priority_data + if(islist(entry)) + priority_data = entry + else + priority_data = invisibility_sources[entry] + + var/priority = priority_data[INVISIBILITY_PRIORITY] + if(highest_priority > priority) // In the case of equal priorities, we use the last thing in the list so that more recent changes apply first + continue + + highest_priority = priority + highest_priority_invisibility_data = priority_data + + current_invisibility_priority = highest_priority + invisibility = highest_priority_invisibility_data[INVISIBILITY_VALUE] + +/** + * Sets invisibility according to priority. + * If you want to be able to undo the value you set back to what it would be otherwise, + * you should provide an id here and remove it using RemoveInvisibility(id) + */ +/atom/proc/SetInvisibility(desired_value, id, priority=0) + if(!invisibility_sources) + invisibility_sources = list() + + if(id) + invisibility_sources[id] = list(desired_value, priority) + else + invisibility_sources += list(list(desired_value, priority)) + + if(current_invisibility_priority > priority) + return + + RecalculateInvisibility() + +/// Removes the specified invisibility source from the tracker +/atom/proc/RemoveInvisibility(id) + if(!invisibility_sources) + return + + var/list/priority_data = invisibility_sources[id] + invisibility_sources -= id + + if(length(invisibility_sources) == 0) + invisibility_sources = null + + if(current_invisibility_priority > priority_data[INVISIBILITY_PRIORITY]) + return + + RecalculateInvisibility() + +#undef INVISIBILITY_VALUE +#undef INVISIBILITY_PRIORITY diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index cb459e0914fc..085995314b2c 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -754,7 +754,7 @@ name = "\proper night vision meson vision" icon = 'icons/obj/clothing/glasses.dmi' icon_state = "nvgmeson" - sight_mode = BORGMESON_NIGHTVISION + sight_mode = BORGMESON /obj/item/borg/sight/material name = "\proper material vision" diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 9ae6194dfd44..3ac0b351c7e2 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -23,6 +23,8 @@ GLOBAL_PROTECT(href_token) var/deadmined + var/datum/plane_master_debug/plane_debug + var/ip_cache var/cid_cache diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 9f876156b699..63e68959cfed 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -173,3 +173,23 @@ /// Whether or not this client has the combo HUD enabled var/combo_hud_enabled = FALSE + + var/list/parallax_layers + var/list/parallax_layers_cached + ///Tracks say() usage for ic/dchat while slowmode is enabled + COOLDOWN_DECLARE(say_slowmode) + + ///this is the last recorded client eye by SSparallax/fire() + var/atom/movable/movingmob + var/turf/previous_turf + ///world.time of when we can state animate()ing parallax again + var/dont_animate_parallax + /// Direction our current area wants to move parallax + var/parallax_movedir = 0 + /// How many parallax layers to show our client + var/parallax_layers_max = 4 + /// Timer for the area directional animation + var/parallax_animate_timer + /// Do we want to do parallax animations at all? + /// Exists to prevent laptop fires + var/do_parallax_animations = TRUE diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 1ddb1a1cbc2d..9786155eb104 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -482,52 +482,15 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( ////////////// /client/Del() - //if(credits) - //QDEL_LIST(credits) - log_access("Logout: [key_name(src)]") - if(holder) - adminGreet(1) - holder.owner = null - GLOB.permissions.admins -= src - if (!GLOB.permissions.admins.len && SSticker.IsRoundInProgress()) //Only report this stuff if we are currently playing. - var/cheesy_message = pick( - "I have no admins online!",\ - "I'm all alone :(",\ - "I'm feeling lonely :(",\ - "I'm so lonely :(",\ - "Why does nobody love me? :(",\ - "I want a man :(",\ - "Where has everyone gone?",\ - "I need a hug :(",\ - "Someone come hold me :(",\ - "I need someone on me :(",\ - "What happened? Where has everyone gone?",\ - "Forever alone :("\ - ) - - send2irc("Server", "[cheesy_message] (No admins online)") - qdel(holder) - if(ckey in GLOB.permissions.deadmins) - qdel(GLOB.permissions.deadmins[ckey]) - - GLOB.ahelp_tickets.ClientLogout(src) - GLOB.directory -= ckey - GLOB.clients -= src - - SSambience.remove_ambience_client(src) - - var/datum/connection_log/CL = GLOB.connection_logs[ckey] - if(CL) - CL.logout(mob) - - QDEL_LIST_ASSOC_VAL(char_render_holders) - if(movingmob != null) - movingmob.client_mobs_in_contents -= mob - UNSETEMPTY(movingmob.client_mobs_in_contents) - seen_messages = null - Master.UpdateTickRate() - world.sync_logout_with_db(connection_number) // yogs - logout logging - + if(!gc_destroyed) + gc_destroyed = world.time + if (!QDELING(src)) + stack_trace("Client does not purport to be QDELING, this is going to cause bugs in other places!") + + // Yes this is the same as what's found in qdel(). Yes it does need to be here + // Get off my back + SEND_SIGNAL(src, COMSIG_PARENT_QDELETING, TRUE) + Destroy() //Clean up signals and timers. return ..() /client/proc/set_client_age_from_db(connectiontopic) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 86ab220b480f..36cd6b981425 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1081,7 +1081,7 @@ sight |= SEE_TURFS lighting_color_cutoffs = blend_cutoff_colors(lighting_color_cutoffs, list(5, 15, 5)) - if(sight_mode & BORGMESON_NIGHTVISION) + if(sight_mode & BORGMESON) sight |= SEE_TURFS lighting_color_cutoffs = blend_cutoff_colors(lighting_color_cutoffs, list(5, 30, 5)) diff --git a/yogstation.dme b/yogstation.dme index cc5e642104a2..36abde8b97e0 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -73,6 +73,7 @@ #include "code\__DEFINES\inventory.dm" #include "code\__DEFINES\is_helpers.dm" #include "code\__DEFINES\jobs.dm" +#include "code\__DEFINES\lag_switch.dm" #include "code\__DEFINES\language.dm" #include "code\__DEFINES\layers.dm" #include "code\__DEFINES\lighting.dm" @@ -151,6 +152,7 @@ #include "code\__DEFINES\dcs\signals\signal_species.dm" #include "code\__DEFINES\dcs\signals\signals_action.dm" #include "code\__DEFINES\dcs\signals\signals_area.dm" +#include "code\__DEFINES\dcs\signals\signals_client.dm" #include "code\__DEFINES\dcs\signals\signals_datum.dm" #include "code\__DEFINES\dcs\signals\signals_food.dm" #include "code\__DEFINES\dcs\signals\signals_gib.dm" @@ -325,6 +327,7 @@ #include "code\_onclick\hud\plane_master_subtypes.dm" #include "code\_onclick\hud\radial.dm" #include "code\_onclick\hud\radial_persistent.dm" +#include "code\_onclick\hud\random_layer.dm" #include "code\_onclick\hud\render_plate.dm" #include "code\_onclick\hud\revenanthud.dm" #include "code\_onclick\hud\robot.dm" @@ -335,6 +338,7 @@ #include "code\controllers\controller.dm" #include "code\controllers\failsafe.dm" #include "code\controllers\globals.dm" +#include "code\controllers\lag_switch.dm" #include "code\controllers\master.dm" #include "code\controllers\subsystem.dm" #include "code\controllers\configuration\config_entry.dm" @@ -519,6 +523,7 @@ #include "code\datums\components\butchering.dm" #include "code\datums\components\caltrop.dm" #include "code\datums\components\chasm.dm" +#include "code\datums\components\connect_mob_behalf.dm" #include "code\datums\components\construction.dm" #include "code\datums\components\curse_of_hunger.dm" #include "code\datums\components\decal.dm" @@ -828,6 +833,7 @@ #include "code\datums\wounds\slash.dm" #include "code\datums\wounds\scars\_scars.dm" #include "code\game\alternate_appearance.dm" +#include "code\game\atom_invisibility.dm" #include "code\game\atoms.dm" #include "code\game\atoms_movable.dm" #include "code\game\communications.dm" From d1750eda16f4308a991d5639e65d6b6e58069e7e Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 23:51:56 -0500 Subject: [PATCH 024/281] adds my stuff back it it'll show up one day --- code/_onclick/hud/parallax.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 506226b41ead..3662882d5dd6 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -15,7 +15,10 @@ C.parallax_layers_cached = list() C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, src) C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, src) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, src) + if(HAS_TRAIT(SSstation, STATION_TRAIT_MOONSCORCH)) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet/moonscorch(null, C.view) + else + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, src) if(SSparallax.random_layer) C.parallax_layers_cached += new SSparallax.random_layer.type(null, src, FALSE, SSparallax.random_layer) C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, src) From f3d43651f8554a58a37f8e87d3c8e93c564b78c0 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 29 Nov 2023 23:54:16 -0500 Subject: [PATCH 025/281] this too duh --- code/_onclick/hud/parallax.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 3662882d5dd6..ff43b84ceeb2 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -340,6 +340,9 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) speed = 3 layer = 30 +/atom/movable/screen/parallax_layer/planet/moonscorch + icon_state = "rheus_moon" + /atom/movable/screen/parallax_layer/planet/Initialize(mapload, datum/hud/hud_owner) . = ..() var/client/boss = hud_owner?.mymob?.canon_client From 4c06635a3213f2c43addff3f5d5b9fbc86b5bbdc Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 00:00:07 -0500 Subject: [PATCH 026/281] push it duh --- code/datums/elements/turf_transparency.dm | 2 +- code/modules/antagonists/revenant/revenant.dm | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/datums/elements/turf_transparency.dm b/code/datums/elements/turf_transparency.dm index b050dd0866f0..e8312aa4dd2d 100644 --- a/code/datums/elements/turf_transparency.dm +++ b/code/datums/elements/turf_transparency.dm @@ -271,7 +271,7 @@ GLOBAL_LIST_EMPTY(pillars_by_z) if(!ispath(path)) warning("Z-level [our_turf.z] has invalid baseturf '[SSmapping.level_trait(our_turf.z, ZTRAIT_BASETURF)]'") path = /turf/open/space - var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), initial(path.icon_state), layer = TURF_LAYER-0.02, offset_spokesman = our_turf, plane = PLANE_SPACE) + var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), initial(path.icon_state), layer = TURF_LAYER-0.02, plane = PLANE_SPACE) underlay_appearance.appearance_flags = RESET_ALPHA | RESET_COLOR return underlay_appearance diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index b5ddf9a469cd..fdd5d2b8690e 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -3,7 +3,6 @@ //Don't hear deadchat and are NOT normal ghosts //Admin-spawn or random event -#define INVISIBILITY_REVENANT 50 #define REVENANT_NAME_FILE "revenant_names.json" /mob/living/simple_animal/revenant From 37fb345a723a90e6f3090f84511b675f3bf0184a Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 00:28:56 -0500 Subject: [PATCH 027/281] so close yet so far --- code/_onclick/hud/render_plate.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/hud/render_plate.dm b/code/_onclick/hud/render_plate.dm index ae05da8839a7..d4e5bd9777eb 100644 --- a/code/_onclick/hud/render_plate.dm +++ b/code/_onclick/hud/render_plate.dm @@ -280,7 +280,7 @@ emissive.remove_filter("lighting_mask") // We max alpha here, so our darkness is actually.. dark // Can't do it before cause it fucks with the filter - ///add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME, offset), relay_color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,1)) -- this makes the walls pitch black (cant see stuff on them) + add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME, offset)) ///render plate for OOC stuff like ghosts, hud-screen effects, etc /atom/movable/screen/plane_master/rendering_plate/non_game From 603b4e5f3c4e551e61ec4ef6cfc1ef61619ba001 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 10:19:13 -0500 Subject: [PATCH 028/281] dont ever say its over ahuh --- code/game/turfs/space/space.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 33e4221dbf82..a26e40e09d22 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -44,7 +44,7 @@ GLOBAL_LIST_EMPTY(starlight) /turf/open/space icon = 'icons/turf/space.dmi' - icon_state = "space" + icon_state = "0" name = "\proper space" overfloor_placed = FALSE underfloor_accessibility = UNDERFLOOR_INTERACTABLE @@ -220,7 +220,7 @@ GLOBAL_LIST_EMPTY(starlight) /turf/open/space/openspace icon = 'icons/turf/floors.dmi' - icon_state = MAP_SWITCH("pure_white", "invisible") + icon_state = MAP_SWITCH("pure_white", "transparent") plane = TRANSPARENT_FLOOR_PLANE /turf/open/space/openspace/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker From aebff052bf836d3bc963b56522a57a39e2f5d58f Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 10:30:49 -0500 Subject: [PATCH 029/281] adds this back should help --- code/__DEFINES/layers.dm | 1 + code/modules/antagonists/devil/true_devil/inventory.dm | 2 ++ .../mob/living/simple_animal/friendly/drone/visuals_icons.dm | 2 ++ code/modules/mob/living/simple_animal/simple_animal.dm | 2 ++ 4 files changed, 7 insertions(+) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 8bb03d1c38e4..4199d972132c 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -96,6 +96,7 @@ //HUD layer defines #define HUD_PLANE 40 #define ABOVE_HUD_PLANE 41 +#define ABOVE_HUD_LAYER 41 ///Plane of the "splash" icon used that shows on the lobby screen #define SPLASHSCREEN_PLANE 50 diff --git a/code/modules/antagonists/devil/true_devil/inventory.dm b/code/modules/antagonists/devil/true_devil/inventory.dm index 61b09348b1dc..a3d0dbdf582b 100644 --- a/code/modules/antagonists/devil/true_devil/inventory.dm +++ b/code/modules/antagonists/devil/true_devil/inventory.dm @@ -17,6 +17,7 @@ hands_overlays += r_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) + r_hand.layer = ABOVE_HUD_LAYER r_hand.plane = ABOVE_HUD_PLANE r_hand.screen_loc = ui_hand_position(get_held_index_of_item(r_hand)) client.screen |= r_hand @@ -27,6 +28,7 @@ hands_overlays += l_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) + l_hand.layer = ABOVE_HUD_LAYER l_hand.plane = ABOVE_HUD_PLANE l_hand.screen_loc = ui_hand_position(get_held_index_of_item(l_hand)) client.screen |= l_hand diff --git a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm index 9400e17ebc50..b6fe86efe0db 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm @@ -35,6 +35,7 @@ hands_overlays += r_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) + r_hand.layer = ABOVE_HUD_LAYER r_hand.plane = ABOVE_HUD_PLANE r_hand.screen_loc = ui_hand_position(get_held_index_of_item(r_hand)) client.screen |= r_hand @@ -47,6 +48,7 @@ hands_overlays += l_hand_overlay if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) + l_hand.layer = ABOVE_HUD_LAYER l_hand.plane = ABOVE_HUD_PLANE l_hand.screen_loc = ui_hand_position(get_held_index_of_item(l_hand)) client.screen |= l_hand diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 8d832a895dd1..c4885bec37a1 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -546,10 +546,12 @@ var/obj/item/l_hand = get_item_for_held_index(1) var/obj/item/r_hand = get_item_for_held_index(2) if(r_hand) + r_hand.layer = ABOVE_HUD_LAYER r_hand.plane = ABOVE_HUD_PLANE r_hand.screen_loc = ui_hand_position(get_held_index_of_item(r_hand)) client.screen |= r_hand if(l_hand) + l_hand.layer = ABOVE_HUD_LAYER l_hand.plane = ABOVE_HUD_PLANE l_hand.screen_loc = ui_hand_position(get_held_index_of_item(l_hand)) client.screen |= l_hand From dfd72a901019e3e54e21022e096727fd2aab2cf9 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 10:55:58 -0500 Subject: [PATCH 030/281] oh yeah fix this idiot --- code/_onclick/hud/hud.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 1cf9e183c40e..ea8ca758d39b 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -463,7 +463,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( hand_slots = list() var/atom/movable/screen/inventory/hand/hand_box for(var/i in 1 to mymob.held_items.len) - hand_box = new /atom/movable/screen/inventory/hand(null, src) + hand_box = new /atom/movable/screen/inventory/hand(src) hand_box.name = mymob.get_held_index_name(i) hand_box.icon = ui_style hand_box.icon_state = "hand_[mymob.held_index_to_dir(i)]" @@ -471,7 +471,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( hand_box.held_index = i hand_slots["[i]"] = hand_box static_inventory += hand_box - hand_box.update_appearance() + hand_box.update_appearance(UPDATE_ICON) var/i = 1 for(var/atom/movable/screen/swap_hand/SH in static_inventory) From 0339b78d7f7cf1083ba6cfd79171c68e78a5e5e4 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 11:07:05 -0500 Subject: [PATCH 031/281] yea yea --- _maps/_basemap.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index aadbfa88a035..48b96c8948f7 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" From 252c687197f69dcf9c9aa60e0ea71f1872f3741a Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 11:33:07 -0500 Subject: [PATCH 032/281] this bye --- code/__HELPERS/lighting.dm | 6 ++---- code/game/turfs/space/space.dm | 2 -- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/code/__HELPERS/lighting.dm b/code/__HELPERS/lighting.dm index 96087ba17377..5e5924abc8d2 100644 --- a/code/__HELPERS/lighting.dm +++ b/code/__HELPERS/lighting.dm @@ -7,10 +7,8 @@ var/alpha_ratio = alpha/255 appearance.color = _EMISSIVE_COLOR(alpha_ratio) - //Test to make sure emissives with broken or missing icon states are created - if(PERFORM_ALL_TESTS(focus_only/invalid_emissives)) - if(icon_state && !icon_exists(icon, icon_state, scream = FALSE)) //Scream set to False so we can have a custom stack_trace - stack_trace("An emissive appearance was added with non-existant icon_state \"[icon_state]\" in [icon]!") + if(icon_state && !icon_exists(icon, icon_state, scream = FALSE)) //Scream set to False so we can have a custom stack_trace + stack_trace("An emissive appearance was added with non-existant icon_state \"[icon_state]\" in [icon]!") return appearance diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index a26e40e09d22..bf74a2df7077 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -225,8 +225,6 @@ GLOBAL_LIST_EMPTY(starlight) /turf/open/space/openspace/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() - if(PERFORM_ALL_TESTS(focus_only/openspace_clear) && !GET_TURF_BELOW(src)) - stack_trace("[src] was inited as openspace with nothing below it at ([x], [y], [z])") icon_state = "pure_white" // We make the assumption that the space plane will never be blacklisted, as an optimization if(SSmapping.max_plane_offset) From 68d3b28c002542f7f0672c8f7fd386c38f1c7389 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 12:18:30 -0500 Subject: [PATCH 033/281] this is probably important probably --- code/_onclick/hud/random_layer.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/_onclick/hud/random_layer.dm b/code/_onclick/hud/random_layer.dm index 379c0cbe2d9b..2a20889dd0ae 100644 --- a/code/_onclick/hud/random_layer.dm +++ b/code/_onclick/hud/random_layer.dm @@ -24,7 +24,7 @@ /// Gassy background with a few random colors /atom/movable/screen/parallax_layer/random/space_gas - icon_state = "space_gas" + icon_state = "random_layer1" /// The colors we can be var/possible_colors = list(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE) @@ -48,5 +48,5 @@ /// Big asteroid rocks appear in the background /atom/movable/screen/parallax_layer/random/asteroids - icon_state = "asteroids" + icon_state = "random_layer2" layer = 4 From 6e9bb1085e3ba78d6ec17d8ce7304e078bac76a6 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 12:41:43 -0500 Subject: [PATCH 034/281] test? lets see --- code/controllers/subsystem/parallax.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm index c756723308b8..51d2c20bb472 100644 --- a/code/controllers/subsystem/parallax.dm +++ b/code/controllers/subsystem/parallax.dm @@ -19,6 +19,12 @@ SUBSYSTEM_DEF(parallax) PARALLAX_NONE = 30, ) +/datum/controller/subsystem/parallax/Initialize(timeofday) + if(prob(70)) //70% chance to pick a special extra layer + random_layer = pick(/atom/movable/screen/parallax_layer/random/space_gas, /atom/movable/screen/parallax_layer/random/asteroids) + planet_x_offset = rand(100, 160) + return SS_INIT_SUCCESS + //These are cached per client so needs to be done asap so people joining at roundstart do not miss these. /datum/controller/subsystem/parallax/PreInit() . = ..() From d9742b21487f3b91d6c95dc125c94e8a5b69bb39 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 12:56:09 -0500 Subject: [PATCH 035/281] maybe this will fix it not likely --- code/_onclick/hud/parallax.dm | 6 ++++++ code/_onclick/hud/random_layer.dm | 2 ++ code/controllers/subsystem/parallax.dm | 6 ------ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index ff43b84ceeb2..1787a783ecd3 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -340,6 +340,12 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) speed = 3 layer = 30 +/atom/movable/screen/parallax_layer/random/space_gas + icon_state = "random_layer1" + +/atom/movable/screen/parallax_layer/random/asteroids + icon_state = "random_layer2" + /atom/movable/screen/parallax_layer/planet/moonscorch icon_state = "rheus_moon" diff --git a/code/_onclick/hud/random_layer.dm b/code/_onclick/hud/random_layer.dm index 2a20889dd0ae..5cab174e04ce 100644 --- a/code/_onclick/hud/random_layer.dm +++ b/code/_onclick/hud/random_layer.dm @@ -4,6 +4,8 @@ speed = 2 layer = 3 +/atom/movable/screen/parallax_layer/random/space_gas/Initialize(mapload, view) + /atom/movable/screen/parallax_layer/random/Initialize(mapload, datum/hud/hud_owner, template, atom/movable/screen/parallax_layer/random/twin) . = ..() diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm index 51d2c20bb472..c756723308b8 100644 --- a/code/controllers/subsystem/parallax.dm +++ b/code/controllers/subsystem/parallax.dm @@ -19,12 +19,6 @@ SUBSYSTEM_DEF(parallax) PARALLAX_NONE = 30, ) -/datum/controller/subsystem/parallax/Initialize(timeofday) - if(prob(70)) //70% chance to pick a special extra layer - random_layer = pick(/atom/movable/screen/parallax_layer/random/space_gas, /atom/movable/screen/parallax_layer/random/asteroids) - planet_x_offset = rand(100, 160) - return SS_INIT_SUCCESS - //These are cached per client so needs to be done asap so people joining at roundstart do not miss these. /datum/controller/subsystem/parallax/PreInit() . = ..() From 646ac967d774dcadaadad0aadeccca3b840abab5 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 13:05:09 -0500 Subject: [PATCH 036/281] update pupdate --- code/_onclick/hud/random_layer.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/_onclick/hud/random_layer.dm b/code/_onclick/hud/random_layer.dm index 5cab174e04ce..2a20889dd0ae 100644 --- a/code/_onclick/hud/random_layer.dm +++ b/code/_onclick/hud/random_layer.dm @@ -4,8 +4,6 @@ speed = 2 layer = 3 -/atom/movable/screen/parallax_layer/random/space_gas/Initialize(mapload, view) - /atom/movable/screen/parallax_layer/random/Initialize(mapload, datum/hud/hud_owner, template, atom/movable/screen/parallax_layer/random/twin) . = ..() From ae9d21d0b4d9b4d64c044005124e3773ff04f6ab Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 13:36:47 -0500 Subject: [PATCH 037/281] eee aaa --- code/controllers/subsystem/demo.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/demo.dm b/code/controllers/subsystem/demo.dm index 5296f21dd20c..5b88c20e431d 100644 --- a/code/controllers/subsystem/demo.dm +++ b/code/controllers/subsystem/demo.dm @@ -444,7 +444,7 @@ SUBSYSTEM_DEF(demo) return if(!isobj(M) && !ismob(M)) return - if(M.gc_destroyed) + if(M.gc_destroyed || !M) return marked_new[M] = TRUE if(marked_dirty[M]) From b55e1ac5284078a3eaff507ae66c0909bc5b56dd Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 13:52:39 -0500 Subject: [PATCH 038/281] round 2 FIGHT --- code/_onclick/hud/parallax.dm | 6 ------ code/controllers/subsystem/demo.dm | 2 +- code/game/atoms.dm | 3 ++- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 1787a783ecd3..ff43b84ceeb2 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -340,12 +340,6 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) speed = 3 layer = 30 -/atom/movable/screen/parallax_layer/random/space_gas - icon_state = "random_layer1" - -/atom/movable/screen/parallax_layer/random/asteroids - icon_state = "random_layer2" - /atom/movable/screen/parallax_layer/planet/moonscorch icon_state = "rheus_moon" diff --git a/code/controllers/subsystem/demo.dm b/code/controllers/subsystem/demo.dm index 5b88c20e431d..0833575471c8 100644 --- a/code/controllers/subsystem/demo.dm +++ b/code/controllers/subsystem/demo.dm @@ -444,7 +444,7 @@ SUBSYSTEM_DEF(demo) return if(!isobj(M) && !ismob(M)) return - if(M.gc_destroyed || !M) + if(M.gc_destroyed || QDELETED(M)) return marked_new[M] = TRUE if(marked_dirty[M]) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 941865b02e93..c4491b248627 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -145,7 +145,6 @@ if(SSatoms.InitAtom(src, args)) //we were deleted return - SSdemo.mark_new(src) /** * The primary method that objects are setup in SS13 with @@ -205,6 +204,8 @@ custom_materials = null //Null the list to prepare for applying the materials properly set_custom_materials(temp_list) + + SSdemo.mark_new(src) return INITIALIZE_HINT_NORMAL From 4bb344d57a4d16bb2c607be9837e14d9c38f1fa2 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 14:07:03 -0500 Subject: [PATCH 039/281] ok we're back in black --- code/_onclick/hud/parallax.dm | 320 +++++++++++-------------- code/controllers/subsystem/parallax.dm | 1 + code/modules/client/client_defines.dm | 2 + 3 files changed, 142 insertions(+), 181 deletions(-) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index ff43b84ceeb2..3da632374a8e 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -1,27 +1,20 @@ - /datum/hud/proc/create_parallax(mob/viewmob) var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client - if (!apply_parallax_pref(viewmob)) //don't want shit computers to crash when specing someone with insane parallax, so use the viewer's pref - for(var/atom/movable/screen/plane_master/parallax as anything in get_true_plane_masters(PLANE_SPACE_PARALLAX)) - parallax.hide_plane(screenmob) return - for(var/atom/movable/screen/plane_master/parallax as anything in get_true_plane_masters(PLANE_SPACE_PARALLAX)) - parallax.unhide_plane(screenmob) - if(!length(C.parallax_layers_cached)) C.parallax_layers_cached = list() - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, src) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, src) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, C.view) if(HAS_TRAIT(SSstation, STATION_TRAIT_MOONSCORCH)) C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet/moonscorch(null, C.view) else - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, src) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, C.view) if(SSparallax.random_layer) - C.parallax_layers_cached += new SSparallax.random_layer.type(null, src, FALSE, SSparallax.random_layer) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, src) + C.parallax_layers_cached += new SSparallax.random_layer + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, C.view) C.parallax_layers = C.parallax_layers_cached.Copy() @@ -29,88 +22,70 @@ C.parallax_layers.len = C.parallax_layers_max C.screen |= (C.parallax_layers) - // We could do not do parallax for anything except the main plane group - // This could be changed, but it would require refactoring this whole thing - // And adding non client particular hooks for all the inputs, and I do not have the time I'm sorry :( - for(var/atom/movable/screen/plane_master/plane_master as anything in screenmob.hud_used.get_true_plane_masters(PLANE_SPACE)) - if(screenmob != mymob) - C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen - C.screen += plane_master - plane_master.color = list( - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 1, 1, 1, 1, - 0, 0, 0, 0 - ) + var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] + if(screenmob != mymob) + C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen + C.screen += PM + PM.color = list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 1, 1, 1, 1, + 0, 0, 0, 0 + ) + /datum/hud/proc/remove_parallax(mob/viewmob) var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client C.screen -= (C.parallax_layers_cached) - for(var/atom/movable/screen/plane_master/plane_master as anything in screenmob.hud_used.get_true_plane_masters(PLANE_SPACE)) - if(screenmob != mymob) - C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen - C.screen += plane_master - plane_master.color = initial(plane_master.color) + var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] + if(screenmob != mymob) + C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen + C.screen += PM + PM.color = initial(PM.color) C.parallax_layers = null /datum/hud/proc/apply_parallax_pref(mob/viewmob) var/mob/screenmob = viewmob || mymob - var/turf/screen_location = get_turf(screenmob) - - if(SSmapping.level_trait(screen_location?.z, ZTRAIT_NOPARALLAX)) - for(var/atom/movable/screen/plane_master/white_space as anything in get_true_plane_masters(PLANE_SPACE)) - white_space.hide_plane(screenmob) - return FALSE - - for(var/atom/movable/screen/plane_master/white_space as anything in get_true_plane_masters(PLANE_SPACE)) - white_space.unhide_plane(screenmob) - - if (SSlag_switch.measures[DISABLE_PARALLAX] && !HAS_TRAIT(viewmob, TRAIT_BYPASS_MEASURES)) - return FALSE - var/client/C = screenmob.client - // Default to HIGH - var/parallax_selection = C?.prefs.read_preference(/datum/preference/choiced/parallax) || PARALLAX_HIGH - - switch(parallax_selection) - if (PARALLAX_INSANE) - C.parallax_layers_max = 5 - C.do_parallax_animations = TRUE - return TRUE - - if(PARALLAX_HIGH) - C.parallax_layers_max = 4 - C.do_parallax_animations = TRUE - return TRUE - - if (PARALLAX_MED) - C.parallax_layers_max = 3 - C.do_parallax_animations = TRUE - return TRUE - - if (PARALLAX_LOW) - C.parallax_layers_max = 1 - C.do_parallax_animations = FALSE - return TRUE - - if (PARALLAX_DISABLE) - return FALSE + if(C.prefs) + var/pref = C.prefs.read_preference(/datum/preference/choiced/parallax) + if (isnull(pref)) + pref = PARALLAX_HIGH + switch(pref) + if (PARALLAX_INSANE) + C.parallax_throttle = FALSE + C.parallax_layers_max = 5 + return TRUE + + if (PARALLAX_MED) + C.parallax_throttle = PARALLAX_DELAY_MED + C.parallax_layers_max = 3 + return TRUE + + if (PARALLAX_LOW) + C.parallax_throttle = PARALLAX_DELAY_LOW + C.parallax_layers_max = 1 + return TRUE + + if (PARALLAX_DISABLE) + return FALSE + + //This is high parallax. + C.parallax_throttle = PARALLAX_DELAY_DEFAULT + C.parallax_layers_max = 4 + return TRUE /datum/hud/proc/update_parallax_pref(mob/viewmob) - var/mob/screen_mob = viewmob || mymob - if(!screen_mob.client) - return - remove_parallax(screen_mob) - create_parallax(screen_mob) - update_parallax(screen_mob) + remove_parallax(viewmob) + create_parallax(viewmob) + update_parallax() // This sets which way the current shuttle is moving (returns true if the shuttle has stopped moving so the caller can append their animation) -/datum/hud/proc/set_parallax_movedir(new_parallax_movedir = 0, skip_windups, mob/viewmob) +/datum/hud/proc/set_parallax_movedir(new_parallax_movedir, skip_windups) . = FALSE - var/mob/screenmob = viewmob || mymob - var/client/C = screenmob.client + var/client/C = mymob.client if(new_parallax_movedir == C.parallax_movedir) return var/animatedir = new_parallax_movedir @@ -182,25 +157,29 @@ L.transform = newtransform - animate(L, transform = L.transform, time = 0, loop = -1, flags = ANIMATION_END_NOW) + animate(L, transform = L.transform, time = 0 SECONDS, loop = -1, flags = ANIMATION_END_NOW) animate(transform = matrix(), time = T) -/datum/hud/proc/update_parallax(mob/viewmob) - var/mob/screenmob = viewmob || mymob - var/client/C = screenmob.client - var/turf/posobj = get_turf(C.eye) +/datum/hud/proc/update_parallax() + var/client/C = mymob.client + if(!C) + return + var/turf/posobj = get_turf_global(C.eye) // yogs - replace get_turf with get_turf_global if(!posobj) return - var/area/areaobj = posobj.loc + // Update the movement direction of the parallax if necessary (for shuttles) - set_parallax_movedir(areaobj.parallax_movedir, FALSE, screenmob) + set_parallax_movedir(areaobj.parallax_movedir, FALSE) - var/force = FALSE + var/force if(!C.previous_turf || (C.previous_turf.z != posobj.z)) C.previous_turf = posobj force = TRUE + if (!force && world.time < C.last_parallax_shift+C.parallax_throttle) + return + //Doing it this way prevents parallax layers from "jumping" when you change Z-Levels. var/offset_x = posobj.x - C.previous_turf.x var/offset_y = posobj.y - C.previous_turf.y @@ -208,105 +187,83 @@ if(!offset_x && !offset_y && !force) return - var/glide_rate = round(world.icon_size / screenmob.glide_size * world.tick_lag, world.tick_lag) + var/last_delay = world.time - C.last_parallax_shift + last_delay = min(last_delay, C.parallax_throttle) C.previous_turf = posobj + C.last_parallax_shift = world.time - var/largest_change = max(abs(offset_x), abs(offset_y)) - var/max_allowed_dist = (glide_rate / world.tick_lag) + 1 - // If we aren't already moving/don't allow parallax, have made some movement, and that movement was smaller then our "glide" size, animate - var/run_parralax = (C.do_parallax_animations && glide_rate && !areaobj.parallax_movedir && C.dont_animate_parallax <= world.time && largest_change <= max_allowed_dist) + for(var/thing in C.parallax_layers) + var/atom/movable/screen/parallax_layer/L = thing + L.update_status(mymob) + if (L.view_sized != C.view) + L.update_o(C.view) - for(var/atom/movable/screen/parallax_layer/parallax_layer as anything in C.parallax_layers) - var/our_speed = parallax_layer.speed var/change_x var/change_y - if(parallax_layer.absolute) - // We use change here so the typically large absolute objects (just lavaland for now) don't jitter so much - change_x = (posobj.x - SSparallax.planet_x_offset) * our_speed + parallax_layer.offset_x - change_y = (posobj.y - SSparallax.planet_y_offset) * our_speed + parallax_layer.offset_y + + if(L.absolute) + L.offset_x = -(posobj.x - SSparallax.planet_x_offset) * L.speed + L.offset_y = -(posobj.y - SSparallax.planet_y_offset) * L.speed else - change_x = offset_x * our_speed - change_y = offset_y * our_speed - - // This is how we tile parralax sprites - // It doesn't use change because we really don't want to animate this - if(parallax_layer.offset_x - change_x > 240) - parallax_layer.offset_x -= 480 - else if(parallax_layer.offset_x - change_x < -240) - parallax_layer.offset_x += 480 - if(parallax_layer.offset_y - change_y > 240) - parallax_layer.offset_y -= 480 - else if(parallax_layer.offset_y - change_y < -240) - parallax_layer.offset_y += 480 - - // Now that we have our offsets, let's do our positioning - parallax_layer.offset_x -= change_x - parallax_layer.offset_y -= change_y - - parallax_layer.screen_loc = "CENTER-7:[round(parallax_layer.offset_x, 1)],CENTER-7:[round(parallax_layer.offset_y, 1)]" - - // We're going to use a transform to "glide" that last movement out, so it looks nicer - // Don't do any animates if we're not actually moving enough distance yeah? thanks lad - if(run_parralax && (largest_change * our_speed > 1)) - parallax_layer.transform = matrix(1,0,change_x, 0,1,change_y) - animate(parallax_layer, transform=matrix(), time = glide_rate) + change_x = offset_x * L.speed + L.offset_x -= change_x + change_y = offset_y * L.speed + L.offset_y -= change_y -/atom/movable/proc/update_parallax_contents() - for(var/mob/client_mob as anything in client_mobs_in_contents) - if(length(client_mob?.client?.parallax_layers) && client_mob.hud_used) - client_mob.hud_used.update_parallax() + if(L.offset_x > 240) + L.offset_x -= 480 + if(L.offset_x < -240) + L.offset_x += 480 + if(L.offset_y > 240) + L.offset_y -= 480 + if(L.offset_y < -240) + L.offset_y += 480 -/mob/proc/update_parallax_teleport() //used for arrivals shuttle - if(client?.eye && hud_used && length(client.parallax_layers)) + + if(!areaobj.parallax_movedir && C.dont_animate_parallax <= world.time && (offset_x || offset_y) && abs(offset_x) <= max(C.parallax_throttle/world.tick_lag+1,1) && abs(offset_y) <= max(C.parallax_throttle/world.tick_lag+1,1) && (round(abs(change_x)) > 1 || round(abs(change_y)) > 1)) + L.transform = matrix(1, 0, offset_x*L.speed, 0, 1, offset_y*L.speed) + animate(L, transform=matrix(), time = last_delay) + + L.screen_loc = "CENTER-7:[round(L.offset_x,1)],CENTER-7:[round(L.offset_y,1)]" + +/atom/movable/proc/update_parallax_contents() + if(length(client_mobs_in_contents)) + for(var/thing in client_mobs_in_contents) + var/mob/M = thing + if(M && M.client && M.hud_used && length(M.client.parallax_layers)) + M.hud_used.update_parallax() + +/mob/proc/update_parallax_teleport() //used for arrivals shuttle + if(client && client.eye && hud_used && length(client.parallax_layers)) var/area/areaobj = get_area(client.eye) hud_used.set_parallax_movedir(areaobj.parallax_movedir, TRUE) -// We need parallax to always pass its args down into initialize, so we immediate init it -INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) /atom/movable/screen/parallax_layer icon = 'icons/effects/parallax.dmi' var/speed = 1 var/offset_x = 0 var/offset_y = 0 + var/view_sized var/absolute = FALSE blend_mode = BLEND_ADD plane = PLANE_SPACE_PARALLAX screen_loc = "CENTER-7,CENTER-7" mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/atom/movable/screen/parallax_layer/Initialize(mapload, datum/hud/hud_owner, template = FALSE) - . = ..() - // Parallax layers are independant of hud, they care about client - // Not doing this will just create a bunch of hard deletes - hud = null - - if(template) - return - - var/client/boss = hud_owner?.mymob?.canon_client - - if(!boss) // If this typepath all starts to harddel your culprit is likely this - return INITIALIZE_HINT_QDEL - // I do not want to know bestie - var/view = boss.view || world.view +/atom/movable/screen/parallax_layer/Initialize(mapload, view) + . = ..() + if (!view) + view = world.view update_o(view) - RegisterSignal(boss, COMSIG_VIEW_SET, PROC_REF(on_view_change)) - -/atom/movable/screen/parallax_layer/proc/on_view_change(datum/source, new_size) - SIGNAL_HANDLER - update_o(new_size) /atom/movable/screen/parallax_layer/proc/update_o(view) if (!view) view = world.view - var/static/parallax_scaler = world.icon_size / 480 - - // Turn the view size into a grid of correctly scaled overlays var/list/viewscales = getviewsize(view) - var/countx = CEILING((viewscales[1] / 2) * parallax_scaler, 1) + 1 - var/county = CEILING((viewscales[2] / 2) * parallax_scaler, 1) + 1 + var/countx = CEILING((viewscales[1]/2)/(480/world.icon_size), 1)+1 + var/county = CEILING((viewscales[2]/2)/(480/world.icon_size), 1)+1 var/list/new_overlays = new for(var/x in -countx to countx) for(var/y in -county to county) @@ -317,6 +274,10 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) new_overlays += texture_overlay cut_overlays() add_overlay(new_overlays) + view_sized = view + +/atom/movable/screen/parallax_layer/proc/update_status(mob/M) + return /atom/movable/screen/parallax_layer/layer_1 icon_state = "layer1" @@ -333,6 +294,21 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) speed = 1.4 layer = 3 +/atom/movable/screen/parallax_layer/random + blend_mode = BLEND_OVERLAY + speed = 3 + layer = 3 + +/atom/movable/screen/parallax_layer/random/space_gas + icon_state = "random_layer1" + +/atom/movable/screen/parallax_layer/random/space_gas/Initialize(mapload, view) + . = ..() + src.add_atom_colour(SSparallax.random_parallax_color, ADMIN_COLOUR_PRIORITY) + +/atom/movable/screen/parallax_layer/random/asteroids + icon_state = "random_layer2" + /atom/movable/screen/parallax_layer/planet icon_state = "planet" blend_mode = BLEND_OVERLAY @@ -343,30 +319,12 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) /atom/movable/screen/parallax_layer/planet/moonscorch icon_state = "rheus_moon" -/atom/movable/screen/parallax_layer/planet/Initialize(mapload, datum/hud/hud_owner) - . = ..() - var/client/boss = hud_owner?.mymob?.canon_client - if(!boss) - return - var/static/list/connections = list( - COMSIG_MOVABLE_Z_CHANGED = PROC_REF(on_z_change), - COMSIG_MOB_LOGOUT = PROC_REF(on_mob_logout), - ) - AddComponent(/datum/component/connect_mob_behalf, boss, connections) - on_z_change(hud_owner?.mymob) - -/atom/movable/screen/parallax_layer/planet/proc/on_mob_logout(mob/source) - SIGNAL_HANDLER - var/client/boss = source.canon_client - on_z_change(boss.mob) - -/atom/movable/screen/parallax_layer/planet/proc/on_z_change(mob/source) - SIGNAL_HANDLER - var/client/boss = source.client - var/turf/posobj = get_turf(boss?.eye) - if(!posobj) - return - SetInvisibility(is_station_level(posobj.z) ? INVISIBILITY_NONE : INVISIBILITY_ABSTRACT, id=type) +/atom/movable/screen/parallax_layer/planet/update_status(mob/M) + var/turf/T = get_turf(M) + if(is_station_level(T.z)) + invisibility = 0 + else + invisibility = INVISIBILITY_ABSTRACT /atom/movable/screen/parallax_layer/planet/update_o() - return //Shit won't move + return //Shit wont move diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm index c756723308b8..f78ee723f072 100644 --- a/code/controllers/subsystem/parallax.dm +++ b/code/controllers/subsystem/parallax.dm @@ -10,6 +10,7 @@ SUBSYSTEM_DEF(parallax) var/list/currentrun var/planet_x_offset = 128 var/planet_y_offset = 128 + var/random_parallax_color /// A random parallax layer that we sent to every player var/atom/movable/screen/parallax_layer/random/random_layer /// Weighted list with the parallax layers we could spawn diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 63e68959cfed..9d7db5e25668 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -193,3 +193,5 @@ /// Do we want to do parallax animations at all? /// Exists to prevent laptop fires var/do_parallax_animations = TRUE + var/parallax_throttle = 0 //ds between updates + var/last_parallax_shift //world.time of last update From 503a1c055953bdecd9221a1a428f369e80ae4119 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 14:57:59 -0500 Subject: [PATCH 040/281] sunglasses update ok --- code/modules/clothing/glasses/hud.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index b60bfafaa647..a770e77d6439 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -144,7 +144,7 @@ flash_protect = 1 tint = 1 // Red with a tint of green - color_cutoffs = list(35, 5, 5) + color_cutoffs = list(15, 5, 5) glass_colour_type = /datum/client_colour/glass_colour/darkred /obj/item/clothing/glasses/hud/security/sunglasses/hos @@ -157,6 +157,7 @@ desc = "An advanced heads-up display which provides ID data and vision in complete darkness." icon_state = "securityhudnight" flash_protect = -1 + color_cutoffs = list(35, 5, 5) glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/hud/security/sunglasses/gars From fb3f40c47f54d5ac309b1091b8054101fa7093ae Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 15:40:38 -0500 Subject: [PATCH 041/281] ok back to this I guess --- code/_onclick/hud/parallax.dm | 326 +++++++++++++++++++--------------- 1 file changed, 181 insertions(+), 145 deletions(-) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 3da632374a8e..506226b41ead 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -1,20 +1,24 @@ + /datum/hud/proc/create_parallax(mob/viewmob) var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client + if (!apply_parallax_pref(viewmob)) //don't want shit computers to crash when specing someone with insane parallax, so use the viewer's pref + for(var/atom/movable/screen/plane_master/parallax as anything in get_true_plane_masters(PLANE_SPACE_PARALLAX)) + parallax.hide_plane(screenmob) return + for(var/atom/movable/screen/plane_master/parallax as anything in get_true_plane_masters(PLANE_SPACE_PARALLAX)) + parallax.unhide_plane(screenmob) + if(!length(C.parallax_layers_cached)) C.parallax_layers_cached = list() - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, C.view) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, C.view) - if(HAS_TRAIT(SSstation, STATION_TRAIT_MOONSCORCH)) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet/moonscorch(null, C.view) - else - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, src) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, src) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, src) if(SSparallax.random_layer) - C.parallax_layers_cached += new SSparallax.random_layer - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, C.view) + C.parallax_layers_cached += new SSparallax.random_layer.type(null, src, FALSE, SSparallax.random_layer) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, src) C.parallax_layers = C.parallax_layers_cached.Copy() @@ -22,70 +26,88 @@ C.parallax_layers.len = C.parallax_layers_max C.screen |= (C.parallax_layers) - var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] - if(screenmob != mymob) - C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen - C.screen += PM - PM.color = list( - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 1, 1, 1, 1, - 0, 0, 0, 0 - ) - + // We could do not do parallax for anything except the main plane group + // This could be changed, but it would require refactoring this whole thing + // And adding non client particular hooks for all the inputs, and I do not have the time I'm sorry :( + for(var/atom/movable/screen/plane_master/plane_master as anything in screenmob.hud_used.get_true_plane_masters(PLANE_SPACE)) + if(screenmob != mymob) + C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen + C.screen += plane_master + plane_master.color = list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 1, 1, 1, 1, + 0, 0, 0, 0 + ) /datum/hud/proc/remove_parallax(mob/viewmob) var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client C.screen -= (C.parallax_layers_cached) - var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] - if(screenmob != mymob) - C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen - C.screen += PM - PM.color = initial(PM.color) + for(var/atom/movable/screen/plane_master/plane_master as anything in screenmob.hud_used.get_true_plane_masters(PLANE_SPACE)) + if(screenmob != mymob) + C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen + C.screen += plane_master + plane_master.color = initial(plane_master.color) C.parallax_layers = null /datum/hud/proc/apply_parallax_pref(mob/viewmob) var/mob/screenmob = viewmob || mymob + var/turf/screen_location = get_turf(screenmob) + + if(SSmapping.level_trait(screen_location?.z, ZTRAIT_NOPARALLAX)) + for(var/atom/movable/screen/plane_master/white_space as anything in get_true_plane_masters(PLANE_SPACE)) + white_space.hide_plane(screenmob) + return FALSE + + for(var/atom/movable/screen/plane_master/white_space as anything in get_true_plane_masters(PLANE_SPACE)) + white_space.unhide_plane(screenmob) + + if (SSlag_switch.measures[DISABLE_PARALLAX] && !HAS_TRAIT(viewmob, TRAIT_BYPASS_MEASURES)) + return FALSE + var/client/C = screenmob.client - if(C.prefs) - var/pref = C.prefs.read_preference(/datum/preference/choiced/parallax) - if (isnull(pref)) - pref = PARALLAX_HIGH - switch(pref) - if (PARALLAX_INSANE) - C.parallax_throttle = FALSE - C.parallax_layers_max = 5 - return TRUE - - if (PARALLAX_MED) - C.parallax_throttle = PARALLAX_DELAY_MED - C.parallax_layers_max = 3 - return TRUE - - if (PARALLAX_LOW) - C.parallax_throttle = PARALLAX_DELAY_LOW - C.parallax_layers_max = 1 - return TRUE - - if (PARALLAX_DISABLE) - return FALSE - - //This is high parallax. - C.parallax_throttle = PARALLAX_DELAY_DEFAULT - C.parallax_layers_max = 4 - return TRUE + // Default to HIGH + var/parallax_selection = C?.prefs.read_preference(/datum/preference/choiced/parallax) || PARALLAX_HIGH + + switch(parallax_selection) + if (PARALLAX_INSANE) + C.parallax_layers_max = 5 + C.do_parallax_animations = TRUE + return TRUE + + if(PARALLAX_HIGH) + C.parallax_layers_max = 4 + C.do_parallax_animations = TRUE + return TRUE + + if (PARALLAX_MED) + C.parallax_layers_max = 3 + C.do_parallax_animations = TRUE + return TRUE + + if (PARALLAX_LOW) + C.parallax_layers_max = 1 + C.do_parallax_animations = FALSE + return TRUE + + if (PARALLAX_DISABLE) + return FALSE /datum/hud/proc/update_parallax_pref(mob/viewmob) - remove_parallax(viewmob) - create_parallax(viewmob) - update_parallax() + var/mob/screen_mob = viewmob || mymob + if(!screen_mob.client) + return + remove_parallax(screen_mob) + create_parallax(screen_mob) + update_parallax(screen_mob) // This sets which way the current shuttle is moving (returns true if the shuttle has stopped moving so the caller can append their animation) -/datum/hud/proc/set_parallax_movedir(new_parallax_movedir, skip_windups) +/datum/hud/proc/set_parallax_movedir(new_parallax_movedir = 0, skip_windups, mob/viewmob) . = FALSE - var/client/C = mymob.client + var/mob/screenmob = viewmob || mymob + var/client/C = screenmob.client if(new_parallax_movedir == C.parallax_movedir) return var/animatedir = new_parallax_movedir @@ -157,29 +179,25 @@ L.transform = newtransform - animate(L, transform = L.transform, time = 0 SECONDS, loop = -1, flags = ANIMATION_END_NOW) + animate(L, transform = L.transform, time = 0, loop = -1, flags = ANIMATION_END_NOW) animate(transform = matrix(), time = T) -/datum/hud/proc/update_parallax() - var/client/C = mymob.client - if(!C) - return - var/turf/posobj = get_turf_global(C.eye) // yogs - replace get_turf with get_turf_global +/datum/hud/proc/update_parallax(mob/viewmob) + var/mob/screenmob = viewmob || mymob + var/client/C = screenmob.client + var/turf/posobj = get_turf(C.eye) if(!posobj) return - var/area/areaobj = posobj.loc + var/area/areaobj = posobj.loc // Update the movement direction of the parallax if necessary (for shuttles) - set_parallax_movedir(areaobj.parallax_movedir, FALSE) + set_parallax_movedir(areaobj.parallax_movedir, FALSE, screenmob) - var/force + var/force = FALSE if(!C.previous_turf || (C.previous_turf.z != posobj.z)) C.previous_turf = posobj force = TRUE - if (!force && world.time < C.last_parallax_shift+C.parallax_throttle) - return - //Doing it this way prevents parallax layers from "jumping" when you change Z-Levels. var/offset_x = posobj.x - C.previous_turf.x var/offset_y = posobj.y - C.previous_turf.y @@ -187,83 +205,105 @@ if(!offset_x && !offset_y && !force) return - var/last_delay = world.time - C.last_parallax_shift - last_delay = min(last_delay, C.parallax_throttle) + var/glide_rate = round(world.icon_size / screenmob.glide_size * world.tick_lag, world.tick_lag) C.previous_turf = posobj - C.last_parallax_shift = world.time - for(var/thing in C.parallax_layers) - var/atom/movable/screen/parallax_layer/L = thing - L.update_status(mymob) - if (L.view_sized != C.view) - L.update_o(C.view) + var/largest_change = max(abs(offset_x), abs(offset_y)) + var/max_allowed_dist = (glide_rate / world.tick_lag) + 1 + // If we aren't already moving/don't allow parallax, have made some movement, and that movement was smaller then our "glide" size, animate + var/run_parralax = (C.do_parallax_animations && glide_rate && !areaobj.parallax_movedir && C.dont_animate_parallax <= world.time && largest_change <= max_allowed_dist) + for(var/atom/movable/screen/parallax_layer/parallax_layer as anything in C.parallax_layers) + var/our_speed = parallax_layer.speed var/change_x var/change_y - - if(L.absolute) - L.offset_x = -(posobj.x - SSparallax.planet_x_offset) * L.speed - L.offset_y = -(posobj.y - SSparallax.planet_y_offset) * L.speed + if(parallax_layer.absolute) + // We use change here so the typically large absolute objects (just lavaland for now) don't jitter so much + change_x = (posobj.x - SSparallax.planet_x_offset) * our_speed + parallax_layer.offset_x + change_y = (posobj.y - SSparallax.planet_y_offset) * our_speed + parallax_layer.offset_y else - change_x = offset_x * L.speed - L.offset_x -= change_x - change_y = offset_y * L.speed - L.offset_y -= change_y - - if(L.offset_x > 240) - L.offset_x -= 480 - if(L.offset_x < -240) - L.offset_x += 480 - if(L.offset_y > 240) - L.offset_y -= 480 - if(L.offset_y < -240) - L.offset_y += 480 - - - if(!areaobj.parallax_movedir && C.dont_animate_parallax <= world.time && (offset_x || offset_y) && abs(offset_x) <= max(C.parallax_throttle/world.tick_lag+1,1) && abs(offset_y) <= max(C.parallax_throttle/world.tick_lag+1,1) && (round(abs(change_x)) > 1 || round(abs(change_y)) > 1)) - L.transform = matrix(1, 0, offset_x*L.speed, 0, 1, offset_y*L.speed) - animate(L, transform=matrix(), time = last_delay) - - L.screen_loc = "CENTER-7:[round(L.offset_x,1)],CENTER-7:[round(L.offset_y,1)]" + change_x = offset_x * our_speed + change_y = offset_y * our_speed + + // This is how we tile parralax sprites + // It doesn't use change because we really don't want to animate this + if(parallax_layer.offset_x - change_x > 240) + parallax_layer.offset_x -= 480 + else if(parallax_layer.offset_x - change_x < -240) + parallax_layer.offset_x += 480 + if(parallax_layer.offset_y - change_y > 240) + parallax_layer.offset_y -= 480 + else if(parallax_layer.offset_y - change_y < -240) + parallax_layer.offset_y += 480 + + // Now that we have our offsets, let's do our positioning + parallax_layer.offset_x -= change_x + parallax_layer.offset_y -= change_y + + parallax_layer.screen_loc = "CENTER-7:[round(parallax_layer.offset_x, 1)],CENTER-7:[round(parallax_layer.offset_y, 1)]" + + // We're going to use a transform to "glide" that last movement out, so it looks nicer + // Don't do any animates if we're not actually moving enough distance yeah? thanks lad + if(run_parralax && (largest_change * our_speed > 1)) + parallax_layer.transform = matrix(1,0,change_x, 0,1,change_y) + animate(parallax_layer, transform=matrix(), time = glide_rate) /atom/movable/proc/update_parallax_contents() - if(length(client_mobs_in_contents)) - for(var/thing in client_mobs_in_contents) - var/mob/M = thing - if(M && M.client && M.hud_used && length(M.client.parallax_layers)) - M.hud_used.update_parallax() - -/mob/proc/update_parallax_teleport() //used for arrivals shuttle - if(client && client.eye && hud_used && length(client.parallax_layers)) + for(var/mob/client_mob as anything in client_mobs_in_contents) + if(length(client_mob?.client?.parallax_layers) && client_mob.hud_used) + client_mob.hud_used.update_parallax() + +/mob/proc/update_parallax_teleport() //used for arrivals shuttle + if(client?.eye && hud_used && length(client.parallax_layers)) var/area/areaobj = get_area(client.eye) hud_used.set_parallax_movedir(areaobj.parallax_movedir, TRUE) +// We need parallax to always pass its args down into initialize, so we immediate init it +INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) /atom/movable/screen/parallax_layer icon = 'icons/effects/parallax.dmi' var/speed = 1 var/offset_x = 0 var/offset_y = 0 - var/view_sized var/absolute = FALSE blend_mode = BLEND_ADD plane = PLANE_SPACE_PARALLAX screen_loc = "CENTER-7,CENTER-7" mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/atom/movable/screen/parallax_layer/Initialize(mapload, view) +/atom/movable/screen/parallax_layer/Initialize(mapload, datum/hud/hud_owner, template = FALSE) . = ..() - if (!view) - view = world.view + // Parallax layers are independant of hud, they care about client + // Not doing this will just create a bunch of hard deletes + hud = null + + if(template) + return + + var/client/boss = hud_owner?.mymob?.canon_client + + if(!boss) // If this typepath all starts to harddel your culprit is likely this + return INITIALIZE_HINT_QDEL + + // I do not want to know bestie + var/view = boss.view || world.view update_o(view) + RegisterSignal(boss, COMSIG_VIEW_SET, PROC_REF(on_view_change)) + +/atom/movable/screen/parallax_layer/proc/on_view_change(datum/source, new_size) + SIGNAL_HANDLER + update_o(new_size) /atom/movable/screen/parallax_layer/proc/update_o(view) if (!view) view = world.view + var/static/parallax_scaler = world.icon_size / 480 + + // Turn the view size into a grid of correctly scaled overlays var/list/viewscales = getviewsize(view) - var/countx = CEILING((viewscales[1]/2)/(480/world.icon_size), 1)+1 - var/county = CEILING((viewscales[2]/2)/(480/world.icon_size), 1)+1 + var/countx = CEILING((viewscales[1] / 2) * parallax_scaler, 1) + 1 + var/county = CEILING((viewscales[2] / 2) * parallax_scaler, 1) + 1 var/list/new_overlays = new for(var/x in -countx to countx) for(var/y in -county to county) @@ -274,10 +314,6 @@ new_overlays += texture_overlay cut_overlays() add_overlay(new_overlays) - view_sized = view - -/atom/movable/screen/parallax_layer/proc/update_status(mob/M) - return /atom/movable/screen/parallax_layer/layer_1 icon_state = "layer1" @@ -294,21 +330,6 @@ speed = 1.4 layer = 3 -/atom/movable/screen/parallax_layer/random - blend_mode = BLEND_OVERLAY - speed = 3 - layer = 3 - -/atom/movable/screen/parallax_layer/random/space_gas - icon_state = "random_layer1" - -/atom/movable/screen/parallax_layer/random/space_gas/Initialize(mapload, view) - . = ..() - src.add_atom_colour(SSparallax.random_parallax_color, ADMIN_COLOUR_PRIORITY) - -/atom/movable/screen/parallax_layer/random/asteroids - icon_state = "random_layer2" - /atom/movable/screen/parallax_layer/planet icon_state = "planet" blend_mode = BLEND_OVERLAY @@ -316,15 +337,30 @@ speed = 3 layer = 30 -/atom/movable/screen/parallax_layer/planet/moonscorch - icon_state = "rheus_moon" - -/atom/movable/screen/parallax_layer/planet/update_status(mob/M) - var/turf/T = get_turf(M) - if(is_station_level(T.z)) - invisibility = 0 - else - invisibility = INVISIBILITY_ABSTRACT +/atom/movable/screen/parallax_layer/planet/Initialize(mapload, datum/hud/hud_owner) + . = ..() + var/client/boss = hud_owner?.mymob?.canon_client + if(!boss) + return + var/static/list/connections = list( + COMSIG_MOVABLE_Z_CHANGED = PROC_REF(on_z_change), + COMSIG_MOB_LOGOUT = PROC_REF(on_mob_logout), + ) + AddComponent(/datum/component/connect_mob_behalf, boss, connections) + on_z_change(hud_owner?.mymob) + +/atom/movable/screen/parallax_layer/planet/proc/on_mob_logout(mob/source) + SIGNAL_HANDLER + var/client/boss = source.canon_client + on_z_change(boss.mob) + +/atom/movable/screen/parallax_layer/planet/proc/on_z_change(mob/source) + SIGNAL_HANDLER + var/client/boss = source.client + var/turf/posobj = get_turf(boss?.eye) + if(!posobj) + return + SetInvisibility(is_station_level(posobj.z) ? INVISIBILITY_NONE : INVISIBILITY_ABSTRACT, id=type) /atom/movable/screen/parallax_layer/planet/update_o() - return //Shit wont move + return //Shit won't move From 9aa9b4403b1d74cf5df0b5ffe8f8ec265c587000 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 15:42:54 -0500 Subject: [PATCH 042/281] oops forgot this :) --- code/_onclick/hud/parallax.dm | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 506226b41ead..069d6971e762 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -13,12 +13,15 @@ if(!length(C.parallax_layers_cached)) C.parallax_layers_cached = list() - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, src) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, src) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, src) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, C.view) + if(HAS_TRAIT(SSstation, STATION_TRAIT_MOONSCORCH)) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet/moonscorch(null, C.view) + else + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, C.view) if(SSparallax.random_layer) - C.parallax_layers_cached += new SSparallax.random_layer.type(null, src, FALSE, SSparallax.random_layer) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, src) + C.parallax_layers_cached += new SSparallax.random_layer + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, C.view) C.parallax_layers = C.parallax_layers_cached.Copy() @@ -337,6 +340,9 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) speed = 3 layer = 30 +/atom/movable/screen/parallax_layer/planet/moonscorch + icon_state = "rheus_moon" + /atom/movable/screen/parallax_layer/planet/Initialize(mapload, datum/hud/hud_owner) . = ..() var/client/boss = hud_owner?.mymob?.canon_client From e50bf9b25ed7fdfee21fcf2b80f367328c29c255 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 15:53:19 -0500 Subject: [PATCH 043/281] test test --- code/controllers/subsystem/parallax.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm index f78ee723f072..aed4b5c1c3d2 100644 --- a/code/controllers/subsystem/parallax.dm +++ b/code/controllers/subsystem/parallax.dm @@ -16,7 +16,7 @@ SUBSYSTEM_DEF(parallax) /// Weighted list with the parallax layers we could spawn var/random_parallax_weights = list( /atom/movable/screen/parallax_layer/random/space_gas = 35, - /atom/movable/screen/parallax_layer/random/asteroids = 35, + // /atom/movable/screen/parallax_layer/random/asteroids = 35, PARALLAX_NONE = 30, ) From c395bc0ba82c30031db5cd6aefb5e6c0df43a913 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 16:52:22 -0500 Subject: [PATCH 044/281] yea yea --- code/_onclick/hud/parallax.dm | 12 ++++++------ code/controllers/subsystem/parallax.dm | 3 +-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 069d6971e762..3643d7848834 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -13,15 +13,15 @@ if(!length(C.parallax_layers_cached)) C.parallax_layers_cached = list() - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, C.view) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, src) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, src) if(HAS_TRAIT(SSstation, STATION_TRAIT_MOONSCORCH)) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet/moonscorch(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet/moonscorch(null, src) else - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, src) if(SSparallax.random_layer) - C.parallax_layers_cached += new SSparallax.random_layer - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, C.view) + C.parallax_layers_cached += new SSparallax.random_layer.type(null, src, FALSE, SSparallax.random_layer) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, src) C.parallax_layers = C.parallax_layers_cached.Copy() diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm index aed4b5c1c3d2..d412900c9433 100644 --- a/code/controllers/subsystem/parallax.dm +++ b/code/controllers/subsystem/parallax.dm @@ -10,13 +10,12 @@ SUBSYSTEM_DEF(parallax) var/list/currentrun var/planet_x_offset = 128 var/planet_y_offset = 128 - var/random_parallax_color /// A random parallax layer that we sent to every player var/atom/movable/screen/parallax_layer/random/random_layer /// Weighted list with the parallax layers we could spawn var/random_parallax_weights = list( /atom/movable/screen/parallax_layer/random/space_gas = 35, - // /atom/movable/screen/parallax_layer/random/asteroids = 35, + ///atom/movable/screen/parallax_layer/random/asteroids = 35, PARALLAX_NONE = 30, ) From a13da223bd8a887fe8e3eff421f681fcb07713f8 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 17:10:54 -0500 Subject: [PATCH 045/281] peko pain pain peko --- code/game/turfs/space/space.dm | 1 - code/modules/atmospherics/environmental/LINDA_turf_tile.dm | 2 -- code/modules/mob/living/ventcrawling.dm | 1 + 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index bf74a2df7077..5e7fa31c7a9d 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -61,7 +61,6 @@ GLOBAL_LIST_EMPTY(starlight) var/static/datum/gas_mixture/immutable/space/space_gas = new // We do NOT want atmos adjacent turfs init_air = FALSE - run_later = TRUE plane = PLANE_SPACE layer = SPACE_LAYER light_power = 1 diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 7db5896f21d8..1fd2e701d888 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -33,8 +33,6 @@ var/list/atmos_overlay_types //gas IDs of current active gas overlays is_openturf = TRUE - /// exists so things like space can ask to take 100% of a tile's gas - var/run_later = FALSE /turf/open/Initialize(mapload) if(!blocks_air) diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index 4eebe8f0b7e4..33e5cc3d4d90 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -107,6 +107,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( var/obj/machinery/atmospherics/A = X //all elements in totalMembers are necessarily of this type. if(in_view_range(client.mob, A)) if(!A.pipe_vision_img) + A.pipe_vision_img = image(A, A.loc, layer = ABOVE_HUD_LAYER, dir = A.dir) A.pipe_vision_img.plane = ABOVE_HUD_PLANE client.images += A.pipe_vision_img pipes_shown += A.pipe_vision_img From c2597e2f59ab44d7ab0238dad501de8baec2cde4 Mon Sep 17 00:00:00 2001 From: Molti Date: Thu, 30 Nov 2023 16:44:03 -0600 Subject: [PATCH 046/281] Update gas_mixture.dm --- code/modules/atmospherics/gasmixtures/gas_mixture.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 991907fbd814..7bb79aac5347 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -374,7 +374,7 @@ get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() //math is under the assumption temperatures are equal var/self_moles = get_moles(gas_id) var/other_moles = other.get_moles(gas_id) - if(abs(self_moles / return_volume() - other_moles / other.return_volume()) > min_p_delta / (R_IDEAL_GAS_EQUATION * return_temperature())) + if(abs(self_moles / max(return_volume(), 0.000001) - other_moles / max(other.return_volume()), 0.000001) > min_p_delta / max(R_IDEAL_GAS_EQUATION * return_temperature(), 0.00001)) . = TRUE var/total_moles = self_moles + other_moles set_moles(gas_id, total_moles * (return_volume() / total_volume)) From 8032d26bbc306588000a6025e9d4a7c3551126f8 Mon Sep 17 00:00:00 2001 From: Molti Date: Thu, 30 Nov 2023 17:05:20 -0600 Subject: [PATCH 047/281] Update gas_mixture.dm --- code/modules/atmospherics/gasmixtures/gas_mixture.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 7bb79aac5347..9902736b9d70 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -374,7 +374,7 @@ get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() //math is under the assumption temperatures are equal var/self_moles = get_moles(gas_id) var/other_moles = other.get_moles(gas_id) - if(abs(self_moles / max(return_volume(), 0.000001) - other_moles / max(other.return_volume()), 0.000001) > min_p_delta / max(R_IDEAL_GAS_EQUATION * return_temperature(), 0.00001)) + if(abs(self_moles / max(return_volume(), 0.000001) - other_moles / max(other.return_volume(), 0.000001)) > min_p_delta / max(R_IDEAL_GAS_EQUATION * return_temperature(), 0.00001)) . = TRUE var/total_moles = self_moles + other_moles set_moles(gas_id, total_moles * (return_volume() / total_volume)) From 65a993824ad7b0a4b83b27a8224bc1d8a9ebe6b8 Mon Sep 17 00:00:00 2001 From: Molti Date: Thu, 30 Nov 2023 17:17:29 -0600 Subject: [PATCH 048/281] Update gas_mixture.dm --- code/modules/atmospherics/gasmixtures/gas_mixture.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 9902736b9d70..20d89a4717d9 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -374,6 +374,8 @@ get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() //math is under the assumption temperatures are equal var/self_moles = get_moles(gas_id) var/other_moles = other.get_moles(gas_id) + + //i apologize for this terrible change, i added a bunch of max() procs because they were often dividing by 0 and causing errors if(abs(self_moles / max(return_volume(), 0.000001) - other_moles / max(other.return_volume(), 0.000001)) > min_p_delta / max(R_IDEAL_GAS_EQUATION * return_temperature(), 0.00001)) . = TRUE var/total_moles = self_moles + other_moles From 12cb28518e1f1894ba82037205cd875121156204 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 19:23:27 -0500 Subject: [PATCH 049/281] yea yeah --- code/game/turfs/space/space.dm | 8 +++++++- code/modules/atmospherics/gasmixtures/gas_mixture.dm | 3 +-- .../machinery/components/unary_devices/passive_vent.dm | 3 +++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 5e7fa31c7a9d..57421fd4e461 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -52,18 +52,24 @@ GLOBAL_LIST_EMPTY(starlight) temperature = TCMB thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT heat_capacity = 700000 + + FASTDMM_PROP(\ + pipe_astar_cost = 3\ + ) + var/starlight_source_count = 0 var/destination_z var/destination_x var/destination_y - var/static/datum/gas_mixture/immutable/space/space_gas = new + var/global/datum/gas_mixture/immutable/space/space_gas = new // We do NOT want atmos adjacent turfs init_air = FALSE plane = PLANE_SPACE layer = SPACE_LAYER light_power = 1 + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED light_range = 2 light_color = COLOR_STARLIGHT light_height = LIGHTING_HEIGHT_SPACE diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 20d89a4717d9..60e60dea8d6e 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -375,8 +375,7 @@ get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() var/self_moles = get_moles(gas_id) var/other_moles = other.get_moles(gas_id) - //i apologize for this terrible change, i added a bunch of max() procs because they were often dividing by 0 and causing errors - if(abs(self_moles / max(return_volume(), 0.000001) - other_moles / max(other.return_volume(), 0.000001)) > min_p_delta / max(R_IDEAL_GAS_EQUATION * return_temperature(), 0.00001)) + if(abs(self_moles / return_volume() - other_moles / other.return_volume()) > min_p_delta / (R_IDEAL_GAS_EQUATION * return_temperature())) . = TRUE var/total_moles = self_moles + other_moles set_moles(gas_id, total_moles * (return_volume() / total_volume)) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm index b511f3ff624a..cb66af8e5bba 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm @@ -24,6 +24,9 @@ var/datum/gas_mixture/external = location.return_air() var/datum/gas_mixture/internal = airs[1] + // if(!internal.return_temperature()) //temp fix + // return + if(internal.equalize(external)) air_update_turf() update_parents() From 549a0bc12faa0f01ab31aca78bcb952195b9ad8a Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 19:31:25 -0500 Subject: [PATCH 050/281] Why did you remove this I am such a moron --- code/game/turfs/space/space.dm | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 57421fd4e461..d514dd123c34 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -85,6 +85,35 @@ GLOBAL_LIST_EMPTY(starlight) //This is used to optimize the map loader return +/turf/open/space/Initialize(mapload) + SHOULD_CALL_PARENT(FALSE) + icon_state = SPACE_ICON_STATE + air = space_gas + update_air_ref() + vis_contents.Cut() //removes inherited overlays + visibilityChanged() + + if (PERFORM_ALL_TESTS(focus_only/multiple_space_initialization)) + if(flags_1 & INITIALIZED_1) + stack_trace("Warning: [src]([type]) initialized multiple times!") + flags_1 |= INITIALIZED_1 + + var/area/A = loc + if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) + add_overlay(/obj/effect/fullbright) + + if(requires_activation) + SSair.add_to_active(src) + + if (light_system == STATIC_LIGHT && light_power && light_range) + update_light() + + if (opacity) + directional_opacity = ALL_CARDINALS + + return INITIALIZE_HINT_NORMAL + + /turf/open/space/Destroy() GLOB.starlight -= src return ..() @@ -95,6 +124,9 @@ GLOBAL_LIST_EMPTY(starlight) var/turf/T = locate(destination_x, destination_y, destination_z) user.forceMove(T) +/turf/open/space/Initalize_Atmos(times_fired) + return + /turf/open/space/TakeTemperature(temp) /turf/open/space/RemoveLattice() From 4f82e9361a25627f87f422c06e60648498e7c7ff Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 19:38:15 -0500 Subject: [PATCH 051/281] should fix this yeah --- .../machinery/components/unary_devices/vent_pump.dm | 2 ++ .../machinery/components/unary_devices/vent_scrubber.dm | 2 ++ code/modules/spells/spell_types/jaunt/wirecrawl.dm | 2 ++ 3 files changed, 6 insertions(+) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 643b0a0f25f8..bc6b484c6dd2 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -316,6 +316,7 @@ user.visible_message("[user] unwelded the vent.", span_notice("You unweld the vent."), span_italics("You hear welding.")) welded = FALSE update_appearance(UPDATE_ICON) + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) pipe_vision_img.plane = ABOVE_HUD_PLANE investigate_log("was [welded ? "welded shut" : "unwelded"] by [key_name(user)]", INVESTIGATE_ATMOS) add_fingerprint(user) @@ -345,6 +346,7 @@ user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the vent", "You hear loud scraping noises.") welded = FALSE update_appearance(UPDATE_ICON) + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) pipe_vision_img.plane = ABOVE_HUD_PLANE playsound(loc, 'sound/weapons/bladeslice.ogg', 100, 1) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index c9e777161718..2729cb4f456a 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -262,6 +262,7 @@ user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.") welded = FALSE update_appearance(UPDATE_ICON) + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) pipe_vision_img.plane = ABOVE_HUD_PLANE investigate_log("was [welded ? "welded shut" : "unwelded"] by [key_name(user)]", INVESTIGATE_ATMOS) add_fingerprint(user) @@ -287,6 +288,7 @@ user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the scrubber.", "You hear loud scraping noises.") welded = FALSE update_appearance(UPDATE_ICON) + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) pipe_vision_img.plane = ABOVE_HUD_PLANE playsound(loc, 'sound/weapons/bladeslice.ogg', 100, 1) diff --git a/code/modules/spells/spell_types/jaunt/wirecrawl.dm b/code/modules/spells/spell_types/jaunt/wirecrawl.dm index d05bebe338b7..a1829b04dbf6 100644 --- a/code/modules/spells/spell_types/jaunt/wirecrawl.dm +++ b/code/modules/spells/spell_types/jaunt/wirecrawl.dm @@ -221,6 +221,7 @@ if(istype(object, /obj/structure/cable)) var/obj/structure/cable/display = object if(!display.wire_vision_img) + display.wire_vision_img = image(display, display.loc, layer = ABOVE_HUD_LAYER, dir = display.dir) display.wire_vision_img.plane = ABOVE_HUD_PLANE client.images += display.wire_vision_img wires_shown += display.wire_vision_img @@ -228,6 +229,7 @@ else if(istype(object, /obj/machinery/power)) var/obj/machinery/power/display = object if(!display.wire_vision_img) + display.wire_vision_img = image(display, display.loc, layer = ABOVE_HUD_LAYER, dir = display.dir) display.wire_vision_img.plane = ABOVE_HUD_PLANE client.images += display.wire_vision_img wires_shown += display.wire_vision_img From 676f127ab829ff29906a38c118a9723e8633b8fb Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Thu, 30 Nov 2023 20:07:09 -0500 Subject: [PATCH 052/281] adjustments then we open it up --- code/modules/clothing/glasses/hud.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index a770e77d6439..ddb8f96210ce 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -45,7 +45,7 @@ item_state = "glasses" flash_protect = -1 // Blue green, dark - color_cutoffs = list(5, 15, 30) + color_cutoffs = list(5, 10, 30) glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/hud/health/meson @@ -54,6 +54,8 @@ icon_state = "mesonhealth" item_state = "mesonhealth" vision_flags = SEE_TURFS + // Mesons get to be lightly green + color_cutoffs = list(5, 5, 15) clothing_traits = list(TRAIT_MESONS) glass_colour_type = /datum/client_colour/glass_colour/lightblue From 06a5788a1f45db90b9492f9a659eafe3a60ab847 Mon Sep 17 00:00:00 2001 From: Molti Date: Thu, 30 Nov 2023 20:53:21 -0600 Subject: [PATCH 053/281] eyes --- code/modules/surgery/organs/eyes.dm | 3 ++ .../human/species_types/preternis/organs.dm | 35 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 64fccd134caa..a04f105036a0 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -169,15 +169,18 @@ name = "alien eyes" desc = "It turned out they had them after all!" sight_flags = SEE_MOBS + color_cutoffs = list(25, 5, 42) /obj/item/organ/eyes/zombie name = "undead eyes" desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." + color_cutoffs = list(25, 35, 5) /obj/item/organ/eyes/shadow name = "burning red eyes" desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread." icon_state = "burning_eyes" + color_cutoffs = list(20, 10, 40) /obj/item/organ/eyes/night_vision/mushroom name = "fung-eye" diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm index 037da0f9230a..a3e2334b168d 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm @@ -1,7 +1,6 @@ #define NIGHTVISION_LIGHT_OFF 0 #define NIGHTVISION_LIGHT_LOW 1 -#define NIGHTVISION_LIGHT_MID 2 -#define NIGHTVISION_LIGHT_HIG 3 +#define NIGHTVISION_LIGHT_HIGH 2 /obj/item/organ/eyes/robotic/preternis name = "preternis eyes" @@ -17,14 +16,11 @@ now_fixed = span_info("Lines of text scroll in your vision as your eyes begin rebooting.") high_threshold_cleared = span_info("Your Preternis eyes have recharged enough to re-enable most functionality.") low_threshold_cleared = span_info("Your Preternis eyes have almost fully recharged.") - var/powered = TRUE actions_types = list(/datum/action/item_action/organ_action/use) - var/night_vision = TRUE + var/powered = TRUE // These lists are used as the color cutoff for the eye - // They need to be filled out for subtypes - var/list/low_light_cutoff - var/list/medium_light_cutoff - var/list/high_light_cutoff + var/list/low_light_cutoff = list(5, 20, 10) + var/list/high_light_cutoff = list(10, 30, 20) var/light_level = NIGHTVISION_LIGHT_OFF @@ -40,11 +36,8 @@ color_cutoffs = low_light_cutoff.Copy() light_level = NIGHTVISION_LIGHT_LOW if (NIGHTVISION_LIGHT_LOW) - color_cutoffs = medium_light_cutoff.Copy() - light_level = NIGHTVISION_LIGHT_MID - if (NIGHTVISION_LIGHT_MID) color_cutoffs = high_light_cutoff.Copy() - light_level = NIGHTVISION_LIGHT_HIG + light_level = NIGHTVISION_LIGHT_HIGH else color_cutoffs = list() light_level = NIGHTVISION_LIGHT_OFF @@ -67,12 +60,6 @@ //to simulate running out of power, they take damage owner.adjustOrganLoss(ORGAN_SLOT_EYES,0.5) -#undef NIGHTVISION_LIGHT_OFF -#undef NIGHTVISION_LIGHT_LOW -#undef NIGHTVISION_LIGHT_MID -#undef NIGHTVISION_LIGHT_HIG - - /obj/item/organ/eyes/robotic/preternis/examine(mob/user) . = ..() if(status == ORGAN_ROBOTIC && (organ_flags & ORGAN_FAILING)) @@ -84,6 +71,13 @@ else if(damage > high_threshold) . += span_warning("[src] seem to flicker on and off. They must be pretty low on charge without being in a Preternis") +#undef NIGHTVISION_LIGHT_OFF +#undef NIGHTVISION_LIGHT_LOW +#undef NIGHTVISION_LIGHT_HIGH + +/////////////////////////////////////////////////////////// +//----------------------Preternis Lungs------------------// +/////////////////////////////////////////////////////////// /obj/item/organ/lungs/preternis name = "preternis lungs" desc = "A specialized set of lungs. Due to the cybernetic nature of these lungs, they are far less resistant to cold but are more heat resistant and more efficent at filtering oxygen." @@ -107,7 +101,10 @@ heat_level_2_damage = 7 heat_level_3_threshold = 35000 //are you on the fucking surface of the sun or something? heat_level_3_damage = 25 //you should already be dead - + +/////////////////////////////////////////////////////////// +//---------------------Preternis Stomach-----------------// +/////////////////////////////////////////////////////////// /obj/item/organ/stomach/cell/preternis name = "preternis cell-stomach" desc = "Calling it a stomach is perhaps a bit generous. It's better at grinding rocks than dissolving food. Also works as a power cell." From 6bad340ccd124ec50024dc54bae1fa9ba850a49d Mon Sep 17 00:00:00 2001 From: Molti Date: Thu, 30 Nov 2023 21:40:11 -0600 Subject: [PATCH 054/281] fix eyes break huds --- code/modules/clothing/glasses/hud.dm | 8 ++--- code/modules/mob/living/carbon/carbon.dm | 10 ++++++ code/modules/surgery/organs/eyes.dm | 16 ++++----- .../human/species_types/preternis/organs.dm | 34 +++++-------------- 4 files changed, 30 insertions(+), 38 deletions(-) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index ddb8f96210ce..4286eec82af8 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -45,7 +45,7 @@ item_state = "glasses" flash_protect = -1 // Blue green, dark - color_cutoffs = list(5, 10, 30) + color_cutoffs = list(10, 10, 30) glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/hud/health/meson @@ -86,7 +86,7 @@ item_state = "glasses" flash_protect = -1 // Pale yellow - color_cutoffs = list(30, 20, 5) + color_cutoffs = list(30, 20, 10) glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/hud/diagnostic/sunglasses @@ -145,8 +145,6 @@ icon_state = "sunhudsec" flash_protect = 1 tint = 1 - // Red with a tint of green - color_cutoffs = list(15, 5, 5) glass_colour_type = /datum/client_colour/glass_colour/darkred /obj/item/clothing/glasses/hud/security/sunglasses/hos @@ -159,7 +157,7 @@ desc = "An advanced heads-up display which provides ID data and vision in complete darkness." icon_state = "securityhudnight" flash_protect = -1 - color_cutoffs = list(35, 5, 5) + color_cutoffs = list(35, 10, 10) glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/hud/security/sunglasses/gars diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a3eb04ddc2ca..c21bcf7e6969 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -574,6 +574,16 @@ lighting_cutoff = initial(lighting_cutoff) lighting_color_cutoffs = list(lighting_cutoff_red, lighting_cutoff_green, lighting_cutoff_blue) + var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) + if(eyes) + set_invis_see(eyes.see_invisible) + new_sight |= eyes.sight_flags + if(!isnull(eyes.lighting_cutoff)) + lighting_cutoff = eyes.lighting_cutoff + if(!isnull(eyes.color_cutoffs)) + lighting_color_cutoffs = blend_cutoff_colors(lighting_color_cutoffs, eyes.color_cutoffs) + + if(client.eye && client.eye != src) var/atom/A = client.eye if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index a04f105036a0..3c7546d488b3 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -165,6 +165,14 @@ #undef NIGHTVISION_LIGHT_MID #undef NIGHTVISION_LIGHT_HIG +/obj/item/organ/eyes/night_vision/mushroom + name = "fung-eye" + desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced." + low_light_cutoff = list(0, 15, 20) + medium_light_cutoff = list(0, 20, 35) + high_light_cutoff = list(0, 40, 50) + +//innate nightvision eyes /obj/item/organ/eyes/alien name = "alien eyes" desc = "It turned out they had them after all!" @@ -182,15 +190,7 @@ icon_state = "burning_eyes" color_cutoffs = list(20, 10, 40) -/obj/item/organ/eyes/night_vision/mushroom - name = "fung-eye" - desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced." - low_light_cutoff = list(0, 15, 20) - medium_light_cutoff = list(0, 20, 35) - high_light_cutoff = list(0, 40, 50) - ///Robotic - /obj/item/organ/eyes/robotic name = "robotic eyes" icon_state = "cybernetic_eyeballs" diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm index a3e2334b168d..4909b3c92787 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm @@ -1,10 +1,6 @@ -#define NIGHTVISION_LIGHT_OFF 0 -#define NIGHTVISION_LIGHT_LOW 1 -#define NIGHTVISION_LIGHT_HIGH 2 - /obj/item/organ/eyes/robotic/preternis name = "preternis eyes" - desc = "An experimental upgraded version of eyes that can see in the dark. They are designed to fit preternis" + desc = "A form archaic robotic eyes that can see in the dark. " //preternis eyes need to be powered by a preternis to function, in a non preternis they slowly power down to blindness status = ORGAN_ROBOTIC organ_flags = ORGAN_SYNTHETIC @@ -18,29 +14,20 @@ low_threshold_cleared = span_info("Your Preternis eyes have almost fully recharged.") actions_types = list(/datum/action/item_action/organ_action/use) var/powered = TRUE - // These lists are used as the color cutoff for the eye - var/list/low_light_cutoff = list(5, 20, 10) - var/list/high_light_cutoff = list(10, 30, 20) - var/light_level = NIGHTVISION_LIGHT_OFF - - - + var/night_vision = FALSE + // This list is used as the color cutoff for the night vision + var/list/light_cutoff = list(30, 12, 60) /obj/item/organ/eyes/robotic/preternis/ui_action_click() if(damage > low_threshold) //no nightvision if your eyes are hurt return sight_flags = initial(sight_flags) - switch(light_level) - if (NIGHTVISION_LIGHT_OFF) - color_cutoffs = low_light_cutoff.Copy() - light_level = NIGHTVISION_LIGHT_LOW - if (NIGHTVISION_LIGHT_LOW) - color_cutoffs = high_light_cutoff.Copy() - light_level = NIGHTVISION_LIGHT_HIGH - else - color_cutoffs = list() - light_level = NIGHTVISION_LIGHT_OFF + night_vision = !night_vision + if (night_vision) + color_cutoffs = light_cutoff.Copy() + else + color_cutoffs = list() owner.update_sight() /obj/item/organ/eyes/robotic/preternis/on_life() @@ -71,9 +58,6 @@ else if(damage > high_threshold) . += span_warning("[src] seem to flicker on and off. They must be pretty low on charge without being in a Preternis") -#undef NIGHTVISION_LIGHT_OFF -#undef NIGHTVISION_LIGHT_LOW -#undef NIGHTVISION_LIGHT_HIGH /////////////////////////////////////////////////////////// //----------------------Preternis Lungs------------------// From e6c8e834a42628ae8eb0390b73dafbf3aecc0601 Mon Sep 17 00:00:00 2001 From: Molti Date: Thu, 30 Nov 2023 21:57:51 -0600 Subject: [PATCH 055/281] colour tweaks --- code/modules/clothing/glasses/hud.dm | 4 ++-- code/modules/surgery/organs/eyes.dm | 2 +- .../mob/living/carbon/human/species_types/preternis/organs.dm | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 4286eec82af8..686ade9038dc 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -45,7 +45,7 @@ item_state = "glasses" flash_protect = -1 // Blue green, dark - color_cutoffs = list(10, 10, 30) + color_cutoffs = list(20, 20, 75) //yog change, blue night vision is so much weaker for some reason, so it's been significantly buffed to actually work as night vision glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/hud/health/meson @@ -86,7 +86,7 @@ item_state = "glasses" flash_protect = -1 // Pale yellow - color_cutoffs = list(30, 20, 10) + color_cutoffs = list(40, 30, 15) glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/hud/diagnostic/sunglasses diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 3c7546d488b3..755be018ecab 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -156,7 +156,7 @@ color_cutoffs = high_light_cutoff.Copy() light_level = NIGHTVISION_LIGHT_HIG else - color_cutoffs = list() + color_cutoffs = null light_level = NIGHTVISION_LIGHT_OFF owner.update_sight() diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm index 4909b3c92787..a8405b0e0cb5 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm @@ -16,7 +16,7 @@ var/powered = TRUE var/night_vision = FALSE // This list is used as the color cutoff for the night vision - var/list/light_cutoff = list(30, 12, 60) + var/list/light_cutoff = list(25, 10, 60) /obj/item/organ/eyes/robotic/preternis/ui_action_click() if(damage > low_threshold) @@ -27,7 +27,7 @@ if (night_vision) color_cutoffs = light_cutoff.Copy() else - color_cutoffs = list() + color_cutoffs = null owner.update_sight() /obj/item/organ/eyes/robotic/preternis/on_life() From 66c412cd25eff366c6f0b2ecdf9d465569aeb2ed Mon Sep 17 00:00:00 2001 From: Molti Date: Thu, 30 Nov 2023 22:41:16 -0600 Subject: [PATCH 056/281] fixes --- code/__DEFINES/layers.dm | 3 --- code/_onclick/hud/render_plate.dm | 2 +- code/datums/progressbar.dm | 3 +-- code/modules/power/singularity/singularity.dm | 2 +- code/modules/spells/spell_types/jaunt/wirecrawl.dm | 5 +++-- 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 4199d972132c..e81166024dcc 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -12,9 +12,6 @@ #define PLANE_SPACE -25 #define PLANE_SPACE_PARALLAX -20 -#define SINGULARITY_EFFECT_PLANE -15 -#define SINGULARITY_RENDER_TARGET "*SINGULARITY_EFFECTS_PLANE" - #define GRAVITY_PULSE_PLANE -13 #define GRAVITY_PULSE_RENDER_TARGET "*GRAVPULSE_RENDER_TARGET" diff --git a/code/_onclick/hud/render_plate.dm b/code/_onclick/hud/render_plate.dm index d4e5bd9777eb..584d8b4275d9 100644 --- a/code/_onclick/hud/render_plate.dm +++ b/code/_onclick/hud/render_plate.dm @@ -78,7 +78,7 @@ /atom/movable/screen/plane_master/rendering_plate/game_plate/Initialize(mapload, datum/hud/hud_owner) . = ..() - add_filter("displacer", 1, displacement_map_filter(render_source = OFFSET_RENDER_TARGET(GRAVITY_PULSE_RENDER_TARGET, offset), size = 10)) + add_filter("displacer", 1, displacement_map_filter(render_source = OFFSET_RENDER_TARGET(GRAVITY_PULSE_RENDER_TARGET, offset), size = 75)) // Blackness renders weird when you view down openspace, because of transforms and borders and such // This is a consequence of not using lummy's grouped transparency, but I couldn't get that to work without totally fucking up diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index 23b916604dfe..225fa2e363ea 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -35,8 +35,7 @@ goal = goal_number bar_loc = target bar = image('icons/effects/progessbar.dmi', bar_loc, "prog_bar_0") - bar.plane = ABOVE_HUD_PLANE + 1 //yogs change, increased so it draws ontop of ventcrawling overlays - //SET_PLANE_EXPLICIT(bar, ABOVE_HUD_PLANE, User) //comment in when we port TG planes + SET_PLANE_EXPLICIT(bar, ABOVE_HUD_PLANE, User) //yogs change, increased so it draws ontop of ventcrawling overlays bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA user = User diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 31633999f379..cb1d0a12590a 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -4,7 +4,7 @@ #define SINGULARITY_INTEREST_NONSPACE 2 /atom/movable/gravity_lens - plane = SINGULARITY_EFFECT_PLANE + plane = GRAVITY_PULSE_PLANE //plane = GHOST_LAYER appearance_flags = PIXEL_SCALE | RESET_TRANSFORM icon = 'icons/effects/512x512.dmi' diff --git a/code/modules/spells/spell_types/jaunt/wirecrawl.dm b/code/modules/spells/spell_types/jaunt/wirecrawl.dm index a1829b04dbf6..84b4a367be0a 100644 --- a/code/modules/spells/spell_types/jaunt/wirecrawl.dm +++ b/code/modules/spells/spell_types/jaunt/wirecrawl.dm @@ -108,7 +108,6 @@ wire.visible_message(span_warning("[jaunter] zips into [wire]!")) jaunter.extinguish_mob() - jaunter.sight |= (SEE_TURFS|BLIND) jaunter.add_wirevision(wire) holder.travelled = wire.powernet do_sparks(10, FALSE, jaunter) @@ -135,7 +134,6 @@ if(!exit_jaunt(jaunter, get_turf(wire))) return FALSE - jaunter.sight &= ~(SEE_TURFS|BLIND) jaunter.remove_wirevision() do_sparks(10, FALSE, jaunter) @@ -214,6 +212,8 @@ if(!totalMembers.len) return + + sight |= (SEE_TURFS|BLIND) if(client) for(var/object in totalMembers)//cables and power machinery are not the same unfortunately @@ -239,6 +239,7 @@ for(var/image/current_image in wires_shown) client.images -= current_image wires_shown.len = 0 + sight &= ~(SEE_TURFS|BLIND) /obj/item/wirecrawl From dfdf1ca7ed78434df39da547d8f348a3f96370c7 Mon Sep 17 00:00:00 2001 From: Molti Date: Thu, 30 Nov 2023 22:48:43 -0600 Subject: [PATCH 057/281] Update living.dm --- yogstation/code/modules/mob/living/living.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/yogstation/code/modules/mob/living/living.dm b/yogstation/code/modules/mob/living/living.dm index 5a123f460b41..17fd8746224d 100644 --- a/yogstation/code/modules/mob/living/living.dm +++ b/yogstation/code/modules/mob/living/living.dm @@ -19,3 +19,4 @@ for(var/mob/living/simple_animal/hostile/guardian/holopara as anything in hasparasites()) holopara.lighting_cutoff = lighting_cutoff holopara.update_sight() + update_wire_vision() From 65a95052cf3064976993074256230fbc65751af1 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 00:28:38 -0500 Subject: [PATCH 058/281] yea ea --- byond-extools.dll | Bin 0 -> 1276928 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 byond-extools.dll diff --git a/byond-extools.dll b/byond-extools.dll new file mode 100644 index 0000000000000000000000000000000000000000..37efe6c6e4032e29893c927152badee402ba60ae GIT binary patch literal 1276928 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
H{ycLo3t2`P9fWb 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

  • DJ?Sg*r0L1rlqujx@#;_hERuEf>9 zu1`tEHCQhHvCnrIm*(ut__kPy#I3V&>oeSHhFd$UADxKL{lL4s|49hL`CW7B=rpLu zGkR!yiYCvutTD!}qvl-|@oq4_+KA@xJbr+4PfGl(@Qet2Sc&)X(MO)VfEGI?endF8 zFn21hPEBzE83AsLpffr$*mgL5yh&O02NCOwnqY!ErT1CYPfCF-=D6+;9fFCX4hU{urTBLS3)^8*WB|k+V?FbukbXcjLTmM!wds%;*)i} z85t(O9@l=wVEC2U#`B2$^5ltwPR9A2gfq&tM$e5JXw*QX1{yWcsDVZeG-{wx1C1JJ z)Ig&K8a2?Ufkq89YM@aAjT&gwK%)j4HPEPmMh!G-piu*j8fer&qXrr^(5Qh%4K!+? zQ3H({Xw<;}ZyLzU<8C*1|8Uok@*ZVMb#r_@Zg=fjk?K_YcZ}RgHEM8eZ9Uz`2kJX0 z{Ya`nvYI53zknphLV|DjsxP*)${m8-49W#Da0Lha+2;i1Z+DRIM)``LAYb4p?-$iN z1bLzvM3Na~roD*C|2F!cL;s1V<^NgwkE8#y?ftuxiqyy2;!7Jz6>2VANwr^~>k-LO zAaM<0bcd2I@&M>ICD?1oofNM2x8bRQbQ?+!p!5<4X}kcRxEs5gBXaQCTu}DZ-6!2i z1!^RYA1ZMtdDK3?*W&EUwb{j?>bWftC&F-bW;O0oEW|7JJ07W_hifTTp}ut%)3;JB z!%0Er^yML5vzr>}n-1iO`x!C(94mw>>#Oz&{;yAl<@cq@o^l{yCDX}co*6k3S@ zn=+WWRK$W)1;g@oFwz=t(rgF?%}U0$mm`fkDOO#1ob@GKeHA?Jq%w6Rew+1B2EG~O zD`K=19JU#lPUDw5DN;=qz6v$mhNl8NmyoB9JS#0cOwYwO>8XX>fhLeEXL?dCa=!4x z)NdoK`e6NigYw-ELO#w>-Y+LupdX;f7>fL6yB&Lb;pDH{Mye0}SX*D1N;ClF&aAtm zAi9b~(|-lg8hau=0nCSs9pZl=1RNelCe@LH`unzxeH`AP{1QojgYqxh$Ws|JDBqK5 zQ1BjuZScSE$EZ zlea=WsJlPv?zg)8x$b_fyIXa4qwc<^yKm|4tGfH5?mnZtkLhl%?mnoy_v`LV-A&Wo z+jaLg-5svGLv**l?)K5$t918r-Mv_M&(qzuy4zBBLv;6exSoF9{ZZT^^;@`RJ(ohy zZv+|b*eW2;3TpgE+)s!=zm!{pdFx}jRiti(Ytl>Zb_5O8JYJ7J zLb|Y}K%TJQpqeH)Dff&M&vM=h{Sn)W5d4^{O`gl@T@ot{wq(-Z}iiAoh5s!auV-BWf!Nb_qRk>EjU_z z^BkHMxDBHTQD;y7LMN-n*kkr((1(s8=y&iMs5cP}09RtI*a=$rwFti^yEs}sj&21? z+^1e^6Vi5s^l=?R>dKIYHW-pbJXDRlQcnY{G1MrDkYCrw-ZG1fFjgIAc<8DQ1hk7o-3i2@mX&dK199+=n>%TR z`Yr5iHUXc*HM6cj%2tC_tL*vYFC~9_2Y&KAX2Zk5$V4yCNb+oF5!->f?;jsC_EWL~ ziVhSU%qsPSy`Z0ecEQ!C+Me~S`cqHopJvDV^go6XyZV&=$?u~7I@ZOer{#Yf{RjOH z|DPJhb6|>1@$W+ahZvuiPs{&_WANX#4*oMw>7VJ{M*rOzpTyJh|1A9%Q2%G2mjAox zzlQqXk25m^lPbUb(#!b7)Bko>%ePOJR&$ zKc&M+v_+uiba}x26$Y>x_iiB192Vo7Pr*%n9jMam^6Sy~n0aZRJVds* zdawmq*b3)-jZ*gwBnz{M-sonH8_QpRa;!fIj`iIeN-fSlR%0);a}Preh%fUjNI3hhpXG&la=G#2v((J!Zre@6E+dJgzzZi=w3zmlfWWE zj$GaDO2W?s9wpo^Fp7hOVu9TW-w`;J@HK&{gewK+5I!MrC1I|>^@IxqRuEb%dvsQW!AB4U;2E%(gS~{<)|3^S!$0~&L z1Ik5VEYYN&t!0>X^LEB*NeFyYc5Nt5ZntDhhK$A}Tc!z=Y?&xfvSoxo$(F$aC0qIl zlx(?5pk&LX0wr5I3Y2U)ixAn;Lfm{cSX_^K45oYPUv5FRv|+X|I?2kacFdNw%!1CS zWrZH1a!eE!t|2-I8FRKwfgln-?H40kCINZI2f_Q^E)A*RjPj|lPGW*mQy5D9k3~Cb ziiz|l-(rs2Q%e1hZ!qw}zGOMM11TFoG-0nj-(%z(O1|(0`8Yq7{yp2L-D+33=D2Y_ zXCS$jv;Qc%+^iVN$8}~-m8(N-#eESa|%JdaCdNdd;HO z-{NeO?B}0Z|5y6&OaC99mj4d)U)c`+pRo5&yR0qJ!Fm3c;$r?!caOtZHl;6jjFxF7 zKN*=;2;_-rix7I)hY*;LESH1O|CxA)aEv{JRC5_w#qbd*j9-**Zano<4&}R1ejTGy zVEC|=-+YOE_y=krpF{c72IUt!$iG4PD8@goLHR)r@-ryEkKrqZ58L=RH=df)Px%21 zzrgTeE58}-gFGKdPy+r&$e`m{XCQy%vPt*SRQK{bItHffH@aHNUedjMD~~Y$p?mq*=Os(` z@`3KNqK6eJgQK4>t43|yl^&;MW9gk@}{^2>MK4kqs2>+`lLL{ zQyzya-JiFD;zh*vHspF(k zD^oY_u<~y;y!@p1Zp`q1+lIv+h@z zik{MD2qz#$1L?+IfrdE8a|AMg1N9p_!NVSu?UNYXP<_3mfw#1o2_LKMp&YzYmIA zr2Z&wfy%J~TfooZn)q|mHT&o#tjlOoe;UXW&PvtJ5|{`FUKrkkdN}u6`G@2q{sX<_ zeTBR!$lo#M7z62`j|%lFo$qoRzLnrRjQJ2PvNb@SBJ!m)!1pceY&P$o!!@OU2>Dif z`SQt^L%#M-d|JEuh)@=(i|J}>j&lXdqU1gDv_PFEZiV_cxTb(}duocm+#7Zb!yXxm zu%9{q^y&^NCI9u{j-%d~f|2xX`qt3bdLYkWrtcbuFkFkWFx?6{ugsHK`^yLCb*x%3JZ}O19_GrxzK~ zf06p21X7{iZxaZYqmkkpy@B**AR}oZ{oC07AQ96qekN`e@0I0bNx|(J_(r`-&NqFd%3tp>c#r+^Yq_s_1`V^-yz}_sK;S^OZm6%GsxwX7^3t(*2Fap zy$R$=Wjo*H6j2I@Dfu6haEjDiaSPN3#YOqIhC5^#0v+fLv@ZjVV;lEQw0(KtezA*b zPb{LL>{qV&6Xm)u9Q7TnxT76n1y;X23r2%m4DTN3=P}95yK^FSdS89YE+(%&(t7Vwd(YLH*pm#2XPu3P3euMikVt}lM)T^Tr>!@KZU&#hG2tx)mU zogRyG%C)BZbnmcy%oO{vLQNC5 zNWER$0`)d)M5KIN;*CW|#-g0%<4GvTE=<}eP`xlbMi3x#*i<}kbTAr+I zrZ1o1B6?3&-qd7eN@6NPFliu{4-mtppCevNXv#M6k5^!-oPTltv$@2-LcI<3+7yb+ zqg{d^G$nLoU|p&4Cyf}HsQvWEWyNYtUwf*!^yE!Kpn%jWR5)|E%-=UCTz4LX;~YX` zd8t&7!fG|kvtO7&`BmpbUcvG~V7SIFme(xwg2w)*4}ANR?k%*^%Kj(PdOCpiQAb*X z9`ReJ#*iQTpFG(Av_a!{B^LR0n?=}OoTc9IA&P+u+oJEld@#p%ZkY^NuO9GNB9a@c z<-V)J$eM*fo@gfaL|doCdSm4Sw)>}2)jr4)ZU0o5dJ@A-4F9-G`%?tMk?r43T4FS$ z3>vTd43QYg9GiWbk+9uA6{fz2ES3FJN6=16Z2bxr=Vl*cNEzoMr0@nq;<)ur8J8<+ zIgD8|7h^q8xR{|u=&XFYA!2*90&-0CT{dyyzKdp*FJ)Y^Eb@NQ<}%zD=z%UX|JUfhEB$x2_ph(tj^z+jTfet8iW(~fiW)x> zC~Dj&P}KOYKvClwfuhD22%*NO#m!eA71yIKg=<-F?Rl7L%%jTQJ^|&eAey`bXql)H zGN$61tFN~n`@~S=&p@7n_7LRy`JbdXH(mt!?if>2p}q>Mod(+{^1DcV2ER?Q8j^=f zl;Vxjct&YuM?`6lv5;?ympf^VnyvE>5&kvmESF|4S{1AK;o)kxP%z#@bzmHdX_9y0d+aaR|ki z65U{bMCV^DZjrixt~Rjd<}X^o)5R@Nr@%EwflEb*!WG^qbYc{iL?a5%VY$T@oCUF; zNQISbVjMzy=Bsj$Oz#AeF^(iG*I#3%iSCD(`8V^>u6dF?Lu0`cY2jgcP++Rku6ZAo z*evgX{3yzgzXSmy{#0{goHk*`u8u#snf*PilKl+Ux3Pu1n)9pv|5H07CcG31kN z<>Peu6DT+4_%r+`DX&mI(kk!ndK4qAn%9`$g9*P8IE8SJz%0UT0`m!r1Y)7TUVU5O zZo*du))M|hVE8e>O-s%LxYwtRd_xFbtn7 zRId~mOL&RE1i}si#}h^hoI}`D;Bvy_uQJ7J34a#2op7H(g>bLH&=Y_=1jZ1S2<%Jf z5jckMb%7a#FAB^fd`jRN!es)>2p0<6M>tzx5I1DrC9osmWP!a1ZxuL_aEQQk!s`Vt zBkU=#fbcSbvb*yFfmOWQPGB8jn80YxaQ^-Z6E8d24hoc=Y(EGTOQ=$ySVFr5iY2s3 zpjblh3lvLetw6DaUKSX|8HHyAiY4@jK(T~!1d1hepFrutX9$!o{0@QAg^v*^U3ii} zX%YJilrH>QfzpL{6)0W!MFOP@Z%>FWyp6c|YBO;?>d69h;di#hz;h6{OtA(eEBC;p zC@HLEcO8v|tiq#2i|c`Ei0<2Csa&~n5JdgDX1meyb_Md(aZs_^7}Ezf7yr-wawV?! z8~9=*#%Pu7x_Z)zILNK%Sx)XmARKQKwdyVfi6PnbVt* zOE3}99jWUHVePE5$v74@WZXP&u(KF!IGgC7uxQsnux_`9rF*^}-e^6LTXc7j?q09E z*V5Jc(Fb8Ao6??3F2v)vEk^RIfjp(`@}@Q%4T{b|f>6 zx9*}ydK^Ud8=JC?kTjR;zgHJivo-2N7^j<3q`m(|k~x=xWTk~9bsbh=Fo;c7zI#I( z+M5|TjN4ZRh6FN9v@it5hvU_%m#p#Ndi3*TS<8Mu+L49wD;?w~Qa+3F6(LTA!cTux zc^8UQP~>HMk;3S2@Ni}=nw1!$Db@j&w*L`psGc>uv?4AzjHhfEruvz{vDojQB9U=ZTB;KXJ>|=ofguRPARo??O9v2PV9< za7uwZL#cu59Ktd5AnAuOZjLweWj%8&lNv0^4v^N}? zG+vgsi*4ew8+->!jr8pU@(du~#8dLsst=)j*`@D!vP3d{(T*(4hsR)_o8@Z}pNW*; zM=e*JbkH7jfjRIJZOZ4f9{*uMpe6;>cntgz<{D=b-{SYe3*#R}^qP^_@O2ox(UR-jm6=L!@n ztc^gi!kP#aE9|HYAjJy%Nd}Ht>V9$a)i1^MsGq{M%tux4qZKxpP2(@9ZiT5t46SfH z(Lw7_(RiO=?M9>YtOoLwUk2|nzdPkyU@8COzl{C=9D-@{QPTv98Yc=AHI5J{Y8)(3 z)Ywm;sPQU+qQ*-FiW)l#6g8ej2otA;xY++MF82RpjlnV>wF*sVNnrw2)>(z}1{0OP z57bxG2pLm}H|C?Jp>x+7nMpvNNUCw~i9bz^oY%*D)8DT))(r~OE750i8tJ0-bl0ip zio0Ij;^FU7wOHKkYOvhjtsX-%OpzZ_fa>QV z>b$quB$-WU2l90%-xCgedi%E*@zUnwHwe_)KY?2NCs1qu1ZwS{K&|}~sI`9rwf0Y- z*8U09+CPC>`zKIq{{(97pFpks6R5R+0=4!}pw|8g)Y?CRTKmV9A8i%=Cqh)*{olsa)<)!wSnt%%!{T`nVQLoy zVwpyuLHqi9AXccZOPz?>-oFSd-4sbVd~F8AHN8(E(OeRJW$Yq1B4l#em~OGr9~;vP z$TE~HD;!xk-`^JT;S76Aak2kZ|9u=*HJ=|8H&6XhT%3Oc*A)NUxtfw+Lq2Fpcmc>$ zNhNo13>+kW}Lx5|dUKTfBeNJ4D`UG4{|MA*hHhf3f z$i0c?r7-AQAcj_Wi1*&I4!w;2BmG^Y=%fI7!mot)s$Xmifn7%Y!FziD(G#YGZa-fp zP}F#VKv82mfuhDRfuhFWv9h7>FFPnu)cAuyQDdb*QR6N`sBw$9`D(Ga9<>mzrT>`1 zCZ@20D&w%Fu!<;eEzoXJBV;7OzUpJx&zGT-(Q4p@K%Swr&z`RR)70o%GzT@^ZyzCl zVjm$JSv8>qv6em(MbR9;RIP3MTCWMv_VJhg*gLIXi-RVs)ZupgoTxjWthJ2oQ%WR>g!fzrRU6Da*l zm_X@Ye&=w~E&a=G#b%O-)+zq~I{`j@o=rGI%@pfrrn2$Y8L z5rNV$<_MIA@jijlzswLQ4dWdGrC}T+P#VT0LNttt;^wRU#Pz6G!?pA;fBl3F;{f(5 z!!XTKIFyK?6($f3w~hmi{w4BFL;uZyJR`4x_pIuMYfE5W{E=UJ|FRoP5_0d(81eO%W zQe}%Uq$})7)E(_?VT`B|GLl+f^*8#LE&npq_yLe-Iopoj#suUa(NLfaE760n&*|PT zZjm}u|D6Wc6ssZ2QM0b`MyV^Kl*%ZrR_$}vmmqni;KUmcQ2Ib1(_TQYf3H9xdi~?7 zmRoy&=W&5j|CR`p`ZrIY)W4YmrT*P1Q0m`!fl~j536%ObP@vSmc!5&?x(k&0*IA$x zobv=q!HEzk1t(OX6r5um;<=^Z91ti4=R1K?a4G~!!TE>~1?NL?^VR=|>rvl^YpH+R zcCz5)v5@RSTUWS(h@llOBeEF^8uc&lb)(=s1mv008{UHy`&`@j8K`#vTGijd21+jpqv#HOe5#Eoy8ocSVhL9A;?KEWgNzBTH4q%~!t>*Q4%* zYpH)ZJE+EVs;ud5C~pqY+SNeQMU9X#m2{*2-L%F~y`t`LG7$@%{_sIUc=V+zNH3xJ7E3xOjh- zu6sQD-O+%ipmO;Dp~WCHt-o#0a0gRSdHYYLD2{hSgrA13dIUDK?0*xtLj6Hpy#Gd5 zdtqj`4{p(Y70WFlct>vKsc*`A>n`{HH)|{!^ef|0z(L{}d?g+dTrc`A>n` z{HH)|{!^f|Z;1k>V)hXz74t6wrDDbkl!|$-K&hB*1WLthB2X&kQ4B?l`A|AcF4->SE=Vpg&e{(^~x!hJ*xt+0aVAZ!kE?&$lG*A^JLvl_@VxG%i(9n?RV zF{deJ%zt9MV66WL6g5s1C~6!bP}DeBps2B*KvCmW0!59N3KTVV6e!)qS%gqy3vn_3 zDK6$eF&eV8Z>!K1l@zY0$~vRRC@du^e*wrNYP61^jP`BXKMgfb0`e@0hv43C{xmhp z{3nJ5Y^ToC-L`N|nL32~d%r?^tkt*OK%TCQ%FU;UinM>Q@6CK%uYTCemqWhEi0terG7skQ0jNOK&jtT1xmrZO`sIaTLenM93W5%W^aK~FuMtqg4s!+ z6wGLWQZQQ+qF^=^H(&i7!$E$n;5WFI`rQiifhC1;-$7|-p`|VCPQ=g(V~N^A#*}r2 z{ZhWlC=Hu{JnOE5_k^z-&b`yD#0_}U>-Tajsp$24sX$TVe1W3ISpr3ksRBif69kGH zhYJ)n4iYG8>?=^zcqJj!c$v8Q>P6yu)N|ol>NhulloW*jgT>` zaf-ISvGgTFjSGN0hgf`%efg)Uk^Ogni~?8>`{?df;ufiw({*#ETD?$zbPil|MD?lc zsuzuj?g8?wU__Ho8Bv+22~)4ZRGq*m^&q58K@8#2WENRVZvgA@O6TMo<9{gB82<~@ z#{UAf@xMTA{Lgi2ef%#_8~+Q`#{UAP{_YZ}jsFE|<9~tL_+OyZ-Te`^AFVZS2IN_u0Pk5}IBULvN_hs4jPXBg31j>(P}I0Vps4ZR z0!57l0!59_2^2MQnZvD(KNbrVHO>_%YP^RKYMdr6#{c4C{14Yse?vD?jU%bDMQ9NV z#}jpb1}It72pLnEHTvf*|1i|}0gz|+^$_g+`Jbjn^Y>?5nE#y#`yJED73wqqQ?%rT z*Q>p8>cTh$^+%ju-fJ5ty*}-wa1P7;Rx;84*J(Tu)>(6g28n(Q`&Y zcn8Q+L#21GuvPjQ)R$9v)zz3I113@9eF8;|GX#nn?+_?z93xQFm?Tit*k7Qi@mhhR z#;yWIjTaF@jpvG+FXjTxiWc~7sZZ-L7gAEVk}A8JgM|X3swaW+MU9X#6Ptp7_nSoH zI`cb}ub_N)tGu?qW*QWr*SCoRrM`_2DD`cyK&fy21WJ9oN}$xYO9e`O>nKp_8*MnZ zTk2agfl}X2U^z%HD76BmpzIeY1?6*rQc!jZl!8(!Pzp++Kq)A12$X{Il0YdaD+EeG zaTB7TED|?gohPnG&4g>IZ!UCI*ci7T%6b&7S>a$JhE~{@=rJthm*!Vs^N5l#wlzgi_KUyuG~%>;AbfOfFiwT3WcdO` zy)d2V>IL?Ex07!S`6@Bv@0;Yil|UiQKe zawn})SGuXWwd#q7>E_Ee4W6t~Ex)n<5d#4ee=c|RAb#TzgjVQ>F|crIW81Cbr_%#kzF?T8&Oo1QX66p~j%3ci8O(eK)!^`VP4%IAIRtWs zLSU-BfS-R3;@+qKzJG=PtL^>k_U5#IK^2<4IZ>e2{|VIkKY?2RCs6DE1Zw@CK&}51 zsP%sWwf;|_*8jc1&}95pD^TnI1Zw@CK&}51sP%sWwf;|_*8d6A`agkM|0huE{|MRt ziHrVET=ai%t^FUmx{|{2KR{!TqL>v7`!!`@7O+^8o5fjrZb;JxT0 z`&{+U;r|ZnYK+2Ki{8Jq5GZOqi5^_vX7#H;QKKSI)cB=9QRBw~MU9&UiW=7o6g9p{ z2sOSUZoc}0xE}RsxR(B9z&fh2FIDy-YFFU^qV#1zy+n90S1{`Dw*qyXYy^{qji7@M(ja3^GPG@7a#F3Eg_Oj=#^6c$)JOcTA$`5WpzChiG@c@VG?}=Na zz9sH*wG4wKw|3&(e*j(3&!R=Vl}i1zN2u*vDXTIGp1wkO-M%;mMI$6r}=4*FILom7LSE0kSboBy}macB3+|K+daHQn>bP1d*#JLf7S(PO(vV89bPe$SAuXGUtaLJPL0}QH$LH)M5 z0WEmd;lE#)L(h21dxk^)ZF~8&j`F_G;h9E`;8-asj+N?u8?%uBN6Lc@A=eRmAV@xAA6M52VwY|`S^a~&E)Gj418s< zQ2k@!!@9k33~AHtjROM3-uOP&&%<3DHrW zEpEQrT3nCX6t2bI=c*s_fP`p}aLjL1>f;SBe@TBkA^Qo~CHM?9)pPH9i95 z=}R@XFwFJ;PFIxXe%|4*^4Z@E5w}Ra5uG@H_mSV_YA7vZ%-l`2X144jKD@+;VhxZ- zVGTF;620O;l<6h9i$tj;+K*`?Jr0KB7hk67dio8e-$I{XKR?_e(1Cus z)6WyOerOgRff?Yb8Vx`9IQsd7e&XmS$<`0U`WO8iWmuQl`r&+&i+-}m!_|5}9Y2gQ zf&BDK0CjvD1T-BdQ*;bPX-OM8G0QL_m(XXz82DW2^O+XLqI4k5wkUZZRg2cllTN8L zpA_l+VnlV7(cfCeqrcA|t9{+8)+BIq{!I$xk*_-zpE5Fof+lbq@-c_$?+7}0NFsQMDQJuSLEvqtHnNt$2GV*~%M zyJZ+qqwadZnwoV;O*pBOnVN?JslB0aJl8|o@wMu4v{wAxNq(29KU!NaW1jNgXb-h~ zdIiW+GY&y?vJb+Yl%wt{AoEIfg@ll!7Rzssy2K^~4vrA@Vcrl1F@yx_rx*>oH|9P- zYy3K4UawwbWgL9}2r%X>oZS2Wgx;sXe3X?~j&IaKRk%oHq{ z<>;-<1gseIDOSmfarAxvgfJ`jq0Oi4avNFZWPi#=jfL#`09m}jj#8p1P4ASFNprgN zK5Ov%KvACsiUd;JXQJ@0@@#28rOyIJ^cJ5_s;0$1t<;R&DhOz*d4{4ZSPi0lqFPpQ zYP4*%m4J=W9bSU5Bq$@nC&sk4k<%nt>_Bj_mmr!1M@jIQ9l<~w0_N^F3ydUu2IN`7 z0y4~wfM&NjcbSBhUVo9 z*4~EKuRgJFyqlhDS&LMUHkr=XW(FPJvLO2r&$NrEWGCC5a-e7r=L?&=`D9lfNdARW>JZKM_SE)4s? zc>Ay)rgYT3kPfqvepQ!V>mZ#>>9x}!z4e{Iq%-Ezb?KQ7(rqcdk1=0nBi&7x?&%=C z`vFL2-2v&FZKP|_moVLj$JwX*Ns(r{BWHNDOJ<3L!JtxzB@;3W)KTqk}2Ou47BmJH(UF0A=S)`{! z`g2V78)cj>^Lwr?{h)*N#gv{r57PNI(%0$I101CHq097C%!Tws8|ffjx|xIYYD!O@ z0qGbU>5b@*sI{`O_F7Aou>TI}Z;iQeJ@HI;jxL?+AbmNd*Up0UDjVs6y7W*7>6$r^ z9-0E_6dUOoB@GVthebt0eGa$Vh5Rxlu2NX z>1&bsI@La$hbgn1ZE~1J<~0YI+eC(K>FzhYN#&bQxnpL5$zJu;M^#S>f^Ka2k znbWxp>1+coZB!CURwVle*XTRy^xvU5u%rLiEQ9`KAWzPnpufMVH~C5KY-C6i=iedc!MC$wP*)BG7U zs<9Q)Wtn7L4!!M}X(VhrkSCw5?7%>Buj0}ql*P`Wyo@HvHk5R4C@Bo37cIT2H35nD zg))HpyGRSgoEOwzCsI^W3(o~oq>1DYXb&AUuigX6HI%%=BqIbs`65IMwj_C}hWHQal2kaz2be7zl z4#}Q0DQ~cobU919DOpZ)vbjle3}?26X_DrVCWp44!Z61Ica2($%4p7T&Ny5}>R7fd zYmBKxKWz}ENfp-tEJzn<)wMQ%gr@=P+J@F)z9*eb!!A%_JS{i?f` zKnktgEq0b%O38H`O7YAPzXWQMNzRhDP;wtl+bsn)lI@%&&!%J+&Duvyk}{*ZcZ6e^ zm~fk}%LOU+x_s~Npsr!x*)x#Zn=)jHNaM_ zMmftlj3*d|`1R}iS#OR{2lsB)n+#iSjrrZ-jv9)0VqPiCEXn8DGl#PcpP(_DqsBIT z5(%czwB2h=vFWK5$xhCaohcd4GWL%^NqxJ_@W6MHmPgIUEr*b%dP5q=kd{wHNS_*$ zc)l<+q;I5}FSI#oqJ%V_n`Z8kTlwl$HX$Wzv+5_(j5PfM+Vm8wx zAqDFpmEo2-O?pU=dP7>wkQAmV*fAuW>i2q{g-hPn7)Rc@p4#4l+?9 zb2nrjHpwheqnHd7hH#s>>uV36PBXN$4al>dIiDCnq{m>1x(UWN**3s6YeHvR>}8ur zwp423h%syu8I8@I&P-hW2(>KmSwg(u`3~$JS7N^3xmo!*fov#!4??gdy7%egy-4jL zQL0e8z!fp?@lpBmRfs!52ZIoNp%FRSIgj}#IJ2sdLR5uiH_a} zG2RDXQ=$nU5F8(E)eCoKpuXRYA%JF{PX+Syoddmm{i5#Or_=L{>Ie z1hwiti>w43F_%&-jBU_$0b)$)ox|*9@Hjd{p)Uxez;D5t^@u4DF*!)K%R1rWN)>n*H#;! z8lu?;SZy4Ir30F%it?cEW*_tq+ReZFZg%EP7%qx3M!RV$%<|64ZH&Oa$%p`V2L>iB z;FlJWHa_}~U}|e&9=pjKyEjp*w43{UH}iQ@BC=DvX%~@Qm}Ky*n}mq`wc&{PRf_s`FH6X{NhRky>&(Z3M){8BG`oDhxIZFkef{0DuZ^?e?$ zDeAeATHD$VA!r4r1;g6S(Ob4JtN=~Q4~9OU#YFp{bc`?bv-Qv`VN^5pF?wN2hU*ae z6So_oyMR3DoYZgHQ0ON8+)Als)ZtE}NeI}MLOoweKa;7$*KGZ8W~?>+c*wKZ(U1B! zhDDw`e153i8d%|`^bJ`HQV#?))xJT|eH@H?M|Xx|N${Et0Zs6Gy##+JK@|JFAB>@! zKS7!e0b_8Dm!K;Nve??Mwj;RAhJZ2nZL*PsY9P;A5=^xtICrsC2P9bMC3uwtt2i)> zwGx!76%SbnXzS1N5=RMli<(_OHxbK0tbQ{y#&2Uu#yD-wj;RHhJe`};w3nW4$IS>M)*uS z0xpS*PW;*=W_K~fv}*q@3CbCREA0sOXWJ8Gc?o8dAc!%jeafPPW$G#rFuQ-2Y+tGV zpu1m-yG+fo34qysp*MiD89*h+!;hE)@MZTtHQt7ZFB$9^5AiZuJIMj!9C0;wka!B2s)WD_N-4s(0B?<$>zE+YG9`K%VKO8evCOpf=TGm26WI z7^@Xts)tE6fSrGs9aX;iUKSI$R&8oS#aJbIscs}y7^(iV++R(40?XCwQmi^+y>IEI z2qMK~t^wU|rr;*@->2FWY{7h&rsNNRJozN(Z6#Qv{B>0P$pfd>u z$o!v~z`VG?ZEPunFrqdya+vq!Xz)~Ucsbh4gM-ThR}e^)gqYb9EhkY17kJuOi2PDP zV{RI}YUOJZg*tL2YA;4gUNvxCe?EFIjx}?xwW@-xNGwG?4?^^Le^GEyIzg8n=pg<5 zC`iXq2w4A+gI!)f9)+PvkUXL5s<84k-gg_DQkv>nxwhL(m+aeqD>+?9;~NL%hSS&Ml}V>S~oKc6PSbQbJ(fdum9o;lVO(c+v!p&$x< zwah<7ICq@0+>b#_hl>d@7jiT0dCQ!*94_1gk1&xdFVT+???vi`(uh^4=NMw9Iq`Z_ zcH4>E@4XL96S*IGADAX`*Lfe9CUT$U16l}=0hm;0ytF-Tm{GNc0ePxey0;kLd_fqgRU3+xGmDl4h*9Qx8<`5oe10=z(kV02 zB%`RUY-IL9hVv1g1j=yQ&=)=09-n1cwZpufNtuL6G^IZc2wnRB}{H}Y)U~<;H7w; z6sy>ZMVl$ieF?2c7YHqFFss%m^2}wISZ>U}c@^Z>d(vwcdR^;+*Oz@>-AOyu1&fba zVp|4*<3k~kw+sS&2h~f9a#X68rb8JcW5eA2!(GxYd<4&$qDv@N`#8k<1&Bco=V$oK zRU(il=sV#__>Ktl?F+9FHEN(y1C1JJ)Ig&K8a2?Ufkq89YM@aAjT&gwK%)j4HPEPm zMh!G-;QvPr6#gIf-UPm>qWc@aWd~7iSp*d2f-J=r=-yJ+G)-x+8%;_qd+8%UFo zrKJjwRZvkBQE>$o6n#)oaR)_3K|w`C#05b`MaAV&R8&-y_j_jUmZX8o@A?0KpZAr( z^vs#%%$YO$%$d2W(2mO zkm&8KROoG3O8D(Y72i$x;Gru11mTUEfAC}AFQ+R06^lmK!sUu%T^4M>qp+4m=eU86 z{3AGH(sd1es+TM(K61sY!Q4gd5?`FZ|Hx=T6a@d7izXhOzv;Zh*XF-?bpCIByIge{ zy=neh>BNI2=N>w?HU9`u0q@6d%|A-Et?d}TRhs{bH1dzoLp;Tc7M<=xN{MgI|78Ev z%YI{oyDq9YI{(G<5`VvL{L%SG`Zgpj`h8->!QaneBH7xO7-a<85|7+QG{|P#%uXJg zk=WmJs?7$$gKOzDkL~4dcpvyz&*Jcg)7j8#Kk&P8+$Q5|$^TQFY{>W#!r!<+!6z-s z*bbK~e(AE{YOo1$?*uyX*WfwTUHaxhY&#AvPCj((vR4+scjT|3?|Jw|r|(9v^`Fe| zGA41yuV2|-{Jrg>mtH*BxAjY|O%#$BMAt>dtRQ}v|H{$%f04X?D4lfhwLY@EC}D&Z zwzj1-xsAw@?V`;GN8s4;?+FK?H)K=(GqFRg2kCWdCmopNnHw8SnlH z@G-qrd>Y|XwfLh5zfp_7n(&dD|3bq3n*U+K&({2R6JDnIv(IY(q2cWN(5V{EKKr{@ z!`b(1yK4CRpMu`A8or+JA8}40=ZAfEZ<*%Lz8|+s^Jky+xIcIL6#{daZ|9V@BaN++$%d!nnD_HyZUro)bV$!X=PFHpfY1ygIQrwHg) zj$Y?Gy4A#*-po;@2lq_ErvDi)e$poKjO*H5*M`wJSngwWWKq#!$JM73ktr7~`g}S+ zz2F&(@t1$*WsS-o>i2-pseT79M%_+;6?OZ(Ma6BBpg3F{lnA#G39_L)_Ng^Q&PWWv-}}Eu?JxPW z#uuphTiNR%#!LD`<0Zj^%Tb|cCLhaS$cH@{KQU`Af8RG(qc4KQSHVn0UbPaDe8#Qx z_qCglhl6X=WPF2%)XH9uR%=pltqm*4ej{^_A(d0krzCJn0;eQ!N&=@Oa7qHFBydUsrzCJn0;eQ!N&=@O za7qHFBya)=&>qaG-#=CY(i?H&+c1~HOo7=7L&EqDu;UJH|HleP&iDk#Vx%mWf4VFV zeJY6SU^ab1r*MLh{Fxw12L!PcknnM^i=V>{hVVn*!4LKsKMSG{MgYF#u4_7i zYHpY2#fiQkxBC`>_T}8Z>Gn8Lyn)+=2jj#UcZ2Q&Fsl(4X2m1$11`c&{L|03K2BT* z_Zfi9VJrNfN7(J4`wDmj6i(F-CYn=!PDvn^1l%9D6QAxXh$$gKOfM0{#m}Fiwy{`o zPPw0wz&}L-Yixq}wug_0|CBt(%IBsDr{oYzHmBTAN#LI-frabh#UU<1T$8~2hH}p= zkGH`iIpDdV^m-+?*Hgos&7OL@+vSklu0T+7Ihb3$vnuHIhldM!ynct%?{wJe?7ravXE5Ab zaLIIP?SWdUGE_ASA*#F~Pf$txxbToc@otWKNvNu}9|ClOv6LH)CX0my&o`J0$zt^S zos!Gr3QE;>m)q%}u=E={-Wkko^m-hVoc;hrIF2EOuF7%aCK^l=CSS;d36&J43PgrE z+-}(|pHV_4A*w2S&?!aGlImS{ss9O6=r5B~ff^$>_JpwJM1im_9r7l%FdNcMk&)E<>yP8 z+0xjt+W*XS$&jL<@XAP*vePI$+0&$qOerHPGE7>UWXxb8^Q80)3Q2U*!ssB;lsvtQ z#!|DkC^=fa7S;^q(8te*K2O}P<|EbE(tPBn>-m-KkXcrSl$BA)wxX zLu5HSnRsB_s??%s1?~Qz)m4X)M-8N>Nf}{cPtKQeGbLk+l%7p(lM>29UP#XQa6#7c zBPGM5fDOIGP_s$Sj7imd9FQX~^P1#~FMRIDlC0#%!8WM|I1m<%Z;HF5-r>;aU%;8uK2rr`oF$Qss;ulaG38TZoW6AN8mkVM2qz5tro5 zD(Kj;DoNE6#e>oAc8_;^EA4KoT5345sC;0Y2GN#`)6Mcn<6i7hIUxeFP0oY@kAKB9A2|DV>c9 z#8kSJYGCy{OBtjwc47pDR~AiGU`dOf1fYzvXh1?$j3_=H9)I)D0kLrf7Gi)W%7+s* z^$aO5lcj|@DC@1VkUCAojw_f5&nP)jF&i;e_Jn-;pjvse*)JxveCkWwu`V7K%x7pK z!TMDy`0)8+MB7s58(PHhmW1-gh@3S-%EZ8S+^I-Z9*lk`mRd%yC+M6Lv2fJ#@pr~e z@WTINWQZ7KV~m(lJfZ$s8-32)MzcB}BKe*iKk_hzY2!)rQ{=5=qpI2CaL%!MdAF;% z=*vEg&t}(2s(e%n^|P#|q@$v@Y@O8X`U2G?GlS;K;Zuc3_M+FhW!N)t)v0r)XgO0y z6g3m%tdbX+A2`pV!SKSKU$#XpQ+ z*1(9oIY}w9%48vjBYvnaeW+v!$>FaWlO=mk9_`kBLcVv*OKW(!;uu2gB;F*7lus_}V?4P0%sYV4chs>wM-0`to?ksxBDdzWAG!d!igioK9?vrj+$5*hEEbBa-4w)(^8C(1qw7J_LyzU7(Ve}iL;zf|#+o)pcF^`zlE zM`BTVFbB+@s2+>QQpW1mM}(QY{6`d?PK$;Jl(cl^QEP^M&%1*p2bT?YXx?X z!|lW#Tc|3$yVA;!cT?y!Q8s7^Y=R+gq0m6AERd^OZ-~~WxsAnkZCbDK37Y?3wI8KVrnbj6Sejj_7{a%YF;(WpmCTA=Unz|( zoS{X@z=BzCk=+;2idM@%S`YG{7Cxj#Rwvzro|wy!Quz)7+dz&8Ow^JiJEWMK3sJnH zj`1~Rc!8^16w zPmZZi4++rhJo2oHsx`VvYG3>uMqwhAt@!jM$2$^g!kEP2%n&Cq*zd$i4r|VAxCrA| zL!#tk#yPVKN9GqhX|ABmv19L7L~Nf><53PbXj#Q3TA0{y2{yAxNTXdO%)Bu*C;9RT zCK_;-#-rXA#c!Sy$Nt{N$cc?AU+Np!@<^V}Kq9Qe$~Tb(a~Yg`5nIje21bY&~ZX|Tl2&A_0l4aKvAUVfujZxxyl=Z{GK% zV6GWHTZoW>8U?AF!dD=SpC~4D4v{r5ytq&^Wa4PC=s~ijR9K?Ja4)uf5>eow01>4! z?FBSxK+agh5=*|q2DsPDqnWb?hTf*T9W;tX}k7A5ZYf!&Npw8-~_V=w3 zNmEYKX@Lg|cE_>Nt`=f+zk%~n6Pq=JH%>XOJR&KhLRxqQAo*is!*o236k!1k zazT6!dRz)0E-zAZ+L?NSVwbp+5Z8RS-A!6vP*h|E#kF@ySuJ&k@9XE)v9`tlLKM=+}Kiyf_bGl)Nm5 zF57!)JUz(3R%s77b8?V_N~m^0<&4J?1kJA+T3X?rnxE5K9quKhq-G6E#y?u_NY$j_ zR_h9YaDbG6E{Jt! z3*x`~3u2N_5Z^bTe9sre0g%HgxG%g=5IaJqmroMJzX}8~xd!<@PY^p4Yw{&p2av|U zAosbTF%xxUZ;>Egm&Iv?pf~*Z2tjvCwQPMl_4H%v?NPAU~URN~x*TU@f4y2p@(M9lZn5(c@(% zOG$Z|k@aWhBExvHMKU z&+ZR6bv-S^ZCcNpgeKt*)p@Z zB0Tl~Y3O?i-vs<~^hH0QFCv_Nuf1}|)}DX)*6jP^*s2@cj*wo{v9z?AQU|qmEv>c*$)A+1{^jS@H$&0l>HBTt4viD}wI{e;zxQ1pM%=FWmaZn^&$l8+bbK z&)1&c^R`au-)8_H1$^;i8R!2|ll@pJ@I2rn$G)=b7$u$?}+dd0H<&F4fie$ z^r!EE2Z66|I`-h|hn{@06Y@S6_@W7O-ED1^R}BQd0JtUj#q=4+HoiI*__e^x2R(Dc zwO171av|`gz@Piq5Z{1?-#!ikUk?2G^`Ec5`?-(rzaIE1;7jKP7rtqG;K&2O*8+cY z+3M?W^5t#V0{jW!vwC!S;mDy5*L)0oBk-qEQk>-j*S+x@@GZdCUV6#SS3Vtkdw1Bk z!?YWjc>We~+JRxP?}mB%#(?Yg0RtX1!@dvZjMs$uKR$WYpH;9QfcfUE_!}J^KHvB+ z*uRC@zOdBWar?$=Z-@ObOp>$rr;~d={nq2KABEwyY~1o4u(#oeAl|q8;6dP>8D6>e zVHSiL4!-~UI_arn8AN+*`0Dv)qn1Ro%-h04{f_P+xgMD=U}H! zdarZMS&KVto&P@U)Y;u}&g|UZ&Y8aDN7$#qO#brh`;%NnH=Z6R2oB(1U*|i^@m<^p zgMqt&PiXl5j@$38yC)Yobv{?jn)k#db2|Pw4ftH(4ZS{WTzSCyL<8^zz+ZZK+0+}a zoO&7xq1!0(>LzPYwNl?D^Btg@wSk z0Kad}w6~Y-khWI?-wym^OTSBgy70`~E(5+BcusQPTlYP=;?rfo_W{4<@z17N-rBSJ zDc}cykIMV^sy%a;{jn4Hx4^}`RsSw5tbg_!;D>>qwS3%D-!ERXs2vLQDDb2O759tZ z_uVN0Zv&o(q}=e;=c~kJBY}4YerM<9EB{y~epwE@JNX|TS-D3_SnC7c2ly3l{`=yK zF34+I1bhJSp&zboJ?=oi7w!X|1pNAAc^3^|UbA=;@O0pY_17-HvuE1w4}gyX{=nIv zJ#pjS-go^BJP-Ik`4@aHUVI;G4w6BI#b6lScEFm?xg0+0$%aH~;=#B;bYMep4 z!-4frwYRx|JP`ik1eUIP&_vwn2&2V=$ma~P10Yxhrf(plzrw*HSGqio<3*(DBj&0x z)24Bj2!RKL3o@FteOKbCa>}v#F@L+qj1)(zGdrs~H8VTYJ|ZK-KBCf@n(jzT$*fLE%S^4T#<_gjFf3{` zzHpm|O#-TToS^?SSPh&CujU8r+7$Lneq~bmT}RMEpV?=Nuo( z6P1(UBXOfjkB=%(95^g}GAjUH@`7L|-Drg7Y+?H>%P{_p*X zi}-bn__aU5uS17c$NhC`t^2iU-TJh4?b@~Np#6lnR;}B1Xb&#hw2NScqXGj$9EWjn ztr*@)hDsFfN|<6(AP>!#jCsgL1q zgQpG_244a*9cCU(4ouQuVU%vcLzN#VRFbzE4c8Z99VOx=Nr;#vVV}evPBSFmO$>Tx zvCJxYz?;mocIu~}3u=!Et#!eyN?2tFe1|B&@C9g{O!P7#6)jCw|b-TR{ z=$Zqj*c=wf1dVxBQMdDt+(eC(bo7w7bJ!-GUnJ{kI) zI3=AeC!HH{=0{W`^NlUHN|(by+e@`}za5=2surspmDqF(U^J+W;w_Q}jpcr?TSuWh zF&RH80lP0l)Z9BUu=*fW+~1rQBL7IjEu@(?O+p=QvbK=E ziTbD5^i2^|TTC|}bj`8phU<5=EkOblKnI^8WN0#W^cOgDJ*Hc3ap_;>m`D@yDT?cd~TR|CSwx?#cGQ(78$|KMvg!_rET; zdno4Hb(jNdTQj;`^7FG%w6!rN;wcv);rV!R7S8dPQnS*s(z7zMGPAO>va?2HCugT* zr)H;Rr)OtmXJ%(*XJ?NX0TxFf`4J#J0?|gmNhgZqTK{SJm3KeYBUc#@II&-#oM-ZN zvxF-~ew_C=s5^1WVx3M}u_CU=Rv>$cC;(+i`N(J2+0Y$0Ea9Ej9$GzCh)52vGa%8{Z#A|l zs`%S9TGFgus9|v^OKGZyvhdaIv0~dM;7l0O%tmUA+SLU2>tP7K02BFZg2UY~1Y`M= zdo2GYa=cjnD^B1KZ~8T{zcS=!_H}rUC**h9986a!+|7f>eCpM$4{VH7`Mm)rO2-ix z#wmrlNqi@l$D&?nmL#Vq{%X=YS z451I>7|si2OBfw{6;)Il)POuSwBd^%idoi35d>_Z3hO}U^vRlD%7aq{@n78qaTxl> zW#a|$Ea-IogiqJCfi6yO=rVCC{O>>?&Kg574xAYRx&gayf{xP=ja~=PZjH10!l9rC z-KWFQ6HsV4F?{$+6-ZPR++xukF-C`#pPp`YGQpQmu@vBDJ^ zELLNIp_uE+9EV}*Kv7`%ATv9AICPOY-jT%`=A&j2PW1iVkT4FIbOV3bNW|(5j zEh#U~voLC=JXKP9TKR=mTb`-7q^t-GmXw;xAk*g3WZ}${s8Z!lv0Z2?D^WtJtlB7y zx!5$>V6;Mm&Qe~eR+PvvT*fRp9ruxZl|U;kzp$i&rxZ>DC1Sk5W-KrnFOV4t_eZ{U zku^WGLtEYn@{+CGSS~SDc%)SFR$;=A)iJacC=C5f%3G`QVr2+)G^7N?g(3{* ziOjX6x*D43JU}UyM0L<=@CR}b67xlvPDW@#LvbGmTFkMNLDsR5!*nVnWqd3$_|tH* zE1P#Rolj@L8}egTDrber3MKN=L-CXR{EZY{9#}Z~Q|_TB*XZ2KUNt-9!jj23$5|Dk z`wMK91f}m`lEv%yHx6SwD-k2u7U;?*VBQ_&H&*|=hkjYnWU@N>{( zj>EYdUxe6ferF9O;13VleAp^_vC@W`U;`z)Of@E5+yrsfW6h%v+8kXhb?90(C)X^G zTm;8UFQ7cV*lc`ygtysTLLc8`oMf{Un&hc;bNtzC4R%-1hMl1k=S2=nizH3Ix>=sM zEU_H6g$G71n++ck%Hf2=`U8{a$1gKpJ(p2nT*r52tn={@H4!Irj9spDzpe;n&OE_i6 z&1z~hbWOy|+B{L=zd2aLJ)m2sNs0%cvUuzDV!SvGVU#-|eWnZIQ}`|f-3i%%y9}#z zcR~i^jz=4Wjddp^2wMJlm9)B+rDT~h79eS34a7l}#1;D`^23dT)z82myMi(B+22dwujt7X(qZ|YS~DJ{fy)d zn>2KcL=HN31n9?%8V%R}aJR5-j_!z{TOkMhsE;AtG$>WEK4vN#QPD4B8dPkm5b|mM zi5W*pxwW)hg_tLCXEwGmI_6?FX7X^he5<^MmT`4h#$v@HUyl&-Oof8g#P2;|gb^lS zy)mKqLSX_PiKcrVW(%e=Aa1tMZ4QETvx6YN*#QZ%8y|*3jLmR2Ve&9VzDNPyWgEso zGctl-iEJTYvqJXrT@vQ5bI6rvP#F5yl2e&^6SS$N3VF)S-co9)pjk(5SxJS(WGk}} z)A*s7G4G>$F8q!P!D7s~2r73^xV=nWx)DzIWGH@N$#`}+2PlA7c4x*C1~DxvWlI|J z&o4BLr)ZGrM8R5Y60C)=!^w*4C{|QOL$QekFyK)QG-CnNJOMLq+=s~%%H)YJgW%av zKAwURq@V;TI6;cSa6}`>)+K;!#RfQ;EP#cU0&_l<3+!czy|f%QxRsWa3TCX+Ft26v zZL(v5Lczfcmlxd|!U7+YTXH3NFucqpZ^h>qn%P9nQc!Nq!{md)p!$|s%X#G^I@sl4 zb6iRnlOzg4_1dP~+bJzGVfw@i3<=RPi6P{k$8IALuW*+U@+PYRmvSrHSj z=|gDPPGH#(3Qfi1>4p&%lH!<;C3K|SBzGuA)L$j8rKHTNAc|cHS6+(MpzMi7m})1d zR5X5;$MT|7HGYK|yD-QH#AUO{2m*1dR->uGC~bo5sB1(D^_cb+}t7b@kaz{Dy%D?eE%1e5~Ims`2n!f(3~q(TO1R$XZQQi{e+wOh68R^Zqu z6N(Iz1xnCT!W)nA0u$>vl%WVw<^D^7*mK}TC!n3NOrYwrDu{mCMukpLsSNqlnd8U$ zIBda?ouZ|(H3@IP+?py=Ls;;D)eQxudw!_>+O9#__*|jDU?FnMzrb2lXft6aM&3+i zI2xjY)4D^Em${e?RRTs?v^@*%0UF6lkWj%`X0V_+uzmmwJ6t?eSyKCE8-@qPRmoGN zn~h&+)H`#UT2ukDSE-{6R6Dgr%9z?0g;Bv8fXZARN~k(v$CzymusQ;{n5h%Rk6D$B z1E&!Ol^FddmpQ{}AjdDS$VS~1$_^Vs=29CUoydpzv7odYifv^pA5}DWO9fkm7qZ6A z!?P}3A!4@hip$1QQyEJf3->bFDwOCDY>u&;mzWBa=gI?NKK4b><1k)OuTsf^xd4X% z7%y1=%4&$*$6*qpc3#LE<3F#=P=U=gR;d&>?C$Xi0%(?(g;gVl>#C7Zl$U|=6aA>n z7q&cEHwcI(jC&Ip0I)gA>Noin$eUnFT1ASOcveW}j4!Im6iLC2Wf%bQLp^8u06Y*Y zH=0i~`bt>pJ4(%yc>_Zns*k8hY>uGV_0?Kd?8DN??ciZShgWa zED7@7q|$Zq{uXz0wY@3UFVl5h=A`z`s!Mnut#jtIc!gF8vOZWLhVUUKa zH4N)}bMtga;8kREiWSiU~Sb5N1Rj$Fp#3A4`ft6^PskG2w#7?q2mg{iV zW6?NHryEKDJ+6$?sOEIGzaBI{AXQd($MB2S>>7CGDm3mqP5{T#z}6%?CgCWU?K zf6e(edF{`1N`ac3PWK9cW2=C=+QbqIZNwmq0*v3Kw+x@o` z@W*8NTn2**UEC&rc}}Ca=;Wg~VGgg#5In0<1--0v&SCEQ2#Vm8usT^PPMSPb7n%q2 z`4BpZJhMEEg9R1||A6g=^j|O2g zh;AcMR5%sei%A0#FW1wBh(;cz1@SyisJ@ee0beb~j#r19JAvb+6v3YwK2{2}n?=bX zGq!qHAcU*eEOqPy+HE!1O`;ofaIw4mf<0J=S1jy~nf59uDcF$dY91K=@&yoEJ>4pI zG7^F-V57$uC>(Q;H4td8aCtD_7yg=0xs+|;S?TQpHy6mwndf9E%pL^*bj5!gFu=X zgj)789kvHZV}qiyO%%Ke;g@htpC!%y*yQ?Rlj{q~POejGAd7{hsO$q0_Zpwp5;~AZ z3$l$zcWKd7IqK}es#?74q0|jh+K@M)KtaNT0gOn$u$@MApGp=H)lX$pQDaQqUsO44 zVZ4w>*|XEdj2*WYub|ti>^^%{c$?6&LB*)?NOck4SF!!wctJ0o?Xa;buksZu4ZjoV zd2C8;XlZzAE^>QUqbPfVQL>iP&^HMdDHc!k3_=}p;KWPPiv9*gh!tLLKPn@!!r^kH z`W{`ZFjZb(qmAA{k*UQB7r;#yrNP7sBP%zZkS{1kQ8STSYV3T{MmRkHtq_crt`ZI} zO<=E62_2g*)wAXbG!}i#tO&kI(6zYyD`I6`9qcHjDs!6SDoEI z%jT-93kB)yON-*gSurmrYOmwI%i3*sHE+GRFB zqJ+hfW1#;;UErgM;!i^iC+w_&CkeC)TA&VmZBP-antoW=8oR#|4>cmR+pV5)Fc~mj zwXl>Y==ni)&OzSn$Md6wp=3`Kh7`a^KdZ{AewI&`i$(`W2kbFMwP!+^+b+hXKP6$n z$h2kQgpFGie0YP`?{;w6Kx&XpEgwZ~HGcWih$>aNJW25o*U{Wg|8RPWrV*!4b;BWb zPDIIooKcYRhI|2~993G1rA0JJxb`|#crs0e1cNQ2ql~|@FaiNS*6Im)G21(Wvj@o} zh$YhmagA@+c%imApiLt+Ul)x7B;+#oVG*sp(wm=924KN2C+|;WB zC+`VaPpw4)C4&nS5+_q1t)h=d;+T}ZhQ%flp20zh&m)iy>KAdrF2d5Z0(J?{hS8+A zpJXLoL5H1J=-6adb&O!sGwvHF2Wk!23Z^Yg8<=)5%1_NxHO_DGc-t(wT`GgG4PR%g za#g#kY?$bwJ}B{OT{X2@J8(GN^0}rOFJcO(bN8b`W2VL_HP=4)Cj|sy9m@1AoL8OS zOAx1LXgalr5r1B zt`j5Iaa1APzE$UH>got>*X!0sKtX^5dSrSFqRvMz5m3*>6c%!%h$BF^tJ078vu=JE z6;A#nXm!ZLq(;>zI+k|V3g0x1ddZ63^wmb&z-5Z7fDTn+J`Kw zT7+}r?KtJ#ye+^#s@3oTTjIr6@rIn@zX14=t{Q%T@Ei@#dpTZwHdDhX8BAE6bNCxm z3G5Xt*6m}uKO{%8q7~qJG(^f~_tXcH@-;H#fhc$x(;$JY;n?5FKhVIQ9~>s|L%{Gm2i%{m@+G$7X5p#Z0%2p!V&XtK@J2V4kndRj;~fzch(BD%!y zam!uD?3)|*ba@8G@G#Gud`z(!V{y3F|L}ahjwUD`LMKwOiFOjk9GO^ zV-qi79MK&N^e0tLyoEy#A=o9}i-1bVZTIWs-%L@*NRRjQb1)N-3qf|;v*G)o_ z@?c+sZVY0!qk%=H3l^%Jj6FMXIu!F)e3-c2>5j#aTsF~iV7g(PrQ?@}gH+3~u1BHO zI%%!TN~Rgs@SSbwuxJ|}^7H`t(&|-!bZqeM(FxdXrv9*pLWU?+t(p9=7kZQcI)4_0 z<~OIqJPi{MlL15Xp6)Q+U}*g;!O${o5X^%xBFthL(he`h|EV>fD;<_0z3WA^DJ=PC z!4N%1NA7k5?8MV)m~fp5NLx>RU`k<#58{E$U>I`m3`2Cfzz`jpr;*|i&C4kMB`_48 z4zCEO=>f&vEyMYM7a3a}ErJr#z7RIbf3DI6#{77yzAsV*zPhm;qP= z*c%Y62qwUpfJK0`*_#hY^NuXQI>2)QiN}e6l!tUcl5KZD;$aXV@mT;k8!!Qo_{s(h z0G0q!Ip+e>#5E5PS7QVtU_Ib?zy?4(Q^RC#2K*QBOu#0<(SVl&js(04a0K8&z(T-l z0Mh`k1*E*W9}`8&^AbSH^D02%X%k?3!1n>E91jChp2WvRkz^nN)&gb&N`M7`B$LU2 zHGn=qlFe;^B%5`BRJL0HNk;nssa^_Ch~f}{K7dpo(g9J7LMhb)l5w9WMUiBj1W4sQ4v@;c6p-rMG(eKI50GTs1V}Po0!T7m z0Z1}l57-HCJ0NXT><5JSgl_?9m$=PSqIfZ&1W5Hi8Iama0pMJ~8G!8o=KxZDyA6=q z$XYj53tSCqDW=h9gyn!06=OJqX4N56arG6asb8wHUUzZF9)Qu zT@QE#;BG*w+Xn!z1Uw3O6`;6Y6sg@L0S*8x0HikK2J8>G6!22OwSZRxZUbBdxDSx( z&>_H{fJXtT?n)a(u`ggYpdYXhZ~>qXkm}w7K!AVjj~)udS^!V#)w$e_Oqmj^ai7<( z+W=C+U@8MOUoI-ejYfZaJtok)?Ked&7?ToGs8x58)F|o%^x%7Uz>W5KhX6IH}+d2+J?5lY1R9qkNI1(oc_ENj?{UN)YQu#t)rp*ei88 z)VpgM%~+n+kZ3p$^j8-SlYWSTI;co@OfHxkE>8x)V7;q~-UjnfpF=;ejFlBzI7*5P z{TSb|TOd=TFf0}wyU1$eQe`N>w<8@0ScSKVc~OyiHh1Tm;!J;>u8u=9UVHzT$;vqg zLg$%bI1@i@L2$mvjaFU}#e#D~d7VrJ9Z@rCX z711LDMO7Hs{juXXOco+%K&~@*E$m_@4IIK@H*prWlNwmc3XalXg{$BZSr@S7 zRf)+tvd-r1j5ypd-NqD8-Y_FaxT!UQ?DT$SWE+CJ!d9dg#n)GJ!a+Ug#kw62MrwN! zaA%Cr#vHFxJip}5K3JgEFJ3Rmoz^Z|{gZ1bk4EX}{54t>ht(<6*a*?8adg>-8_mPc65N4N<$Ew_F)oEIK`ltN#$v2e3YXXk zPZD!}bb4M7x^7kid>30zQ|&z{Sysz9U+nr!WSEdgt!GjY-HV+TRB|8y&?1%bsLegT zrX5_qXZP^z;HD3K&;TVAmak^Q zFyg8^wJy2eR^0-Pb(LN>9!@1szWh_VcJvl_z>z{?y()Kz4SozwTC<}4ES84yexg!5 ztFZrO=&Ricr$99CGr~asg8j&?&oh{h%4Psy0!)%@k^$3UvSCKSjDyL8DS)B4`X9|< zX#Qu1@mInQV~6o4!VY7H@h4WoUI}}puoN_Ilg)C#6)>x1vkq`Q%qEy^Fgs!P!5oCq zr%Cp(bOj`cUxN(oGV}{boVjyomvM6EF({5^Cx6Ag;FWlB%s4zVj&q6^-FWi>_wk3y zck)-k@85$3aXj`#|DA&Gu#6SN3Y=@O#4xX>xirmJX)a3hO`0>(e31gsT$|>zG*_kh z=m410V8VV|^58Yk${O-0{ll|= z)1YZi1rN*JEKclw*LwX<<{IG^5!PBu{g4kwkyf;2sw?yZlg)Zm;2KlD*B{|$#3ng= zOOi*%UnAb+bVh_yJUKs_C(%^=!qU}wM9@=x^4+08Z7Dyntbhcaxoi|yx(9&@qL7~~ zRMa{>3ZrFAtwIfj^{+E%JKUWWTD>TJ$ z#^DKOrt{pvEgw@gXkD>c9_F&Sjr@y}T45vqF~X=cEbO$C3ab?THcnv-0g6HniWH#( ztko-=&9Uz&O_J|Es(~u(vz*2lzT}4r9m`v=xSdX4l&{gE5ZBVTlvNaJW2u4Pj+7lu zbE;5&%F`uQf8+7I@!cCJ00f-P#%-P-1eFy>Z8stvfe3PMx1A1 zBi_P3RV5c6$`?7sC!eTCik%2}9T?j0x3X<`Xz1Uk%hI`~Wt8!o% zqGKqAHAk>uztJNo(1BS{Bd{XuK$9znimMf2op9wafU%Z`u7Ilp?i|u+tod1SKQqMQ z5cKPO@`1VF!=XaU0-8a%a!4__PmByiIOhlx5T7{bFa*rca+D9QDp_g-{oqCMDPlIt zE4fsG-yFe!U0lBkU6@gDe=ZxI>j|L2QzA%mAr}hCA%!)-rACDzrf9!*B0MQ zTMC_(N70VE0=C0h`@47t?@{PHC`1Rm8ZR!zoK1=I5W@MP7jfS(e2)$9<;}bhcYmuf z|I~edZ3*HWL?5BVffAW`2=luBA;fbE;-oo(xD9c0%LOqL_k%a$8*y<+y8!owAq+Kb z;^8Q0Jqld`g_b)<5C>!4**%DKF=uRtcc~U*{un|(G&)}po8bQv=9kOy&eYA|OUVbp z+SlU6PP#X#$Zb2^UcsGZg+93@zaB3Rg3gED?Z}();yTP#6}QhTIPIkf`#tzj+;@(} zx7#K{w&*`!z_&euW8%k#dmc){D8FnKw2xn$1#*kXOgS@+k~)lF&9_T z$${)0xTjrsHX~F1Sjvn`Ud$? zX#d^#eNc{HqyC?4{A&^43t1@f&5+-2$l+zQnIYwZcq{z=K$|#>@1rPu2a)GvK`qX8 z_&(VRw1+7nLA>6A@`3CQ!u*Qy^G48ke7GPkff<4_S7;D?A9S|rc*j|i`0qMFe0q=| zjw}`fE*-wnUkXse1} z9P+&$d8W9d-ia4;FVOrhhHM^(tagKkiKr*DAg6rvKjUUWZjk-g=~|i;Kl|-?F;PeR z@5Voh_)ntED!l#O`0m|!`wsn_68~W%*5KfI{3w(S`h%tDZhhd{ zdO>;VCkzynmFd7re7Hy&SRmm8Mn&|;A`P5Ef$$qxCk-cG{9)6U979o#y)LJ;D91-f zb;3ZiK9-N11eucF&Zsg!Mv4(-^t5@|P#%6*a$z-Wk?zOAPht+p)6&swF^vIJvFk1YR!=9u;MBku<*@ZDE4Q)c0s)ZTwZoGH}+Po6x zeDupZ<$Ajie*4fDD1Mh_;yn)(YD`4pLNWOegN(IrFcR7 z9%e84goO!OniT(A(9QwRCmVm=d+}mE+TO{=m%x8#eCJn*pInJC9&P(l^lhuq?;nKU zUW~`zoTc%7E#jo3pH<@Ql4a3vAaC7T9gM2;lx1B#<}0R}TGz~3?mCaxH`^ZwhUy#U zG|~|^e*JpHpK*HU(@yKuiG3PL{&Z2;XOVb7^{>c*Ri$7zm(%i|`RDwS?9*_Ho-***fz!0_r z^=1a*-8oLvcR1Z^%K3h<2)qs4djV4T0f4mqkO0^UFiD2VvU|FW zXUlMT6%RKGIO$Xr$nKkP22XSfWxP~|1K!~7R^a46S%%X9X-{{Cj5}mlD?>LR@#B;6 zpp4Iv@wqbIB;yNYxKM`I%Kl4axKxI>$#A(0SIBUc3|9jZUu$K!PIiAnhU;ax5s=Dj zn+$gYl05eVl3cz8><-xBU5>?$mxj;{O0(TflE+cj0|bFA0$9PdXs+KMwE=Kr0}n69gpw zZUY<$xDAl@+Yih5fIXr}Cj*lKDf}Ej32+5qf57d4q)Q`wz;$QR0ZG?pG9cCCT0qjl zX#%ABsnp9QvioX43cnqY)qq0Xrc!dQq7?crf7AxZ$M7`RntF3uwCiYFwwi z(nT}^4X)~-ErrqJ_Ecua%!o9?gSe9)!5w`Q~90Md=mb;&28iZ3yam%SPQ1RS4| z`afBP(J*7iU|v0n>+_9cboAF6j$=ZB6tUldJGgJ7Qva}msp`f7F)Z7|}_ zsIS!7Nl4@hcREe< z4EbZ)Of;m#9u)#~ln1|XfUZPmA3VcNStYRXY;e_ef6**An)G z8FW#IG!xY9(wF2k!OjRd=x7{!ulQ~tFG^vCsX&;4XPL}Y#=QJ>wIcs{p6i;DJ`~bcE8Gc_RKqHj z>BKRj<<=5`g!dysb{-qiov3}I)W5$35o&l9F6A|72dGLPI%+iajHp{y^jA`zs%)pU z7AcpyBqO`EqxsUStZca9adlw~^hF6dvK*}diehxW(AW%l0k^yOg)gauf7h2z#qpy5DG9#7;;>qXzL#eB# z&@&<(;5HbE%>WBLP&6?FVZVXyYGLeH{#5(0VZ(%h&;ioYW+_B)rb~}qii+f1=a0uL zYQ2uA0CdGszN#tId-)AmElo8!#^1cbl7P>PqOL-?)XzHSkjk)zGYmK`FXM2>>sRow zu}jywYn^WBHz`G-<(1t)LHnbpSV?UQ=Rsk;TSPp@gCf@E;>J#r<%@KakQ%cq!w4Zb z#;QkkU=@UPtC)@|!{8UHgpv?PrUq-F?lT=V2zvK(=A zE5MtkkVF*ZhANBC9waDIfRPm(0gGlge71A=G9FS+4^Fm_U+aCjjEOta_% zL*#CwyZG5MOvxlC?v_TgI@zwy>ku|26`{eatSm*WlB}|ATt$QIDVZE0ds-^DHxMF+ zv4{BWf10pT3rQdc%+2VB$89syCH37{=B7y+Y0+p5R|&6CFk!NvZ?xWrZ<6=K{`nZbui%6G zo7mer2l!0v&HpZ+Q*DR)oj6w-+fNYtOvblKum?qS686T6Mc7ln1$#I1us88)DtBK1 z_f}Rx+=BgeC+Pfuy;=(2k{_+d*$)==!_8#JKb?c-#cdQt{fu;^CvZ-(8IS)Tofr>) z_YdCdl_-vNzot7!cFIv3*`4+z=tu6f&W`+b_*4{2VQzyVKRb3jUBXc8dIs>f0d@~y z6^;}AI7J~rn2s<+wlhoz8Il{}v`0pMv#%a zH_CV^AjK(@-AN&e!jm2n(WmnfN}D=oa<7AtV0HHgp!aWT`eC>cC|My_Xe+mS6K432hh2-$U3pftS4XhVT22XZ0QP^_@0qIM`nE{I&UwnVmOQr}iB&taU5X zg#(Z5nmuX4OPfD{P{iwpt?poa?7_Kb^;Kd@)CIO;k7PoLiq z>@j82>Gz-Wt$WY;;@e+ho!7o5b`FhkrM?wCeWRuik&=R}&T| z4C~O->oK3@=}poempW+NLv2d^=l=H2TT6#L`^MDjTZWCiXYahr6XZ&4KuHuB+KRN$R^aXHjOyWgT3;=bm@gOW$l6wCv7M(qCI`3Z8wfF#XWF&?|c%=)Pgkryu*fI14XGXgG8K zFLf{7V4V2ot2YlWU-Rj^gTGk4{QgHrBc3pB!p?6GA6j_cr7zcYn(S@!f^qZop+^cj z#DCXk%8K6;4jq1D?0v&}ubBPr#;fvN^Wr?eiFZyqt1-0ddO`T)u??d_3opOv%&~9G z%6a1IkFL6_L%yk~w)6da|GeR*0Uvk!wl;Zi-V?WfXSnRC&9AkZ{KLfBJ@*W(pLgBt zV$>kVA79MB@W(C>RVeQ3J+tEAwl}{l-}L(@kLAUEzwTesfWSciTbKQ|{=ma+d$b={Ir8F?>8p06 z89ptktLxJ5$FxbGPwMvKz+2z@CSk!hx4hjj(tPg2L;H@GvLCwTtsTE#v-gdUim%*M zTfTC->#?gxbsaFktbYB1 zfxYSvo!)Wb>R*Fm-<+fI1)o2(xN3^{w%R}uizTk$h z#t&`y&2z_><4!ws%aI#9i-&AK#=AEU%w6=`t9RaTTHukn$J$;o)VR(SN*tQBpyGb< z`@TDcaTjm>ymI})nG4?+KfmpbZ7-K!EtWquW#{ha|CpR|`TEwqO@*yTyjs+It?+W+ zPd61du55aB$u=1%Cewx zBMzoztZ2LXstqZ>7`ycCx7T>#`?vgj_L_TokFCWpBRKw=_x$iSuU@e3KRlz#o5yB%`Q`B&r0!XB-ugKAtrtJ) zKc+{;$B$fN`~2sIMX!B%@6@v4tw)!9nM-3NPCE~mbu>-?B=?DjhowJ$ulL?J#(FMJ zc;eTF7cbbkZCB0yBdZ^-8Tsl%k5Ag>KJCssZx&uGm^%8J=O-M_+*4L`aPRDw`}O&) z<7K7^Gv9yky}5;-bXb1hvXHQF)PbHvTNroaZt;gU&-)#{I=`5C)gNo-bRY7_#G@l_ z{bpc~?zi?*$gYy0Wk z|J+)(#lE@n!S_G7>Z7mI*4t|jEq(5e?cHX+^Wt?wS%ne19n8G=mAi(VdAQS9^G|Qy ze_zAB=RLpb@~QW1AMO`3F3r31`SsmiT3wu4`07JxcWr#;ueJ55{R)SrzR_*W6F2M?y>PPY~JpbJt`&ym<*N6E#t{c#8@I$-Kd%E|tZMGzC zZ};?T-#j{g-vu4-e67{Kmlsd`BBg24=EbWg4^PiMx6PvNpTF=|x1-0}c4@4t`7`sK z>iW`8HdN9i(!Q?dtWI&eHht1|=g2_Uy<>;neeb7tK4$-PU)A{=+YDN|>>Z!|mVuwW zv>|j__kKy|^qn!Y+xmM(?z%cK?}r&5zxUcJi66V#WnHy?z<=7^RQ-*|+}peNx|>3m z2QSLJ!}D^=(@Qd6&P~|1xbfiuAJHM4;4r*+$HI4RPcrT~>&vElhK>GZ*62p_<;DlT zY@G1LpZ)Lfy}SSWH(zV}-m2@Ka|@2o9^Y4dpQpp>m3Nu04{ozAK3efgaQp7f>vKI- zdn&e1eKO;#zq+~Y6SthT_nDiYytDX+m8D<)wr}>ORqYe+9{$mt{V6@@S3Gyos7YB3 zpJm_s`sk9oc3qZq*RQLBTYuYp>z93IW*@MvUB2k2_P>9-@SU|UUN~mQ_D8PpjqQ8q z+jT<^cJ4K=r+2CAqEC_*I|@duyg7b>B0p>@YGLhDWiLYq!yLYvd33vD{PgtnbSLfg|X7uue&L}=UPZlPV5hlO_H^Fq7$ zH-+}``-S#he-zqxYa7?0Td%kdJ%+}0IMW!{@ysc49eeuXI`&!^*QwWvxK6z{#C1CB z?YK^7e;0S!*&SP*)@NX=)A;oHIFhFE!U1y-GZcDsVa1hk!noWnLenj`VZQWpTj8}k zM(U&2v6Z`i^*jx$Z9g=p1Hv?{0Jwb`3snUdWrfe(ZOonYuIcWW9jgT!)6Ay$Ug*&c z3;U*!K3y9^Dl|x!TZxeaU8-u(@q${AQLjNrA8^`X2*O^^(&75^q=OZJn*;tK>^Hc< zN%KGA^mrlvyZmT5XpWnH;5ZgH=Hh(pdsgH7Nc{T*bR0wqfyIVm!DIIbX6UWw11D)z z0}^h=Jpx*HlbZ`NV&S2qRtz^P6%U{V1ZW){01<+C+I@)2;}~K=C<@8^@}H6$mtDRR_`Hv&A35z|s~Y~V%M+b?|2IZn zT7B0Fjlan7k?BS97nvVLZainuLy_gD;EEg-T#=`OD{@tEf_nKV^49z7^B*aXX38b3 zJRzEMNs&$*T?b>(f*y*&+r=QV9jPKg5dyg}F_Ue7s*?rDA zx3AQ%|9Jxj4jP;=p~Hr2IY4z-&KLUZG$VguJVqE;ogN-V9SX zuC`aQxOH9!EgJ>5gE)Y`N)`98)i(OPpi+$h;a1@mo&7r4=}ek_i*GvcKjqt|bO zey04$3X97AOnR=fNS5U?d=K|22jTA4Ex>Pw+1vx~Jfz@`st@;4p$|i0-+_B?yxD#s z?ut&u9oEfhxTB0P&*FaYOS-#bRnK$U$7I_30k4L+7N#2JN*JPd{NJHVx&NVKTDbkP zo1{5uwkB?ELYO8w&L-G5$#&+;!o2pQc{a=s$xvZhL@4+ zSac5C+Qf_9+s2F2U{=5!fvIg5FK&V9+&*5k!mNNf2$S3)UR(lm1g5kj?sda#gV_&r z2qv#nbo&g~3yIcWp|=ufUyJsj>Hz;IIxPP!T^OQ6J6sAcqzOaqU;jH%zG!EyitV7e zgo{}oU2q}Y9j>E8G*k2hW&6p~rI!~1NP{>hiRx2IZYCw}bfWa=RSC)oy^ulshqb_+ z$d3b_o|U+C3nr2)QM>Enohf| z3LTPCWX?`3qd83Kyp0eg&P_C>=J}!Yl^%2`$`<>?f^a71NWldRO0WP z7VzH^x_XIF-Q+vt`c~U~8FKkJ*p4}A>(RSz%1^)JuXm>$>0f?pzWm6QZajMtmR^h- z3Q3bpo9ivLG?lcKvR2X!PlJaFmkW0j0Sta8JqBj*{U7$;1g@v;|Nq?xMQAb)MVX5t z^QYFQgb;-?4@u@Cgb;lY$9ysz^N^Wy%*X7b{V`7=gp6g*oC+DculHVS*GGJR-+O=e zd++`K?*FVFtLJ*JdD?5Qz1H6AGkBB-e#2LBD1`syM(S7RRw*xQaA&Cn-jC%6jL{4G z_`NT2j#WOmt8o~gb(hCJ=iIwI_Ba|V_YAx|ZaDHR*Nx^#G}k4CKpx8P4Rygve9pW( zHy?2K!n@!&jt*z$ihR;MTg@ljTMVN!ErYvuqMuJ_i6240*FDNSkK(7fvr$?;_*jmo z=QliTbQt;Ib0DMmc%>Mf??v-)qd3%)=#&goqUw*#(7X=$`9F1b8>MTMCLQedLm7?R z3vmXF>Oaz}|A4+Y7d_{jt*8^&K@-_@g)Q zRDZeWy#4F*3yt&JdKB7vaPUtVHTIMD%ru%StLgbPZ|&tj{Kw!wgjISi)c}0KFJ;-d zPf*D4{y!9ry!_A?+VOL!J%>kl{1VmPylWhfRD!1vmKRaly^uy!ovLM zDARFhIMG@Bm0z1sx=K6cgAneUzjJErpPx{dla>;KKJWQg{yPmCKGutVD}z1?@*3QC z;4mEeEY88CFjmmU@$<_JpSrahj_=HPtaxt8sr#I>8PT!(4Q++*9sAo?@q*i++scj{gpSVP@+!?s%ub?=SrY5$Fakv;9hk-2|uXJ=a_x zoc3>)M|mcG@xQADpG)s&#ViKFJma911(~CTxs)}|f>O7Y5QO&(g%N}xZE74cae<;b~sz)@!MS4_4ND6z8%7}hpj(CbyW66bK`3-1>m%f z7O-!voPx`v;UZyt%3H2 z_JuCzSY6hxq*x<(xyTUGYN>l{9k>IfSGhaYzpQghPxMM#mfCC_@QH7)m&~5M$Fw zaGZpb3ZX+JoKJ{zX~QHOM=0SKLJ6l2O5*54B^~wXLlTse4?*SJLy%58BzrpSkjT$E zq;qb?L5Hvt#~hL~#h-Jsq46n)9__F`2i>k+-QeK59uTiZ!kxnwxUPPdMaeeyX8rPp24i#m_C|W`0_sYNk15?x}^wXDE`7A5Tx@ zVSYY2k=ygr6LU{ZXcJ{_ z%pLfNhN^!$(~v8Ef+08a6AQVSpHj%p{9HnA{_#{sZpZVLdmIsY7F7N4z+!nvfqdb}Ye6}K;s6>iR zQzF$4e|6FJ!T3KerzYv$CjRFr*(rX=pPgbyHssUTH`bo<*A!1GbW#(o6sW2{dX^LJ z2Axz3DIeAY3*#PdD={fb%9gV8Wf#aUoLwT@Hk)N*T`O1RgAwnBDeH&a_WxQ~3PW-H ztkg9))g>z@UG6`xd#?O*e6%iStY~d6SLKs_bpJU#`OS@=hx~W>iJ?ykjg&U$eHvKS zH*$bc*W^c;r2jJf&)%haS|dvjBXb_(5B}ixQ@OI$0CWygcJ|vJ>MD1JsQQw0IVKdu zLYalJ`9m6?BaSY(N2VnTd$c;f8<28n9jLtOp z3+3M(djkDNNdf*XooMz!bZO|LOjQEfw{Gt1)dE*wKc#mEU{q|0o~`&3W*4a;=1_cQ z6M(r9&3$}vC2|`|q%loz6!P+y5Wf$g&UkabcjNBaQ7T;q&UzM=6u{(IlbfbPx3RJ9 z4-fxq&r~+=)RgR_@+J1R$>;Cly{;?@gG97=uS)*0KdbGLv-Yf`++Zh0v`dO;5A{}` zCG5Gc|Hgk^&K0f8&c3_(=Amf=M(i%8|kz{rW%O^UEraIcWv#i9y$ZCci^)4{^es z%ufUyuY8f&9KDIFp}6NeNo|$y0?CHE`zzlCl1%M=(gEM}g7F|d(sh?Yedf3~5@nA{tE?5eD1(pH7f@MMT8t4yT1+YBm2vz_!U`5aetOWK1ZNU)G z4vYjVgLA+t;7ZUQ+y**;dax=O4^{*3g4MxSU`_BVSPL|-iT(gq03AU`&w;au zdf*_?6^sBIfHS~`;8L&=xCLws9t4|!XThdm64(q(1>M0ckb$PP&~Lyppa)n3Yz{UC zy+D7k1sDvr1jE5rU^LhoTm-fOH-K%yy`T?x5^N79g1+Em&=1T6JAx*)(VsvYunXt_ zb_ZR-{-75)6!Zr}z+iAP7!Kyc01^$FfHbDz16yekWHWFBSOnY)V!V}3f;8YHg4W<; z&<4x|OMxbiXm`*CtOz=Tj-VE72KEHq!4R-H7zqvqmxB2)P;CKCz=L36@GNKsCV@r3 zRL~sE0?UD>PKXzD0EdFEU_K0JUZ4r+4;BW4K{GHMECNP@wBx%7EC+4?n}K^l+_)r8<-CR zr5-c`3ad!=!@5(>Lvh zlTzn2-r}i{&!};I33uA-B1Jo1oP3po_Ml18{yZm-e~|F6u5{2hAEanck`&FUNYUJh z)G!h6Fd>HtnSR-T6zzC(@|6?X^CmS4F>sC$9HWqS#YxfEHKb@il+<99h}38ij(#zL z)To?t@$^EJU(UsNCej}u@;gS9bC7s0?~9rv)nBaWgo=3kDqpBj`FJ^L_nOoo5uWx^ zNevbLhl=<{Vdt0BXc2F?NIy)(Gf<>MJE5fLtpZX*#i~;67vlY#CNKwCW!gChQ zl}J(lA-M$?A<@ohtDHGA^&clZz0q8Y)Bq*@mO1X!pPb-|p+r&Cubi;H5g=shU*xXl zhx!@G{=%L5mlI~}YWQKe0!XI08!75>t zAJsqgOR7J${G;&8%}%IIHU3ekZE{!ZgZirza*H8TQPgiqR^y}oOZijdqkc@~!%(Xz z>d&;MliOZYU!FO80Mx%JJ+*%6eH3axHGS&uPRJe2T}e^DCt0mO>i?9Unjg9joZwr1 z2BPbM%Ewo*=pBmjirgLleISL4en@fCwPM_N=$dgtNVRO_*9kpIElY$_H@Wh7C48<- z*P5|^y5^{Fsb%ADjXNQmdfrp}I$gUY ztJely!z8Qe)3r=(^Q*d`>)W^=1u13E%^O|!#(Aad-&m$`;76HXCu-SfTrhSIRr*10 z{4`z|yN}8fAB`W>HfntRl(M!$&*F;472~#~@tkT$O@WUw)bqM20r)sWG4h@^0_CCF z@f5AY-$==ATlz+m+Cr^sJ}$MEI*9c7xY9i5y5Vb^x%s2}6Q$Nw_~+w_XHMJjaUwT7 zA189%hbiSZ9w(^1{EYev)n6yr{M^s^HJ&@B8DA64m9aNO+w2jk<%afz1=(K`r>s)`-)ugI`haG%XppTj_th8n&(`Pqm(|w%bYha zyd1e@R`aIrRr0*~qa*T}t^ zdHP;C{fVbf`=(r}>F17row#d3tSf%F6xw=kzJ=pLWo>;{JV%@-Js{^A;qiIq3GbK3y+ckv;rUTVRH_e(uT##woy*=veSzF*ZJaCa z?w3>k+-CzmVo={8MQd1eA8-U6!Ie!cEoc@_Yn_0!4RR8w2XBM%;BN3P7z@4ve+R#U zmqGKUmKN8+3gA`H5!?!Dz(b%9coOUh-UUNITDyw`i6J72sKL zC`fCNmBGi5`+>A3n-9!{O!Fy|W|kHcK^yP@NNcsUcIyn8`Vg(vnt)o!bkFw#e*;9nrE4bq&)0C_fOf_xSR6Cl&tqd8<# zFa`2@Fb%v2N*YUxZGZ)M4zvRofX?7yPz#;{{lL9oAb0}|0~0_UNOP|k&;Z7Q*FYPj zX9n(qd<8Us_rL`3CYS=A2h+fPpyXz0aSX5k6G1z01LzEH2en`_=m#zY1Hlw93_Jqr zz)N5Z_yCLr?|{3&`=9~51tx%}L0UVu2U8&T2P>fdXw5hcatKIk$h5XBx#PVFpaSF~ zpao%!dL0q3Ik*cl&7-{FUKcb#4hQGJy$qNDc_)|x(tO7i_Qk+7$iARC!qosJW@#}5 zI0<)K&;oK_Py@L*Xa^ZfEy~(|3D6nxAD|ZO0Q$fmU7&uDX^eA4yiQ;sWV*8bA-jNK zkR!mAkeh-!$WzE2;VnU0+h$-4>}P_pU?;FA?CXKMAddqx;lCHx^nKrsvS0oOJlQpSoI1?lhOB?}NDF&pSbgg}#LOF)qGFNV7?xZ=+RK{@&5vbtif`tO&Mf9{@J9xe~g$sd=8l|abAKL9lIj{SV;pyunWB>HE(T{R&{wTeH zIqk>uGbpF;a5*&RHz&DF=QtV1r>=af&oN;}^-1yPzIVvOhvoELF4HQEaeSlmxQ{W4 zkJfhj8_BfRMzL_k*FXp7)F)rFR(C#V&6?JT)s=pA4O`t|Q03hI!=LAK`!kp6znUIB zM~39|NA4b)Q{Q~;EjNFBZ7}!Rh2zPh)qApRQf5_}YoOvqF0nRDN{_hh(~5 z>8p6I_!_jjqe6Qt)E??i58vyd>s`HG`C6O01EjuJGXyQj6<@awY5>G|9=&ZyXC!~^7UjjH>HgfwD-;+{zRLPzCPj372 zJt+L9iAbOCS%u}?&v|d+|MS+Dv0L79^S!1q$PHI~KPWd}e0_?>89q|y%KXYwWi>pP z2j%38%k)JjS6m*IGj4D>Jmp z?^76=bw=hb!t4P*Ct;=?OHY`Sgne_E(_rq7)j)5UzY23}m`&TzdKllquK=^^$IHk* zT-cNUSYhuEa{|n2TA47b`K-{En<+nyh1mz@p2AG|i4bPW=LTV>_zl9`2If>@?hdnw z50A4G%#DSa@(>}+tzcdx%v4vqjLh*c)2=Y3l_t!ThcfNBJ>|_ym?{2Xm}%FU@;^tI z$-iEh$$zRalYi6pJa3eLN0?~`ne6>wrnU5rFb^^^#|Sf;TGGQzJ3~s|V5S`u3R}UK zo5|iwm?_;s!t4ukj4)H)48pAR8$TYF`c@5LZUJ*wVWzr@7G~-X+l09t%!$HGdCL-J zDwjhC9w*g_w=h$?gb6d1F-DlF{td$14dzr~ru7e-j8SC&^dxDwjnaWGg;naU9 zZ$7YB`;xzr8BYJpDykP!fygg?B|&mH%(SaWbu$BIy3VLxmn!D&%G&)FBR_g0a|+CK zZBct>!c04HR5#|G$iBO>4^YF%>m{`hx0Bb9qKol7t*C(ksS3PIe)wmdg2dw;Z}Su=eHHW2q1PBjC0{n6|t6f*%TE8W@qBNxW%SNtRDZ`|ZYy(mb@wQ=kI91lIMsj1|Rhu%S>86)qHR9dd``pbPH_&I($-Gyp# zkYtCL=m{-vY(IygcA;4pJvmYP(6?K5h=aZ&>x;Hk=OOa8I;b@eNM!_b$weeQD-1>mCvoi#(N1bpP8SZRb9 zk6fxb&50ZadJ3UhSIbIQ9n}p#>x53%&Q*E+Qhq5;n!Ep3{`i>naoTuuYX#}qGx_8A@AK3u0Kl6&r>H`W0f~NKWB%oU~0!)^|QYa z$quziZAT}#|2zNGLbU2h*ARsnN{3y7NZll=ENbRXx{+&a_um z-ni8Iq7->vRi8ii8Qz2VIIH@~8z1?}jZ0nO{#9HwHmIu!zjCLZ%}>);dw}s+nm1jl zGk!hfey>b<%6=dDZ(Rt<2gf`J%k5rKGWlRweS5g6wnKkJc6F`cvDF-d`QA zTs?eu;NRVMjom5dy!51yXgylYCGy5RDV+CtT&O=~9k8@UD;_&pPJpxn^_oa^{8cRg<}?lSu&+b9}!;U*_a0^=wSC zq3 z(DVyqp?Si?St$O+r_S(}ULBC6DV#blPD5c~AOA*i*UlI0!YNhaG(35&xa)Rs8paBG z2%2+hlU^zQ3>ySTaOxPRRGd?L?0i3 z>>W6z0)h{p@^T&H)UFlsWKJoF)8Hv&2jO0jQ~Qknu7&QL_U=Gx8l?}3E4*Q%OhSN4>@(`guI(mS|;Sl!hNu? z?mr|!c;9&ZY#bY5_;uwTt-m?7j*g1rS>3%YU|Y=vBuQ~LNoiC=moc$rgs zgwwED$cu#gWWiyAJ%qbAr=fw6?S;FgU^f5WS$fT>y~C+HC+rUjd6RJeLoix!lwc62 zt^=p!A!KLaZYS(51o5_y7zqA1z}3E)-=?#VA8xh$x?1CgudH0EK3&Z2*mMpq&RRfT zuq3G5T6Uvh;?155+CjFB&39xI3%k=Ky!SHr*Y)i8cl&M3?8f<{3nsULTwgc)#V+=w zeBDJ$O1FpqtwCv9|7Kp@OV)X7=?po`cToTRY$w|~H$9r70SQY@>KH%kn1=7{q8a5 z6CV24oNn;1-C2En?GtQwmHyw>{#6+9hx>FMbCQMqzQSS63FJR8CfM6>iVbSmXHw#+ z8jvI2ZYX?)Wj(Ff?ZtFoq<7+TH=na?Y@6L3uJvq=__qxSn0Jm@yy<*pMg>{0CsIOgpyrK&wve2(z+OA#E(oISzvo>*gBHI|Be^jH3R9}`4dpKQZZQW;- z2%g#$<)1R}k$jzXpZLP9=jhguM=hGv;RZW7uxXVVv(TOvZx>X5c!M>GnN-}t*9GOf z5|uRKCc882n#;~vRo$epnnPzxNo>rm^K%XsEQR{m*tO}rB$hm)PM7Q@cF6DG)mO^j zVgpZqc)&QK<~rUQ-4*Q-cy3CWj59{y1lK$hTy+YVhR1Zf*wON3$I@sI-R^3p z`5v&YR}0TNw;uJI+U8!o_5nL~byC^e=WX32?{K$%x(Cc-d`jWc0ae_jrSpb)$`4pT zpMoLTLmIhBv48h^`|SZ6k(6)ReNXf+3%j#}G!NPMjWy?onh)Mw%1X~dE>0d%Wui=zqv^_hZR36 z*(G;rQu&q~#mXColyQf<$*d|{ljNyMb1&QJTOY;3yFAP}NnTvgdswxzEsjbtQ3abG zyeYS6V0(Gx79}?x3JKA0i z&1j79%_|2^O_W{6)mz?eWr|+X7Mpd*B2lhol3GJEq$Klrq?-)xEU?ee|WVDJ@rL-btN(;X@!eb&_MOM<+yxtX+WTW!RDdrsFm3G&+H2w%rD z%@ICxPL+xYvd0tavm*ybTH!6xu-6@7B4qByWsJ~_XUqiDLpFo{CYudyw9_EOmua~Q@_MkyC5GJ zZ2Np!k2Z+^NcY#i=VjZ|LAqf}kYAnG!xj_I$@wn^4D43{^&jhPwteeaIiP!b@Zp(0 z$X}HWcGu6yZW~P#yoR7WQq-~iCTHX~H#&#vnxcKQ`&S0mKP^`{HmP*gclF^uG<$o$ zQ}T%_iwZX~ZHNAmJ!Rt`C*{o5Vb%+eqJPBJth)d73Av}dc*?G;p2*+TArYUB%k~Yu zkI(4P?5GqNojdzFDxyG)|r#b^Yti0F+1S`s8qgUS4wSw*nO#pucH9e4hR4 zu0e^nfXT52U@C*OcwBIkEcdu07 z>Ypxfe{r?d>Ams+-=3Byo4-VVTDPdS=ihRfM+2L-E|2nPyI&ry-z_hhy4rfrMC3UWrv%QcLr3T_MCF;Tf}C$ zUZ7T;b{uUTf0IW&DbdxnHPVwJLQk5F zl^vd6?0mQ%)$c#*e_jpn=TU7of9}+N7yKspRq%`8XTeW`S%M!0KM1}T%oNNJOc#77 zm?rpE@QvVW!B>JW1z!k07fcm=CiqnFiQr?wM}iLp9|)!hCJWvdyeD{9@Q&bZ!CQh! zf;R5blh;<1;t)L`mC@$OuwStnMp_p(N)Cx+126N#qs1=k14Ml~!pjJ>4G!zl;f?7dI z&|oIq1+{{bputqQ3u*-=K|^8TE~pih1Pz6RyP#H35;PPP?t)rDNzh;-+y%9QlAxi0 za2M1HN`i*`!d*}+C)Zc7}NhZdLGq9*7U2)0{S|CFf*&{ zhU!SEUEh^e%&eC(r-K<}L*SY?#u_y<@1j44`L`6fzR|`OZ2HdXeWj|Hze|P-?S{5x zH)^fc+XmrzL2@p2ZmA!uWxCz*)p$HVNfyERBRjFUwp;zHC*yey4=^43bY`z?f|kro z!+cx{>wVa>8=IB*`Fm!IYLE@ZnpEq_qB4_zyU@M~xu;w*>%)?_w+O1&%L8)O%cCCx zSp};D*9X|QhMe+w&7dIWTQ8=xcVKE2KV=cyzAS6b%WXc3N9mK3sQb#=Ox<= zWzo9z(U;acK{gz)`YnX%AAgFU(F4zqQo^_npF)}Y?n;qe8dLseTwgJCI6LlcHR9eL zJYPtOPqK!EvGI2KLMIfX^uu@5tTBRFggUPGqTF8B1Wv1~-) z=DL|DDEy4?e*GhuvsKY*cNXAzNb0)xSfz37RQ`P@8%rf2+h`gmjboKd*O=gT(HpYe z;=S|7v%|rTt!$5ZLQXv1uEGMX7%juebY(j*abhxpP&I z+K|8QomXcvi?FRds?l+(-^TXCXHRCw`d@pyY5>V;ksVVfv$h3C-9I>!WdGxhTTEdq z-7IVlea8BQ6q8YT-4r(KeNEFP$*myYuqd8Ah1s_(p7dKW>Mxzked{rmMLk%O*xdR9 z)(4teygfLT4gJ*lZRSVH&;ImBC8OEr^wL?^yHWjR9lJ9!n%RtypSf12=hZrsZd{IL zYhPA!i|K^tO=(8;M8|2Y(c!EuU1RMbyT&EXoW`1;zdQ8RadHpxOnN$volM`>qGA}; zhv(k=&8M^Kf7Od9JJbzwew)73msYmA z++mE|-(hyh=kheaO__J~{b)I1-0H;Nzj{NSGca-4XgPAu!87ZtwuZduN}}6nIc^Ut zP^e{F$Z7G{9)!!Cs&5=&R@sjHce^qzT(K3;8XYP*N}jX0VZrsITR^U{eCMH&^5`*j zDm`f72swQ2hF&A(r#`b!jG62US#P;C-$;4=+2uEjhLwYyT5ZXHF5>x1TDoKDl@K|){oa@9Vf1|AS1qt?h`ivV&hq#&JWoogaSnZl%3J@QvAO*& zOUR8Qo^BZ;@99z8q?i+)ucXEuH>M4i$IaR?>CZ}3zh`~=HXbbZ`2E(l@h$23BVk}U z-5`0WCgYm6F|~*H`h+tB<%x}^-d^ykDrD2_sU-%=p#u|Ls{KXJm(m2+E(7H6tM<3H z{zlJFWlBF>-Cv$~$allxEgp~?Uz_tZSkCCvQ$J@)JIH=JUF!tPrB3|4rCdX5FYRBq zM)#AK-8cDI?>Y5{tkV;Y2FZ{1`5*6c6whx`VE*z2gXEMti$-QlECso1uLC}P<%&4`sZlMPwcuN zxug87RAgvsQ>sscwsZRqGK*|=JT92pGqBN&!@hFky_Z~*GN?Ut1G*;p$m_<>N%Cw& z?HgOX;)m99m}`})vp-S)53GB`x|Mvb>H8ulx={RqXQ#S&$#oAEw4Pg;+_kr=`g+KR z4tbj9F^ z@}*66d0OL+_mUP-d8B4#OO}?u*P30g*R|3l|D*nA)c~CjO!HAg3r?+<_?`CVoH`F7 zYlZC2sdeKtG!t@DAvfmKHR6;S3fWc2^@Z%hsdeTw)Dg0ikZW`5YH><6gSlA0{{}A?zI1LMhyP$S~aGx*SV}!e)?ss87PuL4;=WnH4kguS4)FPC+J z!o81h7u5C^?!AP)pth&5@4;#4F5CsR-GqBr;oe2K3+g%x`v74tsP*Tvu9I-@DBK0L z9fZA~uou+&a#`12xVIDTf?6Np-d4D`;nWK1S_^w`PDxO`|NqaLwfvJ?wFV40CB(hk z^A%EB6=87M)gi!}yESEKaep;*Ml`mf8o>WkJ=3d}iwLKL+ z(Rz;*QCNE6UZ>f~Rdbfm`ibOiCcSp=Fz)%0(K~3pOiC-Fd+T0sWxutDCOeTlr;zrY zd&lT|Yd18d^#kc(VMDsR*_Wc0aTD5+ESYID-KSgZUw+{Wtv5)4MGWuVgJM1=FRDoE zKhn~o(nt4ors2WQ4=U~s#dKNjiQgVHxs>Ef?(xN?&+eXjyY>f{EADeFbYI+$4_R4l z>Nh1l8!N+C_Y@P|#X9S0{Rb;f+VAcK149;$+^f`|X(>atd*yj=Q$t44`krKC9xJiG z;u{~kT)Gg+-_5o8*enaX8aSvj)Dl!Bv-;k^jYI429XF86(p&zr4nJkW{0b&Xm(?@ ztdid8@>(Z&ZGlC5vr*X>xsy z56OKiSXi-QTSvCMI-@Pgy(+^ zPQUP+@@H9DXU#?|?NZCWfYKkUR7tRAYlj>vGNq>?huJ&Zu*lYpy4!zH+UtZvj1B93 zsQlBuUTrA8iq+C=SlV%S$LcOhem$#eOET-pO;^`$uk_!|HDXILoy+*`hqa1->snGN zHhbyrci;CY*UPlpfu-2kg#oT?WtqBL{35_D{eWJT_A zb;C-tfi-LNi0tZ4vbRe@X|~OMVCPR+6-mBX&$$e<_Py_UF-r+w%T-r~1^LZ4@yMD= z&=w&+w*cWm&6U zHy(bQskC2pjbAwyKOywU=*micKXBVsj_Hbw>3P|p#J84NlxG{CUwe9cn28d&%Txa>*<>J=H!0B%dP_3=QcXt?xJ#i{@zkofyEE5wl&>})`z7K z@01Gc=KJAs-{vUoncdpCB5UpM&}e@LMSk8krXovNb^Bt^X|z5qCACYd$ehCymgKvu z^#4n~ewA2}ht-dstEl9EbcfhVY{Pfgs@fgO_%)`JWXo!8FEV26XQh8n3JA1iZSAZd z>^-Vnf3v$7Y+1{ze#4s0rT(D1>}X-fp7&Z?=<78qziy{fV>@>4^t{$<7b@;@ok4ai zZF7T9p%;|)y;^sv9lL$mZkg!=r9Y)QpS5G#c5kxUHBHIiRhKk77E|T$p$FEA{HC5= zWu||v8@JH`?_Wteb64!AWc0Bzdsd11m#$6&U1ip5cIN0OEoi?%SEb>W$}D7-eWiQ( z8bFrXG)k(>9RJ)@Nk3n?zDGAUt-^MFtUS)%{t?<=x2{R!DlF4BB4ONaS})gKYdWY3 z3uY9)k=&)CZiXtX-mDvU$4;d2KMNH#*rKF2N9%3RT}+1jbr9U6ah`TZiQvZ>?ZY+I(+A=#-zY*p5?iTTN9B^@D4 zOFAZ0W%Z6X>HalX=|3j^QZ+WITiZz6Vui{7r~v0`tjozGN1xYF%Dbg=*J>=I#y_NoNakWHg`OWfr zH8-4hI12YmSCdQ0jqV0b3q3^Z-BP=2aw++sylTY*>l!4RCH`JYK2;%KrwzyG{S@g$ zVxLm7-pu`Exf_cA$m?}W$%nU?f4UUhj@(^uWS5i&9^Y+!vn;LGN-u6)E-BaBRdK}a zl`bT&zPYBPJfd&8Gk#l}liVR`cuDz?bm>jiW=%-We~Xort)BIn?fjSGKK7PvN!fK^ z)rQYDD(O|b{nkcqw_s(np)<7P|JrTYMsED4OSVU}C&^KFez%cbPL3|+dBKL{ns@uy z$a9bEDBA5ymLBqzyLD~kjD_>oJK8oS_lSGh*7B7)*QfSA?nH9M``Ym%Zi>8PxkR3x%tE2t>m_q?{1mXP07#QhkdMM zn-UFfzO!mY?%|K>TFDQZf1dZ7gOXm-qY_qf+9&%r+1tIzJ@j$1rM%ebRgsj*O8w`1 zveQ!D-FeyDd&89aS@zb}n{CQG^{;<^U1nR7QyylU z$qU=n*?nW3(w_Sttud3eSqJ)jJFT?WtjEkuF6FYa=b(TmRGzL+l1=3k&(rXU6m@ z(}LvBskVjXWu2GaGe4q)KlofOB24*xS}(H;%8MIR zGc9vWx&BgKt|=&wxMKAw`HB*L!7El!Zdz`B#~mA$@kIMN*+jlOZ;eBVg0vqby?PyG zA{TGF;9mYK)k*I8hMCBd6aJj=N03tf{BM&B$g$}TEw+zQ`p>4fQ3d4I&&M{N-%;`3 zGR?Mt+$yWjkUfqyDg47UIlsK4_K;Vex0U*jeAg$xTr_ZK!N-%8{%w_>olmY>edK0y zPbI&b(%0mZ&Gi0@4wX~NUnrwbKH1Xh^ymDol=fbnkuAxO>?;kHuXCUljMdq0^59Ar1aOGFXZgF{obBOE0t_O{sUiTe~$~i|MGAh7iE0w`HFpy z>#${yX>nP}pa1KqZ*liDoxM`NDD~m>M*bSt?(&|YO#_tc`|%t0HO{8wYRBq-=coA2 zzK!}4cW}@jH!lV#{bx&>{5dXQ*}Btbmnzps^t32QWJG1fO;4HG??#3a|Emo7W8AppE5+(ARqA(JX7-1;Glj#8-t<@6chGzGA?|ru zk4hJ6D)p1{UVa}p{>iR>m$$U1{4DyAof$V_`ll;SztMiBr1{7)<62F(*D*^ae<>fM zGU7H(bQ*i>xgzVb4N=;!%%|*kaUC8s%VQE%fW-Hi+AW~bCwnGaEK;u23>xv>0zQXY$s*{|ZJOk0s1 zc2McxSs$Zb#)aN%Z1KfKi7z25`*~dTb+a}-4OQ|V`zb0lZrRhvE7NW({bA7O?5A;U zpTFtmY*5BGyDw2s;^NngIGOOmmeN1_CHqm__A$>r2lQ922j{QZ596wq-LtCR8Krz@ zzeYWXyR@-%i@#PY_qW*3*~xJ?12?)APgd?1v0t+9#$EVg*}^Td2*s!Sntdy7bh353 z8M?wGYrkdRh+DR!$>a3~rT?dW%f1$u@6zWZO^!8G{D03*h#Oj3Q{-uc(jL|=48tXd@*1}f#l?+YG?>oX{!Sk;0`estN{ zo8!!j&+F7_pEAB63;(EpYT%z5_)pY8se^w9B}ScOZ@L68-gIJ|d%wN2Yqj#*Cl~e@ z+_HI{8}hHy$bEmWLH#dV-Abjg0~Zf2ui1Bnrmt?S`*O!L*2}aQX`^wXk-rIu`- z#)h36Teiab7=8G(lGk>1OJn`_j^6Na)LhN|5BF*g4NGIyG`k-r&!3||yJB>i7Qdyj z?C3ph*HNQ3`c9dV`nyo{B5(ZgFeM+>yG7~@7U^w@0QDT7wS9A+jw?q_jkM`q3ALzwEL89eX^e^#q?D z^E8P)O`=ndykmtw)M+ri(=z>^hX%R)miUfog4apI@~zfXy!Ew;-|Kg5_JIlcmnP5G z-aXK4W@XY>6yOwF# zraiuwI;67=nVE3`$7X5nMLz7`VrV+M^<2BG{?RF#$^G6xNRCct6N|AqO?{T@AKbTn zziM?l3$WV0Gu3LkCg#@dgs6k*Y<;=LH|`ek&=)Q6c+<42=`7LXj(@BCF`CYG-M8+1 zmCmNxUvE+3{0L3S11?3r7s_Cdr?^}lk~v-DlH~I>ta1j6G$}Lh*~(d(>{7vdOf?y7 zW4DIUm8&n*yj!!N&#BHCtVYZBJ>T@4t-r9fX`{^}GVpxrDZgmCSU(`CVCarH8BA}o zOf&b7)%uTXp19uGoWUNx?|Y-+wy6<>P{$z)?@1z%~qXr(4Wb8O$b>6t7oC}#iqW1}?p zuiZ?mwLX(|j=Pc(bYYpMdaZ`nZ_AnNq35feOPWvA6ub9r*`B+ZtbW80{he1!HJcq* zjoI@llRfIv?W)<|i}aoYF0Z>?>OFh2@aW)aV}939@m)*|Unvdp!7Kil(N&_r1b@ z!M#<>f+3a7Vp(gIyQBo-tI)aYs=;zSiPC6Mr*w1=&M!bp zXO7g@E!SVOC;0>WbB1P6)3~Af=tUhqP0aqlJ`|r`wS;DdKD^JX)X}yd*|PC7rnee4 zSsy-mqxW+5ku|&CKjhYy82!0{o}FLz`N*z?x^(I05Tj?k?)whbePoWM@)tQcV5#P} zd@o1Yto_L9E;D&Ewq&%v-ZAHVuaA9X*V~o4;$yW&6V(24!;FU?*`#qL59jX{rm-sL z?qA&`i`7~Z8Z zH7JW6{*bsL>+~A^vH`Photc%zn(m9tIKF6^=1y!a&nMfmShcp(JHLCrSTo0KU#WVR zv)G@Hp4aPrJxt$lY{_Li-es|nC6Crw$4}Fo&YoYihs`HuU$twUaW_`!pPah5t5Ks* z?8u~jlh5=Ss4vm+>;^Iqod~QW75`7nSb&Vi%TD|t7T-Q25VSl`=x$j!+f4boOg)O^ncQ8!T|Hntlsqs zy;^r$sITwT=G6-4&+M;;cPI9AUaaX=)qPKafY0oK$J{%^>aNmv{oC1k^|;UMbiY&Q zCtX;fk-v=#7`pm1bNTkM__@z9n(-OeUbQ^f6IiSkrC(lYG05*0(9N)_K>)FRV^Y|KiuauGU{Y);6Y6{1+Cz+G%`(+Z2si zrJFsDr+;B1R}N+8zpd7<>^SY-in3qXJ#W96{VgVI#wTR=`Ahqi6*)aMrBRC&nzmQE z)Ok1XE3Pl^>~=F2X!boTv?%oVugt5b&Rf52gl2He+q-rLzOp;5pI^C9V6^7*iCzIk zlfSZ&tEO~nmNZu%IkRvZr^4UZ%JJixH`1@vr_U^A`di&^Z0xjEBPMvS(*L&M%iS_v zzp+A%dfd$adWvT0)N`dC>Atbl(dG66O`jDL>M!~FjrC|-#`ogJ`TCk`-`ljT_MI)Z89%xD{w4YkZ1%G{e&5;e z@mqB>S5MVU^*QsU!}#y)!Cdq6Rjx14+>Y6>Zs&&YY+;R+rR`U)*1sD#&&m7pcQ$9c z<=%{iEA`d8_kC0T^LMsu|Ay(AXI5#J93I-JcGYawd|okm%Tbs zWsv6A^MQYC|5vDij>^d>$h`!w0(1*|4N+ z3z$m$x9UseP;oHa;oqNt7Fp!ucTbgY$Ma@(R1PE7_*r{hV_pBYvUPb&@9T5LM48w}B%t7^E~ zVDa7jL%y<)%gRhz^H(WtgWY5ArjJjTO+D(!A>+IA^6^Oj!~Y)_*-{{qmH*hmsc}Kt zZ@a&LRhQYUp!1jSW<#-Gpj&)@N7y1(@xgrah_6lH?mn;1?d7ao*f4x2kNp@!w~tBN zW7%4)%Xg?%9`5~4fBd|jvGM&J z$-mhj1Lv6N9yWseDP8r2ds)WDpo`m1))TpyLe5U zfABniwHJDJ;X<7$HLtwXNUigT=iydP-(xzT$F{_fBln`E$9X!SovlqTATQnbJ--6#e9A}2H zHMC~izH6kE%nHsQk28;c<%*qo?~L;Z#+3+Lbb*vo78K0c>J{$F=t#kNMp?DT~ zG~i;%3siq0iL2(vvyt1LE^4{IIL@E2?)$~^A}hLh$NW34<#3+Bx4*irxyVL^+|=7o zK>h+Jb#yCri9KFeCw=fL?5D-%zw5aC68r7lOo}P};^of5NdJzl zZrNovXmR?-iKD8ZJZ3F=6iHxFRXf@D7>fE%{nAM1oxo089Xhmd2>Roe%AH+)OJF-P zUF#T%f%M;wox)2Z^fboBqO+nmSmyTT?#X9u}oMtvM?TJlcX6_#Aw+`dlN>NsD))3NZS>!wV~$e`TsULqx*r9kq+YiAefeVTNzJPrs%k= z(qPMFm9cTR6#pu9y|}E>uK<@-+HFlz{Hsg};IhgZ**6t;m4Q3Cta51|E~`u^!DW@Y z6E~FbDz}X1vdRP(E~^ZCbzSkV(qc20Ro3XwWtCccE~`vtHUcJjl4LG8X6KDDeqO&l40`Wzumjt8BcC%PK8Kaam

    a$Hs!_$XcpuQF`|msN&^a#^KRm&+=3A1^53RpJv{Mb05r#{ZAh zmj?rtLsj#mOmybISE{Atb(MZiP?A(PbC_+Qm%?o++-T$WzpK3VT3Mvtv$V*d$*i-r z#SiiD3GNS8|4G68t<{g|{U;;;C$4{L;GY`!rw0D1fq!b?pBnh52L7pm|1E34;h2?0 z>@Le6=9x6D-7D<$g5*!FAX+IVvlcpUSh80X{AcBfm*(u|yLnn=Ks9a&e$}b8aol;s zixAsJ!p%SZkwPCsbl@)@_I>PHL1ziLNgKfh{6a?eEGzKVR3Op5B+VlOXa z1yHRk^82fPls9}B!c+b=XRIu`ig+L@sv!P{2)h~Juj-3DQdo+ElyRNqjgR}lb%pEm zWS+FB97)3NF{ob4_I-qy7-C z#s?bbkNp3tujh?JO(6#U4SC|Hx=R#xsbF-TG$_ok`efdC)HJrC%ntj1?Dv$%#=_1E zRO^TQ{;GcShF9ZGL0)vfh7~Noi4@%n$PN*nxTTPGNr4Z;a!ixK$Mi|2;)~WT&PPChVerkp_kNRT}>X zd*1>c*R;34s~4$LX0%071l9J?)?_j>naNBhsitj8FVQ=yNt#TWv}uy&QYk$IRYgw~ zMbSf45tN2g6h%-Klm=B*MNkw)j%!i;-*@k|k~KSfF3xeD=llL&*Yo`P&RXktU%$2X z-ZPV_sz>T4)`7p#WP|6-Rx#EJw6Y^*t(oPF>Cyr zi`X)StQ_b0Fjb5d0OcMguWl3bs&2Eq)Uyoybtc`ck9A^fBT&^(eyj7-tV8M_^c-S+ zB79A$zqc6c2UPWw-%7t(N1J~5lWU>BN{lTu>yO~SS%=iW7yOMD`nQU)T_*kHxANbt zL+alM{=^L(^Wzd@nLsr^|KUumJcL5yusbd%Rgw^^RgI6NCygMY6{H^+NCZN!oYG~dfp#_HN+)>9;G>;eBY zp$|iP;~8Eq#+CrB?2wVNR%f_bpRN@DcsKX7Hz~H53(D^lW352*^_((R@u+&Fe&R~- z4{B^*YiT1xj7QDwOZ^47c9vM^t`%cT zfbu?pyjHr+@=|w?S5f~Kx_64P-9YI#d98Gt<)!Y48}a<}T*sVv#aJd#`b}Od-DY{I zdp+W;wa~p>jMXW+$!n$CEH8C00sl^uZq`(*9NT!PUDZ#1)-sz~D`p)A2hJAo2cSdt ziPWDh#&S*i$#13KtV8PSf?Te&(BB}&8cq7iZ>8U?L+T#{{(Tnu?av!AB?8rFbMjm1 zH|vo4Yr#KF=#pd1Pq`SYHR&h6m434hscSUqc!Q#!wZSvAS&Z!hn$Kg(&<8ekja5Cy zta$%plaY&l0&5^I=T-RxF)!yNHi19aG{+dL#8@p*>L#yMeVgT_?%rDvzlH8*F}73D zOL#z1ZnM19T?76SMK@(xueD-q zInZ3Ml(DK;Rgct9+zI|>lMUW;?UG|JMt*LlEd60q*Fn{1%o_jNU&HwaeR7QP&{nn> zD~V!@vR1ZKeNrzm6a4iSwl;{d?Z8Oyb5PdGma0#+RRsRtFLjJ-pcu;pMzTd&D_g2Q z)z%X5*P3imez_Q{2bybwGFCOA>QQa11OF}y8+*lAkC!{zpp2CbRgY?8JNUDpM~=zb zo+if1Eo@N6%7&^(>eKP{p7u2sHX6m)Rtp;%WUOqcdQ=-l;J0t?7)L)b<^`J9gECe& zR6VMVX7E>8*jOyaR$ADgjFk;lk7{Et__tfw*dxbY=@&rTtKr8 z%2?S@^{6)bZ0%_;H`(Y0hJ|8mHLwX}wI`{E@;qbN)H7PunFSuJ-0o5AQeLi?w#A4! znqBhCRu26xA;U51VGLPftOyuQ7v-&DP<2wTY<1vYZL&xC^(^X1U9#KLx+7+Ysyn=)3mRXwWh?ci^< zu+il;Bj!Fpb9|JsvZ3lxZ3MRA^M9d_p~f;cvL;A zjXrOo?ksF*Zx}K52AXY9#>$4ON42p4{MkYu$K}~jAjTE~>p_vuH_BU`4XVz1@L1(` zvtn1;rmhw-9?dTKW!nt>y|;$1JI}X)Vk`?7O&8^@Vo-HTTg1KKUud#N`4wVp9Wc`Q zMp>&|sQOe}x!bY-O|~fCZj8zS&dQ=-+AM;vpek1gh2s`Y{bD>s@Ew`{u z87teW9_o^9H~5=PHkiv@a%@}VJxf`uT&nt{9ishh-2XtI9Fy^6i?ITrIhT~NibvHW z^$}~pUuR)sofvDfut6Cs8>$}F#!m2ec`G~))_Wf@<^@gzMcT8Jx2ktlXTlEa+}0{~ z=@WBEUCYIIG`r-NZ4mS~DZ1pjvr~-i14h$Dd8-&yozfO@D)_zI!*fRY(PFF!7-`Q^ z)~e1_eX6ZS@UJ%6qWpR>wi#%yGs;-ifT~Be!Syk(1?T&{gU>(TZjX~=%&kj|1q70h zb8PB;sae+Gz~>owudl|Wm+#>$5o0TW@;znp(k7d#+bnNz;QI*hWvfXy<#&s*R)OS` zGOAv)tmK&n{y{s!b3vao#Mo${)J9^@Ws)2cz+PqS(BhuO5UOq=!-Xw-0SHJw+NZOyzO!xGN1(J4tQ+WI(2tkUdfA9A23(2xrd2k1%A;053Z?Ew{CXw%kSgk06a9_UNZ;EQeA-Jlkb z{Suot9rP4PyVRy-ftnWDG}|Kh3TgpmEw*V_Uje_bL~cRrL04V{U;YkXmLgxEF;_!B zDB&8|y4I%c1)XypbS;Oj8*JKLpgt>XTFy8dgT4UudeEk2f@(o8gE~EA(^5fIpe>-2{%O-L2fYpIyAHJgx(T!s)a_xL zmIA5)JqG$2N`KU*m4NO9wSxTXZQ3HxYarWWhy!#L=taOea{ zy`Q&fV?pi!bq1HB6x`La#B z4)g-3^JbfNCaCxo`1va0-eS}8K-Yt|fsSalX=i|L1pNTI_%)k$(CaqsG*BVvdC;&o zkbBU*pjScPfKJ?M(+WU$f<6HacoTaNbPwor&?(!HAJ8kH!{4%LQ$Q;~Z-b87jy(g~ z0P6a-P4j`~fNlr93F^KB>j#<(x*xO`H0&LlwiNUlsOL_|gKh=A4;uI`atm4m`VBPl zJ)2emdKC0MDEWQp0<8so2|A?(`2gJpdINOQ2jB;-0eu1*`XS;1b@~W-0G$W=+b-k> zbn?g8KcHVgXMBQn0lfn1^eJi#R1CTk)Cx-8jkN+bfIa}(KSSMs_P6~R_@9)4@e?v9 zq@1#+<+2wp$yhUJWXixx<}KxONoMM_ylJ7Ds?ducFJ5g|dx8hWY|AWXRv(Fl?;{N?Ro{ z*Lf>Cv?;cS;o324q4ja_sU0q9XT(IFGa+s0qNtBqEDos z#{>C3_8`&E2J&-}7adJqaoMw(lb*+cC)l~ytbF2|4`G_2ojd~K12jW1H554~X6)q$BRauU` zk*(>vvjsobxB#ygf>tX!`1k(gryU}H4{S-YA*)Z|?_4>q&M!U7nCH0stpj!b*Rk#M zxEtBp(TbM%F}kPkYSvIzKvcZqwh8+2s zzmtF)qVQ6`<}zwGL7-h=AAyMi2MTlu^a{)nm?bb<;8cOR0*eHe3#<`XD{!&EWdc_S ztP@x-utDH@fsF#21U3uYF0e)5Zh@@=_X^b9B7T8(fqeuf0-4WPjrr!2^`P$~uPO80 zAoQ*m*eI|G$i4ptkoEK)kZ0m&K%Vda0v-tb3CQb67mrQ<8yy>vfA4b?@GroVfIJ%p z0}lpzfq<|^KN3@o@qs}4&bnF`#doQIy!4~@57FaX<}>uK0J7Ha0Mf<-K*sqPka2DV zGR`ePKwG1owvNRMdA(pPn%9s`5O@TT^0ZSM#ZRf0I?6>J=g*M&YI2?4S|XR3PPZMW4tuo(*IzRRWpI3q=1?flGlHZfn%3uFJXz_SJP! z`FF*^-y&*}ax}b8smb0y#m-Geo41;FZsP%Z+>D*|K%5F4dTy{@M6yd{UYVB#;3033 z$sWhlMmaUUjV6A{EAv79eBI~g$Z=3-uE@axAZ^kH@pAO(-?d^MFZJscF;bJZskasD zNgt@IJcV0#`$XuYFO0hYujzA@$%c%Bsu_zNHAL(qkp59#`pNTT zok<5}*;HNsZVm?i8a)TJ!`~eu(oZ6<>#3vK@7ejAJRFzv{C(j1zU}k;T_E#(-H`VA zzw|a6K9#nnw zd7anL!8md=+V|dQp_BY-lldpVUEyC42Y+q4u~)AI%9>ddLyop-t69j<{_Yqu;Fqwvz7hG9nRPXH;u3CLQ04ajqFCy@L3Qy}Z}8zAqge+BYh zHX+lvr|t#h{m8LE-c$Dn@}7DKkaj#k-cyeT9s-;!`nf=KJ2d*=7o!=SBF9R-bwdsL z`+)TS5g`4421x%m1L^-;K>Gh7kp6!Or2l(?d?x68n&JN;K>B|qkpA}ra^Ic`r2nZv z`ac}VXO?Ur12_lBd=~LqW>Zg z-H45{4pAGaN^JxVh@3B}jIy~{KlWz~o-$T^FZp9nKuuuNP+z*Qzy6 z*%l$YTag{qInH>o&a_(uls*^5DVr!{2P(3wTDUkc-CLnFz4g~0pa?8##`YV8xs{>N5 z9w_~6h+^B&WLy(!&op!`22z%K_QffyO)z8=fKt}mHFka&L!yXjAW+Iy#VOk?eBQ43 z+z^K>?a0`zP^|@dAI1Fk?iM{J#-s9Q#=+k*$%vc!tK#5q9B1UZNnkUOYqcH7xL7Bv zW9R{k{+z-yvG;+IV`4nzQ;ofP0gyf}0@B_!K-T6;pl(y(S|DrwQ6S}?2J%dQ3CL^G z>p-6A?*e(I?-ujS8~MLQpJ)0nK%VK{P|Ga(LxDWg`vL(S8e`|RVONZJG~}DYCjc4G z$)fKBGM+Rb;~5TQ9gG1oo=HG}b}o?dghYQ1knvQDK6zxLPvoshh@NA~Ph<{?u$IIO zAbrXb{cIq8nhK;(xj;Z$qdm^=j$yB5tRc4>NIR`SuIXMN?P-c$>ZGke_vkTXi!-1C z$h`gyNS%vC|2i=*5mS1sjoF3|O+d=Y{X;*hqS&N7oAhsI6kf)-U7YF7;!LL<+WQ%O z+UkmWBiexgy-_Y#_*W#b97vnw?R`+>oCpq_NK;=p>EdknkanqtL1F5h5}oG z%y;K=j5rPvcsP*bM6TmsfxOpB7kwh=_6(O{v~$&QAe<#*ueT6y21e{@Tgy=j_fH{PdZ*a`cECA9ZTt`jY@;-wtG6 z`iOoakY~w2AV6=_&2w-`4BgG}mpZot8Dop+?*_8=T19^^konb6$K+1{a((SU4$H>5 zmND%)Xo+H{ubr=t2_oj{a{=hqwvvZZK4r(0#NrG zsILi-c{>qEzE+$^%-ddZE-?l+&SfB{e4PcPUCJjM5sXSd25i$w1cJbRgp^7W}6GnZINpuStF&>u`ja$4iaZW7+0noX=SE zfxI4H4CM9r3LulS90<@>0{M)!8p!*JH9$UNJu2p(2J#u}1>h0DEkHhF?GW=H0*^xf zbKudyZ-9K({8h{kJi}%`7JUcsIG`7p2pk3kXkCFP01pP92s{kf511(C&j9vEe*$m- z@EqVkV4;}D%b1O8GZ`B;c1ouFdyA zu8k(t{K;`ufQUAoED7hfd~|`q$$%$C^xbI3`<$d;xrI zQf&PRz1#Ko!E5Ro2vpRBz0a=tDRV$x`p7e)$RsQEMDnpYyR&|MV|)n+K%-7X#`45+MD* z5lH`60qOt!K>EKPNdKP$(*IY1^#5%j{oe)TbJo{D`u{VK{&&qauBCP$12`JUeD??P zJ|_vt`)6t$h_nLd7o1a_+EL`qV*Rr^TToLn;G4dR`aZ5BfrR##09!)W;gwjn^D&FzMwO<7yPXGzr9T zTjM-^WbUM|a#GIG4t4cA$~tz|BOCenx+Vgj^r!AzBR3m>9HU+03+OYx*Tpi%@iX1N% zNFLgjF)+^)VYf}8@`83{qn$cozh2;@K>AMGb#dxw$T#-qdLU)#%dR+O?LvlrCH9T( zGyTm~__O2S&z@oUHWf%4xdMxT^p&})jiCoD`dT#zUF(I8MuAO=uFY}iqFtV+fny@a z%UCs0qY0vhj{q{a4j|XZE9N_10BE&pdUCCI0ASY@J!$^;90;-U>=ZlSPUG2{zbr%z$--m zIv~3LQKSBbS%#h$fvjQHVnbr&8kPnr>zHlG`hl$FVFJejsf%^ICk|a1QYrAK`#N5i zy~np-muvBwwz7bVn0_6iPvs%Qry7AO59fK!pkLvrbo3zuc9~b62aAOd*+9khwmh^7+k5{5A7(z((T9zS4?Rva@~}064-T9` z^vx?!^)ueJIDb{gb36-nnFpSa%Y+Y8fvSGi2yL{A`%iUF+U9v{t^?}jxw_k=Ps&TZ zb)xp~6E*)&flmm0PT5~I%Mf3vc2lry2UwB-qAM!P2%I6p|^sgp{ z4EY@je|-#o`XX&vp}bF|-quoM&G!Q7i&kb}0+4#R_q3B@$3$N0Esw%Wdo9pQmAi$V zR)Kp3YURc}dC1=YzliIBGRJjMY*3DkGUapIbG$Q#4EdMAHf=BuJ^DwFnfxsZe;^Ki zhlqjtOXA>f!J0Fc&&ArazE;MNBR_p}l(fgPJ%)_VujDFWKpe3v`n_@R*MXmQ>V+I* zDT*N{W64Hs$aPsALxwi8m37$~2Y6rWN&78TMtyt@WKI1Dq%Xe%c~%}+ZQPsMfYf~ikk_K)fRs0%X|&6GOxIr{=YVnz zm4@9XfV8^_NV~5AX?G`(=flFS4NdLQ482%p$r2l<^^nU=5{yTy6KMhF# zvw-w}0+9Ys2h#syApNfb@}B-8ApO4*NdK<~@}9m9NC)l%GT)B?c~AcgkoWYPfxM@G z3&?x=_kp~p{}jl)d=2D1eOKg@1!V)WeXtmA!A z_;j5$MlPNJQg#ziuVbKI$3VS~fqESS^*RRXbv$3xF;K5#pkBv7y^evj;{ob*4Akpb z^mBo_!=`^^9d8&Eo4AkowsMj%2uVbKI$3VS~fqESS z^*RRXbqv(&7^v4VP_JX4UdKQNa34^wW1wEgK)sHEdL0AxItJ=>3}jxu2I_T;eCl-! z)aw{1W3@ucmY?5#O;|rTa-Jwpeuu)pI}ZLjk=uHa+Xf)lg?a5WB)UCmGh67GDs<#4 zI;O>`qXB+X-xI=r)@NNDvh~^Ap6<^qlOZIjMXmseSn-#1X8VR z9BY6q?Xdqdltw&TL|Qy zEd|ofJRtY%5+L{N4WeHMM7Kku|GaiOk|M`Sy^g;b@_r!w9|2^J&IHo`X+Ziv6G;Cn zfb{=wK>EKJNdK<`(*Ik5^#2|p{a**pvA{uW__zG}&lW8*aW zmnr;?82lL&60PFouEzO-KK00PB5jj$p-;wJj@KNkHQCVp#5f!EWL(l7Z=;FV;4*Ye ze#fPveu2_fYYaIl+p5?aLjeB37u5%{Qs@s?wK$zjl$azZMHz2BcprfQ*ekWkt}Vt|@uB zuh&Q6rM>LSj69qJqBazp-TApP$Tr2k1k`X2z&|B*oMhw(uAe=d;z7Xj&iC6NAK2&Dg40O|j7AlL6U zApO4=NdF%Oaz8Wz8Nkax?uTta?uQS6+z)$z+z&qjxgUN9az7l1yfQB~Aos&bK<SiuC;x%n-HQC^pZ1ksPsp0c( zfvrI5;5zj7NB56TLMC;nx#D`n(CqxLyO&x1B)N$frQo z$TvXN$ge=wNCM(ujr0PtMveutM*0I;BSV0+;{mcpMgv(RlSMxlh;D~Q|9R$@1S02# zdRxWW@e7dtcUxlke<+at_XX1b0YLii1k(RBApOq*(*FrS`ac~=|BHe2zY542zX(YG zuLRQn>w)_7I*c|gs6Vd*_2+e<{=5#P|6c=H<6V(Y{dpb8{*gdH z#75a=N<9>%Ma~nIFrSQjLli#hY`oU6+a$0V$a>fgWIkKO_!j~()b^a#Cm7iW-QQ~r z-M0X_R(AoZ`#~UeZvb+wUI6OXXCQrk7s$2R4dhyV3*=h;2IN|GgD+gGLx8k%IFM^K z2*|bah<*kT-40FG+V&X!HzVH^eg{bZKLOJJe*x+LJ|O)+aGBwMPayq221x%00_lG; zkp2gO^nVnP{!aw5)^dRKe-@DbR|8pVwLm&>6_B-d1CX_LJCL=u2FO}_6v$e88pv9E z0m!^;0kXC}2C~+^7X6=q=tgYvEZLhLeSNd9H}sqXWPS>P%+FjP^RocR{9F#?`d$lU ze*OVue(HhD&p(08&r?9=XA_Y5c@@YwwgH)+JwWE?2hrDVu#Q8n@A{1B{x7@EkiP|} z*C$Y~PoQ3(K)pVJdVK=*`UL9r3DoNosMjZu{&!z)_}?4I^*s(q|4#YISe*|(N z&H!?KCj<5SN1%TH2-NQ%f%^R;P``f!GA~yHxxRM-_4`NBe+-D>h>fxt@RbZ_0GThw zy>4jad`V@LtrdB{2`FV--dJJesd!tm`rAlKy)ApLs=$aUEa9@$h!I-$h!Jn^t&Uk=tgYJ z594rTM$b?7t%jbdK;|bG$ov$EK9Tt;2LkjaYiCIe-3==ZnJ0kMy$ML&uK`&*JAu^w zDUiAU21uWO1v2*u|1fgj3&`9b3uNy51DX3FK<3B;WbQ`;nfuA2p9@5{LzA^LdU%Z7 z+-%671El|jK>9xysGq4o`hPi){$C5E|Nj8e|9YT)rULad6-fVI1k(SlK-SLtK>GhV zkp6!UWbJ6T7`5{kAZzDvAZzD%AZuq3khPNnWbLE_Svwt7NFe+KyJTb96VAoD&|=wYpGh@pq_^wqA!mXH-a zHs*l!J1q(yb=HYo*8|xn(!T~E_rrQIkC(a+%{aTsw;d?gW=Rwqlw+fe9eaS-2PkEm z;*@Q<+sNZ?AaxL_gFbc{6+IWUPhRfBk|?~?n{k&|FCc3oTl9&XmpE1Qa|O;8SSj#A zfr|uQBk(4HPXOtc+UO(C82jmwm#+pU8QMiRiNiP7(9c7VYrts)=Ez zcC}$=F_3ny1F|-51v2mV2z*fBV?dsj8%2LJ5Z$&$yF5EvW7u`vX~=njv^z}T89>^d zAaFX6@fC|c5#6>%du<(y7nEgV&Ke<0e%dQIBXa&FzlQab{LACuUnc66`ZvbGpCNLW z1*9G3{ks@)(zishN5%kYkLNFAl;<$d9LMPBF-l!hhI$r6kdb+$pS-3uN8qCl`eDDr zSf`_b9P1Bcd`UpAZvaRiM*^vPJdkyDE|B}92*^6B1hS4V1o9fZ2*_*jQXuWz0OU1z z4Ul{P5z%i1qT8X-f4)buY)s_bP;d6_hWt4|`d<+ z0P6P;K>Z#9sNX{X^?L}Qeh&fE?;(KtJp@p{hgc=<+0P6P;K>Z#9sNX{X z^?L{){T~O^?;(KtJ%s4b2g2Qmjk0y(I`)vbelhMPV06h2+&eMa0@0lA(x0O{N9K(6N+AlLIz zAlLI*AlLI1AlGv{kn8yokn8yskn8yakn8yykaoJQG1jv$kn7oB^c_HSJ2Y93iP@3k zq~6AR4EdLV^nV+W{(k_Z|9gP+|3@JGKj2=&|AT?_zYmc9p9rM?LxA+(2c-X*K(50$ zAnWmLApH*kS&!vF25CsuJ+1|^9v=nL|EGbh$2Wnj$M;45 zGa$MV8)eH86R`%!*lU5z8{_VKX5_p{rIc+(O|idSV2h|R>d1{#heODEf%GFo(Xl!X z9rT$s)nj~QpXqCZsFn2s8-ZNwCV|ZYw~Kj9>1VD(iMz6;`}%{!;q!D z^%nCVI@{;FRT{5r6+6o|v`m{cResw=YlKn0Y*+1gnnQM)loduNsO`RNH&g?>l zYp^^HnQh{C3$_bhUXN-le#2PCPJgJoHG*!LFEfAQl<5AGzpA0Vwz6aJ|B-yE_saD# z^qT$N9tVHQgYAANOpP6<>W?=9znaIlmAn*1;8*vYRei6BASdl$N%cLKy{aA8~RhG@Mp)t|E1zjZ5;d? z|7qlFGmw5UrwuXWm@D#fpV+5Gj)DGb&`V4JGG@C#t|R+>&MV$%bB544OX#XF z={#T2N!yR$ETVy@#F@kxmq)RoJA;2HJ431E<`^>M|4upgv~wfphBnB*68ic29w77a zERf^uGauZ?ju?6VQM3>osz7I~3-y;Atjy}l-fJZ;iHVx%U|QQD#n^6P6p z-8wIk__HGLQx}_Af6X7{uaA?Tc4&`ru!gorkdtwcSNdj_?VS@n2hn7+lKx4ImapNEXTHWOdZOj) zZ16E(GZlWTe3dEl(huuQ8KdM;_kQmgk@H3g^4C4vevQnGgTGMWuZn}e<+*nKtK;Cm zOX1%d2mk69+x2(Jj~y@b!?;6`|FWx9NB>(9Oe^DI#S1J4};^03R z{xN3m=cYLL$141LfiolLQ;qdNoOiTu12V5i z2s}=lgS=-fh*Q^V&4#YGfzn&ZUBtOViE~#BIcX~c*Al)S1Eek@ z{bk)H7Dta;>iFw>h7Q)Q%yU7Uvh&3C;zH$mQ5UD|#EtEF+8INJv6Vh<_&EL- zz8ISnTUjw=XlupRcHe5^;D1};uaCh`-??b}qVUm&Z(lLueN$kIK&}(l?hEv}pV%kb zUN!o63p^Rf&$fn%{xl%p52_aZr2>xv@*bIbh$o;A2y67`bCLgVl>9H59bf(f&$s8Z zDTWMf&40(J=Zk@It@p-|qr;RPB4j;^tg9rppR~h#Esw%W{RwXv`LPQ;T3~-5_Z{;{ z9D+WtmFyEef)6kCMqPzZ7`jSeVp}&-wF0RFe%C)#DPT8RF;|$?Pf$)QU=|`8+=(^yS*kHaqur!_;cgn zFWAwpe_0&-gB1OZaqvHmdpPEZ@wUdnKlUjj$CH7SUd04l?v%gCe^%PT6kCeW`tJ^f;LhK4TR`;bR`^wi)%wbBg_X^qI#7 zf$PP5BanWxk?*KC+t+Gk6dRKN9EE>#9Q-R4{(W)q9}E9v?F_1jo*Vj~qwr6Qga2K{ zpCxhde&w$)7{}RY`WPcy}0KG|_xs5)o6zAz`n)=aM*O>v8R13=Kf8&3b{2;+n#1X;YlKDsWApuJgsS)g=P2 z6xRys>RlaQKKh7fk3{9!BR5Xj?TzjGZDkA@`ui2u8?I@;0GWf{;u(v5t|R^4977M~ zscW%vFVkmU^jOKiT*SFji8CvPoV2wA&%u2CDUiB|vhEhfsiWmxLkH`RvaFq^IAy)! zdXb@AFS?u;J!a|qQOa{qMhqFo<`DPzUgaLYJcgXKwN$aSCWZ`c9j-hx?Tmweio)Nc zCVKqLF&8a23Lkx_7w>~zDe!uMTqnj=hd%3)ed0#ZpC+EY-bbI$412}+p%~{g*2!Xi zn7}QVSD&%oLLY2ljsC0=`Cq5xzcoq>QUPTTP@b^{&5xcR@_)3$sOK+$vL>g+kfS}y zt`M?yitLIwWNAmwR}^0Azw&h>Ki3NUhroKE`i#|pzWR){Uht`Tk$aA3PUiX6d7%zA z+E)3iBJfieo0)(0ALQQ}CqM1bo?NFc7etRk_024s@gK-8h(ne>(tf0-=6axb{&lF& zzY%Q6oKr7jN>HDF7g*;*%8)-%xn_)xgMSD16K#D8)b)txPWBli&w~Xq^iZC*KNN9( zuEg0Cr|dl8$ECuLl|brbU;5GIZ_(qIeykRLtWo^Pj#D;6+^aAbOJc~-zejL=r`_ko zb)HCn_2=Ih^3vaf#669k{|lqXNSjS>8#c)Ah=V^@;m?hO-yzOB>R%QI|6b*DoW?l# z7pc#`aq!#4Gi)E_88-2v=y{U4orUKEt_Ne87DI-)<+(_lj(Zu(>G!`eG4WlX%u|QCQP-+6sPR#6#a|OJ}==&SeWUkN_d*J&cB1xikLN3pNUUW>g? zpIM{*7Ddku{r(K=E%_(L!C&#A5$8of+E@Xk9`>n+wYM;a9{Nj}?IO+=CC=tJWe*X4 z94-8C2|w7Ee)PCJdi>Iln}r{%6hEfMDZ5F@_wpDrjCq^z`y=5mk^ZtqHpY;b{vLyx zk!zN)IC_k)_?=%zpTFt5=<{{o8}rn4o$^}7qxxI_ zLxTMU5P9Xi8gJDx-R+lv)OoYNN9Gyx&AHv}J3!=RlloSh;=69T!Sn99-R+-($eY1` zM7t}ed)xgSMD;b0bKGB~1y{BIj^Pr#=GaQ0J~^+(|J?ZQ z_7^}>&(Y$(-nGQA#ahh7YxVE;R&O-sr0@KmYo~zmJU~6t&H__j`hR8Eq1;wc>x^Ns zutiz5$@ru`H7@c!`CH_;I6wXO@cDHne-gEW!t$cl4drh!&719iePDEX`$5s?-#9q> z{4ciX^GEiIF@Hq#`6G^wKL2rI^!eHt^Sw`qF2DBp=<`R%(0{r~UajlT9X;${fw+#c ze$@57G^vOEMo^^r*(_bej9y$^!MTOX8-Q&ba2@Enf?2@d-%Lre$heE=U+K4 z`uz1Lh0m+^0j!^w`iIY({W~E&eBQkNmz{aAUDoC`cuk#ba?Gsn&Y{uuof>2Qjg08> z7sQw!5M|z8e6W2GNcGZ<;sDj}h~{z9xLue!si>y72o3J&E|oe0|+) zx;`FSAMVcv)BLJC!{^QQHF#C{yg8m1>Y~p-wmW>@9Pi!_!spHU1Dy{E%eUFT83%{Y zZ#2dC^FiVBX89)*!spHQk2^fZ{NJO`KNw?v;?>dRpNcWR;L7OoUy6C8<@XGwp1e2w zd-argN4Pz6z4cigK5x!z}hDT;9B16LyBrtMxXjv&}vYB=^pK+@FE{ z8Q7nJ{TbMwf&CfSpMm`u*q?#@8Q7nJ{TbMwf&CfSpMm`u_`jI}zE{S`3-0ZyzrV`g z>>(|_r>E8e@?!j?^YFXo{qb9C1^Br$BN{Y`9 zX`#}*86}~dicn=)bwz$C2W+!-@v5>4t+0$k`4xGUMH*#t=9HCIR)s3&lvNu2%Ch{~ zp(=JNt7xmRq^ztUr>d;HI6tSbxCE@)oV@a?;{4gF&5G*MoT^YIxxibL71V6 z(44Y)?FuXDM{#9d<(!`>oBM(c@d&)Qm3Q+78X=eeQFH6wfj?siXCqZ-;n-{R={cGxZ^UPmkYgfAwO>-@jE3%eqW8)4@5nbNd(nGv91TG>k)mPPnY6{+NkGu2(jM;;%}yH2C;nx$_4!n{ha?hi27dyu`LF%e}%v+1zsg^ ziNK`->wt{oc2FW{6^Q*iK#8CR5Wgq89z@?af#}~0AjY{2#K!N_P>yqnpxRC%A3*Y5 zD*EKXOPt0AQaAhjoqgifAjUNngp_E%SbOFhaOP^sE ze(QFDx?RzC2>v92PJzh+0smtf_Yq?xaV>aN<$4_tVlB{j=B+b`zn920JQ2iLm`8K_ zv-DIwVb{M~O#SNFK!53<+8#Xe>CCa8WIVyK>J_LbGsorCC1{go<9I`X1}aC!$%M3XRK5B=)d2Sdzu>dJlxa1^V`^Tk!Y>pZvlTKGJCZc z{6jEEQro~E?et3TJ4~N%r#+_`QO~{6r&wrYMn**c3k$E<0nj z6~_NMXCjuJI13_{UE=?`Q2$Ja{|}aHrvthqtj5i2?j`dtIbP)QuJ?@>x8G^t#kaNW z&xFgY+?(px$zZpXr0w0c(f2iPp1pHf8?OJt|_VKFStMEpfskQ09 z@OE9|%&wYt=8ow*61AKivv%-~JiJ}}#`gDGe!~APc%hUGpO4l1?_VckdGP<&eB&1V zC)Bke=|d;az#C?H6%~2&bMQVI-YP7eSyhx#Syhmc(H?UL{t~$C^BkZ(5gEnU_9nO{M<4ika1OLZxAAW?qYuvYB`TyJIz}{udP-H2<6YS zFp4Tw_$KA+7nBaJsXUWWZRC=5)>h|=9`YC#Gcq$L<&2quPt>XqP=+ZjVS01MhYEA@ z%WzeWnwv?*rRBI%qhlaeH~td9sG@N=_42m*KMqT*!_`~z*3W?o`2)KV%*`n zN~`DOpfEF7A;L41dHc;#)GLLhua-8-c_Yzb`emwr61a*i@t@bEahX@7F z7|bm^Z>s+2{>Ez}Tz`i;9GO=+rnshxcljNTL{lEkvXh3_khTA%II<6t24+9Zl3XFnPUCR zFMlXAap;RXGjZsOGc)1qmEMo%2fjz6pC96m?oU5IwB zN6DEIzO*L2`hCpEa28e1q&cC=%DkB&%Lj2q*Cc$!DKx+1ZA+Lg{mlj(HQ{$@#>u4U z!Vx3aA!iCYRtu3c#dOav<1|7s1*9B)9qsUXq1&;#VElP@jBAE;v(2M$e{dUDg8M}H zV~!x4Pp(QwMiZaDDy--~JCjy+{u`OJup=|s&oMOSwPTEAj*(C1NwW5HILzGUb3(7= z|3+HX{esfh?ff^=YO*8u+sFvpZKP?pi4(&}Q^#brRkt~B^8So=thU>~XD7TyV8d8R z^RZ@%S?;xPws2i-`z)LZ@tOGA_Sv7EK`T2fh(9xf7B)l%J8rRX-W;*N!qXGZqhA@? z^qIF-IB(m&`m@t$TCcW!^=GEhWJA`McsEMyiST&a>MNWnN`3Lk#_EFj?>*UA*D>qs z&wPS1#oT_@X2x4z;pvH{FV6b$sC(ECo~ps zKUvK2eNtsAOlP@iQq@^*R%)tIeR=}kRP=8P= zXd0?N=mAi-6MAVs9N$a(9JCX(8T2@)4zvhV0y-O%1qy(iphS=zv@fxj)(Yy` zr)QS_OI>^g5^&bkLE#v=cyH&{)tkP!(taXenqFXgz2f=qu1cN5OZ{ zX`ozC3Fv&#V$ijqdeGybX3!o`!qLzVa)Bm;N)prejOzCfpe z#)HlWEdnhEtpcq9Jr3Fo+6np`^fT!2y|fj| zSU2tgj9E7D@875U_v!w9`seP`>H|iGs>YNRRF{OZ^uL-Ls%Z~!EW4sCe`rAg{?f1# z7fFr`)8Bm7Cpfse^BKv`HsMjYC9If}$9HPAUK#`^<9%%W@nQkqH8;L6WT>yuD%&lN zz=zJfXN1jp?V|?c@EVLh(|L4RUcu<%85MaI^U>ejb#ie=w__4!B zCp+~&tJJPIV2ts;;b~-Z(gXw zc&=jCG&#IRySwYeiuslb?VU39kFrfNT3==DCl>LqFh>>O_a?heDJ}>N!(IKvvN6>q zRmG>xuL^04v|%M>m7ff9pD-Bor#wF7GHDrRm1QUAqFqw*jQB7ypZudFP55ijvA%>j9{|(h(K$B<=I#_@!3J! z`1|_!(2|mlQ`&`wR~=@CP0+N9BFteKwZyIyLRG9}Wec1(-zZ{DySdYdl1dmX%g1k3 z^EHB*oL5pE(*D67M2+4p?4g`O+F5#J<4||QYeMEc%wuV+SpCs6v~`jJNX|gW3*RZKfINTqXXN zP_ItYJpNz34t7|#npPZcM<2Y#tV18IVfNHh6zh}4u?Tg6O`!ctuHXDQGw`R;`J;`=A;b?3I7H?d4^N3Egr=wV~>$|vaGU4Wqi z`k^b;D-1(aePsI00;OkA=u(CP$x?!kI>X}ZE8kVi^wfnnHDlO744(+Eo0^^aW z&0&rrPA};?5r2MOT#CXK1*d6?I*+PstG*GaX?z%)jmr$`TDu5ynfM;k%$cDIIo51= zn}>71obF7~`fw!tYJ?*xUpWybjK+IaSvab+8C}Nb6<1YTo*jPX1@pZFT-aDIIif2GI_jBfAeD1MmE(xIgV z6UvKA^^K(6+I3>v$xz4F2+BAMZfCFUWVnqzy&mpU_nr2fdTrGA{96&0wByN}iP|tOosjNfoHcXWM{WtPOz=FY);IbgYH6=;jQkx{giIC}7^7NGYMoRW zs>lo#=HXg3de|s@M|mQ4SM?m@$TJu#A^SSDO{gl6=l59l^|KH=MZ3*7UDpX<8@zq(LX5*n6`Un^JoNGC4yl~{$m0-aeKEp<=8Pdi{=p2$k#l-Te*CCYVv zT$HF1{v9GSbT;13RIWJq%k3_Z7L3EHDoTt9Dzwph#>a<@{8x7xfx_3%LG1$l^@w8p z;SjCrYrI4s8;c*S;LsH9Dw#`Ok+boMto9IN8p`Nyr2pfFkKyZWMx=9a!-V^_QryzL zWg3~HrI3Gk>Ad2KvQmDh*EnpL^?UVNw3_P8oG26WQa(jnM{S}QSznrVI(e0~ds*xU zBa*Rt9++xPJJeXSwzS#}D+S{U$%`vxmvQ`S&u=N&hXBJ{{ikvc^M9$(_Q$$E1My^_MbmbJZ&T76Nv%o0CLQQJ)Ooz~6sOxc z$~nn-jx*$3?|j+0*ZG&^q-1~co(Utu7A3obiM34)ZO3ha8Gs@x!-gD;6BNd=DERhhvzlVdmdX#@08Ig zXQr%A*^$!MJKbC7{m|RbSLmzveeN5STAF%q>W`0wj$m4FWbn*jUT}7>I(S9!`rs|WJA*$26Vi`MPf0IMzc~Hz z^w-l7V5_F>1SC0vj#9@3jx~Bn&ZCn1C1)hx;9BK+*0sg;w(BF;*RG#jo!tk!k9Oy|=eaL&uX3+- zKjwbUy~X{u`y=<4?qA#^JX1ZddOq&IyD9Wr52AR|T#Q+!nYm@NnSiz>9&80$&EY zr&+{?Urt%`AIDaY$n5T^?ti#HbPw>9cwX`R;PI!_raYf=kT=ac+&kX;y!Qidf8T6h zgYP5X7rwo|ZmHR+*TeJU{Nw#+`)6XMp7wVMj0!9bd=Ti9c5d3Lv`^Cp1?L9e4*n9% zNWU!oC9VU0&1Nyc=9uWX$?=}!#H6C6`;)#&N^vf5zUb_hd`9xJ&2zbDv*#}s^K=04J$ z>`rr^V3-lvUi`iyD!x@(s!QkBHt3YmgeQhWG&`uqC(`(6H2f2Mz|f0n<>zs&zhU~ix_ZBg38X|JU9M+AAn(%@~u z)xn*?4}w|gv(ne3f0eE|I_bX|=WtXw);WG~c$3ag+K}{HQmS*7^JeE3=P%B#$+qN^ zl21u?C#NH;lah0ii<2)+{(JI0$v3#`-A}vUa(DL}?>XC3q3_2-QjW%cJS*kOlp9lC zNZFFIGo`;b0s$mXx+4?eVmIX~AG^@Y!IO^bzTcSpgZH^xxX+;TY?<((yR< z;BiT3Buz@nNvck|AnCHCtCMa?x-)5Q(qlM}-c9-`>67HW$u`#j*IBN)u6wcjj&~1n zPj}CDuXNwz-r@e#eT3&Y&mhk{&%>VGo}*L7rd*P;B;|&bH7O6JY)ILZvK6Pxu9UB^ zBE7v1?;_s{-yx~}Qzxa)N!^tCMrtSjAvj?&{R{jT`*-^f3XDeOHV1m9O-#EXZF|~L z!D+!;gFAu;rKhHsrQec%XZqUo=hI(Ke>464^e@uCPyan#%kHGDLk)Fzoah+r80GLd zvz$53^PKlMpK<=|?3p|_`9f6B6Ulp$e@Z^tmExM|DswGxZ9?665y7qQ*WEkapSbtA z5AgKx9Pa7oIoad#1hFCoo?6egl-()Qz4N?xdY|+j?mN+Urf<6MYUF*h?=_z{_3YG@ zsqdvG`e*o8`#|cP(@+#fq$RHM{zIyq*U^op4o)ddsZ6;&<$;v< zk@vpdnuhxp2U5Ba|Hc~WaqA5Yzv8uXvGu z6{2poBZ8o_0%yr0oa3vUYn+cbH#%Q(Zgswg73q?km^{z5*!7$1aQATcx$Z}BUjNJe zoBLGcy~H!uv)%KvCy;VsN+ZseOq?Z6-h+IjeM@~W`F{4DoSKt*6;8X`QXfuzBK7&y zEvfIMew_Ms>QAY?{Kxox{{Cs+v~g)O({4(8FzxfS1N1$6Yw$ko+0TMUr4LA-lAe=Z zlKu$l2Fb7Oq%{KuB8H`oXC0dz+Z=lw-#GR;x+V2aIx4AO(h#i4#H8}1P0sDkvB`zW z*C*ef+|AX?HPkg0=g>me2G=vLf$r1YOWd!z?VjidiDFyC>$Q+#e;x^I*(-#5p1g>RmJvHv#zqyEqQodT(W@%pa)D)0+- ztuJj>+IeYrr>#xfkk$>AQ-c`Z3-(O!o8CV?kbYYF==90y1vrDM(l5lCtWIxaJj;xI zaCp){oSu&)eT@5v$VCi&*%oyo_#a&ZmabRo-!%roRkpG(F;;8OSwAbrj&oCJel%#$|m1--`BnaQ+=stre2x4 zO5e9Z{~6e~SNI?Izu^DT|GU3OU^1?iO^9Jg+KjZ4w0UVu(ymQgnRZv&I-Eiq(_Y1@ ze3xbq7N*zm^whMvPTDR&H;3CX#&MV9pN?x*m6Z?mEgn&V7OVGWXT)JKguWAI3@gvinW<`|i)&ojnJ8{^~gtRqyeh z=AGd!^Un8P>b=@~llKnq{oW_MoqXMVHs6sxkMA^`rDeYPzDu#EZ}Q#YyWjT&uBLrb zPfZ<}IzRQA)R%C57>et`h5oDj8~iWgp5VYhN+2C4)D3|*0|{yVv{GDM*Q7m?wi(yE zooSySwx83w1P=+G9CQV@Ymy#J z>f=nsPI=0yC7+hOFnLpQ0|9k$P zfxdzMfk5CiL@_x~fHSKqaADx)!0JF_;PBu;oVAYxKMwvHoSdGYeogwV>08pba-ABD zJ>SD|sH4Vlvty^@*reQ~RY|*&`a6r9_d54Dha}HJZM~HI|Jr-|_^#*v|NB#|TD5A` zs!_36wQ6`@U%x+}MHi#6Sm|OhR7S&MD28FO6oz$iP)tp&ghgdE45=_I7Q<*5LRgfB zIDYr{Ym;&u$Jh7!Ja81`D+5~N?HiJrg zop!5sm-Y{VMBmf48y^@Q%y{!8bBsCHyxV*g3^Bqw!@9v*U{zYLSU+1GZIc@^&R%Tq zw4)st47$Qu=WKGSowuBN=W}PD^Rp90#~4PpPIJq=&7hpGy>@wF_kMplEo52}jcT)|c|F zAC2sYd>q*u2_>`*rSsqCN@Y?VZ!St6Ex#`>R!RwK%uyfYM1H7#%6INy_B4l6b+0hz z)9>CgzcvSf)v`Hr9qsJ7^SqhiYr+S^p_H~l=dn0TGo-mvsysz5mX~PF#sD+f zoM=u5H>@^0I6a*tXSQ>#v&7NBGPk;`+zsw@Z>#sV_nG(4;FqVh4Ponqb|_o5x4=Ff2 z+rf+XhIwJ{6z?YQ9)8Cs-Z_4jf1m$UxHh~m9HL%b6j>Zu9jOe?QD)mv9se9HNzz1E zO`dX-QlvbjbOt5$S5HtEtM{vAFq-4Q8k#mrdyI2arR~rhJ))1JS8U}r)N#kpGR~nt zUj>8t)Mzr=n3qtk^2|HTAI)FPXg>MP)@@cXUAvpz%TBOm`#$?Yd!7BPJ=huUSk9@= z6V6l47QRW?J%v+rK6w94x8D86oe1X7^5*g#z5qS7=YC)5=lgeatN-c8ga?G@g%^aE zhSyMu`$iHYIwxgiq&)HhJ+ZCmiNmCmB#%nAN!l!Jm)?_3mdDURX3*8&2G8!5r+`ed zmFtzym9JrQozyGTYq;}^)Zf&0TC6ruyPdnTOna2h*iTQ=ZTQS;eS`io6ML1{K(o51n z`9}F;d505pth3-mY5vx5U3dvtjQ_Z(Z783A?v(l{Ny>QjHMLfK53IFVTdi&7Z8gIj z`WOR@=IJ=`0_?BQBzjZM7!aS>W>u`y0EhbEZ=ULeHi8 z-r}z0&188Cy~n-R;G41G-eEnwmGiZj-WMuqEA|u*k!DI)@mY1bP<~0iQkhTJ+pY9c z2dh54`zqMOU0Rv;w)VO9tM<9sZ1%D~vKpy4<#r8Kzo(N-y3nMp1Rz#i+o7f4`pMkBMczs;4CA}YU+KR> zFNz8G3@5_N(_nw&K+pW}nzkW}e>%v0<)7s!rIRugJa)IbS{-azFpUx`j!yWPeUdZ6 zIoqAdlb`C(@iQZ#hPGn&_0@FTP*dAb9zP>rDv~~szL2`|vj)n;Ws`G0TV5uwk*@}= zI@&p!rMKtp-3^~EaTRa8cdhrH7w7w+f?NDz|9<~TzXEjAD||wDVt7V)Zumx&gS*1T z^q^Ai*puO>!_RSEcW_=m1%d8}{KPkCCq92$skfv_IWU*qQb=wOTC?S+{M%yVO`s(bBYsw8yng+7@_zl+kGZW}RcN;>7Q>yE~Gz2j)K7 zo8%qi5Ar{cG{bG$2~%jaJV_2Pb11Xr`%jdzq>J>$C>UQ@J?N67LG-tPiL0n;+v$}x zPOVetd?WDi#7GwPsa+_EkF;1WleemM>W_M~5xnt*>>%$3 z((0})*H&ux!cu#KIik#?%ook8=+jSFr^28wbefzhcZ<8-t#)hNTDOk++2A(9;P$vp z?mjp8t?x%dMeRhtoo_w_@4Md~3bu-OPjHvH>)ZnGAKuBZq&8Hj&Eaz*KLo$Oq@C!u zHBv48wq9!Bx$Wi_G)eo=1rGAAqvSPoNW(})(`h!gqC(8GmRJEcjd70rB=firYv74Q zkwV%0Xaimt1&>ux$pRkxBpvrXZLf9!9Bk@A-~CA6NM+qaN7={EK1h9yGNa8~I4Nt; zjkcNXtUh$a5!M*+peqFIv$oYgL`x@JacR0NA734P$u88y`)OMJQ5a`EssVyoTKDZ2aD;d z&!Q5pLOFR~+ogR4-|A%?g|ZZFo&{gIkehJO)Hp}yIWwHC?oMh-$cyoN`8pVPRiq*k zYHAnC;OCzzrAY~@rjA!Xf(c!xb%8;z)wk&*jd}2d#a1bJsNF3aDAkaw;mN5$IpHa7TH-IK*zjMUMW8&@0UYLloGAP zD6vYM60h`Eg6gxHe$i;gTJLc3KX;m)Q>iZ{?kq6i8NM0`#YTyHu1X8EG5S1Xk$4W8B4RO!+B^X5#d z#9(kkG3RzN-EVK?VDPh~C{eFprV8$+gZGA;pQ26Cvb1b12W~z`+YQI`TsKx6D<&!mtvt;d1vz$|4^|_C%T@`?&r5mXxSa1HX#j zB}GdyQmhmw#Y_FAt#SvR$O3fI&1j^zsteU_T5oNhc869Bb{L?$`pNouDpwsU;yxo5 zl{en(Z%U?Sjx1&xkJ(S6p1ojix8J0meP}mw1HZR_vO`Wsr<>E;>F*?hqLZo08t>k7Qk;>fhT~9M z)1669hLh<`cOG%d;U<;Ni&Wh=sJZn{gVP9t*h6*P$LT!i40aVxXnGjqMe~lpu|xqBX6THG%MGDU!ze{Pe4aK-8$QvWX%Ml{A3Lg9iq|x5>(X5>F&fi z$MK$C0)-zM`7}*@0*PJNv_a=6u zaU78P%Bwi}&nnwMCwr74wH$r5CpBuc7Sz?(%(JYiR;HD2bpS!11cSL04s$%uU<%*% zYp0WIpcnb752*rWVTHf;9C&9gT zOW%N9f{u8d(pK%F#;TIKNqt$}N9Ws!?rK@n;HC4e=dGFcRcMxL?LGD-yzMV}t8Lwr zP+TvEo2_@ia*t#>)%0LUKxIr-(D9ERYeJ|b)`I4en;L7>Kdd- z%1j)Mc2v^2>Jpy)Yw8#32yMJ}iM9YX)ykaW|pYUF{e8S>apxwtUx`DA9X2fr%$77b!O=yOeqSw#WE> zKhn={b!MY(FZD-*WakF|eM8H$2}#%TgwLY_e=h$h8%i2HWsJH&{gqF+%Brw3xG$TW zZO&KDwP=Sw(Up$%0(AEd+_D`UJnYZp2|R@2QxEU%ix!dwy1OI1B)k$Vw=3K(QWRN+ z23;4_x2Bdexmuvz&hkvcyJyL*sFZo&tNFeMXJ#e+6&xzy!5F23A&u4*y>a2kLb~( z=oFrwqL0*5VYq2}I^Iv9=>!THA3$m^-r-HCq}%m(?9c3X;M}9V3Eo3OmyLnNMbH6n zfd_30{`-{n0zWy@`{1Qs@~QHBawZtyeiYarId8|JF-=3cxR>r7r>WZMbgNsmnfg`w z{dyli37^9Xe;#f|xq5_p{c_}s$ZufK_JR}kl|uND`Eb|$%I#{gx{Q-l!?_KCX!G@u z5oZiHjx#rb2>BeD?M1C=gI+WkOk&X0Ka{JLe7f_YY)r-`8b+P%dxzM^F z^zpW}2~}8jU8=|g&dHtJ&#m5D+>2ZNQhL^=@D@(skMQ>kBf%fdSw~i;k2XmAT;H#k z8@bkXRJ_~pj22nTPz%>u>pAbwgZ5vyYEg1OL1k+K;e_lcJKB!1W9>LQ9(^alPPCKk zWLvT|+rp(uvCrVQ7odw4Q6V0{GhOFCiAMSY&*n{Bnh(LrU%TIPcS2rAubbB!{&qYX zitJgai=(~My>xVl3%rZH9Pb*`xm#hr_fl;iqQ*b&ZGzowfd{_@n`%I(_}1Icvufve z_Ivp8{;~dG{{&wHx1H>t>ZkeVpoh&siM`Ul*1w7Ba2Kx1a=+An#DBtn+OP7r(dBn? zQ$IzS-Rn1_b94xI4aebH9EWcwh0Smn{dpV=X9{Y1R`_ym+4bQ9bdY=SF-pR#d8!-3 zl`!Jqyw~w`KM#L{?(++npi?9ko#dFvph$8=#lIO5NsXLIwV8%?JqyiYZX`c)Tjb8j zBI?0P5W;$p=JS!Qk=M~2KZtx1`4Sv-AUJ_&4DCae41~4^1ND-QmIi_jPLd4C2N#T$ z&XOjB2rj}=z6vaG3y#*^_$m*gCqIfSw;65!6{!Y?;v?xZxWo_A&**N^xD|asn~5-2 z1@@T22|WV`EJMCfz62gS2NXI_z5^_AKRV|cs>f6EbNJKMC^_$=h3uBUqdNXdHSePI zRE|;-lp)HA+z(GVMLA6wuS`PenWPD`q?@<$_BK_O0`Pe0{^Jyp4L+D>eU9dQQeIb)Q!`* z?RvFdqt}9k>-7e`QQwW@(WLLA@*JdUMH$ifez8=qc%#3Ofd7|-lPTdvS%ydV9SPGM zXQUbF2p!*G=l1ih>*kWv_ zch?xTAf9@o!Ds|~?)ekLj4^*l=m}<`nS_!XAa%?1%#=fTJsoE|!^}kC%`&si95dIP zgW{QQ7Jz&fnnh+YeQB9M^kw+2<>m%59hG3KE#`Jqwi-OxI^5(2f%f;9P3Arnu!CmE zio(B-v0`y%<8kp5(0r4uWL#Pe{Nq_EIB==fI4jLc2aRTc2&Y?F=-N3}E}STjYFR+9 zT4)uaMzx`q#d#yVyWsUZaBhc0WVGLG}{Db%RopChpB+%CH;rYJ7Q*6ugGI%nV@C+WX)>&^^4dCQB z{FhYwGW%vc)@MLy&*MpExNF>9_RJ5?g{&W5g z9EuoRqcK$2o5O1bc4!VKP&cPWE<-nP8RmOv;`jKlmV5ITn!q#lN(tZ)9b*6K%b2)Ewx0C5!>;_n2jQ6njsJGF} z#ywjNH~J#nCQwwHS};cxb^RK&pcCbZ6K;=%X6}wkkmo=K%-HL=gK$GYZl3GE3?&e zv=!8_z!jfM*5*v^Z3kAn@(eC}JPUVdWcTqA}BWz<7kJ z^R_X9S`pyXz{|9qBDjI-K8nx0)xE&G-Y@t0&S@P4pNfTFFO%ZrYvhZRdzB8=<1{JotM(9OF)}tUJX|8`G2yy{V&ZH8U8C0lSR_p~UoG4fvUyGuHR z_VG_Vzj=~$Dfe^nEQrFTkVtMOHb>tCUBSCzPi-&)c}CJC%Cw>Q~BM z^nibo#OkWXfe8{wz9p&2{}vZ4AsOq)DD14WS}|~q0l{{zerB! z6a9NV$~ciemS;RncY4iGP#-g4w?%e)w+HH+N)qQXRNWdX*16tn?@8}~*Bumoil5yD^C^TBQ+Pf^}M_&@`s3#8Yiw{gFAlk2-gzFB^RG(ulG zx~u2ukI|X;k+oSzZ>%=1BVTa8c@{2qiM1L%^<}FLU9XLOg6-R<*^}(+>^orIkJ1aK zp>MBpp2ZQJ?k;pINFaXa+TI6VA3VAj{kwznRnz9H?N~&HYJzvZ*O>&*BmN6$aG{zG!n=e(>*eDK#M^;qyzDjxXtI6ZlK zN7F=6nP9($PTk&3z;(PwaDspje1+;C_Qq06W`Ooz=a~<{!+zQS*dIvx>8J1zINn(> zmdoHl*TIBti`;=yxD>~(l)msdXYLsiAX`aA?TEY^sRudlj(mfj{!QSa}e5TH+ab@(2+1>GD}P7w3YhFBW-+Yvp{> zWeeoH(Os5-t5;LipG1dxPTnHFBEKo`1Y0+tJA92-dO$uXw?+T$D)99&+>39>fOc1h zlB1ic-U!}Z54zo{evVhs0rhhr$*3{fL@??V+HKl>+Ir!!G@#-3)@4#U7ow@$qdx>X z+$uceUtyjTjCmwsx0^p(!|frY2S)gd{0C7jx{+Fpz;^_vZffZ(anb~7F)Sipo+a1w z_AgW(S2mE(>Z*OGKV_s@HnsU9=TqlfXRTKjzKAN&QE=eLq}9p?N^p;lRiD;k(XV@2 zI;d(DO8HRx6nnY-2#DbX{&z>Y=W!|?b=wI){ao(~Z#5k6NAD;;nHD~o4BRZyuR4mp zF^1eyt^A7evih4g+sH5{}kz?JS|jR4Oqck0RYr1)2(--rya)KSc*^xzGz z;QOBhm&guGLMxkxzj6#Pz&v}x1 z@K4;@qufhDDo?v_xNo~dV9{54h29+^7jgnsd<+W0!(?C&;xtVNpBH`z6<~9?d*mpP zRZirp$SaYz(KtE^|Gu{rIQX|ncc2?JN?+oojFIP~9 zdlh}GTHT=z(oVurnumI~i@fY`^qf)pKlGLQXZUOqS)G0O5R1$Y&4FO&Io1nSjdcN- zwO|^0?kbQ<2j8FzT}z&=0!Q~t5MnYZ!tC&!KO==6g4rIU3?s>RnsPDj^EJvW`&zpc)%;^>*e-J6x|@kgy9qsG z4=Ugw5`^dSj?HhKO0(R9u{l3yGBUH-Rze0T^bq81-Fl+#h@NhjjdUr2R+T$`^C z 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 CITy$P literal 0 HcmV?d00001 From b26841ff21b6dee6889d879f4bf7d2883585b3ef Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 00:40:13 -0500 Subject: [PATCH 059/281] readd this and this --- code/game/turfs/turf.dm | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 0d676cd092d3..4f75d24c115c 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -19,10 +19,17 @@ GLOBAL_LIST_EMPTY(station_turfs) var/initial_temperature = T20C var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to - + /// If there's a tile over a basic floor that can be ripped out + var/overfloor_placed = FALSE + /// How accessible underfloor pieces such as wires, pipes, etc are on this turf. Can be HIDDEN, VISIBLE, or INTERACTABLE. + var/underfloor_accessibility = UNDERFLOOR_HIDDEN var/blocks_air = FALSE - + ///Bool, whether this turf will always be illuminated no matter what area it is in + ///Makes it look blue, be warned + var/space_lit = FALSE + var/force_no_gravity = TRUE flags_1 = CAN_BE_DIRTY_1 + var/list/image/blueprint_data //for the station blueprints, images of objects eg: pipes From c1d9fd4e1a9bedc9b4881fb6f5fda540dff5d361 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 00:51:21 -0500 Subject: [PATCH 060/281] pupdate yeah --- code/game/turfs/turf.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 4f75d24c115c..c686c4dc7f79 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -29,6 +29,8 @@ GLOBAL_LIST_EMPTY(station_turfs) var/space_lit = FALSE var/force_no_gravity = TRUE flags_1 = CAN_BE_DIRTY_1 + /// If there is a lattice underneat this turf. Used for the attempt_lattice_replacement proc to determine if it should place lattice. + var/lattice_underneath = TRUE var/list/image/blueprint_data //for the station blueprints, images of objects eg: pipes From 2a00b4d710f2459e3a3bdcd96119c56451d57c09 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 00:59:00 -0500 Subject: [PATCH 061/281] slow update sucks --- code/_globalvars/bitfields.dm | 9 +++++++++ code/game/turfs/turf.dm | 3 +++ 2 files changed, 12 insertions(+) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 2123f6a32d20..b098b265c9c0 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -235,3 +235,12 @@ DEFINE_BITFIELD(vis_flags, list( "VIS_UNDERLAY" = VIS_UNDERLAY, "VIS_HIDE" = VIS_HIDE, )) +DEFINE_BITFIELD(turf_flags, list( + "NO_LAVA_GEN" = NO_LAVA_GEN, + "NO_RUINS" = NO_RUINS, + "NO_RUST" = NO_RUST, + "NOJAUNT" = NOJAUNT, + "IS_SOLID" = IS_SOLID, + "UNUSED_RESERVATION_TURF" = UNUSED_RESERVATION_TURF, + "RESERVATION_TURF" = RESERVATION_TURF, +)) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index c686c4dc7f79..4327d5153392 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -671,3 +671,6 @@ GLOBAL_LIST_EMPTY(station_turfs) /// Called when attempting to set fire to a turf /turf/proc/IgniteTurf(power, fire_color="red") return +/// Returns whether it is safe for an atom to move across this turf +/turf/proc/can_cross_safely(atom/movable/crossing) + return TRUE From 7ef5c075acdc9c8b8fd6bfeb0247180b5587868a Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 01:06:37 -0500 Subject: [PATCH 062/281] why no work angy --- code/game/turfs/turf.dm | 3 +- .../space_management/space_reservation.dm | 116 ++++++++++++++++++ .../mapping/space_management/traits.dm | 115 ----------------- 3 files changed, 118 insertions(+), 116 deletions(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 4327d5153392..5a973a320f99 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -31,7 +31,8 @@ GLOBAL_LIST_EMPTY(station_turfs) flags_1 = CAN_BE_DIRTY_1 /// If there is a lattice underneat this turf. Used for the attempt_lattice_replacement proc to determine if it should place lattice. var/lattice_underneath = TRUE - + /// Turf bitflags, see code/__DEFINES/flags.dm + var/turf_flags = NONE var/list/image/blueprint_data //for the station blueprints, images of objects eg: pipes diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index cfe9b5043b89..855b14e0e4b7 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -168,3 +168,119 @@ Release() LAZYREMOVE(SSmapping.turf_reservations, src) return ..() + +// Look up levels[z].traits[trait] +/datum/controller/subsystem/mapping/proc/level_trait(z, trait) + if (!isnum(z) || z < 1) + return null + if (z_list) + if (z > z_list.len) + stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], z_list.len = [z_list.len]") + return list() + var/datum/space_level/S = get_level(z) + return S.traits[trait] + else + var/list/default = DEFAULT_MAP_TRAITS + if (z > default.len) + stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], default.len = [default.len]") + return list() + return default[z][DL_TRAITS][trait] + +// Check if levels[z] has any of the specified traits +/datum/controller/subsystem/mapping/proc/level_has_any_trait(z, list/traits) + for (var/I in traits) + if (level_trait(z, I)) + return TRUE + return FALSE + +// Check if levels[z] has all of the specified traits +/datum/controller/subsystem/mapping/proc/level_has_all_traits(z, list/traits) + for (var/I in traits) + if (!level_trait(z, I)) + return FALSE + return TRUE + +// Get a list of all z which have the specified trait +/datum/controller/subsystem/mapping/proc/levels_by_trait(trait) + . = list() + var/list/_z_list = z_list + for(var/A in _z_list) + var/datum/space_level/S = A + if (S.traits[trait]) + . += S.z_value + +// Get a list of all z which have any of the specified traits +/datum/controller/subsystem/mapping/proc/levels_by_any_trait(list/traits) + . = list() + var/list/_z_list = z_list + for(var/A in _z_list) + var/datum/space_level/S = A + for (var/trait in traits) + if (S.traits[trait]) + . += S.z_value + break + +/// Calculates the effective bounds information for the given turf. Returns a list of the information, or null if not applicable. +/datum/turf_reservation/proc/calculate_turf_bounds_information(turf/target) + for(var/z_idx in 1 to z_size) + var/turf/bottom_left = bottom_left_turfs[z_idx] + var/turf/top_right = top_right_turfs[z_idx] + var/bl_x = bottom_left.x + var/bl_y = bottom_left.y + var/tr_x = top_right.x + var/tr_y = top_right.y + + if(target.x < bl_x) + continue + + if(target.y < bl_y) + continue + + if(target.x > tr_x) + continue + + if(target.y > tr_y) + continue + + var/list/return_information = list() + return_information["z_idx"] = z_idx + return_information["offset_x"] = target.x - bl_x + return_information["offset_y"] = target.y - bl_y + return return_information + return null + +/// Gets the turf below the given target. Returns null if there is no turf below the target +/datum/turf_reservation/proc/get_turf_below(turf/target) + var/list/bounds_info = calculate_turf_bounds_information(target) + if(isnull(bounds_info)) + return null + + var/z_idx = bounds_info["z_idx"] + // check what z level, if its the max, then there is no turf below + if(z_idx == z_size) + return null + + var/offset_x = bounds_info["offset_x"] + var/offset_y = bounds_info["offset_y"] + var/turf/bottom_left = bottom_left_turfs[z_idx + 1] + return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) + +/// Gets the turf above the given target. Returns null if there is no turf above the target +/datum/turf_reservation/proc/get_turf_above(turf/target) + var/list/bounds_info = calculate_turf_bounds_information(target) + if(isnull(bounds_info)) + return null + + var/z_idx = bounds_info["z_idx"] + // check what z level, if its the min, then there is no turf above + if(z_idx == 1) + return null + + var/offset_x = bounds_info["offset_x"] + var/offset_y = bounds_info["offset_y"] + var/turf/bottom_left = bottom_left_turfs[z_idx - 1] + return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) +// Prefer not to use this one too often +/datum/controller/subsystem/mapping/proc/get_station_center() + var/station_z = levels_by_trait(ZTRAIT_STATION)[1] + return locate(round(world.maxx * 0.5, 1), round(world.maxy * 0.5, 1), station_z) diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index 7545b2508a95..e69de29bb2d1 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -1,115 +0,0 @@ -// Look up levels[z].traits[trait] -/datum/controller/subsystem/mapping/proc/level_trait(z, trait) - if (!isnum(z) || z < 1) - return null - if (z_list) - if (z > z_list.len) - stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], z_list.len = [z_list.len]") - return list() - var/datum/space_level/S = get_level(z) - return S.traits[trait] - else - var/list/default = DEFAULT_MAP_TRAITS - if (z > default.len) - stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], default.len = [default.len]") - return list() - return default[z][DL_TRAITS][trait] - -// Check if levels[z] has any of the specified traits -/datum/controller/subsystem/mapping/proc/level_has_any_trait(z, list/traits) - for (var/I in traits) - if (level_trait(z, I)) - return TRUE - return FALSE - -// Check if levels[z] has all of the specified traits -/datum/controller/subsystem/mapping/proc/level_has_all_traits(z, list/traits) - for (var/I in traits) - if (!level_trait(z, I)) - return FALSE - return TRUE - -// Get a list of all z which have the specified trait -/datum/controller/subsystem/mapping/proc/levels_by_trait(trait) - . = list() - var/list/_z_list = z_list - for(var/A in _z_list) - var/datum/space_level/S = A - if (S.traits[trait]) - . += S.z_value - -// Get a list of all z which have any of the specified traits -/datum/controller/subsystem/mapping/proc/levels_by_any_trait(list/traits) - . = list() - var/list/_z_list = z_list - for(var/A in _z_list) - var/datum/space_level/S = A - for (var/trait in traits) - if (S.traits[trait]) - . += S.z_value - break - -/// Calculates the effective bounds information for the given turf. Returns a list of the information, or null if not applicable. -/datum/turf_reservation/proc/calculate_turf_bounds_information(turf/target) - for(var/z_idx in 1 to z_size) - var/turf/bottom_left = bottom_left_turfs[z_idx] - var/turf/top_right = top_right_turfs[z_idx] - var/bl_x = bottom_left.x - var/bl_y = bottom_left.y - var/tr_x = top_right.x - var/tr_y = top_right.y - - if(target.x < bl_x) - continue - - if(target.y < bl_y) - continue - - if(target.x > tr_x) - continue - - if(target.y > tr_y) - continue - - var/list/return_information = list() - return_information["z_idx"] = z_idx - return_information["offset_x"] = target.x - bl_x - return_information["offset_y"] = target.y - bl_y - return return_information - return null - -/// Gets the turf below the given target. Returns null if there is no turf below the target -/datum/turf_reservation/proc/get_turf_below(turf/target) - var/list/bounds_info = calculate_turf_bounds_information(target) - if(isnull(bounds_info)) - return null - - var/z_idx = bounds_info["z_idx"] - // check what z level, if its the max, then there is no turf below - if(z_idx == z_size) - return null - - var/offset_x = bounds_info["offset_x"] - var/offset_y = bounds_info["offset_y"] - var/turf/bottom_left = bottom_left_turfs[z_idx + 1] - return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) - -/// Gets the turf above the given target. Returns null if there is no turf above the target -/datum/turf_reservation/proc/get_turf_above(turf/target) - var/list/bounds_info = calculate_turf_bounds_information(target) - if(isnull(bounds_info)) - return null - - var/z_idx = bounds_info["z_idx"] - // check what z level, if its the min, then there is no turf above - if(z_idx == 1) - return null - - var/offset_x = bounds_info["offset_x"] - var/offset_y = bounds_info["offset_y"] - var/turf/bottom_left = bottom_left_turfs[z_idx - 1] - return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) -// Prefer not to use this one too often -/datum/controller/subsystem/mapping/proc/get_station_center() - var/station_z = levels_by_trait(ZTRAIT_STATION)[1] - return locate(round(world.maxx * 0.5, 1), round(world.maxy * 0.5, 1), station_z) From 567ef0d75a7742d55227127158c93af8b2e38baa Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 01:16:26 -0500 Subject: [PATCH 063/281] weird errors shit sucks --- code/game/turfs/turf.dm | 9 +- .../space_management/space_reservation.dm | 116 ------------------ .../mapping/space_management/traits.dm | 115 +++++++++++++++++ 3 files changed, 120 insertions(+), 120 deletions(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 5a973a320f99..e0ed6c8de25e 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -104,11 +104,11 @@ GLOBAL_LIST_EMPTY(station_turfs) if (light_system == STATIC_LIGHT && light_power && light_range) update_light() - var/turf/T = SSmapping.get_turf_above(src) + var/turf/T = GET_TURF_ABOVE(src) if(T) T.multiz_turf_new(src, DOWN) SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, DOWN) - T = SSmapping.get_turf_below(src) + T = GET_TURF_BELOW(src) if(T) T.multiz_turf_new(src, UP) SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, UP) @@ -143,10 +143,10 @@ GLOBAL_LIST_EMPTY(station_turfs) if(!changing_turf) stack_trace("Incorrect turf deletion") changing_turf = FALSE - var/turf/T = SSmapping.get_turf_above(src) + var/turf/T = GET_TURN_ABOVE(src) if(T) T.multiz_turf_del(src, DOWN) - T = SSmapping.get_turf_below(src) + T = GET_TURF_BELOW(src) if(T) T.multiz_turf_del(src, UP) if(force) @@ -675,3 +675,4 @@ GLOBAL_LIST_EMPTY(station_turfs) /// Returns whether it is safe for an atom to move across this turf /turf/proc/can_cross_safely(atom/movable/crossing) return TRUE + diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index 855b14e0e4b7..cfe9b5043b89 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -168,119 +168,3 @@ Release() LAZYREMOVE(SSmapping.turf_reservations, src) return ..() - -// Look up levels[z].traits[trait] -/datum/controller/subsystem/mapping/proc/level_trait(z, trait) - if (!isnum(z) || z < 1) - return null - if (z_list) - if (z > z_list.len) - stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], z_list.len = [z_list.len]") - return list() - var/datum/space_level/S = get_level(z) - return S.traits[trait] - else - var/list/default = DEFAULT_MAP_TRAITS - if (z > default.len) - stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], default.len = [default.len]") - return list() - return default[z][DL_TRAITS][trait] - -// Check if levels[z] has any of the specified traits -/datum/controller/subsystem/mapping/proc/level_has_any_trait(z, list/traits) - for (var/I in traits) - if (level_trait(z, I)) - return TRUE - return FALSE - -// Check if levels[z] has all of the specified traits -/datum/controller/subsystem/mapping/proc/level_has_all_traits(z, list/traits) - for (var/I in traits) - if (!level_trait(z, I)) - return FALSE - return TRUE - -// Get a list of all z which have the specified trait -/datum/controller/subsystem/mapping/proc/levels_by_trait(trait) - . = list() - var/list/_z_list = z_list - for(var/A in _z_list) - var/datum/space_level/S = A - if (S.traits[trait]) - . += S.z_value - -// Get a list of all z which have any of the specified traits -/datum/controller/subsystem/mapping/proc/levels_by_any_trait(list/traits) - . = list() - var/list/_z_list = z_list - for(var/A in _z_list) - var/datum/space_level/S = A - for (var/trait in traits) - if (S.traits[trait]) - . += S.z_value - break - -/// Calculates the effective bounds information for the given turf. Returns a list of the information, or null if not applicable. -/datum/turf_reservation/proc/calculate_turf_bounds_information(turf/target) - for(var/z_idx in 1 to z_size) - var/turf/bottom_left = bottom_left_turfs[z_idx] - var/turf/top_right = top_right_turfs[z_idx] - var/bl_x = bottom_left.x - var/bl_y = bottom_left.y - var/tr_x = top_right.x - var/tr_y = top_right.y - - if(target.x < bl_x) - continue - - if(target.y < bl_y) - continue - - if(target.x > tr_x) - continue - - if(target.y > tr_y) - continue - - var/list/return_information = list() - return_information["z_idx"] = z_idx - return_information["offset_x"] = target.x - bl_x - return_information["offset_y"] = target.y - bl_y - return return_information - return null - -/// Gets the turf below the given target. Returns null if there is no turf below the target -/datum/turf_reservation/proc/get_turf_below(turf/target) - var/list/bounds_info = calculate_turf_bounds_information(target) - if(isnull(bounds_info)) - return null - - var/z_idx = bounds_info["z_idx"] - // check what z level, if its the max, then there is no turf below - if(z_idx == z_size) - return null - - var/offset_x = bounds_info["offset_x"] - var/offset_y = bounds_info["offset_y"] - var/turf/bottom_left = bottom_left_turfs[z_idx + 1] - return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) - -/// Gets the turf above the given target. Returns null if there is no turf above the target -/datum/turf_reservation/proc/get_turf_above(turf/target) - var/list/bounds_info = calculate_turf_bounds_information(target) - if(isnull(bounds_info)) - return null - - var/z_idx = bounds_info["z_idx"] - // check what z level, if its the min, then there is no turf above - if(z_idx == 1) - return null - - var/offset_x = bounds_info["offset_x"] - var/offset_y = bounds_info["offset_y"] - var/turf/bottom_left = bottom_left_turfs[z_idx - 1] - return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) -// Prefer not to use this one too often -/datum/controller/subsystem/mapping/proc/get_station_center() - var/station_z = levels_by_trait(ZTRAIT_STATION)[1] - return locate(round(world.maxx * 0.5, 1), round(world.maxy * 0.5, 1), station_z) diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index e69de29bb2d1..7545b2508a95 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -0,0 +1,115 @@ +// Look up levels[z].traits[trait] +/datum/controller/subsystem/mapping/proc/level_trait(z, trait) + if (!isnum(z) || z < 1) + return null + if (z_list) + if (z > z_list.len) + stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], z_list.len = [z_list.len]") + return list() + var/datum/space_level/S = get_level(z) + return S.traits[trait] + else + var/list/default = DEFAULT_MAP_TRAITS + if (z > default.len) + stack_trace("Unmanaged z-level [z]! maxz = [world.maxz], default.len = [default.len]") + return list() + return default[z][DL_TRAITS][trait] + +// Check if levels[z] has any of the specified traits +/datum/controller/subsystem/mapping/proc/level_has_any_trait(z, list/traits) + for (var/I in traits) + if (level_trait(z, I)) + return TRUE + return FALSE + +// Check if levels[z] has all of the specified traits +/datum/controller/subsystem/mapping/proc/level_has_all_traits(z, list/traits) + for (var/I in traits) + if (!level_trait(z, I)) + return FALSE + return TRUE + +// Get a list of all z which have the specified trait +/datum/controller/subsystem/mapping/proc/levels_by_trait(trait) + . = list() + var/list/_z_list = z_list + for(var/A in _z_list) + var/datum/space_level/S = A + if (S.traits[trait]) + . += S.z_value + +// Get a list of all z which have any of the specified traits +/datum/controller/subsystem/mapping/proc/levels_by_any_trait(list/traits) + . = list() + var/list/_z_list = z_list + for(var/A in _z_list) + var/datum/space_level/S = A + for (var/trait in traits) + if (S.traits[trait]) + . += S.z_value + break + +/// Calculates the effective bounds information for the given turf. Returns a list of the information, or null if not applicable. +/datum/turf_reservation/proc/calculate_turf_bounds_information(turf/target) + for(var/z_idx in 1 to z_size) + var/turf/bottom_left = bottom_left_turfs[z_idx] + var/turf/top_right = top_right_turfs[z_idx] + var/bl_x = bottom_left.x + var/bl_y = bottom_left.y + var/tr_x = top_right.x + var/tr_y = top_right.y + + if(target.x < bl_x) + continue + + if(target.y < bl_y) + continue + + if(target.x > tr_x) + continue + + if(target.y > tr_y) + continue + + var/list/return_information = list() + return_information["z_idx"] = z_idx + return_information["offset_x"] = target.x - bl_x + return_information["offset_y"] = target.y - bl_y + return return_information + return null + +/// Gets the turf below the given target. Returns null if there is no turf below the target +/datum/turf_reservation/proc/get_turf_below(turf/target) + var/list/bounds_info = calculate_turf_bounds_information(target) + if(isnull(bounds_info)) + return null + + var/z_idx = bounds_info["z_idx"] + // check what z level, if its the max, then there is no turf below + if(z_idx == z_size) + return null + + var/offset_x = bounds_info["offset_x"] + var/offset_y = bounds_info["offset_y"] + var/turf/bottom_left = bottom_left_turfs[z_idx + 1] + return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) + +/// Gets the turf above the given target. Returns null if there is no turf above the target +/datum/turf_reservation/proc/get_turf_above(turf/target) + var/list/bounds_info = calculate_turf_bounds_information(target) + if(isnull(bounds_info)) + return null + + var/z_idx = bounds_info["z_idx"] + // check what z level, if its the min, then there is no turf above + if(z_idx == 1) + return null + + var/offset_x = bounds_info["offset_x"] + var/offset_y = bounds_info["offset_y"] + var/turf/bottom_left = bottom_left_turfs[z_idx - 1] + return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) +// Prefer not to use this one too often +/datum/controller/subsystem/mapping/proc/get_station_center() + var/station_z = levels_by_trait(ZTRAIT_STATION)[1] + return locate(round(world.maxx * 0.5, 1), round(world.maxy * 0.5, 1), station_z) From b82a6cc1aa2f78ec3fbf978a32a8e863aa59cf85 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 01:17:08 -0500 Subject: [PATCH 064/281] fixved it I can spell good --- code/game/turfs/turf.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index e0ed6c8de25e..9173c4486564 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -143,7 +143,7 @@ GLOBAL_LIST_EMPTY(station_turfs) if(!changing_turf) stack_trace("Incorrect turf deletion") changing_turf = FALSE - var/turf/T = GET_TURN_ABOVE(src) + var/turf/T = GET_TURF_ABOVE(src) if(T) T.multiz_turf_del(src, DOWN) T = GET_TURF_BELOW(src) From 0d2c511f79a9ff577738535399d30391a377f313 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 01:34:32 -0500 Subject: [PATCH 065/281] fix? POSSIBLY --- code/game/turfs/space/space.dm | 47 ++++++++++++++++++-------- code/modules/lighting/lighting_area.dm | 2 ++ 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index a69c134cff3f..fde2a8888224 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -83,30 +83,47 @@ GLOBAL_LIST_EMPTY(starlight) //This is used to optimize the map loader return +/** + * Space Initialize + * + * Doesn't call parent, see [/atom/proc/Initialize]. + * When adding new stuff to /atom/Initialize, /turf/Initialize, etc + * don't just add it here unless space actually needs it. + * + * There is a lot of work that is intentionally not done because it is not currently used. + * This includes stuff like smoothing, blocking camera visibility, etc. + * If you are facing some odd bug with specifically space, check if it's something that was + * intentionally ommitted from this implementation. + */ /turf/open/space/Initialize(mapload) SHOULD_CALL_PARENT(FALSE) - icon_state = SPACE_ICON_STATE - if(!space_gas) - space_gas = new air = space_gas - update_air_ref(0) - vis_contents.Cut() //removes inherited overlays - visibilityChanged() if (PERFORM_ALL_TESTS(focus_only/multiple_space_initialization)) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 - var/area/A = loc - if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) - add_overlay(/obj/effect/fullbright) - - if (light_system == STATIC_LIGHT && light_power && light_range) - update_light() - - if (opacity) - directional_opacity = ALL_CARDINALS + // We make the assumption that the space plane will never be blacklisted, as an optimization + if(SSmapping.max_plane_offset) + plane = PLANE_SPACE - (PLANE_RANGE * SSmapping.z_level_to_plane_offset[z]) + + var/area/our_area = loc + if(!our_area.area_has_base_lighting && space_lit) //Only provide your own lighting if the area doesn't for you + // Intentionally not add_overlay for performance reasons. + // add_overlay does a bunch of generic stuff, like creating a new list for overlays, + // queueing compile, cloning appearance, etc etc etc that is not necessary here. + overlays += GLOB.starlight_overlays[GET_TURF_PLANE_OFFSET(src) + 1] + + if (!mapload) + + if(SSmapping.max_plane_offset) + var/turf/T = GET_TURF_ABOVE(src) + if(T) + T.multiz_turf_new(src, DOWN) + T = GET_TURF_BELOW(src) + if(T) + T.multiz_turf_new(src, UP) return INITIALIZE_HINT_NORMAL diff --git a/code/modules/lighting/lighting_area.dm b/code/modules/lighting/lighting_area.dm index 58ee031d3281..76e13368a3d5 100644 --- a/code/modules/lighting/lighting_area.dm +++ b/code/modules/lighting/lighting_area.dm @@ -1,6 +1,8 @@ /area luminosity = TRUE var/dynamic_lighting = DYNAMIC_LIGHTING_ENABLED + ///Whether this area has a currently active base lighting, bool + var/area_has_base_lighting = FALSE /area/proc/set_dynamic_lighting(new_dynamic_lighting = DYNAMIC_LIGHTING_ENABLED) if (new_dynamic_lighting == dynamic_lighting) From ecaffbc8b7dd7dd8cbed7a89f389bb13fb867a94 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 01:37:43 -0500 Subject: [PATCH 066/281] nope wasnt this --- code/game/turfs/space/space.dm | 47 ++++++++------------------ code/modules/lighting/lighting_area.dm | 2 -- 2 files changed, 15 insertions(+), 34 deletions(-) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index fde2a8888224..a69c134cff3f 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -83,47 +83,30 @@ GLOBAL_LIST_EMPTY(starlight) //This is used to optimize the map loader return -/** - * Space Initialize - * - * Doesn't call parent, see [/atom/proc/Initialize]. - * When adding new stuff to /atom/Initialize, /turf/Initialize, etc - * don't just add it here unless space actually needs it. - * - * There is a lot of work that is intentionally not done because it is not currently used. - * This includes stuff like smoothing, blocking camera visibility, etc. - * If you are facing some odd bug with specifically space, check if it's something that was - * intentionally ommitted from this implementation. - */ /turf/open/space/Initialize(mapload) SHOULD_CALL_PARENT(FALSE) + icon_state = SPACE_ICON_STATE + if(!space_gas) + space_gas = new air = space_gas + update_air_ref(0) + vis_contents.Cut() //removes inherited overlays + visibilityChanged() if (PERFORM_ALL_TESTS(focus_only/multiple_space_initialization)) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 - // We make the assumption that the space plane will never be blacklisted, as an optimization - if(SSmapping.max_plane_offset) - plane = PLANE_SPACE - (PLANE_RANGE * SSmapping.z_level_to_plane_offset[z]) - - var/area/our_area = loc - if(!our_area.area_has_base_lighting && space_lit) //Only provide your own lighting if the area doesn't for you - // Intentionally not add_overlay for performance reasons. - // add_overlay does a bunch of generic stuff, like creating a new list for overlays, - // queueing compile, cloning appearance, etc etc etc that is not necessary here. - overlays += GLOB.starlight_overlays[GET_TURF_PLANE_OFFSET(src) + 1] - - if (!mapload) - - if(SSmapping.max_plane_offset) - var/turf/T = GET_TURF_ABOVE(src) - if(T) - T.multiz_turf_new(src, DOWN) - T = GET_TURF_BELOW(src) - if(T) - T.multiz_turf_new(src, UP) + var/area/A = loc + if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) + add_overlay(/obj/effect/fullbright) + + if (light_system == STATIC_LIGHT && light_power && light_range) + update_light() + + if (opacity) + directional_opacity = ALL_CARDINALS return INITIALIZE_HINT_NORMAL diff --git a/code/modules/lighting/lighting_area.dm b/code/modules/lighting/lighting_area.dm index 76e13368a3d5..58ee031d3281 100644 --- a/code/modules/lighting/lighting_area.dm +++ b/code/modules/lighting/lighting_area.dm @@ -1,8 +1,6 @@ /area luminosity = TRUE var/dynamic_lighting = DYNAMIC_LIGHTING_ENABLED - ///Whether this area has a currently active base lighting, bool - var/area_has_base_lighting = FALSE /area/proc/set_dynamic_lighting(new_dynamic_lighting = DYNAMIC_LIGHTING_ENABLED) if (new_dynamic_lighting == dynamic_lighting) From c02d04ad4b65a5d75561b4dc1e646d40d2eb9dd8 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 08:34:35 -0500 Subject: [PATCH 067/281] no more immutable thhanks koffee --- code/game/turfs/space/space.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index a69c134cff3f..e5ce5053fad7 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -63,7 +63,7 @@ GLOBAL_LIST_EMPTY(starlight) var/destination_x var/destination_y - var/global/datum/gas_mixture/immutable/space/space_gas = new + var/global/datum/gas_mixture/immutable/space/space_gas plane = PLANE_SPACE layer = SPACE_LAYER light_power = 1 From ad150548fafed17370837ebbff8afa315d1eece8 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 08:45:55 -0500 Subject: [PATCH 068/281] ok ok --- code/_onclick/hud/plane_master_group.dm | 20 +++++------ .../client/preferences/multiz_parallax.dm | 26 +++++++------- .../client/preferences/multiz_performance.dm | 34 +++++++++---------- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/code/_onclick/hud/plane_master_group.dm b/code/_onclick/hud/plane_master_group.dm index 4775d3553fce..3b32c6d213bc 100644 --- a/code/_onclick/hud/plane_master_group.dm +++ b/code/_onclick/hud/plane_master_group.dm @@ -98,8 +98,8 @@ /datum/plane_master_group/proc/transform_lower_turfs(datum/hud/source, new_offset, use_scale = TRUE) // Check if this feature is disabled for the client, in which case don't use scale. var/mob/our_mob = our_hud?.mymob - if(!our_mob?.client?.prefs?.read_preference(/datum/preference/toggle/multiz_parallax)) - use_scale = FALSE + // if(!our_mob?.client?.prefs?.read_preference(/datum/preference/toggle/multiz_parallax)) + // use_scale = FALSE // No offset? piss off if(!SSmapping.max_plane_offset) @@ -119,14 +119,14 @@ scale_by = 1 var/list/offsets = list() - var/multiz_boundary = our_mob?.client?.prefs?.read_preference(/datum/preference/numeric/multiz_performance) + // var/multiz_boundary = our_mob?.client?.prefs?.read_preference(/datum/preference/numeric/multiz_performance) // We accept negatives so going down "zooms" away the drop above as it goes for(var/offset in -SSmapping.max_plane_offset to SSmapping.max_plane_offset) // Multiz boundaries disable transforms - if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (multiz_boundary < abs(offset))) - offsets += null - continue + // if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (multiz_boundary < abs(offset))) + // offsets += null + // continue // No transformations if we're landing ON you if(offset == 0) @@ -149,10 +149,10 @@ var/visual_offset = plane.offset - new_offset // Basically uh, if we're showing something down X amount of levels, or up any amount of levels - if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (visual_offset > multiz_boundary || visual_offset < 0)) - plane.outside_bounds(our_mob) - else if(plane.is_outside_bounds) - plane.inside_bounds(our_mob) + // if(multiz_boundary != MULTIZ_PERFORMANCE_DISABLE && (visual_offset > multiz_boundary || visual_offset < 0)) + // plane.outside_bounds(our_mob) + // else if(plane.is_outside_bounds) + // plane.inside_bounds(our_mob) if(!plane.multiz_scaled) continue diff --git a/code/modules/client/preferences/multiz_parallax.dm b/code/modules/client/preferences/multiz_parallax.dm index d4f77e206b2a..f8bfad97bc26 100644 --- a/code/modules/client/preferences/multiz_parallax.dm +++ b/code/modules/client/preferences/multiz_parallax.dm @@ -1,16 +1,16 @@ -/// Whether or not to toggle multiz parallax, the parallax effect for lower z-levels. -/datum/preference/toggle/multiz_parallax - category = PREFERENCE_CATEGORY_GAME_PREFERENCES - savefile_key = "multiz_parallax" - savefile_identifier = PREFERENCE_PLAYER +// /// Whether or not to toggle multiz parallax, the parallax effect for lower z-levels. +// /datum/preference/toggle/multiz_parallax +// category = PREFERENCE_CATEGORY_GAME_PREFERENCES +// savefile_key = "multiz_parallax" +// savefile_identifier = PREFERENCE_PLAYER -/datum/preference/toggle/multiz_parallax/apply_to_client(client/client, value) - // Update the plane master group's Z transforms. +// /datum/preference/toggle/multiz_parallax/apply_to_client(client/client, value) +// // Update the plane master group's Z transforms. - var/datum/hud/my_hud = client.mob?.hud_used - if(!my_hud) - return +// var/datum/hud/my_hud = client.mob?.hud_used +// if(!my_hud) +// return - for(var/group_key as anything in my_hud.master_groups) - var/datum/plane_master_group/group = my_hud.master_groups[group_key] - group.transform_lower_turfs(my_hud, my_hud.current_plane_offset) +// for(var/group_key as anything in my_hud.master_groups) +// var/datum/plane_master_group/group = my_hud.master_groups[group_key] +// group.transform_lower_turfs(my_hud, my_hud.current_plane_offset) diff --git a/code/modules/client/preferences/multiz_performance.dm b/code/modules/client/preferences/multiz_performance.dm index 7591401f2d8d..a7b8131a62f6 100644 --- a/code/modules/client/preferences/multiz_performance.dm +++ b/code/modules/client/preferences/multiz_performance.dm @@ -1,21 +1,21 @@ -/// Boundary for how many z levels down to render properly before we start going cheapo mode -/datum/preference/numeric/multiz_performance - category = PREFERENCE_CATEGORY_GAME_PREFERENCES - savefile_key = "multiz_performance" - savefile_identifier = PREFERENCE_PLAYER +// /// Boundary for how many z levels down to render properly before we start going cheapo mode +// /datum/preference/numeric/multiz_performance +// category = PREFERENCE_CATEGORY_GAME_PREFERENCES +// savefile_key = "multiz_performance" +// savefile_identifier = PREFERENCE_PLAYER - minimum = MULTIZ_PERFORMANCE_DISABLE - maximum = MAX_EXPECTED_Z_DEPTH - 1 +// minimum = MULTIZ_PERFORMANCE_DISABLE +// maximum = MAX_EXPECTED_Z_DEPTH - 1 -/datum/preference/numeric/multiz_performance/create_default_value() - return -1 +// /datum/preference/numeric/multiz_performance/create_default_value() +// return -1 -/datum/preference/numeric/multiz_performance/apply_to_client(client/client, value) - // Update the plane master group's layering - var/datum/hud/my_hud = client.mob?.hud_used - if(!my_hud) - return +// /datum/preference/numeric/multiz_performance/apply_to_client(client/client, value) +// // Update the plane master group's layering +// var/datum/hud/my_hud = client.mob?.hud_used +// if(!my_hud) +// return - for(var/group_key as anything in my_hud.master_groups) - var/datum/plane_master_group/group = my_hud.master_groups[group_key] - group.transform_lower_turfs(my_hud, my_hud.current_plane_offset) +// for(var/group_key as anything in my_hud.master_groups) +// var/datum/plane_master_group/group = my_hud.master_groups[group_key] +// group.transform_lower_turfs(my_hud, my_hud.current_plane_offset) From 63c418dce223b56ce891b4080c627d8a0f3ac85c Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 08:52:27 -0500 Subject: [PATCH 069/281] removes all the pref stuff ""removes"" --- code/_onclick/hud/plane_master_group.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/hud/plane_master_group.dm b/code/_onclick/hud/plane_master_group.dm index 3b32c6d213bc..1205b871fd81 100644 --- a/code/_onclick/hud/plane_master_group.dm +++ b/code/_onclick/hud/plane_master_group.dm @@ -97,7 +97,7 @@ // // It's hard, and potentially expensive. be careful /datum/plane_master_group/proc/transform_lower_turfs(datum/hud/source, new_offset, use_scale = TRUE) // Check if this feature is disabled for the client, in which case don't use scale. - var/mob/our_mob = our_hud?.mymob + // var/mob/our_mob = our_hud?.mymob // if(!our_mob?.client?.prefs?.read_preference(/datum/preference/toggle/multiz_parallax)) // use_scale = FALSE From c389b271d9ae30e0fd6205325600e180c2d4714e Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 11:19:15 -0500 Subject: [PATCH 070/281] remove this idiot --- code/__DEFINES/construction.dm | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 5578cf9a927b..8658a984936d 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -2,18 +2,6 @@ //Defines for construction states -//rcd constants for the design list -/// The mode of operation to design an specific type of rcd design -#define RCD_DESIGN_MODE "rcd_design_mode" - /// For changing turfs - #define RCD_TURF (1 << 0) - /// Windoors & Airlocks - #define RCD_STRUCTURE (1 << 3) - /// For wallmounts like air alarms, fire alarms & apc - #define RCD_WALLFRAME (1 << 4) -/// The typepath of the structure the rcd is trying to build -#define RCD_DESIGN_PATH "rcd_design_path" - //girder construction states #define GIRDER_NORMAL 0 #define GIRDER_REINF_STRUTS 1 From 54d5710ddfb3dee29f31d185106ccc8f2b5958c4 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 11:25:25 -0500 Subject: [PATCH 071/281] this goes bye bye --- code/modules/client/multiz_parallax.dm | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 code/modules/client/multiz_parallax.dm diff --git a/code/modules/client/multiz_parallax.dm b/code/modules/client/multiz_parallax.dm deleted file mode 100644 index f8bfad97bc26..000000000000 --- a/code/modules/client/multiz_parallax.dm +++ /dev/null @@ -1,16 +0,0 @@ -// /// Whether or not to toggle multiz parallax, the parallax effect for lower z-levels. -// /datum/preference/toggle/multiz_parallax -// category = PREFERENCE_CATEGORY_GAME_PREFERENCES -// savefile_key = "multiz_parallax" -// savefile_identifier = PREFERENCE_PLAYER - -// /datum/preference/toggle/multiz_parallax/apply_to_client(client/client, value) -// // Update the plane master group's Z transforms. - -// var/datum/hud/my_hud = client.mob?.hud_used -// if(!my_hud) -// return - -// for(var/group_key as anything in my_hud.master_groups) -// var/datum/plane_master_group/group = my_hud.master_groups[group_key] -// group.transform_lower_turfs(my_hud, my_hud.current_plane_offset) From 39b2fe2f0752ccb9250c9cca766fc14694a475a8 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 11:26:14 -0500 Subject: [PATCH 072/281] these go too genius --- .../client/preferences/multiz_parallax.dm | 16 -------------- .../client/preferences/multiz_performance.dm | 21 ------------------- 2 files changed, 37 deletions(-) delete mode 100644 code/modules/client/preferences/multiz_parallax.dm delete mode 100644 code/modules/client/preferences/multiz_performance.dm diff --git a/code/modules/client/preferences/multiz_parallax.dm b/code/modules/client/preferences/multiz_parallax.dm deleted file mode 100644 index f8bfad97bc26..000000000000 --- a/code/modules/client/preferences/multiz_parallax.dm +++ /dev/null @@ -1,16 +0,0 @@ -// /// Whether or not to toggle multiz parallax, the parallax effect for lower z-levels. -// /datum/preference/toggle/multiz_parallax -// category = PREFERENCE_CATEGORY_GAME_PREFERENCES -// savefile_key = "multiz_parallax" -// savefile_identifier = PREFERENCE_PLAYER - -// /datum/preference/toggle/multiz_parallax/apply_to_client(client/client, value) -// // Update the plane master group's Z transforms. - -// var/datum/hud/my_hud = client.mob?.hud_used -// if(!my_hud) -// return - -// for(var/group_key as anything in my_hud.master_groups) -// var/datum/plane_master_group/group = my_hud.master_groups[group_key] -// group.transform_lower_turfs(my_hud, my_hud.current_plane_offset) diff --git a/code/modules/client/preferences/multiz_performance.dm b/code/modules/client/preferences/multiz_performance.dm deleted file mode 100644 index a7b8131a62f6..000000000000 --- a/code/modules/client/preferences/multiz_performance.dm +++ /dev/null @@ -1,21 +0,0 @@ -// /// Boundary for how many z levels down to render properly before we start going cheapo mode -// /datum/preference/numeric/multiz_performance -// category = PREFERENCE_CATEGORY_GAME_PREFERENCES -// savefile_key = "multiz_performance" -// savefile_identifier = PREFERENCE_PLAYER - -// minimum = MULTIZ_PERFORMANCE_DISABLE -// maximum = MAX_EXPECTED_Z_DEPTH - 1 - -// /datum/preference/numeric/multiz_performance/create_default_value() -// return -1 - -// /datum/preference/numeric/multiz_performance/apply_to_client(client/client, value) -// // Update the plane master group's layering -// var/datum/hud/my_hud = client.mob?.hud_used -// if(!my_hud) -// return - -// for(var/group_key as anything in my_hud.master_groups) -// var/datum/plane_master_group/group = my_hud.master_groups[group_key] -// group.transform_lower_turfs(my_hud, my_hud.current_plane_offset) From f02183c2c2d2ac665007d5a7425669725b4d3c46 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 11:28:57 -0500 Subject: [PATCH 073/281] bye bye --- yogstation.dme | 3 --- 1 file changed, 3 deletions(-) diff --git a/yogstation.dme b/yogstation.dme index f4c48f52b2b9..374f54ea108d 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -2124,7 +2124,6 @@ #include "code\modules\client\client_defines.dm" #include "code\modules\client\client_procs.dm" #include "code\modules\client\message.dm" -#include "code\modules\client\multiz_parallax.dm" #include "code\modules\client\player_details.dm" #include "code\modules\client\preferences.dm" #include "code\modules\client\preferences_menu.dm" @@ -2155,8 +2154,6 @@ #include "code\modules\client\preferences\jobless_role.dm" #include "code\modules\client\preferences\mood.dm" #include "code\modules\client\preferences\mood_enabling.dm" -#include "code\modules\client\preferences\multiz_parallax.dm" -#include "code\modules\client\preferences\multiz_performance.dm" #include "code\modules\client\preferences\names.dm" #include "code\modules\client\preferences\ooc.dm" #include "code\modules\client\preferences\parallax.dm" From bd3d6325cc517c8988693840f0eeee8ca53050eb Mon Sep 17 00:00:00 2001 From: Molti Date: Fri, 1 Dec 2023 13:27:42 -0600 Subject: [PATCH 074/281] better night vision --- code/modules/clothing/glasses/_glasses.dm | 1 + code/modules/clothing/glasses/hud.dm | 6 ++++-- code/modules/surgery/organs/eyes.dm | 3 +++ .../living/carbon/human/species_types/preternis/organs.dm | 8 ++++++-- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 90733df90106..cc1236235cfd 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -149,6 +149,7 @@ flash_protect = -1 // Real vivid purple color_cutoffs = list(50, 10, 30) + lighting_cutoff = LIGHTING_CUTOFF_HIGH /obj/item/clothing/glasses/night name = "night vision goggles" diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 686ade9038dc..eefa6d6b7381 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -45,7 +45,8 @@ item_state = "glasses" flash_protect = -1 // Blue green, dark - color_cutoffs = list(20, 20, 75) //yog change, blue night vision is so much weaker for some reason, so it's been significantly buffed to actually work as night vision + color_cutoffs = list(10, 10, 30) + lighting_cutoff = LIGHTING_CUTOFF_HIGH glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/hud/health/meson @@ -86,7 +87,8 @@ item_state = "glasses" flash_protect = -1 // Pale yellow - color_cutoffs = list(40, 30, 15) + color_cutoffs = list(30, 20, 10) + lighting_cutoff = LIGHTING_CUTOFF_HIGH glass_colour_type = /datum/client_colour/glass_colour/green /obj/item/clothing/glasses/hud/diagnostic/sunglasses diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 755be018ecab..cbfcc08db923 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -178,17 +178,20 @@ desc = "It turned out they had them after all!" sight_flags = SEE_MOBS color_cutoffs = list(25, 5, 42) + lighting_cutoff = LIGHTING_CUTOFF_HIGH /obj/item/organ/eyes/zombie name = "undead eyes" desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." color_cutoffs = list(25, 35, 5) + lighting_cutoff = LIGHTING_CUTOFF_HIGH /obj/item/organ/eyes/shadow name = "burning red eyes" desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread." icon_state = "burning_eyes" color_cutoffs = list(20, 10, 40) + lighting_cutoff = LIGHTING_CUTOFF_HIGH ///Robotic /obj/item/organ/eyes/robotic diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm index 20941d24018f..0b65f1bc8ab4 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm @@ -16,7 +16,9 @@ var/powered = TRUE var/night_vision = FALSE // This list is used as the color cutoff for the night vision - var/list/light_cutoff = list(25, 10, 60) + var/list/colour_cutoff_list = list(12, 0, 50) + // This variable is the actual night vision strength + var/light_cutoff = LIGHTING_CUTOFF_HIGH /obj/item/organ/eyes/robotic/preternis/ui_action_click() if(damage > low_threshold) @@ -25,9 +27,11 @@ sight_flags = initial(sight_flags) night_vision = !night_vision if (night_vision) - color_cutoffs = light_cutoff.Copy() + color_cutoffs = colour_cutoff_list.Copy() + lighting_cutoff = light_cutoff else color_cutoffs = null + lighting_cutoff = null owner.update_sight() /obj/item/organ/eyes/robotic/preternis/on_life() From 2d14fbae66df4b54865cd284e63c356af1f6db10 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:02:49 -0500 Subject: [PATCH 075/281] tries to fix camera maybe --- .../packages/tgui/interfaces/CameraConsole.js | 143 ------------- .../tgui/interfaces/CameraConsole.tsx | 198 ++++++++++++++++++ tgui/packages/tgui/interfaces/NtosSecurEye.js | 60 ------ .../tgui/interfaces/NtosSecureEye.tsx | 12 ++ .../tgui/styles/interfaces/CameraConsole.scss | 53 ----- tgui/packages/tgui/styles/main.scss | 1 - 6 files changed, 210 insertions(+), 257 deletions(-) delete mode 100644 tgui/packages/tgui/interfaces/CameraConsole.js create mode 100644 tgui/packages/tgui/interfaces/CameraConsole.tsx delete mode 100644 tgui/packages/tgui/interfaces/NtosSecurEye.js create mode 100644 tgui/packages/tgui/interfaces/NtosSecureEye.tsx delete mode 100644 tgui/packages/tgui/styles/interfaces/CameraConsole.scss diff --git a/tgui/packages/tgui/interfaces/CameraConsole.js b/tgui/packages/tgui/interfaces/CameraConsole.js deleted file mode 100644 index 8ece49eff205..000000000000 --- a/tgui/packages/tgui/interfaces/CameraConsole.js +++ /dev/null @@ -1,143 +0,0 @@ -import { filter, sortBy } from 'common/collections'; -import { flow } from 'common/fp'; -import { classes } from 'common/react'; -import { createSearch } from 'common/string'; -import { useBackend, useLocalState } from '../backend'; -import { Button, ByondUi, Flex, Input, Section } from '../components'; -import { Window } from '../layouts'; - -/** - * Returns previous and next camera names relative to the currently - * active camera. - */ -export const prevNextCamera = (cameras, activeCamera) => { - if (!activeCamera) { - return []; - } - const index = cameras.findIndex(camera => ( - camera.name === activeCamera.name - )); - return [ - cameras[index - 1]?.name, - cameras[index + 1]?.name, - ]; -}; - -/** - * Camera selector. - * - * Filters cameras, applies search terms and sorts the alphabetically. - */ -export const selectCameras = (cameras, searchText = '') => { - const testSearch = createSearch(searchText, camera => camera.name); - return flow([ - // Null camera filter - filter(camera => camera?.name), - // Optional search term - searchText && filter(testSearch), - // Slightly expensive, but way better than sorting in BYOND - sortBy(camera => camera.name), - ])(cameras); -}; - -export const CameraConsole = (props, context) => { - const { act, data } = useBackend(context); - const { mapRef, activeCamera } = data; - const cameras = selectCameras(data.cameras); - const [ - prevCameraName, - nextCameraName, - ] = prevNextCamera(cameras, activeCamera); - return ( - -

    - - - -
    -
    -
    - Camera: - {activeCamera - && activeCamera.name - || '—'} -
    -
    -
    - -
    - - ); -}; - -export const CameraConsoleContent = (props, context) => { - const { act, data } = useBackend(context); - const [ - searchText, - setSearchText, - ] = useLocalState(context, 'searchText', ''); - const { activeCamera } = data; - const cameras = selectCameras(data.cameras, searchText); - return ( - - - setSearchText(value)} /> - - -
    - {cameras.map(camera => ( - // We're not using the component here because performance - // would be absolutely abysmal (50+ ms for each re-render). -
    [act('switch_camera', { - name: camera.name, - }), document.getElementsByClassName('CameraConsole__left')[0].focus()]}> - {camera.name} -
    - ))} -
    -
    -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/CameraConsole.tsx b/tgui/packages/tgui/interfaces/CameraConsole.tsx new file mode 100644 index 000000000000..4feb31faaf67 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CameraConsole.tsx @@ -0,0 +1,198 @@ +import { filter, sortBy } from 'common/collections'; +import { flow } from 'common/fp'; +import { BooleanLike, classes } from 'common/react'; +import { createSearch } from 'common/string'; +import { useBackend, useLocalState } from '../backend'; +import { Button, ByondUi, Input, NoticeBox, Section, Stack } from '../components'; +import { Window } from '../layouts'; + +type Data = { + can_spy: BooleanLike; + mapRef: string; + cameras: Camera[]; + activeCamera: Camera & { status: BooleanLike }; + network: string[]; +}; + +type Camera = { + name: string; +}; + +/** + * Returns previous and next camera names relative to the currently + * active camera. + */ +const prevNextCamera = ( + cameras: Camera[], + activeCamera: Camera & { status: BooleanLike } +) => { + if (!activeCamera) { + return []; + } + const index = cameras.findIndex( + (camera) => camera?.name === activeCamera.name + ); + return [cameras[index - 1]?.name, cameras[index + 1]?.name]; +}; + +/** + * Camera selector. + * + * Filters cameras, applies search terms and sorts the alphabetically. + */ +const selectCameras = (cameras: Camera[], searchText = ''): Camera[] => { + const testSearch = createSearch(searchText, (camera: Camera) => camera.name); + + return flow([ + // Null camera filter + filter((camera: Camera) => !!camera?.name), // Optional search term + searchText && filter(testSearch), + // Slightly expensive, but way better than sorting in BYOND + sortBy((camera: Camera) => camera.name), + ])(cameras); +}; + +export const CameraConsole = (props, context) => { + return ( + + + + + + ); +}; + +export const CameraContent = (props, context) => { + return ( + + + + + + + + + ); +}; + +const CameraSelector = (props, context) => { + const { act, data } = useBackend(context); + const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); + const { activeCamera } = data; + const cameras = selectCameras(data.cameras, searchText); + + return ( + + + setSearchText(value)} + /> + + +
    + {cameras.map((camera) => ( + // We're not using the component here because performance + // would be absolutely abysmal (50+ ms for each re-render). +
    + act('switch_camera', { + name: camera.name, + }) + }> + {camera.name} +
    + ))} +
    +
    +
    + ); +}; + +const CameraControls = (props, context) => { + const { act, data } = useBackend(context); + const { activeCamera, can_spy, mapRef } = data; + const cameras = selectCameras(data.cameras); + + const [prevCameraName, nextCameraName] = prevNextCamera( + cameras, + activeCamera + ); + + return ( +
    + + + + + {activeCamera?.name ? ( + {activeCamera.name} + ) : ( + No input signal + )} + + + + {!!can_spy && ( +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosSecurEye.js b/tgui/packages/tgui/interfaces/NtosSecurEye.js deleted file mode 100644 index 8d4bc6274528..000000000000 --- a/tgui/packages/tgui/interfaces/NtosSecurEye.js +++ /dev/null @@ -1,60 +0,0 @@ -import { filter, sortBy } from 'common/collections'; -import { flow } from 'common/fp'; -import { classes } from 'common/react'; -import { createSearch } from 'common/string'; -import { Fragment } from 'inferno'; -import { useBackend, useLocalState } from '../backend'; -import { Button, ByondUi, Input, Section } from '../components'; -import { NtosWindow } from '../layouts'; -import { prevNextCamera, selectCameras, CameraConsoleContent } from './CameraConsole'; -import { logger } from "../logging"; - -export const NtosSecurEye = (props, context) => { - const { act, data, config } = useBackend(context); - const { PC_device_theme, mapRef, activeCamera } = data; - const cameras = selectCameras(data.cameras); - const [ - prevCameraName, - nextCameraName, - ] = prevNextCamera(cameras, activeCamera); - return ( - - -
    - -
    -
    -
    - Camera: - {activeCamera - && activeCamera.name - || '—'} -
    -
    -
    - -
    -
    -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosSecureEye.tsx b/tgui/packages/tgui/interfaces/NtosSecureEye.tsx new file mode 100644 index 000000000000..c445b6f160f5 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosSecureEye.tsx @@ -0,0 +1,12 @@ +import { NtosWindow } from '../layouts'; +import { CameraContent } from './CameraConsole'; + +export const NtosSecurEye = (props) => { + return ( + + + + + + ); +}; diff --git a/tgui/packages/tgui/styles/interfaces/CameraConsole.scss b/tgui/packages/tgui/styles/interfaces/CameraConsole.scss deleted file mode 100644 index 7e8f99fdcceb..000000000000 --- a/tgui/packages/tgui/styles/interfaces/CameraConsole.scss +++ /dev/null @@ -1,53 +0,0 @@ -@use '../base.scss'; - -$background-color: rgba(0, 0, 0, 0.33) !default; - -.CameraConsole__left { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: base.em(220px); -} - -.CameraConsole__right { - position: absolute; - top: 0; - bottom: 0; - left: base.em(220px); - right: 0; - background-color: $background-color; -} - -.CameraConsole__toolbar { - position: absolute; - top: 0; - left: 0; - right: 0; - height: 2em; - line-height: 2em; - margin: 0.25em 1em 0; -} - -.CameraConsole__toolbarRight { - position: absolute; - top: 0; - right: 0; - height: 2em; - line-height: 2em; - margin: 0.33em 0.5em 0; -} - -.CameraConsole__map { - position: absolute; - top: base.em(26px); - bottom: 0; - left: 0; - right: 0; - margin: 0.5em; - text-align: center; - - .NoticeBox { - margin-top: calc(50% - 2em); - } -} diff --git a/tgui/packages/tgui/styles/main.scss b/tgui/packages/tgui/styles/main.scss index d60242ae8627..9a7a42fcf5aa 100644 --- a/tgui/packages/tgui/styles/main.scss +++ b/tgui/packages/tgui/styles/main.scss @@ -48,7 +48,6 @@ // Interfaces @include meta.load-css('./interfaces/AlertModal.scss'); -@include meta.load-css('./interfaces/CameraConsole.scss'); @include meta.load-css('./interfaces/InspectorBooth.scss'); @include meta.load-css('./interfaces/ListInput.scss'); @include meta.load-css('./interfaces/HellishRunes.scss'); From fece8d2354a1a3e3fda95e12b299edcc96c4e297 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:38:46 -0500 Subject: [PATCH 076/281] ok fuck it we ball we ball --- code/__HELPERS/cameras.dm | 35 ++++++ code/_onclick/hud/map_view.dm | 69 +++++++++++ code/game/machinery/camera/tracking.dm | 12 -- code/game/machinery/computer/camera.dm | 157 ++++++++++--------------- yogstation.dme | 2 + 5 files changed, 168 insertions(+), 107 deletions(-) create mode 100644 code/__HELPERS/cameras.dm create mode 100644 code/_onclick/hud/map_view.dm diff --git a/code/__HELPERS/cameras.dm b/code/__HELPERS/cameras.dm new file mode 100644 index 000000000000..9d74f3fe71b4 --- /dev/null +++ b/code/__HELPERS/cameras.dm @@ -0,0 +1,35 @@ +/** + * get_camera_list + * + * Builds a list of all available cameras that can be seen to networks_available + * Args: + * networks_available - List of networks that we use to see which cameras are visible to it. + */ +/proc/get_camera_list(list/networks_available) + var/list/all_camera_list = list() + for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras) + all_camera_list.Add(camera) + + camera_sort(all_camera_list) + + var/list/usable_camera_list = list() + + for(var/obj/machinery/camera/camera as anything in all_camera_list) + var/list/tempnetwork = camera.network & networks_available + if(length(tempnetwork)) + usable_camera_list["[camera.c_tag][camera.can_use() ? null : " (Deactivated)"]"] = camera + + return usable_camera_list + +///Sorts the list of cameras by their c_tag to display to players. +/proc/camera_sort(list/camera_list) + var/obj/machinery/camera/camera_comparing_a + var/obj/machinery/camera/camera_comparing_b + + for(var/i = length(camera_list), i > 0, i--) + for(var/j = 1 to i - 1) + camera_comparing_a = camera_list[j] + camera_comparing_b = camera_list[j + 1] + if(sorttext(camera_comparing_a.c_tag, camera_comparing_b.c_tag) < 0) + camera_list.Swap(j, j + 1) + return camera_list diff --git a/code/_onclick/hud/map_view.dm b/code/_onclick/hud/map_view.dm new file mode 100644 index 000000000000..bc304f20f8a1 --- /dev/null +++ b/code/_onclick/hud/map_view.dm @@ -0,0 +1,69 @@ +/** + * A screen object, which acts as a container for turfs and other things + * you want to show on the map, which you usually attach to "vis_contents". + * Additionally manages the plane masters required to display said container contents + */ +INITIALIZE_IMMEDIATE(/atom/movable/screen/map_view) +/atom/movable/screen/map_view + name = "screen" + // Map view has to be on the lowest plane to enable proper lighting + layer = GAME_PLANE + plane = GAME_PLANE + del_on_map_removal = FALSE + + // Weakrefs of all our hud viewers -> a weakref to the hud datum they last used + var/list/datum/weakref/viewers_to_huds = list() + +/atom/movable/screen/map_view/Destroy() + for(var/datum/weakref/client_ref in viewers_to_huds) + var/client/our_client = client_ref.resolve() + if(!our_client) + continue + hide_from(our_client.mob) + + return ..() + +/atom/movable/screen/map_view/proc/generate_view(map_key) + // Map keys have to start and end with an A-Z character, + // and definitely NOT with a square bracket or even a number. + // I wasted 6 hours on this. :agony: + // -- Stylemistake + assigned_map = map_key + set_position(1, 1) + +/atom/movable/screen/map_view/proc/display_to(mob/show_to) + show_to.client.register_map_obj(src) + // We need to add planesmasters to the popup, otherwise + // blending fucks up massively. Any planesmaster on the main screen does + // NOT apply to map popups. If there's ever a way to make planesmasters + // omnipresent, then this wouldn't be needed. + // We lazy load this because there's no point creating all these if none's gonna see em + + // Store this info in a client -> hud pattern, so ghosts closing the window nukes the right group + var/datum/weakref/client_ref = WEAKREF(show_to.client) + + var/datum/weakref/hud_ref = viewers_to_huds[client_ref] + var/datum/hud/our_hud = hud_ref?.resolve() + if(our_hud) + return our_hud.get_plane_group(PLANE_GROUP_POPUP_WINDOW(src)) + + // Generate a new plane group for this case + var/datum/plane_master_group/popup/pop_planes = new(PLANE_GROUP_POPUP_WINDOW(src), assigned_map) + viewers_to_huds[client_ref] = WEAKREF(show_to.hud_used) + pop_planes.attach_to(show_to.hud_used) + + return pop_planes + +/atom/movable/screen/map_view/proc/hide_from(mob/hide_from) + hide_from?.canon_client.clear_map(assigned_map) + var/client_ref = WEAKREF(hide_from?.canon_client) + + // Make sure we clear the *right* hud + var/datum/weakref/hud_ref = viewers_to_huds[client_ref] + viewers_to_huds -= client_ref + var/datum/hud/clear_from = hud_ref?.resolve() + if(!clear_from) + return + + var/datum/plane_master_group/popup/pop_planes = clear_from.get_plane_group(PLANE_GROUP_POPUP_WINDOW(src)) + qdel(pop_planes) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 0976aba838e4..9e7c56217422 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -137,15 +137,3 @@ if (!can_use()) return user.switchCamera(src) - -/proc/camera_sort(list/L) - var/obj/machinery/camera/a - var/obj/machinery/camera/b - - for (var/i = L.len, i > 0, i--) - for (var/j = 1 to i - 1) - a = L[j] - b = L[j + 1] - if (sorttext(a.c_tag, b.c_tag) < 0) - L.Swap(j, j + 1) - return L diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 43f22a4e2754..a8f9e110ea2a 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -1,64 +1,54 @@ +#define DEFAULT_MAP_SIZE 15 + /obj/machinery/computer/security name = "security camera console" desc = "Used to access the various cameras on the station." icon_screen = "cameras" icon_keyboard = "security_key" circuit = /obj/item/circuitboard/computer/security - light_color = LIGHT_COLOR_RED + light_color = COLOR_SOFT_RED var/list/network = list("ss13") + var/obj/machinery/camera/active_camera + /// The turf where the camera was last updated. + var/turf/last_camera_turf var/list/concurrent_users = list() // Stuff needed to render the map - var/map_name - var/const/default_map_size = 15 - var/atom/movable/screen/cam_screen + var/atom/movable/screen/map_view/cam_screen /// All the plane masters that need to be applied. - var/list/cam_plane_masters var/atom/movable/screen/background/cam_background - var/obj/machinery/camera/active_camera - - var/processing = FALSE - /obj/machinery/computer/security/Initialize(mapload) . = ..() // Map name has to start and end with an A-Z character, // and definitely NOT with a square bracket or even a number. // I wasted 6 hours on this. :agony: - map_name = "camera_console_[REF(src)]_map" + var/map_name = "camera_console_[REF(src)]_map" // Convert networks to lowercase for(var/i in network) network -= i network += lowertext(i) // Initialize map objects cam_screen = new - cam_screen.name = "screen" - cam_screen.assigned_map = map_name - cam_screen.del_on_map_removal = FALSE - cam_screen.screen_loc = "[map_name]:1,1" - cam_plane_masters = list() - for(var/plane in subtypesof(/atom/movable/screen/plane_master)) - var/atom/movable/screen/instance = new plane() - instance.assigned_map = map_name - instance.del_on_map_removal = FALSE - instance.screen_loc = "[map_name]:CENTER" - cam_plane_masters += instance + cam_screen.generate_view(map_name) cam_background = new cam_background.assigned_map = map_name cam_background.del_on_map_removal = FALSE /obj/machinery/computer/security/Destroy() - qdel(cam_screen) - QDEL_LIST(cam_plane_masters) - qdel(cam_background) + QDEL_NULL(cam_screen) + QDEL_NULL(cam_background) return ..() /obj/machinery/computer/security/ui_interact(mob/user, datum/tgui/ui) + . = ..() + // Update UI ui = SStgui.try_update_ui(user, src, ui) - // Show static if can't use the camera - if(!active_camera?.can_use()) - show_camera_static() + + // Update the camera, showing static if necessary and updating data if the location has moved. + update_active_camera_screen() + if(!ui) var/user_ref = REF(user) var/is_living = isliving(user) @@ -71,47 +61,43 @@ playsound(src, 'sound/machines/terminal_on.ogg', 25, FALSE) use_power(active_power_usage) // Register map objects - user.client.register_map_obj(cam_screen) - for(var/plane in cam_plane_masters) - user.client.register_map_obj(plane) + cam_screen.display_to(user) user.client.register_map_obj(cam_background) // Open UI ui = new(user, src, "CameraConsole", name) ui.open() +/obj/machinery/computer/security/ui_status(mob/user) + . = ..() + if(. == UI_DISABLED) + return UI_CLOSE + return . + /obj/machinery/computer/security/ui_data() var/list/data = list() - data["network"] = network data["activeCamera"] = null if(active_camera) data["activeCamera"] = list( name = active_camera.c_tag, + ref = REF(active_camera), status = active_camera.status, ) return data /obj/machinery/computer/security/ui_static_data() var/list/data = list() - data["mapRef"] = map_name - var/list/cameras = get_available_cameras() + data["network"] = network + data["mapRef"] = cam_screen.assigned_map + var/list/cameras = get_camera_list(network) data["cameras"] = list() for(var/i in cameras) var/obj/machinery/camera/C = cameras[i] data["cameras"] += list(list( name = C.c_tag, + ref = REF(C), )) - return data -/obj/machinery/computer/security/process() - if(active_camera && active_camera.built_in) - if(!active_camera?.can_use()) - show_camera_static() - return TRUE - update_camera(active_camera) - else - STOP_PROCESSING(SSfastprocess, src) - processing = FALSE - ..() + return data /obj/machinery/computer/security/ui_act(action, params) . = ..() @@ -119,42 +105,43 @@ return if(action == "switch_camera") - var/c_tag = params["name"] - var/list/cameras = get_available_cameras() - var/obj/machinery/camera/C = cameras[c_tag] - active_camera = C + var/obj/machinery/camera/selected_camera = locate(params["camera"]) in GLOB.cameranet.cameras + active_camera = selected_camera playsound(src, get_sfx("terminal_type"), 25, FALSE) - - // Show static if can't use the camera - if(!active_camera?.can_use()) - show_camera_static() + if(isnull(active_camera)) return TRUE - - //Assume it's a moving camera. - if(C.built_in) - if(!processing) - START_PROCESSING(SSfastprocess, src) - processing = TRUE - else - STOP_PROCESSING(SSfastprocess, src) - processing = FALSE - - update_camera(C) + update_active_camera_screen() return TRUE -/obj/machinery/computer/security/proc/update_camera(obj/machinery/camera/C) - var/originator = C - if(C.built_in) - originator = get_turf(C.built_in) +/obj/machinery/computer/security/proc/update_active_camera_screen() + // Show static if can't use the camera + if(!active_camera?.can_use()) + show_camera_static() + return var/list/visible_turfs = list() - for(var/turf/T in (C.isXRay() \ - ? range(C.view_range, originator) \ - : view(C.view_range, originator))) - visible_turfs += T + // Get the camera's turf to correctly gather what's visible from it's turf, in case it's located in a moving object (borgs / mechs) + var/new_cam_turf = get_turf(active_camera) + + // If we're not forcing an update for some reason and the cameras are in the same location, + // we don't need to update anything. + // Most security cameras will end here as they're not moving. + if(last_camera_turf == new_cam_turf) + return + + // Cameras that get here are moving, and are likely attached to some moving atom such as cyborgs. + last_camera_turf = new_cam_turf + + //Here we gather what's visible from the camera's POV based on its view_range and xray modifier if present + var/list/visible_things = active_camera.isXRay(ignore_malf_upgrades = TRUE) ? range(active_camera.view_range, new_cam_turf) : view(active_camera.view_range, new_cam_turf) + + for(var/turf/visible_turf in visible_things) + visible_turfs += visible_turf + + //Get coordinates for a rectangle area that contains the turfs we see so we can then clear away the static in the resulting rectangle area var/list/bbox = get_bbox_of_atoms(visible_turfs) var/size_x = bbox[3] - bbox[1] + 1 var/size_y = bbox[4] - bbox[2] + 1 @@ -164,44 +151,24 @@ cam_background.fill_rect(1, 1, size_x, size_y) /obj/machinery/computer/security/ui_close(mob/user) + . = ..() var/user_ref = REF(user) var/is_living = isliving(user) // Living creature or not, we remove you anyway. concurrent_users -= user_ref // Unregister map objects - user.client.clear_map(map_name) + cam_screen.hide_from(user) // Turn off the console if(length(concurrent_users) == 0 && is_living) active_camera = null + last_camera_turf = null playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE) use_power(0) /obj/machinery/computer/security/proc/show_camera_static() cam_screen.vis_contents.Cut() cam_background.icon_state = "scanline2" - cam_background.fill_rect(1, 1, default_map_size, default_map_size) - -//returns the list of cameras accessible from this computer -/obj/machinery/computer/security/proc/get_available_cameras() - var/list/L = list() - for (var/obj/machinery/camera/C in GLOB.cameranet.cameras) - if((is_away_level(z) || is_away_level(C.z)) && (C.z != z))//if on away mission, can only receive feed from same z_level cameras - continue - L.Add(C) - - var/list/D = list() - - for(var/obj/machinery/camera/C in L) - if(!C.network) - stack_trace("Camera in a cameranet has no camera network") - continue - if(!(islist(C.network))) - stack_trace("Camera in a cameranet has a non-list camera network") - continue - var/list/tempnetwork = C.network & network - if(tempnetwork.len) - D["[C.c_tag]"] = C - return D + cam_background.fill_rect(1, 1, DEFAULT_MAP_SIZE, DEFAULT_MAP_SIZE) // SECURITY MONITORS diff --git a/yogstation.dme b/yogstation.dme index 374f54ea108d..fac8f88d5fd2 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -217,6 +217,7 @@ #include "code\__HELPERS\animations.dm" #include "code\__HELPERS\areas.dm" #include "code\__HELPERS\AStar.dm" +#include "code\__HELPERS\cameras.dm" #include "code\__HELPERS\cmp.dm" #include "code\__HELPERS\colors.dm" #include "code\__HELPERS\config.dm" @@ -319,6 +320,7 @@ #include "code\_onclick\hud\lavaland_elite.dm" #include "code\_onclick\hud\living.dm" #include "code\_onclick\hud\map_popups.dm" +#include "code\_onclick\hud\map_view.dm" #include "code\_onclick\hud\monkey.dm" #include "code\_onclick\hud\movable_screen_objects.dm" #include "code\_onclick\hud\pai.dm" From 74aa73d32a0080552682932c77f676a4aa73df76 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:45:41 -0500 Subject: [PATCH 077/281] ok lets go back go back go back go back --- code/game/machinery/computer/camera.dm | 157 +++++++++++++++---------- 1 file changed, 95 insertions(+), 62 deletions(-) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index a8f9e110ea2a..43f22a4e2754 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -1,54 +1,64 @@ -#define DEFAULT_MAP_SIZE 15 - /obj/machinery/computer/security name = "security camera console" desc = "Used to access the various cameras on the station." icon_screen = "cameras" icon_keyboard = "security_key" circuit = /obj/item/circuitboard/computer/security - light_color = COLOR_SOFT_RED + light_color = LIGHT_COLOR_RED var/list/network = list("ss13") - var/obj/machinery/camera/active_camera - /// The turf where the camera was last updated. - var/turf/last_camera_turf var/list/concurrent_users = list() // Stuff needed to render the map - var/atom/movable/screen/map_view/cam_screen + var/map_name + var/const/default_map_size = 15 + var/atom/movable/screen/cam_screen /// All the plane masters that need to be applied. + var/list/cam_plane_masters var/atom/movable/screen/background/cam_background + var/obj/machinery/camera/active_camera + + var/processing = FALSE + /obj/machinery/computer/security/Initialize(mapload) . = ..() // Map name has to start and end with an A-Z character, // and definitely NOT with a square bracket or even a number. // I wasted 6 hours on this. :agony: - var/map_name = "camera_console_[REF(src)]_map" + map_name = "camera_console_[REF(src)]_map" // Convert networks to lowercase for(var/i in network) network -= i network += lowertext(i) // Initialize map objects cam_screen = new - cam_screen.generate_view(map_name) + cam_screen.name = "screen" + cam_screen.assigned_map = map_name + cam_screen.del_on_map_removal = FALSE + cam_screen.screen_loc = "[map_name]:1,1" + cam_plane_masters = list() + for(var/plane in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/instance = new plane() + instance.assigned_map = map_name + instance.del_on_map_removal = FALSE + instance.screen_loc = "[map_name]:CENTER" + cam_plane_masters += instance cam_background = new cam_background.assigned_map = map_name cam_background.del_on_map_removal = FALSE /obj/machinery/computer/security/Destroy() - QDEL_NULL(cam_screen) - QDEL_NULL(cam_background) + qdel(cam_screen) + QDEL_LIST(cam_plane_masters) + qdel(cam_background) return ..() /obj/machinery/computer/security/ui_interact(mob/user, datum/tgui/ui) - . = ..() - // Update UI ui = SStgui.try_update_ui(user, src, ui) - - // Update the camera, showing static if necessary and updating data if the location has moved. - update_active_camera_screen() - + // Show static if can't use the camera + if(!active_camera?.can_use()) + show_camera_static() if(!ui) var/user_ref = REF(user) var/is_living = isliving(user) @@ -61,87 +71,90 @@ playsound(src, 'sound/machines/terminal_on.ogg', 25, FALSE) use_power(active_power_usage) // Register map objects - cam_screen.display_to(user) + user.client.register_map_obj(cam_screen) + for(var/plane in cam_plane_masters) + user.client.register_map_obj(plane) user.client.register_map_obj(cam_background) // Open UI ui = new(user, src, "CameraConsole", name) ui.open() -/obj/machinery/computer/security/ui_status(mob/user) - . = ..() - if(. == UI_DISABLED) - return UI_CLOSE - return . - /obj/machinery/computer/security/ui_data() var/list/data = list() + data["network"] = network data["activeCamera"] = null if(active_camera) data["activeCamera"] = list( name = active_camera.c_tag, - ref = REF(active_camera), status = active_camera.status, ) return data /obj/machinery/computer/security/ui_static_data() var/list/data = list() - data["network"] = network - data["mapRef"] = cam_screen.assigned_map - var/list/cameras = get_camera_list(network) + data["mapRef"] = map_name + var/list/cameras = get_available_cameras() data["cameras"] = list() for(var/i in cameras) var/obj/machinery/camera/C = cameras[i] data["cameras"] += list(list( name = C.c_tag, - ref = REF(C), )) - return data +/obj/machinery/computer/security/process() + if(active_camera && active_camera.built_in) + if(!active_camera?.can_use()) + show_camera_static() + return TRUE + update_camera(active_camera) + else + STOP_PROCESSING(SSfastprocess, src) + processing = FALSE + ..() + /obj/machinery/computer/security/ui_act(action, params) . = ..() if(.) return if(action == "switch_camera") - var/obj/machinery/camera/selected_camera = locate(params["camera"]) in GLOB.cameranet.cameras - active_camera = selected_camera + var/c_tag = params["name"] + var/list/cameras = get_available_cameras() + var/obj/machinery/camera/C = cameras[c_tag] + active_camera = C playsound(src, get_sfx("terminal_type"), 25, FALSE) - if(isnull(active_camera)) - return TRUE - - update_active_camera_screen() - return TRUE - -/obj/machinery/computer/security/proc/update_active_camera_screen() - // Show static if can't use the camera - if(!active_camera?.can_use()) - show_camera_static() - return + // Show static if can't use the camera + if(!active_camera?.can_use()) + show_camera_static() + return TRUE - var/list/visible_turfs = list() - // Get the camera's turf to correctly gather what's visible from it's turf, in case it's located in a moving object (borgs / mechs) - var/new_cam_turf = get_turf(active_camera) + //Assume it's a moving camera. + if(C.built_in) + if(!processing) + START_PROCESSING(SSfastprocess, src) + processing = TRUE + else + STOP_PROCESSING(SSfastprocess, src) + processing = FALSE - // If we're not forcing an update for some reason and the cameras are in the same location, - // we don't need to update anything. - // Most security cameras will end here as they're not moving. - if(last_camera_turf == new_cam_turf) - return + update_camera(C) - // Cameras that get here are moving, and are likely attached to some moving atom such as cyborgs. - last_camera_turf = new_cam_turf + return TRUE - //Here we gather what's visible from the camera's POV based on its view_range and xray modifier if present - var/list/visible_things = active_camera.isXRay(ignore_malf_upgrades = TRUE) ? range(active_camera.view_range, new_cam_turf) : view(active_camera.view_range, new_cam_turf) +/obj/machinery/computer/security/proc/update_camera(obj/machinery/camera/C) + var/originator = C + if(C.built_in) + originator = get_turf(C.built_in) - for(var/turf/visible_turf in visible_things) - visible_turfs += visible_turf + var/list/visible_turfs = list() + for(var/turf/T in (C.isXRay() \ + ? range(C.view_range, originator) \ + : view(C.view_range, originator))) + visible_turfs += T - //Get coordinates for a rectangle area that contains the turfs we see so we can then clear away the static in the resulting rectangle area var/list/bbox = get_bbox_of_atoms(visible_turfs) var/size_x = bbox[3] - bbox[1] + 1 var/size_y = bbox[4] - bbox[2] + 1 @@ -151,24 +164,44 @@ cam_background.fill_rect(1, 1, size_x, size_y) /obj/machinery/computer/security/ui_close(mob/user) - . = ..() var/user_ref = REF(user) var/is_living = isliving(user) // Living creature or not, we remove you anyway. concurrent_users -= user_ref // Unregister map objects - cam_screen.hide_from(user) + user.client.clear_map(map_name) // Turn off the console if(length(concurrent_users) == 0 && is_living) active_camera = null - last_camera_turf = null playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE) use_power(0) /obj/machinery/computer/security/proc/show_camera_static() cam_screen.vis_contents.Cut() cam_background.icon_state = "scanline2" - cam_background.fill_rect(1, 1, DEFAULT_MAP_SIZE, DEFAULT_MAP_SIZE) + cam_background.fill_rect(1, 1, default_map_size, default_map_size) + +//returns the list of cameras accessible from this computer +/obj/machinery/computer/security/proc/get_available_cameras() + var/list/L = list() + for (var/obj/machinery/camera/C in GLOB.cameranet.cameras) + if((is_away_level(z) || is_away_level(C.z)) && (C.z != z))//if on away mission, can only receive feed from same z_level cameras + continue + L.Add(C) + + var/list/D = list() + + for(var/obj/machinery/camera/C in L) + if(!C.network) + stack_trace("Camera in a cameranet has no camera network") + continue + if(!(islist(C.network))) + stack_trace("Camera in a cameranet has a non-list camera network") + continue + var/list/tempnetwork = C.network & network + if(tempnetwork.len) + D["[C.c_tag]"] = C + return D // SECURITY MONITORS From f3ef0a6d748cf2704c94fc47572c8448c8c6b5dd Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:55:54 -0500 Subject: [PATCH 078/281] WORK DAMNIT --- code/_onclick/hud/map_view.dm | 2 +- code/game/machinery/computer/camera.dm | 13 ++----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/code/_onclick/hud/map_view.dm b/code/_onclick/hud/map_view.dm index bc304f20f8a1..d571f2cff4ea 100644 --- a/code/_onclick/hud/map_view.dm +++ b/code/_onclick/hud/map_view.dm @@ -22,7 +22,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/map_view) hide_from(our_client.mob) return ..() - + /atom/movable/screen/map_view/proc/generate_view(map_key) // Map keys have to start and end with an A-Z character, // and definitely NOT with a square bracket or even a number. diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 43f22a4e2754..83854ef1a438 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -32,18 +32,9 @@ network -= i network += lowertext(i) // Initialize map objects + // Initialize map objects cam_screen = new - cam_screen.name = "screen" - cam_screen.assigned_map = map_name - cam_screen.del_on_map_removal = FALSE - cam_screen.screen_loc = "[map_name]:1,1" - cam_plane_masters = list() - for(var/plane in subtypesof(/atom/movable/screen/plane_master)) - var/atom/movable/screen/instance = new plane() - instance.assigned_map = map_name - instance.del_on_map_removal = FALSE - instance.screen_loc = "[map_name]:CENTER" - cam_plane_masters += instance + cam_screen.generate_view(map_name) cam_background = new cam_background.assigned_map = map_name cam_background.del_on_map_removal = FALSE From 561b45d25931736c6c29f10dfc72042ab42b54ac Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:59:27 -0500 Subject: [PATCH 079/281] ha fuc kyou --- code/game/machinery/computer/camera.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 83854ef1a438..206dd406fcdb 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -12,7 +12,8 @@ // Stuff needed to render the map var/map_name var/const/default_map_size = 15 - var/atom/movable/screen/cam_screen + // Stuff needed to render the map + var/atom/movable/screen/map_view/cam_screen /// All the plane masters that need to be applied. var/list/cam_plane_masters var/atom/movable/screen/background/cam_background @@ -26,7 +27,7 @@ // Map name has to start and end with an A-Z character, // and definitely NOT with a square bracket or even a number. // I wasted 6 hours on this. :agony: - map_name = "camera_console_[REF(src)]_map" + var/map_name = "camera_console_[REF(src)]_map" // Convert networks to lowercase for(var/i in network) network -= i From d3826c107e49caeef8a5fd1d28f7a6c71070c9ed Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 16:03:18 -0500 Subject: [PATCH 080/281] this maybe --- code/game/machinery/computer/camera.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 206dd406fcdb..ee8827e6ebd0 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -63,9 +63,7 @@ playsound(src, 'sound/machines/terminal_on.ogg', 25, FALSE) use_power(active_power_usage) // Register map objects - user.client.register_map_obj(cam_screen) - for(var/plane in cam_plane_masters) - user.client.register_map_obj(plane) + cam_screen.display_to(user) user.client.register_map_obj(cam_background) // Open UI ui = new(user, src, "CameraConsole", name) From c8a091402aeedf6784453ef779f966f7f8175de6 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 16:14:58 -0500 Subject: [PATCH 081/281] this doesnt work :( --- code/game/machinery/computer/camera.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index ee8827e6ebd0..a78099ef3abc 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -33,7 +33,6 @@ network -= i network += lowertext(i) // Initialize map objects - // Initialize map objects cam_screen = new cam_screen.generate_view(map_name) cam_background = new @@ -62,8 +61,10 @@ if(length(concurrent_users) == 1 && is_living) playsound(src, 'sound/machines/terminal_on.ogg', 25, FALSE) use_power(active_power_usage) - // Register map objects - cam_screen.display_to(user) + /// Register map objects + user.client.register_map_obj(cam_screen) + for(var/plane in cam_plane_masters) + user.client.register_map_obj(plane) user.client.register_map_obj(cam_background) // Open UI ui = new(user, src, "CameraConsole", name) From 4fe889a931126976f9db16d1bdb3082c0ed67a9c Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 16:18:14 -0500 Subject: [PATCH 082/281] maybe fix maybe --- code/_onclick/hud/map_popups.dm | 9 ++++----- code/game/machinery/computer/camera.dm | 6 ++---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/code/_onclick/hud/map_popups.dm b/code/_onclick/hud/map_popups.dm index f070084f4770..8a4a1de86977 100644 --- a/code/_onclick/hud/map_popups.dm +++ b/code/_onclick/hud/map_popups.dm @@ -77,10 +77,9 @@ screen_maps[screen_obj.assigned_map] = list() // NOTE: Possibly an expensive operation var/list/screen_map = screen_maps[screen_obj.assigned_map] - if(!screen_map.Find(screen_obj)) - screen_map += screen_obj - if(!screen.Find(screen_obj)) - screen += screen_obj + screen_map |= screen_obj + screen |= screen_obj + /** * Clears the map of registered screen objects. @@ -167,4 +166,4 @@ */ /client/verb/handle_popup_close(window_id as text) set hidden = TRUE - clear_map("[window_id]_map") \ No newline at end of file + clear_map("[window_id]_map") diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index a78099ef3abc..d0ba380e40c7 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -61,10 +61,8 @@ if(length(concurrent_users) == 1 && is_living) playsound(src, 'sound/machines/terminal_on.ogg', 25, FALSE) use_power(active_power_usage) - /// Register map objects - user.client.register_map_obj(cam_screen) - for(var/plane in cam_plane_masters) - user.client.register_map_obj(plane) + // Register map objects + cam_screen.display_to(user) user.client.register_map_obj(cam_background) // Open UI ui = new(user, src, "CameraConsole", name) From 6095dec3318dc77449551b0d40fc4d2f2d303d3e Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 16:48:01 -0500 Subject: [PATCH 083/281] fucks everything why do i do this --- code/__DEFINES/cameranets.dm | 5 + code/__DEFINES/turfs.dm | 3 + code/game/mecha/mecha.dm | 3 + .../living/silicon/ai/freelook/cameranet.dm | 136 +++++++++++------- .../mob/living/silicon/ai/freelook/chunk.dm | 119 ++++++++------- yogstation.dme | 1 + 6 files changed, 162 insertions(+), 105 deletions(-) create mode 100644 code/__DEFINES/cameranets.dm diff --git a/code/__DEFINES/cameranets.dm b/code/__DEFINES/cameranets.dm new file mode 100644 index 000000000000..b88678db4a5e --- /dev/null +++ b/code/__DEFINES/cameranets.dm @@ -0,0 +1,5 @@ +/// We only want chunk sizes that are to the power of 2. E.g: 2, 4, 8, 16, etc.. +#define CHUNK_SIZE 16 +/// Takes a position, transforms it into a chunk bounded position. Indexes at 1 so it'll land on actual turfs always +#define GET_CHUNK_COORD(v) (max((FLOOR(v, CHUNK_SIZE)), 1)) + diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 9f54a7fcfbb9..a85ee0a5520d 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -9,6 +9,9 @@ ///Returns all currently loaded turfs #define ALL_TURFS(...) block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz)) +/// Returns a list of turfs in the rectangle specified by BOTTOM LEFT corner and height/width, checks for being outside the world border for you +#define CORNER_BLOCK(corner, width, height) CORNER_BLOCK_OFFSET(corner, width, height, 0, 0) + #define IS_OPAQUE_TURF(turf) (turf.directional_opacity == ALL_CARDINALS) /// The pipes, disposals, and wires are hidden diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 80dd0936ce17..d51308b09dd7 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -92,6 +92,9 @@ var/silicon_pilot = FALSE //set to true if an AI or MMI is piloting. + ///Camera installed into the mech + var/obj/machinery/camera/exosuit/chassis_camera + var/enter_delay = 40 //Time taken to enter the mech var/exit_delay = 20 //Time to exit mech var/destruction_sleep_duration = 20 //Time that mech pilot is put to sleep for if mech is destroyed diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index cb0791cd757a..cf4f9fca9fcb 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -2,8 +2,6 @@ // // The datum containing all the chunks. -#define CHUNK_SIZE 16 // Only chunk sizes that are to the power of 2. E.g: 2, 4, 8, 16, etc.. - GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) /datum/cameranet @@ -11,38 +9,54 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) var/name = "Camera Net" /// The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). - var/list/cameras = list() + var/list/obj/machinery/camera/cameras = list() /// The chunks of the map, mapping the areas that the cameras can see. var/list/chunks = list() var/ready = 0 - // The object used for the clickable stat() button. - var/obj/effect/statclick/statclick - ///The image given to the effect in vis_contents on AI clients - var/image/obscured + + /// List of images cloned by all chunk static images put onto turfs cameras cant see + /// Indexed by the plane offset to use + var/list/image/obscured_images /datum/cameranet/New() - obscured = new('icons/effects/cameravis.dmi') - obscured.plane = CAMERA_STATIC_PLANE - obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART - obscured.override = TRUE + obscured_images = list() + update_offsets(SSmapping.max_plane_offset) + RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_offset_growth)) + +/datum/cameranet/proc/update_offsets(new_offset) + for(var/i in length(obscured_images) to new_offset) + var/image/obscured = new('icons/effects/cameravis.dmi') + SET_PLANE_W_SCALAR(obscured, CAMERA_STATIC_PLANE, i) + obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART + obscured.override = TRUE + obscured_images += obscured + +/datum/cameranet/proc/on_offset_growth(datum/source, old_offset, new_offset) + SIGNAL_HANDLER + update_offsets(new_offset) /// Checks if a chunk has been Generated in x, y, z. /datum/cameranet/proc/chunkGenerated(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) + if(GET_LOWEST_STACK_OFFSET(z) != 0) + var/turf/lowest = get_lowest_turf(locate(x, y, z)) + return chunks["[x],[y],[lowest.z]"] + return chunks["[x],[y],[z]"] // Returns the chunk in the x, y, z. // If there is no chunk, it creates a new chunk and returns that. /datum/cameranet/proc/getCameraChunk(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) - var/key = "[x],[y],[z]" + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) + var/turf/lowest = get_lowest_turf(locate(x, y, z)) + var/key = "[x],[y],[lowest.z]" . = chunks[key] if(!.) - chunks[key] = . = new /datum/camerachunk(x, y, z) + chunks[key] = . = new /datum/camerachunk(x, y, lowest.z) -/// Updates what the ai_eye can see. It is recommended you use this when the ai_eye moves or it's location is set. +/// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. /datum/cameranet/proc/visibility(list/moved_eyes, client/C, list/other_eyes, use_static = TRUE) if(!islist(moved_eyes)) moved_eyes = moved_eyes ? list(moved_eyes) : list() @@ -53,21 +67,18 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/mob/camera/aiEye/eye as anything in moved_eyes) var/list/visibleChunks = list() + //Get the eye's turf in case it's located in an object like a mecha + var/turf/eye_turf = get_turf(eye) if(eye.loc) - var/x_value = eye.x - var/y_value = eye.y - var/z_value = eye.z - // 0xf = 15 var/static_range = eye.static_visibility_range - var/x1 = max(0, x_value - static_range) & ~(CHUNK_SIZE - 1) - var/y1 = max(0, y_value - static_range) & ~(CHUNK_SIZE - 1) - var/x2 = min(world.maxx, x_value + static_range) & ~(CHUNK_SIZE - 1) - var/y2 = min(world.maxy, y_value + static_range) & ~(CHUNK_SIZE - 1) - + var/x1 = max(1, eye_turf.x - static_range) + var/y1 = max(1, eye_turf.y - static_range) + var/x2 = min(world.maxx, eye_turf.x + static_range) + var/y2 = min(world.maxy, eye_turf.y + static_range) for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) - visibleChunks |= getCameraChunk(x, y, z_value) + visibleChunks |= getCameraChunk(x, y, eye_turf.z) var/list/remove = eye.visibleCameraChunks - visibleChunks var/list/add = visibleChunks - eye.visibleCameraChunks @@ -78,7 +89,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/datum/camerachunk/chunk as anything in add) chunk.add(eye) -/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. +/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. /datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) if(!SSticker || (opacity_check && !A.opacity)) return @@ -99,10 +110,14 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) if(c.can_use()) majorChunkChange(c, 1) -/// Used for Cyborg cameras. Since portable cameras can be in ANY chunk. -/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/c) - if(c.can_use()) - majorChunkChange(c, 1) +/** + * Used for Cyborg/mecha cameras. Since portable cameras can be in ANY chunk. + * update_delay_buffer is passed all the way to hasChanged() from their camera updates on movement + * to change the time between static updates. +*/ +/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/updating_camera, update_delay_buffer) + if(updating_camera.can_use()) + majorChunkChange(updating_camera, 1, update_delay_buffer) /** * Never access this proc directly!!!! @@ -110,37 +125,52 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) * It will also add the atom to the cameras list if you set the choice to 1. * Setting the choice to 0 will remove the camera from the chunks. * If you want to update the chunks around an object, without adding/removing a camera, use choice 2. + * update_delay_buffer is passed all the way to hasChanged() from portable camera updates on movement + * to change the time between static updates. */ -/datum/cameranet/proc/majorChunkChange(atom/c, choice) - if(!c) - return +/datum/cameranet/proc/majorChunkChange(atom/c, choice, update_delay_buffer) + if(QDELETED(c) && choice == 1) + CRASH("Tried to add a qdeleting camera to the net") var/turf/T = get_turf(c) if(T) - var/x1 = max(0, T.x - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/y1 = max(0, T.y - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + var/x1 = max(1, T.x - (CHUNK_SIZE / 2)) + var/y1 = max(1, T.y - (CHUNK_SIZE / 2)) + var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) + var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) var/datum/camerachunk/chunk = chunkGenerated(x, y, T.z) if(chunk) if(choice == 0) // Remove the camera. - chunk.cameras -= c + chunk.cameras["[T.z]"] -= c else if(choice == 1) // You can't have the same camera in the list twice. - chunk.cameras |= c - chunk.hasChanged() + chunk.cameras["[T.z]"] |= c + chunk.hasChanged(update_delay_buffer = update_delay_buffer) + +/// A faster, turf only version of [/datum/cameranet/proc/majorChunkChange] +/// For use in sensitive code, be careful with it +/datum/cameranet/proc/bareMajorChunkChange(turf/changed) + var/x1 = max(1, changed.x - (CHUNK_SIZE / 2)) + var/y1 = max(1, changed.y - (CHUNK_SIZE / 2)) + var/x2 = min(world.maxx, changed.x + (CHUNK_SIZE / 2)) + var/y2 = min(world.maxy, changed.y + (CHUNK_SIZE / 2)) + for(var/x = x1; x <= x2; x += CHUNK_SIZE) + for(var/y = y1; y <= y2; y += CHUNK_SIZE) + var/datum/camerachunk/chunk = chunkGenerated(x, y, changed.z) + chunk?.hasChanged() /// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. /datum/cameranet/proc/checkCameraVis(mob/living/target) var/turf/position = get_turf(target) + if(!position) + return return checkTurfVis(position) - /datum/cameranet/proc/checkTurfVis(turf/position) - var/datum/camerachunk/chunk = chunkGenerated(position.x, position.y, position.z) + var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) if(chunk) if(chunk.changed) chunk.hasChanged(1) // Update now, no matter if it's visible or not. @@ -148,18 +178,22 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) return TRUE return FALSE -/datum/cameranet/proc/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - - stat(name, statclick.update("Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]")) +/datum/cameranet/proc/getTurfVis(turf/position) + RETURN_TYPE(/datum/camerachunk) + var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) + if(!chunk) + return FALSE + if(chunk.changed) + chunk.hasChanged(1) // Update now, no matter if it's visible or not. + if(chunk.visibleTurfs[position]) + return chunk /obj/effect/overlay/camera_static name = "static" icon = null icon_state = null anchored = TRUE // should only appear in vis_contents, but to be safe - appearance_flags = RESET_TRANSFORM | TILE_BOUND | RESET_COLOR + appearance_flags = RESET_TRANSFORM | TILE_BOUND | LONG_GLIDE // this combination makes the static block clicks to everything below it, // without appearing in the right-click menu for non-AI clients mouse_opacity = MOUSE_OPACITY_ICON diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index abf891b011ac..31dea0e79df7 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -11,23 +11,24 @@ ///turfs our cameras can see inside our grid var/list/visibleTurfs = list() ///cameras that can see into our grid + ///indexed by the z level of the camera var/list/cameras = list() - ///list of all turfs + ///list of all turfs, associative with that turf's static image + ///turf -> /image var/list/turfs = list() ///camera mobs that can see turfs in our grid var/list/seenby = list() - ///images created to represent obscured turfs - var/list/inactive_static_images = list() ///images currently in use on obscured turfs. var/list/active_static_images = list() var/changed = FALSE var/x = 0 var/y = 0 - var/z = 0 + var/lower_z + var/upper_z /// Add an AI eye to the chunk, then update if changed. -/datum/camerachunk/proc/add(mob/camera/aiEye/eye) +/datum/camerachunk/proc/add(var/mob/camera/aiEye/eye) eye.visibleCameraChunks += src seenby += eye if(changed) @@ -38,7 +39,7 @@ client.images += active_static_images /// Remove an AI eye from the chunk -/datum/camerachunk/proc/remove(mob/camera/aiEye/eye, remove_static_with_last_chunk = TRUE) +/datum/camerachunk/proc/remove(var/mob/camera/aiEye/eye, remove_static_with_last_chunk = TRUE) eye.visibleCameraChunks -= src seenby -= eye @@ -55,28 +56,33 @@ /** * Updates the chunk, makes sure that it doesn't update too much. If the chunk isn't being watched it will * instead be flagged to update the next time an AI Eye moves near it. + * update_delay_buffer is used for cameras that are moving around, which are cyborg inbuilt cameras and + * mecha onboard cameras. This buffer should be usually lower than UPDATE_BUFFER_TIME because + * otherwise a moving camera can run out of its own view before updating static. */ -/datum/camerachunk/proc/hasChanged(update_now = 0) +/datum/camerachunk/proc/hasChanged(update_now = 0, update_delay_buffer = UPDATE_BUFFER_TIME) if(seenby.len || update_now) - addtimer(CALLBACK(src, PROC_REF(update)), UPDATE_BUFFER_TIME, TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(update)), update_delay_buffer, TIMER_UNIQUE) else changed = TRUE /// The actual updating. It gathers the visible turfs from cameras and puts them into the appropiate lists. -/datum/camerachunk/proc/update() +/// Accepts an optional partial_update argument, that blocks any calls out to chunks that could affect us, like above or below +/datum/camerachunk/proc/update(partial_update = FALSE) var/list/updated_visible_turfs = list() - for(var/obj/machinery/camera/current_camera as anything in cameras) - if(!current_camera || !current_camera.can_use()) - continue + for(var/z_level in lower_z to upper_z) + for(var/obj/machinery/camera/current_camera as anything in cameras["[z_level]"]) + if(!current_camera || !current_camera.can_use()) + continue - var/turf/point = locate(src.x + (CHUNK_SIZE / 2), src.y + (CHUNK_SIZE / 2), src.z) - if(get_dist(point, current_camera) > CHUNK_SIZE + (CHUNK_SIZE / 2)) - continue + var/turf/point = locate(src.x + (CHUNK_SIZE / 2), src.y + (CHUNK_SIZE / 2), z_level) + if(get_dist(point, current_camera) > CHUNK_SIZE + (CHUNK_SIZE / 2)) + continue - for(var/turf/vis_turf in current_camera.can_see()) - if(turfs[vis_turf]) - updated_visible_turfs[vis_turf] = vis_turf + for(var/turf/vis_turf in current_camera.can_see()) + if(turfs[vis_turf]) + updated_visible_turfs[vis_turf] = vis_turf ///new turfs that we couldnt see last update but can now var/list/newly_visible_turfs = updated_visible_turfs - visibleTurfs @@ -91,31 +97,24 @@ client.images -= active_static_images for(var/turf/visible_turf as anything in newly_visible_turfs) - var/image/static_image_to_deallocate = obscuredTurfs[visible_turf] - if(!static_image_to_deallocate) + var/image/static_image = obscuredTurfs[visible_turf] + if(!static_image) continue - static_image_to_deallocate.loc = null - active_static_images -= static_image_to_deallocate - inactive_static_images += static_image_to_deallocate - + active_static_images -= static_image obscuredTurfs -= visible_turf for(var/turf/obscured_turf as anything in newly_obscured_turfs) if(obscuredTurfs[obscured_turf] || istype(obscured_turf, /turf/open/ai_visible)) continue - var/image/static_image_to_allocate = inactive_static_images[length(inactive_static_images)] - if(!static_image_to_allocate) - stack_trace("somehow a camera chunk ran out of static images!") + var/image/static_image = turfs[obscured_turf] + if(!static_image) + stack_trace("somehow a camera chunk used a turf it didn't contain!!") break - obscuredTurfs[obscured_turf] = static_image_to_allocate - static_image_to_allocate.loc = obscured_turf - - inactive_static_images -= static_image_to_allocate - active_static_images += static_image_to_allocate - + obscuredTurfs[obscured_turf] = static_image + active_static_images += static_image visibleTurfs = updated_visible_turfs changed = FALSE @@ -127,39 +126,51 @@ client.images += active_static_images + /// Create a new camera chunk, since the chunks are made as they are needed. -/datum/camerachunk/New(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) +/datum/camerachunk/New(x, y, lower_z) + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) src.x = x src.y = y - src.z = z + src.lower_z = lower_z + var/turf/upper_turf = get_highest_turf(locate(x, y, lower_z)) + src.upper_z = upper_turf.z - for(var/obj/machinery/camera/camera in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z))) - if(camera.can_use()) - cameras += camera + for(var/z_level in lower_z to upper_z) + var/list/local_cameras = list() + for(var/obj/machinery/camera/camera in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z_level))) + if(camera.can_use()) + local_cameras += camera - for(var/turf/t as anything in block(locate(max(x, 1), max(y, 1), z), locate(min(x + CHUNK_SIZE - 1, world.maxx), min(y + CHUNK_SIZE - 1, world.maxy), z))) - turfs[t] = t + for(var/mob/living/silicon/sillycone in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z_level))) + if(sillycone.builtInCamera?.can_use()) + local_cameras += sillycone.builtInCamera - for(var/turf in turfs)//one for each 16x16 = 256 turfs this camera chunk encompasses - inactive_static_images += new/image(GLOB.cameranet.obscured) + cameras["[z_level]"] = local_cameras - for(var/obj/machinery/camera/camera as anything in cameras) - if(!camera || !camera.can_use()) - continue + var/image/mirror_from = GLOB.cameranet.obscured_images[GET_Z_PLANE_OFFSET(z_level) + 1] + var/turf/chunk_corner = locate(x, y, z_level) + for(var/turf/lad as anything in CORNER_BLOCK(chunk_corner, CHUNK_SIZE, CHUNK_SIZE)) //we use CHUNK_SIZE for width and height here as it handles subtracting 1 from those two parameters by itself + var/image/our_image = new /image(mirror_from) + our_image.loc = lad + turfs[lad] = our_image + + for(var/obj/machinery/camera/camera as anything in local_cameras) + if(!camera) + continue + + if(!camera.can_use()) + continue - for(var/turf/vis_turf in camera.can_see()) - if(turfs[vis_turf]) - visibleTurfs[vis_turf] = vis_turf + for(var/turf/vis_turf in camera.can_see()) + if(turfs[vis_turf]) + visibleTurfs[vis_turf] = vis_turf for(var/turf/obscured_turf as anything in turfs - visibleTurfs) - var/image/new_static = inactive_static_images[inactive_static_images.len] - new_static.loc = obscured_turf + var/image/new_static = turfs[obscured_turf] active_static_images += new_static - inactive_static_images -= new_static obscuredTurfs[obscured_turf] = new_static #undef UPDATE_BUFFER_TIME -#undef CHUNK_SIZE diff --git a/yogstation.dme b/yogstation.dme index fac8f88d5fd2..8c7a2dac7328 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -41,6 +41,7 @@ #include "code\__DEFINES\bindings.dm" #include "code\__DEFINES\bloodsuckers.dm" #include "code\__DEFINES\callbacks.dm" +#include "code\__DEFINES\cameranets.dm" #include "code\__DEFINES\cargo.dm" #include "code\__DEFINES\chat.dm" #include "code\__DEFINES\cinematics.dm" From 7c91ede8111f5f950af66de875a4211da694f3f7 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 18:06:54 -0500 Subject: [PATCH 084/281] test update test --- code/_onclick/hud/map_view.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/_onclick/hud/map_view.dm b/code/_onclick/hud/map_view.dm index d571f2cff4ea..3c8eb4faacad 100644 --- a/code/_onclick/hud/map_view.dm +++ b/code/_onclick/hud/map_view.dm @@ -11,6 +11,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/map_view) plane = GAME_PLANE del_on_map_removal = FALSE + // Weakrefs of all our hud viewers -> a weakref to the hud datum they last used var/list/datum/weakref/viewers_to_huds = list() From cf2d5f2aa231544bf4be3d514c0fe3de6aabcba5 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 18:20:13 -0500 Subject: [PATCH 085/281] Revert "tries to fix camera" This reverts commit 2d14fbae66df4b54865cd284e63c356af1f6db10. --- .../packages/tgui/interfaces/CameraConsole.js | 143 +++++++++++++ .../tgui/interfaces/CameraConsole.tsx | 198 ------------------ tgui/packages/tgui/interfaces/NtosSecurEye.js | 60 ++++++ .../tgui/interfaces/NtosSecureEye.tsx | 12 -- .../tgui/styles/interfaces/CameraConsole.scss | 53 +++++ tgui/packages/tgui/styles/main.scss | 1 + 6 files changed, 257 insertions(+), 210 deletions(-) create mode 100644 tgui/packages/tgui/interfaces/CameraConsole.js delete mode 100644 tgui/packages/tgui/interfaces/CameraConsole.tsx create mode 100644 tgui/packages/tgui/interfaces/NtosSecurEye.js delete mode 100644 tgui/packages/tgui/interfaces/NtosSecureEye.tsx create mode 100644 tgui/packages/tgui/styles/interfaces/CameraConsole.scss diff --git a/tgui/packages/tgui/interfaces/CameraConsole.js b/tgui/packages/tgui/interfaces/CameraConsole.js new file mode 100644 index 000000000000..8ece49eff205 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CameraConsole.js @@ -0,0 +1,143 @@ +import { filter, sortBy } from 'common/collections'; +import { flow } from 'common/fp'; +import { classes } from 'common/react'; +import { createSearch } from 'common/string'; +import { useBackend, useLocalState } from '../backend'; +import { Button, ByondUi, Flex, Input, Section } from '../components'; +import { Window } from '../layouts'; + +/** + * Returns previous and next camera names relative to the currently + * active camera. + */ +export const prevNextCamera = (cameras, activeCamera) => { + if (!activeCamera) { + return []; + } + const index = cameras.findIndex(camera => ( + camera.name === activeCamera.name + )); + return [ + cameras[index - 1]?.name, + cameras[index + 1]?.name, + ]; +}; + +/** + * Camera selector. + * + * Filters cameras, applies search terms and sorts the alphabetically. + */ +export const selectCameras = (cameras, searchText = '') => { + const testSearch = createSearch(searchText, camera => camera.name); + return flow([ + // Null camera filter + filter(camera => camera?.name), + // Optional search term + searchText && filter(testSearch), + // Slightly expensive, but way better than sorting in BYOND + sortBy(camera => camera.name), + ])(cameras); +}; + +export const CameraConsole = (props, context) => { + const { act, data } = useBackend(context); + const { mapRef, activeCamera } = data; + const cameras = selectCameras(data.cameras); + const [ + prevCameraName, + nextCameraName, + ] = prevNextCamera(cameras, activeCamera); + return ( + +
    + + + +
    +
    +
    + Camera: + {activeCamera + && activeCamera.name + || '—'} +
    +
    +
    + +
    +
    + ); +}; + +export const CameraConsoleContent = (props, context) => { + const { act, data } = useBackend(context); + const [ + searchText, + setSearchText, + ] = useLocalState(context, 'searchText', ''); + const { activeCamera } = data; + const cameras = selectCameras(data.cameras, searchText); + return ( + + + setSearchText(value)} /> + + +
    + {cameras.map(camera => ( + // We're not using the component here because performance + // would be absolutely abysmal (50+ ms for each re-render). +
    [act('switch_camera', { + name: camera.name, + }), document.getElementsByClassName('CameraConsole__left')[0].focus()]}> + {camera.name} +
    + ))} +
    +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/CameraConsole.tsx b/tgui/packages/tgui/interfaces/CameraConsole.tsx deleted file mode 100644 index 4feb31faaf67..000000000000 --- a/tgui/packages/tgui/interfaces/CameraConsole.tsx +++ /dev/null @@ -1,198 +0,0 @@ -import { filter, sortBy } from 'common/collections'; -import { flow } from 'common/fp'; -import { BooleanLike, classes } from 'common/react'; -import { createSearch } from 'common/string'; -import { useBackend, useLocalState } from '../backend'; -import { Button, ByondUi, Input, NoticeBox, Section, Stack } from '../components'; -import { Window } from '../layouts'; - -type Data = { - can_spy: BooleanLike; - mapRef: string; - cameras: Camera[]; - activeCamera: Camera & { status: BooleanLike }; - network: string[]; -}; - -type Camera = { - name: string; -}; - -/** - * Returns previous and next camera names relative to the currently - * active camera. - */ -const prevNextCamera = ( - cameras: Camera[], - activeCamera: Camera & { status: BooleanLike } -) => { - if (!activeCamera) { - return []; - } - const index = cameras.findIndex( - (camera) => camera?.name === activeCamera.name - ); - return [cameras[index - 1]?.name, cameras[index + 1]?.name]; -}; - -/** - * Camera selector. - * - * Filters cameras, applies search terms and sorts the alphabetically. - */ -const selectCameras = (cameras: Camera[], searchText = ''): Camera[] => { - const testSearch = createSearch(searchText, (camera: Camera) => camera.name); - - return flow([ - // Null camera filter - filter((camera: Camera) => !!camera?.name), // Optional search term - searchText && filter(testSearch), - // Slightly expensive, but way better than sorting in BYOND - sortBy((camera: Camera) => camera.name), - ])(cameras); -}; - -export const CameraConsole = (props, context) => { - return ( - - - - - - ); -}; - -export const CameraContent = (props, context) => { - return ( - - - - - - - - - ); -}; - -const CameraSelector = (props, context) => { - const { act, data } = useBackend(context); - const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); - const { activeCamera } = data; - const cameras = selectCameras(data.cameras, searchText); - - return ( - - - setSearchText(value)} - /> - - -
    - {cameras.map((camera) => ( - // We're not using the component here because performance - // would be absolutely abysmal (50+ ms for each re-render). -
    - act('switch_camera', { - name: camera.name, - }) - }> - {camera.name} -
    - ))} -
    -
    -
    - ); -}; - -const CameraControls = (props, context) => { - const { act, data } = useBackend(context); - const { activeCamera, can_spy, mapRef } = data; - const cameras = selectCameras(data.cameras); - - const [prevCameraName, nextCameraName] = prevNextCamera( - cameras, - activeCamera - ); - - return ( -
    - - - - - {activeCamera?.name ? ( - {activeCamera.name} - ) : ( - No input signal - )} - - - - {!!can_spy && ( -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosSecurEye.js b/tgui/packages/tgui/interfaces/NtosSecurEye.js new file mode 100644 index 000000000000..8d4bc6274528 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosSecurEye.js @@ -0,0 +1,60 @@ +import { filter, sortBy } from 'common/collections'; +import { flow } from 'common/fp'; +import { classes } from 'common/react'; +import { createSearch } from 'common/string'; +import { Fragment } from 'inferno'; +import { useBackend, useLocalState } from '../backend'; +import { Button, ByondUi, Input, Section } from '../components'; +import { NtosWindow } from '../layouts'; +import { prevNextCamera, selectCameras, CameraConsoleContent } from './CameraConsole'; +import { logger } from "../logging"; + +export const NtosSecurEye = (props, context) => { + const { act, data, config } = useBackend(context); + const { PC_device_theme, mapRef, activeCamera } = data; + const cameras = selectCameras(data.cameras); + const [ + prevCameraName, + nextCameraName, + ] = prevNextCamera(cameras, activeCamera); + return ( + + +
    + +
    +
    +
    + Camera: + {activeCamera + && activeCamera.name + || '—'} +
    +
    +
    + +
    +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosSecureEye.tsx b/tgui/packages/tgui/interfaces/NtosSecureEye.tsx deleted file mode 100644 index c445b6f160f5..000000000000 --- a/tgui/packages/tgui/interfaces/NtosSecureEye.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { NtosWindow } from '../layouts'; -import { CameraContent } from './CameraConsole'; - -export const NtosSecurEye = (props) => { - return ( - - - - - - ); -}; diff --git a/tgui/packages/tgui/styles/interfaces/CameraConsole.scss b/tgui/packages/tgui/styles/interfaces/CameraConsole.scss new file mode 100644 index 000000000000..7e8f99fdcceb --- /dev/null +++ b/tgui/packages/tgui/styles/interfaces/CameraConsole.scss @@ -0,0 +1,53 @@ +@use '../base.scss'; + +$background-color: rgba(0, 0, 0, 0.33) !default; + +.CameraConsole__left { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: base.em(220px); +} + +.CameraConsole__right { + position: absolute; + top: 0; + bottom: 0; + left: base.em(220px); + right: 0; + background-color: $background-color; +} + +.CameraConsole__toolbar { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 2em; + line-height: 2em; + margin: 0.25em 1em 0; +} + +.CameraConsole__toolbarRight { + position: absolute; + top: 0; + right: 0; + height: 2em; + line-height: 2em; + margin: 0.33em 0.5em 0; +} + +.CameraConsole__map { + position: absolute; + top: base.em(26px); + bottom: 0; + left: 0; + right: 0; + margin: 0.5em; + text-align: center; + + .NoticeBox { + margin-top: calc(50% - 2em); + } +} diff --git a/tgui/packages/tgui/styles/main.scss b/tgui/packages/tgui/styles/main.scss index 9a7a42fcf5aa..d60242ae8627 100644 --- a/tgui/packages/tgui/styles/main.scss +++ b/tgui/packages/tgui/styles/main.scss @@ -48,6 +48,7 @@ // Interfaces @include meta.load-css('./interfaces/AlertModal.scss'); +@include meta.load-css('./interfaces/CameraConsole.scss'); @include meta.load-css('./interfaces/InspectorBooth.scss'); @include meta.load-css('./interfaces/ListInput.scss'); @include meta.load-css('./interfaces/HellishRunes.scss'); From 4a37300f1b4100bee6282034cff2a3bec59afd0f Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 18:38:25 -0500 Subject: [PATCH 086/281] reverts everything I just did peko pain --- code/__DEFINES/cameranets.dm | 5 - code/__DEFINES/turfs.dm | 3 - code/__HELPERS/cameras.dm | 35 ----- code/_onclick/hud/map_popups.dm | 7 +- code/_onclick/hud/map_view.dm | 70 --------- code/game/machinery/camera/tracking.dm | 12 ++ code/game/machinery/computer/camera.dm | 21 ++- .../living/silicon/ai/freelook/cameranet.dm | 137 +++++++----------- .../mob/living/silicon/ai/freelook/chunk.dm | 119 +++++++-------- 9 files changed, 138 insertions(+), 271 deletions(-) delete mode 100644 code/__DEFINES/cameranets.dm delete mode 100644 code/__HELPERS/cameras.dm delete mode 100644 code/_onclick/hud/map_view.dm diff --git a/code/__DEFINES/cameranets.dm b/code/__DEFINES/cameranets.dm deleted file mode 100644 index b88678db4a5e..000000000000 --- a/code/__DEFINES/cameranets.dm +++ /dev/null @@ -1,5 +0,0 @@ -/// We only want chunk sizes that are to the power of 2. E.g: 2, 4, 8, 16, etc.. -#define CHUNK_SIZE 16 -/// Takes a position, transforms it into a chunk bounded position. Indexes at 1 so it'll land on actual turfs always -#define GET_CHUNK_COORD(v) (max((FLOOR(v, CHUNK_SIZE)), 1)) - diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index a85ee0a5520d..9f54a7fcfbb9 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -9,9 +9,6 @@ ///Returns all currently loaded turfs #define ALL_TURFS(...) block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz)) -/// Returns a list of turfs in the rectangle specified by BOTTOM LEFT corner and height/width, checks for being outside the world border for you -#define CORNER_BLOCK(corner, width, height) CORNER_BLOCK_OFFSET(corner, width, height, 0, 0) - #define IS_OPAQUE_TURF(turf) (turf.directional_opacity == ALL_CARDINALS) /// The pipes, disposals, and wires are hidden diff --git a/code/__HELPERS/cameras.dm b/code/__HELPERS/cameras.dm deleted file mode 100644 index 9d74f3fe71b4..000000000000 --- a/code/__HELPERS/cameras.dm +++ /dev/null @@ -1,35 +0,0 @@ -/** - * get_camera_list - * - * Builds a list of all available cameras that can be seen to networks_available - * Args: - * networks_available - List of networks that we use to see which cameras are visible to it. - */ -/proc/get_camera_list(list/networks_available) - var/list/all_camera_list = list() - for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras) - all_camera_list.Add(camera) - - camera_sort(all_camera_list) - - var/list/usable_camera_list = list() - - for(var/obj/machinery/camera/camera as anything in all_camera_list) - var/list/tempnetwork = camera.network & networks_available - if(length(tempnetwork)) - usable_camera_list["[camera.c_tag][camera.can_use() ? null : " (Deactivated)"]"] = camera - - return usable_camera_list - -///Sorts the list of cameras by their c_tag to display to players. -/proc/camera_sort(list/camera_list) - var/obj/machinery/camera/camera_comparing_a - var/obj/machinery/camera/camera_comparing_b - - for(var/i = length(camera_list), i > 0, i--) - for(var/j = 1 to i - 1) - camera_comparing_a = camera_list[j] - camera_comparing_b = camera_list[j + 1] - if(sorttext(camera_comparing_a.c_tag, camera_comparing_b.c_tag) < 0) - camera_list.Swap(j, j + 1) - return camera_list diff --git a/code/_onclick/hud/map_popups.dm b/code/_onclick/hud/map_popups.dm index 8a4a1de86977..07c43eac4491 100644 --- a/code/_onclick/hud/map_popups.dm +++ b/code/_onclick/hud/map_popups.dm @@ -77,9 +77,10 @@ screen_maps[screen_obj.assigned_map] = list() // NOTE: Possibly an expensive operation var/list/screen_map = screen_maps[screen_obj.assigned_map] - screen_map |= screen_obj - screen |= screen_obj - + if(!screen_map.Find(screen_obj)) + screen_map += screen_obj + if(!screen.Find(screen_obj)) + screen += screen_obj /** * Clears the map of registered screen objects. diff --git a/code/_onclick/hud/map_view.dm b/code/_onclick/hud/map_view.dm deleted file mode 100644 index 3c8eb4faacad..000000000000 --- a/code/_onclick/hud/map_view.dm +++ /dev/null @@ -1,70 +0,0 @@ -/** - * A screen object, which acts as a container for turfs and other things - * you want to show on the map, which you usually attach to "vis_contents". - * Additionally manages the plane masters required to display said container contents - */ -INITIALIZE_IMMEDIATE(/atom/movable/screen/map_view) -/atom/movable/screen/map_view - name = "screen" - // Map view has to be on the lowest plane to enable proper lighting - layer = GAME_PLANE - plane = GAME_PLANE - del_on_map_removal = FALSE - - - // Weakrefs of all our hud viewers -> a weakref to the hud datum they last used - var/list/datum/weakref/viewers_to_huds = list() - -/atom/movable/screen/map_view/Destroy() - for(var/datum/weakref/client_ref in viewers_to_huds) - var/client/our_client = client_ref.resolve() - if(!our_client) - continue - hide_from(our_client.mob) - - return ..() - -/atom/movable/screen/map_view/proc/generate_view(map_key) - // Map keys have to start and end with an A-Z character, - // and definitely NOT with a square bracket or even a number. - // I wasted 6 hours on this. :agony: - // -- Stylemistake - assigned_map = map_key - set_position(1, 1) - -/atom/movable/screen/map_view/proc/display_to(mob/show_to) - show_to.client.register_map_obj(src) - // We need to add planesmasters to the popup, otherwise - // blending fucks up massively. Any planesmaster on the main screen does - // NOT apply to map popups. If there's ever a way to make planesmasters - // omnipresent, then this wouldn't be needed. - // We lazy load this because there's no point creating all these if none's gonna see em - - // Store this info in a client -> hud pattern, so ghosts closing the window nukes the right group - var/datum/weakref/client_ref = WEAKREF(show_to.client) - - var/datum/weakref/hud_ref = viewers_to_huds[client_ref] - var/datum/hud/our_hud = hud_ref?.resolve() - if(our_hud) - return our_hud.get_plane_group(PLANE_GROUP_POPUP_WINDOW(src)) - - // Generate a new plane group for this case - var/datum/plane_master_group/popup/pop_planes = new(PLANE_GROUP_POPUP_WINDOW(src), assigned_map) - viewers_to_huds[client_ref] = WEAKREF(show_to.hud_used) - pop_planes.attach_to(show_to.hud_used) - - return pop_planes - -/atom/movable/screen/map_view/proc/hide_from(mob/hide_from) - hide_from?.canon_client.clear_map(assigned_map) - var/client_ref = WEAKREF(hide_from?.canon_client) - - // Make sure we clear the *right* hud - var/datum/weakref/hud_ref = viewers_to_huds[client_ref] - viewers_to_huds -= client_ref - var/datum/hud/clear_from = hud_ref?.resolve() - if(!clear_from) - return - - var/datum/plane_master_group/popup/pop_planes = clear_from.get_plane_group(PLANE_GROUP_POPUP_WINDOW(src)) - qdel(pop_planes) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 9e7c56217422..0976aba838e4 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -137,3 +137,15 @@ if (!can_use()) return user.switchCamera(src) + +/proc/camera_sort(list/L) + var/obj/machinery/camera/a + var/obj/machinery/camera/b + + for (var/i = L.len, i > 0, i--) + for (var/j = 1 to i - 1) + a = L[j] + b = L[j + 1] + if (sorttext(a.c_tag, b.c_tag) < 0) + L.Swap(j, j + 1) + return L diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index d0ba380e40c7..43f22a4e2754 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -12,8 +12,7 @@ // Stuff needed to render the map var/map_name var/const/default_map_size = 15 - // Stuff needed to render the map - var/atom/movable/screen/map_view/cam_screen + var/atom/movable/screen/cam_screen /// All the plane masters that need to be applied. var/list/cam_plane_masters var/atom/movable/screen/background/cam_background @@ -27,14 +26,24 @@ // Map name has to start and end with an A-Z character, // and definitely NOT with a square bracket or even a number. // I wasted 6 hours on this. :agony: - var/map_name = "camera_console_[REF(src)]_map" + map_name = "camera_console_[REF(src)]_map" // Convert networks to lowercase for(var/i in network) network -= i network += lowertext(i) // Initialize map objects cam_screen = new - cam_screen.generate_view(map_name) + cam_screen.name = "screen" + cam_screen.assigned_map = map_name + cam_screen.del_on_map_removal = FALSE + cam_screen.screen_loc = "[map_name]:1,1" + cam_plane_masters = list() + for(var/plane in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/instance = new plane() + instance.assigned_map = map_name + instance.del_on_map_removal = FALSE + instance.screen_loc = "[map_name]:CENTER" + cam_plane_masters += instance cam_background = new cam_background.assigned_map = map_name cam_background.del_on_map_removal = FALSE @@ -62,7 +71,9 @@ playsound(src, 'sound/machines/terminal_on.ogg', 25, FALSE) use_power(active_power_usage) // Register map objects - cam_screen.display_to(user) + user.client.register_map_obj(cam_screen) + for(var/plane in cam_plane_masters) + user.client.register_map_obj(plane) user.client.register_map_obj(cam_background) // Open UI ui = new(user, src, "CameraConsole", name) diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index cf4f9fca9fcb..efd4184eee1f 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -2,6 +2,8 @@ // // The datum containing all the chunks. +#define CHUNK_SIZE 16 // Only chunk sizes that are to the power of 2. E.g: 2, 4, 8, 16, etc.. + GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) /datum/cameranet @@ -9,54 +11,38 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) var/name = "Camera Net" /// The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). - var/list/obj/machinery/camera/cameras = list() + var/list/cameras = list() /// The chunks of the map, mapping the areas that the cameras can see. var/list/chunks = list() var/ready = 0 - - /// List of images cloned by all chunk static images put onto turfs cameras cant see - /// Indexed by the plane offset to use - var/list/image/obscured_images + // The object used for the clickable stat() button. + var/obj/effect/statclick/statclick + ///The image given to the effect in vis_contents on AI clients + var/image/obscured /datum/cameranet/New() - obscured_images = list() - update_offsets(SSmapping.max_plane_offset) - RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_offset_growth)) - -/datum/cameranet/proc/update_offsets(new_offset) - for(var/i in length(obscured_images) to new_offset) - var/image/obscured = new('icons/effects/cameravis.dmi') - SET_PLANE_W_SCALAR(obscured, CAMERA_STATIC_PLANE, i) - obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART - obscured.override = TRUE - obscured_images += obscured - -/datum/cameranet/proc/on_offset_growth(datum/source, old_offset, new_offset) - SIGNAL_HANDLER - update_offsets(new_offset) + obscured = new('icons/effects/cameravis.dmi') + obscured.plane = CAMERA_STATIC_PLANE + obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART + obscured.override = TRUE /// Checks if a chunk has been Generated in x, y, z. /datum/cameranet/proc/chunkGenerated(x, y, z) - x = GET_CHUNK_COORD(x) - y = GET_CHUNK_COORD(y) - if(GET_LOWEST_STACK_OFFSET(z) != 0) - var/turf/lowest = get_lowest_turf(locate(x, y, z)) - return chunks["[x],[y],[lowest.z]"] - + x &= ~(CHUNK_SIZE - 1) + y &= ~(CHUNK_SIZE - 1) return chunks["[x],[y],[z]"] // Returns the chunk in the x, y, z. // If there is no chunk, it creates a new chunk and returns that. /datum/cameranet/proc/getCameraChunk(x, y, z) - x = GET_CHUNK_COORD(x) - y = GET_CHUNK_COORD(y) - var/turf/lowest = get_lowest_turf(locate(x, y, z)) - var/key = "[x],[y],[lowest.z]" + x &= ~(CHUNK_SIZE - 1) + y &= ~(CHUNK_SIZE - 1) + var/key = "[x],[y],[z]" . = chunks[key] if(!.) - chunks[key] = . = new /datum/camerachunk(x, y, lowest.z) + chunks[key] = . = new /datum/camerachunk(x, y, z) -/// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. +/// Updates what the ai_eye can see. It is recommended you use this when the ai_eye moves or it's location is set. /datum/cameranet/proc/visibility(list/moved_eyes, client/C, list/other_eyes, use_static = TRUE) if(!islist(moved_eyes)) moved_eyes = moved_eyes ? list(moved_eyes) : list() @@ -67,18 +53,21 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/mob/camera/aiEye/eye as anything in moved_eyes) var/list/visibleChunks = list() - //Get the eye's turf in case it's located in an object like a mecha - var/turf/eye_turf = get_turf(eye) if(eye.loc) + var/x_value = eye.x + var/y_value = eye.y + var/z_value = eye.z + // 0xf = 15 var/static_range = eye.static_visibility_range - var/x1 = max(1, eye_turf.x - static_range) - var/y1 = max(1, eye_turf.y - static_range) - var/x2 = min(world.maxx, eye_turf.x + static_range) - var/y2 = min(world.maxy, eye_turf.y + static_range) + var/x1 = max(0, x_value - static_range) & ~(CHUNK_SIZE - 1) + var/y1 = max(0, y_value - static_range) & ~(CHUNK_SIZE - 1) + var/x2 = min(world.maxx, x_value + static_range) & ~(CHUNK_SIZE - 1) + var/y2 = min(world.maxy, y_value + static_range) & ~(CHUNK_SIZE - 1) + for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) - visibleChunks |= getCameraChunk(x, y, eye_turf.z) + visibleChunks |= getCameraChunk(x, y, z_value) var/list/remove = eye.visibleCameraChunks - visibleChunks var/list/add = visibleChunks - eye.visibleCameraChunks @@ -89,7 +78,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/datum/camerachunk/chunk as anything in add) chunk.add(eye) -/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. +/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. /datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) if(!SSticker || (opacity_check && !A.opacity)) return @@ -110,14 +99,10 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) if(c.can_use()) majorChunkChange(c, 1) -/** - * Used for Cyborg/mecha cameras. Since portable cameras can be in ANY chunk. - * update_delay_buffer is passed all the way to hasChanged() from their camera updates on movement - * to change the time between static updates. -*/ -/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/updating_camera, update_delay_buffer) - if(updating_camera.can_use()) - majorChunkChange(updating_camera, 1, update_delay_buffer) +/// Used for Cyborg cameras. Since portable cameras can be in ANY chunk. +/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/c) + if(c.can_use()) + majorChunkChange(c, 1) /** * Never access this proc directly!!!! @@ -125,52 +110,37 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) * It will also add the atom to the cameras list if you set the choice to 1. * Setting the choice to 0 will remove the camera from the chunks. * If you want to update the chunks around an object, without adding/removing a camera, use choice 2. - * update_delay_buffer is passed all the way to hasChanged() from portable camera updates on movement - * to change the time between static updates. */ -/datum/cameranet/proc/majorChunkChange(atom/c, choice, update_delay_buffer) - if(QDELETED(c) && choice == 1) - CRASH("Tried to add a qdeleting camera to the net") +/datum/cameranet/proc/majorChunkChange(atom/c, choice) + if(!c) + return var/turf/T = get_turf(c) if(T) - var/x1 = max(1, T.x - (CHUNK_SIZE / 2)) - var/y1 = max(1, T.y - (CHUNK_SIZE / 2)) - var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) - var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) + var/x1 = max(0, T.x - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + var/y1 = max(0, T.y - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) var/datum/camerachunk/chunk = chunkGenerated(x, y, T.z) if(chunk) if(choice == 0) // Remove the camera. - chunk.cameras["[T.z]"] -= c + chunk.cameras -= c else if(choice == 1) // You can't have the same camera in the list twice. - chunk.cameras["[T.z]"] |= c - chunk.hasChanged(update_delay_buffer = update_delay_buffer) - -/// A faster, turf only version of [/datum/cameranet/proc/majorChunkChange] -/// For use in sensitive code, be careful with it -/datum/cameranet/proc/bareMajorChunkChange(turf/changed) - var/x1 = max(1, changed.x - (CHUNK_SIZE / 2)) - var/y1 = max(1, changed.y - (CHUNK_SIZE / 2)) - var/x2 = min(world.maxx, changed.x + (CHUNK_SIZE / 2)) - var/y2 = min(world.maxy, changed.y + (CHUNK_SIZE / 2)) - for(var/x = x1; x <= x2; x += CHUNK_SIZE) - for(var/y = y1; y <= y2; y += CHUNK_SIZE) - var/datum/camerachunk/chunk = chunkGenerated(x, y, changed.z) - chunk?.hasChanged() + chunk.cameras |= c + chunk.hasChanged() /// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. /datum/cameranet/proc/checkCameraVis(mob/living/target) var/turf/position = get_turf(target) - if(!position) - return return checkTurfVis(position) + /datum/cameranet/proc/checkTurfVis(turf/position) - var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) + var/datum/camerachunk/chunk = chunkGenerated(position.x, position.y, position.z) if(chunk) if(chunk.changed) chunk.hasChanged(1) // Update now, no matter if it's visible or not. @@ -178,25 +148,22 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) return TRUE return FALSE -/datum/cameranet/proc/getTurfVis(turf/position) - RETURN_TYPE(/datum/camerachunk) - var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) - if(!chunk) - return FALSE - if(chunk.changed) - chunk.hasChanged(1) // Update now, no matter if it's visible or not. - if(chunk.visibleTurfs[position]) - return chunk +/datum/cameranet/proc/stat_entry() + if(!statclick) + statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) + + stat(name, statclick.update("Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]")) /obj/effect/overlay/camera_static name = "static" icon = null icon_state = null anchored = TRUE // should only appear in vis_contents, but to be safe - appearance_flags = RESET_TRANSFORM | TILE_BOUND | LONG_GLIDE + appearance_flags = RESET_TRANSFORM | TILE_BOUND | RESET_COLOR // this combination makes the static block clicks to everything below it, // without appearing in the right-click menu for non-AI clients mouse_opacity = MOUSE_OPACITY_ICON invisibility = INVISIBILITY_ABSTRACT + layer = CAMERA_STATIC_LAYER plane = CAMERA_STATIC_PLANE diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index 31dea0e79df7..abf891b011ac 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -11,24 +11,23 @@ ///turfs our cameras can see inside our grid var/list/visibleTurfs = list() ///cameras that can see into our grid - ///indexed by the z level of the camera var/list/cameras = list() - ///list of all turfs, associative with that turf's static image - ///turf -> /image + ///list of all turfs var/list/turfs = list() ///camera mobs that can see turfs in our grid var/list/seenby = list() + ///images created to represent obscured turfs + var/list/inactive_static_images = list() ///images currently in use on obscured turfs. var/list/active_static_images = list() var/changed = FALSE var/x = 0 var/y = 0 - var/lower_z - var/upper_z + var/z = 0 /// Add an AI eye to the chunk, then update if changed. -/datum/camerachunk/proc/add(var/mob/camera/aiEye/eye) +/datum/camerachunk/proc/add(mob/camera/aiEye/eye) eye.visibleCameraChunks += src seenby += eye if(changed) @@ -39,7 +38,7 @@ client.images += active_static_images /// Remove an AI eye from the chunk -/datum/camerachunk/proc/remove(var/mob/camera/aiEye/eye, remove_static_with_last_chunk = TRUE) +/datum/camerachunk/proc/remove(mob/camera/aiEye/eye, remove_static_with_last_chunk = TRUE) eye.visibleCameraChunks -= src seenby -= eye @@ -56,33 +55,28 @@ /** * Updates the chunk, makes sure that it doesn't update too much. If the chunk isn't being watched it will * instead be flagged to update the next time an AI Eye moves near it. - * update_delay_buffer is used for cameras that are moving around, which are cyborg inbuilt cameras and - * mecha onboard cameras. This buffer should be usually lower than UPDATE_BUFFER_TIME because - * otherwise a moving camera can run out of its own view before updating static. */ -/datum/camerachunk/proc/hasChanged(update_now = 0, update_delay_buffer = UPDATE_BUFFER_TIME) +/datum/camerachunk/proc/hasChanged(update_now = 0) if(seenby.len || update_now) - addtimer(CALLBACK(src, PROC_REF(update)), update_delay_buffer, TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(update)), UPDATE_BUFFER_TIME, TIMER_UNIQUE) else changed = TRUE /// The actual updating. It gathers the visible turfs from cameras and puts them into the appropiate lists. -/// Accepts an optional partial_update argument, that blocks any calls out to chunks that could affect us, like above or below -/datum/camerachunk/proc/update(partial_update = FALSE) +/datum/camerachunk/proc/update() var/list/updated_visible_turfs = list() - for(var/z_level in lower_z to upper_z) - for(var/obj/machinery/camera/current_camera as anything in cameras["[z_level]"]) - if(!current_camera || !current_camera.can_use()) - continue + for(var/obj/machinery/camera/current_camera as anything in cameras) + if(!current_camera || !current_camera.can_use()) + continue - var/turf/point = locate(src.x + (CHUNK_SIZE / 2), src.y + (CHUNK_SIZE / 2), z_level) - if(get_dist(point, current_camera) > CHUNK_SIZE + (CHUNK_SIZE / 2)) - continue + var/turf/point = locate(src.x + (CHUNK_SIZE / 2), src.y + (CHUNK_SIZE / 2), src.z) + if(get_dist(point, current_camera) > CHUNK_SIZE + (CHUNK_SIZE / 2)) + continue - for(var/turf/vis_turf in current_camera.can_see()) - if(turfs[vis_turf]) - updated_visible_turfs[vis_turf] = vis_turf + for(var/turf/vis_turf in current_camera.can_see()) + if(turfs[vis_turf]) + updated_visible_turfs[vis_turf] = vis_turf ///new turfs that we couldnt see last update but can now var/list/newly_visible_turfs = updated_visible_turfs - visibleTurfs @@ -97,24 +91,31 @@ client.images -= active_static_images for(var/turf/visible_turf as anything in newly_visible_turfs) - var/image/static_image = obscuredTurfs[visible_turf] - if(!static_image) + var/image/static_image_to_deallocate = obscuredTurfs[visible_turf] + if(!static_image_to_deallocate) continue - active_static_images -= static_image + static_image_to_deallocate.loc = null + active_static_images -= static_image_to_deallocate + inactive_static_images += static_image_to_deallocate + obscuredTurfs -= visible_turf for(var/turf/obscured_turf as anything in newly_obscured_turfs) if(obscuredTurfs[obscured_turf] || istype(obscured_turf, /turf/open/ai_visible)) continue - var/image/static_image = turfs[obscured_turf] - if(!static_image) - stack_trace("somehow a camera chunk used a turf it didn't contain!!") + var/image/static_image_to_allocate = inactive_static_images[length(inactive_static_images)] + if(!static_image_to_allocate) + stack_trace("somehow a camera chunk ran out of static images!") break - obscuredTurfs[obscured_turf] = static_image - active_static_images += static_image + obscuredTurfs[obscured_turf] = static_image_to_allocate + static_image_to_allocate.loc = obscured_turf + + inactive_static_images -= static_image_to_allocate + active_static_images += static_image_to_allocate + visibleTurfs = updated_visible_turfs changed = FALSE @@ -126,51 +127,39 @@ client.images += active_static_images - /// Create a new camera chunk, since the chunks are made as they are needed. -/datum/camerachunk/New(x, y, lower_z) - x = GET_CHUNK_COORD(x) - y = GET_CHUNK_COORD(y) +/datum/camerachunk/New(x, y, z) + x &= ~(CHUNK_SIZE - 1) + y &= ~(CHUNK_SIZE - 1) src.x = x src.y = y - src.lower_z = lower_z - var/turf/upper_turf = get_highest_turf(locate(x, y, lower_z)) - src.upper_z = upper_turf.z - - for(var/z_level in lower_z to upper_z) - var/list/local_cameras = list() - for(var/obj/machinery/camera/camera in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z_level))) - if(camera.can_use()) - local_cameras += camera + src.z = z - for(var/mob/living/silicon/sillycone in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z_level))) - if(sillycone.builtInCamera?.can_use()) - local_cameras += sillycone.builtInCamera + for(var/obj/machinery/camera/camera in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z))) + if(camera.can_use()) + cameras += camera - cameras["[z_level]"] = local_cameras + for(var/turf/t as anything in block(locate(max(x, 1), max(y, 1), z), locate(min(x + CHUNK_SIZE - 1, world.maxx), min(y + CHUNK_SIZE - 1, world.maxy), z))) + turfs[t] = t - var/image/mirror_from = GLOB.cameranet.obscured_images[GET_Z_PLANE_OFFSET(z_level) + 1] - var/turf/chunk_corner = locate(x, y, z_level) - for(var/turf/lad as anything in CORNER_BLOCK(chunk_corner, CHUNK_SIZE, CHUNK_SIZE)) //we use CHUNK_SIZE for width and height here as it handles subtracting 1 from those two parameters by itself - var/image/our_image = new /image(mirror_from) - our_image.loc = lad - turfs[lad] = our_image + for(var/turf in turfs)//one for each 16x16 = 256 turfs this camera chunk encompasses + inactive_static_images += new/image(GLOB.cameranet.obscured) - for(var/obj/machinery/camera/camera as anything in local_cameras) - if(!camera) - continue - - if(!camera.can_use()) - continue + for(var/obj/machinery/camera/camera as anything in cameras) + if(!camera || !camera.can_use()) + continue - for(var/turf/vis_turf in camera.can_see()) - if(turfs[vis_turf]) - visibleTurfs[vis_turf] = vis_turf + for(var/turf/vis_turf in camera.can_see()) + if(turfs[vis_turf]) + visibleTurfs[vis_turf] = vis_turf for(var/turf/obscured_turf as anything in turfs - visibleTurfs) - var/image/new_static = turfs[obscured_turf] + var/image/new_static = inactive_static_images[inactive_static_images.len] + new_static.loc = obscured_turf active_static_images += new_static + inactive_static_images -= new_static obscuredTurfs[obscured_turf] = new_static #undef UPDATE_BUFFER_TIME +#undef CHUNK_SIZE From a4d9e04e523b7d59c2e5c6a9cd3c1396a46b40b2 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 18:40:33 -0500 Subject: [PATCH 087/281] bye bitch --- yogstation.dme | 3 --- 1 file changed, 3 deletions(-) diff --git a/yogstation.dme b/yogstation.dme index 8c7a2dac7328..374f54ea108d 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -41,7 +41,6 @@ #include "code\__DEFINES\bindings.dm" #include "code\__DEFINES\bloodsuckers.dm" #include "code\__DEFINES\callbacks.dm" -#include "code\__DEFINES\cameranets.dm" #include "code\__DEFINES\cargo.dm" #include "code\__DEFINES\chat.dm" #include "code\__DEFINES\cinematics.dm" @@ -218,7 +217,6 @@ #include "code\__HELPERS\animations.dm" #include "code\__HELPERS\areas.dm" #include "code\__HELPERS\AStar.dm" -#include "code\__HELPERS\cameras.dm" #include "code\__HELPERS\cmp.dm" #include "code\__HELPERS\colors.dm" #include "code\__HELPERS\config.dm" @@ -321,7 +319,6 @@ #include "code\_onclick\hud\lavaland_elite.dm" #include "code\_onclick\hud\living.dm" #include "code\_onclick\hud\map_popups.dm" -#include "code\_onclick\hud\map_view.dm" #include "code\_onclick\hud\monkey.dm" #include "code\_onclick\hud\movable_screen_objects.dm" #include "code\_onclick\hud\pai.dm" From 77738b588765d8dd0d99ec568330face3ff4b8ad Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 18:49:09 -0500 Subject: [PATCH 088/281] oh yeah add this I guess --- code/__DEFINES/layers.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index e81166024dcc..38bd74949388 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -75,6 +75,7 @@ #define PIPECRAWL_IMAGES_PLANE 20 ///AI Camera Static +#define CAMERA_STATIC_LAYER 21 #define CAMERA_STATIC_PLANE 21 ///Anything that wants to be part of the game plane, but also wants to draw above literally everything else From 0e421ebf5f1d3702739fd7078cf53a8d0ef964a6 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 19:36:45 -0500 Subject: [PATCH 089/281] Fucks up the camera net + chunk why --- .../living/silicon/ai/freelook/cameranet.dm | 144 +++++++++++------- .../mob/living/silicon/ai/freelook/chunk.dm | 118 +++++++------- 2 files changed, 158 insertions(+), 104 deletions(-) diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index efd4184eee1f..5f9bea5860b3 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -1,9 +1,14 @@ +/// We only want chunk sizes that are to the power of 2. E.g: 2, 4, 8, 16, etc.. +#define CHUNK_SIZE 16 +/// Takes a position, transforms it into a chunk bounded position. Indexes at 1 so it'll land on actual turfs always +#define GET_CHUNK_COORD(v) (max((FLOOR(v, CHUNK_SIZE)), 1)) + + + // CAMERA NET // // The datum containing all the chunks. -#define CHUNK_SIZE 16 // Only chunk sizes that are to the power of 2. E.g: 2, 4, 8, 16, etc.. - GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) /datum/cameranet @@ -11,38 +16,54 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) var/name = "Camera Net" /// The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). - var/list/cameras = list() + var/list/obj/machinery/camera/cameras = list() /// The chunks of the map, mapping the areas that the cameras can see. var/list/chunks = list() var/ready = 0 - // The object used for the clickable stat() button. - var/obj/effect/statclick/statclick - ///The image given to the effect in vis_contents on AI clients - var/image/obscured + + /// List of images cloned by all chunk static images put onto turfs cameras cant see + /// Indexed by the plane offset to use + var/list/image/obscured_images /datum/cameranet/New() - obscured = new('icons/effects/cameravis.dmi') - obscured.plane = CAMERA_STATIC_PLANE - obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART - obscured.override = TRUE + obscured_images = list() + update_offsets(SSmapping.max_plane_offset) + RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_offset_growth)) + +/datum/cameranet/proc/update_offsets(new_offset) + for(var/i in length(obscured_images) to new_offset) + var/image/obscured = new('icons/effects/cameravis.dmi') + SET_PLANE_W_SCALAR(obscured, CAMERA_STATIC_PLANE, i) + obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART + obscured.override = TRUE + obscured_images += obscured + +/datum/cameranet/proc/on_offset_growth(datum/source, old_offset, new_offset) + SIGNAL_HANDLER + update_offsets(new_offset) /// Checks if a chunk has been Generated in x, y, z. /datum/cameranet/proc/chunkGenerated(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) + if(GET_LOWEST_STACK_OFFSET(z) != 0) + var/turf/lowest = get_lowest_turf(locate(x, y, z)) + return chunks["[x],[y],[lowest.z]"] + return chunks["[x],[y],[z]"] // Returns the chunk in the x, y, z. // If there is no chunk, it creates a new chunk and returns that. /datum/cameranet/proc/getCameraChunk(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) - var/key = "[x],[y],[z]" + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) + var/turf/lowest = get_lowest_turf(locate(x, y, z)) + var/key = "[x],[y],[lowest.z]" . = chunks[key] if(!.) - chunks[key] = . = new /datum/camerachunk(x, y, z) + chunks[key] = . = new /datum/camerachunk(x, y, lowest.z) -/// Updates what the ai_eye can see. It is recommended you use this when the ai_eye moves or it's location is set. +/// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. /datum/cameranet/proc/visibility(list/moved_eyes, client/C, list/other_eyes, use_static = TRUE) if(!islist(moved_eyes)) moved_eyes = moved_eyes ? list(moved_eyes) : list() @@ -53,21 +74,18 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/mob/camera/aiEye/eye as anything in moved_eyes) var/list/visibleChunks = list() + //Get the eye's turf in case it's located in an object like a mecha + var/turf/eye_turf = get_turf(eye) if(eye.loc) - var/x_value = eye.x - var/y_value = eye.y - var/z_value = eye.z - // 0xf = 15 var/static_range = eye.static_visibility_range - var/x1 = max(0, x_value - static_range) & ~(CHUNK_SIZE - 1) - var/y1 = max(0, y_value - static_range) & ~(CHUNK_SIZE - 1) - var/x2 = min(world.maxx, x_value + static_range) & ~(CHUNK_SIZE - 1) - var/y2 = min(world.maxy, y_value + static_range) & ~(CHUNK_SIZE - 1) - + var/x1 = max(1, eye_turf.x - static_range) + var/y1 = max(1, eye_turf.y - static_range) + var/x2 = min(world.maxx, eye_turf.x + static_range) + var/y2 = min(world.maxy, eye_turf.y + static_range) for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) - visibleChunks |= getCameraChunk(x, y, z_value) + visibleChunks |= getCameraChunk(x, y, eye_turf.z) var/list/remove = eye.visibleCameraChunks - visibleChunks var/list/add = visibleChunks - eye.visibleCameraChunks @@ -78,7 +96,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/datum/camerachunk/chunk as anything in add) chunk.add(eye) -/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. +/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. /datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) if(!SSticker || (opacity_check && !A.opacity)) return @@ -99,10 +117,14 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) if(c.can_use()) majorChunkChange(c, 1) -/// Used for Cyborg cameras. Since portable cameras can be in ANY chunk. -/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/c) - if(c.can_use()) - majorChunkChange(c, 1) +/** + * Used for Cyborg/mecha cameras. Since portable cameras can be in ANY chunk. + * update_delay_buffer is passed all the way to hasChanged() from their camera updates on movement + * to change the time between static updates. +*/ +/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/updating_camera, update_delay_buffer) + if(updating_camera.can_use()) + majorChunkChange(updating_camera, 1, update_delay_buffer) /** * Never access this proc directly!!!! @@ -110,37 +132,52 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) * It will also add the atom to the cameras list if you set the choice to 1. * Setting the choice to 0 will remove the camera from the chunks. * If you want to update the chunks around an object, without adding/removing a camera, use choice 2. + * update_delay_buffer is passed all the way to hasChanged() from portable camera updates on movement + * to change the time between static updates. */ -/datum/cameranet/proc/majorChunkChange(atom/c, choice) - if(!c) - return +/datum/cameranet/proc/majorChunkChange(atom/c, choice, update_delay_buffer) + if(QDELETED(c) && choice == 1) + CRASH("Tried to add a qdeleting camera to the net") var/turf/T = get_turf(c) if(T) - var/x1 = max(0, T.x - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/y1 = max(0, T.y - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + var/x1 = max(1, T.x - (CHUNK_SIZE / 2)) + var/y1 = max(1, T.y - (CHUNK_SIZE / 2)) + var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) + var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) var/datum/camerachunk/chunk = chunkGenerated(x, y, T.z) if(chunk) if(choice == 0) // Remove the camera. - chunk.cameras -= c + chunk.cameras["[T.z]"] -= c else if(choice == 1) // You can't have the same camera in the list twice. - chunk.cameras |= c - chunk.hasChanged() + chunk.cameras["[T.z]"] |= c + chunk.hasChanged(update_delay_buffer = update_delay_buffer) + +/// A faster, turf only version of [/datum/cameranet/proc/majorChunkChange] +/// For use in sensitive code, be careful with it +/datum/cameranet/proc/bareMajorChunkChange(turf/changed) + var/x1 = max(1, changed.x - (CHUNK_SIZE / 2)) + var/y1 = max(1, changed.y - (CHUNK_SIZE / 2)) + var/x2 = min(world.maxx, changed.x + (CHUNK_SIZE / 2)) + var/y2 = min(world.maxy, changed.y + (CHUNK_SIZE / 2)) + for(var/x = x1; x <= x2; x += CHUNK_SIZE) + for(var/y = y1; y <= y2; y += CHUNK_SIZE) + var/datum/camerachunk/chunk = chunkGenerated(x, y, changed.z) + chunk?.hasChanged() /// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. /datum/cameranet/proc/checkCameraVis(mob/living/target) var/turf/position = get_turf(target) + if(!position) + return return checkTurfVis(position) - /datum/cameranet/proc/checkTurfVis(turf/position) - var/datum/camerachunk/chunk = chunkGenerated(position.x, position.y, position.z) + var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) if(chunk) if(chunk.changed) chunk.hasChanged(1) // Update now, no matter if it's visible or not. @@ -148,22 +185,25 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) return TRUE return FALSE -/datum/cameranet/proc/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - - stat(name, statclick.update("Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]")) +/datum/cameranet/proc/getTurfVis(turf/position) + RETURN_TYPE(/datum/camerachunk) + var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) + if(!chunk) + return FALSE + if(chunk.changed) + chunk.hasChanged(1) // Update now, no matter if it's visible or not. + if(chunk.visibleTurfs[position]) + return chunk /obj/effect/overlay/camera_static name = "static" icon = null icon_state = null anchored = TRUE // should only appear in vis_contents, but to be safe - appearance_flags = RESET_TRANSFORM | TILE_BOUND | RESET_COLOR + appearance_flags = RESET_TRANSFORM | TILE_BOUND | LONG_GLIDE // this combination makes the static block clicks to everything below it, // without appearing in the right-click menu for non-AI clients mouse_opacity = MOUSE_OPACITY_ICON invisibility = INVISIBILITY_ABSTRACT - layer = CAMERA_STATIC_LAYER plane = CAMERA_STATIC_PLANE diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index abf891b011ac..539e783fe036 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -1,5 +1,8 @@ #define UPDATE_BUFFER_TIME (2.5 SECONDS) +/// Returns a list of turfs in the rectangle specified by BOTTOM LEFT corner and height/width, checks for being outside the world border for you +#define CORNER_BLOCK(corner, width, height) CORNER_BLOCK_OFFSET(corner, width, height, 0, 0) + // CAMERA CHUNK // // A 16x16 grid of the map with a list of turfs that can be seen, are visible and are dimmed. @@ -11,20 +14,21 @@ ///turfs our cameras can see inside our grid var/list/visibleTurfs = list() ///cameras that can see into our grid + ///indexed by the z level of the camera var/list/cameras = list() - ///list of all turfs + ///list of all turfs, associative with that turf's static image + ///turf -> /image var/list/turfs = list() ///camera mobs that can see turfs in our grid var/list/seenby = list() - ///images created to represent obscured turfs - var/list/inactive_static_images = list() ///images currently in use on obscured turfs. var/list/active_static_images = list() var/changed = FALSE var/x = 0 var/y = 0 - var/z = 0 + var/lower_z + var/upper_z /// Add an AI eye to the chunk, then update if changed. /datum/camerachunk/proc/add(mob/camera/aiEye/eye) @@ -55,28 +59,33 @@ /** * Updates the chunk, makes sure that it doesn't update too much. If the chunk isn't being watched it will * instead be flagged to update the next time an AI Eye moves near it. + * update_delay_buffer is used for cameras that are moving around, which are cyborg inbuilt cameras and + * mecha onboard cameras. This buffer should be usually lower than UPDATE_BUFFER_TIME because + * otherwise a moving camera can run out of its own view before updating static. */ -/datum/camerachunk/proc/hasChanged(update_now = 0) +/datum/camerachunk/proc/hasChanged(update_now = 0, update_delay_buffer = UPDATE_BUFFER_TIME) if(seenby.len || update_now) - addtimer(CALLBACK(src, PROC_REF(update)), UPDATE_BUFFER_TIME, TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(update)), update_delay_buffer, TIMER_UNIQUE) else changed = TRUE /// The actual updating. It gathers the visible turfs from cameras and puts them into the appropiate lists. -/datum/camerachunk/proc/update() +/// Accepts an optional partial_update argument, that blocks any calls out to chunks that could affect us, like above or below +/datum/camerachunk/proc/update(partial_update = FALSE) var/list/updated_visible_turfs = list() - for(var/obj/machinery/camera/current_camera as anything in cameras) - if(!current_camera || !current_camera.can_use()) - continue + for(var/z_level in lower_z to upper_z) + for(var/obj/machinery/camera/current_camera as anything in cameras["[z_level]"]) + if(!current_camera || !current_camera.can_use()) + continue - var/turf/point = locate(src.x + (CHUNK_SIZE / 2), src.y + (CHUNK_SIZE / 2), src.z) - if(get_dist(point, current_camera) > CHUNK_SIZE + (CHUNK_SIZE / 2)) - continue + var/turf/point = locate(src.x + (CHUNK_SIZE / 2), src.y + (CHUNK_SIZE / 2), z_level) + if(get_dist(point, current_camera) > CHUNK_SIZE + (CHUNK_SIZE / 2)) + continue - for(var/turf/vis_turf in current_camera.can_see()) - if(turfs[vis_turf]) - updated_visible_turfs[vis_turf] = vis_turf + for(var/turf/vis_turf in current_camera.can_see()) + if(turfs[vis_turf]) + updated_visible_turfs[vis_turf] = vis_turf ///new turfs that we couldnt see last update but can now var/list/newly_visible_turfs = updated_visible_turfs - visibleTurfs @@ -91,31 +100,24 @@ client.images -= active_static_images for(var/turf/visible_turf as anything in newly_visible_turfs) - var/image/static_image_to_deallocate = obscuredTurfs[visible_turf] - if(!static_image_to_deallocate) + var/image/static_image = obscuredTurfs[visible_turf] + if(!static_image) continue - static_image_to_deallocate.loc = null - active_static_images -= static_image_to_deallocate - inactive_static_images += static_image_to_deallocate - + active_static_images -= static_image obscuredTurfs -= visible_turf for(var/turf/obscured_turf as anything in newly_obscured_turfs) if(obscuredTurfs[obscured_turf] || istype(obscured_turf, /turf/open/ai_visible)) continue - var/image/static_image_to_allocate = inactive_static_images[length(inactive_static_images)] - if(!static_image_to_allocate) - stack_trace("somehow a camera chunk ran out of static images!") + var/image/static_image = turfs[obscured_turf] + if(!static_image) + stack_trace("somehow a camera chunk used a turf it didn't contain!!") break - obscuredTurfs[obscured_turf] = static_image_to_allocate - static_image_to_allocate.loc = obscured_turf - - inactive_static_images -= static_image_to_allocate - active_static_images += static_image_to_allocate - + obscuredTurfs[obscured_turf] = static_image + active_static_images += static_image visibleTurfs = updated_visible_turfs changed = FALSE @@ -127,39 +129,51 @@ client.images += active_static_images + /// Create a new camera chunk, since the chunks are made as they are needed. -/datum/camerachunk/New(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) +/datum/camerachunk/New(x, y, lower_z) + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) src.x = x src.y = y - src.z = z + src.lower_z = lower_z + var/turf/upper_turf = get_highest_turf(locate(x, y, lower_z)) + src.upper_z = upper_turf.z - for(var/obj/machinery/camera/camera in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z))) - if(camera.can_use()) - cameras += camera + for(var/z_level in lower_z to upper_z) + var/list/local_cameras = list() + for(var/obj/machinery/camera/camera in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z_level))) + if(camera.can_use()) + local_cameras += camera - for(var/turf/t as anything in block(locate(max(x, 1), max(y, 1), z), locate(min(x + CHUNK_SIZE - 1, world.maxx), min(y + CHUNK_SIZE - 1, world.maxy), z))) - turfs[t] = t + for(var/mob/living/silicon/sillycone in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z_level))) + if(sillycone.builtInCamera?.can_use()) + local_cameras += sillycone.builtInCamera - for(var/turf in turfs)//one for each 16x16 = 256 turfs this camera chunk encompasses - inactive_static_images += new/image(GLOB.cameranet.obscured) + cameras["[z_level]"] = local_cameras - for(var/obj/machinery/camera/camera as anything in cameras) - if(!camera || !camera.can_use()) - continue + var/image/mirror_from = GLOB.cameranet.obscured_images[GET_Z_PLANE_OFFSET(z_level)] + var/turf/chunk_corner = locate(x, y, z_level) + for(var/turf/lad as anything in CORNER_BLOCK(chunk_corner, CHUNK_SIZE, CHUNK_SIZE)) //we use CHUNK_SIZE for width and height here as it handles subtracting 1 from those two parameters by itself + var/image/our_image = new /image(mirror_from) + our_image.loc = lad + turfs[lad] = our_image + + for(var/obj/machinery/camera/camera as anything in local_cameras) + if(!camera) + continue + + if(!camera.can_use()) + continue - for(var/turf/vis_turf in camera.can_see()) - if(turfs[vis_turf]) - visibleTurfs[vis_turf] = vis_turf + for(var/turf/vis_turf in camera.can_see()) + if(turfs[vis_turf]) + visibleTurfs[vis_turf] = vis_turf for(var/turf/obscured_turf as anything in turfs - visibleTurfs) - var/image/new_static = inactive_static_images[inactive_static_images.len] - new_static.loc = obscured_turf + var/image/new_static = turfs[obscured_turf] active_static_images += new_static - inactive_static_images -= new_static obscuredTurfs[obscured_turf] = new_static #undef UPDATE_BUFFER_TIME -#undef CHUNK_SIZE From 98c5ef1b93b2c695b04fceee43f6f87a446227fe Mon Sep 17 00:00:00 2001 From: Molti Date: Fri, 1 Dec 2023 18:48:47 -0600 Subject: [PATCH 090/281] test maybe revert --- code/__DEFINES/layers.dm | 1 - .../machinery/computer/camera_advanced.dm | 1 + .../mob/living/silicon/ai/freelook/eye.dm | 71 +++++++++++-------- 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 38bd74949388..e81166024dcc 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -75,7 +75,6 @@ #define PIPECRAWL_IMAGES_PLANE 20 ///AI Camera Static -#define CAMERA_STATIC_LAYER 21 #define CAMERA_STATIC_PLANE 21 ///Anything that wants to be part of the game plane, but also wants to draw above literally everything else diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 0ddf5f2005c8..03012daa78dc 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -204,6 +204,7 @@ if(visible_icon && eye_user.client) eye_user.client.images -= user_image user_image = image(icon,loc,icon_state,FLY_LAYER) + SET_PLANE(user_image, ABOVE_GAME_PLANE, destination) eye_user.client.images += user_image /mob/camera/aiEye/remote/relaymove(mob/user,direct) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 0486fda51619..6b7bdf5c2b54 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -17,6 +17,7 @@ var/static_visibility_range = 16 var/ai_detector_visible = TRUE var/ai_detector_color = COLOR_RED + interaction_range = INFINITY /mob/camera/aiEye/Initialize(mapload) . = ..() @@ -25,6 +26,13 @@ update_ai_detect_hud() setLoc(loc, TRUE) +/mob/camera/aiEye/examine(mob/user) //Displays a silicon's laws to ghosts + . = ..() + if(istype(ai) && ai.laws && isobserver(user)) + . += "[ai] has the following laws:" + for(var/law in ai.laws.get_law_list(include_zeroth = TRUE)) + . += law + /mob/camera/aiEye/proc/update_ai_detect_hud() var/datum/atom_hud/ai_detector/hud = GLOB.huds[DATA_HUD_AI_DETECT] var/list/old_images = hud_list[AI_DETECT_HUD] @@ -71,30 +79,32 @@ // It will also stream the chunk that the new loc is in. /mob/camera/aiEye/proc/setLoc(T, force_update = FALSE) - if(ai) - if(!(isturf(ai.loc) || istype(ai.loc, /obj/machinery/ai/data_core))) - return - T = get_turf(T) - if(!force_update && (T == get_turf(src)) ) - return //we are already here! - if (T) - forceMove(T) - else - moveToNullspace() - if(use_static) - ai.camera_visibility(src) - if(ai.client && !ai.multicam_on) - ai.client.eye = src - update_ai_detect_hud() - update_parallax_contents() - //Holopad - if(istype(ai.current, /obj/machinery/holopad)) - var/obj/machinery/holopad/H = ai.current - H.move_hologram(ai, T) - if(ai.camera_light_on) - ai.light_cameras() - if(ai.master_multicam) - ai.master_multicam.refresh_view() + if(!ai) + return + if(!(isturf(ai.loc) || istype(ai.loc, /obj/machinery/ai/data_core))) + return + T = get_turf(T) + if(!force_update && (T == get_turf(src)) ) + return //we are already here! + if (T) + forceMove(T) + else + moveToNullspace() + if(use_static) + ai.camera_visibility(src) + if(ai.client && !ai.multicam_on) + ai.client.eye = src + update_ai_detect_hud() + update_parallax_contents() + //Holopad + if(istype(ai.current, /obj/machinery/holopad)) + var/obj/machinery/holopad/H = ai.current + H.move_hologram(ai, T) + + if(ai.camera_light_on) + ai.light_cameras() + if(ai.master_multicam) + ai.master_multicam.refresh_view() /mob/camera/aiEye/Move() return 0 @@ -120,12 +130,13 @@ return ..() /atom/proc/move_camera_by_click() - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) - AI.cameraFollow = null - if (isturf(loc) || isturf(src)) - AI.eyeobj.setLoc(src) + if(!isAI(usr)) + return + var/mob/living/silicon/ai/AI = usr + if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) + AI.cameraFollow = null + if (isturf(loc) || isturf(src)) + AI.eyeobj.setLoc(src) // This will move the AIEye. It will also cause lights near the eye to light up, if toggled. // This is handled in the proc below this one. From 3cf31d0720aeff979fde26036f2f70002ab54634 Mon Sep 17 00:00:00 2001 From: Molti Date: Fri, 1 Dec 2023 18:55:38 -0600 Subject: [PATCH 091/281] Revert "test maybe revert" This reverts commit 98c5ef1b93b2c695b04fceee43f6f87a446227fe. --- code/__DEFINES/layers.dm | 1 + .../machinery/computer/camera_advanced.dm | 1 - .../mob/living/silicon/ai/freelook/eye.dm | 71 ++++++++----------- 3 files changed, 31 insertions(+), 42 deletions(-) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index e81166024dcc..38bd74949388 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -75,6 +75,7 @@ #define PIPECRAWL_IMAGES_PLANE 20 ///AI Camera Static +#define CAMERA_STATIC_LAYER 21 #define CAMERA_STATIC_PLANE 21 ///Anything that wants to be part of the game plane, but also wants to draw above literally everything else diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 03012daa78dc..0ddf5f2005c8 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -204,7 +204,6 @@ if(visible_icon && eye_user.client) eye_user.client.images -= user_image user_image = image(icon,loc,icon_state,FLY_LAYER) - SET_PLANE(user_image, ABOVE_GAME_PLANE, destination) eye_user.client.images += user_image /mob/camera/aiEye/remote/relaymove(mob/user,direct) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 6b7bdf5c2b54..0486fda51619 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -17,7 +17,6 @@ var/static_visibility_range = 16 var/ai_detector_visible = TRUE var/ai_detector_color = COLOR_RED - interaction_range = INFINITY /mob/camera/aiEye/Initialize(mapload) . = ..() @@ -26,13 +25,6 @@ update_ai_detect_hud() setLoc(loc, TRUE) -/mob/camera/aiEye/examine(mob/user) //Displays a silicon's laws to ghosts - . = ..() - if(istype(ai) && ai.laws && isobserver(user)) - . += "[ai] has the following laws:" - for(var/law in ai.laws.get_law_list(include_zeroth = TRUE)) - . += law - /mob/camera/aiEye/proc/update_ai_detect_hud() var/datum/atom_hud/ai_detector/hud = GLOB.huds[DATA_HUD_AI_DETECT] var/list/old_images = hud_list[AI_DETECT_HUD] @@ -79,32 +71,30 @@ // It will also stream the chunk that the new loc is in. /mob/camera/aiEye/proc/setLoc(T, force_update = FALSE) - if(!ai) - return - if(!(isturf(ai.loc) || istype(ai.loc, /obj/machinery/ai/data_core))) - return - T = get_turf(T) - if(!force_update && (T == get_turf(src)) ) - return //we are already here! - if (T) - forceMove(T) - else - moveToNullspace() - if(use_static) - ai.camera_visibility(src) - if(ai.client && !ai.multicam_on) - ai.client.eye = src - update_ai_detect_hud() - update_parallax_contents() - //Holopad - if(istype(ai.current, /obj/machinery/holopad)) - var/obj/machinery/holopad/H = ai.current - H.move_hologram(ai, T) - - if(ai.camera_light_on) - ai.light_cameras() - if(ai.master_multicam) - ai.master_multicam.refresh_view() + if(ai) + if(!(isturf(ai.loc) || istype(ai.loc, /obj/machinery/ai/data_core))) + return + T = get_turf(T) + if(!force_update && (T == get_turf(src)) ) + return //we are already here! + if (T) + forceMove(T) + else + moveToNullspace() + if(use_static) + ai.camera_visibility(src) + if(ai.client && !ai.multicam_on) + ai.client.eye = src + update_ai_detect_hud() + update_parallax_contents() + //Holopad + if(istype(ai.current, /obj/machinery/holopad)) + var/obj/machinery/holopad/H = ai.current + H.move_hologram(ai, T) + if(ai.camera_light_on) + ai.light_cameras() + if(ai.master_multicam) + ai.master_multicam.refresh_view() /mob/camera/aiEye/Move() return 0 @@ -130,13 +120,12 @@ return ..() /atom/proc/move_camera_by_click() - if(!isAI(usr)) - return - var/mob/living/silicon/ai/AI = usr - if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) - AI.cameraFollow = null - if (isturf(loc) || isturf(src)) - AI.eyeobj.setLoc(src) + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) + AI.cameraFollow = null + if (isturf(loc) || isturf(src)) + AI.eyeobj.setLoc(src) // This will move the AIEye. It will also cause lights near the eye to light up, if toggled. // This is handled in the proc below this one. From 4b3e35b0e7b7d5550a8377051b88477dab58bf02 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Fri, 1 Dec 2023 21:32:52 -0500 Subject: [PATCH 092/281] Revert "Fucks up the camera net + chunk" This reverts commit 0e421ebf5f1d3702739fd7078cf53a8d0ef964a6. --- .../living/silicon/ai/freelook/cameranet.dm | 144 +++++++----------- .../mob/living/silicon/ai/freelook/chunk.dm | 118 +++++++------- 2 files changed, 104 insertions(+), 158 deletions(-) diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 5f9bea5860b3..efd4184eee1f 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -1,14 +1,9 @@ -/// We only want chunk sizes that are to the power of 2. E.g: 2, 4, 8, 16, etc.. -#define CHUNK_SIZE 16 -/// Takes a position, transforms it into a chunk bounded position. Indexes at 1 so it'll land on actual turfs always -#define GET_CHUNK_COORD(v) (max((FLOOR(v, CHUNK_SIZE)), 1)) - - - // CAMERA NET // // The datum containing all the chunks. +#define CHUNK_SIZE 16 // Only chunk sizes that are to the power of 2. E.g: 2, 4, 8, 16, etc.. + GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) /datum/cameranet @@ -16,54 +11,38 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) var/name = "Camera Net" /// The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). - var/list/obj/machinery/camera/cameras = list() + var/list/cameras = list() /// The chunks of the map, mapping the areas that the cameras can see. var/list/chunks = list() var/ready = 0 - - /// List of images cloned by all chunk static images put onto turfs cameras cant see - /// Indexed by the plane offset to use - var/list/image/obscured_images + // The object used for the clickable stat() button. + var/obj/effect/statclick/statclick + ///The image given to the effect in vis_contents on AI clients + var/image/obscured /datum/cameranet/New() - obscured_images = list() - update_offsets(SSmapping.max_plane_offset) - RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_offset_growth)) - -/datum/cameranet/proc/update_offsets(new_offset) - for(var/i in length(obscured_images) to new_offset) - var/image/obscured = new('icons/effects/cameravis.dmi') - SET_PLANE_W_SCALAR(obscured, CAMERA_STATIC_PLANE, i) - obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART - obscured.override = TRUE - obscured_images += obscured - -/datum/cameranet/proc/on_offset_growth(datum/source, old_offset, new_offset) - SIGNAL_HANDLER - update_offsets(new_offset) + obscured = new('icons/effects/cameravis.dmi') + obscured.plane = CAMERA_STATIC_PLANE + obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART + obscured.override = TRUE /// Checks if a chunk has been Generated in x, y, z. /datum/cameranet/proc/chunkGenerated(x, y, z) - x = GET_CHUNK_COORD(x) - y = GET_CHUNK_COORD(y) - if(GET_LOWEST_STACK_OFFSET(z) != 0) - var/turf/lowest = get_lowest_turf(locate(x, y, z)) - return chunks["[x],[y],[lowest.z]"] - + x &= ~(CHUNK_SIZE - 1) + y &= ~(CHUNK_SIZE - 1) return chunks["[x],[y],[z]"] // Returns the chunk in the x, y, z. // If there is no chunk, it creates a new chunk and returns that. /datum/cameranet/proc/getCameraChunk(x, y, z) - x = GET_CHUNK_COORD(x) - y = GET_CHUNK_COORD(y) - var/turf/lowest = get_lowest_turf(locate(x, y, z)) - var/key = "[x],[y],[lowest.z]" + x &= ~(CHUNK_SIZE - 1) + y &= ~(CHUNK_SIZE - 1) + var/key = "[x],[y],[z]" . = chunks[key] if(!.) - chunks[key] = . = new /datum/camerachunk(x, y, lowest.z) + chunks[key] = . = new /datum/camerachunk(x, y, z) -/// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. +/// Updates what the ai_eye can see. It is recommended you use this when the ai_eye moves or it's location is set. /datum/cameranet/proc/visibility(list/moved_eyes, client/C, list/other_eyes, use_static = TRUE) if(!islist(moved_eyes)) moved_eyes = moved_eyes ? list(moved_eyes) : list() @@ -74,18 +53,21 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/mob/camera/aiEye/eye as anything in moved_eyes) var/list/visibleChunks = list() - //Get the eye's turf in case it's located in an object like a mecha - var/turf/eye_turf = get_turf(eye) if(eye.loc) + var/x_value = eye.x + var/y_value = eye.y + var/z_value = eye.z + // 0xf = 15 var/static_range = eye.static_visibility_range - var/x1 = max(1, eye_turf.x - static_range) - var/y1 = max(1, eye_turf.y - static_range) - var/x2 = min(world.maxx, eye_turf.x + static_range) - var/y2 = min(world.maxy, eye_turf.y + static_range) + var/x1 = max(0, x_value - static_range) & ~(CHUNK_SIZE - 1) + var/y1 = max(0, y_value - static_range) & ~(CHUNK_SIZE - 1) + var/x2 = min(world.maxx, x_value + static_range) & ~(CHUNK_SIZE - 1) + var/y2 = min(world.maxy, y_value + static_range) & ~(CHUNK_SIZE - 1) + for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) - visibleChunks |= getCameraChunk(x, y, eye_turf.z) + visibleChunks |= getCameraChunk(x, y, z_value) var/list/remove = eye.visibleCameraChunks - visibleChunks var/list/add = visibleChunks - eye.visibleCameraChunks @@ -96,7 +78,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/datum/camerachunk/chunk as anything in add) chunk.add(eye) -/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. +/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. /datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) if(!SSticker || (opacity_check && !A.opacity)) return @@ -117,14 +99,10 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) if(c.can_use()) majorChunkChange(c, 1) -/** - * Used for Cyborg/mecha cameras. Since portable cameras can be in ANY chunk. - * update_delay_buffer is passed all the way to hasChanged() from their camera updates on movement - * to change the time between static updates. -*/ -/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/updating_camera, update_delay_buffer) - if(updating_camera.can_use()) - majorChunkChange(updating_camera, 1, update_delay_buffer) +/// Used for Cyborg cameras. Since portable cameras can be in ANY chunk. +/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/c) + if(c.can_use()) + majorChunkChange(c, 1) /** * Never access this proc directly!!!! @@ -132,52 +110,37 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) * It will also add the atom to the cameras list if you set the choice to 1. * Setting the choice to 0 will remove the camera from the chunks. * If you want to update the chunks around an object, without adding/removing a camera, use choice 2. - * update_delay_buffer is passed all the way to hasChanged() from portable camera updates on movement - * to change the time between static updates. */ -/datum/cameranet/proc/majorChunkChange(atom/c, choice, update_delay_buffer) - if(QDELETED(c) && choice == 1) - CRASH("Tried to add a qdeleting camera to the net") +/datum/cameranet/proc/majorChunkChange(atom/c, choice) + if(!c) + return var/turf/T = get_turf(c) if(T) - var/x1 = max(1, T.x - (CHUNK_SIZE / 2)) - var/y1 = max(1, T.y - (CHUNK_SIZE / 2)) - var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) - var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) + var/x1 = max(0, T.x - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + var/y1 = max(0, T.y - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) var/datum/camerachunk/chunk = chunkGenerated(x, y, T.z) if(chunk) if(choice == 0) // Remove the camera. - chunk.cameras["[T.z]"] -= c + chunk.cameras -= c else if(choice == 1) // You can't have the same camera in the list twice. - chunk.cameras["[T.z]"] |= c - chunk.hasChanged(update_delay_buffer = update_delay_buffer) - -/// A faster, turf only version of [/datum/cameranet/proc/majorChunkChange] -/// For use in sensitive code, be careful with it -/datum/cameranet/proc/bareMajorChunkChange(turf/changed) - var/x1 = max(1, changed.x - (CHUNK_SIZE / 2)) - var/y1 = max(1, changed.y - (CHUNK_SIZE / 2)) - var/x2 = min(world.maxx, changed.x + (CHUNK_SIZE / 2)) - var/y2 = min(world.maxy, changed.y + (CHUNK_SIZE / 2)) - for(var/x = x1; x <= x2; x += CHUNK_SIZE) - for(var/y = y1; y <= y2; y += CHUNK_SIZE) - var/datum/camerachunk/chunk = chunkGenerated(x, y, changed.z) - chunk?.hasChanged() + chunk.cameras |= c + chunk.hasChanged() /// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. /datum/cameranet/proc/checkCameraVis(mob/living/target) var/turf/position = get_turf(target) - if(!position) - return return checkTurfVis(position) + /datum/cameranet/proc/checkTurfVis(turf/position) - var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) + var/datum/camerachunk/chunk = chunkGenerated(position.x, position.y, position.z) if(chunk) if(chunk.changed) chunk.hasChanged(1) // Update now, no matter if it's visible or not. @@ -185,25 +148,22 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) return TRUE return FALSE -/datum/cameranet/proc/getTurfVis(turf/position) - RETURN_TYPE(/datum/camerachunk) - var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) - if(!chunk) - return FALSE - if(chunk.changed) - chunk.hasChanged(1) // Update now, no matter if it's visible or not. - if(chunk.visibleTurfs[position]) - return chunk +/datum/cameranet/proc/stat_entry() + if(!statclick) + statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) + + stat(name, statclick.update("Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]")) /obj/effect/overlay/camera_static name = "static" icon = null icon_state = null anchored = TRUE // should only appear in vis_contents, but to be safe - appearance_flags = RESET_TRANSFORM | TILE_BOUND | LONG_GLIDE + appearance_flags = RESET_TRANSFORM | TILE_BOUND | RESET_COLOR // this combination makes the static block clicks to everything below it, // without appearing in the right-click menu for non-AI clients mouse_opacity = MOUSE_OPACITY_ICON invisibility = INVISIBILITY_ABSTRACT + layer = CAMERA_STATIC_LAYER plane = CAMERA_STATIC_PLANE diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index 539e783fe036..abf891b011ac 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -1,8 +1,5 @@ #define UPDATE_BUFFER_TIME (2.5 SECONDS) -/// Returns a list of turfs in the rectangle specified by BOTTOM LEFT corner and height/width, checks for being outside the world border for you -#define CORNER_BLOCK(corner, width, height) CORNER_BLOCK_OFFSET(corner, width, height, 0, 0) - // CAMERA CHUNK // // A 16x16 grid of the map with a list of turfs that can be seen, are visible and are dimmed. @@ -14,21 +11,20 @@ ///turfs our cameras can see inside our grid var/list/visibleTurfs = list() ///cameras that can see into our grid - ///indexed by the z level of the camera var/list/cameras = list() - ///list of all turfs, associative with that turf's static image - ///turf -> /image + ///list of all turfs var/list/turfs = list() ///camera mobs that can see turfs in our grid var/list/seenby = list() + ///images created to represent obscured turfs + var/list/inactive_static_images = list() ///images currently in use on obscured turfs. var/list/active_static_images = list() var/changed = FALSE var/x = 0 var/y = 0 - var/lower_z - var/upper_z + var/z = 0 /// Add an AI eye to the chunk, then update if changed. /datum/camerachunk/proc/add(mob/camera/aiEye/eye) @@ -59,33 +55,28 @@ /** * Updates the chunk, makes sure that it doesn't update too much. If the chunk isn't being watched it will * instead be flagged to update the next time an AI Eye moves near it. - * update_delay_buffer is used for cameras that are moving around, which are cyborg inbuilt cameras and - * mecha onboard cameras. This buffer should be usually lower than UPDATE_BUFFER_TIME because - * otherwise a moving camera can run out of its own view before updating static. */ -/datum/camerachunk/proc/hasChanged(update_now = 0, update_delay_buffer = UPDATE_BUFFER_TIME) +/datum/camerachunk/proc/hasChanged(update_now = 0) if(seenby.len || update_now) - addtimer(CALLBACK(src, PROC_REF(update)), update_delay_buffer, TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(update)), UPDATE_BUFFER_TIME, TIMER_UNIQUE) else changed = TRUE /// The actual updating. It gathers the visible turfs from cameras and puts them into the appropiate lists. -/// Accepts an optional partial_update argument, that blocks any calls out to chunks that could affect us, like above or below -/datum/camerachunk/proc/update(partial_update = FALSE) +/datum/camerachunk/proc/update() var/list/updated_visible_turfs = list() - for(var/z_level in lower_z to upper_z) - for(var/obj/machinery/camera/current_camera as anything in cameras["[z_level]"]) - if(!current_camera || !current_camera.can_use()) - continue + for(var/obj/machinery/camera/current_camera as anything in cameras) + if(!current_camera || !current_camera.can_use()) + continue - var/turf/point = locate(src.x + (CHUNK_SIZE / 2), src.y + (CHUNK_SIZE / 2), z_level) - if(get_dist(point, current_camera) > CHUNK_SIZE + (CHUNK_SIZE / 2)) - continue + var/turf/point = locate(src.x + (CHUNK_SIZE / 2), src.y + (CHUNK_SIZE / 2), src.z) + if(get_dist(point, current_camera) > CHUNK_SIZE + (CHUNK_SIZE / 2)) + continue - for(var/turf/vis_turf in current_camera.can_see()) - if(turfs[vis_turf]) - updated_visible_turfs[vis_turf] = vis_turf + for(var/turf/vis_turf in current_camera.can_see()) + if(turfs[vis_turf]) + updated_visible_turfs[vis_turf] = vis_turf ///new turfs that we couldnt see last update but can now var/list/newly_visible_turfs = updated_visible_turfs - visibleTurfs @@ -100,24 +91,31 @@ client.images -= active_static_images for(var/turf/visible_turf as anything in newly_visible_turfs) - var/image/static_image = obscuredTurfs[visible_turf] - if(!static_image) + var/image/static_image_to_deallocate = obscuredTurfs[visible_turf] + if(!static_image_to_deallocate) continue - active_static_images -= static_image + static_image_to_deallocate.loc = null + active_static_images -= static_image_to_deallocate + inactive_static_images += static_image_to_deallocate + obscuredTurfs -= visible_turf for(var/turf/obscured_turf as anything in newly_obscured_turfs) if(obscuredTurfs[obscured_turf] || istype(obscured_turf, /turf/open/ai_visible)) continue - var/image/static_image = turfs[obscured_turf] - if(!static_image) - stack_trace("somehow a camera chunk used a turf it didn't contain!!") + var/image/static_image_to_allocate = inactive_static_images[length(inactive_static_images)] + if(!static_image_to_allocate) + stack_trace("somehow a camera chunk ran out of static images!") break - obscuredTurfs[obscured_turf] = static_image - active_static_images += static_image + obscuredTurfs[obscured_turf] = static_image_to_allocate + static_image_to_allocate.loc = obscured_turf + + inactive_static_images -= static_image_to_allocate + active_static_images += static_image_to_allocate + visibleTurfs = updated_visible_turfs changed = FALSE @@ -129,51 +127,39 @@ client.images += active_static_images - /// Create a new camera chunk, since the chunks are made as they are needed. -/datum/camerachunk/New(x, y, lower_z) - x = GET_CHUNK_COORD(x) - y = GET_CHUNK_COORD(y) +/datum/camerachunk/New(x, y, z) + x &= ~(CHUNK_SIZE - 1) + y &= ~(CHUNK_SIZE - 1) src.x = x src.y = y - src.lower_z = lower_z - var/turf/upper_turf = get_highest_turf(locate(x, y, lower_z)) - src.upper_z = upper_turf.z - - for(var/z_level in lower_z to upper_z) - var/list/local_cameras = list() - for(var/obj/machinery/camera/camera in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z_level))) - if(camera.can_use()) - local_cameras += camera + src.z = z - for(var/mob/living/silicon/sillycone in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z_level))) - if(sillycone.builtInCamera?.can_use()) - local_cameras += sillycone.builtInCamera + for(var/obj/machinery/camera/camera in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z))) + if(camera.can_use()) + cameras += camera - cameras["[z_level]"] = local_cameras + for(var/turf/t as anything in block(locate(max(x, 1), max(y, 1), z), locate(min(x + CHUNK_SIZE - 1, world.maxx), min(y + CHUNK_SIZE - 1, world.maxy), z))) + turfs[t] = t - var/image/mirror_from = GLOB.cameranet.obscured_images[GET_Z_PLANE_OFFSET(z_level)] - var/turf/chunk_corner = locate(x, y, z_level) - for(var/turf/lad as anything in CORNER_BLOCK(chunk_corner, CHUNK_SIZE, CHUNK_SIZE)) //we use CHUNK_SIZE for width and height here as it handles subtracting 1 from those two parameters by itself - var/image/our_image = new /image(mirror_from) - our_image.loc = lad - turfs[lad] = our_image + for(var/turf in turfs)//one for each 16x16 = 256 turfs this camera chunk encompasses + inactive_static_images += new/image(GLOB.cameranet.obscured) - for(var/obj/machinery/camera/camera as anything in local_cameras) - if(!camera) - continue - - if(!camera.can_use()) - continue + for(var/obj/machinery/camera/camera as anything in cameras) + if(!camera || !camera.can_use()) + continue - for(var/turf/vis_turf in camera.can_see()) - if(turfs[vis_turf]) - visibleTurfs[vis_turf] = vis_turf + for(var/turf/vis_turf in camera.can_see()) + if(turfs[vis_turf]) + visibleTurfs[vis_turf] = vis_turf for(var/turf/obscured_turf as anything in turfs - visibleTurfs) - var/image/new_static = turfs[obscured_turf] + var/image/new_static = inactive_static_images[inactive_static_images.len] + new_static.loc = obscured_turf active_static_images += new_static + inactive_static_images -= new_static obscuredTurfs[obscured_turf] = new_static #undef UPDATE_BUFFER_TIME +#undef CHUNK_SIZE From 1d8ceac8673cc8ea4b05ce25da0f67044334da4f Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Sun, 3 Dec 2023 15:46:10 -0500 Subject: [PATCH 093/281] this isnt going well uh oh --- .../packages/tgui/interfaces/CameraConsole.js | 143 ------------- .../tgui/interfaces/CameraConsole.tsx | 198 ++++++++++++++++++ tgui/packages/tgui/interfaces/NtosSecurEye.js | 60 ------ .../tgui/interfaces/NtosSecureEye.tsx | 12 ++ .../tgui/styles/interfaces/CameraConsole.scss | 53 ----- tgui/packages/tgui/styles/main.scss | 1 - 6 files changed, 210 insertions(+), 257 deletions(-) delete mode 100644 tgui/packages/tgui/interfaces/CameraConsole.js create mode 100644 tgui/packages/tgui/interfaces/CameraConsole.tsx delete mode 100644 tgui/packages/tgui/interfaces/NtosSecurEye.js create mode 100644 tgui/packages/tgui/interfaces/NtosSecureEye.tsx delete mode 100644 tgui/packages/tgui/styles/interfaces/CameraConsole.scss diff --git a/tgui/packages/tgui/interfaces/CameraConsole.js b/tgui/packages/tgui/interfaces/CameraConsole.js deleted file mode 100644 index 8ece49eff205..000000000000 --- a/tgui/packages/tgui/interfaces/CameraConsole.js +++ /dev/null @@ -1,143 +0,0 @@ -import { filter, sortBy } from 'common/collections'; -import { flow } from 'common/fp'; -import { classes } from 'common/react'; -import { createSearch } from 'common/string'; -import { useBackend, useLocalState } from '../backend'; -import { Button, ByondUi, Flex, Input, Section } from '../components'; -import { Window } from '../layouts'; - -/** - * Returns previous and next camera names relative to the currently - * active camera. - */ -export const prevNextCamera = (cameras, activeCamera) => { - if (!activeCamera) { - return []; - } - const index = cameras.findIndex(camera => ( - camera.name === activeCamera.name - )); - return [ - cameras[index - 1]?.name, - cameras[index + 1]?.name, - ]; -}; - -/** - * Camera selector. - * - * Filters cameras, applies search terms and sorts the alphabetically. - */ -export const selectCameras = (cameras, searchText = '') => { - const testSearch = createSearch(searchText, camera => camera.name); - return flow([ - // Null camera filter - filter(camera => camera?.name), - // Optional search term - searchText && filter(testSearch), - // Slightly expensive, but way better than sorting in BYOND - sortBy(camera => camera.name), - ])(cameras); -}; - -export const CameraConsole = (props, context) => { - const { act, data } = useBackend(context); - const { mapRef, activeCamera } = data; - const cameras = selectCameras(data.cameras); - const [ - prevCameraName, - nextCameraName, - ] = prevNextCamera(cameras, activeCamera); - return ( - -
    - - - -
    -
    -
    - Camera: - {activeCamera - && activeCamera.name - || '—'} -
    -
    -
    - -
    -
    - ); -}; - -export const CameraConsoleContent = (props, context) => { - const { act, data } = useBackend(context); - const [ - searchText, - setSearchText, - ] = useLocalState(context, 'searchText', ''); - const { activeCamera } = data; - const cameras = selectCameras(data.cameras, searchText); - return ( - - - setSearchText(value)} /> - - -
    - {cameras.map(camera => ( - // We're not using the component here because performance - // would be absolutely abysmal (50+ ms for each re-render). -
    [act('switch_camera', { - name: camera.name, - }), document.getElementsByClassName('CameraConsole__left')[0].focus()]}> - {camera.name} -
    - ))} -
    -
    -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/CameraConsole.tsx b/tgui/packages/tgui/interfaces/CameraConsole.tsx new file mode 100644 index 000000000000..4feb31faaf67 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CameraConsole.tsx @@ -0,0 +1,198 @@ +import { filter, sortBy } from 'common/collections'; +import { flow } from 'common/fp'; +import { BooleanLike, classes } from 'common/react'; +import { createSearch } from 'common/string'; +import { useBackend, useLocalState } from '../backend'; +import { Button, ByondUi, Input, NoticeBox, Section, Stack } from '../components'; +import { Window } from '../layouts'; + +type Data = { + can_spy: BooleanLike; + mapRef: string; + cameras: Camera[]; + activeCamera: Camera & { status: BooleanLike }; + network: string[]; +}; + +type Camera = { + name: string; +}; + +/** + * Returns previous and next camera names relative to the currently + * active camera. + */ +const prevNextCamera = ( + cameras: Camera[], + activeCamera: Camera & { status: BooleanLike } +) => { + if (!activeCamera) { + return []; + } + const index = cameras.findIndex( + (camera) => camera?.name === activeCamera.name + ); + return [cameras[index - 1]?.name, cameras[index + 1]?.name]; +}; + +/** + * Camera selector. + * + * Filters cameras, applies search terms and sorts the alphabetically. + */ +const selectCameras = (cameras: Camera[], searchText = ''): Camera[] => { + const testSearch = createSearch(searchText, (camera: Camera) => camera.name); + + return flow([ + // Null camera filter + filter((camera: Camera) => !!camera?.name), // Optional search term + searchText && filter(testSearch), + // Slightly expensive, but way better than sorting in BYOND + sortBy((camera: Camera) => camera.name), + ])(cameras); +}; + +export const CameraConsole = (props, context) => { + return ( + + + + + + ); +}; + +export const CameraContent = (props, context) => { + return ( + + + + + + + + + ); +}; + +const CameraSelector = (props, context) => { + const { act, data } = useBackend(context); + const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); + const { activeCamera } = data; + const cameras = selectCameras(data.cameras, searchText); + + return ( + + + setSearchText(value)} + /> + + +
    + {cameras.map((camera) => ( + // We're not using the component here because performance + // would be absolutely abysmal (50+ ms for each re-render). +
    + act('switch_camera', { + name: camera.name, + }) + }> + {camera.name} +
    + ))} +
    +
    +
    + ); +}; + +const CameraControls = (props, context) => { + const { act, data } = useBackend(context); + const { activeCamera, can_spy, mapRef } = data; + const cameras = selectCameras(data.cameras); + + const [prevCameraName, nextCameraName] = prevNextCamera( + cameras, + activeCamera + ); + + return ( +
    + + + + + {activeCamera?.name ? ( + {activeCamera.name} + ) : ( + No input signal + )} + + + + {!!can_spy && ( +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosSecurEye.js b/tgui/packages/tgui/interfaces/NtosSecurEye.js deleted file mode 100644 index 8d4bc6274528..000000000000 --- a/tgui/packages/tgui/interfaces/NtosSecurEye.js +++ /dev/null @@ -1,60 +0,0 @@ -import { filter, sortBy } from 'common/collections'; -import { flow } from 'common/fp'; -import { classes } from 'common/react'; -import { createSearch } from 'common/string'; -import { Fragment } from 'inferno'; -import { useBackend, useLocalState } from '../backend'; -import { Button, ByondUi, Input, Section } from '../components'; -import { NtosWindow } from '../layouts'; -import { prevNextCamera, selectCameras, CameraConsoleContent } from './CameraConsole'; -import { logger } from "../logging"; - -export const NtosSecurEye = (props, context) => { - const { act, data, config } = useBackend(context); - const { PC_device_theme, mapRef, activeCamera } = data; - const cameras = selectCameras(data.cameras); - const [ - prevCameraName, - nextCameraName, - ] = prevNextCamera(cameras, activeCamera); - return ( - - -
    - -
    -
    -
    - Camera: - {activeCamera - && activeCamera.name - || '—'} -
    -
    -
    - -
    -
    -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosSecureEye.tsx b/tgui/packages/tgui/interfaces/NtosSecureEye.tsx new file mode 100644 index 000000000000..c445b6f160f5 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosSecureEye.tsx @@ -0,0 +1,12 @@ +import { NtosWindow } from '../layouts'; +import { CameraContent } from './CameraConsole'; + +export const NtosSecurEye = (props) => { + return ( + + + + + + ); +}; diff --git a/tgui/packages/tgui/styles/interfaces/CameraConsole.scss b/tgui/packages/tgui/styles/interfaces/CameraConsole.scss deleted file mode 100644 index 7e8f99fdcceb..000000000000 --- a/tgui/packages/tgui/styles/interfaces/CameraConsole.scss +++ /dev/null @@ -1,53 +0,0 @@ -@use '../base.scss'; - -$background-color: rgba(0, 0, 0, 0.33) !default; - -.CameraConsole__left { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: base.em(220px); -} - -.CameraConsole__right { - position: absolute; - top: 0; - bottom: 0; - left: base.em(220px); - right: 0; - background-color: $background-color; -} - -.CameraConsole__toolbar { - position: absolute; - top: 0; - left: 0; - right: 0; - height: 2em; - line-height: 2em; - margin: 0.25em 1em 0; -} - -.CameraConsole__toolbarRight { - position: absolute; - top: 0; - right: 0; - height: 2em; - line-height: 2em; - margin: 0.33em 0.5em 0; -} - -.CameraConsole__map { - position: absolute; - top: base.em(26px); - bottom: 0; - left: 0; - right: 0; - margin: 0.5em; - text-align: center; - - .NoticeBox { - margin-top: calc(50% - 2em); - } -} diff --git a/tgui/packages/tgui/styles/main.scss b/tgui/packages/tgui/styles/main.scss index d60242ae8627..9a7a42fcf5aa 100644 --- a/tgui/packages/tgui/styles/main.scss +++ b/tgui/packages/tgui/styles/main.scss @@ -48,7 +48,6 @@ // Interfaces @include meta.load-css('./interfaces/AlertModal.scss'); -@include meta.load-css('./interfaces/CameraConsole.scss'); @include meta.load-css('./interfaces/InspectorBooth.scss'); @include meta.load-css('./interfaces/ListInput.scss'); @include meta.load-css('./interfaces/HellishRunes.scss'); From 78d861da7cd3d45eb6825c7ba6e80d6d99ffd408 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Sun, 3 Dec 2023 20:44:42 -0500 Subject: [PATCH 094/281] Attempts to rework out security camera and probably more --- _maps/_basemap.dm | 2 +- code/__DEFINES/interaction_flags.dm | 2 + code/__HELPERS/cameras.dm | 35 ++++ code/_onclick/hud/map_popups.dm | 35 ---- code/_onclick/hud/map_view.dm | 69 +++++++ code/_onclick/hud/screen_objects.dm | 13 ++ code/controllers/subsystem/mapping.dm | 6 +- code/game/machinery/camera/camera.dm | 1 + code/game/machinery/camera/tracking.dm | 11 -- code/game/machinery/computer/_computer.dm | 6 + code/game/machinery/computer/camera.dm | 171 +++++++++--------- code/modules/client/client_defines.dm | 7 + .../living/silicon/ai/freelook/cameranet.dm | 24 ++- .../mob/living/silicon/ai/freelook/chunk.dm | 2 +- yogstation.dme | 2 + 15 files changed, 242 insertions(+), 144 deletions(-) create mode 100644 code/__HELPERS/cameras.dm create mode 100644 code/_onclick/hud/map_view.dm diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 48b96c8948f7..aadbfa88a035 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/__DEFINES/interaction_flags.dm b/code/__DEFINES/interaction_flags.dm index a85ffb8d7a09..25e31118fd17 100644 --- a/code/__DEFINES/interaction_flags.dm +++ b/code/__DEFINES/interaction_flags.dm @@ -36,3 +36,5 @@ /// This flag determines if a machine set_machine's the user when the user uses it, making updateUsrDialog make the user re-call interact() on it. /// THIS FLAG IS ON ALL MACHINES BY DEFAULT, NEEDS TO BE RE-EVALUATED LATER!! #define INTERACT_MACHINE_SET_MACHINE (1<<6) +/// the user must have vision to interact (blind people need not apply) +#define INTERACT_MACHINE_REQUIRES_SIGHT (1<<7) diff --git a/code/__HELPERS/cameras.dm b/code/__HELPERS/cameras.dm new file mode 100644 index 000000000000..9d74f3fe71b4 --- /dev/null +++ b/code/__HELPERS/cameras.dm @@ -0,0 +1,35 @@ +/** + * get_camera_list + * + * Builds a list of all available cameras that can be seen to networks_available + * Args: + * networks_available - List of networks that we use to see which cameras are visible to it. + */ +/proc/get_camera_list(list/networks_available) + var/list/all_camera_list = list() + for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras) + all_camera_list.Add(camera) + + camera_sort(all_camera_list) + + var/list/usable_camera_list = list() + + for(var/obj/machinery/camera/camera as anything in all_camera_list) + var/list/tempnetwork = camera.network & networks_available + if(length(tempnetwork)) + usable_camera_list["[camera.c_tag][camera.can_use() ? null : " (Deactivated)"]"] = camera + + return usable_camera_list + +///Sorts the list of cameras by their c_tag to display to players. +/proc/camera_sort(list/camera_list) + var/obj/machinery/camera/camera_comparing_a + var/obj/machinery/camera/camera_comparing_b + + for(var/i = length(camera_list), i > 0, i--) + for(var/j = 1 to i - 1) + camera_comparing_a = camera_list[j] + camera_comparing_b = camera_list[j + 1] + if(sorttext(camera_comparing_a.c_tag, camera_comparing_b.c_tag) < 0) + camera_list.Swap(j, j + 1) + return camera_list diff --git a/code/_onclick/hud/map_popups.dm b/code/_onclick/hud/map_popups.dm index 07c43eac4491..7f3997ecbd67 100644 --- a/code/_onclick/hud/map_popups.dm +++ b/code/_onclick/hud/map_popups.dm @@ -1,36 +1,3 @@ -/client - /** - * Assoc list with all the active maps - when a screen obj is added to - * a map, it's put in here as well. - * - * Format: list( = list(/atom/movable/screen)) - */ - var/list/screen_maps = list() - -/atom/movable/screen - /** - * Map name assigned to this object. - * Automatically set by /client/proc/add_obj_to_map. - */ - var/assigned_map - /** - * Mark this object as garbage-collectible after you clean the map - * it was registered on. - * - * This could probably be changed to be a proc, for conditional removal. - * But for now, this works. - */ - var/del_on_map_removal = TRUE - -/** - * A screen object, which acts as a container for turfs and other things - * you want to show on the map, which you usually attach to "vis_contents". - */ -/atom/movable/screen/map_view - // Map view has to be on the lowest plane to enable proper lighting - layer = GAME_PLANE - plane = GAME_PLANE - /** * A generic background object. * It is also implicitly used to allocate a rectangle on the map, which will @@ -79,8 +46,6 @@ var/list/screen_map = screen_maps[screen_obj.assigned_map] if(!screen_map.Find(screen_obj)) screen_map += screen_obj - if(!screen.Find(screen_obj)) - screen += screen_obj /** * Clears the map of registered screen objects. diff --git a/code/_onclick/hud/map_view.dm b/code/_onclick/hud/map_view.dm new file mode 100644 index 000000000000..bc304f20f8a1 --- /dev/null +++ b/code/_onclick/hud/map_view.dm @@ -0,0 +1,69 @@ +/** + * A screen object, which acts as a container for turfs and other things + * you want to show on the map, which you usually attach to "vis_contents". + * Additionally manages the plane masters required to display said container contents + */ +INITIALIZE_IMMEDIATE(/atom/movable/screen/map_view) +/atom/movable/screen/map_view + name = "screen" + // Map view has to be on the lowest plane to enable proper lighting + layer = GAME_PLANE + plane = GAME_PLANE + del_on_map_removal = FALSE + + // Weakrefs of all our hud viewers -> a weakref to the hud datum they last used + var/list/datum/weakref/viewers_to_huds = list() + +/atom/movable/screen/map_view/Destroy() + for(var/datum/weakref/client_ref in viewers_to_huds) + var/client/our_client = client_ref.resolve() + if(!our_client) + continue + hide_from(our_client.mob) + + return ..() + +/atom/movable/screen/map_view/proc/generate_view(map_key) + // Map keys have to start and end with an A-Z character, + // and definitely NOT with a square bracket or even a number. + // I wasted 6 hours on this. :agony: + // -- Stylemistake + assigned_map = map_key + set_position(1, 1) + +/atom/movable/screen/map_view/proc/display_to(mob/show_to) + show_to.client.register_map_obj(src) + // We need to add planesmasters to the popup, otherwise + // blending fucks up massively. Any planesmaster on the main screen does + // NOT apply to map popups. If there's ever a way to make planesmasters + // omnipresent, then this wouldn't be needed. + // We lazy load this because there's no point creating all these if none's gonna see em + + // Store this info in a client -> hud pattern, so ghosts closing the window nukes the right group + var/datum/weakref/client_ref = WEAKREF(show_to.client) + + var/datum/weakref/hud_ref = viewers_to_huds[client_ref] + var/datum/hud/our_hud = hud_ref?.resolve() + if(our_hud) + return our_hud.get_plane_group(PLANE_GROUP_POPUP_WINDOW(src)) + + // Generate a new plane group for this case + var/datum/plane_master_group/popup/pop_planes = new(PLANE_GROUP_POPUP_WINDOW(src), assigned_map) + viewers_to_huds[client_ref] = WEAKREF(show_to.hud_used) + pop_planes.attach_to(show_to.hud_used) + + return pop_planes + +/atom/movable/screen/map_view/proc/hide_from(mob/hide_from) + hide_from?.canon_client.clear_map(assigned_map) + var/client_ref = WEAKREF(hide_from?.canon_client) + + // Make sure we clear the *right* hud + var/datum/weakref/hud_ref = viewers_to_huds[client_ref] + viewers_to_huds -= client_ref + var/datum/hud/clear_from = hud_ref?.resolve() + if(!clear_from) + return + + var/datum/plane_master_group/popup/pop_planes = clear_from.get_plane_group(PLANE_GROUP_POPUP_WINDOW(src)) + qdel(pop_planes) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 78637e568ee2..5e81424b01d5 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -21,6 +21,19 @@ /// If FALSE, this will not be cleared when calling /client/clear_screen() var/clear_with_screen = TRUE + /** + * Map name assigned to this object. + * Automatically set by /client/proc/add_obj_to_map. + */ + var/assigned_map + /** + * Mark this object as garbage-collectible after you clean the map + * it was registered on. + * + * This could probably be changed to be a proc, for conditional removal. + * But for now, this works. + */ + var/del_on_map_removal = TRUE /atom/movable/screen/New(datum/hud/new_hud) . = ..() diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 7403efe086d3..16ebdab54fb2 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -26,6 +26,9 @@ SUBSYSTEM_DEF(mapping) var/list/station_minimaps = list() + /// The largest plane offset we've generated so far + var/max_plane_offset = 0 + /// List of z level (as number) -> The lowest plane offset in that z stack var/list/z_level_to_lowest_plane_offset = list() @@ -38,9 +41,6 @@ SUBSYSTEM_DEF(mapping) /// List of planes that do not allow for offsetting var/list/plane_offset_blacklist - /// The largest plane offset we've generated so far - var/max_plane_offset = 0 - /// Assoc list of true string plane values to a list of all potential offset planess var/list/true_to_offset_planes diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 6a22487fe039..0cd4b1aa2516 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -11,6 +11,7 @@ idle_power_usage = 5 active_power_usage = 10 layer = WALL_OBJ_LAYER + plane = GAME_PLANE_UPPER resistance_flags = FIRE_PROOF armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 50) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 0976aba838e4..1c99178a2d99 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -138,14 +138,3 @@ return user.switchCamera(src) -/proc/camera_sort(list/L) - var/obj/machinery/camera/a - var/obj/machinery/camera/b - - for (var/i = L.len, i > 0, i--) - for (var/j = 1 to i - 1) - a = L[j] - b = L[j + 1] - if (sorttext(a.c_tag, b.c_tag) < 0) - L.Swap(j, j + 1) - return L diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index bf0662c74313..bb3317a61ac4 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -177,3 +177,9 @@ . = ..() if(istype(mover) && (mover.pass_flags & PASSCOMPUTER)) return TRUE + + +/obj/machinery/computer/ui_interact(mob/user, datum/tgui/ui) + SHOULD_CALL_PARENT(TRUE) + . = ..() + // update_use_power(ACTIVE_POWER_USE) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 43f22a4e2754..8cc1e1fcbf36 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -1,64 +1,58 @@ +#define DEFAULT_MAP_SIZE 15 + /obj/machinery/computer/security name = "security camera console" desc = "Used to access the various cameras on the station." icon_screen = "cameras" icon_keyboard = "security_key" circuit = /obj/item/circuitboard/computer/security - light_color = LIGHT_COLOR_RED + light_color = COLOR_SOFT_RED var/list/network = list("ss13") + var/obj/machinery/camera/active_camera + /// The turf where the camera was last updated. + var/turf/last_camera_turf var/list/concurrent_users = list() // Stuff needed to render the map - var/map_name - var/const/default_map_size = 15 - var/atom/movable/screen/cam_screen + var/atom/movable/screen/map_view/cam_screen /// All the plane masters that need to be applied. - var/list/cam_plane_masters var/atom/movable/screen/background/cam_background - var/obj/machinery/camera/active_camera - - var/processing = FALSE + interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_REQUIRES_SIGHT /obj/machinery/computer/security/Initialize(mapload) . = ..() // Map name has to start and end with an A-Z character, // and definitely NOT with a square bracket or even a number. // I wasted 6 hours on this. :agony: - map_name = "camera_console_[REF(src)]_map" + var/map_name = "camera_console_[REF(src)]_map" // Convert networks to lowercase for(var/i in network) network -= i network += lowertext(i) // Initialize map objects cam_screen = new - cam_screen.name = "screen" - cam_screen.assigned_map = map_name - cam_screen.del_on_map_removal = FALSE - cam_screen.screen_loc = "[map_name]:1,1" - cam_plane_masters = list() - for(var/plane in subtypesof(/atom/movable/screen/plane_master)) - var/atom/movable/screen/instance = new plane() - instance.assigned_map = map_name - instance.del_on_map_removal = FALSE - instance.screen_loc = "[map_name]:CENTER" - cam_plane_masters += instance + cam_screen.generate_view(map_name) cam_background = new cam_background.assigned_map = map_name cam_background.del_on_map_removal = FALSE /obj/machinery/computer/security/Destroy() - qdel(cam_screen) - QDEL_LIST(cam_plane_masters) - qdel(cam_background) + QDEL_NULL(cam_screen) + QDEL_NULL(cam_background) return ..() /obj/machinery/computer/security/ui_interact(mob/user, datum/tgui/ui) + . = ..() + // if(!user.can_perform_action(src, NEED_DEXTERITY)) //prevents monkeys from using camera consoles + // return + // Update UI ui = SStgui.try_update_ui(user, src, ui) - // Show static if can't use the camera - if(!active_camera?.can_use()) - show_camera_static() + + // Update the camera, showing static if necessary and updating data if the location has moved. + update_active_camera_screen() + if(!ui) var/user_ref = REF(user) var/is_living = isliving(user) @@ -71,47 +65,65 @@ playsound(src, 'sound/machines/terminal_on.ogg', 25, FALSE) use_power(active_power_usage) // Register map objects - user.client.register_map_obj(cam_screen) - for(var/plane in cam_plane_masters) - user.client.register_map_obj(plane) + cam_screen.display_to(user) user.client.register_map_obj(cam_background) // Open UI ui = new(user, src, "CameraConsole", name) ui.open() +/obj/machinery/computer/security/ui_status(mob/user) + . = ..() + if(. == UI_DISABLED) + return UI_CLOSE + return . + /obj/machinery/computer/security/ui_data() var/list/data = list() - data["network"] = network data["activeCamera"] = null if(active_camera) data["activeCamera"] = list( name = active_camera.c_tag, + ref = REF(active_camera), status = active_camera.status, ) return data /obj/machinery/computer/security/ui_static_data() var/list/data = list() - data["mapRef"] = map_name - var/list/cameras = get_available_cameras() + data["network"] = network + data["mapRef"] = cam_screen.assigned_map + var/list/cameras = get_camera_list(network) data["cameras"] = list() for(var/i in cameras) var/obj/machinery/camera/C = cameras[i] data["cameras"] += list(list( name = C.c_tag, + ref = REF(C), )) + return data -/obj/machinery/computer/security/process() - if(active_camera && active_camera.built_in) - if(!active_camera?.can_use()) - show_camera_static() - return TRUE - update_camera(active_camera) - else - STOP_PROCESSING(SSfastprocess, src) - processing = FALSE - ..() +//returns the list of cameras accessible from this computer +/obj/machinery/computer/security/proc/get_available_cameras() + var/list/L = list() + for (var/obj/machinery/camera/C in GLOB.cameranet.cameras) + if((is_away_level(z) || is_away_level(C.z)) && (C.z != z))//if on away mission, can only receive feed from same z_level cameras + continue + L.Add(C) + + var/list/D = list() + + for(var/obj/machinery/camera/C in L) + if(!C.network) + stack_trace("Camera in a cameranet has no camera network") + continue + if(!(islist(C.network))) + stack_trace("Camera in a cameranet has a non-list camera network") + continue + var/list/tempnetwork = C.network & network + if(tempnetwork.len) + D["[C.c_tag]"] = C + return D /obj/machinery/computer/security/ui_act(action, params) . = ..() @@ -125,36 +137,40 @@ active_camera = C playsound(src, get_sfx("terminal_type"), 25, FALSE) - // Show static if can't use the camera - if(!active_camera?.can_use()) - show_camera_static() + if(isnull(active_camera)) return TRUE - - //Assume it's a moving camera. - if(C.built_in) - if(!processing) - START_PROCESSING(SSfastprocess, src) - processing = TRUE - else - STOP_PROCESSING(SSfastprocess, src) - processing = FALSE - - update_camera(C) + update_active_camera_screen() return TRUE -/obj/machinery/computer/security/proc/update_camera(obj/machinery/camera/C) - var/originator = C - if(C.built_in) - originator = get_turf(C.built_in) +/obj/machinery/computer/security/proc/update_active_camera_screen() + // Show static if can't use the camera + if(!active_camera?.can_use()) + show_camera_static() + return var/list/visible_turfs = list() - for(var/turf/T in (C.isXRay() \ - ? range(C.view_range, originator) \ - : view(C.view_range, originator))) - visible_turfs += T + // Get the camera's turf to correctly gather what's visible from it's turf, in case it's located in a moving object (borgs / mechs) + var/new_cam_turf = get_turf(active_camera) + + // If we're not forcing an update for some reason and the cameras are in the same location, + // we don't need to update anything. + // Most security cameras will end here as they're not moving. + if(last_camera_turf == new_cam_turf) + return + + // Cameras that get here are moving, and are likely attached to some moving atom such as cyborgs. + last_camera_turf = new_cam_turf + + //Here we gather what's visible from the camera's POV based on its view_range and xray modifier if present + var/list/visible_things = active_camera.isXRay(ignore_malf_upgrades = TRUE) ? range(active_camera.view_range, new_cam_turf) : view(active_camera.view_range, new_cam_turf) + + for(var/turf/visible_turf in visible_things) + visible_turfs += visible_turf + + //Get coordinates for a rectangle area that contains the turfs we see so we can then clear away the static in the resulting rectangle area var/list/bbox = get_bbox_of_atoms(visible_turfs) var/size_x = bbox[3] - bbox[1] + 1 var/size_y = bbox[4] - bbox[2] + 1 @@ -164,44 +180,25 @@ cam_background.fill_rect(1, 1, size_x, size_y) /obj/machinery/computer/security/ui_close(mob/user) + . = ..() var/user_ref = REF(user) var/is_living = isliving(user) // Living creature or not, we remove you anyway. concurrent_users -= user_ref // Unregister map objects - user.client.clear_map(map_name) + cam_screen.hide_from(user) // Turn off the console if(length(concurrent_users) == 0 && is_living) active_camera = null + last_camera_turf = null playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE) use_power(0) /obj/machinery/computer/security/proc/show_camera_static() cam_screen.vis_contents.Cut() cam_background.icon_state = "scanline2" - cam_background.fill_rect(1, 1, default_map_size, default_map_size) - -//returns the list of cameras accessible from this computer -/obj/machinery/computer/security/proc/get_available_cameras() - var/list/L = list() - for (var/obj/machinery/camera/C in GLOB.cameranet.cameras) - if((is_away_level(z) || is_away_level(C.z)) && (C.z != z))//if on away mission, can only receive feed from same z_level cameras - continue - L.Add(C) + cam_background.fill_rect(1, 1, DEFAULT_MAP_SIZE, DEFAULT_MAP_SIZE) - var/list/D = list() - - for(var/obj/machinery/camera/C in L) - if(!C.network) - stack_trace("Camera in a cameranet has no camera network") - continue - if(!(islist(C.network))) - stack_trace("Camera in a cameranet has a non-list camera network") - continue - var/list/tempnetwork = C.network & network - if(tempnetwork.len) - D["[C.c_tag]"] = C - return D // SECURITY MONITORS diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 9d7db5e25668..a3d7db2478b3 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -195,3 +195,10 @@ var/do_parallax_animations = TRUE var/parallax_throttle = 0 //ds between updates var/last_parallax_shift //world.time of last update + /** + * Assoc list with all the active maps - when a screen obj is added to + * a map, it's put in here as well. + * + * Format: list( = list(/atom/movable/screen)) + */ + var/list/screen_maps = list() diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index efd4184eee1f..cb61915a19cf 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -17,14 +17,26 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) var/ready = 0 // The object used for the clickable stat() button. var/obj/effect/statclick/statclick - ///The image given to the effect in vis_contents on AI clients - var/image/obscured + /// List of images cloned by all chunk static images put onto turfs cameras cant see + /// Indexed by the plane offset to use + var/list/image/obscured_images /datum/cameranet/New() - obscured = new('icons/effects/cameravis.dmi') - obscured.plane = CAMERA_STATIC_PLANE - obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART - obscured.override = TRUE + obscured_images = list() + update_offsets(SSmapping.max_plane_offset) + RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_offset_growth)) + +/datum/cameranet/proc/update_offsets(new_offset) + for(var/i in length(obscured_images) to new_offset) + var/image/obscured = new('icons/effects/cameravis.dmi') + SET_PLANE_W_SCALAR(obscured, CAMERA_STATIC_PLANE, i) + obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART + obscured.override = TRUE + obscured_images += obscured + +/datum/cameranet/proc/on_offset_growth(datum/source, old_offset, new_offset) + SIGNAL_HANDLER + update_offsets(new_offset) /// Checks if a chunk has been Generated in x, y, z. /datum/cameranet/proc/chunkGenerated(x, y, z) diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index abf891b011ac..c2178a5be5ba 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -144,7 +144,7 @@ turfs[t] = t for(var/turf in turfs)//one for each 16x16 = 256 turfs this camera chunk encompasses - inactive_static_images += new/image(GLOB.cameranet.obscured) + inactive_static_images += new/image(GLOB.cameranet.obscured_images) for(var/obj/machinery/camera/camera as anything in cameras) if(!camera || !camera.can_use()) diff --git a/yogstation.dme b/yogstation.dme index 374f54ea108d..fac8f88d5fd2 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -217,6 +217,7 @@ #include "code\__HELPERS\animations.dm" #include "code\__HELPERS\areas.dm" #include "code\__HELPERS\AStar.dm" +#include "code\__HELPERS\cameras.dm" #include "code\__HELPERS\cmp.dm" #include "code\__HELPERS\colors.dm" #include "code\__HELPERS\config.dm" @@ -319,6 +320,7 @@ #include "code\_onclick\hud\lavaland_elite.dm" #include "code\_onclick\hud\living.dm" #include "code\_onclick\hud\map_popups.dm" +#include "code\_onclick\hud\map_view.dm" #include "code\_onclick\hud\monkey.dm" #include "code\_onclick\hud\movable_screen_objects.dm" #include "code\_onclick\hud\pai.dm" From e26fb61415cc9f1d48f7528a9ebda34ec93020b0 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Sun, 3 Dec 2023 23:09:27 -0500 Subject: [PATCH 095/281] Revert "this isnt going well" This reverts commit 1d8ceac8673cc8ea4b05ce25da0f67044334da4f. --- .../packages/tgui/interfaces/CameraConsole.js | 143 +++++++++++++ .../tgui/interfaces/CameraConsole.tsx | 198 ------------------ tgui/packages/tgui/interfaces/NtosSecurEye.js | 60 ++++++ .../tgui/interfaces/NtosSecureEye.tsx | 12 -- .../tgui/styles/interfaces/CameraConsole.scss | 53 +++++ tgui/packages/tgui/styles/main.scss | 1 + 6 files changed, 257 insertions(+), 210 deletions(-) create mode 100644 tgui/packages/tgui/interfaces/CameraConsole.js delete mode 100644 tgui/packages/tgui/interfaces/CameraConsole.tsx create mode 100644 tgui/packages/tgui/interfaces/NtosSecurEye.js delete mode 100644 tgui/packages/tgui/interfaces/NtosSecureEye.tsx create mode 100644 tgui/packages/tgui/styles/interfaces/CameraConsole.scss diff --git a/tgui/packages/tgui/interfaces/CameraConsole.js b/tgui/packages/tgui/interfaces/CameraConsole.js new file mode 100644 index 000000000000..8ece49eff205 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CameraConsole.js @@ -0,0 +1,143 @@ +import { filter, sortBy } from 'common/collections'; +import { flow } from 'common/fp'; +import { classes } from 'common/react'; +import { createSearch } from 'common/string'; +import { useBackend, useLocalState } from '../backend'; +import { Button, ByondUi, Flex, Input, Section } from '../components'; +import { Window } from '../layouts'; + +/** + * Returns previous and next camera names relative to the currently + * active camera. + */ +export const prevNextCamera = (cameras, activeCamera) => { + if (!activeCamera) { + return []; + } + const index = cameras.findIndex(camera => ( + camera.name === activeCamera.name + )); + return [ + cameras[index - 1]?.name, + cameras[index + 1]?.name, + ]; +}; + +/** + * Camera selector. + * + * Filters cameras, applies search terms and sorts the alphabetically. + */ +export const selectCameras = (cameras, searchText = '') => { + const testSearch = createSearch(searchText, camera => camera.name); + return flow([ + // Null camera filter + filter(camera => camera?.name), + // Optional search term + searchText && filter(testSearch), + // Slightly expensive, but way better than sorting in BYOND + sortBy(camera => camera.name), + ])(cameras); +}; + +export const CameraConsole = (props, context) => { + const { act, data } = useBackend(context); + const { mapRef, activeCamera } = data; + const cameras = selectCameras(data.cameras); + const [ + prevCameraName, + nextCameraName, + ] = prevNextCamera(cameras, activeCamera); + return ( + +
    + + + +
    +
    +
    + Camera: + {activeCamera + && activeCamera.name + || '—'} +
    +
    +
    + +
    +
    + ); +}; + +export const CameraConsoleContent = (props, context) => { + const { act, data } = useBackend(context); + const [ + searchText, + setSearchText, + ] = useLocalState(context, 'searchText', ''); + const { activeCamera } = data; + const cameras = selectCameras(data.cameras, searchText); + return ( + + + setSearchText(value)} /> + + +
    + {cameras.map(camera => ( + // We're not using the component here because performance + // would be absolutely abysmal (50+ ms for each re-render). +
    [act('switch_camera', { + name: camera.name, + }), document.getElementsByClassName('CameraConsole__left')[0].focus()]}> + {camera.name} +
    + ))} +
    +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/CameraConsole.tsx b/tgui/packages/tgui/interfaces/CameraConsole.tsx deleted file mode 100644 index 4feb31faaf67..000000000000 --- a/tgui/packages/tgui/interfaces/CameraConsole.tsx +++ /dev/null @@ -1,198 +0,0 @@ -import { filter, sortBy } from 'common/collections'; -import { flow } from 'common/fp'; -import { BooleanLike, classes } from 'common/react'; -import { createSearch } from 'common/string'; -import { useBackend, useLocalState } from '../backend'; -import { Button, ByondUi, Input, NoticeBox, Section, Stack } from '../components'; -import { Window } from '../layouts'; - -type Data = { - can_spy: BooleanLike; - mapRef: string; - cameras: Camera[]; - activeCamera: Camera & { status: BooleanLike }; - network: string[]; -}; - -type Camera = { - name: string; -}; - -/** - * Returns previous and next camera names relative to the currently - * active camera. - */ -const prevNextCamera = ( - cameras: Camera[], - activeCamera: Camera & { status: BooleanLike } -) => { - if (!activeCamera) { - return []; - } - const index = cameras.findIndex( - (camera) => camera?.name === activeCamera.name - ); - return [cameras[index - 1]?.name, cameras[index + 1]?.name]; -}; - -/** - * Camera selector. - * - * Filters cameras, applies search terms and sorts the alphabetically. - */ -const selectCameras = (cameras: Camera[], searchText = ''): Camera[] => { - const testSearch = createSearch(searchText, (camera: Camera) => camera.name); - - return flow([ - // Null camera filter - filter((camera: Camera) => !!camera?.name), // Optional search term - searchText && filter(testSearch), - // Slightly expensive, but way better than sorting in BYOND - sortBy((camera: Camera) => camera.name), - ])(cameras); -}; - -export const CameraConsole = (props, context) => { - return ( - - - - - - ); -}; - -export const CameraContent = (props, context) => { - return ( - - - - - - - - - ); -}; - -const CameraSelector = (props, context) => { - const { act, data } = useBackend(context); - const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); - const { activeCamera } = data; - const cameras = selectCameras(data.cameras, searchText); - - return ( - - - setSearchText(value)} - /> - - -
    - {cameras.map((camera) => ( - // We're not using the component here because performance - // would be absolutely abysmal (50+ ms for each re-render). -
    - act('switch_camera', { - name: camera.name, - }) - }> - {camera.name} -
    - ))} -
    -
    -
    - ); -}; - -const CameraControls = (props, context) => { - const { act, data } = useBackend(context); - const { activeCamera, can_spy, mapRef } = data; - const cameras = selectCameras(data.cameras); - - const [prevCameraName, nextCameraName] = prevNextCamera( - cameras, - activeCamera - ); - - return ( -
    - - - - - {activeCamera?.name ? ( - {activeCamera.name} - ) : ( - No input signal - )} - - - - {!!can_spy && ( -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosSecurEye.js b/tgui/packages/tgui/interfaces/NtosSecurEye.js new file mode 100644 index 000000000000..8d4bc6274528 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosSecurEye.js @@ -0,0 +1,60 @@ +import { filter, sortBy } from 'common/collections'; +import { flow } from 'common/fp'; +import { classes } from 'common/react'; +import { createSearch } from 'common/string'; +import { Fragment } from 'inferno'; +import { useBackend, useLocalState } from '../backend'; +import { Button, ByondUi, Input, Section } from '../components'; +import { NtosWindow } from '../layouts'; +import { prevNextCamera, selectCameras, CameraConsoleContent } from './CameraConsole'; +import { logger } from "../logging"; + +export const NtosSecurEye = (props, context) => { + const { act, data, config } = useBackend(context); + const { PC_device_theme, mapRef, activeCamera } = data; + const cameras = selectCameras(data.cameras); + const [ + prevCameraName, + nextCameraName, + ] = prevNextCamera(cameras, activeCamera); + return ( + + +
    + +
    +
    +
    + Camera: + {activeCamera + && activeCamera.name + || '—'} +
    +
    +
    + +
    +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosSecureEye.tsx b/tgui/packages/tgui/interfaces/NtosSecureEye.tsx deleted file mode 100644 index c445b6f160f5..000000000000 --- a/tgui/packages/tgui/interfaces/NtosSecureEye.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { NtosWindow } from '../layouts'; -import { CameraContent } from './CameraConsole'; - -export const NtosSecurEye = (props) => { - return ( - - - - - - ); -}; diff --git a/tgui/packages/tgui/styles/interfaces/CameraConsole.scss b/tgui/packages/tgui/styles/interfaces/CameraConsole.scss new file mode 100644 index 000000000000..7e8f99fdcceb --- /dev/null +++ b/tgui/packages/tgui/styles/interfaces/CameraConsole.scss @@ -0,0 +1,53 @@ +@use '../base.scss'; + +$background-color: rgba(0, 0, 0, 0.33) !default; + +.CameraConsole__left { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: base.em(220px); +} + +.CameraConsole__right { + position: absolute; + top: 0; + bottom: 0; + left: base.em(220px); + right: 0; + background-color: $background-color; +} + +.CameraConsole__toolbar { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 2em; + line-height: 2em; + margin: 0.25em 1em 0; +} + +.CameraConsole__toolbarRight { + position: absolute; + top: 0; + right: 0; + height: 2em; + line-height: 2em; + margin: 0.33em 0.5em 0; +} + +.CameraConsole__map { + position: absolute; + top: base.em(26px); + bottom: 0; + left: 0; + right: 0; + margin: 0.5em; + text-align: center; + + .NoticeBox { + margin-top: calc(50% - 2em); + } +} diff --git a/tgui/packages/tgui/styles/main.scss b/tgui/packages/tgui/styles/main.scss index 9a7a42fcf5aa..d60242ae8627 100644 --- a/tgui/packages/tgui/styles/main.scss +++ b/tgui/packages/tgui/styles/main.scss @@ -48,6 +48,7 @@ // Interfaces @include meta.load-css('./interfaces/AlertModal.scss'); +@include meta.load-css('./interfaces/CameraConsole.scss'); @include meta.load-css('./interfaces/InspectorBooth.scss'); @include meta.load-css('./interfaces/ListInput.scss'); @include meta.load-css('./interfaces/HellishRunes.scss'); From c0cf69ebf10d44ab05ceedc3f5a7c51fd074ac08 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Sun, 3 Dec 2023 23:13:33 -0500 Subject: [PATCH 096/281] Revert "Revert "this isnt going well"" This reverts commit e26fb61415cc9f1d48f7528a9ebda34ec93020b0. --- .../packages/tgui/interfaces/CameraConsole.js | 143 ------------- .../tgui/interfaces/CameraConsole.tsx | 198 ++++++++++++++++++ tgui/packages/tgui/interfaces/NtosSecurEye.js | 60 ------ .../tgui/interfaces/NtosSecureEye.tsx | 12 ++ .../tgui/styles/interfaces/CameraConsole.scss | 53 ----- tgui/packages/tgui/styles/main.scss | 1 - 6 files changed, 210 insertions(+), 257 deletions(-) delete mode 100644 tgui/packages/tgui/interfaces/CameraConsole.js create mode 100644 tgui/packages/tgui/interfaces/CameraConsole.tsx delete mode 100644 tgui/packages/tgui/interfaces/NtosSecurEye.js create mode 100644 tgui/packages/tgui/interfaces/NtosSecureEye.tsx delete mode 100644 tgui/packages/tgui/styles/interfaces/CameraConsole.scss diff --git a/tgui/packages/tgui/interfaces/CameraConsole.js b/tgui/packages/tgui/interfaces/CameraConsole.js deleted file mode 100644 index 8ece49eff205..000000000000 --- a/tgui/packages/tgui/interfaces/CameraConsole.js +++ /dev/null @@ -1,143 +0,0 @@ -import { filter, sortBy } from 'common/collections'; -import { flow } from 'common/fp'; -import { classes } from 'common/react'; -import { createSearch } from 'common/string'; -import { useBackend, useLocalState } from '../backend'; -import { Button, ByondUi, Flex, Input, Section } from '../components'; -import { Window } from '../layouts'; - -/** - * Returns previous and next camera names relative to the currently - * active camera. - */ -export const prevNextCamera = (cameras, activeCamera) => { - if (!activeCamera) { - return []; - } - const index = cameras.findIndex(camera => ( - camera.name === activeCamera.name - )); - return [ - cameras[index - 1]?.name, - cameras[index + 1]?.name, - ]; -}; - -/** - * Camera selector. - * - * Filters cameras, applies search terms and sorts the alphabetically. - */ -export const selectCameras = (cameras, searchText = '') => { - const testSearch = createSearch(searchText, camera => camera.name); - return flow([ - // Null camera filter - filter(camera => camera?.name), - // Optional search term - searchText && filter(testSearch), - // Slightly expensive, but way better than sorting in BYOND - sortBy(camera => camera.name), - ])(cameras); -}; - -export const CameraConsole = (props, context) => { - const { act, data } = useBackend(context); - const { mapRef, activeCamera } = data; - const cameras = selectCameras(data.cameras); - const [ - prevCameraName, - nextCameraName, - ] = prevNextCamera(cameras, activeCamera); - return ( - -
    - - - -
    -
    -
    - Camera: - {activeCamera - && activeCamera.name - || '—'} -
    -
    -
    - -
    -
    - ); -}; - -export const CameraConsoleContent = (props, context) => { - const { act, data } = useBackend(context); - const [ - searchText, - setSearchText, - ] = useLocalState(context, 'searchText', ''); - const { activeCamera } = data; - const cameras = selectCameras(data.cameras, searchText); - return ( - - - setSearchText(value)} /> - - -
    - {cameras.map(camera => ( - // We're not using the component here because performance - // would be absolutely abysmal (50+ ms for each re-render). -
    [act('switch_camera', { - name: camera.name, - }), document.getElementsByClassName('CameraConsole__left')[0].focus()]}> - {camera.name} -
    - ))} -
    -
    -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/CameraConsole.tsx b/tgui/packages/tgui/interfaces/CameraConsole.tsx new file mode 100644 index 000000000000..4feb31faaf67 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CameraConsole.tsx @@ -0,0 +1,198 @@ +import { filter, sortBy } from 'common/collections'; +import { flow } from 'common/fp'; +import { BooleanLike, classes } from 'common/react'; +import { createSearch } from 'common/string'; +import { useBackend, useLocalState } from '../backend'; +import { Button, ByondUi, Input, NoticeBox, Section, Stack } from '../components'; +import { Window } from '../layouts'; + +type Data = { + can_spy: BooleanLike; + mapRef: string; + cameras: Camera[]; + activeCamera: Camera & { status: BooleanLike }; + network: string[]; +}; + +type Camera = { + name: string; +}; + +/** + * Returns previous and next camera names relative to the currently + * active camera. + */ +const prevNextCamera = ( + cameras: Camera[], + activeCamera: Camera & { status: BooleanLike } +) => { + if (!activeCamera) { + return []; + } + const index = cameras.findIndex( + (camera) => camera?.name === activeCamera.name + ); + return [cameras[index - 1]?.name, cameras[index + 1]?.name]; +}; + +/** + * Camera selector. + * + * Filters cameras, applies search terms and sorts the alphabetically. + */ +const selectCameras = (cameras: Camera[], searchText = ''): Camera[] => { + const testSearch = createSearch(searchText, (camera: Camera) => camera.name); + + return flow([ + // Null camera filter + filter((camera: Camera) => !!camera?.name), // Optional search term + searchText && filter(testSearch), + // Slightly expensive, but way better than sorting in BYOND + sortBy((camera: Camera) => camera.name), + ])(cameras); +}; + +export const CameraConsole = (props, context) => { + return ( + + + + + + ); +}; + +export const CameraContent = (props, context) => { + return ( + + + + + + + + + ); +}; + +const CameraSelector = (props, context) => { + const { act, data } = useBackend(context); + const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); + const { activeCamera } = data; + const cameras = selectCameras(data.cameras, searchText); + + return ( + + + setSearchText(value)} + /> + + +
    + {cameras.map((camera) => ( + // We're not using the component here because performance + // would be absolutely abysmal (50+ ms for each re-render). +
    + act('switch_camera', { + name: camera.name, + }) + }> + {camera.name} +
    + ))} +
    +
    +
    + ); +}; + +const CameraControls = (props, context) => { + const { act, data } = useBackend(context); + const { activeCamera, can_spy, mapRef } = data; + const cameras = selectCameras(data.cameras); + + const [prevCameraName, nextCameraName] = prevNextCamera( + cameras, + activeCamera + ); + + return ( +
    + + + + + {activeCamera?.name ? ( + {activeCamera.name} + ) : ( + No input signal + )} + + + + {!!can_spy && ( +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosSecurEye.js b/tgui/packages/tgui/interfaces/NtosSecurEye.js deleted file mode 100644 index 8d4bc6274528..000000000000 --- a/tgui/packages/tgui/interfaces/NtosSecurEye.js +++ /dev/null @@ -1,60 +0,0 @@ -import { filter, sortBy } from 'common/collections'; -import { flow } from 'common/fp'; -import { classes } from 'common/react'; -import { createSearch } from 'common/string'; -import { Fragment } from 'inferno'; -import { useBackend, useLocalState } from '../backend'; -import { Button, ByondUi, Input, Section } from '../components'; -import { NtosWindow } from '../layouts'; -import { prevNextCamera, selectCameras, CameraConsoleContent } from './CameraConsole'; -import { logger } from "../logging"; - -export const NtosSecurEye = (props, context) => { - const { act, data, config } = useBackend(context); - const { PC_device_theme, mapRef, activeCamera } = data; - const cameras = selectCameras(data.cameras); - const [ - prevCameraName, - nextCameraName, - ] = prevNextCamera(cameras, activeCamera); - return ( - - -
    - -
    -
    -
    - Camera: - {activeCamera - && activeCamera.name - || '—'} -
    -
    -
    - -
    -
    -
    - ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosSecureEye.tsx b/tgui/packages/tgui/interfaces/NtosSecureEye.tsx new file mode 100644 index 000000000000..c445b6f160f5 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosSecureEye.tsx @@ -0,0 +1,12 @@ +import { NtosWindow } from '../layouts'; +import { CameraContent } from './CameraConsole'; + +export const NtosSecurEye = (props) => { + return ( + + + + + + ); +}; diff --git a/tgui/packages/tgui/styles/interfaces/CameraConsole.scss b/tgui/packages/tgui/styles/interfaces/CameraConsole.scss deleted file mode 100644 index 7e8f99fdcceb..000000000000 --- a/tgui/packages/tgui/styles/interfaces/CameraConsole.scss +++ /dev/null @@ -1,53 +0,0 @@ -@use '../base.scss'; - -$background-color: rgba(0, 0, 0, 0.33) !default; - -.CameraConsole__left { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: base.em(220px); -} - -.CameraConsole__right { - position: absolute; - top: 0; - bottom: 0; - left: base.em(220px); - right: 0; - background-color: $background-color; -} - -.CameraConsole__toolbar { - position: absolute; - top: 0; - left: 0; - right: 0; - height: 2em; - line-height: 2em; - margin: 0.25em 1em 0; -} - -.CameraConsole__toolbarRight { - position: absolute; - top: 0; - right: 0; - height: 2em; - line-height: 2em; - margin: 0.33em 0.5em 0; -} - -.CameraConsole__map { - position: absolute; - top: base.em(26px); - bottom: 0; - left: 0; - right: 0; - margin: 0.5em; - text-align: center; - - .NoticeBox { - margin-top: calc(50% - 2em); - } -} diff --git a/tgui/packages/tgui/styles/main.scss b/tgui/packages/tgui/styles/main.scss index d60242ae8627..9a7a42fcf5aa 100644 --- a/tgui/packages/tgui/styles/main.scss +++ b/tgui/packages/tgui/styles/main.scss @@ -48,7 +48,6 @@ // Interfaces @include meta.load-css('./interfaces/AlertModal.scss'); -@include meta.load-css('./interfaces/CameraConsole.scss'); @include meta.load-css('./interfaces/InspectorBooth.scss'); @include meta.load-css('./interfaces/ListInput.scss'); @include meta.load-css('./interfaces/HellishRunes.scss'); From 7e7a7f8372cd1ce7169736bf52cd40e568b46c10 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Sun, 3 Dec 2023 23:16:44 -0500 Subject: [PATCH 097/281] ok ok --- code/modules/surgery/organs/augments_chest.dm | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 0ab2df136add..64f102b21f8d 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -335,13 +335,23 @@ to_chat(owner, span_warning("Your spinal implant makes you feel queasy!")) return - owner.set_drugginess(4 * severity) - owner.adjust_hallucinations((50 * severity) SECONDS) - owner.blur_eyes(2 * severity) - owner.adjust_dizzy(severity SECONDS) - time_on += severity - owner.adjustFireLoss(severity) - to_chat(owner, span_warning("Your spinal implant malfunctions and you feel it scramble your brain!")) + switch(severity)//i don't want emps to just be damage again, that's boring + if(EMP_HEAVY) + owner.set_drugginess(40) + owner.adjust_hallucinations(500 SECONDS) + owner.blur_eyes(20) + owner.adjust_dizzy(10 SECONDS) + time_on += 10 + owner.adjustFireLoss(10) + to_chat(owner, span_warning("Your spinal implant malfunctions and you feel it scramble your brain!")) + if(EMP_LIGHT) + owner.set_drugginess(20) + owner.adjust_hallucinations(200 SECONDS) + owner.blur_eyes(10) + owner.adjust_dizzy(5 SECONDS) + time_on += 5 + owner.adjustFireLoss(5) + to_chat(owner, span_danger("Your spinal implant malfunctions and you suddenly feel... wrong.")) /obj/item/organ/cyberimp/chest/spinalspeed/toy name = "glowy after-image trail implant" From 8068af00c7e779ad223e8acd47acc8ac7f29db2a Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Sun, 3 Dec 2023 23:24:24 -0500 Subject: [PATCH 098/281] Revert "ok" This reverts commit 7e7a7f8372cd1ce7169736bf52cd40e568b46c10. --- code/modules/surgery/organs/augments_chest.dm | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 64f102b21f8d..0ab2df136add 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -335,23 +335,13 @@ to_chat(owner, span_warning("Your spinal implant makes you feel queasy!")) return - switch(severity)//i don't want emps to just be damage again, that's boring - if(EMP_HEAVY) - owner.set_drugginess(40) - owner.adjust_hallucinations(500 SECONDS) - owner.blur_eyes(20) - owner.adjust_dizzy(10 SECONDS) - time_on += 10 - owner.adjustFireLoss(10) - to_chat(owner, span_warning("Your spinal implant malfunctions and you feel it scramble your brain!")) - if(EMP_LIGHT) - owner.set_drugginess(20) - owner.adjust_hallucinations(200 SECONDS) - owner.blur_eyes(10) - owner.adjust_dizzy(5 SECONDS) - time_on += 5 - owner.adjustFireLoss(5) - to_chat(owner, span_danger("Your spinal implant malfunctions and you suddenly feel... wrong.")) + owner.set_drugginess(4 * severity) + owner.adjust_hallucinations((50 * severity) SECONDS) + owner.blur_eyes(2 * severity) + owner.adjust_dizzy(severity SECONDS) + time_on += severity + owner.adjustFireLoss(severity) + to_chat(owner, span_warning("Your spinal implant malfunctions and you feel it scramble your brain!")) /obj/item/organ/cyberimp/chest/spinalspeed/toy name = "glowy after-image trail implant" From b3fb3ba0db5370e7727c0f841b77569eb86ae012 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Sun, 3 Dec 2023 23:24:38 -0500 Subject: [PATCH 099/281] Revert "Merge remote-tracking branch 'upstream/master' into NahI'dPortit" This reverts commit 01094731c1a031ab50d2d6aa070c01029716f4f0, reversing changes made to c0cf69ebf10d44ab05ceedc3f5a7c51fd074ac08. --- _maps/map_files/DonutStation/DonutStation.dmm | 30 ++-- code/__DEFINES/DNA.dm | 2 + code/__DEFINES/combat.dm | 4 +- code/__DEFINES/traits.dm | 2 + code/_onclick/item_attack.dm | 20 +-- code/datums/components/nanites.dm | 14 +- code/datums/mutations/hulk.dm | 99 ++++++++++++++ code/game/machinery/_machinery.dm | 8 +- code/game/machinery/camera/camera.dm | 4 +- code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/_computer.dm | 12 +- code/game/machinery/computer/arcade.dm | 7 +- code/game/machinery/computer/dna_console.dm | 6 - code/game/machinery/computer/medical.dm | 2 +- code/game/machinery/computer/security.dm | 2 +- code/game/machinery/doors/airlock_types.dm | 2 +- code/game/machinery/doors/door.dm | 4 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/machinery/firealarm.dm | 2 +- code/game/machinery/flasher.dm | 2 +- code/game/machinery/shieldgen.dm | 9 +- code/game/machinery/shuttle/shuttle_heater.dm | 2 +- code/game/machinery/slotmachine.dm | 2 +- code/game/machinery/syndicatebomb.dm | 7 +- .../machinery/telecomms/telecomunications.dm | 4 +- code/game/mecha/mecha_defense.dm | 4 +- code/game/objects/empulse.dm | 42 +++--- code/game/objects/items.dm | 5 - code/game/objects/items/credit_holochip.dm | 2 +- code/game/objects/items/defib.dm | 2 +- code/game/objects/items/devices/PDA/PDA.dm | 2 +- .../objects/items/devices/laserpointer.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 7 +- code/game/objects/items/devices/scanners.dm | 2 +- code/game/objects/items/dna_injector.dm | 7 +- .../objects/items/granters/magic/charge.dm | 2 +- .../objects/items/grenades/chem_grenade.dm | 2 +- code/game/objects/items/grenades/emgrenade.dm | 2 +- .../objects/items/implants/implant_misc.dm | 8 +- code/game/objects/items/kitchen.dm | 1 - code/game/objects/items/storage/lockbox.dm | 25 ++-- code/game/objects/items/stunbaton.dm | 2 +- .../objects/items/supermatter_delaminator.dm | 2 +- code/game/objects/items/tools/crowbar.dm | 1 - code/game/objects/items/tools/screwdriver.dm | 1 - code/game/objects/items/tools/weldingtool.dm | 3 - code/game/objects/items/tools/wrench.dm | 1 - .../game/objects/items/two_handed/chainsaw.dm | 1 - .../objects/items/two_handed/dualsaber.dm | 4 +- code/game/objects/items/two_handed/fireaxe.dm | 19 ++- code/game/objects/obj_defense.dm | 2 +- code/game/objects/objs.dm | 2 - .../structures/crates_lockers/closets.dm | 4 +- code/modules/admin/verbs/randomverbs.dm | 19 +-- .../blob/blobstrains/electromagnetic_web.dm | 4 +- .../antagonists/blob/structures/_blob.dm | 2 +- .../antagonists/bloodsuckers/powers/feed.dm | 4 +- .../bloodsuckers/powers/gangrel.dm | 6 +- .../structures/bloodsucker_life.dm | 41 +----- .../antagonists/changeling/powers/shriek.dm | 2 +- .../clock_items/clock_weapons/longsword.dm | 5 +- code/modules/antagonists/cult/runes.dm | 2 +- .../magic/general_heretic_magic.dm | 3 +- .../atmospherics/gasmixtures/gas_mixture.dm | 5 +- .../machinery/components/fusion/hfr_procs.dm | 18 ++- .../atmospherics/machinery/portable/pump.dm | 4 +- .../machinery/portable/scrubber.dm | 2 +- code/modules/clothing/neck/_neck.dm | 8 +- code/modules/clothing/neck/bodycamera.dm | 2 +- .../modules/clothing/spacesuits/chronosuit.dm | 12 +- code/modules/clothing/spacesuits/hardsuit.dm | 2 +- .../modules/clothing/suits/reactive_armour.dm | 2 +- .../food_and_drinks/drinks/drinks/bottle.dm | 2 - code/modules/mining/abandoned_crates.dm | 4 +- code/modules/mining/equipment/mining_tools.dm | 1 - .../mining/equipment/wormhole_jaunter.dm | 9 +- code/modules/mob/living/brain/brain_item.dm | 13 +- code/modules/mob/living/carbon/carbon.dm | 4 + .../mob/living/carbon/carbon_defense.dm | 23 ++-- code/modules/mob/living/carbon/human/human.dm | 39 +++++- .../mob/living/carbon/human/human_defense.dm | 30 +++- .../mob/living/carbon/human/human_helpers.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 2 +- .../mob/living/carbon/human/physiology.dm | 1 - .../mob/living/carbon/human/species.dm | 31 ++--- .../carbon/human/species_types/ethereal.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 2 +- code/modules/mob/living/carbon/life.dm | 2 +- .../mob/living/silicon/pai/pai_defense.dm | 8 +- .../mob/living/silicon/robot/robot_defense.dm | 6 +- code/modules/mob/living/silicon/silicon.dm | 27 ++-- .../mob/living/silicon/silicon_defense.dm | 10 +- .../mob/living/simple_animal/bot/bot.dm | 2 +- .../mob/living/simple_animal/bot/ed209bot.dm | 4 +- .../simple_animal/friendly/drone/_drone.dm | 4 +- .../ninja/suit/n_suit_verbs/ninja_empulse.dm | 2 +- code/modules/photography/camera/camera.dm | 2 +- code/modules/power/apc.dm | 2 +- code/modules/power/cell.dm | 4 +- code/modules/power/singularity/singularity.dm | 2 +- code/modules/power/smes.dm | 2 +- code/modules/power/supermatter/supermatter.dm | 6 +- .../ammunition/ballistic/shotgun.dm | 8 +- .../projectiles/ammunition/energy/special.dm | 2 +- .../projectiles/ammunition/reusable/arrow.dm | 10 +- .../boxes_magazines/external/rechargable.dm | 6 +- code/modules/projectiles/guns/energy.dm | 6 +- .../projectiles/guns/misc/beam_rifle.dm | 1 - code/modules/projectiles/projectile/beams.dm | 1 - .../projectile/bullets/_incendiary.dm | 1 - .../projectiles/projectile/bullets/pistol.dm | 2 +- .../projectiles/projectile/bullets/rifle.dm | 2 - .../projectiles/projectile/bullets/shotgun.dm | 8 +- .../projectiles/projectile/bullets/sniper.dm | 9 +- .../projectiles/projectile/energy/stun.dm | 2 +- code/modules/projectiles/projectile/magic.dm | 6 +- .../projectiles/projectile/reusable/arrow.dm | 2 +- .../projectile/special/hallucination.dm | 2 +- .../projectiles/projectile/special/ion.dm | 18 ++- .../projectiles/projectile/special/plasma.dm | 1 - .../projectiles/projectile/special/rocket.dm | 36 +++-- .../chemistry/recipes/pyrotechnics.dm | 6 +- .../chemistry/recipes/slime_extracts.dm | 2 +- code/modules/research/experimentor.dm | 2 +- .../research/nanites/nanite_programs.dm | 2 +- .../nanites/nanite_programs/weapon.dm | 2 +- code/modules/research/server.dm | 4 +- .../research/xenobiology/xenobiology.dm | 2 +- .../spells/spell_types/self/disable_tech.dm | 13 +- code/modules/surgery/bodyparts/_bodyparts.dm | 29 +--- code/modules/surgery/organs/appendix.dm | 3 +- code/modules/surgery/organs/augment_legs.dm | 18 ++- code/modules/surgery/organs/augments_arms.dm | 4 +- code/modules/surgery/organs/augments_chest.dm | 42 ++++-- .../surgery/organs/augments_internal.dm | 11 +- code/modules/surgery/organs/ears.dm | 20 +-- code/modules/surgery/organs/eyes.dm | 116 +++++++++++----- code/modules/surgery/organs/heart.dm | 9 +- code/modules/surgery/organs/liver.dm | 5 +- code/modules/surgery/organs/lungs.dm | 4 +- code/modules/surgery/organs/stomach.dm | 2 +- code/modules/surgery/organs/tongue.dm | 4 +- code/modules/surgery/tools.dm | 2 - code/modules/swarmers/swarmer.dm | 7 +- html/changelog.html | 129 ++++++++++++------ html/changelogs/.all_changelog.yml | 39 ------ .../code/game/gamemodes/gangs/dominator.dm | 2 +- .../objects/items/wielded/sledgehammer.dm | 3 +- .../objects/items/wielded/vxtvulhammer.dm | 1 - .../human/species_types/preternis/organs.dm | 2 +- .../species_types/preternis/preternis.dm | 10 +- .../simple_animal/hostile/floor_cluwne.dm | 2 +- .../hostile/retaliate/king_of_goats.dm | 2 +- .../code/modules/surgery/organs/heart.dm | 6 + 154 files changed, 815 insertions(+), 611 deletions(-) diff --git a/_maps/map_files/DonutStation/DonutStation.dmm b/_maps/map_files/DonutStation/DonutStation.dmm index 2895b1bb47eb..6b77b87b374e 100644 --- a/_maps/map_files/DonutStation/DonutStation.dmm +++ b/_maps/map_files/DonutStation/DonutStation.dmm @@ -5440,6 +5440,20 @@ }, /turf/open/floor/plasteel/grimy, /area/ai_monitored/turret_protected/aisat_interior) +"ciH" = ( +/obj/machinery/door/airlock/external{ + name = "Security External Airlock"; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ + dirx = -2; + diry = 1 + }, +/turf/open/space/basic, +/area/security/main) "ciL" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 @@ -30820,20 +30834,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"nlF" = ( -/obj/machinery/door/airlock/external{ - name = "Security External Airlock"; - req_access_txt = "63" - }, -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ - dirx = -2; - diry = 1 - }, -/turf/open/floor/plating, -/area/security/main) "nlJ" = ( /obj/structure/frame/machine, /obj/effect/turf_decal/stripes/line{ @@ -105911,7 +105911,7 @@ xGT pzZ alW cJk -nlF +ciH cJk bHj bHj diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 4424f9a8ca30..b63cb9091b41 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -4,6 +4,8 @@ //Defines copying names of mutations in all cases, make sure to change this if you change mutation's type #define HULK /datum/mutation/human/hulk +#define ACTIVE_HULK /datum/mutation/human/active_hulk +#define GENETICS_HULK /datum/mutation/human/genetics_hulk #define XRAY /datum/mutation/human/thermal/x_ray #define SPACEMUT /datum/mutation/human/space_adaptation #define HEATMUT /datum/mutation/human/heat_adaptation diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 29860523630e..ebc28a4d5700 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -236,8 +236,8 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define EXPLODE_LIGHT 3 #define EXPLODE_GIB_THRESHOLD 50 //ex_act() with EXPLODE_DEVASTATE severity will gib mobs with less than this much bomb armor -#define EMP_LIGHT 5 // maximum severity level without severe effects like organ failure and paralysis -#define EMP_HEAVY 10 // max severity from most sources so you can't use a 5 billion tile EMP to instakill people +#define EMP_HEAVY 1 +#define EMP_LIGHT 2 #define GRENADE_CLUMSY_FUMBLE 1 #define GRENADE_NONCLUMSY_FUMBLE 2 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index e15c4b93df81..ba56ac55edb0 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -291,6 +291,8 @@ #define TRAIT_NOVEHICLE "no_vehicle" /// BALD!!! #define TRAIT_BALD "bald" +/// Reduces severity of EMPs by one level, heavy becomes light and light is ignored +#define TRAIT_FARADAYCAGE "faraday_cage" /// You can't see color! #define TRAIT_COLORBLIND "color_blind" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 3607a024efe7..3bbcdff95fcc 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -119,20 +119,12 @@ /atom/movable/proc/attacked_by() return -/obj/attacked_by(obj/item/attacking_item, mob/living/user) - if(!attacking_item.force) - return - - var/damage = take_damage(attacking_item.force * attacking_item.demolition_mod, attacking_item.damtype, MELEE, 1, armour_penetration = attacking_item.armour_penetration) - var/damage_verb = "hit" - if(attacking_item.demolition_mod > 1 && damage) - damage_verb = "pulverized" - if(attacking_item.demolition_mod < 1 || !damage) - damage_verb = "ineffectively pierced" - - visible_message(span_danger("[user] [damage_verb] [src] with [attacking_item][damage ? "" : ", without leaving a mark"]!"), null, null, COMBAT_MESSAGE_RANGE) - //only witnesses close by and the victim see a hit message. - log_combat(user, src, "attacked", attacking_item) +/obj/attacked_by(obj/item/I, mob/living/user) + if(I.force) + visible_message(span_danger("[user] has hit [src] with [I]!"), null, null, COMBAT_MESSAGE_RANGE) + //only witnesses close by and the victim see a hit message. + log_combat(user, src, "attacked", I) + take_damage(I.force, I.damtype, MELEE, 1) /mob/living/attacked_by(obj/item/I, mob/living/user) send_item_attack_message(I, user) diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index 816572e80888..b2b692d27ed8 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -184,14 +184,12 @@ /datum/component/nanites/proc/on_emp(datum/source, severity) if(HAS_TRAIT(host_mob, TRAIT_EMPPROOF_SELF)) return // don't do EMP effects if they're protected from EMPs - if(iscarbon(host_mob)) - var/mob/living/carbon/host_carbon = host_mob - if(host_carbon.dna?.species) - severity *= host_carbon.dna.species.emp_mod - if(severity < 1) - return // don't bother if it's less than 1 severity - nanite_volume *= 1 - (rand(0.01, 0.025) * severity) //Lose 1-2.5% of nanites for each severity level - adjust_nanites(null, -(rand(0.5, 3) * severity)) //Lose 0.5-3 flat nanite volume for each severity level + if(HAS_TRAIT(host_mob, TRAIT_FARADAYCAGE)) + severity++ + if(severity > EMP_LIGHT) + return + nanite_volume *= 1 - (rand(0.1, 0.25) / severity) //Lose 10-25% of nanites + adjust_nanites(null, -(rand(5, 30) / severity)) //Lose 5-30 flat nanite volume for(var/X in programs) var/datum/nanite_program/NP = X NP.on_emp(severity) diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index 4aaf778b6b21..1295d857b14c 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -43,3 +43,102 @@ message = "[replacetext(message, ".", "!")]!!" wrapped_message[1] = message return COMPONENT_UPPERCASE_SPEECH + +/datum/mutation/human/genetics_hulk + name = "Hulk" + desc = "A seemingly dormant genome, but reacts violently to agitation." + difficulty = 16 + instability = 50 + class = MUT_OTHER + locked = TRUE + quality = POSITIVE + get_chance = 10 + lowest_value = 256 * 14 + text_gain_indication = span_notice("You feel an anger welling inside you.") + health_req = 25 + +/datum/mutation/human/genetics_hulk/on_losing(mob/living/carbon/human/owner) + . = ..() + dna.remove_mutation(ACTIVE_HULK) + return + +/datum/mutation/human/active_hulk + name = "Hulk State" + desc = "The single most angry genome ever seen. Mutating this will incite a one-time immediate Hulkformation in the mutatee." + quality = POSITIVE + instability = 30 + class = MUT_OTHER + locked = TRUE + text_gain_indication = span_notice("Your muscles hurt!") + health_req = 1 + var/health_based = 0 + power_path = /datum/action/cooldown/spell/aoe/repulse/hulk + +/datum/mutation/human/active_hulk/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + owner.remove_CC() //RAGE RAGE RAGE, RISE RISE RISE + ADD_TRAIT(owner, TRAIT_STUNIMMUNE, TRAIT_HULK) + ADD_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK) + ADD_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_HULK) + RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + if(istype(owner.w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/U = owner.w_uniform + if(owner.canUnEquip(U)) + owner.visible_message("[U] falls apart!", span_warning("You tear your clothes up in anger!")) + qdel(U) + if(istype(owner.wear_suit, /obj/item/clothing/suit)) + var/obj/item/clothing/suit/S = owner.wear_suit + if(owner.canUnEquip(S)) + owner.dropItemToGround(S) + owner.undershirt = "Nude" + owner.dna.species.no_equip.Add(ITEM_SLOT_OCLOTHING, ITEM_SLOT_ICLOTHING) + owner.say("PUNY HUMANS!!") + owner.physiology.stamina_mod = 0.3 + owner.update_body() + +/datum/mutation/human/active_hulk/on_attack_hand(atom/target, proximity) + if(proximity) //no telekinetic hulk attack + if(prob(3)) + owner.adjust_jitter(10 SECONDS) + owner.adjustStaminaLoss(-0.5) + return target.attack_hulk(owner) + +/datum/mutation/human/active_hulk/on_life() + owner.adjustStaminaLoss(0.9) + if(owner.health < 0) + on_losing(owner) + to_chat(owner, span_danger("You suddenly feel very weak. Your rage dies out.")) + +/datum/mutation/human/active_hulk/on_losing(mob/living/carbon/human/owner) + if(..()) + return + REMOVE_TRAIT(owner, TRAIT_STUNIMMUNE, TRAIT_HULK) + REMOVE_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK) + REMOVE_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_HULK) + UnregisterSignal(owner, COMSIG_MOB_SAY) + owner.dna.species.no_equip.Remove(ITEM_SLOT_OCLOTHING, ITEM_SLOT_ICLOTHING) + owner.physiology.stamina_mod = initial(owner.physiology.stamina_mod) + owner.update_body_parts() + owner.dna.species.handle_mutant_bodyparts(owner) + +/datum/mutation/human/active_hulk/proc/handle_speech(original_message, wrapped_message) + var/message = wrapped_message[1] + if(message) + message = "[replacetext(message, ".", "!")]!!" + wrapped_message[1] = message + return COMPONENT_UPPERCASE_SPEECH + +/datum/action/cooldown/spell/aoe/repulse/hulk + name = "Ground Smash" + desc = "Smash the ground to throw your enemies back!" + invocation = "HULK SMASH!!" + button_icon = 'icons/mob/actions.dmi' + button_icon_state = "green_hand" + +/datum/action/cooldown/spell/aoe/repulse/hulk/cast_on_thing_in_aoe(atom/movable/victim, atom/caster) + var/turf/open/floor/turf = get_turf(victim) + if(istype(turf)) + turf.break_tile() + playsound(usr.loc, 'sound/effects/meteorimpact.ogg', 30, TRUE, 2) + return ..() diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 8a017d1be4f5..932d27d041a3 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -191,7 +191,7 @@ Class Procs: /obj/machinery/emp_act(severity) . = ..() if(use_power && !stat && !(. & EMP_PROTECT_SELF)) - use_power(750 * severity) + use_power(7500/severity) new /obj/effect/temp_visual/emp(loc) /obj/machinery/proc/open_machine(drop = TRUE) @@ -300,7 +300,11 @@ Class Procs: var/mob/living/carbon/H = user if(istype(H) && H.has_dna()) - if(!Adjacent(user) && !H.dna.check_mutation(TK)) + if (H.dna.check_mutation(ACTIVE_HULK)) + to_chat(H, span_warning("HULK NOT NERD. HULK SMASH!!!")) + return FALSE // hulks cant use machines + + else if(!Adjacent(user) && !H.dna.check_mutation(TK)) return FALSE // need to be close or have telekinesis return TRUE diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 9f6a93a80e28..0cd4b1aa2516 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -145,7 +145,7 @@ if(!status) return if(!(. & EMP_PROTECT_SELF)) - if(prob(15 * severity)) + if(prob(150/severity)) update_appearance(UPDATE_ICON) var/list/previous_network = network network = list() @@ -165,7 +165,7 @@ if(can_use()) GLOB.cameranet.addCamera(src) emped = 0 //Resets the consecutive EMP count - addtimer(CALLBACK(src, PROC_REF(cancelCameraAlarm)), severity SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + addtimer(CALLBACK(src, PROC_REF(cancelCameraAlarm)), 100) for(var/i in GLOB.player_list) var/mob/M = i if (M.client.eye == src) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 4d8f22c4f9ef..f009648e90b6 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -532,7 +532,7 @@ GLOBAL_VAR_INIT(clones, 0) . = ..() if (!(. & EMP_PROTECT_SELF)) var/mob/living/mob_occupant = occupant - if(mob_occupant && prob(10 * severity / efficiency)) + if(mob_occupant && prob(100/(severity*efficiency))) log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to EMP pulse.") connected_message(Gibberish("EMP-caused Accidental Ejection", 0)) SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0)) diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index 03b93209c581..bb3317a61ac4 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -137,10 +137,14 @@ /obj/machinery/computer/emp_act(severity) . = ..() - if(. & EMP_PROTECT_SELF) - return - if(prob(5 * severity)) - obj_break(ENERGY) + if (!(. & EMP_PROTECT_SELF)) + switch(severity) + if(1) + if(prob(50)) + obj_break(ENERGY) + if(2) + if(prob(10)) + obj_break(ENERGY) /obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user) on_deconstruction() diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 7c6a41699814..a124b493fa5d 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -120,7 +120,12 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( return var/empprize = null - var/num_of_prizes = rand(0, severity / 2.5) + var/num_of_prizes = 0 + switch(severity) + if(1) + num_of_prizes = rand(1,4) + if(2) + num_of_prizes = rand(0,2) for(var/i = num_of_prizes; i > 0; i--) if(override) empprize = pickweight(prize_override) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index cefddeb1eda1..8fcbfe3f7298 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -721,9 +721,6 @@ // GUARD CHECK - This should not be possible. Unexpected result if(!HM) return - if(!HM.allow_cloning) - say("ERROR: This mutation is anomalous, and cannot be saved.") - return var/datum/mutation/human/A = new HM.type() A.copy_mutation(HM) @@ -1392,9 +1389,6 @@ // GUARD CHECK - This should not be possible. Unexpected result if(!HM) return - if(!HM.allow_cloning) - say("ERROR: This mutation is anomalous, and cannot be added to an injector.") - return // We want to make sure we stick within the instability limit. // We start with the instability of the mutation we're intending to add. diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index a26d877798de..cf7ed783af0b 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -534,7 +534,7 @@ . = ..() if(!(stat & (BROKEN|NOPOWER)) && !(. & EMP_PROTECT_SELF)) for(var/datum/data/record/R in GLOB.data_core.medical) - if(prob(severity)) + if(prob(10/severity)) switch(rand(1,6)) if(1) if(prob(10)) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index bd642b99f661..4c3a77264c0d 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -875,7 +875,7 @@ return for(var/datum/data/record/R in GLOB.data_core.security) - if(prob(severity)) + if(prob(10/severity)) switch(rand(1,8)) if(1) if(prob(10)) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 4607882135b0..80f82e598534 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -586,7 +586,7 @@ . += gear_text /obj/machinery/door/airlock/clockwork/emp_act(severity) - if(prob(8 * severity)) + if(prob(80/severity)) open() /obj/machinery/door/airlock/clockwork/canAIControl(mob/user) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 4d298a074a71..ec977b8bf6f1 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -315,9 +315,9 @@ . = ..() if (. & EMP_PROTECT_SELF) return - if(prob(2 * severity) && (istype(src, /obj/machinery/door/airlock) || istype(src, /obj/machinery/door/window)) ) + if(prob(20/severity) && (istype(src, /obj/machinery/door/airlock) || istype(src, /obj/machinery/door/window)) ) INVOKE_ASYNC(src, PROC_REF(open)) - if(prob(severity*2 - 20)) + if(prob(severity*10 - 20)) if(secondsElectrified == MACHINE_NOT_ELECTRIFIED) secondsElectrified = MACHINE_ELECTRIFIED_PERMANENT LAZYADD(shockedby, "\[[time_stamp()]\]EM Pulse") diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 57f0db385dd8..5facd26aa3b7 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -423,7 +423,7 @@ return ..() /obj/machinery/door/window/clockwork/emp_act(severity) - if(prob(8 * severity)) + if(prob(80/severity)) open() /obj/machinery/door/window/clockwork/ratvar_act() diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 99b5a4987ec9..affa2aee4814 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -119,7 +119,7 @@ if (. & EMP_PROTECT_SELF) return - if(prob(5 * severity)) + if(prob(50 / severity)) alarm() /obj/machinery/firealarm/emag_act(mob/user, obj/item/card/emag/emag_card) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index fbb5417be5b5..5b86b762ba09 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -141,7 +141,7 @@ /obj/machinery/flasher/emp_act(severity) . = ..() if(!(stat & (BROKEN|NOPOWER)) && !(. & EMP_PROTECT_SELF)) - if(bulb && prob(8 * severity)) + if(bulb && prob(75/severity)) flash() bulb.burn_out() power_change() diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index f6015bb4142d..26750d15bcf2 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -25,10 +25,11 @@ . = ..() if (. & EMP_PROTECT_SELF) return - if(severity > EMP_LIGHT) - qdel(src) - return - take_damage(5 * severity, BRUTE, ENERGY, 0) + switch(severity) + if(1) + qdel(src) + if(2) + take_damage(50, BRUTE, ENERGY, 0) /obj/structure/emergency_shield/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm index be8cb0542c9d..dc83f02e6814 100644 --- a/code/game/machinery/shuttle/shuttle_heater.dm +++ b/code/game/machinery/shuttle/shuttle_heater.dm @@ -228,7 +228,7 @@ /obj/machinery/power/engine_capacitor_bank/emp_act(severity) . = ..() - stored_power = stored_power * (0.9**(severity)) // exponential decay based on EMP severity, heavy EMPs (10 severity) reduce to 35% power + stored_power = rand(0, stored_power) /obj/machinery/power/engine_capacitor_bank/escape_pod name = "emergency thruster capacitor bank" diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 96207b5acde1..4c06dfff4b67 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -182,7 +182,7 @@ return if(prob(1)) // :^) obj_flags |= EMAGGED - var/severity_ascending = 2 + (severity / 5) + var/severity_ascending = 4 - severity money = max(rand(money - (200 * severity_ascending), money + (200 * severity_ascending)), 0) balance = max(rand(balance - (50 * severity_ascending), balance + (50 * severity_ascending)), 0) money -= max(0, give_payout(min(rand(-50, 100 * severity_ascending)), money)) //This starts at -50 because it shouldn't always dispense coins yo diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 3bd5a4d73720..3799c63845e7 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -502,15 +502,16 @@ /obj/item/bombcore/emp name = "EMP payload" desc = "A set of superconducting electromagnetic coils designed to release a powerful pulse to destroy electronics and scramble circuits" - range_heavy = 25 // 25 severity, can do some serious damage + range_heavy = 15 + range_medium = 25 /obj/item/bombcore/emp/detonate() if(adminlog) message_admins(adminlog) log_game(adminlog) - empulse(src, range_heavy) - + empulse(src, range_heavy, range_medium) + qdel(src) ///Syndicate Detonator (aka the big red button)/// diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 2d536cadb7f6..39455a7972a4 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -190,9 +190,9 @@ GLOBAL_LIST_EMPTY(telecomms_list) . = ..() if(. & EMP_PROTECT_SELF) return - if(prob(10 * severity) && !(stat & EMPED)) + if(prob(100/severity) && !(stat & EMPED)) stat |= EMPED - var/duration = (30 SECONDS) * severity // 30 seconds per level of severity, 5 minutes at 10 severity (EMP_HEAVY) + var/duration = (300 * 10)/severity addtimer(CALLBACK(src, PROC_REF(de_emp)), rand(duration - 20, duration + 20)) /obj/machinery/telecomms/proc/de_emp() diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index a2e3d2f9084b..4762da6c0e5e 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -161,8 +161,8 @@ if (. & EMP_PROTECT_SELF) return if(get_charge()) - use_power((cell.charge * severity / 15)) - take_damage(4 * severity, BURN, ENERGY, 1) + use_power((cell.charge/3)/(severity*2)) + take_damage(40 / severity, BURN, ENERGY, 1) log_message("EMP detected", LOG_MECHA, color="red") if(istype(src, /obj/mecha/combat)) diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index a9c029047219..34fa0ccd6e2c 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -1,30 +1,32 @@ -/proc/empulse(turf/epicenter, severity, range=null, log=TRUE) +/proc/empulse(turf/epicenter, heavy_range, light_range, log=0) if(!epicenter) - CRASH("Warning: empulse() called without an epicenter!") - - if(severity < 1) return if(!isturf(epicenter)) epicenter = get_turf(epicenter.loc) - - if(isnull(range)) // range is equal to severity by default - range = severity if(log) - message_admins("EMP with size ([range]) and severity ([severity]) in area [epicenter.loc.name] ") - log_game("EMP with size ([range]) and severity ([severity]) in area [epicenter.loc.name] ") + message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") + log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") - if(range <= 0) - for(var/atom/A in epicenter) - A.emp_act(severity) - return + if(heavy_range > 1) + new /obj/effect/temp_visual/emp/pulse(epicenter) + + if(heavy_range > light_range) + light_range = heavy_range - var/tile_falloff = severity / range - for(var/A in spiral_range(range, epicenter)) + for(var/A in spiral_range(light_range, epicenter)) var/atom/T = A - var/decayed_severity = severity - round(get_dist(epicenter, T) * tile_falloff) - if(decayed_severity < 1) - continue - T.emp_act(decayed_severity) - return TRUE + var/distance = get_dist(epicenter, T) + if(distance < 0) + distance = 0 + if(distance < heavy_range) + T.emp_act(EMP_HEAVY) + else if(heavy_range && distance == heavy_range) //0 radius heavy EMPs will have no effect + if(prob(50)) + T.emp_act(EMP_HEAVY) + else + T.emp_act(EMP_LIGHT) + else if(distance <= light_range) + T.emp_act(EMP_LIGHT) + return 1 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 3f4a01368f62..da5e2603479b 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -296,11 +296,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(HAS_TRAIT(src, TRAIT_NO_STORAGE)) . += "[gender == PLURAL ? "They are" : "It is"] too bulky, fragile, or cumbersome to fit in a container." - if(demolition_mod > 1) - . += "[src] seems exceptionally good at breaking things!" - else if(demolition_mod < 1) - . += "[src] seems exceptionally bad at breaking things." - if(resistance_flags & INDESTRUCTIBLE) . += "[src] seems extremely robust! It'll probably withstand anything that could happen to it!" else diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm index 6683b6c5481e..5d1cc2e0deb9 100644 --- a/code/game/objects/items/credit_holochip.dm +++ b/code/game/objects/items/credit_holochip.dm @@ -105,7 +105,7 @@ . = ..() if(. & EMP_PROTECT_SELF) return - var/wipe_chance = 6 * severity + var/wipe_chance = 60 / severity if(prob(wipe_chance)) visible_message(span_warning("[src] fizzles and disappears!")) qdel(src) //rip cash diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 8c7c4fe6122d..3e2b142d372f 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -153,7 +153,7 @@ . = ..() if(cell && !(. & EMP_PROTECT_CONTENTS)) - deductcharge(500 * severity) + deductcharge(5000 / severity) if (. & EMP_PROTECT_SELF) return diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index edd624f642e3..2b184cbf362b 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1226,7 +1226,7 @@ GLOBAL_LIST_EMPTY(PDAs) A.emp_act(severity) if (!(. & EMP_PROTECT_SELF)) emped += 1 - spawn(20 * severity) + spawn(200 * severity) emped -= 1 /proc/get_viewable_pdas() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 84f32bcdabca..dc6c33d1a1b4 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -87,7 +87,7 @@ return if(ishuman(user)) var/mob/living/carbon/human/H = user - if(H.dna.check_mutation(HULK)) + if(H.dna.check_mutation(HULK) || H.dna.check_mutation(ACTIVE_HULK)) to_chat(user, span_warning("Your fingers can't press the button!")) return diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index cb5027fa300c..873b1803cf31 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -429,6 +429,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( if (. & EMP_PROTECT_SELF) return emped++ //There's been an EMP; better count it + var/curremp = emped //Remember which EMP this was if (listening && ismob(loc)) // if the radio is turned on and on someone's person they notice to_chat(loc, span_warning("\The [src] overloads.")) broadcasting = FALSE @@ -436,9 +437,11 @@ GLOBAL_LIST_INIT(channel_tokens, list( for (var/ch_name in channels) channels[ch_name] = 0 on = FALSE - addtimer(CALLBACK(src, PROC_REF(end_emp_effect)), 20 * severity, TIMER_UNIQUE | TIMER_OVERRIDE) + addtimer(CALLBACK(src, PROC_REF(end_emp_effect), curremp), 200) -/obj/item/radio/proc/end_emp_effect() +/obj/item/radio/proc/end_emp_effect(curremp) + if(emped != curremp) //Don't fix it if it's been EMP'd again + return FALSE emped = FALSE on = TRUE return TRUE diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 39633ed98f4d..7b7e66a7769a 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -362,7 +362,7 @@ GENE SCANNER var/mob/living/carbon/human/H = M var/datum/species/S = H.dna.species var/mutant = FALSE - if (H.dna.check_mutation(HULK)) + if (H.dna.check_mutation(HULK) || H.dna.check_mutation(ACTIVE_HULK)) mutant = TRUE else if (S.mutantlungs != initial(S.mutantlungs)) mutant = TRUE diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index 2ec72419d8d2..7d182fba2cbd 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -88,7 +88,12 @@ /obj/item/dnainjector/antihulk name = "\improper DNA injector (Anti-Hulk)" desc = "Cures green skin." - remove_mutations = list(HULK) + remove_mutations = list(HULK, ACTIVE_HULK, GENETICS_HULK) + +/obj/item/dnainjector/hulkmut/genetics_hulk + name = "\improper DNA injector (Genetics Hulk)" + desc = "This will make you big and strong if you get hurt, but give you a bad skin condition." + add_mutations = list(GENETICS_HULK) /obj/item/dnainjector/hulkmut name = "\improper DNA injector (Hulk)" diff --git a/code/game/objects/items/granters/magic/charge.dm b/code/game/objects/items/granters/magic/charge.dm index d0c33ed14701..72ab119aa152 100644 --- a/code/game/objects/items/granters/magic/charge.dm +++ b/code/game/objects/items/granters/magic/charge.dm @@ -17,4 +17,4 @@ /obj/item/book/granter/action/spell/charge/recoil(mob/living/user) . = ..() to_chat(user,span_warning("[src] suddenly feels very warm!")) - empulse(src, EMP_HEAVY, 0) + empulse(src, 1, 1) \ No newline at end of file diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 2423c687ef52..416ac77f0518 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -151,7 +151,7 @@ /obj/item/grenade/chem_grenade/emp_act(severity) ..() - if(prob(4 * severity)) + if(prob(40/severity)) prime() /obj/item/grenade/chem_grenade/on_found(mob/finder) diff --git a/code/game/objects/items/grenades/emgrenade.dm b/code/game/objects/items/grenades/emgrenade.dm index 082663addd44..99cf4bdf99d1 100644 --- a/code/game/objects/items/grenades/emgrenade.dm +++ b/code/game/objects/items/grenades/emgrenade.dm @@ -6,5 +6,5 @@ /obj/item/grenade/empgrenade/prime() update_mob() - empulse(src, EMP_HEAVY) + empulse(src, 4, 10) qdel(src) diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index 9bbece6a4047..837b947b3bf7 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -64,7 +64,7 @@ /obj/item/implant/emp/activate() . = ..() uses-- - empulse(imp_in, EMP_HEAVY, 5) // 10 severity, extends to 5 tiles + empulse(imp_in, 3, 5) if(!uses) qdel(src) @@ -174,13 +174,13 @@ UnregisterSignal(target, COMSIG_ATOM_EMP_ACT) return TRUE -/obj/item/implant/empshield/proc/overloaded(mob/living/target, severity) +/obj/item/implant/empshield/proc/overloaded(mob/living/target) if(world.time - lastemp > overloadtimer) numrecent = 0 - numrecent += severity + numrecent ++ lastemp = world.time - if(numrecent >= (5 * EMP_HEAVY) && ishuman(target)) + if(numrecent >= 5 && ishuman(target)) if(warning) to_chat(target, span_userdanger("You feel a twinge inside from your [src], you get the feeling it won't protect you anymore.")) warning = FALSE diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 9d6e0c8a939f..773871e48a49 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -92,7 +92,6 @@ hitsound = 'sound/weapons/bladeslice.ogg' throw_speed = 3 throw_range = 6 - demolition_mod = 0.8 materials = list(/datum/material/iron=12000) attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharpness = SHARP_EDGED diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 2fce62a8bc34..98342c6c4910 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -78,18 +78,19 @@ togglelock(user) /obj/item/storage/lockbox/emp_act(severity) - if(severity > EMP_LIGHT) - emag_act() - return - if(prob(6 * severity)) - var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) - SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, !locked) - locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) - if(locked) - icon_state = icon_locked - SEND_SIGNAL(src, COMSIG_TRY_STORAGE_HIDE_ALL) - else - icon_state = icon_closed + switch(severity) + if(EMP_HEAVY) + emag_act() + if(EMP_LIGHT) + if(prob(60)) + var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, !locked) + locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) + if(locked) + icon_state = icon_locked + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_HIDE_ALL) + else + icon_state = icon_closed /obj/item/storage/lockbox/loyalty name = "lockbox of mindshield implants" diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index d7b7421bf7b5..0736463ba346 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -257,7 +257,7 @@ /obj/item/melee/baton/emp_act(severity) . = ..() if (!(. & EMP_PROTECT_SELF)) - deductcharge(100 * severity) + deductcharge(1000 / severity) //Makeshift stun baton. Replacement for stun gloves. /obj/item/melee/baton/cattleprod diff --git a/code/game/objects/items/supermatter_delaminator.dm b/code/game/objects/items/supermatter_delaminator.dm index 2624ca7c7575..08463ca7b125 100644 --- a/code/game/objects/items/supermatter_delaminator.dm +++ b/code/game/objects/items/supermatter_delaminator.dm @@ -201,7 +201,7 @@ investigate_log("has consumed [key_name(user)].", "supermatter") user.dust() radiation_pulse(src, 500, 2) - empulse(src, EMP_HEAVY) + empulse(src, 5, 10) playsound(src, 'sound/effects/supermatter.ogg', 50, 1) QDEL_NULL(shard) update_appearance(UPDATE_ICON) diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 027d16615440..3f84093da693 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -10,7 +10,6 @@ slot_flags = ITEM_SLOT_BELT force = 5 throwforce = 7 - demolition_mod = 2 // the right tool in the wrong place can make all the difference w_class = WEIGHT_CLASS_SMALL materials = list(/datum/material/iron=50) drop_sound = 'sound/items/handling/crowbar_drop.ogg' diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 12a0bbacda73..2db3040fec34 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -9,7 +9,6 @@ flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT force = 5 - demolition_mod = 0.5 w_class = WEIGHT_CLASS_TINY throwforce = 5 throw_speed = 3 diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 5470eef922ec..f69488465225 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -23,7 +23,6 @@ light_on = FALSE throw_speed = 3 throw_range = 5 - demolition_mod = 0.5 // not very good at smashing w_class = WEIGHT_CLASS_SMALL armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30) resistance_flags = FIRE_PROOF @@ -226,7 +225,6 @@ playsound(loc, acti_sound, 50, 1) force = 12 damtype = BURN - demolition_mod = 1.5 // pretty good at cutting hitsound = 'sound/items/welder.ogg' update_appearance(UPDATE_ICON) START_PROCESSING(SSobj, src) @@ -245,7 +243,6 @@ force = 3 damtype = "brute" hitsound = "swing_hit" - demolition_mod = initial(demolition_mod) update_appearance(UPDATE_ICON) diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index fcd948da6187..2ff293b763cd 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -9,7 +9,6 @@ slot_flags = ITEM_SLOT_BELT force = 5 throwforce = 7 - demolition_mod = 1.5 w_class = WEIGHT_CLASS_SMALL usesound = 'sound/items/ratchet.ogg' materials = list(/datum/material/iron=150) diff --git a/code/game/objects/items/two_handed/chainsaw.dm b/code/game/objects/items/two_handed/chainsaw.dm index 9aa4aa9affe9..38e447b0d432 100644 --- a/code/game/objects/items/two_handed/chainsaw.dm +++ b/code/game/objects/items/two_handed/chainsaw.dm @@ -14,7 +14,6 @@ throwforce = 13 throw_speed = 2 throw_range = 4 - demolition_mod = 1.5 materials = list(/datum/material/iron=13000) attack_verb = list("sawed", "torn", "cut", "chopped", "diced") hitsound = "swing_hit" diff --git a/code/game/objects/items/two_handed/dualsaber.dm b/code/game/objects/items/two_handed/dualsaber.dm index e369a884d41c..04f60ab2e035 100644 --- a/code/game/objects/items/two_handed/dualsaber.dm +++ b/code/game/objects/items/two_handed/dualsaber.dm @@ -93,7 +93,7 @@ /obj/item/melee/dualsaber/attack(mob/target, mob/living/carbon/human/user) if(user.has_dna()) - if(user.dna.check_mutation(HULK)) + if(user.dna.check_mutation(HULK) || user.dna.check_mutation(ACTIVE_HULK)) to_chat(user, span_warning("You grip the blade too hard and accidentally close it!")) if(HAS_TRAIT(src, TRAIT_WIELDED)) user.dropItemToGround(src, force=TRUE) @@ -183,7 +183,7 @@ /obj/item/melee/dualsaber/proc/on_wield(atom/source, mob/living/carbon/M) if(!M.has_dna()) return - if(M.dna.check_mutation(HULK)) + if(M.dna.check_mutation(HULK) || M.dna.check_mutation(ACTIVE_HULK)) to_chat(M, span_warning("You lack the grace to wield this!")) return sharpness = SHARP_EDGED diff --git a/code/game/objects/items/two_handed/fireaxe.dm b/code/game/objects/items/two_handed/fireaxe.dm index 16b1bc27484d..19bfcbc3d6e7 100644 --- a/code/game/objects/items/two_handed/fireaxe.dm +++ b/code/game/objects/items/two_handed/fireaxe.dm @@ -8,7 +8,6 @@ desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?" force = 5 throwforce = 15 - demolition_mod = 3 // specifically designed for breaking things w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut", "axed") @@ -43,8 +42,6 @@ . = ..() if(!proximity) return - if(QDELETED(A)) - return if(HAS_TRAIT(src, TRAIT_WIELDED)) //destroys shit faster, generally in 1-2 hits. if(istype(A, /obj/structure/window)) var/obj/structure/window/W = A @@ -52,6 +49,12 @@ else if(istype(A, /obj/structure/grille)) var/obj/structure/grille/G = A G.take_damage(G.max_integrity*2, BRUTE, MELEE, FALSE, null, armour_penetration) + else if(istype(A, /obj/machinery/door)) //Nines hits for reinforced airlock, seven for normal + var/obj/machinery/door/D = A + D.take_damage((force+25), BRUTE, MELEE, FALSE, null, armour_penetration) + else if(istype(A, /obj/structure/door_assembly)) //Two hits for frames left behind + var/obj/machinery/door/D = A + D.take_damage((force+25), BRUTE, MELEE, FALSE, null, armour_penetration) /* * Metal Hydrogen Axe @@ -82,7 +85,6 @@ icon = 'icons/obj/weapons/energy.dmi' icon_state = "energy-fireaxe0" base_icon_state = "energy-fireaxe" - demolition_mod = 4 // DESTROY armour_penetration = 50 // Probably doesn't care much for armor given how it can destroy solid metal structures block_chance = 50 // Big handle and large flat energy blade, good for blocking things heat = 1800 // It's a FIRE axe @@ -128,6 +130,15 @@ ..() M.ignite_mob() // Ignites you if you're flammable +/obj/item/fireaxe/energy/afterattack(atom/A, mob/user, proximity) + . = ..() + if(!proximity) + return + if(HAS_TRAIT(src, TRAIT_WIELDED)) // Does x2 damage against inanimate objects like machines, structures, mechs, etc + if(isobj(A) && !isitem(A)) + var/obj/O = A + O.take_damage(force, BRUTE, MELEE, FALSE, null, armour_penetration) + /obj/item/fireaxe/energy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text, final_block_chance, damage, attack_type) if(!HAS_TRAIT(src, TRAIT_WIELDED)) return 0 // large energy blade can only block stuff if it's actually on diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 9b0f45b5b393..52e7e793e80a 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -80,7 +80,7 @@ playsound(src, P.hitsound, 50, 1) visible_message(span_danger("[src] is hit by \a [P]!"), null, null, COMBAT_MESSAGE_RANGE) if(!QDELETED(src)) //Bullet on_hit effect might have already destroyed this object - take_damage(P.damage * P.demolition_mod, P.damage_type, P.armor_flag, 0, turn(P.dir, 180), P.armour_penetration) + take_damage(P.damage, P.damage_type, P.armor_flag, 0, turn(P.dir, 180), P.armour_penetration) ///Called to get the damage that hulks will deal to the obj. /obj/proc/hulk_damage() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 686438b8b836..1da9c19201fc 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -16,8 +16,6 @@ var/wound_bonus = 0 /// If this attacks a human with no wound armor on the affected body part, add this to the wound mod. Some attacks may be significantly worse at wounding if there's even a slight layer of armor to absorb some of it vs bare flesh var/bare_wound_bonus = 0 - /// Damage multiplier against structures, machines, mechs, and to a lesser extent silicons - var/demolition_mod = 1 var/datum/armor/armor var/obj_integrity //defaults to max_integrity diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 66d75d7e3125..e0b28c32f251 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -550,10 +550,10 @@ GLOBAL_LIST_EMPTY(lockers) for(var/obj/O in src) O.emp_act(severity) if(secure && !broken && !(. & EMP_PROTECT_SELF)) - if(prob(5 * severity)) + if(prob(50 / severity)) locked = !locked update_appearance(UPDATE_ICON) - if(prob(2 * severity) && !opened) + if(prob(20 / severity) && !opened) if(!locked) open() else diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index a74290108199..495d2ba6db17 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -703,17 +703,18 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!check_rights(R_ADMIN)) return - var/severity = input("Severity of pulse.", text("Input")) as num|null - if(!isnum(severity)) + var/heavy = input("Range of heavy pulse.", text("Input")) as num|null + if(heavy == null) + return + var/light = input("Range of light pulse.", text("Input")) as num|null + if(light == null) return - var/range = input("Range of pulse.", text("Input")) as num|null - if(!isnum(range)) - range = severity - if (severity) - empulse(O, severity, range) - log_admin("[key_name(usr)] created an EM Pulse ([range] range, [severity] severity) at [AREACOORD(O)]") - message_admins("[key_name_admin(usr)] created an EM Pulse ([range] range, [severity] severity) at [AREACOORD(O)]") + if (heavy || light) + + empulse(O, heavy, light) + log_admin("[key_name(usr)] created an EM Pulse ([heavy],[light]) at [AREACOORD(O)]") + message_admins("[key_name_admin(usr)] created an EM Pulse ([heavy],[light]) at [AREACOORD(O)]") SSblackbox.record_feedback("tally", "admin_verb", 1, "EM Pulse") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return diff --git a/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm b/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm index 2ccd4b6f646e..8c98537297d1 100644 --- a/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm +++ b/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm @@ -22,7 +22,7 @@ /datum/blobstrain/reagent/electromagnetic_web/death_reaction(obj/structure/blob/B, damage_flag) if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) - empulse(B.loc, EMP_HEAVY, 3) //less than screen range, so you can stand out of range to avoid it + empulse(B.loc, 1, 3) //less than screen range, so you can stand out of range to avoid it /datum/reagent/blob/electromagnetic_web name = "Electromagnetic Web" @@ -32,6 +32,6 @@ /datum/reagent/blob/electromagnetic_web/reaction_mob(mob/living/M, methods = TOUCH, reac_volume, show_message, permeability, mob/camera/blob/O) reac_volume = ..() if(prob(reac_volume*2)) - M.emp_act(min(reac_volume / 10, EMP_HEAVY)) + M.emp_act(EMP_LIGHT) if(M) M.apply_damage(reac_volume, BURN, wound_bonus=CANT_WOUND) diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index e7054ad62198..97d62b945c89 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -206,7 +206,7 @@ if(severity > 0) if(overmind) overmind.blobstrain.emp_reaction(src, severity) - if(prob(40 + (severity * 6))) + if(prob(100 - severity * 30)) new /obj/effect/temp_visual/emp(get_turf(src)) /obj/structure/blob/tesla_act(power, tesla_flags, shocked_targets, zap_gib = FALSE) diff --git a/code/modules/antagonists/bloodsuckers/powers/feed.dm b/code/modules/antagonists/bloodsuckers/powers/feed.dm index 4b62c8dbc97d..d0e5a60401aa 100644 --- a/code/modules/antagonists/bloodsuckers/powers/feed.dm +++ b/code/modules/antagonists/bloodsuckers/powers/feed.dm @@ -58,7 +58,7 @@ /datum/action/cooldown/bloodsucker/feed/DeactivatePower() var/mob/living/user = owner - var/mob/living/feed_target = target_ref?.resolve() + var/mob/living/feed_target = target_ref.resolve() if(isnull(feed_target)) log_combat(user, user, "fed on blood (target not found)", addition="(and took [blood_taken] blood)") else @@ -136,7 +136,7 @@ if(!active) //If we aren't active (running on SSfastprocess) return ..() //Manage our cooldown timers var/mob/living/user = owner - var/mob/living/feed_target = target_ref?.resolve() + var/mob/living/feed_target = target_ref.resolve() if(!ContinueActive(user, feed_target)) if(!silent_feed) user.visible_message( diff --git a/code/modules/antagonists/bloodsuckers/powers/gangrel.dm b/code/modules/antagonists/bloodsuckers/powers/gangrel.dm index 91ab766577bd..1b3962b568db 100644 --- a/code/modules/antagonists/bloodsuckers/powers/gangrel.dm +++ b/code/modules/antagonists/bloodsuckers/powers/gangrel.dm @@ -24,9 +24,11 @@ /datum/action/cooldown/bloodsucker/gangrel/transform/ActivatePower() var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(/datum/antagonist/bloodsucker) var/mob/living/carbon/human/user = owner + if(!do_after(user, 10 SECONDS)) + return var/list/radial_display = list() //get our options, switches are kinda weird here cause wwe ant to stack them - if(bloodsuckerdatum) //makes the icons for the options + if(bloodsuckerdatum.total_blood_drank) //makes the icons for the options var/datum/radial_menu_choice/option = new user.setDir(SOUTH) var/icon/icon_to_mix = getFlatIcon(user) @@ -53,8 +55,6 @@ option.info = "Turn into a giant bat simple mob with unique abilities." radial_display["Bat"] = option var/chosen_transform = show_radial_menu(user, user, radial_display) - if(!chosen_transform || !do_after(user, 10 SECONDS)) - return transform(chosen_transform) //actually transform return ..() diff --git a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm index d019b1f00538..ed424caf0cbd 100644 --- a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm @@ -291,46 +291,7 @@ if(bloodsucker_blood_volume < (FRENZY_THRESHOLD_ENTER + humanity_lost * 10) && !frenzied) if(!iscarbon(owner.current)) return - if(my_clan?.get_clan() == CLAN_GANGREL) - var/mob/living/carbon/user = owner.current - switch(frenzies) - if(0) - owner.current.apply_status_effect(STATUS_EFFECT_FRENZY) - if(1) - to_chat(owner, span_warning("You start feeling hungrier, you feel like a normal frenzy won't satiate it enough anymore.")) - owner.current.apply_status_effect(STATUS_EFFECT_FRENZY) - if(2 to INFINITY) - if(do_after(user, 2 SECONDS, user, IGNORE_ALL)) - playsound(user.loc, 'sound/weapons/slash.ogg', 25, 1) - to_chat(user, span_warning("You skin rips and tears.")) - if(do_after(user, 1 SECONDS, user, IGNORE_ALL)) - playsound(user.loc, 'sound/weapons/slashmiss.ogg', 25, 1) - to_chat(user, span_warning("You heart pumps blackened blood into your veins as your skin turns into fur.")) - if(do_after(user, 1 SECONDS, user, IGNORE_ALL)) - playsound(user.loc, 'sound/weapons/slice.ogg', 25, 1) - to_chat(user, span_boldnotice("YOU HAVE AWOKEN.")) - var/mob/living/simple_animal/hostile/bloodsucker/werewolf/ww - if(!ww || ww.stat == DEAD) - AddBloodVolume(560 - user.blood_volume) //so it doesn't happen multiple times and refills your blood when you get out again - ww = new /mob/living/simple_animal/hostile/bloodsucker/werewolf(user.loc) - user.forceMove(ww) - ww.bloodsucker = user - user.mind.transfer_to(ww) - var/list/wolf_powers = list(new /datum/action/cooldown/bloodsucker/targeted/feast,) - for(var/datum/action/cooldown/bloodsucker/power in powers) - if(istype(power, /datum/action/cooldown/bloodsucker/fortitude)) - wolf_powers += new /datum/action/cooldown/bloodsucker/gangrel/wolfortitude - if(istype(power, /datum/action/cooldown/bloodsucker/targeted/lunge)) - wolf_powers += new /datum/action/cooldown/bloodsucker/targeted/pounce - if(istype(power, /datum/action/cooldown/bloodsucker/cloak)) - wolf_powers += new /datum/action/cooldown/bloodsucker/gangrel/howl - if(istype(power, /datum/action/cooldown/bloodsucker/targeted/trespass)) - wolf_powers += new /datum/action/cooldown/bloodsucker/gangrel/rabidism - for(var/datum/action/cooldown/bloodsucker/power in wolf_powers) - power.Grant(ww) - frenzies ++ - else - owner.current.apply_status_effect(STATUS_EFFECT_FRENZY) + owner.current.apply_status_effect(/datum/status_effect/frenzy) else if(bloodsucker_blood_volume < BLOOD_VOLUME_BAD(owner.current)) additional_regen = 0.1 else if(bloodsucker_blood_volume < BLOOD_VOLUME_OKAY(owner.current)) diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index 9c3cf68e97b7..6a56642dce33 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -53,5 +53,5 @@ for(var/obj/machinery/light/L in range(5, usr)) L.on = 1 L.break_light_tube() - empulse(get_turf(user), EMP_HEAVY, 5, 1) + empulse(get_turf(user), 2, 5, 1) return TRUE diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/longsword.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/longsword.dm index 1d71903ac051..d931924b3b5d 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/longsword.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/longsword.dm @@ -8,14 +8,13 @@ block_chance = 35 attack_verb = list("attacked", "slashed", "cut", "torn", "gored") clockwork_desc = "A powerful sword of Ratvarian making. Enemies hit with it will be struck with a powerful electromagnetic pulse." - var/emp_severity = EMP_LIGHT var/emp_cooldown = 0 var/cooldown_duration = 10 SECONDS /obj/item/clockwork/weapon/brass_sword/attack(mob/living/target, mob/living/carbon/human/user) . = ..() if(world.time > emp_cooldown && !is_servant_of_ratvar(target)) - target.emp_act(emp_severity) + target.emp_act(EMP_LIGHT) emp_cooldown = world.time + cooldown_duration addtimer(CALLBACK(src, PROC_REF(send_message)), cooldown_duration) to_chat(user, "You strike [target] with an electromagnetic pulse!") @@ -25,7 +24,7 @@ /obj/item/clockwork/weapon/brass_sword/attack_obj(obj/O, mob/living/user) . = ..() if(world.time > emp_cooldown && ismecha(O)) - O.emp_act(emp_severity * 2) + O.emp_act(EMP_HEAVY) emp_cooldown = world.time + cooldown_duration addtimer(CALLBACK(src, PROC_REF(send_message)), cooldown_duration) to_chat(user, "You strike [O] with an electromagnetic pulse!") diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 2178b39cbb87..f7205a0f919a 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -1052,7 +1052,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) visible_message(span_warning("A colossal shockwave of energy bursts from the rune, disintegrating it in the process!")) for(var/mob/living/L in range(src, 3)) L.Paralyze(30) - empulse(T, 0.42*(intensity)) + empulse(T, 0.42*(intensity), 1) var/list/images = list() var/zmatch = T.z var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_SECURITY_ADVANCED] diff --git a/code/modules/antagonists/eldritch_cult/magic/general_heretic_magic.dm b/code/modules/antagonists/eldritch_cult/magic/general_heretic_magic.dm index ab839dd64ed3..7af0106e0ac7 100644 --- a/code/modules/antagonists/eldritch_cult/magic/general_heretic_magic.dm +++ b/code/modules/antagonists/eldritch_cult/magic/general_heretic_magic.dm @@ -156,7 +156,8 @@ THIS FILE IS FOR ALL HERETIC SPELLS THAT DO NOT CONFER TO A PATH'S THEME OR YOU invocation_type = INVOCATION_WHISPER spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC - radius = 10 + emp_heavy = 6 + emp_light = 10 /datum/action/cooldown/spell/list_target/telepathy/eldritch name = "Eldritch Telepathy" diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index af260e5397f7..b7855c3f54f2 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -279,16 +279,13 @@ get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() /datum/gas_mixture/proc/equalize(datum/gas_mixture/other) . = FALSE - if(!return_volume() || !other.return_volume()) - return - var/self_temp = return_temperature() var/other_temp = other.return_temperature() if(abs(self_temp - other_temp) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) . = TRUE var/self_heat_cap = heat_capacity() var/other_heat_cap = other.heat_capacity() - var/new_temp = max((self_temp * self_heat_cap + other_temp * other_heat_cap) / (self_heat_cap + other_heat_cap), TCMB) + var/new_temp = (self_temp * self_heat_cap + other_temp * other_heat_cap) / (self_heat_cap + other_heat_cap) set_temperature(new_temp) other.set_temperature(new_temp) diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm index e6e67f3c501f..e1603bc97663 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_procs.dm @@ -439,7 +439,8 @@ var/devastating_explosion = 0 var/em_pulse = selected_fuel.meltdown_flags & HYPERTORUS_FLAG_EMP var/rad_pulse = selected_fuel.meltdown_flags & HYPERTORUS_FLAG_RADIATION_PULSE - var/emp_severity = 0 + var/emp_light_size = 0 + var/emp_heavy_size = 0 var/rad_pulse_size = 0 var/rad_pulse_strength = 0 var/gas_spread = 0 @@ -463,7 +464,8 @@ if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_MINIMUM_SPREAD) if(em_pulse) - emp_severity = power_level * 3 + emp_light_size = power_level * 3 + emp_heavy_size = power_level * 1 if(rad_pulse) rad_pulse_size = (1 / (power_level + 1)) rad_pulse_strength = power_level * 3000 @@ -472,7 +474,8 @@ if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_MEDIUM_SPREAD) if(em_pulse) - emp_severity = power_level * 5 + emp_light_size = power_level * 5 + emp_heavy_size = power_level * 3 if(rad_pulse) rad_pulse_size = (1 / (power_level + 3)) rad_pulse_strength = power_level * 5000 @@ -481,7 +484,8 @@ if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_BIG_SPREAD) if(em_pulse) - emp_severity = power_level * 7 + emp_light_size = power_level * 7 + emp_heavy_size = power_level * 5 if(rad_pulse) rad_pulse_size = (1 / (power_level + 5)) rad_pulse_strength = power_level * 7000 @@ -490,7 +494,8 @@ if(selected_fuel.meltdown_flags & HYPERTORUS_FLAG_MASSIVE_SPREAD) if(em_pulse) - emp_severity = power_level * 9 + emp_light_size = power_level * 9 + emp_heavy_size = power_level * 7 if(rad_pulse) rad_pulse_size = (1 / (power_level + 7)) rad_pulse_strength = power_level * 9000 @@ -545,7 +550,8 @@ if(em_pulse) empulse( epicenter = loc, - severity = critical ? emp_severity * 2 : emp_severity, + heavy_range = critical ? emp_heavy_size * 2 : emp_heavy_size, + light_range = critical ? emp_light_size * 2 : emp_heavy_size, log = TRUE ) diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index e3a22c002df9..b2950139282a 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -62,9 +62,9 @@ if(. & EMP_PROTECT_SELF) return if(is_operational()) - if(prob(5 * severity)) + if(prob(50 / severity)) on = !on - if(prob(10 * severity)) + if(prob(100 / severity)) direction = PUMP_OUT pump.target_pressure = rand(0, 100 * ONE_ATMOSPHERE) update_appearance(UPDATE_ICON) diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 9cb7373b07be..168942ac0483 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -64,7 +64,7 @@ if(. & EMP_PROTECT_SELF) return if(is_operational()) - if(prob(5 * severity)) + if(prob(50 / severity)) on = !on update_appearance(UPDATE_ICON) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 67b320c3b228..c26244226577 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -515,15 +515,17 @@ cloak_charge_rate = 20 cloak_dodge_loss = 40 var/cloak_emp_disable_duration = 10 SECONDS - var/cloak_emp_loss = 5 + var/cloak_emp_loss = 25 /obj/item/clothing/neck/cloak/ranger/syndie/emp_act(severity) . = ..() if(CHECK_BITFIELD(., EMP_PROTECT_SELF)) return - if(severity > EMP_LIGHT) + if(severity == EMP_HEAVY) + set_cloak(0) TIMER_COOLDOWN_START(src, "cloak_emp_disable", cloak_emp_disable_duration) - set_cloak(max(cloak - (cloak_emp_loss * severity), 0)) + else + set_cloak(cloak - cloak_emp_loss) /obj/item/clothing/neck/cloak/ranger/syndie/process(delta_time) if(TIMER_COOLDOWN_CHECK(src, "cloak_emp_disable")) diff --git a/code/modules/clothing/neck/bodycamera.dm b/code/modules/clothing/neck/bodycamera.dm index 21207b75cfd3..3cd85f30beb1 100644 --- a/code/modules/clothing/neck/bodycamera.dm +++ b/code/modules/clothing/neck/bodycamera.dm @@ -88,7 +88,7 @@ /obj/item/clothing/neck/bodycam/emp_act(severity) . = ..() - if(prob(15 * severity)) + if(prob(150/severity)) Disconnect() bodcam.c_tag = null bodcam.network[1] = null //requires a reset diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 5477a25710cf..f6361de4d6b3 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -73,11 +73,13 @@ if(. & EMP_PROTECT_SELF) return var/mob/living/carbon/human/user = src.loc - if(severity > EMP_LIGHT && activated && user && ishuman(user) && (user.wear_suit == src)) - to_chat(user, span_danger("E:FATAL:RAM_READ_FAIL\nE:FATAL:STACK_EMPTY\nE:FATAL:READ_NULL_POINT\nE:FATAL:PWR_BUS_OVERLOAD")) - to_chat(user, span_userdanger("An electromagnetic pulse disrupts your [name] and violently tears you out of time-bluespace!")) - user.emote("scream") - deactivate(1, 1) + switch(severity) + if(1) + if(activated && user && ishuman(user) && (user.wear_suit == src)) + to_chat(user, span_danger("E:FATAL:RAM_READ_FAIL\nE:FATAL:STACK_EMPTY\nE:FATAL:READ_NULL_POINT\nE:FATAL:PWR_BUS_OVERLOAD")) + to_chat(user, span_userdanger("An electromagnetic pulse disrupts your [name] and violently tears you out of time-bluespace!")) + user.emote("scream") + deactivate(1, 1) /obj/item/clothing/suit/space/chronos/proc/finish_chronowalk(mob/living/carbon/human/user, turf/to_turf) if(!user) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index f0afd9d5e9f2..2975673406ea 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -144,7 +144,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/emp_act(severity) . = ..() - display_visor_message("Electromagnetic pulse detected! Severity: [severity]") + display_visor_message("[severity > 1 ? "Light" : "Strong"] electromagnetic pulse detected!") /obj/item/clothing/suit/space/hardsuit diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index ededdcda111b..71dd701e00af 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -117,7 +117,7 @@ if(ismob(loc)) to_chat(loc, emp_message) bad_effect = TRUE - addtimer(VARSET_CALLBACK(src, bad_effect, FALSE), (3 SECONDS) * severity) + addtimer(VARSET_CALLBACK(src, bad_effect, FALSE), 30 SECONDS) //When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!) /obj/item/clothing/suit/armor/reactive/teleport diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index ad98033033bd..bbc06023fda4 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -13,7 +13,6 @@ volume = 100 force = 15 //Smashing bottles over someone's head hurts. throwforce = 15 - demolition_mod = 0.25 item_state = "broken_beer" //Generic held-item sprite until unique ones are made. lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' @@ -167,7 +166,6 @@ throwforce = 5 throw_speed = 3 throw_range = 5 - demolition_mod = 0.25 w_class = WEIGHT_CLASS_TINY item_state = "beer" hitsound = 'sound/weapons/bladeslice.ogg' diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 19c4ab3b310d..3239ce7904d4 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -84,14 +84,14 @@ new /obj/item/clothing/neck/petcollar(src) if(63 to 64) for(var/i in 1 to rand(4, 7)) - var/newcoin = pickweight(list( + var/newcoin = pickweight( /obj/item/coin/silver = 3, /obj/item/coin/iron = 3, /obj/item/coin/gold = 1, /obj/item/coin/diamond = 1, /obj/item/coin/plasma = 1, /obj/item/coin/uranium = 1, - )) + ) new newcoin(src) if(65 to 66) new /obj/item/clothing/suit/ianshirt(src) diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index d85dbb56f8e6..ca31e16e0e6d 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -7,7 +7,6 @@ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK force = 15 throwforce = 10 - demolition_mod = 1.2 item_state = "pickaxe" lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 27fd03403b30..b263c1696d50 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -52,7 +52,7 @@ playsound(src,'sound/effects/sparks4.ogg',50,1) qdel(src) -/obj/item/wormhole_jaunter/emp_act(severity) +/obj/item/wormhole_jaunter/emp_act(power) . = ..() if(. & EMP_PROTECT_SELF) return @@ -60,8 +60,11 @@ var/mob/M = loc if(istype(M)) var/triggered = FALSE - if(M.get_item_by_slot(ITEM_SLOT_BELT) == src && prob(10 * severity)) - triggered = TRUE + if(M.get_item_by_slot(ITEM_SLOT_BELT) == src) + if(power == 1) + triggered = TRUE + else if(power == 2 && prob(50)) + triggered = TRUE if(triggered) M.visible_message(span_warning("[src] overloads and activates!")) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 7ceb3f3f93b4..1d0658084614 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -287,10 +287,15 @@ var/obj/item/clothing/head/hat = owner.get_item_by_slot(ITEM_SLOT_HEAD) if(hat && istype(hat, /obj/item/clothing/head/foilhat)) return - to_chat(owner, span_warning("Alert: Posibrain [severity > EMP_LIGHT ? "severely " : ""]damaged.")) - owner.adjust_drugginess(5 * severity) - if(severity > EMP_LIGHT) - owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, (2 * (severity - EMP_LIGHT)) * (maxHealth - damage) / maxHealth) // don't give traumas from weak EMPs + + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, (50/severity) * (maxHealth - damage) / maxHealth) + owner.adjust_drugginess(40/severity) + switch(severity) + if(1) + to_chat(owner, span_warning("Alert: Posibrain heavily damaged.")) + if(2) + to_chat(owner, span_warning("Alert: Posibrain damaged.")) + ////////////////////////////////////TRAUMAS//////////////////////////////////////// diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 81b3d0586b70..c21bcf7e6969 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -541,6 +541,10 @@ /mob/living/carbon/update_stamina() var/stam = getStaminaLoss() + if(ishuman(src)) + var/mob/living/carbon/human/H = src //leaving this here but sus + if(stam && H.hulk_stamina_check()) + return if(stam > DAMAGE_PRECISION && (maxHealth - stam) <= crit_threshold) if(!stat) enter_stamcrit() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 638b7a82ba22..861582d06371 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -372,16 +372,13 @@ . = ..() if(. & EMP_PROTECT_SELF) return - - if(dna?.species) - severity *= dna.species.emp_mod - if(severity < 1) - return - - var/emp_message = TRUE - for(var/obj/item/bodypart/BP as anything in get_damageable_bodyparts(BODYPART_ROBOTIC)) - if(!(BP.emp_act(severity, emp_message) & EMP_PROTECT_SELF)) - emp_message = FALSE // if the EMP was successful, don't spam the chat with more messages + if(HAS_TRAIT(src, TRAIT_FARADAYCAGE)) + severity++ + if(severity > EMP_LIGHT) + return + for(var/X in internal_organs) + var/obj/item/organ/O = X + O.emp_act(severity) /mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, override = 0, tesla_shock = 0, illusion = 0, stun = TRUE, gib = FALSE) if(tesla_shock && (flags_1 & TESLA_IGNORE_1)) @@ -486,6 +483,12 @@ adjust_status_effects_on_shake_up() // adjustStaminaLoss(-10) if you want hugs to recover stamina damage, uncomment this + if(dna && dna.check_mutation(ACTIVE_HULK)) + if(prob(30)) + adjustStaminaLoss(10) + to_chat(src, span_notice("[M] calms you down a little.")) + else + to_chat(src, span_warning("[M] tries to calm you!")) set_resting(FALSE) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c5508355451b..7f1dcd051b36 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -709,7 +709,7 @@ #undef CPR_PANIC_SPEED /mob/living/carbon/human/cuff_resist(obj/item/I) - if(dna && (dna.check_mutation(HULK))) + if(dna && (dna.check_mutation(HULK) || dna.check_mutation(ACTIVE_HULK))) say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") if(..(I, cuff_break = FAST_CUFFBREAK)) dropItemToGround(I) @@ -1129,8 +1129,12 @@ remove_movespeed_modifier(MOVESPEED_ID_CRAWL_MODIFIER, TRUE) /mob/living/carbon/human/updatehealth() + var/oldhealth = health . = ..() dna?.species.spec_updatehealth(src) + if(!dna) + return + hulk_health_check(oldhealth) /mob/living/carbon/human/adjust_nutrition(change) //Honestly FUCK the oldcoders for putting nutrition on /mob someone else can move it up because holy hell I'd have to fix SO many typechecks if(HAS_TRAIT(src, TRAIT_NOHUNGER)) @@ -1391,3 +1395,36 @@ /mob/living/carbon/human/species/zombie/krokodil_addict race = /datum/species/krokodil_addict + +/mob/living/carbon/human/proc/hulk_health_check(oldhealth) + if(!dna) + return + + if(dna.check_mutation(ACTIVE_HULK)) + if(health < HEALTH_THRESHOLD_CRIT) + dna.remove_mutation(ACTIVE_HULK) + return + if(health < oldhealth) + adjustStaminaLoss(-1.5 * (oldhealth - health)) + else + if(!dna.check_mutation(HULK) && dna.check_mutation(GENETICS_HULK) && stat == CONSCIOUS && (oldhealth >= health + 10 || health < (0.5 * maxHealth))) + dna.add_mutation(ACTIVE_HULK) + +/mob/living/carbon/human/proc/hulk_stamina_check() + if(dna.check_mutation(ACTIVE_HULK)) + if(staminaloss < 60 && prob(1)) + adjust_confusion(7 SECONDS) + say("HULK SMASH!!") + if(staminaloss >= 90) + dna.remove_mutation(ACTIVE_HULK) + to_chat(src, span_notice("You have calm down enough to become human again.")) + Knockdown(6) + return TRUE + else + return FALSE + +/mob/living/carbon/human/Bump(atom/movable/AM) + ..() + if(dna.check_mutation(ACTIVE_HULK) && has_status_effect(/datum/status_effect/confusion) && (world.time - last_bumped) > 15) + Bumped(AM) + return AM.attack_hulk(src) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 109d8c965641..d3259e769e01 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -64,7 +64,7 @@ if(mind) if(mind.martial_art && !incapacitated(FALSE, TRUE) && mind.martial_art.can_use(src) && (mind.martial_art.deflection_chance || ((mind.martial_art.id == "sleeping carp") && in_throw_mode))) //Some martial arts users can deflect projectiles! if(prob(mind.martial_art.deflection_chance) || ((mind.martial_art.id == "sleeping carp") && in_throw_mode)) // special check if sleeping carp is our martial art and throwmode is on, deflect - if((mobility_flags & MOBILITY_USE) && dna && !dna.check_mutation(HULK)) //But only if they're otherwise able to use items, and hulks can't do it + if((mobility_flags & MOBILITY_USE) && dna && !(dna.check_mutation(HULK)|| dna.check_mutation(ACTIVE_HULK))) //But only if they're otherwise able to use items, and hulks can't do it if(!isturf(loc)) //if we're inside something and still got hit P.force_hit = TRUE //The thing we're in passed the bullet to us. Pass it back, and tell it to take the damage. loc.bullet_act(P) @@ -547,8 +547,32 @@ return dna.species.spec_emag_act(src, user, emag_card) /mob/living/carbon/human/emp_act(severity) - severity *= physiology.emp_mod - return ..(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(HAS_TRAIT(src, TRAIT_FARADAYCAGE)) + severity++ + if(severity > EMP_LIGHT) + return + dna?.species.spec_emp_act(src, severity) + var/list/affected_parts = list() + for(var/obj/item/bodypart/BP in bodyparts) + if(istype(BP) && BP.status == BODYPART_ROBOTIC) + if(prob(5) && severity == EMP_HEAVY && (TRAIT_EASYDISMEMBER in dna?.species.inherent_traits) && BP.body_zone != BODY_ZONE_CHEST) + BP.dismember() + else + affected_parts += BP + if(affected_parts.len) + emote("scream") + adjustFireLoss(min(5 * affected_parts.len / severity, 20 / severity), FALSE, FALSE, BODYPART_ROBOTIC) + var/obj/item/bodypart/chest/C = get_bodypart(BODY_ZONE_CHEST) + var/obj/item/bodypart/head/H = get_bodypart(BODY_ZONE_HEAD) + if(((C && C.status == BODYPART_ROBOTIC) || (H && H.status == BODYPART_ROBOTIC)) && severity == EMP_HEAVY) // if your head and/or chest are robotic (aka you're a robotic race or augmented) you get cooler flavor text and rapid-onset paralysis + to_chat(src, span_userdanger("A surge of searing pain erupts throughout your very being! As the pain subsides, a terrible sensation of emptiness is left in its wake.")) + Paralyze(5 SECONDS) //heavy EMPs will fully stun you + else + adjustStaminaLoss(min(15 * affected_parts.len / severity, 60 / severity), FALSE, FALSE, BODYPART_ROBOTIC) + to_chat(src, span_userdanger("You feel a sharp pain as your robotic limbs overload.")) /mob/living/carbon/human/rad_act(amount, collectable_radiation) . = ..() diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 8d81a51a33d3..196d5c953109 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -142,7 +142,7 @@ . = ..() if(G.trigger_guard == TRIGGER_GUARD_NORMAL) - if(src.dna.check_mutation(HULK)) + if(src.dna.check_mutation(HULK) || src.dna.check_mutation(ACTIVE_HULK)) to_chat(src, span_warning("Your meaty finger is much too large for the trigger guard!")) return FALSE if(HAS_TRAIT(src, TRAIT_NOGUNS)) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d22f8a1f36d9..4ef4c703a43e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -107,7 +107,7 @@ if(!dna) return - if(prob(3) && dna.check_mutation(HULK)) + if(prob(3) && dna.check_mutation(ACTIVE_HULK)) say(pick_list_replacements(BRAIN_DAMAGE_FILE, "hulk")) /mob/living/carbon/human/handle_mutations_and_radiation() diff --git a/code/modules/mob/living/carbon/human/physiology.dm b/code/modules/mob/living/carbon/human/physiology.dm index 36982d89d352..50f31d0fcd3a 100644 --- a/code/modules/mob/living/carbon/human/physiology.dm +++ b/code/modules/mob/living/carbon/human/physiology.dm @@ -17,7 +17,6 @@ var/damage_resistance = 0 // %damage reduction from all sources var/siemens_coeff = 1 // resistance to shocks - var/emp_mod = 1 // resistance to EMPs var/stun_mod = 1 // % stun modifier var/bleed_mod = 1 // % bleeding modifier diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 813a5a2ce20b..cfcac78caceb 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -97,8 +97,6 @@ GLOBAL_LIST_EMPTY(features_by_species) var/staminamod = 1 /// multiplier for pressure damage var/pressuremod = 1 - /// multiplier for EMP severity - var/emp_mod = 1 /// multiplier for money paid at payday, species dependent var/payday_modifier = 1 ///Type of damage attack does @@ -1037,7 +1035,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(!forced_colour) switch(S.color_src) if(MUTCOLORS) - if(H.dna.check_mutation(HULK)) //HULK GO FIRST + if(H.dna.check_mutation(HULK) || H.dna.check_mutation(ACTIVE_HULK)) //HULK GO FIRST accessory_overlay.color = "#00aa00" else if(fixed_mut_color) //Then fixed color if applicable accessory_overlay.color = fixed_mut_color @@ -1765,7 +1763,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(M.mind) attacker_style = M.mind.martial_art if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK)) - if(M.dna.check_mutation(HULK) && M.a_intent == "disarm") + if((M.dna.check_mutation(ACTIVE_HULK) || M.dna.check_mutation(HULK)) && M.a_intent == "disarm") H.check_shields(0, M.name) // We check their shields twice since we are a hulk. Also triggers hitreactions for HULK_ATTACK M.visible_message(span_danger("[M]'s punch knocks the shield out of [H]'s hand."), \ span_userdanger("[M]'s punch knocks the shield out of [H]'s hand.")) @@ -2579,22 +2577,6 @@ GLOBAL_LIST_EMPTY(features_by_species) SPECIES_PERK_DESC = "[plural_form] are resilient to being shocked.", )) - if(emp_mod > 1) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "thunderstorm", - SPECIES_PERK_NAME = "EM Weakness", - SPECIES_PERK_DESC = "[plural_form] are weak to electromagnetic interference.", - )) - - if(emp_mod < 1) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "thunderstorm", //if we update font awesome, please swap to bolt-slash - SPECIES_PERK_NAME = "EM Resistance", - SPECIES_PERK_DESC = "[plural_form] are resistant to electromagnetic interference.", - )) - return to_add /** @@ -2693,6 +2675,15 @@ GLOBAL_LIST_EMPTY(features_by_species) SPECIES_PERK_NAME = "Radiation Immunity", SPECIES_PERK_DESC = "[plural_form] are completely unaffected by radiation. However, this doesn't mean they can't be irradiated.", )) + + if(TRAIT_FARADAYCAGE in inherent_traits) + to_add += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "thunderstorm", //if we update font awesome, please swap to bolt-slash + SPECIES_PERK_NAME = "Faraday \"Skin\"", + SPECIES_PERK_DESC = "[plural_form] have a unique physiology that shields them from weak EMPs.", + )) + if(TRAIT_LIMBATTACHMENT in inherent_traits) to_add += list(list( SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 890dac7e8108..341a4ca9ab97 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -133,7 +133,7 @@ to_chat(H, span_notice("You feel the light of your body leave you.")) EMPeffect = TRUE spec_updatehealth(H) - addtimer(CALLBACK(src, PROC_REF(stop_emp), H), 20 * severity, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 2 to 20 seconds depending on severity + addtimer(CALLBACK(src, PROC_REF(stop_emp), H), 200 / severity, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 10 to 20 seconds depending on severity /datum/species/ethereal/proc/stop_emp(mob/living/carbon/human/H) EMPeffect = FALSE diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 15c1da734fbe..64a179f88e09 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -631,7 +631,7 @@ generate/load female uniform sprites matching all previously decided variables /mob/living/carbon/human/generate_icon_render_key() . = "[dna.species.limbs_id]" - if(dna.check_mutation(HULK)) + if(dna.check_mutation(HULK) || dna.check_mutation(ACTIVE_HULK)) . += "-coloured-hulk" else if(dna.species.use_skintones) . += "-coloured-[skin_tone]" diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 7e860d1e31af..0d36713e6a8b 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -338,7 +338,7 @@ /mob/living/carbon/proc/handle_bodyparts() var/stam_regen = FALSE - if(stam_regen_start_time <= world.time) + if(stam_regen_start_time <= world.time && (has_dna() && !dna.check_mutation(ACTIVE_HULK))) stam_regen = TRUE if(HAS_TRAIT_FROM(src, TRAIT_INCAPACITATED, STAMINA)) . |= BODYPART_LIFE_UPDATE_HEALTH //make sure we remove the stamcrit diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm index 09bb968cd43c..b8be2fda95af 100644 --- a/code/modules/mob/living/silicon/pai/pai_defense.dm +++ b/code/modules/mob/living/silicon/pai/pai_defense.dm @@ -6,16 +6,16 @@ . = ..() if(. & EMP_PROTECT_SELF) return - take_holo_damage(5 * severity) - Paralyze(40 * severity) - silent = max(3 * severity, silent) + take_holo_damage(50/severity) + Paralyze(400/severity) + silent = max(30/severity, silent) if(holoform) fold_in(force = TRUE) //Need more effects that aren't instadeath or permanent law corruption. //Ask and you shall receive switch(rand(1, 3)) if(1) - adjust_stutter((6 * severity) SECONDS) + adjust_stutter(1 MINUTES / severity) to_chat(src, span_danger("Warning: Feedback loop detected in speech module.")) if(2) adjust_slurring(INFINITY) diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 01047137f1a1..80e710a1518e 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -80,7 +80,11 @@ . = ..() if(. & EMP_PROTECT_SELF) return - Stun(min((1.6 SECONDS) * severity, 16 SECONDS)) // up to 16 seconds + switch(severity) + if(1) + Stun(160) + if(2) + Stun(60) /mob/living/silicon/robot/emag_act(mob/user, obj/item/card/emag/emag_card) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 63f34ab86dbb..a2743cbf2527 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -528,17 +528,16 @@ return clamp(damage_amount * (1 - armor_protection/100), 1, damage_amount) // Minimum of 1 damage. /// Copy of '/mob/living/attacked_by', except it sets damage to what is returned by 'proc/run_armor'. -/mob/living/silicon/attacked_by(obj/item/attacking_item, mob/living/user) - send_item_attack_message(attacking_item, user) - if(!attacking_item.force) - return FALSE - // Demolition mod has half the effect on silicons that it does on structures (ex. 2x will act as 1.5x, 0.5x will act as 0.75x) - var/damage = run_armor(attacking_item.force * (1 + attacking_item.demolition_mod)/2, attacking_item.damtype, MELEE) - apply_damage(damage, attacking_item.damtype) - if(attacking_item.damtype == BRUTE && prob(33)) - attacking_item.add_mob_blood(src) - var/turf/location = get_turf(src) - add_splatter_floor(location) - if(get_dist(user, src) <= 1) - user.add_mob_blood(src) - return TRUE +/mob/living/silicon/attacked_by(obj/item/I, mob/living/user) + send_item_attack_message(I, user) + if(I.force) + var/damage = run_armor(I.force, I.damtype, MELEE) + apply_damage(damage, I.damtype) + if(I.damtype == BRUTE) + if(prob(33)) + I.add_mob_blood(src) + var/turf/location = get_turf(src) + add_splatter_floor(location) + if(get_dist(user, src) <= 1) + user.add_mob_blood(src) + return TRUE diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 9cd6b66aed53..3942d298949d 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -109,10 +109,14 @@ to_chat(src, span_danger("Warning: Electromagnetic pulse detected.")) if(. & EMP_PROTECT_SELF) return - take_bodypart_damage(2 * severity) + switch(severity) + if(1) + src.take_bodypart_damage(20) + if(2) + src.take_bodypart_damage(10) to_chat(src, span_userdanger("*BZZZT*")) for(var/mob/living/M in buckled_mobs) - if(prob(5 * severity)) + if(prob(severity*50)) unbuckle_mob(M) M.Paralyze(40) M.visible_message(span_boldwarning("[M] is thrown off of [src]!")) @@ -121,7 +125,7 @@ /mob/living/silicon/bullet_act(obj/projectile/Proj, def_zone) SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, Proj, def_zone) if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - var/damage = run_armor(Proj.damage * (1 + Proj.demolition_mod)/2, Proj.damage_type, Proj.armor_flag, Proj.armour_penetration) + var/damage = run_armor(Proj.damage, Proj.damage_type, Proj.armor_flag, Proj.armour_penetration) adjustBruteLoss(damage) if(prob(damage*1.5)) for(var/mob/living/M in buckled_mobs) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index bf7a61cc67bb..a6c8a8f93f74 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -364,7 +364,7 @@ ejectpai(0) if(on) turn_off() - spawn(30 * severity) + spawn(severity*300) stat &= ~EMPED if(was_on) turn_on() diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 39cf352be45c..c1fd265adb0f 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -459,10 +459,12 @@ Auto Patrol[]"}, /mob/living/simple_animal/bot/ed209/emp_act(severity) + if(severity == 2 && prob(70)) + severity = 1 . = ..() if(. & EMP_PROTECT_SELF) return - if (severity > EMP_LIGHT || prob(70)) + if (severity >= 2) new /obj/effect/temp_visual/emp(loc) var/list/mob/living/carbon/targets = new for(var/mob/living/carbon/C in view(12,src)) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 3b23f070f3ac..5dcaab702f96 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -231,9 +231,9 @@ . = ..() if(. & EMP_PROTECT_SELF) return - Stun(10 * severity) + Stun(100) to_chat(src, span_danger("ER@%R: MME^RY CO#RU9T! R&$b@0tin)...")) - if(severity > EMP_LIGHT) + if(severity == 1) adjustBruteLoss(heavy_emp_damage) to_chat(src, span_userdanger("HeAV% DA%^MMA+G TO I/O CIR!%UUT!")) diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm index b14cf101e7ab..3d77ac911cbb 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm @@ -6,5 +6,5 @@ if(!ninjacost(250,N_STEALTH_CANCEL)) var/mob/living/carbon/human/H = affecting playsound(H.loc, 'sound/effects/empulse.ogg', 60, 2) - empulse(H, EMP_HEAVY, 6) //Procs sure are nice. Slightly weaker than wizard's disable tch. + empulse(H, 4, 6) //Procs sure are nice. Slightly weaker than wizard's disable tch. s_coold = 4 diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 5b25b248cab8..27bb868f2371 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -154,7 +154,7 @@ if(on) // EMP will only work on cameras that are on as it has power going through it icon_state = state_off on = FALSE - addtimer(CALLBACK(src, PROC_REF(emp_after)), (6*severity) SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + addtimer(CALLBACK(src, PROC_REF(emp_after)), (600/severity)) /obj/item/camera/proc/emp_after() on = TRUE diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 215bfb7fab95..e2fcb0d0fea9 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1466,7 +1466,7 @@ environ = 0 update_appearance(UPDATE_ICON) update() - addtimer(CALLBACK(src, PROC_REF(reset), APC_RESET_EMP), (6 * severity) SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + addtimer(CALLBACK(src, PROC_REF(reset), APC_RESET_EMP), 600) /obj/machinery/power/apc/blob_act(obj/structure/blob/B) set_broken() diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index d042bbba6020..6ca8fac3e3e7 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -179,7 +179,7 @@ . = ..() if(. & EMP_PROTECT_SELF) return - charge -= max((charge * severity / 100), 50 * severity) + charge -= max((charge * 0.1), 500) / severity if (charge < 0) charge = 0 @@ -392,7 +392,7 @@ . = ..() if(. & EMP_PROTECT_SELF) return - charge = clamp((charge-(1000 * severity)),0,maxcharge) + charge = clamp((charge-(10000/severity)),0,maxcharge) /obj/item/stock_parts/cell/emergency_light name = "miniature power cell" diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 89cebd706384..cb1d0a12590a 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -583,7 +583,7 @@ /obj/singularity/proc/emp_area() - empulse(src, EMP_HEAVY) + empulse(src, 8, 10) return /obj/singularity/singularity_act() diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index c17a460347bb..ba8c60ddc4ee 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -417,7 +417,7 @@ outputting = output_attempt output_level = rand(0, output_level_max) input_level = rand(0, input_level_max) - charge = max(charge - (1e5 * severity), 0) + charge = max(charge - 1e6/severity, 0) update_appearance(UPDATE_ICON) log_smes() diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 93e02b451c90..a9102c23adbf 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -758,7 +758,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) radiation_pulse(src, (100-support_integrity)*2, 4) if(support_integrity<3) var/emp_power = round(explosion_power * (1+(1-(support_integrity/3))),1) - empulse(src, emp_power) + empulse(src, emp_power, emp_power*2) if(support_integrity<100) power += round((100-support_integrity)/2,1) if(support_integrity<70) @@ -779,7 +779,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(istype(T, /turf/open/space) || T.return_air().total_moles() < MOLE_SPACE_THRESHOLD) damage += DAMAGE_HARDCAP * explosion_point //Can't cheat by spacing the crystal to buy time, it will just delaminate faster if(prob(2)) - empulse(src, 10-support_integrity) //EMPs must always be spewing every so often to ensure that containment is guaranteed to fail. + empulse(src, 10-support_integrity, (10-support_integrity)*2) //EMPs must always be spewing every so often to ensure that containment is guaranteed to fail. return 1 /obj/machinery/power/supermatter_crystal/bullet_act(obj/projectile/Proj) @@ -1004,7 +1004,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) to_chat(user, "You attach the antinoblium shard to the [src], moving your hand away before a sudden gravitational wave pulls the [W] into the crystal as it flashes to ash!") playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1) radiation_pulse(src, 150, 4) - empulse(src, EMP_HEAVY, 6) + empulse(src, 3,6) qdel(W) return else if(user.dropItemToGround(W)) diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index 10339f83fce3..5f4be6d2453d 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -231,10 +231,10 @@ /obj/item/ammo_casing/shotgun/hardlight/emp_act(severity) if (. & EMP_PROTECT_SELF) return - variance = initial(variance) + severity*4 // yikes - if(severity > EMP_LIGHT) - pellets = initial(pellets) * (0.5**(severity / EMP_HEAVY)) // also yikes - addtimer(CALLBACK(src, PROC_REF(remove_emp)), severity SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE) + variance = 60 // yikes + if(severity == EMP_HEAVY) + pellets = 3 // also yikes + addtimer(CALLBACK(src, PROC_REF(remove_emp)), 10 SECONDS / severity, TIMER_OVERRIDE|TIMER_UNIQUE) /obj/item/ammo_casing/shotgun/hardlight/proc/remove_emp() variance = initial(variance) diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm index 0aadae394955..6ff05a4c1616 100644 --- a/code/modules/projectiles/ammunition/energy/special.dm +++ b/code/modules/projectiles/ammunition/energy/special.dm @@ -4,7 +4,7 @@ fire_sound = 'sound/weapons/ionrifle.ogg' /obj/item/ammo_casing/energy/ion/hos - projectile_type = /obj/projectile/ion/weak + projectile_type = /obj/projectile/ion/light e_cost = 200 /obj/item/ammo_casing/energy/ion/weak diff --git a/code/modules/projectiles/ammunition/reusable/arrow.dm b/code/modules/projectiles/ammunition/reusable/arrow.dm index c367fdcfbac6..933c10d0511a 100644 --- a/code/modules/projectiles/ammunition/reusable/arrow.dm +++ b/code/modules/projectiles/ammunition/reusable/arrow.dm @@ -464,23 +464,23 @@ if(/obj/item/singularity_shard/stage2) break_chance = 0.5 rads_released = 200 - empulse(src, 1) + empulse(src, 0, 1) if(/obj/item/singularity_shard/stage3) break_chance = 1.5 rads_released = 500 - empulse(src, 3) + empulse(src, 0, 3) if(/obj/item/singularity_shard/stage4) break_chance = 5 rads_released = 1000 - empulse(src, 5) + empulse(src, 1, 5) if(/obj/item/singularity_shard/stage5) break_chance = 10 rads_released = 2000 - empulse(src, 7) + empulse(src, 2, 7) if(/obj/item/singularity_shard/stage6) break_chance = 100 rads_released = 3000 - empulse(src, 15) // Its going to break open into a singulo anyways, may as well add some fireworks + empulse(src, 5, 15) // Its going to break open into a singulo anyways, may as well add some fireworks // Handles releasing rads if(rads_released) diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm index 7556ca1c68a3..c9a5c0dea3f1 100644 --- a/code/modules/projectiles/boxes_magazines/external/rechargable.dm +++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm @@ -102,7 +102,7 @@ . = ..() if(!(. & EMP_PROTECT_CONTENTS)) var/bullet_count = ammo_count() - var/bullets_to_remove = round(bullet_count * (0.5**(severity/EMP_HEAVY))) + var/bullets_to_remove = round(bullet_count / (severity*2)) for(var/i = 0; i < bullets_to_remove, i++) qdel(get_round()) update_appearance(UPDATE_ICON) @@ -111,8 +111,8 @@ if(!G.magazine == src) return G.semicd = TRUE - // up to 10 seconds depending on severity, then give or take 0.2 seconds to prevent piercing ears - var/unjam_time = (min(severity, EMP_HEAVY) + (rand(-20,20)*0.01)) SECONDS + // 5-10 seconds depending on severity, then give or take 0.2 seconds to prevent piercing ears + var/unjam_time = ((10/severity) + (rand(-20,20)*0.01)) SECONDS addtimer(CALLBACK(G, TYPE_PROC_REF(/obj/item/gun, reset_semicd)), unjam_time) /obj/item/ammo_casing/caseless/c22hl diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 7d2e06ec1d04..d6a14d12ec03 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -36,11 +36,11 @@ /obj/item/gun/energy/emp_act(severity) . = ..() if(!(. & EMP_PROTECT_CONTENTS)) - cell.use(round(cell.charge * (0.5**(severity/EMP_HEAVY)))) + cell.use(round(cell.charge / (severity*2))) emp_jammed = TRUE deltimer(emp_jam_timer) - // up to 10 seconds depending on severity, then give or take 0.2 seconds to prevent piercing ears - var/unjam_time = (min(severity, EMP_HEAVY) + (rand(-20,20)*0.01)) SECONDS + // 5-10 seconds depending on severity, then give or take 0.2 seconds to prevent piercing ears + var/unjam_time = ((10/severity) + (rand(-20,20)*0.01)) SECONDS emp_jam_timer = addtimer(CALLBACK(src, PROC_REF(emp_unjam)), unjam_time, TIMER_STOPPABLE) chambered = null //we empty the chamber recharge_newshot() //and try to charge a new shot diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index d6dadf6ccf50..477fbd5520ce 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -425,7 +425,6 @@ armor_flag = ENERGY range = 150 jitter = 10 - demolition_mod = 4 var/obj/item/gun/gun var/structure_pierce_amount = 0 //All set to 0 so the gun can manually set them during firing. var/structure_bleed_coeff = 0 diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index ebef6ac497c6..4056f1421fe0 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -153,7 +153,6 @@ damage = 30 wound_bonus = -40 bare_wound_bonus = 70 - demolition_mod = 3 // industrial laser impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser light_color = LIGHT_COLOR_GREEN diff --git a/code/modules/projectiles/projectile/bullets/_incendiary.dm b/code/modules/projectiles/projectile/bullets/_incendiary.dm index 1a6ed1323113..cb61ee5b7bb0 100644 --- a/code/modules/projectiles/projectile/bullets/_incendiary.dm +++ b/code/modules/projectiles/projectile/bullets/_incendiary.dm @@ -1,7 +1,6 @@ /obj/projectile/bullet/incendiary damage = 20 var/fire_stacks = 4 - demolition_mod = 0.75 /obj/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE) . = ..() diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm index e9383f89b2dc..b67fe3a84c43 100644 --- a/code/modules/projectiles/projectile/bullets/pistol.dm +++ b/code/modules/projectiles/projectile/bullets/pistol.dm @@ -64,7 +64,7 @@ /obj/projectile/bullet/c10mm/emp/on_hit(atom/target, blocked = FALSE) ..() - empulse(target, EMP_HEAVY, 1) //Heavy EMP on target, light EMP in tiles around + empulse(target, 0.5, 1) //Heavy EMP on target, light EMP in tiles around /obj/projectile/bullet/boltpistol name = "Bolt round" diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index c476a18556f8..d2f1edeec1bd 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -44,7 +44,6 @@ damage = 60 wound_bonus = -35 wound_falloff_tile = 0 - demolition_mod = 1.2 /obj/projectile/bullet/a762/raze name = "7.62mm Raze bullet" @@ -64,7 +63,6 @@ penetrating = TRUE //Passes through two objects, stops on a mob or on a third object penetrations = 2 penetration_type = 1 - demolition_mod = 1.5 // anti-armor /obj/projectile/bullet/a762/vulcan name = "7.62mm Vulcan bullet" diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index fbec1b20f8bc..79acfac73304 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -6,7 +6,6 @@ damage = 46 //About 2/3's the damage of buckshot but doesn't suffer from spread or negative AP sharpness = SHARP_POINTY wound_bonus = -30 - demolition_mod = 2 // good at smashing through stuff /obj/projectile/bullet/shotgun/slug/syndie name = "12g syndicate shotgun slug" @@ -75,7 +74,6 @@ damage = 35 //Most certainly to drop below 3-shot threshold because of damage falloff armour_penetration = 60 // he he funny round go through armor wound_bonus = -40 - demolition_mod = 3 // very good at smashing through stuff penetrating = TRUE //Goes through an infinite number of mobs /obj/projectile/bullet/shotgun/slug/Range() @@ -90,7 +88,6 @@ var/tile_dropoff = 0.4 var/tile_dropoff_s = 0.3 armour_penetration = -20 //Armor is 25% stronger against pellets - demolition_mod = 0.5 // bad at smashing through stuff /obj/projectile/bullet/pellet/shotgun_buckshot name = "buckshot pellet" @@ -203,11 +200,10 @@ desc = "A breaching round designed to destroy airlocks and windows with only a few shots, but is ineffective against other targets." hitsound = 'sound/weapons/sonic_jackhammer.ogg' damage = 10 //does shit damage to everything except doors and windows - demolition_mod = 6 //not that bad at breaking things /obj/projectile/bullet/shotgun/slug/breaching/on_hit(atom/target) - if(istype(target, /obj/structure/window) || istype(target, /obj/machinery/door) || istype(target, /obj/structure/door_assembly) || istype(target, /obj/structure/grille)) - demolition_mod = 50 //one shot to break a window or 3 shots to breach an airlock door + if(istype(target, /obj/structure/window) || istype(target, /obj/machinery/door) || istype(target, /obj/structure/door_assembly)) + damage = 500 //one shot to break a window or 3 shots to breach an airlock door ..() /obj/projectile/bullet/pellet/hardlight diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index 262bec69a77f..a845ad1bb599 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -7,7 +7,13 @@ paralyze = 100 dismemberment = 50 armour_penetration = 50 - demolition_mod = 2.2 // very effective against armored structures and vehicles + var/breakthings = TRUE + +/obj/projectile/bullet/p50/on_hit(atom/target, blocked = 0) + if(isobj(target) && (blocked != 100) && breakthings) + var/obj/O = target + O.take_damage(80, BRUTE, BULLET, FALSE, null, armour_penetration) + return ..() /obj/projectile/bullet/p50/soporific name = ".50 soporific bullet" @@ -15,6 +21,7 @@ damage = 0 dismemberment = 0 paralyze = 0 + breakthings = FALSE /obj/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE) if((blocked != 100) && isliving(target)) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 00961f96658f..2a3d794ef06b 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -20,7 +20,7 @@ var/mob/living/carbon/C = target SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased) SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK) - if(C.dna && (C.dna.check_mutation(HULK))) + if(C.dna && (C.dna.check_mutation(HULK) || C.dna.check_mutation(ACTIVE_HULK))) C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), jitter), 5) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 0f4a9cd6d130..5b2cb0c7b0de 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -1102,10 +1102,10 @@ nodamage = TRUE armor_flag = ENERGY impact_effect_type = /obj/effect/temp_visual/impact_effect/ion - var/ion_severity = EMP_HEAVY //Heavy EMP effect that doesn't spread to adjacent tiles - var/ion_range = 3 + var/light_emp_radius = 3 + var/heavy_emp_radius = 0.5 //Effectively 1 but doesnt spread to adjacent tiles /obj/projectile/magic/ion/on_hit(atom/target, blocked = FALSE) ..() - empulse(target, ion_severity, ion_range) + empulse(target, heavy_emp_radius, light_emp_radius) return BULLET_ACT_HIT diff --git a/code/modules/projectiles/projectile/reusable/arrow.dm b/code/modules/projectiles/projectile/reusable/arrow.dm index 6b615926d848..dd6dcbfdfb67 100644 --- a/code/modules/projectiles/projectile/reusable/arrow.dm +++ b/code/modules/projectiles/projectile/reusable/arrow.dm @@ -289,7 +289,7 @@ var/mob/living/carbon/C = target SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased) SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK) - if(C.dna && (C.dna.check_mutation(HULK))) + if(C.dna && (C.dna.check_mutation(HULK) || C.dna.check_mutation(ACTIVE_HULK))) C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), jitter), 5) diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm index b2de093296c7..6c3538abcff4 100644 --- a/code/modules/projectiles/projectile/special/hallucination.dm +++ b/code/modules/projectiles/projectile/special/hallucination.dm @@ -168,7 +168,7 @@ /obj/projectile/hallucination/taser/hal_apply_effect() hal_target.Paralyze(100) hal_target.adjust_stutter(2 SECONDS) - if(hal_target.dna && (hal_target.dna.check_mutation(HULK))) + if(hal_target.dna && (hal_target.dna.check_mutation(HULK)|| hal_target.dna.check_mutation(ACTIVE_HULK))) hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") else if((hal_target.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(hal_target, TRAIT_STUNIMMUNE)) addtimer(CALLBACK(hal_target, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 20), 0.5 SECONDS) diff --git a/code/modules/projectiles/projectile/special/ion.dm b/code/modules/projectiles/projectile/special/ion.dm index 82675908b7cd..4de29713c471 100644 --- a/code/modules/projectiles/projectile/special/ion.dm +++ b/code/modules/projectiles/projectile/special/ion.dm @@ -6,18 +6,22 @@ nodamage = TRUE armor_flag = ENERGY impact_effect_type = /obj/effect/temp_visual/impact_effect/ion - var/ion_severity = EMP_HEAVY // Heavy EMP effects that don't spread to adjacent tiles - var/ion_range = 1 + var/light_emp_radius = 1 + var/heavy_emp_radius = 0.5 //Effectively 1 but doesnt spread to adjacent tiles /obj/projectile/ion/on_hit(atom/target, blocked = FALSE) ..() - empulse(target, ion_severity, ion_range) + empulse(target, heavy_emp_radius, light_emp_radius) return BULLET_ACT_HIT /obj/projectile/ion/weak - ion_severity = EMP_LIGHT // weak ions - ion_range = 0 + light_emp_radius = 0 + heavy_emp_radius = 0 + +/obj/projectile/ion/light + light_emp_radius = 1 + heavy_emp_radius = 0 /obj/projectile/ion/heavy - ion_severity = 15 // STRONG ions - ion_range = 2 + light_emp_radius = 2 + heavy_emp_radius = 2 diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm index 63f46d4e7785..b98bba4951d8 100644 --- a/code/modules/projectiles/projectile/special/plasma.dm +++ b/code/modules/projectiles/projectile/special/plasma.dm @@ -6,7 +6,6 @@ damage = 5 range = 4 dismemberment = 20 - demolition_mod = 2 // industrial strength plasma cutter designed to cut things impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser var/mine_range = 3 //mines this many additional tiles of rock tracer_type = /obj/effect/projectile/tracer/plasma_cutter diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index 3d220e4842a3..a0df35e83b00 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -12,15 +12,21 @@ name ="\improper HEDP rocket" desc = "USE A WEEL GUN" icon_state= "84mm-hedp" - armor_flag = BOMB damage = 80 - demolition_mod = 4 + var/anti_armour_damage = 200 armour_penetration = 100 dismemberment = 100 /obj/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE) ..() explosion(target, -1, 1, 3, 1, 0, flame_range = 4) + + if(ismecha(target)) + var/obj/mecha/M = target + M.take_damage(anti_armour_damage, BRUTE, BOMB, FALSE, null, armour_penetration) + if(issilicon(target)) + var/mob/living/silicon/S = target + S.take_overall_damage(anti_armour_damage*0.75, anti_armour_damage*0.25) return BULLET_ACT_HIT /obj/projectile/bullet/a84mm_he @@ -28,7 +34,6 @@ desc = "Boom." icon_state = "missile" damage = 30 - demolition_mod = 4 ricochets_max = 0 //it's a MISSILE /obj/projectile/bullet/a84mm_he/on_hit(atom/target, blocked=0) @@ -44,7 +49,6 @@ desc = "Boom." icon_state = "missile" damage = 30 - demolition_mod = 4 ricochets_max = 0 //it's a MISSILE var/sturdy = list( /turf/closed, @@ -75,18 +79,22 @@ icon_state = "cannonball" desc = "Not for bowling purposes" damage = 30 - demolition_mod = 20 // YARRR /obj/projectile/bullet/cball/on_hit(atom/target, blocked=0) - var/atom/throw_target = get_edge_target_turf(target, firer.dir) - if(ismecha(target) || isliving(target)) - demolition_mod = 5 // woah there let's not one-shot mechs and borgs - . = ..() - if(!ismovable(target)) // if it's not movable then don't bother trying to throw it - return - var/atom/movable/movable_target = target - if(!movable_target.anchored && !movable_target.throwing)//avoid double hits - movable_target.throw_at(throw_target, 2, 4, firer, 3) + var/mob/living/carbon/human/H = firer + var/atom/throw_target = get_edge_target_turf(target, H.dir) + if(istype(target, /obj/structure/window) || istype(target, /obj/machinery/door) || istype(target, /obj/structure/door_assembly)) + damage = 500 + ..() + if(isliving(target)) + var/mob/living/L = target + if(!L.anchored && !L.throwing)//avoid double hits + if(iscarbon(L)) + var/mob/living/carbon/C = L + var/mob/M = firer + if(istype(M)) + C.throw_at(throw_target, 2, 4, H, 3) + return BULLET_ACT_HIT /obj/projectile/bullet/bolt name = "bolt" diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 0cc6b163262d..c924ef3ab58d 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -119,10 +119,10 @@ /datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) - // 100 created volume = 8 severity & 14 range. 4 tiles larger than traitor EMP grenades. - // 200 created volume = 16 (capped to 10) severity & 28 range. 12 tiles larger than traitor EMP grenades. This is the maximum + // 100 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. + // 200 created volume = 16 heavy range & 28 light range. 12 tiles larger than traitor EMP grenades. This is the maximum created_volume = min(created_volume, 200) - empulse(location, min(round(created_volume / 12), EMP_HEAVY), round(created_volume / 7), 1) + empulse(location, round(created_volume / 12), round(created_volume / 7), 1) holder.clear_reagents() diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index bd67368f4b60..d93d2cc81af0 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -354,7 +354,7 @@ required_other = TRUE /datum/chemical_reaction/slime/slimeoverload/on_reaction(datum/reagents/holder, created_volume) - empulse(get_turf(holder.my_atom), 7) + empulse(get_turf(holder.my_atom), 3, 7) ..() /datum/chemical_reaction/slime/slimecell diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 1f34dfb329b7..fef83d18d055 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -369,7 +369,7 @@ else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) autoexperiment = 0 visible_message(span_warning("[src] melts [exp_on], ionizing the air around it!")) - empulse(loc, 6) + empulse(loc, 4, 6) investigate_log("Experimentor has generated an Electromagnetic Pulse.", INVESTIGATE_EXPERIMENTOR) ejectItem(TRUE) //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm index a3751a0d4dd5..cd6be3b94dba 100644 --- a/code/modules/research/nanites/nanite_programs.dm +++ b/code/modules/research/nanites/nanite_programs.dm @@ -194,7 +194,7 @@ /datum/nanite_program/proc/on_emp(severity) if(program_flags & NANITE_EMP_IMMUNE) return - if(prob(8 * severity)) + if(prob(80 / severity)) software_error() /datum/nanite_program/proc/on_shock(shock_damage) diff --git a/code/modules/research/nanites/nanite_programs/weapon.dm b/code/modules/research/nanites/nanite_programs/weapon.dm index 6e5c8fb3380c..2590b8980f49 100644 --- a/code/modules/research/nanites/nanite_programs/weapon.dm +++ b/code/modules/research/nanites/nanite_programs/weapon.dm @@ -134,7 +134,7 @@ /datum/nanite_program/triggered/emp/trigger() if(!..()) return - empulse(host_mob, EMP_HEAVY, 2) + empulse(host_mob, 1, 2) /datum/nanite_program/pyro/active_effect() host_mob.adjust_fire_stacks(1) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index b142be514f63..0cc6164d976d 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -96,12 +96,12 @@ working = TRUE update_appearance(UPDATE_ICON) -/obj/machinery/rnd/server/emp_act(severity) +/obj/machinery/rnd/server/emp_act() . = ..() if(. & EMP_PROTECT_SELF) return stat |= EMPED - addtimer(CALLBACK(src, PROC_REF(unemp)), (6 * severity) SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + addtimer(CALLBACK(src, PROC_REF(unemp)), 600) refresh_working() /obj/machinery/rnd/server/proc/unemp() diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 3f8e9b2dea74..00ce26f5d727 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -279,7 +279,7 @@ if(SLIME_ACTIVATE_MAJOR) user.visible_message(span_warning("[user]'s skin starts flashing intermittently..."), span_warning("Your skin starts flashing intermittently...")) if(do_after(user, 2.5 SECONDS, user)) - empulse(user, EMP_HEAVY, 2) + empulse(user, 1, 2) user.visible_message(span_warning("[user]'s skin flashes!"), span_warning("Your skin flashes as you emit an electromagnetic pulse!")) return 600 diff --git a/code/modules/spells/spell_types/self/disable_tech.dm b/code/modules/spells/spell_types/self/disable_tech.dm index 7def457a89e1..558e4e6943bf 100644 --- a/code/modules/spells/spell_types/self/disable_tech.dm +++ b/code/modules/spells/spell_types/self/disable_tech.dm @@ -6,14 +6,14 @@ school = SCHOOL_EVOCATION - /// The severity of the EMP - var/severity = EMP_HEAVY - /// The radius of the EMP - var/radius = 3 + /// The heavy radius of the EMP + var/emp_heavy = 2 + /// The light radius of the EMP + var/emp_light = 3 /datum/action/cooldown/spell/emp/cast(atom/cast_on) . = ..() - empulse(get_turf(cast_on), severity, radius) + empulse(get_turf(cast_on), emp_heavy, emp_light) /datum/action/cooldown/spell/emp/disable_tech name = "Disable Tech" @@ -26,4 +26,5 @@ invocation = "NEC CANTIO" invocation_type = INVOCATION_SHOUT - radius = 10 + emp_heavy = 6 + emp_light = 10 \ No newline at end of file diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index eda1348554ec..7b22796ef170 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -45,7 +45,6 @@ var/brute_reduction = 0 //Subtracted to brute damage taken var/burn_reduction = 0 //Subtracted to burn damage taken - var/emp_reduction = 0 //Subtracted to EMP severity //Coloring and proper item icon update var/skin_tone = "" @@ -128,32 +127,6 @@ /obj/item/bodypart/blob_act() take_damage(max_damage) -/obj/item/bodypart/emp_act(severity, emp_message=TRUE) - . = ..() - if(. & EMP_PROTECT_SELF) - return - - var/blocked = owner.getarmor(body_zone, ENERGY) // energy armor protects against EMPs - severity *= (100 - blocked) / 100 - severity -= emp_reduction - if(severity < 1) - return - - if(receive_damage(0, severity / 2, severity, FALSE, TRUE, BODYPART_ROBOTIC, CANT_WOUND)) // returns false for non-robotic limbs - if(severity > EMP_LIGHT) - ADD_TRAIT(src, TRAIT_PARALYSIS, "EMP") - addtimer(CALLBACK(src, PROC_REF(after_emp)), min((severity / 2) SECONDS, 5 SECONDS), TIMER_UNIQUE | TIMER_OVERRIDE) - if(owner && emp_message) - owner.emote("scream") - to_chat(src, span_userdanger("You feel a sharp pain as your robotic limbs overload.")) - - if(!(. & EMP_PROTECT_CONTENTS)) - for(var/obj/item/organ/O as anything in get_organs()) - O.emp_act(severity) - -/obj/item/bodypart/proc/after_emp() - REMOVE_TRAIT(src, TRAIT_PARALYSIS, "EMP") - /obj/item/bodypart/Destroy() if(owner) owner.bodyparts -= src @@ -858,7 +831,7 @@ else species_color = "" - if(!dropping_limb && (H.dna.check_mutation(HULK))) + if(!dropping_limb && (H.dna.check_mutation(HULK) || H.dna.check_mutation(ACTIVE_HULK))) mutation_color = "#00aa00" else mutation_color = "" diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index e45511648e94..b600f356e49e 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -83,5 +83,4 @@ . = ..() if(. & EMP_PROTECT_SELF) return - if(severity > EMP_LIGHT) - damage += 20 * (severity - EMP_HEAVY) + damage += 100/severity diff --git a/code/modules/surgery/organs/augment_legs.dm b/code/modules/surgery/organs/augment_legs.dm index 706f430160dc..ea53e3f59c23 100644 --- a/code/modules/surgery/organs/augment_legs.dm +++ b/code/modules/surgery/organs/augment_legs.dm @@ -23,7 +23,7 @@ if(!L) //how did you get an implant in a limb you don't have? return - L.receive_damage(severity / 2, 0, severity) //always take a least a little bit of damage to the leg + L.receive_damage(5,0,10) //always take a least a little bit of damage to the leg if(prob(50)) //you're forced to use two of these for them to work so let's give em a chance to not get completely fucked if(COOLDOWN_FINISHED(src, emp_notice)) @@ -32,15 +32,15 @@ return L.set_disabled(TRUE) //disable the bodypart - addtimer(CALLBACK(src, PROC_REF(reenableleg)), (severity / 2) SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) + addtimer(CALLBACK(src, PROC_REF(reenableleg)), 5 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) - if(severity > EMP_LIGHT && prob(5) && !syndicate_implant) //put probabilities into a calculator before you try fucking with this - to_chat(owner, span_warning("[src] malfunctions and thrashes your [L] around wildly, breaking it!")) + if(severity & EMP_HEAVY && prob(5) && !syndicate_implant) //put probabilities into a calculator before you try fucking with this + to_chat(owner, span_warning("The EMP causes your [src] to thrash your [L] around wildly, breaking it!")) var/datum/wound/blunt/severe/breakdown = new breakdown.apply_wound(L) L.receive_damage(20) else if(COOLDOWN_FINISHED(src, emp_notice)) - to_chat(owner, span_warning("[src] malfunctions and causes your muscles to seize up, preventing your [L] from moving!")) + to_chat(owner, span_warning("The EMP causes your [src] to seize up, preventing your [L] from moving!")) COOLDOWN_START(src, emp_notice, 30 SECONDS) /obj/item/organ/cyberimp/leg/proc/reenableleg() @@ -84,6 +84,14 @@ to_chat(user, span_notice("You modify [src] to be installed on the [zone == BODY_ZONE_R_LEG ? "right" : "left"] leg.")) update_appearance(UPDATE_ICON) +/obj/item/organ/cyberimp/leg/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(prob(15/severity) && owner) + to_chat(owner, span_warning("[src] is hit by EMP!")) + // give the owner an idea about why his implant is glitching + /obj/item/organ/cyberimp/leg/Insert(mob/living/carbon/M, special, drop_if_replaced, special_zone) . = ..() if(HasBoth()) diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 1f018e8918e7..a7aed9252035 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -67,7 +67,7 @@ . = ..() if(. & EMP_PROTECT_SELF) return - if(prob(1.5 * severity) && owner) + if(prob(15/severity) && owner) to_chat(owner, span_warning("[src] is hit by EMP!")) // give the owner an idea about why his implant is glitching Retract() @@ -162,7 +162,7 @@ . = ..() if(. & EMP_PROTECT_SELF) return - if(prob(3 * severity) && owner && (organ_flags & ORGAN_FAILING)) + if(prob(30/severity) && owner && (organ_flags & ORGAN_FAILING)) Retract() owner.visible_message(span_danger("A loud bang comes from [owner]\'s [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm!")) playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, 1) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 0ab2df136add..a11f9e1c5d2c 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -32,8 +32,7 @@ . = ..() if(!owner || . & EMP_PROTECT_SELF) return - var/existing = owner.reagents.get_reagent_amount(/datum/reagent/toxin/bad_food) - owner.reagents.add_reagent(/datum/reagent/toxin/bad_food, (poison_amount * (severity / EMP_HEAVY)) - existing) + owner.reagents.add_reagent(/datum/reagent/toxin/bad_food, poison_amount / severity) to_chat(owner, span_warning("You feel like your insides are burning.")) @@ -103,10 +102,10 @@ if(ishuman(owner) && !syndicate_implant) var/mob/living/carbon/human/H = owner - if(H.stat != DEAD && prob(5 * severity) && H.can_heartattack()) + if(H.stat != DEAD && prob(50 / severity) && H.can_heartattack()) H.set_heartattack(TRUE) to_chat(H, span_userdanger("You feel a horrible agony in your chest!")) - addtimer(CALLBACK(src, PROC_REF(undo_heart_attack)), severity SECONDS) + addtimer(CALLBACK(src, PROC_REF(undo_heart_attack)), 10 SECONDS / severity) /obj/item/organ/cyberimp/chest/reviver/proc/undo_heart_attack() var/mob/living/carbon/human/H = owner @@ -213,8 +212,13 @@ /obj/item/organ/cyberimp/chest/thrusters/emp_act(severity) . = ..() - owner.adjustFireLoss(3 * severity) - to_chat(owner, span_warning("Your thruster implant malfunctions and severely burns you!")) + switch(severity) + if(EMP_HEAVY) + owner.adjustFireLoss(35) + to_chat(owner, span_warning("Your thruster implant malfunctions and severely burns you!")) + if(EMP_LIGHT) + owner.adjustFireLoss(10) + to_chat(owner, span_danger("Your thruster implant malfunctions and mildly burns you!")) /obj/item/organ/cyberimp/chest/spinalspeed name = "neural overclocker implant" @@ -331,17 +335,27 @@ /obj/item/organ/cyberimp/chest/spinalspeed/emp_act(severity) . = ..() if(!syndicate_implant)//the toy has a different emp act - owner.adjust_dizzy(severity SECONDS) + owner.adjust_dizzy(10 SECONDS / severity) to_chat(owner, span_warning("Your spinal implant makes you feel queasy!")) return - owner.set_drugginess(4 * severity) - owner.adjust_hallucinations((50 * severity) SECONDS) - owner.blur_eyes(2 * severity) - owner.adjust_dizzy(severity SECONDS) - time_on += severity - owner.adjustFireLoss(severity) - to_chat(owner, span_warning("Your spinal implant malfunctions and you feel it scramble your brain!")) + switch(severity)//i don't want emps to just be damage again, that's boring + if(EMP_HEAVY) + owner.set_drugginess(40) + owner.adjust_hallucinations(500 SECONDS) + owner.adjust_eye_blur(20) + owner.adjust_dizzy(10 SECONDS) + time_on += 10 + owner.adjustFireLoss(10) + to_chat(owner, span_warning("Your spinal implant malfunctions and you feel it scramble your brain!")) + if(EMP_LIGHT) + owner.set_drugginess(20) + owner.adjust_hallucinations(200 SECONDS) + owner.adjust_eye_blur(10) + owner.adjust_dizzy(5 SECONDS) + time_on += 5 + owner.adjustFireLoss(5) + to_chat(owner, span_danger("Your spinal implant malfunctions and you suddenly feel... wrong.")) /obj/item/organ/cyberimp/chest/spinalspeed/toy name = "glowy after-image trail implant" diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 87bdd6505488..7f340058b76c 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -36,7 +36,7 @@ . = ..() if(!owner || . & EMP_PROTECT_SELF) return - owner.Stun(stun_amount * (severity / EMP_HEAVY)) + owner.Stun(stun_amount / severity) to_chat(owner, span_warning("Your body seizes up!")) @@ -74,12 +74,13 @@ . = ..() if(!owner || . & EMP_PROTECT_SELF) return + var/range = severity ? 10 : 5 var/atom/A if(active) release_items() for(var/obj/item/I in stored_items) - A = pick(oview(severity)) - I.throw_at(A, severity, 2) + A = pick(oview(range)) + I.throw_at(A, range, 2) to_chat(owner, span_warning("Your [owner.get_held_index_name(owner.get_held_index_of_item(I))] spasms and throws the [I.name]!")) stored_items = list() @@ -137,7 +138,7 @@ if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF) return organ_flags |= ORGAN_FAILING - addtimer(CALLBACK(src, PROC_REF(reboot)), stun_cap_amount * (severity / 5)) + addtimer(CALLBACK(src, PROC_REF(reboot)), stun_cap_amount * 2 / severity) /obj/item/organ/cyberimp/brain/anti_stun/proc/reboot() clear_stuns() @@ -182,7 +183,7 @@ . = ..() if(!owner || . & EMP_PROTECT_SELF) return - if(prob(6 * severity)) + if(prob(60/severity)) to_chat(owner, span_warning("Your breathing tube suddenly closes!")) owner.losebreath += 2 diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 0c3b10aaf071..cd5364d44b42 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -157,11 +157,15 @@ compatible_biotypes = MOB_ROBOTIC // for IPCs /obj/item/organ/ears/robot/emp_act(severity) - owner.adjust_jitter(3 * severity) - owner.adjust_dizzy(3 * severity) - owner.Knockdown(severity SECONDS) - if(severity > EMP_LIGHT) - deaf = 3 * severity - to_chat(owner, span_warning("Your robotic ears are uselessly ringing.")) - return - to_chat(owner, span_warning("Your robotic ears buzz.")) + switch(severity) + if(1) + owner.adjust_jitter(30 SECONDS) + owner.adjust_dizzy(30) + owner.Knockdown(5 SECONDS) + deaf = 30 + to_chat(owner, span_warning("Your robotic ears are uselessly ringing.")) + if(2) + owner.adjust_jitter(15 SECONDS) + owner.adjust_dizzy(15) + owner.Knockdown(10 SECONDS) + to_chat(owner, span_warning("Your robotic ears buzz.")) diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index b295459a9090..cbfcc08db923 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -20,14 +20,16 @@ low_threshold_cleared = span_info("Your vision is cleared of any ailment.") var/sight_flags = 0 - var/see_in_dark = 2 var/tint = 0 var/eye_color = "" //set to a hex code to override a mob's eye color var/eye_icon_state = "eyes" var/old_eye_color = "fff" var/flash_protect = 0 var/see_invisible = SEE_INVISIBLE_LIVING - var/lighting_alpha + /// How much darkness to cut out of your view (basically, night vision) + var/lighting_cutoff = null + /// List of color cutoffs from eyes, or null if not applicable + var/list/color_cutoffs = null var/no_glasses var/damaged = TRUE //damaged indicates that our eyes are undergoing some level of negative effect,starts as true so it removes the impaired vision overlay if it is replacing damaged eyes @@ -40,8 +42,6 @@ HMN.eye_color = eye_color else eye_color = HMN.eye_color - if(HAS_TRAIT(HMN, TRAIT_NIGHT_VISION) && !lighting_alpha) - lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT M.update_tint() owner.update_sight() if(M.has_dna() && ishuman(M)) @@ -55,7 +55,7 @@ HMN.update_body() M.cure_blind(list(EYE_DAMAGE)) // can't be blind from eye damage if there's no eye to be damaged, still blind from not having eyes though M.cure_nearsighted(list(EYE_DAMAGE)) // likewise for nearsightedness - M.set_blurriness(0) // no eyes to blur + M.set_eye_blur(0) // no eyes to blur M.update_tint() M.update_sight() @@ -117,48 +117,83 @@ #undef OFFSET_X #undef OFFSET_Y +#define NIGHTVISION_LIGHT_OFF 0 +#define NIGHTVISION_LIGHT_LOW 1 +#define NIGHTVISION_LIGHT_MID 2 +#define NIGHTVISION_LIGHT_HIG 3 + /obj/item/organ/eyes/night_vision name = "shadow eyes" desc = "A spooky set of eyes that can see in the dark." - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + actions_types = list(/datum/action/item_action/organ_action/use) - var/night_vision = TRUE + // These lists are used as the color cutoff for the eye + // They need to be filled out for subtypes + var/list/low_light_cutoff + var/list/medium_light_cutoff + var/list/high_light_cutoff + var/light_level = NIGHTVISION_LIGHT_OFF + +/obj/item/organ/eyes/night_vision/Initialize(mapload) + . = ..() + + if(length(low_light_cutoff) != 3 || length(medium_light_cutoff) != 3 || length(high_light_cutoff) != 3) + stack_trace("[type] did not have fully filled out color cutoff lists") + if(low_light_cutoff) + color_cutoffs = low_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_LOW /obj/item/organ/eyes/night_vision/ui_action_click() sight_flags = initial(sight_flags) - switch(lighting_alpha) - if (LIGHTING_PLANE_ALPHA_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + switch(light_level) + if (NIGHTVISION_LIGHT_OFF) + color_cutoffs = low_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_LOW + if (NIGHTVISION_LIGHT_LOW) + color_cutoffs = medium_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_MID + if (NIGHTVISION_LIGHT_MID) + color_cutoffs = high_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_HIG else - lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE - sight_flags &= ~SEE_BLACKNESS + color_cutoffs = null + light_level = NIGHTVISION_LIGHT_OFF owner.update_sight() -/obj/item/organ/eyes/night_vision/alien +#undef NIGHTVISION_LIGHT_OFF +#undef NIGHTVISION_LIGHT_LOW +#undef NIGHTVISION_LIGHT_MID +#undef NIGHTVISION_LIGHT_HIG + +/obj/item/organ/eyes/night_vision/mushroom + name = "fung-eye" + desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced." + low_light_cutoff = list(0, 15, 20) + medium_light_cutoff = list(0, 20, 35) + high_light_cutoff = list(0, 40, 50) + +//innate nightvision eyes +/obj/item/organ/eyes/alien name = "alien eyes" desc = "It turned out they had them after all!" sight_flags = SEE_MOBS + color_cutoffs = list(25, 5, 42) + lighting_cutoff = LIGHTING_CUTOFF_HIGH -/obj/item/organ/eyes/night_vision/zombie +/obj/item/organ/eyes/zombie name = "undead eyes" desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." + color_cutoffs = list(25, 35, 5) + lighting_cutoff = LIGHTING_CUTOFF_HIGH -/obj/item/organ/eyes/night_vision/nightmare +/obj/item/organ/eyes/shadow name = "burning red eyes" desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread." icon_state = "burning_eyes" - -/obj/item/organ/eyes/night_vision/mushroom - name = "fung-eye" - desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced." + color_cutoffs = list(20, 10, 40) + lighting_cutoff = LIGHTING_CUTOFF_HIGH ///Robotic - /obj/item/organ/eyes/robotic name = "robotic eyes" icon_state = "cybernetic_eyeballs" @@ -171,19 +206,21 @@ . = ..() if(!owner || . & EMP_PROTECT_SELF) return + var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) to_chat(owner, span_danger("your eyes overload and blind you!")) owner.flash_act(override_blindness_check = 1) - owner.blind_eyes(severity / 2) - owner.blur_eyes(8) - applyOrganDamage(2 * severity) + owner.blind_eyes(5) + owner.adjust_eye_blur(8) + eyes.applyOrganDamage(20 / severity) /obj/item/organ/eyes/robotic/xray name = "\improper meson eyes" desc = "These cybernetic eyes will give you meson-vision. Looks like it could withstand seeing a supermatter crystal!." eye_color = "00FF00" - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + // We're gonna downshift green and blue a bit so darkness looks yellow + color_cutoffs = list(25, 8, 5) sight_flags = SEE_TURFS - see_in_dark = 4 + /obj/item/organ/eyes/robotic/xray/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = FALSE, initialising) . = ..() @@ -198,16 +235,15 @@ desc = "These cybernetic eyes will give you true X-ray vision. Blinking is futile." eye_color = "000" sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS - see_in_dark = 8 /obj/item/organ/eyes/robotic/thermals name = "thermal eyes" desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included." eye_color = "FC0" sight_flags = SEE_MOBS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + // We're gonna downshift green and blue a bit so darkness looks yellow + color_cutoffs = list(25, 8, 5) flash_protect = -1 - see_in_dark = 8 /obj/item/organ/eyes/robotic/flashlight name = "flashlight eyes" @@ -454,5 +490,15 @@ /obj/item/organ/eyes/polysmorph name = "polysmorph eyes" desc = "Eyes from a polysmorph, capable of retaining slightly more vision in low light environments" - lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT - see_in_dark = 5 + color_cutoffs = list(25, 5, 42) + +/obj/item/organ/eyes/zombie + name = "undead eyes" + desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." + color_cutoffs = list(25, 35, 5) + +/obj/item/organ/eyes/alien + name = "alien eyes" + desc = "It turned out they had them after all!" + sight_flags = SEE_MOBS + color_cutoffs = list(25, 5, 42) diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index c121ae5f79d1..a61aa75c800c 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -239,9 +239,8 @@ . = ..() if(. & EMP_PROTECT_SELF) return - if(severity > EMP_LIGHT) - Stop() - addtimer(CALLBACK(src, PROC_REF(Restart)), restartTimer * min(severity / EMP_HEAVY, 1)) //Can restart itself after an EMP so it isnt an insta death + Stop() + addtimer(CALLBACK(src, PROC_REF(Restart)), restartTimer/severity) //Can restart itself after an EMP so it isnt an insta death /obj/item/organ/heart/cybernetic/upgraded name = "upgraded cybernetic heart" @@ -267,12 +266,12 @@ /obj/item/organ/heart/cybernetic/ipc desc = "An electronic device that appears to mimic the functions of an organic heart." -/obj/item/organ/heart/cybernetic/ipc/emp_act(severity) +/obj/item/organ/heart/cybernetic/ipc/emp_act() if(prob(30)) return . = ..() to_chat(owner, "Alert: Cybernetic heart failed one heartbeat") - addtimer(CALLBACK(src, PROC_REF(Restart)), severity SECONDS) + addtimer(CALLBACK(src, PROC_REF(Restart)), 10 SECONDS) /obj/item/organ/heart/freedom name = "heart of freedom" diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index b57493a2f019..05d0775c9163 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -117,7 +117,8 @@ . = ..() if(. & EMP_PROTECT_SELF) return - applyOrganDamage(5 * severity) + + damage += 50/severity /obj/item/organ/liver/cybernetic/upgraded/ipc name = "substance processor" @@ -134,4 +135,4 @@ if(prob(10)) return to_chat(owner, "Alert: Your Substance Processor has been damaged. An internal chemical leak is affecting performance.") - owner.adjustToxLoss(severity) + owner.adjustToxLoss(10/severity) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index fac73fdeac61..4735d278c05f 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -581,11 +581,11 @@ safe_breath_min = 13 safe_breath_max = 100 -/obj/item/organ/lungs/cybernetic/emp_act(severity) +/obj/item/organ/lungs/cybernetic/emp_act() . = ..() if(. & EMP_PROTECT_SELF) return - owner.losebreath = 2 * severity + owner.losebreath = 20 /obj/item/organ/lungs/cybernetic/upgraded name = "upgraded cybernetic lungs" diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index ce03572c32f8..b2572da28bf1 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -145,7 +145,7 @@ /obj/item/organ/stomach/cell/emp_act(severity) to_chat(owner, emp_message) - charge(amount = owner.nutrition * -0.02 * severity) + charge(amount = owner.nutrition * -0.2 / severity) /obj/item/organ/stomach/cell/Insert(mob/living/carbon/M, special, drop_if_replaced) . = ..() diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 92b50110451d..ac2dced2b692 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -266,9 +266,9 @@ /obj/item/organ/tongue/robot/emp_act(severity) if(prob(5)) return - owner.apply_effect(EFFECT_STUTTER, rand(1, severity) * 6 SECONDS) + owner.apply_effect(EFFECT_STUTTER, rand(5 SECONDS, 2 MINUTES)) owner.emote("scream") - to_chat(owner, "Alert: Voice synthesizer is malfunctioning.") + to_chat(owner, "Alert: Vocal cords are malfunctioning.") /obj/item/organ/tongue/robot/can_speak_language(language) return TRUE // THE MAGIC OF ELECTRONICS diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 05192ad4b1c2..cb74738d8880 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -169,7 +169,6 @@ throwforce = 5 throw_speed = 3 throw_range = 5 - demolition_mod = 0.25 materials = list(/datum/material/iron=4000, /datum/material/glass=1000) attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' @@ -400,7 +399,6 @@ light_range = 1 light_color = LIGHT_COLOR_GREEN light_power = 0.2 //Barely glows on low power - demolition_mod = 1.5 // lasers are good at cutting metal sharpness = SHARP_EDGED diff --git a/code/modules/swarmers/swarmer.dm b/code/modules/swarmers/swarmer.dm index 2a7afaa99109..fdfad769000b 100644 --- a/code/modules/swarmers/swarmer.dm +++ b/code/modules/swarmers/swarmer.dm @@ -96,13 +96,12 @@ . = ..() . += "Resources: [resources]" -/mob/living/simple_animal/hostile/swarmer/emp_act(severity) +/mob/living/simple_animal/hostile/swarmer/emp_act() . = ..() if(. & EMP_PROTECT_SELF) return - var/emp_damage = severity/EMP_HEAVY - if(health > emp_damage) - adjustHealth(health - emp_damage) + if(health > 1) + adjustHealth(health-1) else death() diff --git a/html/changelog.html b/html/changelog.html index 74af3e3b611a..14dbeb237076 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,49 +57,6 @@ -->
    -

    03 December 2023

    -

    cark updated:

    -
      -
    • fixes missing floor in airlock on donut
    • -
    -

    itseasytosee, sapphicoverload updated:

    -
      -
    • some items and projectiles are now better or worse than others at destroying things
    • -
    • chat messages from hitting an object now tell whether you can damage it
    • -
    • fixed machines/structures/etc not caring about armor penetration when hit by a melee weapon
    • -
    • fixed cannonballs not doing any damage to mobs
    • -
    -

    Moltijoe updated:

    -
      -
    • Sometimes fixes feed ability sometimes breaking
    • -
    • Gangrel transformation ability now shows the radial menu before the 10 second do_after
    • -
    • Fixes gangrel transformation ability sometimes deleting itself without ever being used
    • -
    • Fixes gangrel werewolf transformation being eradicated from the timeline by tattax
    • -
    -

    SapphicOverload updated:

    -
      -
    • fixed ED-209 not being affected by heavy EMPs
    • -
    • fixed leg implants not being affected by EMPs at all
    • -
    • fixed cybernetic ears causing longer knockdown times on light EMPs instead of the other way around
    • -
    • fixed nanite heart killing you instantly on EMP regardless of whether or not it kills your nanites
    • -
    • HoS gun now shoots ion carbine projectiles instead of its own redundant projectile type
    • -
    • mech ion cannon has 1.5x stronger EMPs than the ion rifle
    • -
    • syndicate EMP bomb has 2.5x stronger EMPs than standard EMP grenades
    • -
    • reworks EMPs to allow any severity, which now decreases with distance
    • -
    - -

    02 December 2023

    -

    Moltijoe updated:

    -
      -
    • No more infinitely duplicating hulk DAN
    • -
    • Hulk now occasionally says the brain damage hulk lines
    • -
    -

    SapphicOverload updated:

    -
      -
    • fixed runtime error when passive vents encounter zero temperature or zero volume
    • -
    • fixed abandoned crates having a 2% chance to cause runtime errors when initialized
    • -
    -

    01 December 2023

    Twaticus, Imaginos16, Cark updated:

      @@ -2140,6 +2097,92 @@

      warface1234455 updated:

      • Replaces old pda with modern pda in pda box
      + +

      03 September 2023

      +

      MajManatee updated:

      +
        +
      • The engineering vendor now has one compressed matter per RCD instead of 3/5
      • +
      +

      Moltijoe updated:

      +
        +
      • Preternis Liquidator now needs to actually do the combo
      • +
      +

      SapphicOverload updated:

      +
        +
      • necromancy no longer works on mindshielded people unless they're on a persuasion rack
      • +
      • fixed x-ray bolts causing toxin damage to rad-immune species when embedded
      • +
      • preternis now slow down and suffocate when low on charge instead of just instantly dropping dead when they hit zero
      • +
      • liquid electricity can now actually charge species that run on electricity
      • +
      • radiation charges ethereals now
      • +
      • preternis, ethereal, and IPC charging have been refactored, please report any bugs you find
      • +
      +

      warface1234455 updated:

      +
        +
      • Give the gas analyzer ability to scan turf next to the user
      • +
      + +

      02 September 2023

      +

      @cuackles, @SapphicOverload updated:

      +
        +
      • adds pride jackets to hacked clothing vendors
      • +
      • pride jackets
      • +
      +

      ArcaneMusic, Ktlwjec updated:

      +
        +
      • BBQ sauce, made with 1u ash, 1u tomato juice, 3u saline glucose, 1u black pepper.
      • +
      • BBQ ribs, made with 2 rods, 5u bbq sauce, 2 steaks.
      • +
      • 2 BBQ sauce packets in the kitchen dinnerware vendor.
      • +
      +

      cark updated:

      +
        +
      • kills under-window firelocks across all maps, making them consistent with each other and themselves.
      • +
      +

      JamieD1 updated:

      +
        +
      • Fixes shitty Pranksimov Laws
      • +
      +

      Marmio64 updated:

      +
        +
      • Hecata bloodsuckers take 3x as long (18 seconds) to necromance mindshielded non vassals.
      • +
      • Syndicate derelict engis can use their c20r
      • +
      +

      Moltijoe updated:

      +
        +
      • Holy medbots have antimagic and also inject holy water
      • +
      • Holy revival rite gives 2 minutes of antimagic
      • +
      • Getting the adrenaline buff from damage gives a mood boost
      • +
      • Worldbreaker tweaks
      • +
      • throw only does damage upon collision, not upon throwing
      • +
      • grabbing now stuns for a very short time to allow for aiming
      • +
      • pummel does 20 damage instead of 15
      • +
      • pummel has regular attack cooldown instead of slower (preterni no longer attack slower)
      • +
      • plates have 25 health instead of 15
      • +
      • can only have 3 plates over armour cap instead of 5
      • +
      • plates take 1/4 damage from non brute and burn rather than 1/3
      • +
      • plates give more slowdown
      • +
      • leap cooldown no longer scales directly with number of plates, instead just takes 1 second longer if heavy
      • +
      • leap speed now directly scales with movespeed (meaning outside sources of movespeed will increase it)
      • +
      • leap cooldown only starts once you land, rather than when you start jumping
      • +
      • now gives softcrit immunity
      • +
      • no longer gives damage slowdown resistance
      • +
      • never takes damage from being thrown into a wall
      • +
      • attacks can now hurt mechs
      • +
      +

      Runian updated:

      +
        +
      • A new upgrade for medical cyborgs that gives them a gripper that lets them hold bottles, beakers, and blood bags.
      • +
      • Cyborg gripper now copy overlays for the held items.
      • +
      +

      SomeguyManperson updated:

      +
        +
      • holy light chaplains no longer gain favor from bible bashing people, instead spending favor to heal
      • +
      • holy light now provides a passive buff to people who ingest holy water, increasing incoming healing by 20%, doubled in the chapel. Bonus healing applied by this effect is also turned into favor. Bible bashing someone with this buff has a massively reduced favor cost, but does not heal significantly more than the default.
      • +
      +

      adamsong updated:

      +
        +
      • fixed a few bus buttons being available to moderators
      • +
      • Admins can now view their own permissions
      • +
    GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index b4c1c678ae16..b678b4a6f0de 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -42454,42 +42454,3 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: You can now point while handcuffed cowbot92: - rscadd: Adds new bar signs -2023-12-02: - Moltijoe: - - bugfix: No more infinitely duplicating hulk DAN - - tweak: Hulk now occasionally says the brain damage hulk lines - SapphicOverload: - - bugfix: fixed runtime error when passive vents encounter zero temperature or zero - volume - - bugfix: fixed abandoned crates having a 2% chance to cause runtime errors when - initialized -2023-12-03: - ' cark': - - mapping: fixes missing floor in airlock on donut - ' itseasytosee, sapphicoverload': - - tweak: some items and projectiles are now better or worse than others at destroying - things - - tweak: chat messages from hitting an object now tell whether you can damage it - - bugfix: fixed machines/structures/etc not caring about armor penetration when - hit by a melee weapon - - bugfix: fixed cannonballs not doing any damage to mobs - Moltijoe: - - bugfix: Sometimes fixes feed ability sometimes breaking - - tweak: Gangrel transformation ability now shows the radial menu before the 10 - second do_after - - bugfix: Fixes gangrel transformation ability sometimes deleting itself without - ever being used - - bugfix: Fixes gangrel werewolf transformation being eradicated from the timeline - by tattax - SapphicOverload: - - bugfix: fixed ED-209 not being affected by heavy EMPs - - bugfix: fixed leg implants not being affected by EMPs at all - - bugfix: fixed cybernetic ears causing longer knockdown times on light EMPs instead - of the other way around - - bugfix: fixed nanite heart killing you instantly on EMP regardless of whether - or not it kills your nanites - - tweak: HoS gun now shoots ion carbine projectiles instead of its own redundant - projectile type - - tweak: mech ion cannon has 1.5x stronger EMPs than the ion rifle - - tweak: syndicate EMP bomb has 2.5x stronger EMPs than standard EMP grenades - - experiment: reworks EMPs to allow any severity, which now decreases with distance diff --git a/yogstation/code/game/gamemodes/gangs/dominator.dm b/yogstation/code/game/gamemodes/gangs/dominator.dm index 6faa286dc4c5..d4b82ec6c01c 100644 --- a/yogstation/code/game/gamemodes/gangs/dominator.dm +++ b/yogstation/code/game/gamemodes/gangs/dominator.dm @@ -45,7 +45,7 @@ return ..() /obj/machinery/dominator/emp_act(severity) - gang.domination_time += 3 * severity + gang.domination_time += 30 ..() /obj/machinery/dominator/hulk_damage() diff --git a/yogstation/code/game/objects/items/wielded/sledgehammer.dm b/yogstation/code/game/objects/items/wielded/sledgehammer.dm index 9101954a7a3d..fccce03df081 100644 --- a/yogstation/code/game/objects/items/wielded/sledgehammer.dm +++ b/yogstation/code/game/objects/items/wielded/sledgehammer.dm @@ -14,7 +14,6 @@ throwforce = 18 throw_range = 3 /// Doesn't throw very far sharpness = SHARP_NONE - demolition_mod = 3 // BREAK THINGS armour_penetration = -20 hitsound = 'sound/weapons/smash.ogg' /// Hitsound when thrown at someone attack_verb = list("attacked", "hit", "struck", "bludgeoned", "bashed", "smashed") @@ -55,6 +54,8 @@ var/obj/structure/S = target if(istype(S, /obj/structure/window)) // Sledgehammer really good at smashing windows. 2-7 hits to kill a window S.take_damage(S.max_integrity/2, BRUTE, MELEE, FALSE, null, armour_penetration) + else // Sledgehammer can kill airlocks in 17-23 hits, against most other things it's almost as good as a fireaxe + S.take_damage(force*2, BRUTE, MELEE, FALSE, null, armour_penetration) playsound(src, 'sound/effects/bang.ogg', 50, 1) /obj/item/melee/sledgehammer/throw_at(atom/target, range, speed, mob/thrower, spin, diagonals_first, datum/callback/callback, force, quickstart) diff --git a/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm b/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm index b5e709874d34..657c81b629db 100644 --- a/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm +++ b/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm @@ -11,7 +11,6 @@ desc = "A relic sledgehammer with charge packs wired to two blast pads on its head. \ While wielded in two hands, the user can charge a massive blow that will shatter construction and hurl bodies." force = 4 //It's heavy as hell - demolition_mod = 3 // it's a big hammer, what do you expect armour_penetration = 50 //Designed for shattering walls in a single blow, I don't think it cares much about armor throwforce = 18 attack_verb = list("attacked", "hit", "struck", "bludgeoned", "bashed", "smashed") diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm index 590e174bc205..0b65f1bc8ab4 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm @@ -113,5 +113,5 @@ /obj/item/organ/stomach/cell/preternis/emp_act(severity) owner.vomit(stun=FALSE) // fuck that - owner.adjust_disgust(2*severity) + owner.adjust_disgust(20) to_chat(owner, "You feel violently ill as the EMP causes your stomach to kick into high gear.") diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 867ae2aa24df..22d0b677bcca 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -3,7 +3,7 @@ plural_form = "Preterni" id = "preternis" changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT - inherent_traits = list(TRAIT_POWERHUNGRY, TRAIT_RADIMMUNE, TRAIT_MEDICALIGNORE) + inherent_traits = list(TRAIT_POWERHUNGRY, TRAIT_RADIMMUNE, TRAIT_MEDICALIGNORE, TRAIT_FARADAYCAGE) //Faraday cage reduces incoming EMP severity by one level species_traits = list(DYNCOLORS, EYECOLOR, HAIR, LIPS, AGENDER, NOHUSK, DIGITIGRADE)//they're fleshy metal machines, they are efficient, and the outside is metal, no getting husked inherent_biotypes = MOB_ORGANIC|MOB_ROBOTIC|MOB_HUMANOID sexes = FALSE //they're basically ken dolls, come straight out of a printer @@ -59,7 +59,6 @@ for (var/obj/item/bodypart/BP in C.bodyparts) BP.render_like_organic = TRUE // Makes limbs render like organic limbs instead of augmented limbs, check bodyparts.dm - BP.emp_reduction = EMP_LIGHT BP.burn_reduction = 2 BP.brute_reduction = 1 if(BP.body_zone == BODY_ZONE_CHEST) @@ -80,7 +79,6 @@ for (var/V in C.bodyparts) var/obj/item/bodypart/BP = V BP.change_bodypart_status(ORGAN_ORGANIC,FALSE,TRUE) - BP.emp_reduction = initial(BP.emp_reduction) BP.burn_reduction = initial(BP.burn_reduction) BP.brute_reduction = initial(BP.brute_reduction) @@ -296,12 +294,6 @@ var/list/to_add = list() to_add += list( - list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "thunderstorm", //if we update font awesome, please swap to bolt-slash - SPECIES_PERK_NAME = "Faraday \"Skin\"", - SPECIES_PERK_DESC = "Preterni have an outer plasteel shell that can block low-intensity EM interference.", - ), list( SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, SPECIES_PERK_ICON = "cookie-bite", diff --git a/yogstation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm b/yogstation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm index ef0adf37aacb..20c405f410d9 100644 --- a/yogstation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm +++ b/yogstation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm @@ -356,7 +356,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) manifested = TRUE Manifest() if(!eating) - empulse(src, EMP_HEAVY, 6) + empulse(src, 6, 6) addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living/simple_animal/hostile/floor_cluwne, Grab), H), 50, TIMER_OVERRIDE|TIMER_UNIQUE) for(var/turf/open/O in range(src, 6)) O.MakeSlippery(TURF_WET_LUBE, 30) diff --git a/yogstation/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/yogstation/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index 5661d84b28be..557b9bdb4b4f 100644 --- a/yogstation/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/yogstation/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -214,7 +214,7 @@ Difficulty: Insanely Hard else if(prob(5)) //EMP blast spellscast++ visible_message(span_cult("\The [src] disrupts nearby electrical equipment!")) - empulse(get_turf(src), EMP_HEAVY) + empulse(get_turf(src), 5, 2, 0) else if(prob(5) && melee_damage_type == BRUTE && !special_attacks) //elemental attacks spellscast++ diff --git a/yogstation/code/modules/surgery/organs/heart.dm b/yogstation/code/modules/surgery/organs/heart.dm index da98967b4da4..263fc0c63c2c 100644 --- a/yogstation/code/modules/surgery/organs/heart.dm +++ b/yogstation/code/modules/surgery/organs/heart.dm @@ -6,6 +6,12 @@ compatible_biotypes = ALL_BIOTYPES var/nanite_boost = 1 +/obj/item/organ/heart/nanite/emp_act() + . = ..() + if(!owner || . & EMP_PROTECT_SELF) + return . + Stop() + /obj/item/organ/heart/nanite/on_life() . = ..() if(owner)//makes nanites tick on every life tick, only about 33% speed increase From 56f1434a9af2266db0836428bbb8a111e033fbee Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Sun, 3 Dec 2023 23:30:45 -0500 Subject: [PATCH 100/281] this doesn't need to be redefined I guess --- code/game/machinery/computer/camera.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 8cc1e1fcbf36..16fe1056980c 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -1,5 +1,3 @@ -#define DEFAULT_MAP_SIZE 15 - /obj/machinery/computer/security name = "security camera console" desc = "Used to access the various cameras on the station." From 363820f7063caa550d9c89d877137d6c686219f2 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Sun, 3 Dec 2023 23:44:25 -0500 Subject: [PATCH 101/281] no we need this totally --- code/game/machinery/computer/camera.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 16fe1056980c..8cc1e1fcbf36 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -1,3 +1,5 @@ +#define DEFAULT_MAP_SIZE 15 + /obj/machinery/computer/security name = "security camera console" desc = "Used to access the various cameras on the station." From 778ea63a4676de91cb03e304c85fa6284b97eb0c Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Sun, 3 Dec 2023 21:25:42 -0800 Subject: [PATCH 102/281] a familiar pain --- code/__DEFINES/cameranets.dm | 4 + code/__DEFINES/turfs.dm | 14 +++ code/__HELPERS/game.dm | 13 -- code/__HELPERS/unsorted.dm | 1 - code/_onclick/click.dm | 10 ++ code/_onclick/hud/map_popups.dm | 19 ++- code/_onclick/hud/picture_in_picture.dm | 15 ++- code/_onclick/hud/screen_objects.dm | 2 +- code/game/machinery/camera/camera.dm | 44 +++++-- code/game/machinery/computer/_computer.dm | 2 +- code/game/machinery/computer/camera.dm | 6 +- .../living/silicon/ai/freelook/cameranet.dm | 113 +++++++++++------- .../mob/living/silicon/ai/freelook/chunk.dm | 50 ++++---- .../tgui/interfaces/CameraConsole.tsx | 72 ++++++----- yogstation.dme | 1 + 15 files changed, 222 insertions(+), 144 deletions(-) create mode 100644 code/__DEFINES/cameranets.dm diff --git a/code/__DEFINES/cameranets.dm b/code/__DEFINES/cameranets.dm new file mode 100644 index 000000000000..e2da39997e38 --- /dev/null +++ b/code/__DEFINES/cameranets.dm @@ -0,0 +1,4 @@ +/// We only want chunk sizes that are to the power of 2. E.g: 2, 4, 8, 16, etc.. +#define CHUNK_SIZE 16 +/// Takes a position, transforms it into a chunk bounded position. Indexes at 1 so it'll land on actual turfs always +#define GET_CHUNK_COORD(v) (max((FLOOR(v, CHUNK_SIZE)), 1)) diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 9f54a7fcfbb9..303384684171 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -17,3 +17,17 @@ #define UNDERFLOOR_VISIBLE 1 /// The pipes, disposals, and wires are visible and can be interacted with #define UNDERFLOOR_INTERACTABLE 2 + +#define TURF_FROM_COORDS_LIST(List) (locate(List[1], List[2], List[3])) +/// Returns a list of turfs in the rectangle specified by BOTTOM LEFT corner and height/width, checks for being outside the world border for you +#define CORNER_BLOCK(corner, width, height) CORNER_BLOCK_OFFSET(corner, width, height, 0, 0) + +/// Returns a list of turfs similar to CORNER_BLOCK but with offsets +#define CORNER_BLOCK_OFFSET(corner, width, height, offset_x, offset_y) ((block(locate(corner.x + offset_x, corner.y + offset_y, corner.z), locate(min(corner.x + (width - 1) + offset_x, world.maxx), min(corner.y + (height - 1) + offset_y, world.maxy), corner.z)))) + +/// Returns an outline (neighboring turfs) of the given block +#define CORNER_OUTLINE(corner, width, height) ( \ + CORNER_BLOCK_OFFSET(corner, width + 2, 1, -1, -1) + \ + CORNER_BLOCK_OFFSET(corner, width + 2, 1, -1, height) + \ + CORNER_BLOCK_OFFSET(corner, 1, height, -1, 0) + \ + CORNER_BLOCK_OFFSET(corner, 1, height, width, 0)) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 67751fd75f4b..54be14a5a6de 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -8,19 +8,6 @@ #define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL)) #define CULT_POLL_WAIT 2400 -/// Returns a list of turfs similar to CORNER_BLOCK but with offsets -#define CORNER_BLOCK_OFFSET(corner, width, height, offset_x, offset_y) ( \ - (block(locate(corner.x + offset_x, corner.y + offset_y, corner.z), \ - locate(min(corner.x + (width - 1) + offset_x, world.maxx), \ - min(corner.y + (height - 1) + offset_y, world.maxy), corner.z)))) - -/// Returns an outline (neighboring turfs) of the given block -#define CORNER_OUTLINE(corner, width, height) ( \ - CORNER_BLOCK_OFFSET(corner, width + 2, 1, -1, -1) + \ - CORNER_BLOCK_OFFSET(corner, width + 2, 1, -1, height) + \ - CORNER_BLOCK_OFFSET(corner, 1, height, -1, 0) + \ - CORNER_BLOCK_OFFSET(corner, 1, height, width, 0)) - /proc/get_area_name(atom/X, format_text = FALSE, is_sensor = FALSE) var/area/A = isarea(X) ? X : get_area(X) if(!A) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 742c86dfae50..cb848000c5f9 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1485,4 +1485,3 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) set waitfor = FALSE return call(source, proctype)(arglist(arguments)) -#define TURF_FROM_COORDS_LIST(List) (locate(List[1], List[2], List[3])) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index f4bd68cd15e9..40a08fb1a167 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -474,6 +474,16 @@ M.Scale(px/sx, py/sy) transform = M +/atom/movable/screen/click_catcher/Initialize(mapload, datum/hud/hud_owner) + . = ..() + RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(offset_increased)) + offset_increased(SSmapping, 0, SSmapping.max_plane_offset) + +// Draw to the lowest plane level offered +/atom/movable/screen/click_catcher/proc/offset_increased(datum/source, old_offset, new_offset) + SIGNAL_HANDLER + SET_PLANE_W_SCALAR(src, initial(plane), new_offset) + /atom/movable/screen/click_catcher/Click(location, control, params) var/list/modifiers = params2list(params) if(modifiers["middle"] && iscarbon(usr)) diff --git a/code/_onclick/hud/map_popups.dm b/code/_onclick/hud/map_popups.dm index 7f3997ecbd67..a3b5699c8484 100644 --- a/code/_onclick/hud/map_popups.dm +++ b/code/_onclick/hud/map_popups.dm @@ -44,21 +44,18 @@ screen_maps[screen_obj.assigned_map] = list() // NOTE: Possibly an expensive operation var/list/screen_map = screen_maps[screen_obj.assigned_map] - if(!screen_map.Find(screen_obj)) - screen_map += screen_obj + screen_map |= screen_obj + screen |= screen_obj /** * Clears the map of registered screen objects. - * - * Not really needed most of the time, as the client's screen list gets reset - * on relog. any of the buttons are going to get caught by garbage collection - * anyway. they're effectively qdel'd. */ /client/proc/clear_map(map_name) - if(!map_name || !(map_name in screen_maps)) + if(!map_name || !screen_maps[map_name]) return FALSE for(var/atom/movable/screen/screen_obj in screen_maps[map_name]) screen_maps[map_name] -= screen_obj + screen -= screen_obj if(screen_obj.del_on_map_removal) qdel(screen_obj) screen_maps -= map_name @@ -78,9 +75,10 @@ * * Returns a map name. */ -/client/proc/create_popup(name, ratiox = 100, ratioy = 100) +/client/proc/create_popup(name, title, ratiox = 100, ratioy = 100) winclone(src, "popupwindow", name) var/list/winparams = list() + winparams["title"] = title winparams["size"] = "[ratiox]x[ratioy]" winparams["on-close"] = "handle-popup-close [name]" winset(src, "[name]", list2params(winparams)) @@ -103,13 +101,13 @@ * Width and height are multiplied by 64 by default. */ /client/proc/setup_popup(popup_name, width = 9, height = 9, \ - tilesize = 2, bg_icon) + tilesize = 2, title, bg_icon) if(!popup_name) return clear_map("[popup_name]_map") var/x_value = world.icon_size * tilesize * width var/y_value = world.icon_size * tilesize * height - var/map_name = create_popup(popup_name, x_value, y_value) + var/map_name = create_popup(popup_name, title, x_value, y_value) var/atom/movable/screen/background/background = new background.assigned_map = map_name @@ -133,3 +131,4 @@ /client/verb/handle_popup_close(window_id as text) set hidden = TRUE clear_map("[window_id]_map") + SEND_SIGNAL(src, COMSIG_POPUP_CLEARED, window_id) diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index 354a6ed54630..dbf4e0af5310 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -12,11 +12,16 @@ var/atom/movable/screen/component_button/button_shrink var/mutable_appearance/standard_background - var/const/max_dimensions = 10 -/atom/movable/screen/movable/pic_in_pic/Initialize(mapload) +/atom/movable/screen/movable/pic_in_pic/Initialize(mapload, datum/hud/hud_owner) . = ..() make_backgrounds() + RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(multiz_offset_increase)) + multiz_offset_increase(SSmapping) + +/atom/movable/screen/movable/pic_in_pic/proc/multiz_offset_increase(datum/source) + SIGNAL_HANDLER + SET_PLANE_W_SCALAR(src, initial(plane), SSmapping.max_plane_offset) /atom/movable/screen/movable/pic_in_pic/Destroy() for(var/C in shown_to) @@ -101,9 +106,11 @@ standard_background.transform = M add_overlay(standard_background) +// maximum number of dimensions is 10 + /atom/movable/screen/movable/pic_in_pic/proc/set_view_size(width, height, do_refresh = TRUE) - width = clamp(width, 0, max_dimensions) - height = clamp(height, 0, max_dimensions) + width = clamp(width, 0, 10) + height = clamp(height, 0, 10) src.width = width src.height = height diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 5e81424b01d5..a4f735a9d2a5 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -12,7 +12,7 @@ plane = HUD_PLANE animate_movement = SLIDE_STEPS speech_span = SPAN_ROBOT - vis_flags = VIS_INHERIT_PLANE + //vis_flags = VIS_INHERIT_PLANE appearance_flags = APPEARANCE_UI /// A reference to the object in the slot. Grabs or items, generally. var/obj/master = null diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 0cd4b1aa2516..24ba9e2f4cc2 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -365,7 +365,7 @@ else icon_state = "[xray_module][default_camera_icon][in_use_lights ? "_in_use" : ""]" -/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = 1) +/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = TRUE) status = !status if(can_use()) GLOB.cameranet.addCamera(src) @@ -379,12 +379,15 @@ GLOB.cameranet.removeCamera(src) if (isarea(myarea)) LAZYREMOVE(myarea.cameras, src) - GLOB.cameranet.updateChunk(x, y, z) + // We are not guarenteed that the camera will be on a turf. account for that + var/turf/our_turf = get_turf(src) + GLOB.cameranet.updateChunk(our_turf.x, our_turf.y, our_turf.z) var/change_msg = "deactivates" if(status) change_msg = "reactivates" triggerCameraAlarm() - addtimer(CALLBACK(src, PROC_REF(cancelCameraAlarm)), 100) + if(!QDELETED(src)) //We'll be doing it anyway in destroy + addtimer(CALLBACK(src, PROC_REF(cancelCameraAlarm)), 100) if(displaymessage) if(user) visible_message(span_danger("[user] [change_msg] [src]!")) @@ -393,16 +396,16 @@ visible_message(span_danger("\The [src] [change_msg]!")) playsound(src, 'sound/items/wirecutter.ogg', 100, TRUE) - update_appearance(UPDATE_ICON) //update Initialize(mapload) if you remove this. + update_appearance() //update Initialize() if you remove this. // now disconnect anyone using the camera //Apparently, this will disconnect anyone even if the camera was re-activated. //I guess that doesn't matter since they can't use it anyway? for(var/mob/O in GLOB.player_list) - if (O.client && O.client.eye == src) + if (O.client?.eye == src) O.unset_machine() O.reset_perspective(null) - to_chat(O, "The screen bursts into static.") + to_chat(O, span_warning("The screen bursts into static!")) /obj/machinery/camera/proc/triggerCameraAlarm() alarm_on = TRUE @@ -424,10 +427,32 @@ /obj/machinery/camera/proc/can_see() var/list/see = null var/turf/pos = get_turf(src) + var/turf/directly_above = GET_TURF_ABOVE(pos) + var/check_lower = pos != get_lowest_turf(pos) + var/check_higher = directly_above && istransparentturf(directly_above) && (pos != get_highest_turf(pos)) + if(isXRay()) see = range(view_range, pos) else see = get_hear(view_range, pos) + if(check_lower || check_higher) + // Haha datum var access KILL ME + for(var/turf/seen in see) + if(check_lower) + var/turf/visible = seen + while(visible && istransparentturf(visible)) + var/turf/below = GET_TURF_BELOW(visible) + for(var/turf/adjacent in range(1, below)) + see += adjacent + see += adjacent.contents + visible = below + if(check_higher) + var/turf/above = GET_TURF_ABOVE(seen) + while(above && istransparentturf(above)) + for(var/turf/adjacent in range(1, above)) + see += adjacent + see += adjacent.contents + above = GET_TURF_ABOVE(above) return see /atom/proc/auto_turn() @@ -469,8 +494,9 @@ user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2) /obj/machinery/camera/update_remote_sight(mob/living/user) - user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras + user.set_invis_see(SEE_INVISIBLE_LIVING) //can't see ghosts through cameras if(isXRay()) - user.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) - + user.add_sight(SEE_TURFS|SEE_MOBS|SEE_OBJS) + else + user.clear_sight(SEE_TURFS|SEE_MOBS|SEE_OBJS) return 1 diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index bb3317a61ac4..9c45e97fe5bc 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -180,6 +180,6 @@ /obj/machinery/computer/ui_interact(mob/user, datum/tgui/ui) - SHOULD_CALL_PARENT(TRUE) + //SHOULD_CALL_PARENT(TRUE) . = ..() // update_use_power(ACTIVE_POWER_USE) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 8cc1e1fcbf36..859c0bb58679 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -131,10 +131,8 @@ return if(action == "switch_camera") - var/c_tag = params["name"] - var/list/cameras = get_available_cameras() - var/obj/machinery/camera/C = cameras[c_tag] - active_camera = C + var/obj/machinery/camera/selected_camera = locate(params["camera"]) in GLOB.cameranet.cameras + active_camera = selected_camera playsound(src, get_sfx("terminal_type"), 25, FALSE) if(isnull(active_camera)) diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index cb61915a19cf..cf4f9fca9fcb 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -2,8 +2,6 @@ // // The datum containing all the chunks. -#define CHUNK_SIZE 16 // Only chunk sizes that are to the power of 2. E.g: 2, 4, 8, 16, etc.. - GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) /datum/cameranet @@ -11,12 +9,11 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) var/name = "Camera Net" /// The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). - var/list/cameras = list() + var/list/obj/machinery/camera/cameras = list() /// The chunks of the map, mapping the areas that the cameras can see. var/list/chunks = list() var/ready = 0 - // The object used for the clickable stat() button. - var/obj/effect/statclick/statclick + /// List of images cloned by all chunk static images put onto turfs cameras cant see /// Indexed by the plane offset to use var/list/image/obscured_images @@ -40,21 +37,26 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) /// Checks if a chunk has been Generated in x, y, z. /datum/cameranet/proc/chunkGenerated(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) + if(GET_LOWEST_STACK_OFFSET(z) != 0) + var/turf/lowest = get_lowest_turf(locate(x, y, z)) + return chunks["[x],[y],[lowest.z]"] + return chunks["[x],[y],[z]"] // Returns the chunk in the x, y, z. // If there is no chunk, it creates a new chunk and returns that. /datum/cameranet/proc/getCameraChunk(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) - var/key = "[x],[y],[z]" + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) + var/turf/lowest = get_lowest_turf(locate(x, y, z)) + var/key = "[x],[y],[lowest.z]" . = chunks[key] if(!.) - chunks[key] = . = new /datum/camerachunk(x, y, z) + chunks[key] = . = new /datum/camerachunk(x, y, lowest.z) -/// Updates what the ai_eye can see. It is recommended you use this when the ai_eye moves or it's location is set. +/// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. /datum/cameranet/proc/visibility(list/moved_eyes, client/C, list/other_eyes, use_static = TRUE) if(!islist(moved_eyes)) moved_eyes = moved_eyes ? list(moved_eyes) : list() @@ -65,21 +67,18 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/mob/camera/aiEye/eye as anything in moved_eyes) var/list/visibleChunks = list() + //Get the eye's turf in case it's located in an object like a mecha + var/turf/eye_turf = get_turf(eye) if(eye.loc) - var/x_value = eye.x - var/y_value = eye.y - var/z_value = eye.z - // 0xf = 15 var/static_range = eye.static_visibility_range - var/x1 = max(0, x_value - static_range) & ~(CHUNK_SIZE - 1) - var/y1 = max(0, y_value - static_range) & ~(CHUNK_SIZE - 1) - var/x2 = min(world.maxx, x_value + static_range) & ~(CHUNK_SIZE - 1) - var/y2 = min(world.maxy, y_value + static_range) & ~(CHUNK_SIZE - 1) - + var/x1 = max(1, eye_turf.x - static_range) + var/y1 = max(1, eye_turf.y - static_range) + var/x2 = min(world.maxx, eye_turf.x + static_range) + var/y2 = min(world.maxy, eye_turf.y + static_range) for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) - visibleChunks |= getCameraChunk(x, y, z_value) + visibleChunks |= getCameraChunk(x, y, eye_turf.z) var/list/remove = eye.visibleCameraChunks - visibleChunks var/list/add = visibleChunks - eye.visibleCameraChunks @@ -90,7 +89,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/datum/camerachunk/chunk as anything in add) chunk.add(eye) -/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. +/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. /datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) if(!SSticker || (opacity_check && !A.opacity)) return @@ -111,10 +110,14 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) if(c.can_use()) majorChunkChange(c, 1) -/// Used for Cyborg cameras. Since portable cameras can be in ANY chunk. -/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/c) - if(c.can_use()) - majorChunkChange(c, 1) +/** + * Used for Cyborg/mecha cameras. Since portable cameras can be in ANY chunk. + * update_delay_buffer is passed all the way to hasChanged() from their camera updates on movement + * to change the time between static updates. +*/ +/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/updating_camera, update_delay_buffer) + if(updating_camera.can_use()) + majorChunkChange(updating_camera, 1, update_delay_buffer) /** * Never access this proc directly!!!! @@ -122,37 +125,52 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) * It will also add the atom to the cameras list if you set the choice to 1. * Setting the choice to 0 will remove the camera from the chunks. * If you want to update the chunks around an object, without adding/removing a camera, use choice 2. + * update_delay_buffer is passed all the way to hasChanged() from portable camera updates on movement + * to change the time between static updates. */ -/datum/cameranet/proc/majorChunkChange(atom/c, choice) - if(!c) - return +/datum/cameranet/proc/majorChunkChange(atom/c, choice, update_delay_buffer) + if(QDELETED(c) && choice == 1) + CRASH("Tried to add a qdeleting camera to the net") var/turf/T = get_turf(c) if(T) - var/x1 = max(0, T.x - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/y1 = max(0, T.y - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + var/x1 = max(1, T.x - (CHUNK_SIZE / 2)) + var/y1 = max(1, T.y - (CHUNK_SIZE / 2)) + var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) + var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) var/datum/camerachunk/chunk = chunkGenerated(x, y, T.z) if(chunk) if(choice == 0) // Remove the camera. - chunk.cameras -= c + chunk.cameras["[T.z]"] -= c else if(choice == 1) // You can't have the same camera in the list twice. - chunk.cameras |= c - chunk.hasChanged() + chunk.cameras["[T.z]"] |= c + chunk.hasChanged(update_delay_buffer = update_delay_buffer) + +/// A faster, turf only version of [/datum/cameranet/proc/majorChunkChange] +/// For use in sensitive code, be careful with it +/datum/cameranet/proc/bareMajorChunkChange(turf/changed) + var/x1 = max(1, changed.x - (CHUNK_SIZE / 2)) + var/y1 = max(1, changed.y - (CHUNK_SIZE / 2)) + var/x2 = min(world.maxx, changed.x + (CHUNK_SIZE / 2)) + var/y2 = min(world.maxy, changed.y + (CHUNK_SIZE / 2)) + for(var/x = x1; x <= x2; x += CHUNK_SIZE) + for(var/y = y1; y <= y2; y += CHUNK_SIZE) + var/datum/camerachunk/chunk = chunkGenerated(x, y, changed.z) + chunk?.hasChanged() /// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. /datum/cameranet/proc/checkCameraVis(mob/living/target) var/turf/position = get_turf(target) + if(!position) + return return checkTurfVis(position) - /datum/cameranet/proc/checkTurfVis(turf/position) - var/datum/camerachunk/chunk = chunkGenerated(position.x, position.y, position.z) + var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) if(chunk) if(chunk.changed) chunk.hasChanged(1) // Update now, no matter if it's visible or not. @@ -160,22 +178,25 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) return TRUE return FALSE -/datum/cameranet/proc/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - - stat(name, statclick.update("Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]")) +/datum/cameranet/proc/getTurfVis(turf/position) + RETURN_TYPE(/datum/camerachunk) + var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) + if(!chunk) + return FALSE + if(chunk.changed) + chunk.hasChanged(1) // Update now, no matter if it's visible or not. + if(chunk.visibleTurfs[position]) + return chunk /obj/effect/overlay/camera_static name = "static" icon = null icon_state = null anchored = TRUE // should only appear in vis_contents, but to be safe - appearance_flags = RESET_TRANSFORM | TILE_BOUND | RESET_COLOR + appearance_flags = RESET_TRANSFORM | TILE_BOUND | LONG_GLIDE // this combination makes the static block clicks to everything below it, // without appearing in the right-click menu for non-AI clients mouse_opacity = MOUSE_OPACITY_ICON invisibility = INVISIBILITY_ABSTRACT - layer = CAMERA_STATIC_LAYER plane = CAMERA_STATIC_PLANE diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index c2178a5be5ba..6b108b586726 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -11,13 +11,13 @@ ///turfs our cameras can see inside our grid var/list/visibleTurfs = list() ///cameras that can see into our grid + ///indexed by the z level of the camera var/list/cameras = list() - ///list of all turfs + ///list of all turfs, associative with that turf's static image + ///turf -> /image var/list/turfs = list() ///camera mobs that can see turfs in our grid var/list/seenby = list() - ///images created to represent obscured turfs - var/list/inactive_static_images = list() ///images currently in use on obscured turfs. var/list/active_static_images = list() @@ -55,15 +55,19 @@ /** * Updates the chunk, makes sure that it doesn't update too much. If the chunk isn't being watched it will * instead be flagged to update the next time an AI Eye moves near it. + * update_delay_buffer is used for cameras that are moving around, which are cyborg inbuilt cameras and + * mecha onboard cameras. This buffer should be usually lower than UPDATE_BUFFER_TIME because + * otherwise a moving camera can run out of its own view before updating static. */ -/datum/camerachunk/proc/hasChanged(update_now = 0) +/datum/camerachunk/proc/hasChanged(update_now = 0, update_delay_buffer = UPDATE_BUFFER_TIME) if(seenby.len || update_now) - addtimer(CALLBACK(src, PROC_REF(update)), UPDATE_BUFFER_TIME, TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(update)), update_delay_buffer, TIMER_UNIQUE) else changed = TRUE /// The actual updating. It gathers the visible turfs from cameras and puts them into the appropiate lists. -/datum/camerachunk/proc/update() +/// Accepts an optional partial_update argument, that blocks any calls out to chunks that could affect us, like above or below +/datum/camerachunk/proc/update(partial_update = FALSE) var/list/updated_visible_turfs = list() for(var/obj/machinery/camera/current_camera as anything in cameras) @@ -91,31 +95,24 @@ client.images -= active_static_images for(var/turf/visible_turf as anything in newly_visible_turfs) - var/image/static_image_to_deallocate = obscuredTurfs[visible_turf] - if(!static_image_to_deallocate) + var/image/static_image = obscuredTurfs[visible_turf] + if(!static_image) continue - static_image_to_deallocate.loc = null - active_static_images -= static_image_to_deallocate - inactive_static_images += static_image_to_deallocate - + active_static_images -= static_image obscuredTurfs -= visible_turf for(var/turf/obscured_turf as anything in newly_obscured_turfs) if(obscuredTurfs[obscured_turf] || istype(obscured_turf, /turf/open/ai_visible)) continue - var/image/static_image_to_allocate = inactive_static_images[length(inactive_static_images)] - if(!static_image_to_allocate) - stack_trace("somehow a camera chunk ran out of static images!") + var/image/static_image = turfs[obscured_turf] + if(!static_image) + stack_trace("somehow a camera chunk used a turf it didn't contain!!") break - obscuredTurfs[obscured_turf] = static_image_to_allocate - static_image_to_allocate.loc = obscured_turf - - inactive_static_images -= static_image_to_allocate - active_static_images += static_image_to_allocate - + obscuredTurfs[obscured_turf] = static_image + active_static_images += static_image visibleTurfs = updated_visible_turfs changed = FALSE @@ -129,8 +126,8 @@ /// Create a new camera chunk, since the chunks are made as they are needed. /datum/camerachunk/New(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) src.x = x src.y = y @@ -144,7 +141,7 @@ turfs[t] = t for(var/turf in turfs)//one for each 16x16 = 256 turfs this camera chunk encompasses - inactive_static_images += new/image(GLOB.cameranet.obscured_images) + active_static_images += new/image(GLOB.cameranet.obscured_images) for(var/obj/machinery/camera/camera as anything in cameras) if(!camera || !camera.can_use()) @@ -155,11 +152,10 @@ visibleTurfs[vis_turf] = vis_turf for(var/turf/obscured_turf as anything in turfs - visibleTurfs) - var/image/new_static = inactive_static_images[inactive_static_images.len] + var/image/new_static = active_static_images[active_static_images.len] new_static.loc = obscured_turf active_static_images += new_static - inactive_static_images -= new_static + active_static_images -= new_static obscuredTurfs[obscured_turf] = new_static #undef UPDATE_BUFFER_TIME -#undef CHUNK_SIZE diff --git a/tgui/packages/tgui/interfaces/CameraConsole.tsx b/tgui/packages/tgui/interfaces/CameraConsole.tsx index 4feb31faaf67..7b898011f7f3 100644 --- a/tgui/packages/tgui/interfaces/CameraConsole.tsx +++ b/tgui/packages/tgui/interfaces/CameraConsole.tsx @@ -7,15 +7,16 @@ import { Button, ByondUi, Input, NoticeBox, Section, Stack } from '../components import { Window } from '../layouts'; type Data = { + activeCamera: Camera & { status: BooleanLike }; + cameras: Camera[]; can_spy: BooleanLike; mapRef: string; - cameras: Camera[]; - activeCamera: Camera & { status: BooleanLike }; network: string[]; }; type Camera = { name: string; + ref: string; }; /** @@ -26,13 +27,30 @@ const prevNextCamera = ( cameras: Camera[], activeCamera: Camera & { status: BooleanLike } ) => { - if (!activeCamera) { + if (!activeCamera || cameras.length < 2) { return []; } - const index = cameras.findIndex( - (camera) => camera?.name === activeCamera.name - ); - return [cameras[index - 1]?.name, cameras[index + 1]?.name]; + + const index = cameras.findIndex((camera) => camera.ref === activeCamera.ref); + + switch (index) { + case -1: // Current camera is not in the list + return [cameras[cameras.length - 1].ref, cameras[0].ref]; + + case 0: // First camera + if (cameras.length === 2) return [cameras[1].ref, cameras[1].ref]; // Only two + + return [cameras[cameras.length - 1].ref, cameras[index + 1].ref]; + + case cameras.length - 1: // Last camera + if (cameras.length === 2) return [cameras[0].ref, cameras[0].ref]; + + return [cameras[index - 1].ref, cameras[0].ref]; + + default: + // Middle camera + return [cameras[index - 1].ref, cameras[index + 1].ref]; + } }; /** @@ -44,15 +62,15 @@ const selectCameras = (cameras: Camera[], searchText = ''): Camera[] => { const testSearch = createSearch(searchText, (camera: Camera) => camera.name); return flow([ - // Null camera filter - filter((camera: Camera) => !!camera?.name), // Optional search term + filter((camera: Camera) => !!camera.name), + // Optional search term searchText && filter(testSearch), // Slightly expensive, but way better than sorting in BYOND - sortBy((camera: Camera) => camera.name), + sortBy((camera: Camera) => camera), ])(cameras); }; -export const CameraConsole = (props, context) => { +export const CameraConsole = (props) => { return ( @@ -62,7 +80,7 @@ export const CameraConsole = (props, context) => { ); }; -export const CameraContent = (props, context) => { +export const CameraContent = (props) => { return ( @@ -98,21 +116,20 @@ const CameraSelector = (props, context) => { // We're not using the component here because performance // would be absolutely abysmal (50+ ms for each re-render).
    act('switch_camera', { - name: camera.name, + camera: camera.ref, }) }> {camera.name} @@ -127,12 +144,11 @@ const CameraSelector = (props, context) => { const CameraControls = (props, context) => { const { act, data } = useBackend(context); const { activeCamera, can_spy, mapRef } = data; - const cameras = selectCameras(data.cameras); + const [searchText] = useLocalState(context, 'searchText', ''); - const [prevCameraName, nextCameraName] = prevNextCamera( - cameras, - activeCamera - ); + const cameras = selectCameras(data.cameras, searchText); + + const [prevCamera, nextCamera] = prevNextCamera(cameras, activeCamera); return (
    @@ -140,7 +156,7 @@ const CameraControls = (props, context) => { - {activeCamera?.name ? ( + {activeCamera?.status ? ( {activeCamera.name} ) : ( No input signal @@ -160,10 +176,10 @@ const CameraControls = (props, context) => {
    GoonStation 13 Development Team diff --git a/yogstation/code/game/gamemodes/gangs/dominator.dm b/yogstation/code/game/gamemodes/gangs/dominator.dm index d4b82ec6c01c..6faa286dc4c5 100644 --- a/yogstation/code/game/gamemodes/gangs/dominator.dm +++ b/yogstation/code/game/gamemodes/gangs/dominator.dm @@ -45,7 +45,7 @@ return ..() /obj/machinery/dominator/emp_act(severity) - gang.domination_time += 30 + gang.domination_time += 3 * severity ..() /obj/machinery/dominator/hulk_damage() diff --git a/yogstation/code/game/objects/items/wielded/sledgehammer.dm b/yogstation/code/game/objects/items/wielded/sledgehammer.dm index fccce03df081..9101954a7a3d 100644 --- a/yogstation/code/game/objects/items/wielded/sledgehammer.dm +++ b/yogstation/code/game/objects/items/wielded/sledgehammer.dm @@ -14,6 +14,7 @@ throwforce = 18 throw_range = 3 /// Doesn't throw very far sharpness = SHARP_NONE + demolition_mod = 3 // BREAK THINGS armour_penetration = -20 hitsound = 'sound/weapons/smash.ogg' /// Hitsound when thrown at someone attack_verb = list("attacked", "hit", "struck", "bludgeoned", "bashed", "smashed") @@ -54,8 +55,6 @@ var/obj/structure/S = target if(istype(S, /obj/structure/window)) // Sledgehammer really good at smashing windows. 2-7 hits to kill a window S.take_damage(S.max_integrity/2, BRUTE, MELEE, FALSE, null, armour_penetration) - else // Sledgehammer can kill airlocks in 17-23 hits, against most other things it's almost as good as a fireaxe - S.take_damage(force*2, BRUTE, MELEE, FALSE, null, armour_penetration) playsound(src, 'sound/effects/bang.ogg', 50, 1) /obj/item/melee/sledgehammer/throw_at(atom/target, range, speed, mob/thrower, spin, diagonals_first, datum/callback/callback, force, quickstart) diff --git a/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm b/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm index 657c81b629db..b5e709874d34 100644 --- a/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm +++ b/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm @@ -11,6 +11,7 @@ desc = "A relic sledgehammer with charge packs wired to two blast pads on its head. \ While wielded in two hands, the user can charge a massive blow that will shatter construction and hurl bodies." force = 4 //It's heavy as hell + demolition_mod = 3 // it's a big hammer, what do you expect armour_penetration = 50 //Designed for shattering walls in a single blow, I don't think it cares much about armor throwforce = 18 attack_verb = list("attacked", "hit", "struck", "bludgeoned", "bashed", "smashed") diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm index 0b65f1bc8ab4..590e174bc205 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm @@ -113,5 +113,5 @@ /obj/item/organ/stomach/cell/preternis/emp_act(severity) owner.vomit(stun=FALSE) // fuck that - owner.adjust_disgust(20) + owner.adjust_disgust(2*severity) to_chat(owner, "You feel violently ill as the EMP causes your stomach to kick into high gear.") diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 22d0b677bcca..867ae2aa24df 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -3,7 +3,7 @@ plural_form = "Preterni" id = "preternis" changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT - inherent_traits = list(TRAIT_POWERHUNGRY, TRAIT_RADIMMUNE, TRAIT_MEDICALIGNORE, TRAIT_FARADAYCAGE) //Faraday cage reduces incoming EMP severity by one level + inherent_traits = list(TRAIT_POWERHUNGRY, TRAIT_RADIMMUNE, TRAIT_MEDICALIGNORE) species_traits = list(DYNCOLORS, EYECOLOR, HAIR, LIPS, AGENDER, NOHUSK, DIGITIGRADE)//they're fleshy metal machines, they are efficient, and the outside is metal, no getting husked inherent_biotypes = MOB_ORGANIC|MOB_ROBOTIC|MOB_HUMANOID sexes = FALSE //they're basically ken dolls, come straight out of a printer @@ -59,6 +59,7 @@ for (var/obj/item/bodypart/BP in C.bodyparts) BP.render_like_organic = TRUE // Makes limbs render like organic limbs instead of augmented limbs, check bodyparts.dm + BP.emp_reduction = EMP_LIGHT BP.burn_reduction = 2 BP.brute_reduction = 1 if(BP.body_zone == BODY_ZONE_CHEST) @@ -79,6 +80,7 @@ for (var/V in C.bodyparts) var/obj/item/bodypart/BP = V BP.change_bodypart_status(ORGAN_ORGANIC,FALSE,TRUE) + BP.emp_reduction = initial(BP.emp_reduction) BP.burn_reduction = initial(BP.burn_reduction) BP.brute_reduction = initial(BP.brute_reduction) @@ -294,6 +296,12 @@ var/list/to_add = list() to_add += list( + list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "thunderstorm", //if we update font awesome, please swap to bolt-slash + SPECIES_PERK_NAME = "Faraday \"Skin\"", + SPECIES_PERK_DESC = "Preterni have an outer plasteel shell that can block low-intensity EM interference.", + ), list( SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, SPECIES_PERK_ICON = "cookie-bite", diff --git a/yogstation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm b/yogstation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm index 1fbbd5669f9a..84648cf40bd2 100644 --- a/yogstation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm +++ b/yogstation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm @@ -356,7 +356,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) manifested = TRUE Manifest() if(!eating) - empulse(src, 6, 6) + empulse(src, EMP_HEAVY, 6) addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living/simple_animal/hostile/floor_cluwne, Grab), H), 50, TIMER_OVERRIDE|TIMER_UNIQUE) for(var/turf/open/O in range(src, 6)) O.MakeSlippery(TURF_WET_LUBE, 30) diff --git a/yogstation/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/yogstation/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index 557b9bdb4b4f..5661d84b28be 100644 --- a/yogstation/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/yogstation/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -214,7 +214,7 @@ Difficulty: Insanely Hard else if(prob(5)) //EMP blast spellscast++ visible_message(span_cult("\The [src] disrupts nearby electrical equipment!")) - empulse(get_turf(src), 5, 2, 0) + empulse(get_turf(src), EMP_HEAVY) else if(prob(5) && melee_damage_type == BRUTE && !special_attacks) //elemental attacks spellscast++ diff --git a/yogstation/code/modules/surgery/organs/heart.dm b/yogstation/code/modules/surgery/organs/heart.dm index 263fc0c63c2c..da98967b4da4 100644 --- a/yogstation/code/modules/surgery/organs/heart.dm +++ b/yogstation/code/modules/surgery/organs/heart.dm @@ -6,12 +6,6 @@ compatible_biotypes = ALL_BIOTYPES var/nanite_boost = 1 -/obj/item/organ/heart/nanite/emp_act() - . = ..() - if(!owner || . & EMP_PROTECT_SELF) - return . - Stop() - /obj/item/organ/heart/nanite/on_life() . = ..() if(owner)//makes nanites tick on every life tick, only about 33% speed increase From d383311e39239ed5e9ce1a773791c2c3f8557533 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Mon, 4 Dec 2023 19:30:57 -0500 Subject: [PATCH 110/281] proves to god I exist and im pissed --- code/modules/surgery/organs/augments_chest.dm | 2 +- code/modules/surgery/organs/eyes.dm | 113 ++++++++++++------ 2 files changed, 79 insertions(+), 36 deletions(-) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 0ab2df136add..c58ac8b27f2f 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -337,7 +337,7 @@ owner.set_drugginess(4 * severity) owner.adjust_hallucinations((50 * severity) SECONDS) - owner.blur_eyes(2 * severity) + owner.adjust_eye_blur(2 * severity) owner.adjust_dizzy(severity SECONDS) time_on += severity owner.adjustFireLoss(severity) diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index b295459a9090..755be018ecab 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -20,14 +20,16 @@ low_threshold_cleared = span_info("Your vision is cleared of any ailment.") var/sight_flags = 0 - var/see_in_dark = 2 var/tint = 0 var/eye_color = "" //set to a hex code to override a mob's eye color var/eye_icon_state = "eyes" var/old_eye_color = "fff" var/flash_protect = 0 var/see_invisible = SEE_INVISIBLE_LIVING - var/lighting_alpha + /// How much darkness to cut out of your view (basically, night vision) + var/lighting_cutoff = null + /// List of color cutoffs from eyes, or null if not applicable + var/list/color_cutoffs = null var/no_glasses var/damaged = TRUE //damaged indicates that our eyes are undergoing some level of negative effect,starts as true so it removes the impaired vision overlay if it is replacing damaged eyes @@ -40,8 +42,6 @@ HMN.eye_color = eye_color else eye_color = HMN.eye_color - if(HAS_TRAIT(HMN, TRAIT_NIGHT_VISION) && !lighting_alpha) - lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT M.update_tint() owner.update_sight() if(M.has_dna() && ishuman(M)) @@ -55,7 +55,7 @@ HMN.update_body() M.cure_blind(list(EYE_DAMAGE)) // can't be blind from eye damage if there's no eye to be damaged, still blind from not having eyes though M.cure_nearsighted(list(EYE_DAMAGE)) // likewise for nearsightedness - M.set_blurriness(0) // no eyes to blur + M.set_eye_blur(0) // no eyes to blur M.update_tint() M.update_sight() @@ -117,48 +117,80 @@ #undef OFFSET_X #undef OFFSET_Y +#define NIGHTVISION_LIGHT_OFF 0 +#define NIGHTVISION_LIGHT_LOW 1 +#define NIGHTVISION_LIGHT_MID 2 +#define NIGHTVISION_LIGHT_HIG 3 + /obj/item/organ/eyes/night_vision name = "shadow eyes" desc = "A spooky set of eyes that can see in the dark." - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + actions_types = list(/datum/action/item_action/organ_action/use) - var/night_vision = TRUE + // These lists are used as the color cutoff for the eye + // They need to be filled out for subtypes + var/list/low_light_cutoff + var/list/medium_light_cutoff + var/list/high_light_cutoff + var/light_level = NIGHTVISION_LIGHT_OFF + +/obj/item/organ/eyes/night_vision/Initialize(mapload) + . = ..() + + if(length(low_light_cutoff) != 3 || length(medium_light_cutoff) != 3 || length(high_light_cutoff) != 3) + stack_trace("[type] did not have fully filled out color cutoff lists") + if(low_light_cutoff) + color_cutoffs = low_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_LOW /obj/item/organ/eyes/night_vision/ui_action_click() sight_flags = initial(sight_flags) - switch(lighting_alpha) - if (LIGHTING_PLANE_ALPHA_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + switch(light_level) + if (NIGHTVISION_LIGHT_OFF) + color_cutoffs = low_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_LOW + if (NIGHTVISION_LIGHT_LOW) + color_cutoffs = medium_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_MID + if (NIGHTVISION_LIGHT_MID) + color_cutoffs = high_light_cutoff.Copy() + light_level = NIGHTVISION_LIGHT_HIG else - lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE - sight_flags &= ~SEE_BLACKNESS + color_cutoffs = null + light_level = NIGHTVISION_LIGHT_OFF owner.update_sight() -/obj/item/organ/eyes/night_vision/alien +#undef NIGHTVISION_LIGHT_OFF +#undef NIGHTVISION_LIGHT_LOW +#undef NIGHTVISION_LIGHT_MID +#undef NIGHTVISION_LIGHT_HIG + +/obj/item/organ/eyes/night_vision/mushroom + name = "fung-eye" + desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced." + low_light_cutoff = list(0, 15, 20) + medium_light_cutoff = list(0, 20, 35) + high_light_cutoff = list(0, 40, 50) + +//innate nightvision eyes +/obj/item/organ/eyes/alien name = "alien eyes" desc = "It turned out they had them after all!" sight_flags = SEE_MOBS + color_cutoffs = list(25, 5, 42) -/obj/item/organ/eyes/night_vision/zombie +/obj/item/organ/eyes/zombie name = "undead eyes" desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." + color_cutoffs = list(25, 35, 5) -/obj/item/organ/eyes/night_vision/nightmare +/obj/item/organ/eyes/shadow name = "burning red eyes" desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread." icon_state = "burning_eyes" - -/obj/item/organ/eyes/night_vision/mushroom - name = "fung-eye" - desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced." + color_cutoffs = list(20, 10, 40) ///Robotic - /obj/item/organ/eyes/robotic name = "robotic eyes" icon_state = "cybernetic_eyeballs" @@ -171,19 +203,21 @@ . = ..() if(!owner || . & EMP_PROTECT_SELF) return + var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) to_chat(owner, span_danger("your eyes overload and blind you!")) owner.flash_act(override_blindness_check = 1) - owner.blind_eyes(severity / 2) - owner.blur_eyes(8) - applyOrganDamage(2 * severity) + owner.blind_eyes(5) + owner.adjust_eye_blur(8) + eyes.applyOrganDamage(20 / severity) /obj/item/organ/eyes/robotic/xray name = "\improper meson eyes" desc = "These cybernetic eyes will give you meson-vision. Looks like it could withstand seeing a supermatter crystal!." eye_color = "00FF00" - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + // We're gonna downshift green and blue a bit so darkness looks yellow + color_cutoffs = list(25, 8, 5) sight_flags = SEE_TURFS - see_in_dark = 4 + /obj/item/organ/eyes/robotic/xray/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = FALSE, initialising) . = ..() @@ -198,16 +232,15 @@ desc = "These cybernetic eyes will give you true X-ray vision. Blinking is futile." eye_color = "000" sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS - see_in_dark = 8 /obj/item/organ/eyes/robotic/thermals name = "thermal eyes" desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included." eye_color = "FC0" sight_flags = SEE_MOBS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + // We're gonna downshift green and blue a bit so darkness looks yellow + color_cutoffs = list(25, 8, 5) flash_protect = -1 - see_in_dark = 8 /obj/item/organ/eyes/robotic/flashlight name = "flashlight eyes" @@ -454,5 +487,15 @@ /obj/item/organ/eyes/polysmorph name = "polysmorph eyes" desc = "Eyes from a polysmorph, capable of retaining slightly more vision in low light environments" - lighting_alpha = LIGHTING_PLANE_ALPHA_NV_TRAIT - see_in_dark = 5 + color_cutoffs = list(25, 5, 42) + +/obj/item/organ/eyes/zombie + name = "undead eyes" + desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." + color_cutoffs = list(25, 35, 5) + +/obj/item/organ/eyes/alien + name = "alien eyes" + desc = "It turned out they had them after all!" + sight_flags = SEE_MOBS + color_cutoffs = list(25, 5, 42) From 841d19b976cab24a45469d4f5249c0a83299a19f Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Mon, 4 Dec 2023 19:37:35 -0500 Subject: [PATCH 111/281] yog exclusive feature (tm) plane master --- code/__DEFINES/layers.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 1c98b16882f4..fafbbc3225c7 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -74,10 +74,6 @@ ///Pipecrawling images #define PIPECRAWL_IMAGES_PLANE 20 -///AI Camera Static -#define CAMERA_STATIC_LAYER 40 -#define CAMERA_STATIC_PLANE 40 - ///Anything that wants to be part of the game plane, but also wants to draw above literally everything else #define HIGH_GAME_PLANE 22 @@ -90,6 +86,10 @@ /// Plane for balloon text (text that fades up) #define BALLOON_CHAT_PLANE 31 +///AI Camera Static -- YOG +#define CAMERA_STATIC_LAYER 40 +#define CAMERA_STATIC_PLANE 40 + //-------------------- HUD --------------------- //HUD layer defines #define HUD_PLANE 40 From 443d5ca195022b27c4a758a4fb8b7fe064962d88 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 4 Dec 2023 19:50:04 -0600 Subject: [PATCH 112/281] bring this back from previous push --- code/modules/surgery/organs/eyes.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 755be018ecab..cbfcc08db923 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -178,17 +178,20 @@ desc = "It turned out they had them after all!" sight_flags = SEE_MOBS color_cutoffs = list(25, 5, 42) + lighting_cutoff = LIGHTING_CUTOFF_HIGH /obj/item/organ/eyes/zombie name = "undead eyes" desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." color_cutoffs = list(25, 35, 5) + lighting_cutoff = LIGHTING_CUTOFF_HIGH /obj/item/organ/eyes/shadow name = "burning red eyes" desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread." icon_state = "burning_eyes" color_cutoffs = list(20, 10, 40) + lighting_cutoff = LIGHTING_CUTOFF_HIGH ///Robotic /obj/item/organ/eyes/robotic From 67c7c23a768481e2fa89952ab1dc5bc100dbe57f Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Tue, 5 Dec 2023 11:08:00 -0500 Subject: [PATCH 113/281] updates vendor emissives as well as firealarms --- _maps/_basemap.dm | 2 +- code/__DEFINES/layers.dm | 1 + code/game/machinery/firealarm.dm | 9 +++++++++ .../structures/crates_lockers/closets.dm | 5 +++++ code/modules/vending/_vending.dm | 17 +++++++++++++++++ code/modules/vending/assist.dm | 3 +++ code/modules/vending/autodrobe.dm | 2 ++ code/modules/vending/boozeomat.dm | 2 ++ code/modules/vending/cartridge.dm | 2 ++ code/modules/vending/cigarette.dm | 2 ++ code/modules/vending/clothesmate.dm | 2 ++ code/modules/vending/coffee.dm | 2 ++ code/modules/vending/cola.dm | 16 ++++++++++++++++ code/modules/vending/dinnerware.dm | 2 ++ code/modules/vending/engineering.dm | 4 +++- code/modules/vending/engivend.dm | 2 ++ code/modules/vending/games.dm | 2 ++ code/modules/vending/liberation.dm | 4 +++- code/modules/vending/liberation_toy.dm | 2 ++ code/modules/vending/magivend.dm | 2 ++ code/modules/vending/medical.dm | 2 ++ code/modules/vending/medical_wall.dm | 2 ++ code/modules/vending/megaseed.dm | 2 ++ code/modules/vending/modularpc.dm | 2 ++ code/modules/vending/nutrimax.dm | 4 +++- code/modules/vending/robotics.dm | 2 ++ code/modules/vending/security.dm | 2 ++ code/modules/vending/snack.dm | 2 ++ code/modules/vending/sovietsoda.dm | 4 +++- code/modules/vending/sustenance.dm | 2 ++ code/modules/vending/toys.dm | 2 ++ code/modules/vending/wardrobes.dm | 3 +++ code/modules/vending/youtool.dm | 2 ++ icons/obj/monitors.dmi | Bin 17892 -> 18908 bytes icons/obj/power.dmi | Bin 30291 -> 30501 bytes icons/obj/vending.dmi | Bin 113419 -> 120054 bytes icons/obj/wallmounts.dmi | Bin 4414 -> 4690 bytes 37 files changed, 109 insertions(+), 5 deletions(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 48b96c8948f7..aadbfa88a035 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index fafbbc3225c7..863ade0a5012 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -49,6 +49,7 @@ #define O_LIGHTING_VISUAL_PLANE 11 #define O_LIGHTING_VISUAL_RENDER_TARGET "O_LIGHT_VISUAL_PLANE" +#define EMISSIVE_LAYER 13 #define EMISSIVE_PLANE 13 /// This plane masks out lighting to create an "emissive" effect, ie for glowing lights in otherwise dark areas. #define EMISSIVE_RENDER_PLATE 14 diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 99b5a4987ec9..9a25df359b09 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -29,6 +29,8 @@ light_power = 0 light_range = 7 light_color = "#ff3232" + //Trick to get the glowing overlay visible from a distance + luminosity = 1 /// 1 = will auto detect fire, 0 = no auto var/detecting = 1 @@ -92,10 +94,13 @@ . += "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_PLANE, dir) + . += emissive_appearance(icon, "fire_level_e", src, alpha = src.alpha) 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_PLANE, dir) + . += emissive_appearance(icon, "fire_level_e", src, alpha = src.alpha) + set_light(l_color = LIGHT_COLOR_BLUE) var/area/A = src.loc A = A.loc @@ -108,10 +113,14 @@ . += "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_PLANE, dir) + . += emissive_appearance(icon, "fire_alerting_e", src, alpha = src.alpha) + set_light(l_color = LIGHT_COLOR_RED) 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_PLANE, dir) + . += emissive_appearance(icon, "fire_alerting_e", src, alpha = src.alpha) + set_light(l_color = LIGHT_COLOR_RED) /obj/machinery/firealarm/emp_act(severity) . = ..() diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 66d75d7e3125..16f0459abe58 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -86,6 +86,8 @@ GLOBAL_LIST_EMPTY(lockers) /obj/structure/closet/update_overlays() . = ..() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + luminosity = 0 if(opened) layer = BELOW_OBJ_LAYER if(is_animating_door) @@ -105,6 +107,9 @@ GLOBAL_LIST_EMPTY(lockers) if(welded) . += icon_welded 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_LAYER, EMISSIVE_PLANE, dir, alpha) if(locked) . += "locked" else diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 87f510ce3c10..e93b30dd9af8 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -92,6 +92,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C var/forcecrit = 0 var/num_shards = 7 var/list/pinned_mobs = list() + light_power = 0.5 + light_range = MINIMUM_USEFUL_LIGHT_RANGE /** @@ -185,6 +187,9 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C /// how many items have been inserted in a vendor var/loaded_items = 0 + ///Name of lighting mask for the vending machine + var/light_mask + /// used for narcing on underages var/obj/item/radio/alertradio @@ -270,12 +275,24 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C . = ..() if(stat & BROKEN) icon_state = "[initial(icon_state)]-broken" + set_light(0) return if(powered()) icon_state = initial(icon_state) + set_light(1.4) else icon_state = "[initial(icon_state)]-off" + set_light(0) + +/obj/machinery/vending/update_overlays() + . = ..() + if(!light_mask) + return + + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + if(!(stat & BROKEN) && powered()) + SSvis_overlays.add_vis_overlay(src, icon, light_mask, EMISSIVE_LAYER, EMISSIVE_PLANE) /obj/machinery/vending/obj_break(damage_flag) diff --git a/code/modules/vending/assist.dm b/code/modules/vending/assist.dm index 3a5c4c0bb1c4..a710699ae542 100644 --- a/code/modules/vending/assist.dm +++ b/code/modules/vending/assist.dm @@ -13,8 +13,11 @@ product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!" default_price = 10 extra_price = 50 + light_mask = "generic-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = NO_FREEBIES /obj/item/vending_refill/assist machine_name = "Vendomat" icon_state = "refill_engi" + diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 2cd504b0cbc7..d61713292d39 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -232,6 +232,8 @@ /obj/item/clothing/mask/yogs/richard = 1) //yogs end refill_canister = /obj/item/vending_refill/autodrobe default_price = 50 + light_mask="theater-light-mask" + light_color = LIGHT_COLOR_BLUE extra_price = 75 payment_department = ACCOUNT_SRV diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index 06b9519e5fc7..e9eb31b62131 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -48,6 +48,8 @@ req_access = list(ACCESS_BAR) refill_canister = /obj/item/vending_refill/boozeomat default_price = 20 + light_mask = "boozeomat-light-mask" + light_color = LIGHT_COLOR_BLUE extra_price = 50 payment_department = ACCOUNT_SRV diff --git a/code/modules/vending/cartridge.dm b/code/modules/vending/cartridge.dm index dd08f9011069..2d719dda31c2 100644 --- a/code/modules/vending/cartridge.dm +++ b/code/modules/vending/cartridge.dm @@ -10,6 +10,8 @@ default_price = 50 extra_price = 100 payment_department = ACCOUNT_SRV + light_mask="cart-light-mask" + light_color = LIGHT_COLOR_BLUE /obj/item/vending_refill/cart machine_name = "PTech" diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm index e86c6985e87d..31c7053a6d79 100644 --- a/code/modules/vending/cigarette.dm +++ b/code/modules/vending/cigarette.dm @@ -22,6 +22,8 @@ refill_canister = /obj/item/vending_refill/cigarette default_price = 10 extra_price = 50 + light_mask = "cigs-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = ACCOUNT_SRV /obj/machinery/vending/cigarette/syndicate diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index dc53821bdcba..e3046000e24a 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -216,6 +216,8 @@ refill_canister = /obj/item/vending_refill/clothing default_price = 50 extra_price = 75 + light_mask = "wardrobe-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = NO_FREEBIES /obj/machinery/vending/clothing/canLoadItem(obj/item/I,mob/user) diff --git a/code/modules/vending/coffee.dm b/code/modules/vending/coffee.dm index 007135a5ef80..8afc43e7423c 100644 --- a/code/modules/vending/coffee.dm +++ b/code/modules/vending/coffee.dm @@ -11,6 +11,8 @@ refill_canister = /obj/item/vending_refill/coffee default_price = 10 extra_price = 25 + light_mask = "coffee-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = ACCOUNT_SRV /obj/item/vending_refill/coffee machine_name = "Solar's Best Hot Drinks" diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index ba76ed700420..ae616c386d13 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -46,36 +46,50 @@ /obj/machinery/vending/cola/blue icon_state = "Cola_Machine" + light_mask = "cola-light-mask" + light_color = LIGHT_COLOR_BLUE /obj/machinery/vending/cola/black icon_state = "cola_black" + light_mask = "cola-light-mask" + light_color = LIGHT_COLOR_BLUE /obj/machinery/vending/cola/red icon_state = "red_cola" name = "\improper Space Cola Vendor" desc = "It vends cola, in space." product_slogans = "Cola in space!" + light_mask = "red_cola-light-mask" + light_color = LIGHT_COLOR_BLUE /obj/machinery/vending/cola/space_up icon_state = "space_up" name = "\improper Space-up! Vendor" desc = "Indulge in an explosion of flavor." product_slogans = "Space-up! Like a hull breach in your mouth." + light_mask = "space_up-light-mask" + light_color = LIGHT_COLOR_BLUE /obj/machinery/vending/cola/starkist icon_state = "starkist" name = "\improper Star-kist Vendor" desc = "The taste of a star in liquid form." product_slogans = "Drink the stars! Star-kist!" + light_mask = "starkist-light-mask" + light_color = LIGHT_COLOR_BLUE /obj/machinery/vending/cola/sodie icon_state = "soda" + light_mask = "soda-light-mask" + light_color = LIGHT_COLOR_BLUE /obj/machinery/vending/cola/pwr_game icon_state = "pwr_game" name = "\improper Pwr Game Vendor" desc = "You want it, we got it. Brought to you in partnership with Vlad's Salads." product_slogans = "The POWER that gamers crave! PWR GAME!" + light_mask = "pwr_game-light-mask" + light_color = LIGHT_COLOR_BLUE /obj/machinery/vending/cola/shamblers name = "\improper Shambler's Vendor" @@ -91,6 +105,8 @@ /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 10) product_slogans = "~Shake me up some of that Shambler's Juice!~" product_ads = "Refreshing!;Jyrbv dv lg jfdv fw kyrk Jyrdscvi'j Alztv!;Over 1 trillion souls drank!;Thirsty? Nyp efk uizeb kyv uribevjj?;Kyv Jyrdscvi uizebj kyv ezxyk!;Drink up!;Krjkp." + light_mask = "shamblers-light-mask" + light_color = LIGHT_COLOR_BLUE /obj/machinery/vending/cola/shamblers/prison products = list(/obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 80) diff --git a/code/modules/vending/dinnerware.dm b/code/modules/vending/dinnerware.dm index ee2ac944ee1d..b073ae8925cd 100644 --- a/code/modules/vending/dinnerware.dm +++ b/code/modules/vending/dinnerware.dm @@ -28,6 +28,8 @@ refill_canister = /obj/item/vending_refill/dinnerware default_price = 5 extra_price = 50 + light_mask = "dinnerware-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = ACCOUNT_SRV /obj/item/vending_refill/dinnerware diff --git a/code/modules/vending/engineering.dm b/code/modules/vending/engineering.dm index 0dbc4254676d..eb5ed6cefec4 100644 --- a/code/modules/vending/engineering.dm +++ b/code/modules/vending/engineering.dm @@ -30,8 +30,10 @@ refill_canister = /obj/item/vending_refill/engineering default_price = 50 extra_price = 60 + light_mask = "engi-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = ACCOUNT_ENG /obj/item/vending_refill/engineering machine_name = "Robco Tool Maker" - icon_state = "refill_engi" \ No newline at end of file + icon_state = "refill_engi" diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm index b04c44f6e54d..6369d8a82dec 100644 --- a/code/modules/vending/engivend.dm +++ b/code/modules/vending/engivend.dm @@ -27,6 +27,8 @@ refill_canister = /obj/item/vending_refill/engivend default_price = 20 extra_price = 50 + light_mask = "engivend-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = ACCOUNT_ENG /obj/item/vending_refill/engivend diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index 2ea25268a052..9b66dad95693 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -24,6 +24,8 @@ refill_canister = /obj/item/vending_refill/games default_price = 10 extra_price = 25 + light_mask = "games-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = ACCOUNT_SRV /obj/item/vending_refill/games diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm index d500661b5821..2c18d040d754 100644 --- a/code/modules/vending/liberation.dm +++ b/code/modules/vending/liberation.dm @@ -30,4 +30,6 @@ resistance_flags = FIRE_PROOF default_price = 50 extra_price = 100 - payment_department = ACCOUNT_SEC \ No newline at end of file + light_mask = "liberation-light-mask" + light_color = LIGHT_COLOR_BLUE + payment_department = ACCOUNT_SEC diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm index 141df9a93cae..d91daf5af144 100644 --- a/code/modules/vending/liberation_toy.dm +++ b/code/modules/vending/liberation_toy.dm @@ -29,4 +29,6 @@ refill_canister = /obj/item/vending_refill/donksoft default_price = 25 extra_price = 50 + light_mask = "donksoft-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = ACCOUNT_SRV diff --git a/code/modules/vending/magivend.dm b/code/modules/vending/magivend.dm index 016b06d9bae9..f10b9852c70a 100644 --- a/code/modules/vending/magivend.dm +++ b/code/modules/vending/magivend.dm @@ -18,4 +18,6 @@ resistance_flags = FIRE_PROOF default_price = 25 extra_price = 50 + light_color = LIGHT_COLOR_BLUE + light_mask = "magivend-light-mask" payment_department = ACCOUNT_SRV diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index d646b9e628ca..83b2b14491b0 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -43,6 +43,8 @@ refill_canister = /obj/item/vending_refill/medical default_price = 25 extra_price = 100 + light_color = LIGHT_COLOR_BLUE + light_mask = "med-light-mask" payment_department = ACCOUNT_MED /obj/item/vending_refill/medical diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index ffcc66dd08c6..67a6d3a7d334 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -18,6 +18,8 @@ refill_canister = /obj/item/vending_refill/wallmed default_price = 25 extra_price = 100 + light_mask = "wallmed-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = ACCOUNT_MED /obj/item/vending_refill/wallmed diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm index b26cc8daebc0..3d55ddbebd24 100644 --- a/code/modules/vending/megaseed.dm +++ b/code/modules/vending/megaseed.dm @@ -63,6 +63,8 @@ refill_canister = /obj/item/vending_refill/hydroseeds default_price = 10 extra_price = 50 + light_mask = "seeds-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = ACCOUNT_SRV /obj/item/vending_refill/hydroseeds diff --git a/code/modules/vending/modularpc.dm b/code/modules/vending/modularpc.dm index b44b4ce5a651..1b3425963500 100644 --- a/code/modules/vending/modularpc.dm +++ b/code/modules/vending/modularpc.dm @@ -26,6 +26,8 @@ refill_canister = /obj/item/vending_refill/modularpc default_price = 30 extra_price = 250 + light_color = LIGHT_COLOR_BLUE + light_mask = "modular-light-mask" payment_department = ACCOUNT_SCI /obj/item/vending_refill/modularpc diff --git a/code/modules/vending/nutrimax.dm b/code/modules/vending/nutrimax.dm index d3741f7f8529..66d4d34f83a8 100644 --- a/code/modules/vending/nutrimax.dm +++ b/code/modules/vending/nutrimax.dm @@ -19,8 +19,10 @@ refill_canister = /obj/item/vending_refill/hydronutrients default_price = 10 extra_price = 50 + light_mask = "nutri-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = ACCOUNT_SRV /obj/item/vending_refill/hydronutrients machine_name = "NutriMax" - icon_state = "refill_plant" \ No newline at end of file + icon_state = "refill_plant" diff --git a/code/modules/vending/robotics.dm b/code/modules/vending/robotics.dm index e49d45141ef1..864811785a3e 100644 --- a/code/modules/vending/robotics.dm +++ b/code/modules/vending/robotics.dm @@ -17,6 +17,8 @@ default_price = 50 extra_price = 75 payment_department = ACCOUNT_SCI + light_color = LIGHT_COLOR_BLUE + light_mask = "robotics-light-mask" /obj/item/vending_refill/robotics machine_name = "Robotech Deluxe" diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index ed5bf1b84d89..f28f4c87ad0f 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -27,6 +27,8 @@ refill_canister = /obj/item/vending_refill/security default_price = 100 extra_price = 150 + light_mask = "sec-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = ACCOUNT_SEC /obj/machinery/vending/security/pre_throw(obj/item/I) diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index 33ad829b4c9a..e40f8963c560 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -23,6 +23,8 @@ default_price = 20 extra_price = 30 payment_department = ACCOUNT_SRV + light_color = LIGHT_COLOR_BLUE + light_mask = "snack-light-mask" input_display_header = "Chef's Food Selection" /obj/item/vending_refill/snack diff --git a/code/modules/vending/sovietsoda.dm b/code/modules/vending/sovietsoda.dm index 01832df2855a..599ed04a9bbc 100644 --- a/code/modules/vending/sovietsoda.dm +++ b/code/modules/vending/sovietsoda.dm @@ -9,8 +9,10 @@ refill_canister = /obj/item/vending_refill/sovietsoda default_price = 1 extra_price = 1 + light_mask = "soviet-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = NO_FREEBIES /obj/item/vending_refill/sovietsoda machine_name = "BODA" - icon_state = "refill_cola" \ No newline at end of file + icon_state = "refill_cola" diff --git a/code/modules/vending/sustenance.dm b/code/modules/vending/sustenance.dm index 266a58e10ab0..4004bf67a870 100644 --- a/code/modules/vending/sustenance.dm +++ b/code/modules/vending/sustenance.dm @@ -14,6 +14,8 @@ refill_canister = /obj/item/vending_refill/sustenance default_price = 0 extra_price = 0 + light_color = LIGHT_COLOR_BLUE + light_mask = "snack-light-mask" payment_department = NO_FREEBIES /obj/item/vending_refill/sustenance diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm index 92a1419fea2e..8125f581d8a9 100644 --- a/code/modules/vending/toys.dm +++ b/code/modules/vending/toys.dm @@ -35,6 +35,8 @@ refill_canister = /obj/item/vending_refill/donksoft default_price = 25 extra_price = 50 + light_mask = "donksoft-light-mask" + light_color = LIGHT_COLOR_BLUE payment_department = ACCOUNT_SRV /obj/item/vending_refill/donksoft diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 97e8716b0b14..baa0e924006c 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -6,6 +6,9 @@ extra_price = 75 payment_department = NO_FREEBIES input_display_header = "Returned Clothing" + light_mask = "wardrobe-light-mask" + light_color = LIGHT_COLOR_BLUE + /obj/machinery/vending/wardrobe/canLoadItem(obj/item/I,mob/user) if(I.type in products) diff --git a/code/modules/vending/youtool.dm b/code/modules/vending/youtool.dm index 4d90076586e9..159984db340e 100644 --- a/code/modules/vending/youtool.dm +++ b/code/modules/vending/youtool.dm @@ -24,4 +24,6 @@ resistance_flags = FIRE_PROOF default_price = 20 extra_price = 80 + light_color = LIGHT_COLOR_BLUE + light_mask = "tool-light-mask" payment_department = ACCOUNT_ENG diff --git a/icons/obj/monitors.dmi b/icons/obj/monitors.dmi index 06e2f8782ab04c878d87734d284be87935603add..860a11a75ed5e57cb08276254325ae7fe103ee5c 100644 GIT binary patch literal 18908 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 literal 17892 zcmcJ%bzGEf*ETwUfP$3LEe0qJDj+d~f+!$hk{k`x0eS5$A`(v27`kZsEa~;Pz)*3=J)Rd?wSSdgt5Y^Ks3NJt)q9)*# zaghwzBRgDm8`wzldZq26VCHPu zxo==@3n)_K$#?12+bmib`hbxzgx{IJ<5`<9!@f`zbQuLRQ7<1F)F* z%^S32g)g%Nl*Q{^9y5Qqz?gNV_K30Y)6+S5;@Hh)-CvXP#B3AY#aASraGT4alTamo zn5&cN!S6-c)f3&)k~rr^-!_v|pL9QbMzhMR(gc5KRorNe^RyMZ_acm@cA|nj)hysD z$FsxQ%}39?W|3jFS0tuu?tV&{OpkEtF)t}%y0pMT~X=DR>m zPr|d&6QBRE?Dlrgj?~Y)S9B&IKU{Sx5&1TCc0b#l;!Nq-E+OpvN<&s{)+@K>UTr+I zcQ1Q!$AyXJt7TlZafOW{k37|-n`oTrzAADcwZ`3ir!O_>tln_d!KnsrzT=BX8pL`a zJx#jbUQtj`D7{VLMHUhg5)e}Yx_`goPK{bq_;H4j2&_gFR?{6rxT#5V7uYQfU3JVq z4bO{59`c*m&CiA(Uwl|O)N-m*pJI=+7tBu&#CX5Q^nQZ%c~B3b!Z^l-A6nYHdyU_Y zM`fblrmrvAZd(+4pIyy7V~>1R&@-}vfb?@{CCV9ydS2dngVh+vnB)5p2`ubaDpCC* znBI6;4`;?jgu1&Bl&@TmMD0N4H1X)s?YVN%m_hWKv#b?(JnXxo2X5AWPZ#A~>m9zw zY;NHTM%r_s-GedS!I)K{ZCcCKZn^SEX**277w4BmAlT7r^t)pmjxZBRc2kLv zjq*GYy@{Y~&K^AEOV&(yH)>-Oa356x#qd6ZQ|836s_dgvhY%)4{>tYk-v%IdhVq2}fap%3ndhMAfH_pz{3 z!+_Dk3s`j@sqOiS6~r?P?Amhrs2S~)+?z>oy#e}^L3D44Ng>f33^iUa9jmT8l8<}# z{lJ$qu=IBP`Idlw<@BDl7Os6XjU(6s-v>_UZ2f?d*1CvUeFfUynhx?jp6EJh9U`}6 zK<=at{vK=7ba8h*k#^?X+dq*;Ti^|3cm)#S;(;;n^=m^j%D0l_FqI#lHc6o+u7GKA z;~&Q|-}4nq51PHaI<&w*?Dhqf^i>MyAQ#RcE9x!f19+}6Bnj!I(jv;mbTPJ`DSh1gEu(R zn9=BwYSM2^(Vg+#6VE8y8I5E(weGCS#-Pu{2(S7O-hE*AK13aM^azwZQ53>bBq|!# zxs+@8LM*A=Cvw!W4jvoN5MSu4db4e? z(1U&5myWSGg*Rb?6-8majS!+u{UP9?&Idku!QAD-KcVq2#0=)#VP_}Tlwj?fAfwTZ zk^D^7BwR?A6Lr(1&y20}TV#3|=4T>71euP*7!QCq&1h8;3dRd1=<4F#2(>k8?Uu&_ ztDwuMo@rd2_p0->_1s8$SARKa^{z9`^5KIFV4Pco?qflwdhi)q>7}mON&sLrjod4)7aCk(kIoim8za1b#Fbn9yZOGq1R{Fj!lB&h0((GSV0

    Mc{(!=G^?Hbl2Rbtj7Y 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

    8x0rShtl&|Po6!*zUhNX7@uEx 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

    KF;ME#u(*Km6cZJ(sKOIEtWmwl-F^= zcn$E%9>qQyIQKhE(HP*;XQ269LMfnU$(}#oR6b}Q)0!l)#U-mG%i34$(0KR4+hQc; ziEX9V``ex;mPQL%RM%~*AHbD2!H zI<$9D@q6Xqwy+rMoZ9tS)4&)6FcuaDWVM_t9sYVwVm{)fnep28$?qw>qey<1aQ}NL`C*n{00O(djQHrBA5P(((M7lu8(ftxEgEOD;G9Vz zu|;{{1nS+@fBiASMB+!))H%&NEWjUgV}p3L#P;ZBTbHcbbv069;WyH=91*DUHYA4e zCWG^@*K`!?am1)|W2~qMu*PLE`+>=iH1Corfwy2tf`gh37LOtEsF8OSc6QHxQt@sG z(g{1bjgR+-qh@8&{$WM_)1#M!-1^VFyU%(n@06B*cB6UxYaUEgkpO%oX#B6O@RN<% z!t02xCE%ZcpbD8M2ZvqqzI19laG7HZ0EBnaByvj>6#i%)oO-dp~*i`)|{UlM_laEvzy874!OGY`kA7fz1N-wSdk z?XL1&{1xzktxD&;pa{l^`1R_o8*Y-w@3yyp(>7A|{}Q`z=;KhJCN@P+Wer|5*L3K} z0uFXYi?*UJUpZn>u9)&4@Z^F4d5#}FilHOQ${P9Rw{Mb+5qrenlg?!(*3OA(*h9Y2%Zwd9PpdSV*7yN!V~9Jjiq%y!623VE3WpXVlEizuoLn0Y)rqTy&kV@x|v& zQo-|4css-&^c86uK#PzLST)d<={b!)I`#4P#q)pIM)kA_4k)SS%=yar0O0UiInk0l8YJ?Zj*t^FKz^M(m$2sIT2Wsdu_M%^zq13ZWRz z`J_AeV2bEk7l?cMFgI&yoImoJ9lFWrQ}}nKA5Z3v0KY~O+0-<%VLXJSsxjYp^CMIz zULZT-S!REyis$IgM}?}}T`ic$Pj(MXktAueXQVbj>!O>24jKclN|ZQjv47yD(ab##()^i#}59mqP)~&m?ef zb-DXc$^2vRWp4*O_8*GP0)|_a-;#%ZkF3XYUfA&-o^HT*ffgS2J2N-3-pW z9xgxxtX@$OHp&sDa{|A-;eMJ(-J$e+h-C&5>QPo@&tCjTAuNx*h9OUziXze}+89y?#`kWV~{P7}D$hekD)i z@7VeDEI=MSP93U$MszJKD+~s?5Z+7RoX;E)2rG4Z)RP~mfHkd_eqCGU)YX3s*G$Bp z_|XMVD)`^`P43*P)J)@l?Sy}4xczcvuA4gfOy)(e#F1FvWh(I6*w>>_(z|OTu~~`Z zr;#W`2eQato1KMadOgn=vbk`zBH~->pNJj=9SG-dR=zR6WLgi-*xCxbF0bPBXPo^+ zs>(ogxR=S#DE6?;K2{yDeOs_pDiF z%F4xe)-L)RGA4YO$hfhLYj^6JYI<(*Rpx7Rn!5wJ9Q+hMO`}{B5SmCm&|<=9WE^G- z4MV-Xp$5ibfxV$)H||zHCl6ipe{&30MEFq@ce-92oc8kP!~$_}5NZAS^JmsWhrFMd z7#p*-wY4QAC!hI-2BF~>?rALVE9s`f9*pv!&x)?B8`(Wn(Ff8^J@OS%V z$&&L98HFz9ZO;F=ZznD;ac8iB;JSKqn0=fJS7-zV?@r9qL7uJ1vT0KhmOOq5Hj#0x zfOvCiy62;fvTnfQ)ON<6Zfer~I1e_okfP$iFJyr96iM*E zh+|$`Z!enPxN)FPiB{F~!nirh1#zbYn6ksmS&L|j?M<@~u10@59p+dSR` z_35R%y8KM#Ha0*|2=OUC%jvv|(C_nB#SlPq0YuK3cb{}Z1`$U~d^LhMIm$CFm6%1Y4c?pj8;sX;aCk3i2V$<* zYWKi8su}cLWvPTw03I419$x3Bw57HGb&hM|u+)?FWHN#6-}C=&lWW7!si~1aey9(Z zt-R41m9;=3H64Gysi)1(&)*;TatrCIHGu^~iw(VW^OS1ZI|wm*5whX<-6w+CCC@KK zLQt>S3tO))v>wY)3D)5D(l1LSj0WWq!pGS^va&zNq6iYG8j?#^XJ*amw8ka z6nKJyf+{zD@l!gHPHFP@4?>;tS4~a#q(~GBX}X+?)9K#BLfd7u*^PhW`c5C$#9Xo5 z*y$6`O|D!A$WEUbH|nK|2=xI<#?_v=WmhkVMIaG7c4HN|(w#AXo-BR-$jQ$iGc;sH z4(MGSstJ^Z?xKTak)+YHd?09QYHDhICMhH7UKz!D3-@GM+QQNj9NHW2l}r%l(FOql zN?9mskk$DUm{q)uXKfxEyr67`jw{XmeoN-SZa1UA2dh%Yqv+eN7^w?sMUiwV{zhxT zVq;@Jefp%Wr^kGXpI;tDMIg31l(Wl#r&f{HO59?AK<7zn3!19KQa)QSWz*t zrVqzHWoI{tBF<#v<9#q)`r4;kQ`JG(QIXKtR^qiSAyg?1hya1w5bPXgPadPLBKd0@5pJJN-tp~ zVUmR|0K%##immQ3SW}j_ZaFkXaSeg0W7#=5iD0Q42nI2M;+!^eyN+Z~!46VwD%DBz!Yv4;K$W z$Z1fW4%~bhXmD&tT#;>S2d6uI8Sbr)$2@<2Fw*7JsZ+&Wr{3-;limWoMijpav>`(H z$GdkB(CUbr=TYBqIII?c@r9|id38ts?C3)=1W$ip8Q29b)V&ORZZx0ULyLV46c-Ia31#|-XXlUZ=jF%<%o2S~6r9i2P zMo@c!z6Zq4NW{>!Lue(Q1vjiN&s9}bWoT+TpF=;IM`5&(Cm62EuD+SR^65s@XyZlV zE0#|d*C(C&93d=m!*>t59-h>P6F+BN~M&} zooMH9leC|dnl#-FP8um_M;VC-t-kUDs)`p)nJ9@%a0~v=g;~9oY-FstJk+ZH&f&VY zV`s)8h-~(zq4PcU0an?0cV!q2>g z50VZc^1}I6C8eYqcLw2I^9BywR{yPJK#v5L=%^NXy>XXAi(DMCw>I93a~gQ%tNG>| z7hlfZkj!5yFu0nx<~E@H3X;>pO2Fm@gK`q{TRsRGF8qlN)O>XC*AjprHAJ*sI4=pf zOtr8qliq_Z|8mZiLYW-sv}+ST&?}?Q2i6_p50kD7n0Iunb|Z4Tw6s)DG5+gnxjmvB zC~^bpefD3X@#;@O*}HcjbI;?ML<8OCH!r`#WvTP%kmswT-x(ke4ABv)+jSpZCpw{n z!s)cf;U6%Ntpd!Dfuo~1RERh5_AY55c0Vh+y-kt7^uO4Gl_m|M266o})dAw#^O>Bt zmG;hXn8m)n1becXY{Wqgojw6}s@`>1sWutgItWtamGNR>`E_r}o2}bY3vv=E;KB{o0-tisRUem0z{vC20ftq zy{s%M?J`i+GjjnJAsrbi+`_`bk}@*8QY5=Xd!py?w})>$1s>h5G(DHIIvAtnHzbFo zknq^%-z>11z16X*n}L`ci{mWeS4Z|5x&P-q<#D}O5Z!kunQKe_Z{g@W+jv#e1MhM^ zJO<=4z^Jtw9e1n|nR4wiWlRVeYf!FgXD-$)mPWLbTd9F!CLjF>b^)@2%!Kp_)7_eL z(pW8sGh9j2{`Vu>J4|AiTAqy2d-9BiN749~2aDzf5`fPlJTh`?>zRV0;zq<})Hig; zh2LTV)K`jZ4wU<4b2TD4#L!)0{M7}o78O|N#_sY@tzwkc+Wt7+%+j*iK>Innz$0#k z4Fl5fn6Vq{HaN`z?{v&Qa-r1{_&Ox#m*+z1Sco9H^hj0SmNzbB&2Cu$ayk5nW^7z_ z;msdqOqqoWtZ6W!>uhYi&(&1z&+rkn>nbiW#nE5$O{z4(uIpe$d@ZfZ#SKMCmWtwe z`D02_;I3PJi@oN9+iuANJaxWE}h>>LiN@5?p2*wauUg=ba@p8(eUo1lHWvT4z zU1Xsu395ojWIQ+`O5XaES>3;-FjxlgEz@{gtt*B=`Z_Slj>X z6@}uu6xoc$!L02W&%Zy0%`oP>rOV&uI2IQd5g$#JPI0S=XB@dMb<5I{G1Tp*^5>zK z+xo`w^l_OY?i0V_BF(^?Hk;NCTXh=T8N|oSup73dDH?XR9x^&OR!AX~1@dSP%wPfO zC?uYiQ6`5vqV4HNHvQvX`(RNZg65)HL}q%H$)P=p?_!JLb=lP7!YLDFDRvm84FIS; z4u@9<^BM)>H~CE2%&DT98|8^u6w1$An;zQ8-kCm_1@cnNsF(X*uMIi;$RxwezcZ9d zDOp=CDysv=W0P_MeY*>5Zk(kN+bMufNJ%cTfpHdSYU+#!&1XjUhHOM={yp_y{yLulZc^FC=qLk83YRaCfDI3%6B=Rf0JjgMO>2@s)@{b7^z70* zI%o+nhZR>3@&CD@JYWYKWl9d6<(JM`rT?l3`!qT_TK&MksLX$Wi&)XiP!L8L9iUOD zwmhs7tv~l)@a2C$08yC#`vZp<#!^)XT5oI1bN-|iv1{2p{d{r^gWiKKo4R{H&a&PA zpVWa(d*)Or?B57eZ;dbQg{L}gEhn)4 z!m95_L<;SEpXT6e&v1%<%rFf<%kSOjpThuY;YVNKx@rd|gM1dpt7z0tV9kf?-rJv1 zMo(v<*Bbf;5i-FUA&=2_6!=$*;`U~+`Xa>2H1*&$fjFu#5(=DA5op z+g{eiRkJJenmvF@3T#Z%YxgQOW!&lGt)O_uXxdZHf*xm<)G<&4he$rjAQ zfSR=uW%y#bVM4AaNWS$yI1M_N!3y@Y5oC7ss3!@|mo5kOB6H|Je?DkAx$o>@_OkYw zNYBM@=~qaR9Mxh*XgP(>0CXC&E zt$PM(n)Mxc7|1h-l9~3+U7aArZT_Dd>)g4Y$w@vGg5C{=W-Xi?ZhlXxxc=k%YfXm* zuZlG+cB{6RLB$ev7?=c%*{1JnzcVYp#;`$zsuQeVv?8AG-wf!Y+)1O>$$t8*@ywUK z6KulT7oKI|yLgp9(V{(L3qjYLmp0IenF1rS*HM?g_0an~6`V%DB{k(K-on=UutM%7 zD%G$LX5x(}(KAv0`={qn8JBWDtG@q*@g+J|#Co&FW)FuW+AoI6T?dKxpzKf>lNz2} zn^fx7hXq;A09@1sut%|zHvizEx(<3nAkNhq07x1lT+D3BU*ts?uI>Nc*fWr+RokQM zjcCuZA&|KM@6&JJE5|vpMy@{6JOraC90P=QlJLUlNm+-%U zo8vE9ul~_+$aW=iYiVhr;b>sWf4KJc>1;cQg`$9|0$x6#+JUvh0MSWc0GO%?Se??s zfV`!;z;=Y3+niwVGba;5a?2<9r9A=Juk9n*fM{w8V4c0&|N8Ny%_a+5v02`RvInsp z-L6L0uIbv_3vO=CG-|Ez)m;650G+BfOA*rz00zn5|8;~atEC0Yzg@6tLtk@} zNZ@?a;YiJCe}sf&N*C%aH#d%d=zHo}CP_1=az}5Xo%D$Dn`pDwGo}Yp1 zoUAMdaDxMW#rJga{|jBXtIL_T_mNLttTayrW*RV0)+~3OoSXpDjTa2tvGi>b*Rkk< zBPAT~w1)9Vv&r*TuW6FB#j|awxPPr=(J!sdXaOXLb!UbQ%Bh5hGx5tRfaU;3knKmu zK6;bTXmmX2HV+R^)Z6371t+BvQ^?>L@H;~#iMDR^Pm)b(imrq*>;EiSJz~)ndOJbZ zuW72f^wE5zU$UOpLPv!H!}|XpFgtolUMd2>ojnCZVy3Hr3Te62j808~_+d2O6sV78_vs1qD9=hht;F5)KaV zSV{nPSDX7k%@pAkgW|#I^w(5XwK>35r(IuLCxwoOfssOt6 zsq0N@4td@IEErpx>3;+JnDyi^l<@zKC_(k;$(s9GX#kmPIF4 zoi;5wEEe2Tl9MMvs^Pf}^Zq>=YSl6D${I;Ll=W&I(~(0_Tw=44uS2I=2M^rllD8f` zd{)T9+`LC8OvKtfHfqT8(0*QlM5MMft3I2`;X~nK7I6tAk-%^B`1lT|Z#BbWHLbr* z0(L0~_1%(EHFV}YMw$5gcd%yjm`}U3ZPL)60vqPN(Zgt@QgK`d)G%fD-R&ggb(1TN zy))?sx$)2!lm+b*^##j-7X4Gxvn3d9$28$Y!qcY*Kvl&QVSpwipwXTat~Kb8{j(;S z>W84ptxh!t=%YzilM@>G=(fqDlalFyL1e;)p^1q;2&{qb<7xmLS*nHML0 zYU2QoDwWduiqAJg26K&??!+&_=uO@rQa)47DWxo5P@OkvOfC#(B_->wu*FZkz2yOg z0##=JonP7EKm~cV0(WnCI^GwbsTq=HBQbD1cs{a+LUfOmvmHcP3x+6wUFDfR6 zu{$a3*Uz7m_skRTRP~>|n4tRbV39{KX9J2#4$8o1J!Fuhihde+REi1I0o4~k)9q5C zDk>*iTU#A1Bdp*}0|IO_# z=#17Ux~O@-pvb}xDBNNUR}Bs8W>bCTg9DDq%(A=N%y(us=3Y(uy;e5F`>6aB_{yK= z^=AJLR_!KWb^gYr@=QC8KI{kqLmhjkmTbhFZ1l6>V(m$G`0M0k2JIrXZtI-l;shyK zaSIw@?Q#&lKNB6wFQfD~}&yxh#nR$i>^)@Ei4K7)GQ(+ZomHOz}v zYeJ`^Bge?^-2GY`*>9&_Su90wPTW1f(M2?~hP zr6bZ5u+Twz3B4;Q(xilrbV5xa8@GWC6*BnhDU^6 zT^K5t_?~D`Z>ziVU9r>y!a|G}*j~Sra&Q&my1?e-*R2lQV=zQayyAdj`g9M6eBkiC z#u`i4&N$0{*hfueBk1kDB;*C04X-bDNdP(u9mnDNc7DSunB-xCr;$FSdw}|b4@x_X zj-5ay0oA^4;uaETJ!bs;tul6Phbt z9CSp{*i!tN(6bWl?|<@v>_ir^cM&o-zZSo@&cX|;F!me|ekURq*%|tz${*(1GO@GT zebSwgGUPGXwnUTUIrm3pPyRDu;Kk7HdWQ$?A1HjZZhJHmIX5b%j5yAec9YZJIghAXV7@A@B;4Gr1tSFulHq(+29oHlHXl|fER=7y+0tD3#dH@ zDHqA>uqTvrklFNijBs@cK(Q3IA&bSO4zGJo(sH^$MJ)7|sWT?7f`@Fqm!l9LbZ)z< zA)Al0HYRQZoSPaJmere)y;*Urou;Epekw0<6|s-Wsi*V*L$Tl4{tGvJwmYyd@w{M{ zE@OBd_}JFBqzno%^hF!S3l*?>$}~Txt=~2JSGkpS&yl9rD!am#MT+4VRqCj( z)70C24S4YszuslB!-PeFT3GW@bqKt2?cg;hCNdHZ3f^FPb8u$NL?e7R`T|siaiJqI z;cz&;nOL}uG?x?fuh!nkldj8jE?ZW5dn$}^Vb#9k*D#D!Bf=v~ejEf@%gZ;Ooy`b7 zh@3!xx5q_-f4@u&hTKmMEf+P~u!PkZo>OH6LR3*BVu@42!6oJaHNF&Y&8si&EhS*% z4y#h*CeQ9HG?*QZo^W@eX7km{ zUUb(AVD%csUhj<+y59bQL2Zp;G5nXH7FaP%)-<83N$hFKoLtn6AL+3zWes-)VHFvv zH%Z2YUEX}aQ;wW_zL8SR%Er`Q;;@t1-oNw-(RSExqJ58+__8No562BCPGy5P+*)@C zs*gB`Wn+#pCj?yogSOU%LE-$JI6bC1_GyUC;XO?8yr ze;I-iknsW2DEj0NleUO##;71n^wLJr>2$7L0K%WFU)bg8hn%4VxPP9zlREx*vhLv? zZz(!8qf2V|`t7lP*)cvmhTjeW0`cWSb~QUROtYje zL(%(llwax_EM4PPv)Z4&s}!`~2Bp#EREz_?LJl#}^c7`iQL~R;&;YmixF4-Ey@>CQ z*wLQFes_NG?0P>}z=t!(5A#J zR_nDsBL_z;8jU7_>Khro0^w9J7S*G66s@DLMhAi6@vf#zeo9cTLyv1PrFEng*5=vT z?|2CMb&gv!_WLST=mbgv0`c(hfGE4T2wxO22?tvm&v(bN?;am(n3!BT+M0^&ie|AT z;Bmd!!y6ytEM4!fut)Z^)P16nVm@TOAhD}BU21U2Q_?a{L)IX(YpCW9Xpv0#`9Z1hz;G~62 z_YI*@i&WU31qB7^(oW~Pd%C?5i*_|4K~_0}*RS6W4pvA^O3Hi84i5)@6VM)Vi;2a{ zV~l~T25JftY6zXe{PrU4_5B%)?&=m3Kkw+Yvb?jy!Wz}x?~=F&2ikz?J==K2myJ6u z>_E_)V1^C;g~&r=KEcCKVDG{QwomsO_05QmgA9C3694o=_xtznUtsV5p@Nh=J{zI> z{Oea~;IoiIj&_joccL#^BU?hu_TD5UgsMfxm|wM5oa&3ti9eBLMNAB8{~|kW%feDH z3?I+-@(hNz7-B)4^{yjUqed{Yc9$1ZWjE8qh*hx`T&ImKU5KY2e_wp}x!|+a52bUA zV`Af0I^7bkQxaSP`wY+edVXRkmpE=wE8C?ZhJJM(d}$UDfEF&_jlSo(P{L$(B%OSb zS{;}MsEFK$pFw6xZ`MJ%a9OB?@ws-7f$!sAFLS{vB$}NSU|9dn-_>UueT{d{bc`Jy z9&`0y@LZ{-(7-@JZk@u>gzfa=hj^v-DG!9mB>H*YC?fA9(uDA?o`O8|n*gHtogG%K znG|YF;$;=IM;Mz8V07GLi^I(;Wet(J-i6?dt zU7{cu7!POyLj}}v&_wxi>;wYAE1vEDO#^fRe>`%VdIWG zChRva)d?=Lt~6R-@PeEBbkM_U4t#%=S$RdNEl|4=%7H}ogLq=G@7priVzPGLta`ghi^9ks-z4Bg+`YYcxG`{gw`PlS`<-_&6C2mvnqUJYNSa=(qQ*U;9 zoK-y?e{#9wyGUexs<_4})eBt$vCwkJR-dkQEv1<2SstykVUnfA&3J1hDd~ZkvCjSb zl#r#RCC`DNqfHf1fqv)Cb8(4%ruDw*iP^K84%{dqo-hv<63Si1MT?CpNI`3=dU}cz z6BNK1?ejqG59y4z)Fhq`Ks1A-qz*n_aG>yt2}$_T6zM3`X%tF%PfkHm5k=g6JWhUF zIVeazRn**h?93HVJ!n~=1*xf#xvUtN9JDi{3%w!yY^VA7%t|d44;F<&0hLTENLqqG zz*c|LUO@hR{tQK0__gzAoJp8iQ-jMZ7z$r;AcpaLx~0lvr;X)KI>PTsm;A95x{gBA zmshx`d2qz01;ttGHfLpl{VG12$cwFMt%cs?p}Xmy-nfBTnYrs8u%p7(|K=;h+-+8MFG zO7e;ep@)xGI(fB`nE$w_K4~}P^oU15AaWy$uK@iSPX}!|-IlL%xCgBI8Ue(Mac|#V z`t^&o=b(JqZXh+ohatrT8+}nk73hA9??pZ?x}&1<+&Fp(94ZUWF}49+S*r_rIYV-M z0@uH{#LNhV0u2o)a*q#e$1O}Dmp5O!-&&Ey*nr9Lx#wL+*Oi-hkYeQ#l@WfuB1?&3l^}(|U}hP&o~^v% zL?qw~?xlH^a06^sw^7=7dA*i`2X~#udSt8e`5&Sk+)N;L|FNpFvkSEp6>zwQl^kWK zSJb15MZaWAw$FhK&hED<%yv}=TuOAm0dJO@N-JqhuqweAtEmZrxC>c~w5>@~hQlq4p$+4q``;QfvB6}P zQ@G6$-KXnIT9DQ(zgZf{O`pB1N>!}1pn`)>Cqtm!z|fbLp12DQ6T3Q4s9eV|wtI+y z@){E$ww2bH^4ptWjwEe#VlK5r!~t&kwWj86i7?PG=<6!-eL`}E?^dyu8~r49@Tyb> znWHeCYV_9gos(Mr#q`l7GKin8444ITJP>OW@nD2&{k)Kc1^=8!RN#)znl5a}IFpc7BR*tNwzz^if&8<8hp#w@qwsuzJmbNPry= zUx$>-9d$6lOu3p*lr}Rj(u3%cFhGWiy*l_1)#KVKwgUxHQyurkp~Rv#{i|ahtxx=L5$YPELZdtypzi z-t+G6Min*`$8tArTmWj|7g$_|WibKTdh>z^`&pisIqNwt;|SpClujX)mm&B?0Yn|} zCyzU(rr4dFoLy-S>0JdDY4 zOIy#`+BGI@zSek!?h`A``2luc08xbiD=6)B?lTajiK2k$Xyb;G{inJ>oID7pwEvJ? zzEr*mBH8;Z`|`!Ub?BV!mc5zRwRJwaVmr6iF8mhr#g?v9g%+y`LAryo$}>Gu4Ft=t z>cq~GFFyJ;F2vxQRuxaeoRB8d;(Dx(c{0L2R#pf*>H-e@>dGpQEOf|PNl9;OGHhaN z%C4d{p$z{DcTD7ThNW1}(tFho^6KU#ek`+8uB~ZV0aOoU}4xESLo! z(h{q3P#`Em5ZTAs1Wx7F+*%KPmg0!B+v)*#BFx$2qGCE(s9G-lO1nZBe)ZpA+_2C1JU(@9#(X$y@>KmNE zRQ*iq1oy6bFYGnAAD1Y8bUdfyh-!-J0EArR5L;tToK2^g33QdA`N` zK4|0u#G1$W{PA!v33TM3b^|h8R4mmkCgVyNpi-M8Bv}R%Mm&(QP(t8bP@n?tXa-#1 z3Wq(Ff6GKJu{nvil7CE?VV=^!&#nii`WIW4O7KHK4JZ)r2un(6ImhsV`{nl>IL-i} zrD^#(Qbdnbm9aCl{Ay<+n2wDQX1wjPSE$rw>u15rS$)Swo)?~$J$4-{tT4+(LFoq|Tr_zrRA>N{u2uCqrxY)_o ziwo}(Ue5Jdl4|LKgHabkxOqyDbSA>c$L9Sb<388hXq=Qs%E~3jZVI;E$DV1U(KsO_ zr0j*o{;fvX*1nr^1ugh%c?rUr^IVjrtNm3r&uUUuj>-M(Wf%Pup&*}xT5oPBCNdT( zcqSBe7=vU><5=J6;K{diebG2H)70Kg7CPx=X(S9y#(~Qs2_6}8Uk&0HQ%N=gLYwhQ z%n1us1*{jI(xeUf3Y`0sJ^E!%4`KP+1mluI3Hbtp%1&FM7LoAI`v-$x^jF8>*s*>F ze$Z8NunU;3{55Cxey>Ko$G1o!dXJr2X7_yH8!hfz?VUDcZ%b?5fKvF85$~K|1?S@eyjMy2=a$5Dc?{G)v_eds z9(9r6dF;`Dvs=VtLV^m!hTT6go*8KKE-sEzVuVDDvCZ3fK!0chPYjBqbbp0w#a9Wq z7zut$+>jJ*RO4^F2G<%rWH*~RdaT>#dNw;a9{GslbNKPQ2@6z}+pR`8a!05FUE7SH z3bI^BnflTZ59&qx-Xa|#ln%Z%#=%J^4cBN3w6wnsr zmj>CKS)|`h&tLFU2T_MOywq*yo(#UFH^O)zA%9`$xkR71jzZ$~{&EC75rS9YuF3K6 zb-xwE=M-2qzL`IAiHJ{f_&97ZZfzNHgcoL)z7B@w_xAhj6I&RdQlyJL?b^i>zBm%mo?G`X7gPjh==-+UAn-dwz-4? z-LMC^w-wI@tc#Yrh}fXCIGCKgF0b04r+NJM7pWlXwb}~~a(Ml-z1-G)RP3i#Q4^@M zTb6rEXPz`8&Ss8%y&|L>*JHUGUfBN48vmT}Cj#8-b|hJv`*g(9d5sbax& zI;PEsWOp8W4Foat>pd<2n8?IkfUg=I$-a3NTVbGBwejep&y_z~wjAf>VJf&(tyjx5 zpNC=Wp2>(Z35mq$99-;3V~&(gYL4nqUBY%{VzlLx>r~3|Q3=*gw~w1s8_HgJOi4tV z0@p|tbMIaQBjeVXFpZPzrtuNWu!rz>Z|uj52`Z9yr4^?s)rFd%_WOsrVRe!Ac})-E ziBT+McYb5bf4>ag{&G7j;nCv%Kek~g2Ux~L&~UKTG-%#(5DwjrbOE*Osp@n0bqIsO z72DNs%I9`}^ttTbJqR^?Pj!VqCUiX+MSlovi3U%4Q)^iQgY6s8L@q)6`S@=m9VeI9)B$dX;i3Y`=RSY@hZ<(UWM(+oU)2Qo=|YE7HhwZ*|AFpOS5yn@lDabNc{eOZ z!=pP6fo0igF^K80k5jdK@UddJg!6rmSRL~2&v`upgnAx%+<3Rh)~dMrg{A}yqNt^L z?A>TzWm$pbr()$2`hkw5DITcT_;XW~hqydR9I>UCyW%Y!q4%Ua_ZY&ZI0&C9I@PZ` zJO>?-$j7Uec&`thTvv!wrzVD`IxZ#^>u)Su6{VwH=q9axk_&gC*#e+ucV^d2mbP>x zl?a}rc`#GPcCg@=Xlg%#V#~C!BhD0lH=cmIX?2V7f6>4D3sJV1O6KwK{d^^5{I|;# zOP83Fas_7UM2$dOq$9gk{v^ggS-Radb}|$uetiX4={YxEJIU_IH2r?xK;qAjS1%F7 z!}+dsIox{?TytJHb%s_M3&PTkw3-W8VE#dj`F1jR}{%|Tv5C8j&>@S}+@%h5+<0w%waW=x0eB@*F0Xwrh z-}q*~eHVbMbpTbP*r+}V1{@Q6eej3uJe6VE+U={idzz^r(GGR3tdR7WQ>(ByZ1sv8 zECdl%abkduK>HpS%cu6KyAPezSr$?3Pn|7;4Y(V+J}y3PKsxB7-ePq%h49v`)px^2 z+2^+uuXTWh92F*S1*v1NN(bOI_!JPL>j7RAV@eK}NqSAxv`wMmyHnAOc(4*; z+dqv-4;oT@6}J;WL<{a&39z8KsUga=imdOT9}SiUm$&4oVz%zMLXoFjkWX;So@%f1 zr4M3YIPNtrPl(QLw5lqV6%{`_)*h>0H^C62(Aw4Fxp+Pj;0-_MDSK6Zm`|IH2-l1) zlze~c^#rWt7-}3DSeVuPc(Mv8=jnRo@>RhSBAABfw~x7r&kIIcHSfAq`EDPXU%3aW zYGoP@YO&m~pr?h4h^wZ`fR^tLw}0@rPeJv2+t@55)H;b^ATd(pu2a@n0Xy?@@MxL{ zfJ=!1_dGR1Bq0Y1_pZALToX0(w!Ce7qf}Sn!9r^@Ib`Tu_${L(m1C0mAi@W^g4@GM zHEApWdN{P58}%Sl#lSK6=I)68?B&Wm$w-V_gdrRZ2(%;aMq1)E!Qw`ed&!*(T;!_n z2;k>R5cWM_k|eqlD>FjZwe&v}-=$F&0SFAOQF!}(g*KIWCP^0E4SRuUT3g}JuL~?E zXfaLFL?G*d%=ym>^2m5F{|8shIP_SbqIX-#9~oMz8cp1cUKO@4BS9^)v?EV)a>yV} z9ym)PD<<2Qkx?DftGKA{HtNL;f8zkQmWgyK$g5KyT|)(}t{hv`Z?BUXZ&v1{kAYFZ zGF94F@d9#YE@N~qQ*pOuWX)yxdG7uE1zN7XhT|ESN^}1J(m}v;-C%`EFhazyh$n+M zp#1Zzf{TdZ9(d+C#(~e{C&CUzMvnhaxsfLZ55kMExp1&F({*3X*l1bs!D0ATP{%VwRy)5=p(}qokx3D1h^ns1YqRhO8BW?6fW~G8Xs6ZupWQ;;R-LR z>vRP;xE3tH|TM7Bd;&%r@fr4>j2v z!S@&d!4>iDe+5=)rN~0^tFlmrdQ5f!|*C@(F5Q`x`Kr~Tig%iUR?CeO9NX(A@@cBzz0K^zbVKx8?E{ypvF&Ud3c;C(? z*d%JPhvUi>>KEL9zsldP1Y;h*RiT~)BC3TDdrF=O{BIA6*YLw=L={m}1-Q+G>-`|} z1oSvpVB3GRSiDF0NTTFS_hy{Zlrf<2mpE>u`M>cGkLv)l&t9d725R$*<-#c!Y|hTK zRyQZEb~ZQ?dw(68`HUkeNrN7pQFUvaB-hZ`A;!{m?5cfk(~_LnR8$n(Yd4I1?@m5G z#O<_V!sSP3&g8g#lWm&a-wQiu2?=mCdJU~X9pU2lm7khD{hdN3GRxCa-hv1tY|8H7 z_<2J3ILTFLIppw6syr;GXBoq#T7BD7%Q>XBf@xH58lAJDxu<;%!%aP(yU4{u4p2il zhtYPpQ_nrdxDH90yv{K0%Tyc$YNb5#aBkPugS+w7!Ybq{)WETetWITo!5tnJ2M=dF zkf*!~mI&QO3wF=2GeGPILaa-IO??D)EypW}8T@pIht#xZNFi0rE#;3}@>;U7_qQ#} z!F6#*rtVWru!?#S_e-T4!r~7(Y5sXP)+dAlh=AbigJ~RFwbM1cSew7q+|i@k1AW>j zCRpQQU*4H+WZ{6VJP_#a>_0iZUvmPY+o+*bn@8bKFJ2#+EO*Ud8>sxNqDc`!I!t&j zRpEAN;#cfUMGWkKspw<63PDx(TQ~je&K5~K#TI8R_vzy2S6J99j-lWJVJ?C;_$Zn4 zN=~b>63EEsWmm5v@+WptRE^(e?@d=yyq2h_^w}6Q)>X|ma!*1a0Tb`RZDF!QyZ~dc zs9ALMwTBH3_@;_Ah5aMR!KxoAh)rR_=IMaVul-vlU^>vtns@KYV0Vg{A))Y@13r7P zre@?GG8m-@^TKeRS2B*+7d}fDudq9pkeHC4|D>bAX9EJM9+exk@R!dvu0FTZQa`fW zOUBTD&RxnQ7QYg`!*p)tWju5ucE47KefWO@3(VP^!L-F6I-{S^f#;N_E#nmhn(N$d zG1KX|K|)XMXQGs$Vwshw)Gw0K($&^3D}+2E+1M&|e3B!)3=}l0`yaI>eFb9Jna@D# z{0k`cKMFh*J(?-KXxaH^;^sRH4-3~8bnXBZty5n^sz=H&rW6{`@>vGH?YaNd)qNr+ zs!U+MqHF&t-x621+Z&`H&eoX=0=de=0ZE9~&KD@)m1TiQlH~IW(tv#qZa;h|C;3e3 zY4R$1hx&dE<{5HydG{O`3z`W$gx%c{l&+bt4DQ@6C&*FhTMiP}gBIs(Hbt6l8!2+u zDM%BFjr~+VKO%*wwomKr?u?+j77Dsk7!+Q;fak~vbDdl17Fo?!h|u8lFGp@2XN3Nh z#l#MMxbkH8FCy9cABcpW4vn(DlbgeGyvfWNOM&wV-dq7^(n0#Q7sQrp9*j6z^0D5> zzbuqlV!7OtDq9=1z#@eohAcXSw14>V(BNgAMBdGPHPOQRx~gg;cidOm|EzZ1IJ^r8 z|LcdWr$4HakmH&0yq|OS>LC`pI$a9LU)g9i{Ew=V(mag7{kJ#g97NwWa;FnS!VWq9 zq_QgtTZnUAZrXa5^W+7$T#S zUSl$m7@VFeEF#+Wx>nt4aT4u~=jjAf5QmZGmYM6P> z*bl$*k=$18kx{L4$u%&4QH4rDmlhUME}_FUc%@sTr`9Tkp@o{DW|Sm>_i_+kl0oZ(8EEChPD7|uf+5YO$`f8~2;FB4 zL5U2?x$=3YHK8}<3$@fO%iu?yBhxMew9`L!w+L4^6cw751P5FAST`P*aFp}izKe>F zizSN^dtX=)JB6w&65JG`YusC8=A<+G{N@q1<4vnzI) zX&s}QP|erThR&X-yRnlltqOt_gRLB~jCkG3*$&y&4OeHHHxIE6uwJ4mkDqs&Ode?X zR8bjxN)hur`K9OoPl`}FdHj6&Iy4cI} zA1#2EriQ3w{lE9nKy7o?JY&!Y6V>ikj-29a;8{>?q!Kgp|DXj*7A?W^Un{#-yJ79o z{*wzDWK%zb$0suDf1>E56t(y~Pifs1OLOC%^7V1D1&29RjGG(H8xyS3{0~RR21gmj zcoA9Y!_DN$`zFpP27wcHs&>ZHGtx*rznWXlhS6Egq`ZqNU&xhto6*KcZ)O!46`3=p zy+nHAV5()a+;5j>6b2gHym-9G~J!52dVwPG#+({G9EYQ*=JVmvt`}US?tJg158?wT_h~*8? zUd?0CS&Q3=iTfp1qVWx8^(k61*}_rgenSVu?K%Qk&Ah)UT7@yHaXcn zcz2VF*5))KJl4;u9PDjqt6G2DHA|qL_xLQdc)whYtf`JF$nE!ydv{U9fl^x+|Lpra z_3vzp#rhhns|y2YE|eWM{-zw#U%L3ZSkFFUni`^+Ek}ocPSS+2n1#ZlH`zY?Fp=uicyfNSfRiuMlPTAmcwbbF{Z;s~C2$T=H?qfj_(-`uoxc+O8#^mPqc5rro#uH15x^)b?dg65T|=+{osR2w9%sUl*nubT->?L(ypk(B;V zdq`v`+r6~I&o5E|`=WgC<^hl*pfe?Hk}2_vs_z#_ zBIuG3W9-V`1VKE*xZ8IDO%lTxLJ8dIB?C?v#r6Q?qcwFyHM zWp^X;d+cjqz@ZgW7c~6*t}muDE+#i^=3J4I)lWo4)3BSl$(`z3_EB-;fiWW1T9A8Y ztp_)R1**{`a`@Led%v8f!+r#aK(fXIP1sy-&2!Oy8!sIw#*8}O_~q;)1_wn*K5yQc zuoJFils`sFI*}a?0Ual9k6=`^LYbc#N9^yeRva$AoE+>uIx5sa6)3PEPgLvM@kk?6#Mtf5))Uqi3BRok-PX4ab<`N8@akanR zf(ugtT%$9VW^0>5Z)_vvrIQ#5@ScKC-Ppq2<>J`R!v2p84vmcU1<`U9`#Jnw1p!xw)-i=PhDZoaEB# zDuegF<}8yunO``3=1a9^90M67hVDUIM^EHE_56#_jg0}{h7Y!jgQeK=ma@Oh1u=Xm z*0*F$S5c_`_(#$3}C%pKp@g$M)K~ zVbsgDEPzjqLu=yqfzMd#eHyOuY!Q0B@mh2<0c1jzqII*fpIr1%(`WZ{*aiLFO!n$$ zFfKz+8Q0OZq-6_-KoRJo@ip|_%_CiO+$ASSDA+nO$Qv+T0OWM}8T7rz8_H1ji zQ}k}_4BR^%0Ywwd-`d;tGHFqN%(vk}soV>eOBcy-O?53552N7XyXJ(=JHSF!2VWFy zZd#~|Ko}xVwj#z)Lv!WZdbhS;+6D5+$&Tck$t5Pni17dWmXn4P1gbi%9Mxr5UxZ}0 z4AQFXfdZipmgD-z_lm&$pE$JTFXrH=eXvszX`$EVlB%dY$J?&D?_$iUV$&?|bKzOs zGbQPB;Jb#?r=7e_H%S)L<04nZTEWI6kk$#(MAXBfx&4?l3+a6i^Qty`1W}7}e(}Jx zXa7D;ML;H?Q|zLclCDkI>Ock8$dh~k%#chl89s2nFJrGDmbdhmH17`;JbrG(BOuLi zV2w(L%1%bw{I+9gTK)ppb=6U*i)ocB4T%3*aK(0E6$if>n_*NVk`JT)RiU`c{cP-s zeBwKlN>Mi>eG#&Y9DveK0*xvjM*`d6%Cs0C1M1PCTBNrn1FI=~A_QtwM3tE+JFIJR z3YWvv(YM6Ii>HzVucNGXGrT7jK#GYT7Odoh@NbSu?t7tEXdT?YyU}BPckoL|@1S`! z-@TVLC1h0eR&6gRWB{3ohu57z`vMstb+?y(6r2U#A^&Iet7qXe-_YyZ=MX@>Q-%<`d)ZN6zPr!U-J%R32 z`{S&g2!%KH!y;F!CGK9#>y+iR^9*0u(?r5ryN(#rL*EUi+43JK7r1>h7TBj?du+o3 zvS;hCUZVCx_uC72_;X!%IZju%<3ZSv`EfHPkpRkc=TItqmuyDXV%_2h^dridjBWqP z?`av~>!V(H2tlkk2bs@}92*CO(|&XM=8-{uXgJFRyC`dg57HEY<(_79 z)w^P;>Qq*>_+L{sBr&vLN=2#s$OWGDMTjh8;)rfV4+2@qXZ58|Q5@1LVD=V8=8dgl zQQF{Y)x9ENh9l$WF55aLJ33pyLOGhPNK|rMJWGpNA94^te_QF>F~e^@E3h9L8>4wW zfnuOk+CU=J@Xrw)aV-Z5IoLOrW`vaOr{@hD5FN;}!<(gZT=r!V%A05^G7duT5DWMy zE~Sl}UlpGL$ffZ6(Dc5&luqN0`a(3BCEfZxx)h>9rK`x0-KN%KmG2o)hW&ThM)O}i zNP#{fKjyzFM=+~lCz8QeI=L+Wat;aHkup(U!ou(cPF$zf+p}i>UzH<1H~*J(H6mu& z$VsjcBAe;pzXQ8>yo%of(|JJvb$& z>+8QYuQK!Iq2@!sg8R?*J%czP`1*q!Kbp0Nj@6P3Vq(S`rkN^5daMtjnz2vy`?+3b zZr%@Tv@X6|Ke%l1%I;_NQp0 zZo^@r^Ef7lf7Zt-;bIP!Gb13ha*<5xUNvHl{(;BLoyR#DDWi`VH+#Qju-rluz% z=H`?c4`sC0%FJfiCYPynxeKpTR)smRFU9Wl8BU2skd+IQJaDY8>|S@4h3uZCACnm$ z-itN9yj)gHlQA7^W%Qywa{SGg`1U z>`W)*=NF+;mPS?IxPi077sw{d3eA&2Gty|!h*7B5$ETR@d_kq9ooZ8ge&@`2oG0#o zdde<0_4^SgulhClnVD+Wtlw6Oz%DWBhuFgE1;lohJ*uEgyZ8?k{HQK^#KOI)OeIFHI$N-% z`ukmgQH^)SW{*wDad@59hiTF!{lnRlTM4#3WbhEHWIaos!;W9l{&Nc0rwj``$27a$ z1abncu9*KB{c|5<++D^M2<@e-VK3KFPyNzl9~(AOgopRi1~!|G%x-fqGBMcfK|1wye`lFxbjpW*{+K92t8|@D!Bcsdv@xwgU z$EP85&PrCyW5+kFZLXBun^Q?Cdw5ObouZF(leXyi$q7|m{O+zE-^ap}W?%ho<72sF zzu+$+rM(_?Yp~*L!sFw;l9u;E@LY&@dv&7RS8uP(FW-?B_{&Gzm-EOwGxWI6L$Ka3 zJ;CW8V`I;I9_RCTc~i?Z$XV}7LMXMDO{X4Ol!||?uCGo`6Xxzwxy{Y`IyAWHa&?Q( zHD`r*eFBzK10fXN@~pGzN9CW7D{fg1<9#)%MJW}Lc_rUUR!)4N&G%Qqsg8Hb3V)mE z_CCQ=mW-*1Ce2*c2g+Lp24u`6+exN+jG#}Mp%cm6OI_xc2O+WWz{`m^mriKU>~5n( z;IPWTlfYvp-s$F$keOgoQWI?0i{Kdpp*v~ni(HJC)`L!Rdel|(9Q}?DTuWO5tJTUz zT%bW{0-m`fF0j$e6mO?lygKWITGUmKXCE)zJ2a3P8@puE&~OljSNdo4I`_Q6>K4=8 z5=qSuKb0>O{375M5d$Qx4EQ?oT*a>j49caygz1>2pSp=GFQ3VJys-kZauT{ql^GPDY`50N!=lTf5!T&b<)6BH(J3__EZ^gt z=cIzXs~-JeaE;cL_9XyWs{CQKwSJ+IIb}`tc@MUV9twTs*n-{F6^l^$xS!Ow>?Y32 zxC5O>^ki<72@j;$=1Mu1tq=VEWunup9qF+np8so#+2t5bn~|BBIX%_W^P%B=I|n#c zm1AS%$M3)nD{=n@;S@KKP+iU2Pf7}_4GQ)SM?wFx-RykLGtcwDd`Haxv}&RIXEe#~ z9e=Cv()B$%cm#rAoRO9m0#*2%$Q*vV;ugtYNUQhMM*F&tEZfzWH8Qn@4RR5Uk&$La zKO9Nh+r9k|hY5F?^WUh@nY}Z;E+#7UoM#dekaRg}{|qaZ&TGd@x9;=#m(^0)&ZF$K zB#^flw9?z}amw|oY^9gyMW>XON4aV*Ht)}_{cifm$dG$^c;f(V{~P)gk63;1=K-~U ztNEA^JJe&N>Ddvj`nb^fm!ak2=H>zQnT;O>q~)?6e{f=;r=^jQM%Iyp-DiLvGi6H_ zJaiv+oVN1{*uY5~OPgU!^XuxH>IcTZ9Y;MZRPahV{ z?zW@zb~+=g>9w>0GJI0j%=x55uddl0&u7ymj-N_yTWOL*(nY53f>c__!Eef-{~Ce8 z62x_c4vi*Et73kU!FTGAVz<+ajE^TwZEf3q^9yfM>@Yj+?4f}{LS(;UE?F+=lF6+D z=7UxQB&3{k{rrt5e66=@pZqd<%Ht4(*FA%YcK2W_g~QH1WZ$rzz26jh5N>-M zl(G@3RLvGMvy*GfMUO81_I9&)Zf)&V^0>&u!)?@`g1pX;ptP6Sq+YAb6)-icSvwq; zDW^6-#@jxH!;&Vu2ZlUz32I!8m}chC(yH2AKe@WU_w&ZrnswFbnR%x3k4l|f==A;l zWmpda3;Ji8XTHretI%hBS?IrD{%fLw(#O#7qn~mpIOVnUif?~1zm939YUv}H&iwqZ zzZaVySQ1svx9_kzgH|Wli*GL?mT<8o9+v`Q(1op?~_@b zDuG~gyl$_7`=3uc;SG1`atNyt-QE0u#QsQVK}jC)zR%lx<6?U05`W+F-VxX-(xCRv zoxTYfDqMtjgSekx{9{CDC^e+6&vvPfbp}m1d`b9pMd!irA=iL)-5K&~a;vDIb^*UQ zU5tMJw~@CuVO1D4H;;P#gV_X_wlnC| z-)GC&i;9HF+S{)zow0jUSUsw-ydy>ydQ`}tVyLX_;AW6An>!w__vMiZE3Is|?%PKr zCYEJ;yQm+mkVaEWR*-qT`?EWZ>hx(*3<}k?H(JDWffJ-f|HrQo`vPwze==4qpZDmJ z1KSyzXKH}R9-As%9gH>ot{8BJxawimvQz%ys(g@kAZmY#kzBh@i9}aB1n8W`uSkV$sJqZtZw+FChQh(<1}RO+U}v@U;AfEZ$pX{HAX3)C(eRT8h{y=y%3=tB;Z%;7OX%(MIR4~a#) zZ-;c&m#P~KmbWeJT=s~AxYC0MCJ~Q|gb64O*@DK##>ZubvyLtYmzSY6#xs*Ne!4^S zy-)UzPEObp2Gl?*;0<#Qj!R;emhcEwo*l5g6WQF4$=~agxfU~%pBwZZ|4K=gcG0WY zXlS_f#H-$7e*Q=P#-9XX1%(4JUrOJQb_{<1p4KZuRk6KC1NnQpc*Id!vMdy$2m$~5 zlUojdWe{M%VeuO+i8l?BJ?FMaM_C-d)2Z>pVlo0HrmSb7L%w_XR zQSuXVl~~c3OBZMg`pGD>Nc2eaDsw#{8uu!zdT9A*oYvNVo|04gju{xV$zB`o&=V;e zS@)jIdz-uaW&JL~-n=L>XVBwzQj^y9hdq_5_iQ{oZJ*promdr}f-`fFU6-Nzn(`cMx|yAwJxWdA9ox__yqpAU@!R^rQnoeyj*< z59d$0yX>Q8$zo`zAEH$#8*}hFs&c~*xc)E8)6>VMr?^V8d>F9i5(kl`O=_EtzH$a-dG>@noQwc($mcFKk<$ARMI!sHGQkos@L z@KjqfWmEdTtyQNtNV&)$+tq7<>hkMB{h6+CZo(7tjGf*F%Kc8 z@tUfkialSnAS^0p;p0CqY3^9xEWXJp(kmBi9zHBhe&P_130`Aqei04!$$<=F`#7e9 z)O3_sO(NRGmj$2?Tz;EmW@qkC+d+_HH)JgAriQ>UKZKVM!0#Md`rfBYSKzCg@sK1n zU{O_9Pm_LZIPP@gEe|rb3G~t!+E3EGc1(uR(a+qq?jL~yoA1+6vu?4mrprHMmK5+A zoN*7#vdEMaE74k6S+N#p4K9MC@#n0tTa+93@4hW4LwFUKf7ouw^V7m;k%3K#FO(J%x)vOGauKPkUAQkBWz#sj`MAqIBdT!t&%m zHba0+#vhs8l9(hR{!v+2{&w8U_`s03|JcZ1Q{gI?Ai+#B4*-dXyCDQD%iO~6eS}UO zvbD=qS6APVN!z;r5Z###eX3L6jyP1VR)Pq*nz|LQ%RD=`|=I(tEGcdk-ZLcn7`r zuHReht@jsm=9~;Od)nULp80lg&-JGgC7YW{Q;Xe{tArGHMA4fr@UGezgfZU+T@~G( z)7;xqbU7VU6j+q555|~%y!&jsWZUlT(!%P?zg2-JpAA~m?5#7VT+IslCx8hUVrvgI$#U+AwWzXUWj|Y5UNQf-w6-^IEpOkr8p7 zvpKNvr#$SwEtvM$J^*h?X~jf*6#uyeZ@!md-jtKC{PlWx*#nSe%5zB-^aISSNli4d zY}l!Qpu3S5=RvFKi3NBE{a}(@d~@e*#%2SZPM0e-;BooU0-`ME7`$NXUE{IT#>Cp* ztlT&lv-$hv#j4EHqwyh7vk(Pu!3|5<8iUuU^7my01o%;We{UJ=p5akvUJ5hG1d!m$ zI-mQ@N1+F;CF~hi<6n)$qvd@r)X}}Ffd1$@q7vgrW(fA zhWxh3@>aoMSZ#`@;5B+8U|m!Dd@>O=Bsl>*ad5#8Wd2J>?Xv+>ZEPMKAWt?>fL)~q zrdE!)3Iz7`^6bE?%EJrd;^Kj`83)Ekry#b(huuU~d^Nq|wJfpz{Z3B5kpL99|87)D z`*CLVZsmoU52Y6Ctt)KHm!T3}Fy50?cxc z?E;-7_(bGvDe( ztjo_ch0GL>O3cuF;dw&ja2VrH3Q&v@aq-v^j-U4mP@ZAK-%vPNG*-IpHZ`*T>W<$f zL9yDD!5J`ITzpt_P0R6bm_m^btD?`4-MCpk8azK_fgf&`kRyAtarMCwdA;h8az1#FLyNyS5M9h833F0Fa$^g0s|tqdP2aS z9s^tfY2O3Wa{Cr(pOf#VfyZ;C)7|RuI7r>$&cahbmhc@e-wvwWZC)!&?%;ZJXEk$5z zf)BJGkwp&Uvi>DjuOeyv*78>UB(rwGKp*v)x@qO}9jZ?7sfhP`P7z?@IR?OMOCGJxFF8z-h>ji1RBb$OZ33ne{iY)>ZMaxLfKOv957mJ>0|%dL zD=p^UI|87nN>4-bYiHjH6Di#ktu64xW?Y+c*naVQSPZbbv3>72k8ld|c*U4{VsAg$ zMDo)5zmA3>vsq7$PoK+Tp}n+xQ?4kQ|54;WAG==Cq1OJnzBWoq7@o_~|5w`tM^?yk z26&q3V-asa#G3!p%Hw}{tgbuuCgsro&xc4nKZG;L96Cy7P-`vs zQsB!%f%lQje>(6PKhHg)X&w+F$V*JnO98=djo8*k#3SSDzJ!>njRmWt|0&GkfFHv2 zlW}BZ?2+SGv2*#Y)o`3c=B?S31UdhL905D#14P?<8xyWWWNZ0;RoR1We~!=n zBckv<7z3)*qJ#rm-&9pPdQlt%L$A!MEHVFk7QioG$iQ&o1zQ-d9|^`DfGC?A?5~ph z=AFT&f2Ow`c1}sluwaj=cmE?lN`Du|FfZsw-`{_HOl59vE?s?e86*}%oYu){7;Uyf z5HWsJY{23Jcj=~$;(Z9`*?~RKl*2V%!fP6=j#GiS1Gm$6;fmQG%!i~CzoRc2(#HKJ zxy*6a81r+sJHKJ~2PWLWCqlPA?R4&2Qh!?T_!{(80g-KgG6|R}EYw1Nl-x2qySYcQ zbvi1yFT$VgGLEgktr8_D(gOI8k%m!!A62}XN47;o(j9+;)^RxMiivx;rkSHIU6cxC z5}L70PEEolJXlS;n!_2Ea5)$fz*(nkU1$C{;5?~_k>snk!?b4)^!M+3=s(EMUT!_| zPV!nV&7LT!%&1!V>ga1rGmReid@RP<9OEWqY}?(F&5?Z*%5SzB74AA-xJ}vQrG%%D zCOu-dTr_xe9w1wB7#?IKMq3ZwIqFsRUA~9G_hq1j7BM4BuC~4paO#WVQy*g&hCB7G zXDV0nit;?3W%L%>t<&n@b<40ryDqQ4PcHg@@}^3$U5J5jm@Ck0&v~rNs1W1_;m2W3 zbOZGRI<=)j1QO!yh?=TGrx`U@0r78>YiYU%YzbV4%yJfC2kODLx@Z4Z5toGt!C(Ec z)gq8z&dhczPIqpnhVVKMbF0tZBxF3pofsX^9W)lI6>D^|xgeLRL-^R|0kT|YpFm-X z62op*<6T7renvTSqDr@=kA>H8Svr3j^g0y=V0~;fyO-4oc<=5`dcF1&9l^oFpFvew zXJt5AE4i;mvghsHaKRgQG@Maa1J;@z*-|j&fnIk3^QkoCuZrtn9(_6w$93XOi z*YrZ0qC%`CMzu{wA_P{O@^Q(Xdqo60#AxRp!;>TLQbglOncIfR?pj~gaOJ4wv%_Q^ zUt`bi$-DQ!KujB7UzmP6Vd$|Jz(3ga_=?^9I+*LbT=QTfr}q?DY2Ub+gT?3~^rc@+ z-2&<+-1i~$HM+b)ZJyd%c_h!43-a;St40#g&d%WwhIg39#vypGOvJ&kbyLUb?<=_| zH}*UCNbm2KmiBLZU-nb!jJfpt^&H=2qt^GR5ZjmQR*MogN-PyyuTk8+lyE<~Pqco&+SV?y z`MsGT?ocLoB@)6T0NID5doyGUS=;Qp!>Cfs+LNQ8Of{L-sJg& z>oHqTb7_ESYs;3Hfp2zWZg2P@cS`mYZpqpD_WHQ44{`3?^gnMVTwO9LN<{)NY^t`bBybyV@@+km!AEKH8UBOqRhH-F?xY2?qRF?d zzL&t!Rzhc8-SBLAIvs4FwBNSzfy6+Nm=mXk^JUaw*TrjzRSgnc!>UR^xj5XqqGodd z)x=6&HwQ!4!-#;HtfpXiBj)2U3K*MSChhu7+HEljPyDoS?*D4r@^5-?5+2jdXTZl) zt7oGy6UxYY#krAL;gaUhAHJO_oaO5>rwc%}o{ZnQ>rVA(^%$_1stpzHtc9HYy~O67 z_IZ`Hm;@d6eaTxnWI3+fty2{2b0Fdafsw4p4!El31hAjO~2DR z|7*$byNTih5}wH{lsPMq{IrWL(_~iyFx!lH!W(-NMZ|W!5(mTd(GBe>7OeTQl5~Nx z?J9K;t(8AI?^CnpYu4!3)XFB9yO$5nqn4k>fkSQjADCdkfT%Y^E*z#1im%syL=#!C z)pHVies;8GGR*O#2fLYL)rk8eUQ5JAa^f<}aqj+Uh~t>&t!cNu(%!oid%V36@(hs7y0zs8@}64@G%EJ;ZGB`uY0{QKGjN@VEw~O*uwOt z<&^B$p3jL(^G+(`$Y*G^G&ofO0Prp&BDGZNOaajOWi=7?nA~%kc7yq*RK>!?+Di|g zujxlo#zEmR0y8V=qHo)M8m}02k5(^5{PY1naB-wLR5r&f&bKEfu8mf{kbLKJkRmLl z;k&G!h0uWN;6W3ueb1LEWX}EwTpum^;Meia_rLnWPVEMT%>BHo+=oWGs3(Plb)+ZE zsQ7EM{g|CsZ8ZdvXC3RiSnRW60Of2aZ z)Zh2}xYUtU}1oP?^fgDN1}XD2?`JRx2B&iS;WhzADg)|r!LWRsZYwbMU()22KW@T->nHV#izjvG zo=klm*~{C7Sh7jh_h*9u?0Oq!SJFFG#HNGmz_Xc{ zDoM&p;{HNjvu=B((e85$5a}#?0oI8vu386$zQy2kj5IKDE+Sy4kd-g)-OO_UZ$hSN znh?3eH~G3hzoUq@+tT?<9H}!X#?7f3tCx#ajkk^rKg)`Ma?3sa4g&!Hlidt!9mWRv z8L}|^<{8Hf7-Ngb%;%t=;b$}q(Ex`ZUWi+0m^!z751|PjP^r=-NB;=D|O5%QZDI3HOj=Ov4&g`uP<>>reK6D!T3D4?t$-O_|;l z((xug!73;1AjFms-EPD*m-4jTRgGOj?P-NdZ?YU(wJhZ^q1OgC zH)id3c?EO+(ztc3{}#z3#os`6Y|h>yiI`4Y;y3o*>pkd)e!)&9n33f*<0&t_8{SkLy-=Z!hTW)I`|srV<({+ zeH(s4qK|)>nSp#k=ODRxcgw89HWcIk)aL4|D9V+hUy!$z1n^mOIfpfJmK7#PNl6*r)Q?&@h~lnwQR-Q$ z`q{T1L!7#T+fO8>#hsce-qVnwMh~BBSEbSbml||w8hIY!nHVz8Gfyk1*yW&~&6_e#|ZgUx*gXeaWwQLG6b_*1b zEzciAbnJZ_@hsv~uz|zjz3-pT76-qDP;pw2t37V0!iBHWeeGF7gkgtqpbRB>F4nLk zEJ8ba<8Kf9S>~Gz+?_L&xPCnqta;@jw(?Zj?zl-!K$)<7vbBYZaS?eFRy$Uv2(%tc zFXdoe@g~iCXJSvig{5{@s=g~T8?E62yy`(zJf%NtAf4?*-CNtFpKm1{4UT?vd4y>D z($C$AeM=su0S4X+t?Fnw_fTQ(W^%ev{s=~lXuEIYWb~2g1)%lhRYvrlp%tWV8-q5W z0Mul#4w3l2h`WC4)n#9C?Z6#F|B9POGgdF@>_*d0CxB#50Yc^|s3$WNq3rgB0Huua zD)jZQ-Aj&e!2Z$9r*k`W;lykxzm~4n$@lT!{qYljhH6m;0eSxwxGnu6(^e+CH zTv)9kxPZ||=n!i{`c%{4xZdY%KFqeo(V^mT#L2!ym6^C(`936JA?yXE5hZMttVDNu zh`-i;OuQq+tAFYKkv>)yW;KljJ4@BWMZ-i=I4D)iC}hP5TaH>mR|j}B6J7^xcBYG)0tS%P@!P)tti>` zUNcV3(Ncc&JJ7tk0sLwyEnY4^%hNX*c-nD&86hsUS?|g z^CkI#OtfD>YwOHBLR=tZ-AiiV5hv?2dH=AthQN4qd3lea=;YIWF$u6ce#&Ab>P5?I zVwCthbjpcEq37u?SP}=0jWUQ(?{Hc-I#{#!8n<2ipXjgbW_+kOq+;=vN!Rx3>EVC3 z$55pR9IwC4FSK`7Kej$aT}u+9*Vjr4(4{%2yj+&6-ih)zDoZ(A{V@jM7OT6M5sDtd zC=QkNzgHr>!@X1_OZ~U9TE0hNYv=qswGK&Y?|{SB-#$jpqO~!u{CwSXU%lD0s*~IgxndW8jX?E46@@EKK7W|9i+0QN{#@<}4Z#to^@>n6efkEMy45U|- zbrxdBrPvFNy^9y$yDfzdDT|_r-b-R`Q}}=h{yz9p&BE zNBp(LpMbQ%6FxBuwytYEOs8`@ze)dT5(yb4l+z0>#>wa{VSd{8@T(~QQ}`bN3H5R< zU!X>grKPf6_y9YT+ANC%N5Cv3n|$DNp?YEh^;uq|50^bd?*9{Rn9XrsfGN^pelmC0 z4C7$p zyYyQgoF!mWp`5R8Y7*Zq^AdE&j8Fo!YW2?IVtUSp^_Y!Ky__2uPF{U3y>8NfUleUi z!ifVFck}{-vJQ_f?OquTcJW}8az=}0cO^NH_arUcM|tOxDY1a_%n`&&$j@WmuG^1- zL9^I=(ie7$d=Eg#MLkOg%IOYLsOxZkiCuD}V%1=QJd`{_)R=TeIfj;x4tjkuVM|x_ z+n9P%V#H^6e(YEnKx@ytE1)4l9k+zA2i=|EkgM*Eh$b8<*5490Rn8Bdkk0BZe=B#q zEI&C2PM)2c80u(4D5uJ{BL5c(-AM=eXvb_vkko`R3N&LDUkXD2@6mA(HBd_^7nx}U z&B#0V0)6|XEEiIhJy9Jd)dj~qE02;gvwG9>^Wt=_bT)xsG0GlDzcCV}#roQD zuGe}<^M;!SlO~O()DTQMdb>}I=JIzYT#fe()ACXjapal^y8voOPX%?&!*Pz~yQ@&n z2?+HqHzQ52TS5K&%pXJ5w+lJKG_r#NsqQjI4rDNzo4V~_`1gqb4j~l^C2a7?e0U6P z{@m-}38fNt-}}4g6(4TYP|=9FZaSG!NnBM;`ix6y}ShUE!M?EjxlQTVP6XKX?rzrS`MGvkF}0SN zU?oI+OZ~3t-4`SVTxIGHjO-3Kjf;iXfM1Bt7z-w zfsLE|Pps44fA&=X^bg6?X_k1ud=w1ugwLw)w&8igI8lqGSh#6+>-N`DXi$&Gjs0(T8@h}T7;X;W!}u|? zRPxVzo1FTg4JtdcY$4i=c4%QHpD`0c%m*;b}W{QRhG~ zV%~deo0+;}`J$H*?^62Zu#H;P+2$5@Va&&dHCkCM#f?j zoNGj$Y;~FlsT5=oFI#%Ogs3CY5XToEkF0!OUNfA4gN`cP$;?;Fe0AH zD8)%ZuASSAt(Y{S0?sdoq7RgBku(Un-{`qUL?foV68L?5pQ?Yn|t!F-n8>qe;)JTbX zy1Z~Gs%w4`0TICqZ_}-K6S5SylKPdmXlp-+M)!>*@{*MOd&pC z2MQ7qa=AF%XUwFyggQ$m9;+!Go4aS-eM20?5|v@bNG+E=CW(Zma1%w}o(SB72I;4w zh?q-Ij8}G2oZ+h~<0r|ud@Sx#8){ERUVe+Z^3w>B6rzht-J_J^HiE7aCkJDNw3*tp zzfg43v$ZA69bUE>>c1e|iLjmvx%lWPjkll9h9ikM`JMR+NSateVTffM&EJ*>>d{w- z`!=d?byw-bX5th4X##3Lar3!q8_df#(n7iuNT=^1a$o^@$1pXeZ@j~Hp9MU^9%4AS zILdhKrC840`f3w_9!g`$7I;_F`anz<0SSAApm<|s?uxBEnwWlzZg4?ZTQ)5;Idy{f z_d4V{rw-M_&6*Z;W)`eXv^Y!rMnYQ)!1ZcOgjVl!T6L>vwLF%@V^WSa9!rg;p&<^< z^LpKPV#IMs<_e0P_MNtb&8j;lcVjtyvP~I^#14&`mf6b*WwXAiv>&D0Rt{Zk`cj_h z93K||4?vCCxv92*Zbr&TZAJ*$ZBs)Mp4Jy4M6^^oS@gy-94Im#B8yIlQwwRKaN1vK z54k8s2L^>z63my%*6}6uly8v;dgY~@b-ich#&JQQY~^9I>)z_gE-y)i7JJRyy|WHP-rsWg&$B2o6Plx%Bo66 zX$nNqLU?odxs|0v!{62VX?|z@O|8X>VSH;l)Zfwu3-YVgLDUGNZ%36OpuXPgfx)Pc z&p&Jpk8B+}9s8*H*mNN6ur;G`qOAFa8*_(EBJFlZNtEOw;9$4Q8V2`-2<8mkpfMhE z(yR?$GC2)`g}vWlX}lD=1wJuEm8PvJ+vU22i2snEO)B!!8q`Hq+c8( z+}pesn8tjx<(iyd_n{<@^T5gl`v3)RrX^|n3~dMZZ}j0Shh1l(fPqf(r|5zxS1k|P zQsYT}GM1Z7u6*XBxR4scv*H}EE6*n3SwBj`eg$V+Ne`9NJ$b5)EL)MgoMJd@LyPzC zO@DVhn2)i+`)q*JuBY6FjF9H_YP&1R&|irn+p_OItmtqi#ZvKv2Uz9nn5!y{)#(;Y z+YJ?@Jgt92382M0<>~xMVI9jiq(O11??CFViyHq{16C{GgOks+N@b6R7jkWa6!74D z(05(QnRTXz=<=%6EO@|Fer#619zf+Uo*WAvjd(6P7u6SX#N>}Jk|y}9sbLL9^Fuqn z|NKOjW|ox)N?56<1YsK88Fy$f;41#^cIMOU4<@=@ygZZK9BB5PI%v>_t)@$~3q8Rg zxIyEW4%>j=vyPx7Hxd=i3XXP?)r5|@D+apDjza~IQ}y@h*og-IRUT>viyELErQgE?sHT4N-g$*DnZ)^o9D~913`YIB|jYDhBk3k=8x%Q zVbv6LO)l)z;}|UHQ~EtxGc)e{L;HvJ08EaoYG`z_$O+a}RaW9V7tc}%E_47GTO+UX z@z=~p>5@b-xfn1YGG=4^HC%$N(La4F^V)N|=nWcbek(F=j-=gJA4wYo9f=~DxjCA- zO^3-GFJ4PNd>pW(_C1@`g0UdGWTT>{S}%2g6#cJRSYM#lic9ia&|00Sq0hifNIiXs zDFBJsPdIjAU&XC^6b@Nuc3i=hv8BP4&*1u6=5fs^`Qvp^`~GS~-DVoJE%dq{gJC@1w83YTXKM#Zj4S(lw&xRJ;B_Nlm?TLL@+#dr$mE^y!SX*20k z^FG3Yo42;Spo=~W{TG4aPE*2nVzN=$s=k9!Vj_XO{pxOMVbep8l2|tjV(hAnh6oWu5SW$+2iXRAaV^smy1|-#~YFL^;wzb z81?Lb2Z%csS{2e|9b%}CRgZ`p?7h|xOw_WW+ZDGA5OGBgg5zL=32!L@w>_l?7 z$aF{d&5H+&I+-BJB_jx4{%C-c$Ce~5Aw`-#hTAV zzwk>d`SY&8yiL|6+|C`-%T9*PWBYzU@(rI!0vwQ*6ag`&4brokW!gRomAWsral2^- zXE-ne>i8hHq384sP}~DyoS*}^6CV({NLFw6SSgGoiNT|_1pp`+Z>lKYZwX>O4{)l4 z#eVzIe$Lnp9P7?Ef4om*d9lax`Ky3hAKoMjtc(iIt>3Apdy?rjo1DiB*$l(My!fLI zdA4oPg#U~;=_VW!qd~0MY+_^FRjoIx{g7SChOmukM8F*RQ&|KVay%^bT|(a1ZXkTJN0vR&h(jZg(#Hi2gms zgFRFQEe4Q&hyyW}od=kU43%o%xf)-N2C0kXQD}gO#^SJJVd%QP0RE8b$n&K`%-*i(nUV65BM?O`i_Xt~Vw*A53bz8q`! zxpBN!eMH=IIz9R$JCGYR{ur`Qea9AUXXvaA&gG@Oq??TsxQk4AlB7|9-g(_+I;6&( z&k`J?*M+p)uCOZde-yfpvKgZP#e)MyYqGdNl+Ch07DxpFPMDm_w9kA4zDOupbaZxh zcIJxGA0!0IPkRs_b7p0$hES*K#J{-P5>emB&BKra`GW%#_9A#bjYPUao1Z>XF@~HO z{UCg@r9}KU1tp_o{(}U7nKoVMf09W5n~UIQP=0qI=*>VdU6%o&LHZ0n#l~)jt!B?W zI!(QZ7eMyF6Oeu=M*P{Q-7VRf0!klgkhxoTO*Fk6?znN{HzjDyug*ki-BII-+j`yw zYY6%*#!iKo;QBy~G$Nle^-VgF;-6cQUAX}zBjs$MDiQj!YCXyKW%b=sdGGaRDo&M} z*l$nza9v?CFbzKd3v3F!zl9x(h3%lBoXq`|vES}PyW^|xH{JIt$*W+u)ne06|6%Jz z%a+H*;Si>Nr(BX9vgjbDuT#2)Vyl~mX5Vvt{1iNWW%`;rnXDNRK+RH}#QlZU;0nGO z%4wa*JXkesdSxi=4YfsJ%$A1RSXQ;6-6UaY+5O$%H}+i?@%PWtQwZ~&;nb-ng1rgU zoDB}Z2IL?oc022uq$8w@rcOpEIG?xxR#yb9pDO@Y=8x*lrd~$ZZ-9GZzbI!zkQO~P zvOz4aIUx31oBP)}Kr!-e$EMS#;?sNXH>UH`mkQMttJRbPsBMowfThbK7QWojT$=YQ z&-`VhbQ}-kY)}R^h~oLa_>AZ@+6~H@oY*1u`SH2!zt`~uqC9dcL z<(HT!f(~a2FQ8-Zo@`vhg(TRu1rnGaGJz!%JG5%@!<*Fv2C0$N^9vG;n5f3PEew+S zS&JgKf4+WZoDg>Zh`3AVuvkx%X_=zOp^Ij1(}J=3Lx_(`0_@2BDjnAsdE>NVG5BD` zHLSMg!|2yZ;m}`1oGMzH53QNe9zZVGGO^Aoe()d#l8FZEDaxSCVwO)6iByJ)Hr%lUSQb;USva$$yiqZ!%V32|`MoxjZ4pbkusZYITUpUdY$2F2=h-sSvKoRm$* z$!mQ@u6+gP+o!%jsi7Ai6)FknJ@aIY^1vU42U{E{B)wjTf0HrQJf!1nKu}9fn_wDj zzxy!mu>f+PV}*~Z)qJxF+Po^DmDlj~u$-z+mQ#g}D-;cEvG|b^NAAgwFM_ygmGPIZ z3)g5ZOt8tJs_Y^o3tld49s3SSb`<9}6ZrsO0*>zMnd^6y-9uU)5Rgc>6iq8JF}4U={yD5l ziY=C=ZSRdp+@Xeg9~KgdZfNEun%>36*lB!xr#w|6K;N#3itIrTrNZ5JQcB;;eY98` zq=$$WdX#7~P!@(S1)<}~7Lq~(ZzF#DUkP9YZ;QX^qY28yrSXn}+ifJV6vx1Azl$_M zXq@nUFStmRX_Sg{W26c_r113QF$*N>?%wV*BvBCB^A$~`^st(eGX&wqdbh>pDU$1n zLpqTIXf5t+J#jhm7U5#Q5!2!et5cBW;;^3fLOKLedQSxQR#b9vWUutE-8|}Hrc+ZY z-jaHZA>Ec@qjw_b=IB;eT2*0t*_9&vrFtT17OQ6Ynx+)QA==U7CqZ@cToyCe?yG}QLpWNJ!KAb<_* za(Bu{^~8^ym7>*aG)oXcx&=LjUFOF7R}4aaqk5DDOao*%UeF-rKPc~@#y_C`X_X5n zK9bz+m*fROqG+n4$ZDBQmIi1LsBL%Oou#2ZmEpMCB9;1)6f_u+o*0Pns63c)hz#PR zjzC@cXpPj-(9=2TdCwV!KBoeI8T1IDWD;CSbcpPe;&2De;y|O!8+p1mG?A_%MA2Z^ z;B~#=l{*TrKL6t8U~-~^+)S`bA`(n9v*MV88lVTDL1OS0SLybE3A@kNz(Hp!-UAK1 zRxsS||Arb_9YgvlSmg$spz8Y`V?a|dHsnxDVGTRZVSZx>0GKJClB+O zij=Fm(hv5+;Mr?OK(5O}_fHQM^WUb9-oN@;rh?-w6}Vo*tjPIDc@CF8#copq8dfTO zPU9N<`tg;dMi+IYyv$2+@xlQ^j~%Xy!_9dU>5#$XOqfs+bJP1cP9B@oo80hWzo86WC zM->9U2vF1JNg?Mf?xb42oS+ZgsseU5c9Ttu*Yb07`vh>`p1<8 zZC3D!cohfs%#yOvAm60>&_2U5L)bs>IEh3#kU`_WUPAvZv+T;7|I+GaB!4SHO$(0g zKaHVABGZz&Ip#HPMTM2B5NvQ{XLZq7|Nh^PB#07%?m!C-pda`5Ri01E?8k+~<=pjndcGABxYoL7S@jdnMpDr)I zEI^C|=ggmXTgaOa9y|cGb5$)XE33W-f4|}UpCV>aS OfSan?DtSn=SN{k63WwDI literal 113419 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 z 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�b7+ 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 literal 4414 zcmaKwbyO3MyT&)9Ls~$Ap}+viucSzh8cK_!8QrCfbcDd9OIjKgq#HqCl(ck>X21vq z1c`wouD^TE@0=Uw-akI?^Y8o5^PcBKE-U4n}mom>u-|)VJEjQsLnl(Ic7o%kJ2zEH%%)idSlRwNT*M&;hEpJIt)F z#+02v5>Mo^S>*G*==NZ9d#c*IZves{KbubaL|#*Qww(lftIYlWd&y8P*rBXA710U& z{$_>!^m79B4qwu#DeF{HXOi@SSLV|m<2!x7#bEv>f&;6?2$eO5H(E$ZN$nPXPC@}m+M{+-!hnOhBPP0z4 z2`}C1mzCRp@crQXlIAfX$9rt4#oI9$e}LTf1HJZ}eg5JF3Gw}y;36ue6L)B6gxRll{sitk4t>1{T!ds-WQ-Y?nT z!=uU`1o5m*)T(YCy#tihzu68F_d(?e&AkZv{4jABj7d>odPE8CCK2E2+RTdOwm$2& zpKR*C=Y@&L)gzp4i-}cZUbQ|Y1oAu&5kb@Xg`{|0NX!RGFyJ1fzJ@#}G7Rfh85#mZ z7cZ@QKJ8Z~cF@el`2{04BCftqBM$xL#%E?exx$$Sr}JYyU3XcX6+MmbpI-$#xjHvh zh3@@v($MMl6A%`rnZ5F8W7>x7l_Tb6b5|&QV+5nr3eH_H@|D%gWVh-`=Us+V0ks>$ zgG&t*mS}?OAmJtL00lA8Y^uoHD`SjvhoY+s@2|NTdQDFec{~EF8)D|>O;CpxU-LKL z%~ClEY^Q(^lT%1`F;`GLq$0JxeH?bhZHjDF;JhaoL4kS;GYVs^0lYrEnR_h~5yg=D@ z)H@t61tUQzWO=%rbFM?$uRAqyIK3wCl7pksEl@%Ib92Q355l6t0)Ie9US}zEp`abU z;4miSI}H~Ydgm1z8P0^OHP)JjithvcB6=fNXa_A@9{p%e;dJutW%qCWZExJ@l0`?z z`K(Z2mGfCKCV|%A9dD^KtNhm|3lCBXeQWIoZTwFrO4b(Cs6Jf{Zs-4sx_URkorPbd zPul|1M#&sqn4xef_88(QE5dAL0%lC$ZuwL16f&)*YqneBhR!5v+@Boqr5%;1EN_SM zgpGeV#Y9Q%R~UM=DEbX(G2V>0Wct6C)f8P< zx>uG-xVh+Oj>(@&#AWH-OVGP9weEj7ms?&=4w9Dain2J> z&~=b(4^;j!kw404K^)!oTw}wrE;A>GomH|-hM|Ip;2F4^9xTcZ{_CVM*&7*w_Q)Wv zoJPM(_LX_l+`UgeSojsq%DFm^aKAF))h|9GoKZfs?(`-}l<6E9yM^SC=(CKrB}T7d zWli2Y18s2l8oqeFM=jb4upF4afs5 zw7tl37Lx&H7^UY`Vp=WeHW0|OpK$FneScfsB3~6c5KW#GTiqgZqQZb~WN1@}PD)~= z=VHkZsXi6;P3@5v!s@KJ4Q(oJNwyZt30uAuJk~)MX?gEU-*4T1L0td!Yr*H=@J(Tk zi0DlVzWrTFy^A{^?Z*FLUkT|U`==(Y5P@Iq?YWksivjw`@VfTHUB`T0pCeGdpQQ}U z$uuGZQQTPzY@!*U$S8P1n^|$5^fP1G?N3fMCtN6?1G{^xpg@xRmx!_I!%M}!S%tMa z_zIW%sioG3US8b%;Wa@xDZMvlmQ-(ihO~9|3c_Hm-!U$TeU(uWdqS0XW$RqiRFaQ~ z^Q4b+3IpGuo7X3>ko@VvBxlu}3=Jl|gh|B-vvW}}pdx`& zTj`1K5-cpGh#k!TVIE~uWKaJ-8s3sYjfxc+%^0nGqQ2nGU3HH{@oYtzpQ_)RG!W~b z4Jzx98R~}d4``y~g@TSQcas)oL~shO>G83GEw`L;J zMAciWS+dBeeSKA)zLsX+(}^55l4tSB>Bw8`@3y5Cy?q;Mw5>_U{h;P}E4In=@mHd6 z^g_2E_$!VIc#R*WG-#0{eBVg(alEy2ge-TLhi8Y$ixFmM-bHN&wfMI`V`}JCi{t%k zwP3CSPetKMqiEXbUEmRK_+S{M4?o0)`=cxUEF^3r{}Bi2*-7N{aiFcQ+Z+8ifa$rI z074mQw&Y~-6MH#Kb^Z{#q@@2J0<1`&b3Dhw>A}Kxau^j;e%9komg@^C^W%C!fWj&@ zU$^r)`iT}^J1fV~L`ZdKpLdn)*J z`i#Ln47Gwhd$Y6-CM;2*5(h&D^Bd09sfX{5;RCE}GPzhliy+&yASQMe(1B>a;;yKc zs<)oMIg*`; z>qn$*c9Aa+P7eqB?o~O0h6m*a+6OTPQY~#Ayt+O2<~sqIdLX-9 zzk7}Gf45S$eIyz6a67B_JCzMv!+R@kB1GCDUGT;PRfHl!V{f=UhnzsJ05DxA$G0lL zinHlKk&@Ysfq7$_KDSZBzQu-3eJ(Rx{ON!ZWPz`w-&ZgCL;dvUXKC8G7H2K}Y53Fe zJCvMH&iPdX#Q9De8R)VZ+yX1YbmvdIU`+;0cl#Q*{;+cTE~`~g1ZxFw(E|gwt6EGXP5#VQ>UI>S zNx%7t*C8AtQt5h#pr+@hDPQ%^<~j#k0LL}gcWG~pGJ8O$!MEL*M&ttfg87@`y1P>{ zrEL0(w-!k7o}x=_`*dQW)Z2Bzs~L-I|gEl6mZW{RP2&-piVn2E6X)Aqv zvL-21j)8dB65YxQ>cxH_Ss+9NZEUZ11^(#U`#XaJ-mLzKFOk z*S525u%&=$7rb%iGf=bP;E8s8g6+CcSWkRoBYyQpvUQY1tATCk`$J$I{qVZi^zY!6 zn0Fp8KuQ$ze)&P+-q8;UPsd8^^Mjc+$WiIG^pN{NhW{7(Yro2(o6l+zL08%QzyC{R z_;+=PNDNEUYW=xvb!i@5iz}Qz(TEf2c|oLll$MsEd1S3ZX7Xy}ZO=%FALdju;-Fjd zZ)_@GF%jN3TC`GOkd7XI(X1Y7jvT38b;*u*G3K71x5*~y7Lp*p|DVT+p`K#p^1bfe zWYVvIN#oHf4_^qStB6MVac~ITnju*y+b%$nopj)k$QMB zIv}oOBRzj?!(Di!>@vb1L2|z50Kg?Rr+9tg6?f%$Om8^qQ?v&Sw3=L9Z z+&xUU$+=_>MC4@M?dn7sy?00-y0uY=*bUo@+203{^guXMU+aI^323(~ExjHxyf#5o z6@F|srkpCVprgnXS=|oUyl5O%(O)#EwM?iYW6$}Jn=tayk5=h###cT|F2<9|1X34V zvWH$(uyHibH!tSy@hSF%}eIJu7%&Ak>kya zRKg~(ae{e`9$Z#WWkQ;63t*fN1y&5YE7OvUV-T`%M*tTppxqr_a}65asE$YLJS)F| z90i*xPe9W&RIQ6LQx6d>UN7_ER48``7eaWMu7q08WO(i5#8e?(t#!lB-^(WZn2IgFxLQ~9x#4UQXcLuk=#5lF$)2O0NFr!YV%H=`haZ_+CYUR zS&udr27GoB;22qXo#Z&|@L@4!uaMJ(db~>=ZQC>Tj|^qs8x6D1jVY>;w;0(6%+V6H zrJ1S|418G2bxN;m?LK0|9HdE Date: Tue, 5 Dec 2023 14:44:00 -0500 Subject: [PATCH 114/281] Updates barsign and fucks everything up --- _maps/map_files/generic/CentCom.dmm | 33 +- code/__DEFINES/directional.dm | 37 ++ code/datums/components/wall_mounted.dm | 59 ++ code/game/atoms_movable.dm | 8 + code/game/machinery/barsigns.dm | 487 ++++++++++++++++ code/game/objects/structures/barsigns.dm | 682 +++++++++++------------ icons/obj/barsigns.dmi | Bin 159072 -> 210663 bytes yogstation.dme | 2 + 8 files changed, 939 insertions(+), 369 deletions(-) create mode 100644 code/datums/components/wall_mounted.dm create mode 100644 code/game/machinery/barsigns.dm diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 60a5237310a9..79566761613e 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -14882,9 +14882,6 @@ /turf/open/floor/carpet/black, /area/centcom/holding) "aFc" = ( -/obj/structure/sign/barsign{ - pixel_y = 32 - }, /obj/structure/chair/stool, /turf/open/floor/carpet/black, /area/centcom/holding) @@ -16347,22 +16344,8 @@ /turf/open/floor/holofloor, /area/holodeck/rec_center/basketball) "aHM" = ( -/obj/structure/chair, -/obj/effect/landmark/thunderdome/observe, -/obj/structure/sign/barsign{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/obj/machinery/barsign, +/turf/closed/indestructible/riveted, /area/tdome/tdomeobserve) "aHN" = ( /obj/structure/chair, @@ -16647,9 +16630,6 @@ pixel_x = -3; pixel_y = 5 }, -/obj/structure/sign/barsign{ - pixel_y = -32 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -16698,9 +16678,6 @@ pixel_y = 5 }, /obj/structure/table/wood, -/obj/structure/sign/barsign{ - pixel_y = -32 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -69586,7 +69563,7 @@ aEp aEp aEp aEp -aHM +aHN aHW aHN aIl @@ -72413,7 +72390,7 @@ aGP aGK aGP aEp -aHM +aHN aHW aHN aIl @@ -73445,7 +73422,7 @@ aHf aHf aHf aIo -aEp +aHM aIL aIZ aIZ diff --git a/code/__DEFINES/directional.dm b/code/__DEFINES/directional.dm index 85d746a43882..83d8ce01d0a8 100644 --- a/code/__DEFINES/directional.dm +++ b/code/__DEFINES/directional.dm @@ -4,7 +4,44 @@ // #define EAST 4 // #define WEST 8 +/// North direction as a string "[1]" #define TEXT_NORTH "[NORTH]" +/// South direction as a string "[2]" #define TEXT_SOUTH "[SOUTH]" +/// East direction as a string "[4]" #define TEXT_EAST "[EAST]" +/// West direction as a string "[8]" #define TEXT_WEST "[WEST]" + +//dir macros +///Returns true if the dir is diagonal, false otherwise +#define ISDIAGONALDIR(d) (d&(d-1)) +///True if the dir is north or south, false therwise +#define NSCOMPONENT(d) (d&(NORTH|SOUTH)) +///True if the dir is east/west, false otherwise +#define EWCOMPONENT(d) (d&(EAST|WEST)) +///Flips the dir for north/south directions +#define NSDIRFLIP(d) (d^(NORTH|SOUTH)) +///Flips the dir for east/west directions +#define EWDIRFLIP(d) (d^(EAST|WEST)) + +/// Inverse direction, taking into account UP|DOWN if necessary. +#define REVERSE_DIR(dir) ( ((dir & 85) << 1) | ((dir & 170) >> 1) ) + +/// Create directional subtypes for a path to simplify mapping. +#define MAPPING_DIRECTIONAL_HELPERS(path, offset) ##path/directional/north {\ + dir = NORTH; \ + pixel_y = offset; \ +} \ +##path/directional/south {\ + dir = SOUTH; \ + pixel_y = -offset; \ +} \ +##path/directional/east {\ + dir = EAST; \ + pixel_x = offset; \ +} \ +##path/directional/west {\ + dir = WEST; \ + pixel_x = -offset; \ +} diff --git a/code/datums/components/wall_mounted.dm b/code/datums/components/wall_mounted.dm new file mode 100644 index 000000000000..335f306f4f7c --- /dev/null +++ b/code/datums/components/wall_mounted.dm @@ -0,0 +1,59 @@ +// This element should be applied to wall-mounted machines/structures, so that if the wall it's "hanging" from is broken or deconstructed, the wall-hung structure will deconstruct. +/datum/component/wall_mounted + dupe_mode = COMPONENT_DUPE_ALLOWED + /// The wall our object is currently linked to. + var/turf/hanging_wall_turf + /// Callback to the parent's proc to call on the linked object when the wall disappear's or changes. + var/datum/callback/on_drop + +/datum/component/wall_mounted/Initialize(target_wall, on_drop_callback) + . = ..() + if(!isobj(parent)) + return COMPONENT_INCOMPATIBLE + if(!isturf(target_wall)) + return COMPONENT_INCOMPATIBLE + hanging_wall_turf = target_wall + on_drop = on_drop_callback + +/datum/component/wall_mounted/RegisterWithParent() + RegisterSignal(hanging_wall_turf, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(on_linked_destroyed)) + +/datum/component/wall_mounted/UnregisterFromParent() + UnregisterSignal(hanging_wall_turf, list(COMSIG_PARENT_EXAMINE, COMSIG_TURF_CHANGE)) + UnregisterSignal(parent, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED)) + hanging_wall_turf = null + +/** + * Basic reference handling if the hanging/linked object is destroyed first. + */ +/datum/component/wall_mounted/proc/on_linked_destroyed() + SIGNAL_HANDLER + if(!QDELING(src)) + qdel(src) + +/** + * When the wall is examined, explains that it's supporting the linked object. + */ +/datum/component/wall_mounted/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += span_notice("\The [hanging_wall_turf] is currently supporting [span_bold("[parent]")]. Deconstruction or excessive damage would cause it to [span_bold("fall to the ground")].") + +/** + * Checks object direction and then verifies if there's a wall in that direction. Finally, applies a wall_mounted component to the object. + * + * @param directional If TRUE, will use the direction of the object to determine the wall to attach to. If FALSE, will use the object's loc. + * @param custom_drop_callback If set, will use this callback instead of the default deconstruct callback. + */ +/obj/proc/find_and_hang_on_wall(directional = TRUE, custom_drop_callback) + if(istype(get_area(src), /area/shuttle)) + return FALSE //For now, we're going to keep the component off of shuttles to avoid the turf changing issue. We'll hit that later really; + var/turf/attachable_wall + if(directional) + attachable_wall = get_step(src, dir) + else + attachable_wall = loc ///Pull from the curent object loc + if(!iswallturf(attachable_wall)) + return FALSE//Nothing to latch onto, or not the right thing. + src.AddComponent(/datum/component/wall_mounted, attachable_wall, custom_drop_callback) + return TRUE diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2b8d625a76a6..67607e1d09c2 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1205,3 +1205,11 @@ /// Ought to work turf_mask.color = list(255,255,255,0, 255,255,255,0, 255,255,255,0, 0,0,0,0, 0,0,0,255) underlay_appearance.overlays += turf_mask + +/atom/movable/update_overlays() + var/list/overlays = ..() + var/emissive_block = update_emissive_block() + if(emissive_block) + // Emissive block should always go at the beginning of the list + overlays.Insert(1, emissive_block) + return overlays diff --git a/code/game/machinery/barsigns.dm b/code/game/machinery/barsigns.dm new file mode 100644 index 000000000000..1842a2dfbbaf --- /dev/null +++ b/code/game/machinery/barsigns.dm @@ -0,0 +1,487 @@ +/obj/machinery/barsign // All Signs are 64 by 32 pixels, they take two tiles + name = "bar sign" + desc = "A bar sign which has not been initialized, somehow. Complain at a coder!" + icon = 'icons/obj/barsigns.dmi' + icon_state = "empty" + req_access = list(ACCESS_BAR) + max_integrity = 500 + integrity_failure = 0.5 + /// Selected barsign being used + var/datum/barsign/chosen_sign + /// Do we attempt to rename the area we occupy when the chosen sign is changed? + var/change_area_name = FALSE + /// What kind of sign do we drop upon being disassembled? + var/disassemble_result = /obj/item/wallframe/barsign + light_color = LIGHT_COLOR_BLUE + +/datum/armor/sign_barsign + melee = 20 + bullet = 20 + laser = 20 + energy = 100 + fire = 50 + acid = 50 + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) + +/obj/machinery/barsign/Initialize(mapload) + . = ..() + //Roundstart/map specific barsigns "belong" in their area and should be renaming it, signs created from wallmounts will not. + change_area_name = mapload + set_sign(new /datum/barsign/hiddensigns/signoff) + find_and_hang_on_wall() + +/obj/machinery/barsign/proc/set_sign(datum/barsign/sign) + if(!istype(sign)) + return + + if(change_area_name && sign.rename_area) + rename_area(src, sign.name) + + chosen_sign = sign + update_appearance() + +/obj/machinery/barsign/update_icon_state() + if(!(stat & BROKEN) && (!(stat & NOPOWER) || stat & EMPED) && chosen_sign && chosen_sign.icon_state) + icon_state = chosen_sign.icon_state + else + icon_state = "empty" + + return ..() + +/obj/machinery/barsign/update_desc() + . = ..() + + if(chosen_sign && chosen_sign.desc) + desc = chosen_sign.desc + +/obj/machinery/barsign/update_name() + . = ..() + if(chosen_sign && chosen_sign.rename_area) + name = "[initial(name)] ([chosen_sign.name])" + else + name = "[initial(name)]" + +/obj/machinery/barsign/update_overlays() + . = ..() + + if(((stat & NOPOWER) && !(stat & EMPED)) || (stat & BROKEN)) + return + + if(chosen_sign && chosen_sign.light_mask) + . += emissive_appearance(icon, "[chosen_sign.icon_state]-light-mask", src, alpha = src.alpha) + +/obj/machinery/barsign/update_appearance(updates=ALL) + . = ..() + if(stat & (NOPOWER|BROKEN)) + set_light(0) + return + if(chosen_sign && chosen_sign.neon_color) + set_light(MINIMUM_USEFUL_LIGHT_RANGE, 0.7, chosen_sign.neon_color) + +/obj/machinery/barsign/proc/set_sign_by_name(sign_name) + for(var/datum/barsign/sign as anything in subtypesof(/datum/barsign)) + if(initial(sign.name) == sign_name) + var/new_sign = new sign + set_sign(new_sign) + +/obj/machinery/barsign/deconstruct(disassembled = TRUE) + if(!(flags_1 & NODECONSTRUCT_1)) + if(disassembled) + new disassemble_result(drop_location()) + else + new /obj/item/stack/sheet/metal(drop_location(), 2) + new /obj/item/stack/cable_coil(drop_location(), 2) + + qdel(src) + +/obj/machinery/barsign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) + switch(damage_type) + if(BRUTE) + playsound(src.loc, 'sound/effects/glasshit.ogg', 75, TRUE) + if(BURN) + playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) + +/obj/machinery/barsign/attack_ai(mob/user) + return attack_hand(user) + +/obj/machinery/barsign/attack_hand(mob/user, list/modifiers) + . = ..() + if(.) + return + if(!allowed(user)) + balloon_alert(user, "access denied!") + return + if(stat & (NOPOWER|BROKEN|EMPED)) + balloon_alert(user, "controls are unresponsive!") + return + pick_sign(user) + +/obj/machinery/barsign/screwdriver_act(mob/living/user, obj/item/tool) + tool.play_tool_sound(src) + panel_open = !panel_open + if(panel_open) + balloon_alert(user, "panel opened") + set_sign(new /datum/barsign/hiddensigns/signoff) + return TOOL_ACT_TOOLTYPE_SUCCESS + + balloon_alert(user, "panel closed") + + if(stat & (NOPOWER|BROKEN) || !chosen_sign) + set_sign(new /datum/barsign/hiddensigns/signoff) + else + set_sign(chosen_sign) + + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/barsign/wrench_act(mob/living/user, obj/item/tool) + . = ..() + if(!panel_open) + balloon_alert(user, "open the panel first!") + return FALSE + + tool.play_tool_sound(src) + if(!do_after(user, (10 SECONDS), target = src)) + return FALSE + + tool.play_tool_sound(src) + deconstruct(disassembled = TRUE) + return TOOL_ACT_TOOLTYPE_SUCCESS + + +/obj/machinery/barsign/attackby(obj/item/attacking_item, mob/user) + + if(istype(attacking_item, /obj/item/areaeditor/blueprints) && !change_area_name) + if(!panel_open) + balloon_alert(user, "open the panel first!") + return TRUE + + change_area_name = TRUE + balloon_alert(user, "sign registered") + return TRUE + + return ..() + + +/obj/machinery/barsign/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + set_sign(new /datum/barsign/hiddensigns/empbarsign) + +/obj/machinery/barsign/emag_act(mob/user, obj/item/card/emag/emag_card) + if(stat & (NOPOWER|BROKEN|EMPED)) + balloon_alert(user, "controls are unresponsive!") + return FALSE + + balloon_alert(user, "illegal barsign loaded") + addtimer(CALLBACK(src, PROC_REF(finish_emag_act)), 10 SECONDS) + return TRUE + +/// Timer proc, called after ~10 seconds after [emag_act], since [emag_act] returns a value and cannot sleep +/obj/machinery/barsign/proc/finish_emag_act() + set_sign(new /datum/barsign/hiddensigns/syndibarsign) + +/obj/machinery/barsign/proc/pick_sign(mob/user) + var/picked_name = tgui_input_list(user, "Available Signage", "Bar Sign", sort_list(get_bar_names())) + if(isnull(picked_name)) + return + set_sign_by_name(picked_name) + SSblackbox.record_feedback("tally", "barsign_picked", 1, chosen_sign.type) + +/proc/get_bar_names() + var/list/names = list() + for(var/d in subtypesof(/datum/barsign)) + var/datum/barsign/D = d + if(!initial(D.hidden)) + names += initial(D.name) + . = names + +/datum/barsign + /// User-visible name of the sign. + var/name + /// Icon state associated with this sign + var/icon_state + /// Description shown in the sign's examine text. + var/desc + /// Hidden from list of selectable options. + var/hidden = FALSE + /// Rename the area when this sign is selected. + var/rename_area = TRUE + /// If a barsign has a light mask for emission effects + var/light_mask + /// The emission color of the neon light + var/neon_color + +/datum/barsign/New() + if(!desc) + desc = "It displays \"[name]\"." + +// Specific bar signs. + +/datum/barsign/maltesefalcon + name = "Maltese Falcon" + icon_state = "maltesefalcon" + desc = "The Maltese Falcon, Space Bar and Grill." + neon_color = "#5E8EAC" + +/datum/barsign/thebark + name = "The Bark" + icon_state = "thebark" + desc = "Ian's bar of choice." + neon_color = "#f7a604" + +/datum/barsign/harmbaton + name = "The Harmbaton" + icon_state = "theharmbaton" + desc = "A great dining experience for both security members and assistants." + neon_color = "#ff7a4d" + +/datum/barsign/thesingulo + name = "The Singulo" + icon_state = "thesingulo" + desc = "Where people go that'd rather not be called by their name." + neon_color = "#E600DB" + +/datum/barsign/thedrunkcarp + name = "The Drunk Carp" + icon_state = "thedrunkcarp" + desc = "Don't drink and swim." + neon_color = "#a82196" + +/datum/barsign/scotchservinwill + name = "Scotch Servin Willy's" + icon_state = "scotchservinwill" + desc = "Willy sure moved up in the world from clown to bartender." + neon_color = "#fee4bf" + +/datum/barsign/officerbeersky + name = "Officer Beersky's" + icon_state = "officerbeersky" + desc = "Man eat a dong, these drinks are great." + neon_color = "#16C76B" + +/datum/barsign/thecavern + name = "The Cavern" + icon_state = "thecavern" + desc = "Fine drinks while listening to some fine tunes." + neon_color = "#0fe500" + +/datum/barsign/theouterspess + name = "The Outer Spess" + icon_state = "theouterspess" + desc = "This bar isn't actually located in outer space." + neon_color = "#30f3cc" + +/datum/barsign/slipperyshots + name = "Slippery Shots" + icon_state = "slipperyshots" + desc = "Slippery slope to drunkeness with our shots!" + neon_color = "#70DF00" + +/datum/barsign/thegreytide + name = "The Grey Tide" + icon_state = "thegreytide" + desc = "Abandon your toolboxing ways and enjoy a lazy beer!" + neon_color = "#00F4D6" + +/datum/barsign/honkednloaded + name = "Honked 'n' Loaded" + icon_state = "honkednloaded" + desc = "Honk." + neon_color = "#FF998A" + +/datum/barsign/le_cafe_silencieux + name = "Le Café Silencieux" + icon_state = "le_cafe_silencieux" + desc = "..." + neon_color = "#ffffff" + +/datum/barsign/thenest + name = "The Nest" + icon_state = "thenest" + desc = "A good place to retire for a drink after a long night of crime fighting." + neon_color = "#4d6796" + +/datum/barsign/thecoderbus + name = "The Coderbus" + icon_state = "thecoderbus" + desc = "A very controversial bar known for its wide variety of constantly-changing drinks." + neon_color = "#ffffff" + +/datum/barsign/theadminbus + name = "The Adminbus" + icon_state = "theadminbus" + desc = "An establishment visited mainly by space-judges. It isn't bombed nearly as much as court hearings." + neon_color = "#ffffff" + +/datum/barsign/oldcockinn + name = "The Old Cock Inn" + icon_state = "oldcockinn" + desc = "Something about this sign fills you with despair." + neon_color = "#a4352b" + +/datum/barsign/thewretchedhive + name = "The Wretched Hive" + icon_state = "thewretchedhive" + desc = "Legally obligated to instruct you to check your drinks for acid before consumption." + neon_color = "#26b000" + +/datum/barsign/robustacafe + name = "The Robusta Cafe" + icon_state = "robustacafe" + desc = "Holder of the 'Most Lethal Barfights' record 5 years uncontested." + neon_color = "#c45f7a" + +/datum/barsign/emergencyrumparty + name = "The Emergency Rum Party" + icon_state = "emergencyrumparty" + desc = "Recently relicensed after a long closure." + neon_color = "#f90011" + +/datum/barsign/combocafe + name = "The Combo Cafe" + icon_state = "combocafe" + desc = "Renowned system-wide for their utterly uncreative drink combinations." + neon_color = "#33ca40" + +/datum/barsign/vladssaladbar + name = "Vlad's Salad Bar" + icon_state = "vladssaladbar" + desc = "Under new management. Vlad was always a bit too trigger happy with that shotgun." + neon_color = "#306900" + +/datum/barsign/theshaken + name = "The Shaken" + icon_state = "theshaken" + desc = "This establishment does not serve stirred drinks." + neon_color = "#dcd884" + +/datum/barsign/thealenath + name = "The Ale' Nath" + icon_state = "thealenath" + desc = "All right, buddy. I think you've had EI NATH. Time to get a cab." + neon_color = "#ed0000" + +/datum/barsign/thealohasnackbar + name = "The Aloha Snackbar" + icon_state = "alohasnackbar" + desc = "A tasteful, inoffensive tiki bar sign." + neon_color = "" + +/datum/barsign/thenet + name = "The Net" + icon_state = "thenet" + desc = "You just seem to get caught up in it for hours." + neon_color = "#0e8a00" + +/datum/barsign/maidcafe + name = "Maid Cafe" + icon_state = "maidcafe" + desc = "Welcome back, master!" + neon_color = "#ff0051" + +/datum/barsign/the_lightbulb + name = "The Lightbulb" + icon_state = "the_lightbulb" + desc = "A cafe popular among moths and moffs. Once shut down for a week after the bartender used mothballs to protect her spare uniforms." + neon_color = "#faff82" + +/datum/barsign/goose + name = "The Loose Goose" + icon_state = "goose" + desc = "Drink till you puke and/or break the laws of reality!" + neon_color = "#00cc33" + +/datum/barsign/maltroach + name = "Maltroach" + icon_state = "maltroach" + desc = "Mothroaches politely greet you into the bar, or are they greeting eachother?" + neon_color = "#649e8a" + +/datum/barsign/rock_bottom + name = "Rock Bottom" + icon_state = "rock-bottom" + desc = "When it feels like you're stuck in a pit, might as well have a drink." + neon_color = "#aa2811" + +/datum/barsign/orangejuice + name = "Oranges' Juicery" + icon_state = "orangejuice" + desc = "For those who wish to be optimally tactful to the non-alcoholic population." + neon_color = COLOR_ORANGE + +/datum/barsign/tearoom + name = "Little Treats Tea Room" + icon_state = "little_treats" + desc = "A delightfully relaxing tearoom for all the fancy lads in the cosmos." + neon_color = LIGHT_COLOR_ORANGE + light_mask = "little_treats-light-mask" + +/datum/barsign/assembly_line + name = "The Assembly Line" + icon_state = "the-assembly-line" + desc = "Where every drink is masterfully crafted with industrial efficiency!" + neon_color = "#ffffff" + +/datum/barsign/bargonia + name = "Bargonia" + icon_state = "bargonia" + desc = "The warehouse yearns for a higher calling... so Supply has declared BARGONIA!" + neon_color = COLOR_WHITE + +// Hidden signs list below this point + +/datum/barsign/hiddensigns + hidden = TRUE + +/datum/barsign/hiddensigns/empbarsign + name = "EMP'd" + icon_state = "empbarsign" + desc = "Something has gone very wrong." + rename_area = FALSE + +/datum/barsign/hiddensigns/syndibarsign + name = "Syndi Cat" + icon_state = "syndibarsign" + desc = "Syndicate or die." + neon_color = "#ff0000" + +/datum/barsign/hiddensigns/signoff + name = "Off" + icon_state = "empty" + desc = "This sign doesn't seem to be on." + rename_area = FALSE + light_mask = FALSE + +// For other locations that aren't in the main bar +/obj/machinery/barsign/all_access + req_access = null + disassemble_result = /obj/item/wallframe/barsign/all_access + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign/all_access, 32) + +/obj/item/wallframe/barsign + name = "bar sign frame" + desc = "Used to help draw the rabble into your bar. Some assembly required." + icon = 'icons/obj/wallmounts.dmi' + icon_state = "barsign" + result_path = /obj/machinery/barsign + pixel_shift = 32 + +/obj/item/wallframe/barsign/Initialize(mapload) + . = ..() + desc += " Can be registered with a set of [span_bold("station blueprints")] to associate the sign with the area it occupies." + +/obj/item/wallframe/barsign/try_build(turf/on_wall, mob/user) + . = ..() + if(!.) + return . + + if(isopenturf(get_step(on_wall, EAST))) //This takes up 2 tiles so we want to make sure we have two tiles to hang it from. + balloon_alert(user, "needs more support!") + return FALSE + +/obj/item/wallframe/barsign/all_access + desc = "Used to help draw the rabble into your bar. Some assembly required. This one doesn't have an access lock." + result_path = /obj/machinery/barsign/all_access diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm index 0f0697d3cd5b..e8604b563d7b 100644 --- a/code/game/objects/structures/barsigns.dm +++ b/code/game/objects/structures/barsigns.dm @@ -1,348 +1,348 @@ -/obj/structure/sign/barsign // All Signs are 64 by 32 pixels, they take two tiles - name = "bar sign" - desc = "A bar sign which has not been initialized, somehow. Complain at a coder!" - icon = 'icons/obj/barsigns.dmi' - icon_state = "empty" - req_access = list(ACCESS_BAR) - max_integrity = 500 - integrity_failure = 250 - armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) - buildable_sign = 0 - - var/panel_open = FALSE - var/datum/barsign/chosen_sign - -/obj/structure/sign/barsign/Initialize(mapload) - . = ..() - set_sign(new /datum/barsign/hiddensigns/signoff) - -/obj/structure/sign/barsign/proc/set_sign(datum/barsign/sign) - if(!istype(sign)) - return - - icon_state = sign.icon - - if(sign.name) - name = "[initial(name)] ([sign.name])" - else - name = "[initial(name)]" - - if(sign.desc) - desc = sign.desc - - if(sign.rename_area && sign.name) - rename_area(src, sign.name) - - return sign - -/obj/structure/sign/barsign/proc/set_sign_by_name(sign_name) - for(var/d in subtypesof(/datum/barsign)) - var/datum/barsign/D = d - if(initial(D.name) == sign_name) - var/new_sign = new D - return set_sign(new_sign) - -/obj/structure/sign/barsign/obj_break(damage_flag) - if(!broken && !(flags_1 & NODECONSTRUCT_1)) - broken = TRUE - -/obj/structure/sign/barsign/deconstruct(disassembled = TRUE) - new /obj/item/stack/sheet/metal(drop_location(), 2) - new /obj/item/stack/cable_coil(drop_location(), 2) - qdel(src) - -/obj/structure/sign/barsign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1) - if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, 1) - -/obj/structure/sign/barsign/attack_ai(mob/user) - return attack_hand(user) - -/obj/structure/sign/barsign/attack_hand(mob/user) - . = ..() - if(.) - return - if(!allowed(user)) - to_chat(user, span_info("Access denied.")) - return - if(broken) - to_chat(user, "The controls seem unresponsive.") - return - pick_sign(user) - -/obj/structure/sign/barsign/attackby(obj/item/I, mob/user) - if(I.tool_behaviour == TOOL_SCREWDRIVER) - if(!panel_open) - to_chat(user, span_notice("You open the maintenance panel.")) - set_sign(new /datum/barsign/hiddensigns/signoff) - panel_open = TRUE - else - to_chat(user, span_notice("You close the maintenance panel.")) - if(!broken) - if(!chosen_sign) - set_sign(new /datum/barsign/hiddensigns/signoff) - else - set_sign(chosen_sign) - else - set_sign(new /datum/barsign/hiddensigns/empbarsign) - panel_open = FALSE - - else if(istype(I, /obj/item/stack/cable_coil) && panel_open) - var/obj/item/stack/cable_coil/C = I - if(!broken) - to_chat(user, span_warning("This sign is functioning properly!")) - return - - if(C.use(2)) - to_chat(user, span_notice("You replace the burnt wiring.")) - broken = FALSE - else - to_chat(user, span_warning("You need at least two lengths of cable!")) - else - return ..() - - -/obj/structure/sign/barsign/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - set_sign(new /datum/barsign/hiddensigns/empbarsign) - broken = TRUE - -/obj/structure/sign/barsign/emag_act(mob/user, obj/item/card/emag/emag_card) - if(broken) - to_chat(user, span_warning("Nothing interesting happens!")) - return FALSE - to_chat(user, span_notice("You load an illegal barsign into the memory buffer...")) - addtimer(CALLBACK(src, PROC_REF(finish_emag_act)), 10 SECONDS) - return TRUE - -/obj/structure/sign/barsign/proc/finish_emag_act() - if(QDELETED(src)) - return - chosen_sign = set_sign(new /datum/barsign/hiddensigns/syndibarsign) - -/obj/structure/sign/barsign/proc/pick_sign(mob/user) - var/picked_name = input(user, "Available Signage", "Bar Sign", name) as null|anything in get_bar_names() - if(!picked_name) - return - chosen_sign = set_sign_by_name(picked_name) - SSblackbox.record_feedback("tally", "barsign_picked", 1, chosen_sign.type) - -/proc/get_bar_names() - var/list/names = list() - for(var/d in subtypesof(/datum/barsign)) - var/datum/barsign/D = d - if(initial(D.name) && !initial(D.hidden)) - names += initial(D.name) - . = names - -/datum/barsign - var/name = "Name" - var/icon = "Icon" - var/desc = "desc" - var/hidden = FALSE - var/rename_area = TRUE - -/datum/barsign/New() - if(!desc) - desc = "It displays \"[name]\"." - -// Specific bar signs. - -/datum/barsign/maltesefalcon - name = "Maltese Falcon" - icon = "maltesefalcon" - desc = "The Maltese Falcon, Space Bar and Grill." - -/datum/barsign/thebark - name = "The Bark" - icon = "thebark" - desc = "Ian's bar of choice." - -/datum/barsign/harmbaton - name = "The Harmbaton" - icon = "theharmbaton" - desc = "A great dining experience for both security members and assistants." - -/datum/barsign/thesingulo - name = "The Singulo" - icon = "thesingulo" - desc = "Where people go that'd rather not be called by their name." - -/datum/barsign/thedrunkcarp - name = "The Drunk Carp" - icon = "thedrunkcarp" - desc = "Don't drink and swim." - -/datum/barsign/scotchservinwill - name = "Scotch Servin Willy's" - icon = "scotchservinwill" - desc = "Willy sure moved up in the world from clown to bartender." - -/datum/barsign/officerbeersky - name = "Officer Beersky's" - icon = "officerbeersky" - desc = "Man eat a dong, these drinks are great." - -/datum/barsign/thecavern - name = "The Cavern" - icon = "thecavern" - desc = "Fine drinks while listening to some fine tunes." - -/datum/barsign/theouterspess - name = "The Outer Spess" - icon = "theouterspess" - desc = "This bar isn't actually located in outer space." - -/datum/barsign/slipperyshots - name = "Slippery Shots" - icon = "slipperyshots" - desc = "Slippery slope to drunkenness with our shots!" - -/datum/barsign/thegreytide - name = "The Grey Tide" - icon = "thegreytide" - desc = "Abandon your toolboxing ways and enjoy a lazy beer!" - -/datum/barsign/honkednloaded - name = "Honked 'n' Loaded" - icon = "honkednloaded" - desc = "Honk." - -/datum/barsign/thenest - name = "The Nest" - icon = "thenest" - desc = "A good place to retire for a drink after a long night of crime fighting." - -/datum/barsign/thecoderbus - name = "The Coderbus" - icon = "thecoderbus" - desc = "A very controversial bar known for its wide variety of constantly-changing drinks." - -/datum/barsign/theadminbus - name = "The Adminbus" - icon = "theadminbus" - desc = "An establishment visited mainly by space-judges. It isn't bombed nearly as much as court hearings." - -/datum/barsign/oldcockinn - name = "The Old Cock Inn" - icon = "oldcockinn" - desc = "Something about this sign fills you with despair." - -/datum/barsign/thewretchedhive - name = "The Wretched Hive" - icon = "thewretchedhive" - desc = "Legally obligated to instruct you to check your drinks for acid before consumption." - -/datum/barsign/robustacafe - name = "The Robusta Cafe" - icon = "robustacafe" - desc = "Holder of the 'Most Lethal Barfights' record 5 years uncontested." - -/datum/barsign/emergencyrumparty - name = "The Emergency Rum Party" - icon = "emergencyrumparty" - desc = "Recently relicensed after a long closure." - -/datum/barsign/combocafe - name = "The Combo Cafe" - icon = "combocafe" - desc = "Renowned system-wide for their utterly uncreative drink combinations." - -/datum/barsign/vladssaladbar - name = "Vlad's Salad Bar" - icon = "vladssaladbar" - desc = "Under new management. Vlad was always a bit too trigger happy with that shotgun." - -/datum/barsign/theshaken - name = "The Shaken" - icon = "theshaken" - desc = "This establishment does not serve stirred drinks." - -/datum/barsign/thealenath - name = "The Ale' Nath" - icon = "thealenath" - desc = "All right, buddy. I think you've had EI NATH. Time to get a cab." - -/datum/barsign/thealohasnackbar - name = "The Aloha Snackbar" - icon = "alohasnackbar" - desc = "A tasteful, inoffensive tiki bar sign." - -/datum/barsign/thenet - name = "The Net" - icon = "thenet" - desc = "You just seem to get caught up in it for hours." - -/datum/barsign/maidcafe - name = "Maid Cafe" - icon = "maidcafe" - desc = "Welcome back, master!" - -/datum/barsign/the_lightbulb - name = "The Lightbulb" - icon = "the_lightbulb" - desc = "A cafe popular among moths and moffs. Once shut down for a week after the bartender used mothballs to protect her spare uniforms." - -/datum/barsign/thegoose - name = "The Goose" - icon = "thegoose" - desc = "A nice place to hang loose and relax, while enjoying some electrifying drinks." - -/datum/barsign/tearoom - name = "Little Treats Tea Room" - icon = "little_treats" - desc = "A delightfully relaxing tearoom for all the fancy lads in the cosmos." - -/datum/barsign/le_cafe_silencieux - name = "Le Café Silencieux" - icon = "le_cafe_silencieux" - desc = "..." - -/datum/barsign/maltroach - name = "Maltroach" - icon = "maltroach" - desc = "Mothroaches politely greet you into the bar, or are they greeting eachother?" - -/datum/barsign/rock_bottom - name = "Rock Bottom" - icon = "rock-bottom" - desc = "When it feels like you're stuck in a pit, might as well have a drink." - -/datum/barsign/assembly_line - name = "The Assembly Line" - icon = "the-assembly-line" - desc = "Where every drink is masterfully crafted with industrial efficiency!" - -/datum/barsign/bargonia - name = "Bargonia" - icon = "bargonia" - desc = "The warehouse yearns for a higher calling... so Supply has declared BARGONIA!" +// /obj/structure/sign/barsign // All Signs are 64 by 32 pixels, they take two tiles +// name = "bar sign" +// desc = "A bar sign which has not been initialized, somehow. Complain at a coder!" +// icon = 'icons/obj/barsigns.dmi' +// icon_state = "empty" +// req_access = list(ACCESS_BAR) +// max_integrity = 500 +// integrity_failure = 250 +// armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) +// buildable_sign = 0 + +// var/panel_open = FALSE +// var/datum/barsign/chosen_sign + +// // /obj/structure/sign/barsign/Initialize(mapload) +// // . = ..() +// // set_sign(new /datum/barsign/hiddensigns/signoff) + +// /obj/structure/sign/barsign/proc/set_sign(datum/barsign/sign) +// if(!istype(sign)) +// return + +// icon_state = sign.icon + +// if(sign.name) +// name = "[initial(name)] ([sign.name])" +// else +// name = "[initial(name)]" + +// if(sign.desc) +// desc = sign.desc + +// if(sign.rename_area && sign.name) +// rename_area(src, sign.name) + +// return sign + +// /obj/structure/sign/barsign/proc/set_sign_by_name(sign_name) +// for(var/d in subtypesof(/datum/barsign)) +// var/datum/barsign/D = d +// if(initial(D.name) == sign_name) +// var/new_sign = new D +// return set_sign(new_sign) + +// /obj/structure/sign/barsign/obj_break(damage_flag) +// if(!broken && !(flags_1 & NODECONSTRUCT_1)) +// broken = TRUE + +// /obj/structure/sign/barsign/deconstruct(disassembled = TRUE) +// new /obj/item/stack/sheet/metal(drop_location(), 2) +// new /obj/item/stack/cable_coil(drop_location(), 2) +// qdel(src) + +// /obj/structure/sign/barsign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) +// switch(damage_type) +// if(BRUTE) +// playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1) +// if(BURN) +// playsound(src.loc, 'sound/items/welder.ogg', 100, 1) + +// /obj/structure/sign/barsign/attack_ai(mob/user) +// return attack_hand(user) + +// /obj/structure/sign/barsign/attack_hand(mob/user) +// . = ..() +// if(.) +// return +// if(!allowed(user)) +// to_chat(user, span_info("Access denied.")) +// return +// if(broken) +// to_chat(user, "The controls seem unresponsive.") +// return +// pick_sign(user) + +// /obj/structure/sign/barsign/attackby(obj/item/I, mob/user) +// if(I.tool_behaviour == TOOL_SCREWDRIVER) +// if(!panel_open) +// to_chat(user, span_notice("You open the maintenance panel.")) +// set_sign(new /datum/barsign/hiddensigns/signoff) +// panel_open = TRUE +// else +// to_chat(user, span_notice("You close the maintenance panel.")) +// if(!broken) +// if(!chosen_sign) +// set_sign(new /datum/barsign/hiddensigns/signoff) +// else +// set_sign(chosen_sign) +// else +// set_sign(new /datum/barsign/hiddensigns/empbarsign) +// panel_open = FALSE + +// else if(istype(I, /obj/item/stack/cable_coil) && panel_open) +// var/obj/item/stack/cable_coil/C = I +// if(!broken) +// to_chat(user, span_warning("This sign is functioning properly!")) +// return + +// if(C.use(2)) +// to_chat(user, span_notice("You replace the burnt wiring.")) +// broken = FALSE +// else +// to_chat(user, span_warning("You need at least two lengths of cable!")) +// else +// return ..() + + +// /obj/structure/sign/barsign/emp_act(severity) +// . = ..() +// if(. & EMP_PROTECT_SELF) +// return +// set_sign(new /datum/barsign/hiddensigns/empbarsign) +// // broken = TRUE + +// /obj/structure/sign/barsign/emag_act(mob/user, obj/item/card/emag/emag_card) +// if(broken) +// to_chat(user, span_warning("Nothing interesting happens!")) +// return FALSE +// to_chat(user, span_notice("You load an illegal barsign into the memory buffer...")) +// addtimer(CALLBACK(src, PROC_REF(finish_emag_act)), 10 SECONDS) +// return TRUE + +// /obj/structure/sign/barsign/proc/finish_emag_act() +// if(QDELETED(src)) +// return +// chosen_sign = set_sign(new /datum/barsign/hiddensigns/syndibarsign) + +// /obj/structure/sign/barsign/proc/pick_sign(mob/user) +// var/picked_name = input(user, "Available Signage", "Bar Sign", name) as null|anything in get_bar_names() +// if(!picked_name) +// return +// chosen_sign = set_sign_by_name(picked_name) +// SSblackbox.record_feedback("tally", "barsign_picked", 1, chosen_sign.type) + +// /proc/get_bar_names() +// var/list/names = list() +// for(var/d in subtypesof(/datum/barsign)) +// var/datum/barsign/D = d +// if(initial(D.name) && !initial(D.hidden)) +// names += initial(D.name) +// . = names + +// /datum/barsign +// var/name = "Name" +// var/icon = "Icon" +// var/desc = "desc" +// var/hidden = FALSE +// var/rename_area = TRUE + +// /datum/barsign/New() +// if(!desc) +// desc = "It displays \"[name]\"." + +// // Specific bar signs. + +// /datum/barsign/maltesefalcon +// name = "Maltese Falcon" +// icon = "maltesefalcon" +// desc = "The Maltese Falcon, Space Bar and Grill." + +// /datum/barsign/thebark +// name = "The Bark" +// icon = "thebark" +// desc = "Ian's bar of choice." + +// /datum/barsign/harmbaton +// name = "The Harmbaton" +// icon = "theharmbaton" +// desc = "A great dining experience for both security members and assistants." + +// /datum/barsign/thesingulo +// name = "The Singulo" +// icon = "thesingulo" +// desc = "Where people go that'd rather not be called by their name." + +// /datum/barsign/thedrunkcarp +// name = "The Drunk Carp" +// icon = "thedrunkcarp" +// desc = "Don't drink and swim." + +// /datum/barsign/scotchservinwill +// name = "Scotch Servin Willy's" +// icon = "scotchservinwill" +// desc = "Willy sure moved up in the world from clown to bartender." + +// /datum/barsign/officerbeersky +// name = "Officer Beersky's" +// icon = "officerbeersky" +// desc = "Man eat a dong, these drinks are great." + +// /datum/barsign/thecavern +// name = "The Cavern" +// icon = "thecavern" +// desc = "Fine drinks while listening to some fine tunes." + +// /datum/barsign/theouterspess +// name = "The Outer Spess" +// icon = "theouterspess" +// desc = "This bar isn't actually located in outer space." + +// /datum/barsign/slipperyshots +// name = "Slippery Shots" +// icon = "slipperyshots" +// desc = "Slippery slope to drunkenness with our shots!" + +// /datum/barsign/thegreytide +// name = "The Grey Tide" +// icon = "thegreytide" +// desc = "Abandon your toolboxing ways and enjoy a lazy beer!" + +// /datum/barsign/honkednloaded +// name = "Honked 'n' Loaded" +// icon = "honkednloaded" +// desc = "Honk." + +// /datum/barsign/thenest +// name = "The Nest" +// icon = "thenest" +// desc = "A good place to retire for a drink after a long night of crime fighting." + +// /datum/barsign/thecoderbus +// name = "The Coderbus" +// icon = "thecoderbus" +// desc = "A very controversial bar known for its wide variety of constantly-changing drinks." + +// /datum/barsign/theadminbus +// name = "The Adminbus" +// icon = "theadminbus" +// desc = "An establishment visited mainly by space-judges. It isn't bombed nearly as much as court hearings." + +// /datum/barsign/oldcockinn +// name = "The Old Cock Inn" +// icon = "oldcockinn" +// desc = "Something about this sign fills you with despair." + +// /datum/barsign/thewretchedhive +// name = "The Wretched Hive" +// icon = "thewretchedhive" +// desc = "Legally obligated to instruct you to check your drinks for acid before consumption." + +// /datum/barsign/robustacafe +// name = "The Robusta Cafe" +// icon = "robustacafe" +// desc = "Holder of the 'Most Lethal Barfights' record 5 years uncontested." + +// /datum/barsign/emergencyrumparty +// name = "The Emergency Rum Party" +// icon = "emergencyrumparty" +// desc = "Recently relicensed after a long closure." + +// /datum/barsign/combocafe +// name = "The Combo Cafe" +// icon = "combocafe" +// desc = "Renowned system-wide for their utterly uncreative drink combinations." + +// /datum/barsign/vladssaladbar +// name = "Vlad's Salad Bar" +// icon = "vladssaladbar" +// desc = "Under new management. Vlad was always a bit too trigger happy with that shotgun." + +// /datum/barsign/theshaken +// name = "The Shaken" +// icon = "theshaken" +// desc = "This establishment does not serve stirred drinks." + +// /datum/barsign/thealenath +// name = "The Ale' Nath" +// icon = "thealenath" +// desc = "All right, buddy. I think you've had EI NATH. Time to get a cab." + +// /datum/barsign/thealohasnackbar +// name = "The Aloha Snackbar" +// icon = "alohasnackbar" +// desc = "A tasteful, inoffensive tiki bar sign." + +// /datum/barsign/thenet +// name = "The Net" +// icon = "thenet" +// desc = "You just seem to get caught up in it for hours." + +// /datum/barsign/maidcafe +// name = "Maid Cafe" +// icon = "maidcafe" +// desc = "Welcome back, master!" + +// /datum/barsign/the_lightbulb +// name = "The Lightbulb" +// icon = "the_lightbulb" +// desc = "A cafe popular among moths and moffs. Once shut down for a week after the bartender used mothballs to protect her spare uniforms." + +// /datum/barsign/thegoose +// name = "The Goose" +// icon = "thegoose" +// desc = "A nice place to hang loose and relax, while enjoying some electrifying drinks." + +// /datum/barsign/tearoom +// name = "Little Treats Tea Room" +// icon = "little_treats" +// desc = "A delightfully relaxing tearoom for all the fancy lads in the cosmos." + +// /datum/barsign/le_cafe_silencieux +// name = "Le Café Silencieux" +// icon = "le_cafe_silencieux" +// desc = "..." + +// /datum/barsign/maltroach +// name = "Maltroach" +// icon = "maltroach" +// desc = "Mothroaches politely greet you into the bar, or are they greeting eachother?" + +// /datum/barsign/rock_bottom +// name = "Rock Bottom" +// icon = "rock-bottom" +// desc = "When it feels like you're stuck in a pit, might as well have a drink." + +// /datum/barsign/assembly_line +// name = "The Assembly Line" +// icon = "the-assembly-line" +// desc = "Where every drink is masterfully crafted with industrial efficiency!" + +// /datum/barsign/bargonia +// name = "Bargonia" +// icon = "bargonia" +// desc = "The warehouse yearns for a higher calling... so Supply has declared BARGONIA!" -/datum/barsign/hiddensigns - hidden = TRUE +// /datum/barsign/hiddensigns +// hidden = TRUE -//Hidden signs list below this point +// //Hidden signs list below this point -/datum/barsign/hiddensigns/empbarsign - name = null - icon = "empbarsign" - desc = "Something has gone very wrong." - rename_area = FALSE +// /datum/barsign/hiddensigns/empbarsign +// name = null +// icon = "empbarsign" +// desc = "Something has gone very wrong." +// rename_area = FALSE -/datum/barsign/hiddensigns/syndibarsign - name = "Syndi Cat" - icon = "syndibarsign" - desc = "Syndicate or die." +// /datum/barsign/hiddensigns/syndibarsign +// name = "Syndi Cat" +// icon = "syndibarsign" +// desc = "Syndicate or die." -/datum/barsign/hiddensigns/signoff - name = null - icon = "empty" - desc = "This sign doesn't seem to be on." - rename_area = FALSE +// /datum/barsign/hiddensigns/signoff +// name = null +// icon = "empty" +// desc = "This sign doesn't seem to be on." +// rename_area = FALSE diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi index cbcd50e99d0ac1016b6ea5a2e0da4980dcbbaafb..5b0e52673269849c0a11032032bbb0c997b15471 100644 GIT binary patch literal 210663 zcma&N1ymbR*Y_JBK(In^DDEx=ic5gt#i3Zy;x47QySoN=N+}d5P@uRKmliMXUR-n2 z=l$OMefM2=-E~)1)?{YRoS8G(NA~{jU$nZaJPsx~CIA4yQB;uC1OQN_5MKZY4RIvG z`1UOTfHLo+t>+2Bd>>*8VS>;wRK!N%TpCoJ;diTA#hJ^mo|EmZ5et8B4)QRV?_ zNHL%n zBHrn(>?JyB9ObF_mKxt}i25Du@?1zi7jx?!FQ1Qiq$pdI=*U*2#)FAoPn^Qt7>Usm zRd>AZIvqrYHKHvVV~C{`?e!0QV!b~%4)Idk+NUocPf|EmhoIZS*aI z(5IxoGR)1!m0r92kVd6F40RI7at37K_^#m7kW7|CI5qz{@}%Mgp)jOB77a6l(%{wc z*Xd&6p?e*+56m!jULq@BNhPKiHezC&A|3>KE~Zl66C#2SKDihTSomWvPk};xQWGV{ zm|A5$cgU};WPDC1=P4Im{%TB5EL-G_Xp^#IO^A^0Gp!NuyhsCVN(GM!*Ujvv&vnT7 z{UWpe;{dOjqW>y)D8}D+{1aaY2Mrrvp%6p)N9v8tpSxt~pF)=t+nGB6+_J0+QD2*z6pAqWkczjyfo|;@O8r<`6&Kv3*h`hfv zDmUCXwD`Kr1Pp~pM4m*FxIMR@coCc5-hvns|ysi52b@{yuS92CRqnmv= zzBk)w($aW_dF+qLKQdYD8Z0&8?BZlM$K+lV6yny>`{)xlVKRI+FTrv_qjwMQpRC?9 z)%3IJ3}&Y^anG)gv>J{z9CQ2{-~Xv4DUz&*jH<*1cs&QqzGyC%o|yBuyS7#$F3Z*F z@wx9c^M@bvh-0{js(eBVAuS2-Chc1%r;YMyF!G}Ko9pJqVoFaJl0<*mmvxJsMvS}S z`svlc)(ufNIO2}t7<~C4Ih3@d%5Ion@H^pvl;CwIpcSR;7ab(&;k_d1vuZfL=b3u_ ztAkghHHLEa{6c}g_)JF|Avt$OZiZ$A<6H7}FuA5U+ARj^f&Tp|CAy<0Gz|?KNA#mZ zX=UHnTprJ6^MkQLyy%xT<3>l>@*3`T1)J*4%cp+_OU>1?QE_DGjv3xNDFuDX*|ERe zym7yLJhZ$gK?VdEn>(TG0su4sMOlcp7wo9RJB{MX`{tplta*RoZ9G5yn2kKX0u37W zfJSI?rfC<}YoXx|;}h{HDb>*{@AUQ^5qX!ti|yaO4te7U-nQ4f`h~>f@CpS*)BZLc zH3y<$(Avw8A5SafbolywUVSS0vU@7bN2o9#UoW&TieTM zS-NBe2K@iMX~mmT?g0GneZ<*R>s|q(L-+WOOM|V?3r4Z;ualoUTaur-UqI!8l>U#4 zHJ|mQBj3&PJh)-fbQx*_TX~ZHQ?P(sA9?SoD2Zi7(<jG9m$3N&{p%zRGHcS|ImoRjvydvXk?4=XI7X>Xy*Y zcKV$rKd=<;PXEOHRDjh6=abAm!42>GOl>IGJHm#G_#LJNyzB8dgdRqIVgHq4m5z8y z9U*AfzYWD*=P4KB7?I$^DQ>uI##?7WLeYI&M@i>F3jimgtFXMXfcT8EGj)#KOIM;7hyOGT#d)up@DYZ`>w zIuOXPkzh7HDG0l_J=!kcCh3x3BSjKOl zeAE)*tv@b%-`&f%UUdmtXJevze8X9^kwyNUEf&IR`1fJlX9-2srf>E?h(Jn>iX{C+H>w12gUvLWzz8E znCRxcbQ9j=))k}P*b#xxfyUgkWkKG`hqM@!6|Owmmil-NA3Vn4{{&VgdQ0JbZt4U6EKfTz#iQ5ttN`fCgz1&9KQFn~%&)fNgev(}l zo)%?^yG_0NTUhjvh3JOL^RzhtFMxTlSEIEAi~6|6tW#)MKZ2A=6+f8BumqV(`^Qr2 z*puJIhuQ^hAj8>OSvGxfB9ALJw)Wr)SF|hI7+2-Ne&aC-5z*X zNIpvlLo+UX&08H*cz%-yU-OA?b?6M2zg1W-3J#|r+9jn^$`V4JoUD}HbQXnI9JZ2# zJXKHHm?L3+pdjeL#y1ONV7+2O1?cDY`2{-MeBgB_N&vcEE7>_oKP)OoGzA3sm z9)E;L41W%M#crR6P022LD{n}c$>;zux|w&^zQUet`1q1`O|0&?e)kA$g0NTB{B~hk z8)vm~-?WA&VyCHhPKVEnzw29nfBJEk(LTpz{oh?oEfa2u`N)AUynrIr|CmrbG3787 zQ)Mw|btIvGbPzmZG~RUo@ha|0|Jdl__(H=Pm9|uTa1n^ ze2Mnka=alS58R|%uq0-^Dtp40EI=Ilj)g;BM~vfXaY$Zc=y`?yoOaJ9>jGfxuc0=Gu z27Po1F+!2TBLOco;}cQ&37{5XHosRP0BWRm=(~?xx71Q3#yjq;&QbpDBf=i{7@ENa z$E>vv0`dt!JBP_hyFE+bnFi}xf9?2DG4YmY!Q=R}A zNLLWq4I_1g-Ki_rFflyC*1uB2s^u%JjE_Y?~ye%8`ZSQ0}D&})3Bo0 z2~*oi`B+2pW;Ds;+22O<{fWag zPbS9yMpU&5co`rEWsLES$cH0R17F_^JliJsvF0e)(J(0GdQ;lorR}XmjlCh=Ua1Ra zqGwHj@@3;<>(0{d)8*N%eap&Hz?TB5ai_L-tF0#mR8+Z#gbvnG>YN_9Ez~k6^(Vp0 zyTsqsTI|Uw7%w zfbB#adv*1I%R%Jf@7UN!|F%8v)AhzZo9IMnbP``zha``qYippc3Cl{vFtky1hj!w5 zQs^aa1ZzDe}3qkYoLjfgO_39!^hwC z1j@3mqTH)3dB{Zh6?wgLe`I$*P3$;KyuM=-Q)8Zn+m^!1;N049Wh8#|j7hz?y*;tP zXsxqGppqbXmbH}Ft}VJo73|TIT`M+rQ3f@i#2Wokd84M|)^$)!S}xg8SsaP(nu$9~_`_F5c>atM<6%k1H(RM2KN zW8pDXKo&T>ZG7#z+f;4{9Fwo2mu~*BLoAtRZe8071(UDpbg=m+9_XaD{2{!1*1i3^ zBj&jTTs(EAe3?7m7|^^&8oS_iMu42*jye&06NE&Fj16WSW?@}I`GQ%F{aP-qFYWY{ zn9_!K6C5l}tHA6WL(i`s8Zyp%f4)|f=Xp?B5&|$5L)a9P3iU48`y_A=_A9Y%#wOxh5QnQk7df<4z_we813puNNu&(WhQE z5n*Ng$8-6hR=U=5{Oz~c|JDZ6aFTq)SR{h6Tr8gVZys-D;NuZ{@0D0dCqr>BZP zWY^bw+%MzS>H0jVfQn{ly$o2dW*GCoNBgw)jaS7K+yN(O2T9U?aT!M8h>K-tc7C4m zPq;8>-Pvjo-4&5h5$62ULq)myzI+BbJSg0#TWiBHgx@6}X(J94!=qRh_F0h^L21`e2$r7+h8{DOg#~nYb2|R^my1#=oQjF87$j5TJ(lndA< z12YD}y4Y?-dxGX2H4U4`bvWg(aDZKOQ1A1isbmr8AbtM1>VGi~&MWyuugrK+l$v za`R1FS$?3u@3%=?5|;lIX~g<;{q`^?HR^f!xu3ho-gk{$OT*i7B5Myrzo()<1LM(m z6Lv@_`PoKInLlsus^VvcT7c{5bKYs$gQxJ3N&36j%Q4p+XuC#jw-^f{HgjEcJWEa< zQxh)^$~hVTD7iN`AJ1#8=efIG2`A>wxs?A_dp#B)QcTGSnd*rtZ>%fkITgot82@pa zDQI0_jTmNIJ~&`xn0(7~F1Xnq+dQ=&DHD98fNLdSWf^Gp-d6vN{WP4Egv}q%6U2>b!7$v`3#iTA8D2#KGKU=A*^&7=CGf5 zgHuzsMc{ZsJnJ+hj|-u3kn4d0URerTj_rGaOt%z&zHbBBkB@I-(L7^75-FrWVY`@u zjJ01wRcRi19d>VF)0zvl=?Y@bqy~ zAqYUuCgG=@4Ig7@pbgM%fFbNL7~qeMtfbrc>B=Bdl}N|yytpWt0TMP8SL^(`Zvu?u z+mFF_ARry0&9u>goX+U+H3>1wkNJUxezN$(tOeUDK5%BxY>1%=<$KX8FV`g^=^y)T z4ia$3`6_%&JUbY|haCB$8q^$DZcil$mUG&VvU&>j$CwYqkZ}{YfnLpkgJ}?f0q!Ts zxhI5W+A_TL`OZhV!sTZ$sB?TQOs^c<&E=um3ex0lA(HsnEWf)eG80%cG-*V)_uiGj zl9@HY>U=T3-hyOmMpZY=I@tSeXTD#pd2UqfqA9nYrWtQ0Zsi#&?p?7+FNQTXA~?tu z@V!IYM@_?;?a`yWuk9Eq$2s3$wVrNA<&@Db@jDE!hhUDF0gtz5>jLnXR$1alw6B8sT`CGKo!g?{>1wZeV4B6KD@5sz zyF{=^;P1$M!3`(kC`yIaSW;52k&Ea{GwNt-hDSsML$Y|7g$FPaG?Y1~Fro^#*8;zQ zT%=0R%qC+8SY(#_2CIrvbPe=|F?HQpFKnOyj18}I3!2I@vPvlkUP*H^KrVWkZ0h_@$MQ!NeGJ2#NrQIrxfyjX4NcvbuHGBm`I?+)sm|O{fn- z``HTzd_QY2l&zGSj8zJwML3d$(MmZseTkW69JH!wKwdv>4H=wYR(>ubN-pN$wQY0B z(i>mwSf+8ed=OQNtYVUR60LR(NH5&e4r8q%oY<~%?C~Wjqf*#e*onUCbp^d-+ilsc zxT0U5$^$3TGQNaiRcSJsfsGZBJpd90(kNzNYC%;JUcjAX<658F0AP6F_eJMw6gcvK z4O8VZV^rQN4Yx96@S`C>75~XXuXT$*$*LLTo0i#s-iNiYU-Ru7qmQ0+v=-2n0Q%QV zEx9R{hWPinGj(7LTPEnMxeEa!Q!c(eiTKf!rPC%sH*1KV-eBP7w`Sese;$Kq@^it` zb0)G45=s~w`{_8-8r;!=%CwPSG?u1J9 zSEny;?@<~AUK2iljfsTcS5*-v>L-K{-oNxKk*8-tca%vlyvK0mO-XL5-+}H z3Z1L$r>3#K@H$g}!}->YlCvg)4t3J)ypu_+o&LV6w-=)*g#j8TB%&^Z%C6s|nK7e4 zfP@UJ1U9Vc#4w0ZX=`1oq?i|{Pbxp(kxVipGmtUK5tU$D^-b7`HS#8cWMKe9%RV}_5sZXVn=mCohW4zjIir_KAE5+CX%=E7Gnu>5HWMEY( zJ`quHa4?N3%&vO3^a=2(HD<8?g_w4-X&P|2rgFjx*@-d4?$n}0ROa8#JMXrqF7Z1oq_dS~`E{GH>sCtL>{ zlof}Ct3fX7@_KoP2*)0)qPySA(!1^24++^+YE1qT+Gkv4MWppJ*}9S>EKJe_4k7QU zf)RVT{qn&EdK=b7d((bG)RQ%lQoAyS_5K8{nFKm}m!RMRyL+T(X{DH}hTQuhEul+fCwM}v61%twr z9187g7kWWA;kR{RzesNv26KXaX;WCeG@t^G9OeRbgG2h66WQTMTIFesv!*IB5bY^WIIA|Ig~eEv3gpqi0FqI zRSB##$1_4mE`*T0E=#v|3v(wsB$7mud7rk&MeY_a2%VdaEg)oeMp_^qbxxb>8C|b$ zTWnBtv?Nc4g4r^rK!ULP97XYW-N5ppc1ezbCPP(e1}5LOZyH#2Qii)CsAttKJ@pB2 z)p-8WH4JUXH3i{gMf1fdi5y(GWz>iD^G^n$<6`NLG8+BVNSIWkE|FDGrFrUHKDvpf zfzx_wLQ$;uM;!bC`%x3|4qIqWri`BesFXOk#+szSQE%i>v>YMLK4QFWD@o*WP#yyk z{!XSTkxk7Ge(gFN*QVxgS28U9A(j$S(%W-_QvA@%2vRnBZH+OcYvPV?=5?|O{mV)F z?k8A#5li`j;~*aUs_QeuD49=0FZD7LzVq*TIv!9jjm!}89v^4gC3Z>OQ?QfI zN;oCr;fO9aK#Ihrj$5FfA_#L4Z|;y~4)v#=h%WCkOrPcaixK_XIQLq3Tw*uB_-=aR zc>m(A4y(iy@{2Vf!26=_2B}HDL*;dz^Y?LhXId`lI!HsVB~00-EF9t5&?yk$_@yA` zD{z#1R7d;x=|V5QOb&uL zYs@7?vi9LJF!Tt_KW(rhc;nYNQh`!Z)1Y9E^M*W;XINWHToeCv94<8yoBA1n1qY@W zUE&py8$JME`rB=Aw1?_>O6s(4UyV)^4bj%357HkOiV0&r4$Bn*bcUT zUo-)u93#Yl84n3(|6ruTJInh~jNU_!^%Ei_O#d_@zudrUzba|Zm6ZME)Jy2y_5$yq z-O}#TV64AFb4=;{(x$`r)}h#ip(e?K4oQbfMM?ibqcWM6~Ib<@`gTIlbB+PD4@E+21}-(4}p9 zee2 z(Xy=4E>%JJ&h}w$)#XRu?+@CTbggAwhQ-D2jwn7RQY2@NOZW=h4wtv@R!cdPNOpF9 z;3x~E6Vie+iBx1=xSK)y_j=TfY9NK1(4q`GwzFa+WxYPiN=RWJwwoAZjyT;{6mC+%uf?FEr&JdM)Wo} z(9U*E(mRfTf3e8GVP%m|AfO`$rxGB1`T-t! z@b)f$>St4!SE!)I6pzBI0+EdREYwC#2xH{Da*PnwBmdVF9}xxSXLMe51uzQGY#e{b zXv&_Y2`*W}RU*w{Ri!sVJ#YQfcpr`)q`Fg|!H$?>KJdGc&EXfO^JsL*gbDGckb<=R zyw0YFeF|F~a@^{uO>@ujUt$!kL*$ulb-mxJw}fohm=odf|CM)Oz__(Bk7Cdu^r)UZ zE6QqH(_LrO4+9t+-COrQ2l5ziSvbh@mXL9Bnb9`8zkE9l6=)i@Mk?t$pBk#nMsW$z zYVXfQ#3ayTZA)%mXN2g& zD$8lH@?=n`nLwrsXDm}=#{0MTnV7rA0oil4Z8Ortp9-YW6F$aw4(z{`M1A+sy4F%H zzDbst)R(l`q!(Y0p$u{l-;le9_sC%u5_CCoj}PlQe|$wbm!)y^Yw6gp*8QMo(*u;r zNGNF?GD=l4U#wEW<6K@(Lisge1rtn^V@(;EPdx$;+<$RnkK}Nt$Rb{Vhr2u_zP%ye z0IiKuZ;qNaufKkR?d2Dwn$g+rJ8i{)n%;&t*U9_tC>4D)OeDe)K@1{f9p+83igP1Z zYl7L8IZBHQYSb9`9+QwX9#%HJF~;Tb<2~($$hkY=2_A)z0J@_s@dS5rZXyuBc^}#P zAf|&Bm;iKTj;zBPQH%39qu(3;YV`_K$=zrkX#h97z5>;+@Bf_(Fo19*$ZPwRgGjs* zE?~?F-4B;8N&dhp3tIci5~ARrEN13$ZaJat16VcXSTT4~2-oRLY{#tDpe@=hM**!; z7S;V(i93cp2yYAED>UIfJ~N?NOQ#_Is}Z4J&_D&y-Z1F(@%U3%aDO?Iui-?Dz-OII zQV}=uugXe{a8Avfg@KF@N^a|*Z9lnz# z8Iqsfa3qakF4wrk$$rCjOU&&3y@|^|kt3BQ`Bz5DIG=BAtg=|pj8$E+iKyx0@R*f8 zw@Oyi*qvY-Jzt~H5Ptic$Uoi1dyiL{9U>W9SrV%1w4nv8Dvuz(k52BBp$HA=d1Qvi zWYWCh=nBmw-kB1~JVO6t$}GV~YCgNXfxM&D%eg%I%SeX)&CWGCkyqu0q<65^2z3>!xLD@z(?6RhD8d|2k}Wkz~6c z&9N}U9v;$_!~UrJFG+cIJbWvVHApr2D+!l1a@)KO<&xIs%6-lAh{)H$&p(VVVmeMx z!`{s{HXkEbxF`I2s|5D=UMKs;`XN~KyZd(;``t=Vd8 zCE4%VM;pY{@Tnt(e;&5?lmBkWVn?C|_w*^^G5<8azMyXJD{ygyJY49&J+HT4vVU8B zL%PK51HO&s86wYU2ZfVXTJkNa-vg83&0x; z7&G!Aq&e9fM*Y&iHMJ%^S#aTk(;?k7og1C%lj;i7DgvKJWl-<;pfZ+Jc^+Sp!j*~{ z6pG#Q31AkuG89t1%BUArmP8^VSTS{o+oER;YI@e?&UyC|K5JI8RF=j*dDMm7HS!f$ z%ATk6#D?^w`bE+o(T~zplkuXvlIyEQiN@d~`c41<60~x}6ek6xm!oTd+rD%RYe`1S znZm%6qYWN#_NJ0-dQ5|l0YX_WbHIfVVEUulv-$Y^DG?IYt}D=(CSxB?N^L=TSXmKl za4>aF0Ns4s-ZkL`1DnGvlLGG56#*Dh{U<h7#B8((9srBxgx9a(LXzdZR=&78tQp zlX^p%<8C>Qk66sYYSi@Y!)@4LbibYFPE7wtBuJX?tpe@EJ6B>x*OQCg4$gGd4^7dO zPVRs6ESxiQK^uhPFyG5o9Y@dH)Kl27Za_ZHKY{320d7Ky@UZsy&D2bqWi^^TynXvB zKfs)g>*w-5z4Bo8+Ist+rdd z5$DH{-|(r`@1OQ-I$U`RBK`V);}BDD-6NMoEaAS=nPo0_{qySjVtGgZhRnx{Bgf+_ zG*L;h7JaDTWn@c!;!H1C3eO_VDhJ`P>yP523H3PN;^4g(^c5Q7b=o54x7%9>h_{dP zx=%==Ru*OJ7`^`VjVLsine1 zK~U{4X71fU&4Mm=>rvpeP?wh22=Q}{84yD=dvAic`i@8NYsfFJa}p|#o5HmmT28;GNR=~Ksm^^m+ z(~-O-Adj@Lu-KF)O3f52YJslc2?g6t;BBfjGc<-NCrgd}T@5o7vD}~?2f=fx`J}>1 zU{>7nHWox7z(McSfN?zLr$T!|ec&XHZxOz4lhs3gIAcIx!Q`v-68F4Ru=ro?I4*P; zRQWFkwbN7UIIH#4NCIN>lk{NVRxMBe6A&)#JI`9qLucwAPia9d|qlRk2FI-PTLq36`BG18x5 z*_k!vv6Y{nVT9s4RQU+$5P7E_wk<`p@+jKdC#*yrxCVIH8ZH#@XY+&cwym}{;SQ1j z%Pm=X0g^FLLc^dphDHIagMu*{g2l;E7*E8p>;J+n!<|9VEv$rM9q*lA92&7}2w(dM zx6njxWu*;&>L1Q?4wTEuL0W?rVm%G>!@u-E3UG(4dK3Y@TpR=qG$|z>udUf@{D)CG zPRB?M=W|%JdqP8dkH44tSy2hTY|#sK1=qOV$Eep%$hGWE(Wq60DbyF-jWZ5E9*U6D zMXE9QR8Vk$pvh6Ukj7U^F~GXeK)T_Vw;Jb#MKhS%fC@!?rk_~qR>+kvsn$2mp7V9d zUlqqQZV5~)&~w(TY5L6)$kQT;P2dX4bBCaKX`D|-{3K$DGk3`$^i{WRe?GiC*SBOu z4_8I`a5)njY!=gn`PPLov;L2YV=Y~9W-4q=I6y9r5HnH*Zf~<3B8?J4&)`)*Yeh6> zJ!{DjryFv+&&Qt2-esqoQ}u`yg;#{=qEUn1$tDQl*tb1e4l|EIL|MJ%MI{;R|~;AmG((L;eTZ=&upKg1TqKCKSir;$|o|gg)(U5TXlpu~&}DY@*Rb zNn>}PD}G^q3!K-k2c~;y&tDq3GYt`~2vE*(Hi0z%qoR72!nv^#TD?cgR?Gm$j@ThA zB{oZ|n@fqfhgIERcOHvG7&>LnVmU>BA+WWFwM}~ZZ47H$h)coJM$iy?9J0_`>E_RQ*?VYR3B=R&(_cbmon5 z(<)WEeq~a!VT|98>N6*u?PG9$w!iqh=Y{$LzVT&k_R2mao6_LJTbg)& zo-S~LJB$VGv@X|vAxMr$etzPUSbRuGj~oz3iYP<_cv{lX*eFLdtjHUN&dpnlkh$n_ z_@{>;*Qs>SFtDm?gmO!am56Y!@QX9i@e3vqfxQ}tCD9sWGI9;b>Lb+qsq1su>n}9c z7+Q+rn3!e}=cbdRO89+3!@OD`Ls{uL#9RDP%0D*}k~J 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%0AdSKB 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�)3B&)+j1wXF<+1+7S(x5 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 z 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

    {cY+KJ*^}aJFLdDq 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 O4bPca8ke7OiTXb;WZ>NZ literal 159072 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

    kuQcd^$;0m7Zysw5M-BcjUGaikr=Xv zIx2}`LVOja!YM|}aGMLhyw1XBnKKl#0_!!njgF7PaS<2h7AP+Sv>@fE&iv0?_hpMi z8Pvc0hX4FO$sqGTK4;EgThLkhJLyVJk5-d)N0QYYUyst}?Xw5+EaYi+fa%HiGP0%5IsciMxjSVM7VhA1Tzi;$n z23n;i1>YLu6EV2%$}^Ow$aR+MMn+dTrObHm8yH0F3~|!KFRLHgG1Gj@M>f7?&pyt< zvDjTuog345$7K_)@@gjPpen$TBUI(DKDyP~E=M#(3?$8QpfnB&0>1rVfri(GE-QjM zEdnSpuw7V6={NGl(KN(bkjP&VA}Csvb4ala0&4K!>XYa|%)ApVtMcQQaSM-UZbe!F zs5ptNnLrIGLASP1)OSN`<4af=lo`x5iu<-~D6=;r6PJ*X?Puu8KL9zcR23(E@_O)gtq2*_z|DuX zG;OZ%#W;=5;**H*!8EyTh^fsdD=(s0lYxZzD0BSkOpU380J^R^m^Q4KO~hwzJ?<(y zdGwLdmPn`>zUuSPGNiL%cz~A$!2;+X`%ea7CF3HdplSc~*Irq&D;WlH${)=9u4NI` z)zvRGmTk2dcYxmDSvtIjO})u8YX(j8s;gIyqB? zCUhF^_l-z!G^a!Yne}y{f!+BPq^SA+WA-T6*_BGfm|7eI<*1Ic`*1xTdf_5=0(s-! zADz-vjsZ3G@CDhvQ(wLq?6VV9(D6+uCJ<8qQBwyT)rCkr@S@Ce7HsaGernNxIRdCr zg!-vQFcfTzgAY4|Jv!FoTU=X)PgY7SkNT4ft3kVuHO_PkdvR1ir z2o43ilov?dH)C4C*ZKH=Ij#`vB*B1OD4;8W9o1cgk)?D0!@?6v?(58CatE@X;$|MD ztTh+@7&{0)^3xvm@P{Jq1HDk=!ec?9tSh5G-Zi}L+HWlW?Qwhba-xdt&eypWaB|SL z*zV9thwZoDyu(UD>KkjU)UU>64UcULT1zya<=G3}Y~;)#c#C_sG_8z`X-~ct?<5jB zatZA{CPCaT)o$3%L^Q)+kjcKUB(OGH5bszO=i*i6r16wvwkiZ_3VbPDF?UrDKXwlQ z>fRFcE#Afx2%-Y2-Lw6UYb2KpsE#t7 zRm#uU>oM?3b2<%}gBGW^nMYjo4e^Fm28ZGt*B)Qc9=*)np6bmbAQY~?ni)CV!4QbG zm!5g#2GkwaHKE(EWXhgvDNVRDGFSIK)@_3<>Zftf_c$#c*>`4*%Hb($Q# z2%#nq>`(q+yyv?N&ixp4o9sPu>Y4*9?oS-E9NFc@C{5H_&)+xBVk_gaVNr-6KCr4i zH~`FbE#f{AuN=@YeU94pq@8R+z{2JK_&&rRmP+Tr&FYwxkb+~>g3VNo%_x7(3;BdN zp$t#-Mfc^i``HULP#ojKQJt=_1De!W1VG#<%tOYT4*KpOz4P`zN?qG1+hr%_?N`5t z!VkRm5anrgi(Y;|Ao(x^9NW!0Eep>|RcPsw8ITEYa)bN;HG{yX27CwRJc~kOpICmU zT)vxh&kIw3lLtw&OOWI-!w*n9acWP+MgxIJz1sfm^jC-e@z>gsl<%vq=M{BfpJ-`t zmuXen(2`H%@6X3>%}axbD9jSAS_|WD8^7yy|5rMUwJvE3evD_E`(taOESJQq?{2i6 zReAlabK$jtzuuwHlb;zEvv8sfz`O`J`3oJh|9%EF>HjHq-Lpw}x}MwU+thFy<~m;B z>M;d(SKf`cr1+j>xcl*lG?ihOStBIuYgE)WVRNq)7Hlqf_x&g#`WHd+(SLg^RROEZ zS?K3W;HIPS%$`DenrYWXXX7{`D+fJ4VP1M#OvlXw%+&3 zzfTN^4$^RZ+C_Ws(bFr;3-txOO4LqM1tud5b-7f4Yhd$&)l{1mF6X7e99qpnV~=j* zZIOFT2%=kItBm1C?6ExG)KkY3O`+9m8}b1KG6r>jMoq1z!iiMoFlb?;^hto8-t)RD zidJ}L^9LDi&I$S+-x>-qXh8-@%&wER*2fmk#)uN{%8s6O!ngQnth-a?mC>~7$8HcE+bd&o}je52PNf#RtB zTMf@$V(q+fQ+LR)P)5Fi>#7Fe19CGaI;2oKO<%$J$AhG!2kxov1SFW?Zy)Us5NU;IA-? zheWUO7?JeF!rH>8d3BG(;@#Y1PaP+cLNI;ofR9Zsx7u7Ct26d!A^&ePD*By{x;uCt z>Aj1i#};2Z#S>BKVAM(V2V~gjomG+?_;K%4a3ZnwyZ`U4i#z`JFRianFq|?lWk{&CqOa2l8;%bV)YWM6i$ZriGRnDaQw z@3>cHeHVKio7#*xZL*vLE#SW7u9;a4g;!7?xvUDWCiovw80$VKd$QIYa`kmj!77B~ zQyPa16wk<@w0lSLn`mlV)`vF@5;{HrBioN|{ICXg(P;!3fOR z^W!%;l2|i2CsSgPPB`l(lukvGW-+Hx#Z5=nMz`_)H+S{^@R$8N8q?+fD}v|C&6-KE2FEJXl2J$dv+mM`^Q`2Vs4tX&R$zA zeY+%?XFzlNw3KMx<1QGM#LUy8TuUNHPklYtS9Yz9;M0te{SPRF#2A_ zCql+(pE`VfainY}BCY5^uMWxU^dK>|et@ZIFkAF*IY{k+qPNDt&MWl`e~q zrxxGFoMf5@Pb(3v%IEx)y{>7N)$29UpX1p8hz$9Fz=2lgduN7+q~oG%N;U?_0@ANB zQWR_ntACJ8WM&O`+Zh>QIrNEmr@7#>AY-&u0BT@IiLrM#+`c6S5y0`t&I6t^-{>24 zxFun^#LKtd^s<&Dv|={INYj+sn2aH@Z_mW4 zWeVZKTS2K8)GR{o6P}+loCSs%f$xlG63Kn3z$aq7DWIKF7{CeKjs_wessF5R32$V* zYl~$mS-?v@Ho{k79+m#g8W=WL`04HH#aTe91Q7*lQ30hXPtIoKnkwZ0*?7z zjw9M~#Qv_0mNQxx^|TOz^+`6Md0lo1H($oeJj2wJC544`f>fM8=B6SRDG>$lKokM zLoJ@*`sfF2ee4P@v~P^4>;ruG^l&jbwNIBi!~>nkdpgCY*b#c?@H&cu3|CnRQ@%k_ zlbS(O-*m#p!)nZ&%nO#=Q-FDI=tH8{>GC-?+^nN0%OP2yQ0!pB=Qfs1V=xExdAA8} zoEW)7?RnIHY=a*lOM<@Ed~g$-9qKG!ketMbu;Z|~@Sb%jkKgYt#`Rpw(Srxj`Z3r{ zQtnGb@VZZw+=y?Fkeyq19dWryQw%*%u6th`tKiN@(Eez6*uraK%as3+Y(sZd#y3Ta z_k*aS{T99R-Q|PUVj^uM)^eiz*iu^#ZXH8RwvBs3y_OK}c18P#lgYMe*aPs0EqLfAF2p$xVX*_RZd@bNZ_W-^w-qMlP4D)H5irL&&F-B$ zHP9tc7@z@)VfTnSnH!$?D$6TB2NYC{AUY8Hrq6VPj!fq`KHJSh056QU!jpn9a}tg| zwHvA%)w~CL0#X?;C zLYb$4Ir>~p@Aj5I0Q-@RxwQNr&x&@yZsYVJ{=}KzMOr{g2%;UyZ2E#*KJsBz0fSQx z^!zw+q8WA%QF*kcH5)8|xecM}V{6tJPMaJofEjt|;<;NUP{@YsB%^U1u0a{}_1Nofde( zq=se4V^TGu0(#pJtPhB-&(mOc`}-u4C0AkU1^FSp)-|#Z4X3qvDdVTAWem=Vv<^FD z`w4X?`~ne?{~+pR`_SEl4p_?$;h)`uVB(yMZx}H)xo-3BM0a+arMRc05~*uUk!3DV zpy=vCih*~#F(QcO^O#kD`+1%-qRB7}V&$@BK~+cqqJGWUeYxv(SL&^A=O6qg1#&JU zFsk(@&nGT@aoDk-oe+p*7VR-#^D42G{H0-=!O)Vi1oR$#gD{UqGcBmE{hZk@mL{iM9CwfQpiv9(AZ&UY z{W&dY1bk9v)@9Pnw-1cbKhf@2&h_7Q z_y-w>vF7jzLUS8btP?imr+5D2zc+{T4VQr_%T17w~y~UOD7o1K!cwaszgQG_6 znI}*7Fl|iEjZ1EDq4ev=*oYmOf7}_I-35;CpON-V{4gu6j9f)tn=k+RGv!cF@rRS)7e&|H+7Y;Q!?Ilzm zF0ha=Nz+rJ|11hycAk?o)tY4Gty1k0-B10*AmmzLb-XXG$+&rA^w$$!k%@?K8U~AB zTuL(2VJR)XMlrF?v+Qt5b60Y#_BhIL*K;&Dy4OB`NoPvK&w}t#{5UaL65e+K zC?@L}QQ=EeJIaSX>liLWQYcAN$3|Af$NHH}Ve{R#&k8TF3ozmwtnc-J`j~xtBZd7y z;#py07Wet}%soD!cVwk47D>+CFJJIjbE(4VJboVJxBen_vpWgxl|jiHfDjW$40wa9_u za5(JU$OK?fc{6UklUuA#^mh z5MjyRQ~+V>Jr9n5*CTwdlP85i{(7nXI;zII;_LG8D5|}jjxF;@y0}8>iIn*)`6!+C z!`t$t-dkOwP;|}?L)}Sj*Nz|@yo~{NeC~htXs#i?TJ{&#F7ox|IgL5suPFlO=r7(i z3V}Hgh5MO#v@mNkA4g?=yX1bbUyf_$)JsOeeHh0v?-BmMxHk%E-OSmDxb3&4`)Nn( z*SLdGg2I~axUYco0kf#z&m(v0m*FY3r<7ytt!vC!?U{B`Na1KXBy$IEH>B$-$_nIa zwCH=k0^yiiS>aq*A`a9)R!yw@E`}_+#CF5lj~@8*BKf7-svRf zw}E%Iq{pFOUxeDxXOfRD^{_CM&W)xVNlH=FyCUf{M(jHBd)kT9({m4c{)g<$yLPme zogfvG?i=a&Wqg<8*?CF(%jDEoaM}Zc0OOsqTf%hj44kPdMt-PVxc9Y=>ca`HQuC9? zh==M8U6*0@4Lk32a7xW{3Rd^R^WLX&`e8P#{a%3lx|lf&OwZ7*Op->B)p1;w>xITDAH^PYpCQ0&-<3Jc3bpeR zt@B**r=9&Z!BvL)e!r7SvvFNpp0rv&$YVEDKV9qEv}`=(fsDa!3cG^}$KbW-hOU-^ z8F?EP;GG+5XBTgprIr;R{WCgr_Ajpp(+KjC6aYqXm$%>z9cG+Huy(lB!26EqZ0wD^ z1-$h0yMpM5LGU_^eaeYX_`NLV6UEaeIJ1 zs?$7sVi<;w+Fm$fJkQ(@$U3{ieWxePxBHOT<8RQY^Od&u%9*@_TQ8KwWTC8ZEF7?Z z6-!^E*P;f@g$`x|6s6dZd@(0q)X6j=S@V8gm_rK*RPGjL5jqcESpq6Yz&H#)e0i-3 zvfWusy~H<04Y-f4tg$0UQAwA;pD?y&Ko3YS)r$N>9%jq?VHrCv0XPnEwfs6hqCew5 ze1TRV^hWAMamVlhhk0gIw|Ij=SF2TXczLS;JD&|-szuVJ{ z4;~XSIxt)6C2}-Ug;ZTO!ZB zP8ffDdqcSStTZ;MY!vh9oc+At_z`MH$3>q9L-{oEQdEJ^hu$MZW1+U?=BZ}cx|Z5H zz8l!4uSDKa*;`z2$O2O-sni%3q@Q24Jsj}yqUe>XMW4cBYpxb4V)U^#0}$7dJW}aO zo$Q%XC(>wr>>pyz=m8DygSkZGOH;Bwva!u=h*`uW|( zkS@-7oM-03%%9q>O|{oH)dWJUm!LPDswsvOYc>)tpOssuBp!c`z9@k(iZ&t@RQh#T zFV#|}ESw**{vO=k@Er!p!*Y2YIACmI5MM}~cfKn!Gg|=W6Hilo+b^ln?b9yj1DG=R zRx9{vL1;=K3XNt3S_00EY`HEpehW-GJ*lX|JX4l;6h{g*Bi3E2iQWG#Qpw()FL|xN z6U|P%dZ0v+#P*337sZP*i;8D;&(G-oZtvpy`;IR3FNd2%br&D$|Ki|F{+W)3G;pYNs9_(s@w_zrA&PQJYCO31RYtM>O2)^E8^&`DV z<3BxquwU1KWMLROI`C0_MOLOOotVfSpG~26AMeBA1g2m>Y$Tu!B!8Uqt*>c`G) z)To&JW&Ixj3T7hNI5^(I&uvD|-Qkpd-OeN?-^#0j5k5b6m%X{;?RfzSj+$fVHg9<8S%K&Nf3;Gbw{e!ywz{N24z(8%!oqnM(s>9$88lq`1Q-(LnH;}xzfL>pNetOJ^dib(B+Gl z=wn_VI?sswkh$o12`Y?#d!7^lv{tqI`i-eE9g|8Aj9>k6C9CYqHAz4kS>j9?YE4~2=4LRm=pW-XvkkYVFuA`=wmgNw=eM(Kw(Q{U-Wd5J1)5HFKcL~^ z1bh5!*KrX{3|E`d+>nh1Wg!0DZ%X$GTp$$` z2zQ(B*af3oU^g|S8gmRd*!8!41etJjV&l1^_Ll55Da7?Nm_`3u8Ni{hKae)T!9K(O zh<8dw3AS{RA7f3o1B~eK!;g(4DKbzGlcuoeVO&zr+Rn_)bf@3=@)Kc&cTQJc`3ZB| zaWO<>;dZwZ74UM6KpS=<=`60ysi=Bnra=Fg^2+8=`)k5*J6^+Fa;<7z^#(CpI9z}3 z>#L2_l){T{DPmyKqjW!BMfW2d2~MY>mv*lne>v;#qpmR^Euf>4ZDS5~tZDhq4JC!k zpSgk~zLTyuYtZT1vh9(LVa>A^#k3=#vUF~nzq~LVtcM#zVLC8HOb2B(fQQ?%#3zE) zR_jvw5;WlKdOvO5ugJ0K60ng9phtM0v`eiGKI;ViHn3|w|Iv^*XcWqO*VqF`IuCUXf z>c=f^B+M{!N#K`13;s(BSSd3Bw|;~cbRhSk(H3}pG=VR)%WxC@lEGexiWp0Q*^!bp zOn{foE%7X`>>9TVn_T5%1@d8vOBOzx_h|$o$a)P<-z`V0 zzMBjM-^*in=7JH%Wny@n8FOtXRv$J<^~jvm0~#>z?SneR!E(CHfjCy(5MR~H;FW|K zt@^_R)_9H`A+C}PYsFJ>>jg~G^+?zSvG`%1tORPD4pObNG)DQd~9JfQ93!>}^kEt~oERxb(vD5m@9jB6Kn zdZ33uzS#;7j?fg{dXA7JfKmwrXmbXqv}U`y1Qy_Q90{I1SNU2sAtPY{S#KN=G^jvt@cY z2lDjfezT9=$5(CTm;a>9g^QSPRVyZ0{zoCk=b5ThIC}E?YuWOikL?9DD z-)in)KJ2s~P1?65>)Bf#*Y0V0#US8S{L42cEBwYu(5f=L9x7Qm4Gfu1gU%iIHGlVQ zCRt=!e!lDXOjB`BlI8m%?VhAWv(|*Qom{2g4aWkD>?S1s<7uWc3`*9xcjVqS{1%ND zt99uon(kD8Nr|t`^^vb1+i(u25byNN#ey}Lx(T#(T=;EV`_H50VVDQ1&okMpjI&EtK?7mnP=+W zSLv{G^fIeGY@jR1*8M}!ySlo08~$P5z`$PL`$%NhS_Mzp&l)1l*7o+u(s~#PVgR}q z4(WDQw~sUba_VIOengi3r19^AlP8$_*otplYAB$j+|c1~kABK0atA(On>BnZi}vPu zyZQf7^%ZbYgx}grD4>LhN=Yb6BS<5$V1R;zfOLw0fPhNpQi?@LcXurk(k$KGy&xdX z!V=3ayF1_Tzu&#z{rLSxX2+S?;XUU(C*J2hLnR0`!g3xY58Y(PU&mUKkwA7ZWtS~X zFX^q)wd7HQpl@x5!6B(3ilgZ|i9j){D!tdbOAT7snLugA$~-u>cBGWT2bc4J&>muV zusef9(rxb7;sP%paA*vZ_Z!}Df{{Sk%zOU6PF~Lyf$ZiD50f$gQBtoc7$Sv zy-vxy{FvHJ6jIn>wiJ)kmf^7~wqPqlm377E#f_5-iyUEY-w{cqCEezZQC;&(F#ZS< ztEt|;7rp7yBYs5hjfL?fw0_(C*?9FV8uOHZ5r+wFPQt3oZ6;v)CYqBlF>ErG?KYw! zbsbK~B|0cgz>t2x)|?dHJnLhlhZbf&}ZJXrYz;X z2+$&5M@G2C-7TrSVL3SsL=l!?F7n)A^;e^n7e8Z=Cd2rX7^qL)lKt=q>{GO)y0V^9 z^P=xa1R61<9g^*a-~=t{Ya?0)yy+;n>3sk^)RUHf#_OaSkD1mX4*ul;gF6bl4$U2|+xa<$-S82q`Egl5!7c1?Vt(-E> zbcx=`Ls_9LNAN>4AfQ;%-;u7ozsQ{qnngd0zmNiWU`+5JDf3nu%0`zXZ-4C08De$3 zUSWBKAn!)1&cTTKpaIJABO*U7S|0Ti|6;`yJZYffsTwf=cO}FqajfVoJ4^yA&_BwI z)z_c+I}qoZjL}six~3zhqJUJ4N{>m4#||RvgElLGrG^Z&ny+Al zYe+%;oU8*3`erj;&RS|F$dDKRdmpoIoYWLIu#{#tI=b?jk9};r<n!vS+c z1yv$A&hsKa2x)^J?usfmoH&a6(oq4}Sc<>GZZq0uJOj6bs@48jT!a@5Z?CRqtU3R| zW6@dY6)YW7Wq5S85NM%HH=N@4Wd&flx6d5XfLb~$1FzTm6Mfu@RZArGn(OMf&oD?+ zG)2jk=LR8FNmB3pZBI2u>|>+IU_zy4t;$3sJEwK4kxjD^5Y~q%oPx<;z4i*2+<{id zpDvO7eZIcucw*k)_Z>gE4ckqv$tuVQsZ-Ad^j!#<#GQ{HJP2R}EVd3K4YyqSt6KvS zqfSd9U+CC=40`R1?3^xLVCD@!;HLND(tM_aPda3#eQkn@-JHNv8w{<4EUPzDWJ_kFo^q*Oln(O)dmAOn2}0M?1ZQbhbQ=Z#MabE?Hk{ zs&d%y2^U%|f8BS|i z%3b#aL*lA1$1u>h8J?ww3%^}4`Gts6!|&02aBAZEX^QlMkqf|E&PE8(2?#F<*}C{Z@Pa3Z;O`})t8FMgy|*O+E*g9pcs z+}lXU-l~|s7V9#V!77O)!^B>jKkqXKCk8K=BpsPM_df3@*38OV8z^dbJ;%Bn%YMkM zD6qNWL=M&W537Wyxft;2K0d(E5p(aKXt)K~KcG=GTVM}uQtLkiW9y=SR%^=Lm)|Ue zJ`^4Q^O2)#MtpZ-i%)g|9F5*GHa9i3?N>(H5lL!eCADd?)~%EcE0+gRKS7`M^IYVz z>_%Ewx6W`cnxaLS#0MOGYQxbmnwWIZ5^XHH>9n!vT`4Z@8sFZ@B*-1&Y2PsHd5W~$fVeLHLK{)socrba`3SUzyuHk$T!8q761|Muu>s*5IBz@pqwZzmB@e}C4U zqP+{(uI#*v-8!@`ZTu5D^5@Q%G0E+*jD9nA&skPKx(Rf>wf(~{C7XF(d+)sJuS6k6 z<)r@>HNne3hcT;zB|BY5Q735=Ji1QeaM10#)?F{_dFv{oEZHldDW3>77Nlkr2JUVn zNQqhi81M}S72_9wam-OhBFRUn3moqie73ZL{m8h5;1ryx|K@QLrYG&zc#F-MrX4!v zmxW6aV_lt{Cy&%1S@yv5Fv(xy6e*W68+=Xzd7D$(5jMwKpH6*YH5XzjTYU1qFQcp| z(HL8-@tZdmkxBPlw$v6J&h?7b0YMY5Qe9#c7)ksKz}Ej4$EM%9`{7Ed=SxpD0&h4t z&L6oN5M`vQUYWq#KTeuaDpI#mMY+=;O6^z6PnX1AS-%q5+0Y)0w`T=Kiga$Y1;Mj$%3#bq z8yie{wfQ?ZHrFQkRF7nA_1mhiG3O9pbPS(BrFijZ^j$IFmQedhmNkV18HaVEa?-`b}gxj7BC$ls=byiYV*h|~zn6X0u}!^D=!-jEdQkJf|!?1Sw^32D3x zU=kMAjOP&sK!x6kn+EZ9=A^S9A>Mb+&u22XZiQ+dbJHa*X#ujjYj>J$ZOKy>I>xBx z(!9$R%@Y{MOte{Yxe>xqLg&+D zU#NaiSX_P@J`|sanEsE>a)Lvh^2nU3PdK)}@F=zxb9#FAk?<*g2i71t__nNK!Sk6u zs+o&H^kiO-^$LpS1o6*;cE71fULzGAb4cET->xZjFG?e8NvV55IhXEOK%90q4wG?- zUVeE#nQ($EXk464tDhrAm;BV2A>SLesj%NY)jbCGQ9#q;dUvzYvi@N#H$l>etf1tK zwVG7A5p{3Ben<1d0t%-5Adpw3=Naldv=_%|QL8U#>i4V5lbmPg!mzD( z%vNm1pq`zM>qrkcl@IP`cpVA%QkPw>k(+512MqyCA(D*JREahl(>m*hpxW-Hy6O>a z1X^rjx%e>oL;80g$vv<31yze>382N-`qyQmC!&CYjmuV`l`x$wSilPbXqkC9?Ot0V zn(jH-=~&+*P(I(v*xIa#WfQ=Uc-XHx-@3`$1FZ){k8iUk+=}dlYar1x^67|Lq;aKfN*tppTevF@o zsVu4RJ2z4BG~wiIovsViblGc~Is#sXv&rQvJoW`N30csBH8FG7702uda!y{Pf zO+N`(b};}sSSfCzzwMpBi`jT6PXeK6##4u4QYZYD3a;-`+B-NcD?6qRpghLA%7MlT zsEk|CaVg?WyP^*gU|{)yD7pmUv%q^yfFbP#)a1Q9oPLqa-5(>NJ+s+8&{{XRV6%>= z1*xWD>k)d+cGddK6uHF%biker98ZE?+zkVRA}FzL_!cv(v^cfi#(;WT(KDUI*}P9J zdDV~eq(sJa1P69OK}og66?VEGc?sF_1)bWi8Vzad?i#F)k{G)^3$yW7y+6ZFCvhZ| zjrMSd=z@|f!Qb90hp!99c50%G2U~BK7>UO=T?}$w&jq3tVYQmG(;}gKb&!!v)7miK z;8WY|Ck-F+B1y`P(;PVF;e4<;8IW;2{GmUXO=L}qAg>Lam?&yXzZi|6rE3FmYISLT zzTY$YW`F>CLkL3pK<}>L-IzMaOvsZ^_Z3OhVRcIG=E#GT&tf=*>;DGS#|9A<3YS0= zLLs=WjBtL7Y17(lhA(Sv6;qDPojwT1Vpb{7qE-s!Z*+`$=e4AHuB8DJ{8h} zk3X47ECQ`pCxiq`ejVQN!Unys!+Wv~x-s3p@7vHiT>$(W=6m`Qedm3Iv1peXd}^;S zQe({LeN`i0V+BXi%YGhG~1O_e>J9q|1pX7w5+aHP62 zfzG99MFMB(UlZ7_g;D?b6}}fYIxceGT1HPO%3aO0`W^rG2-sDKL4_#U=!z2W?5ohk z7s0<3Jjk{YWKPUdWbvvGR^upS-__rz*fB_fTwIye9z1h2{V6Vs`%RR1`PYQCipQd&fKgZ|4yo(bv4-XJ;F^Q_XtaKi%^@^{_7&20N zo?0R8%q*l{CL;i5|18JL@NyR<>_g$2D8H`f1dK5xsqc|)O=?ftRltdi)XFp-*4sx- zje>!zdt>@2_vK3qN}l*??p!%*s;TK-IqA1XWsg|eRNo`lcRa(>|JWR^-Fm1l1+_FuEHe_ndG(+0vum6Vr~;ySzv1@}5NE!n_OB{D zqRjIG`nEf;Yx!#e{YqQTYw}eeIhZ0Y9f>8j85kK-l$eKK$mE_2jSE$0H=+}_ut@3q z<~pgR$?u83&c{tZ)ipX}VyN?cNm_!i#q_ip^?RPlIGB)16wf5Hees!ZVf8O?{APT# zKsUF|&J>YBm@V+JX#9H>~1i-olFF>xYn^m++M$|CvY6e^E0R@QZZJ?m6u9yhC)0vt& zO@pN`N)SKBAiT9LHFb1?aJUhQ#T1h3e#o=_BPg!-$~_pz`W&o{aCN0az9d zHLJlWk7CR-H_zc03IFaKdrUWkG&1qf9HBQzoSs@(CQfHH6K%!e@n9Q?7Kg$gy5s1} z#9gKq4{whr8?&n)i~-N&%JJ$U%L|GhTwSm$aBNSK2ziT{2>tU#rch zL3874+*lgmFEPiz_$RFn!0F?4I>^JDSB1c;S3)^~ zZ1;y0s)IZMepb~Oxrf;CBRNM3&;1a}=?3aEY4&0^?TTKjG}H<#Su4rcbQ zDbWZ`H&u{v+z{o5XA;*|Ney@yAudgAvszX zPX1u8gRXv-8DIoDRuve`a-q*L(pz8KjT4oNIbudre z1N!5dhT7`q0A??95PoGR0A@!rlR~iC_w3-$VMHZb>YPc@hjYE=?|VK-#`*}2^x0B7 zZ^Kg5XRlAn>}4BahXo=%L*+|MFMGHRI zeE*J**&qt+;`tGFY$bVR4J4R~tw;T32j{jLh`vTQ;70Wzzn72U2Lno2L1Z@C7Uw{k~^f@hBtQUbXMal#=U?KaUN!gsV0UTSMHNCCNWDciB_F^6?26 z`0luP^k2SJe9O>u+mn}#UHocE9BM2od*M4qPHm3?+N-q5+k_neG_rGVMXIjqMV zj$gO~vsSQk<9Z}Vd7&SyTvfJv!+>w*F z)W4TvQuV-E%g8X)>_K08Uw_cG5Ylqar+Qt!Nst+z;y5H2fmy&LRoxA4T9%?yqAG6N zUx}^I81>^KGppPNa-#&szBdNRnzO&9%J4P+F*d$8<5fGx$(JndZjU@_C<>25Or>bi0QD3N7xhlrC(|g8#c#;jBz`RfTCyC~EnMzo# zz7{jU7Ud^oeENu=KMVuY1;UzZ%KFmh_=F7US*-A@-|?(uIe5}BevfoU_ulm?_`#{n5BsXMkNR+p~M5^y+3RV~(*Jk)?k2J3rp2$%qs+yJ`Xd+V7)z&1NXwV-sV z2n$lU+HEA_^r=tEK@QV}eqvOhmld`D#(cknEe@oEf)vA|;YU|n5q3w=TAKpvIRQi$ zhbBH^ktAs@fTrAC3v~Gj4P2TNZRSO=I9sTc8)I_0AKpa~T^-juMgxTIW9bJR-z+N1hwxZkN zT7{)}Ed@1!opJ>ass3yuFEh|nI>@NK0^<{xf84(@pY_kqJU}T&SBjy{KdjR?tn0fJ z#(jJU&bd)Vf^PB^s7RyPmn|l<3I%Ds{f`SsB=Ziz#6q<5CGM6kfnW+=lfQ;4#A({3 z2UPX7yTo5c1b-yHxo=Fxa`4=l+B2u-y)Xovi_!f+AdF3Z!F89$#85DJTBH7~1zeoj1rRyk6xBCDTB3wS8bMX!K5Kk$;} z{ZaFn>LM7iy3fDg=`}HU=xZvzk3V6s%y9v0^|0! zi?0B-U$J_A9@Rj$sLN}j_lbE@%Ex9PTdrum`2Fn8Scivq{SyL*IS^J~HUVo+&HB^F z+667^Gp8|9Ip+h4KTmsq!JLmzPcmU^-dw=oFPK1A58~$PO$$ z`h=-@``Q=yqmW|2mn4F=jv_d%krmvG-GN!U=4WkZmjpEwh_|F_6n`WempiDOu_i$v z_trHEbr1ckuFHbc>XMdTxf)bNuiU>EtXGH6Bqai)Ye|OLRv&oafTB`+D8 zYEA(-$Kpi8(y`;%zCdoJA@h=s{o&G792iN~mJ-Rf`-J(L-;x%`+~k9ThGWG#zqKCW zDV&hb=a7$e_+D9`b?YJ>21AMkA0M9%%}ZR&k33PoFM6^=?%B4vxiP$%G(Ww1ZXTA?2v2bpRxyR60+SZdF4~<_BVmax!^8# zpq3w25CFI%M^QkS!jlz+8J9%tAwco$^BXPQf&on-+CKP{KN*-*Qf~G@tFsAb*+9?Z zfSMaxK6&edmXgC`^ug&j3^DXGhovXQAvuAV)x?H|p8fu@X1>ThbrFZ5djm;aes2oo z+(+19?F~Iw2S|y^ml>xt-OO96KQsWl*H!2bQV}OE!=wL>@sEKWnYrgdq*>|M`=$S!>Uf`kanQo8obPJbS3grr_dj(syyw7Am+W1 zRj$-%>1he|C}g-tw4@)q5}*A5G7%HIO&eg}cTY#S&lVi3WPBvFw16dSJdxzX;Qbv= zEj1#ce$ml`^9C3$&V-LjvPq;5gTLQDGb+A~os7Mon0^7Vtozjx5(Y9T8Hl1{@drt* zEKE6=D$mNQ24{i}bUqd+p!4bNvmFUWv@QJw-hjVF#UYYUh~o5*zmq#l7JUW_O5(8= zKB&?({F8=f;PlQdeW>ZqC{B}svjbeZHg13AR%sstO#3?sDL%Qmh5QJ7*}i>3RK?@2 z+^UM9{ip3QF*lzlOQ=d77wiOm!mcD~|rvQo_BQ2>Zj{rCH?^1DO@ zehLcm@JfuTt1Bgo4#GL zJ%?7L>72sEU#T&KlQ0TcmldNo=8L;-1JcRPQ3w{#&be38-nTgcby)yrYe)lPSXQlX>H3$rV>xh4-R#$ly8uO_*-3ldND-8$Pm}80f^hRuLJ% z6&vG(ed922IbJ$`OHQ|xR#OIY*8}tzV0psiPaES1e+nOIpAy8voJ8AQP`um#%({O# zgC44c0n&0gaESK+oU@{_g{XZ`c~!$J&t~0kX3ILs%m!f|if15O28}yZ_VHhMTtrhR zFgeHrJ;)6=;^Q&l)MP9ZpBVVyl(;u(F1>?b!pCOz)teg*F zulvKyO(oQb_{$c$`FcY>8gAAak~M7+SCtIeYr12v*Vr*)V%Q24V-uQfIyQ9OZf z-Su&h><$d9o@u1UYt};aI@!xjsZ2m6o&EQ^>QjEKaI@noMKdG;N<*~M=^%+Xj`NFC zjJvY7@scpz&w;>llzy-eG$-V3?8S;DG9IBA0`YNRj>Mh)?oB4>ym$>0EfXTZG(d%SssIva zc5JK#rzN6(3ha=IRdO=tD^EfHC|d}L)DWVirq-2r*ZP6zzXc%|C81aY=^e=L4uN#W z@;vcuj4D@Fz&;;uk%>n{BV@w-`RT$17WIN04J~7(cTBr{6pC^&WSsX^hhp#geSDCW zhahe7BvVJu2vFP%nBa>^5qO4fq!Vcb*xo;@D6j-MJ!H5U#i!kuS%!2#rwBqB8)j)~ zNtvWV3UW7BB{9N(ao^n=GC&6bOVCa2Yg)$v{EDgvsFJicCHy2hOOoU<8Hd=q<^#UxIg04-KQ52!_&166=nHA8tPPTbUoPeX#l@1s*1FGo0q?N?ndSQP> z1fFoTz_tf`9~*xSHllI!A`bB)!jEB%3!nnB%3=sAQx7I@#P=>FcMpnG17s8DMk+hd zNj`lXwBiAmz7U&!7t{z1MxpxxnYP;Sn;OHzo0ZCc^&0*`Wksy6b4ti3mJ)4qN@Gg@ z9jO57=i^TY%%q>V!~SbdRSa5cMK+nXjuKcUS&Jh-flgNTe(SudXLT4fDTp%CT7`R4 zbJDH<`jE3wxQ8C%I$LL#lr4AI>nZygjc@`B8bupx+j)hjDS8RxDn%c>EosegMFvMq za;-?%S+}lWm0&IUt9lyc#39HW`-25s7Z^B^b#d06|X!DHEA-w;!>R0e}9)rxq)^DoS`zYruJ z(BKAQpmav+ndKnX#V5v(dsGGF=nD7Zsf%x^TlYoY(wFz*N5Uj(8;D2ivbIi9Z|71{ zF7kk1k`6Z>XJ?T>hBb#;`n-nkfHDT7xi{8N`f}MlN<~H5%;7I-VX(kn3!5>E4)>on zmS=%GLD<9+b$(S%6<5#5MM>4YMG6ZY47QgUr+KBm>61qsbe*m|%@JYY&uyHjk%l2j z#uxBaYCuNmi+sJ9)I+;3rV^|;CzoCj>z8}%2CIHf!TQK@^97w1mo7uf3&~FBAhtM2 zE~hB2V7&%9J_U=ui=d&_Qf0t4x4 zm0eH}dnxyBb(*N09eqr?4|_yAGTsf5yfyURDAS928NU5s_0Oo-%tL?I5Dtq)%k&KQ zmlG8Pe7;+_R_8q%_M4_E*5oA7i88wgJQ-?sx znIR-ow4smuSbp+Skd*NTh(lhn8i2XUPmb`kr(n^iLW4PAiwx3yM0T44vemj|(UM3~ zKB_U2NOcWT(Q4y6JhXY;BYB%1?D~Mrl!Zu%GHIdpn{8c*wc6|fgo+L9&U$AmdOCOt z^3|P^XMOzZeqb=;+(&yx> zJ;GX=v;XKIOjhV-;z*!Wj~O_tNC#X*an0K2$ou<}|1j;N(HGxeLLGzLJQB$8jt&S% z>qk>qdIGZI^Gdes$Qc5My6Y=L{{DnH!@n98ceIE<*Pc0(KBe*ivwHBoSSlmM`Dxq0 z@rVI|W7!`ozyraPcr!q3xI~`=yh=X2@Nw{cz=j8S!~LaNqtN_+wq!lZCR$>*OV6K4 zUB6;=uSDSM)u?9e3~>{6;RglG;7PWtAj_Ty02e4^XaUUj9d!Bm{R7a#6^fS25WG|- z2xs4dtl_e`Dc9;d7QZC2kSVg@UH7gH4Lodcr;LA@Nz*a-vSs%mUNX3XHYi5GQ5?du z6ltyiKRw&w11_R~k4GQ1jX*8>53ub~hQ$O%AU&NV#GJ}+mX)D0-ei9=V zDr(r8ZjN%=kTcBKW=8M^$Orf6Gr!tlYP46rFQO?R1U^o0%mdr;hd3g*UPnb8_UyFz zIxKg#@%o{>>`q=LMuT-7P7Y7dcwu-)hZs|FF$I^83huP-r`^OJ@Q`ZQO1q4p+) zZLwft!UwxfY8b+cl`Xo)JI~-f%$A{3nyR z{qKf|zcq6tBG}#$7GFD0eWVXcWFI(Q4kt!ryw;ST1-3FD;-D>JXz0fmIK(a?mjvXl zXZna+=mctGd7$t$_|jejc^XX7-yft>-?`Iz-qS#j#bPVs6%R0)#EarBzD7&REnVm; zX8iDTZQ=QQysK}f+SaSa8+7Tk>0d-snC#oF1g_ zwIV*AMT0#6VL|E;O3E{?H~hD7lO3V|vsec9NN-pwCjdk zq5S`TJcU8_|NsBPp$PUi*541>yj-wHO7&kX{jEmv%j7UO;t~EW*NE458Z8nF>oGO| z*3`%pYy>6uY;$q)lzqoZA?XPZDF*WvXEPDU_wg0o%ohlcbO+q24E{hvmRPG5XUGb|c(em%V`BN;J5%uCiK2!kDlpB%$r!Q_=Mk6SdW5kAa#+zeAhsSy3~uoHcjYcHZk9u zeCfv5WETH5P0T`=ab`P`28}pLEad*TblWou_A!D}ta9IN)4fFFXsHiCF4cvqyjt|b zH`Lim&6-f=P~M=qB>YN=zVz#L$5?*Go0o1Dpzp5Tq%Scl{ye9B)3;bp&`hf+jz1{q zu15!}z+K)ON{&Sqb-W?ZdmN>D|7k2ixouAe1`=my2bU_2&gC@IQe|9*5|89J2HyH_ z)cfm_>s*(&`DrBV%0tLO2xvu0a6mqc$jcTSn3}?D?+|j#pH>}LZZJot*`0V5+#x6s zl1w4H;jRNI@;Ak7HDhVm|GA%+P}TZPk%NaM*1nMj9Cl`Z-k6R^q|9*PXvWvk5AD8u zNf^9$vCUqyaa!exXg%w-5;>8I4$>`%NONyt!G(Rz@o&e$Fi#i!F&(vKKyU90Pm86O zaw5)o?+?Ukd^R+?n_Ti&1HHt8bqh30CSZ_+hGqW&(+`LdbyuN+q8k`u9&G zV(!(&vj+GMG{o*MhTc@0N{W5U!nLQkdCW@F8=mLSDXN@-xU)5|xe?)2gPE#7KqJkh zO8Ks3nF1s|%23!q1HrFVTTa5`S79yb9qkiD3ax{HKumgW4&)_RKxrE*ZYK|%Mh4}jJGs@xc+5%ydfQo zqebx;8bp%uVPs3%yLRIE0HgTTjSE5v_lI=^5sSNSWM(z?Rh+=)3sH_UtyN=$F#XyWAMyvB2@> zuF40_A5kX?)jZyqJt|xGFS~jb9vt53b61B-sDmQ|#01Ei&fP;WtMT3D?5=t+&ZpYI z+27H3Wtx%I5yI@HTbC}k6`Pw%)w>PHZo}=#70n_{)FuE|pGV+VJ=YF{lou~Ny?3AI z&SF{~6)M7@2)NredQSJ8i@l36BCc9$nkOWeo;M|7Z*W@Hw*1Q_x7C0Gr3?W{(h1B= zus_*l10vVx_wowF-}vbsr^6}AYumWRn_*yk0%T75@%cE=G9ml>&7o+CfnXRnve`zc zi%~NYNT46UyGpDgiZ`c!LJp?9)>j>z>sUb3`W(Nr*ZAr9!-9fCkY&!+srcHuNA!kv za%P@_(m#smOW>0Zi*gWr!=Esz$E=`^R%5vKjoDNX;r$xb|BBV_xH0VP&h8!HS zrOs3$kFo|SKPnRL>cfKeUUTooA=^%NHG##q7lxTtbD=yRPzzgMK7xbR>ZBPxeO=@U zXq@cX)sP?>I7RW!wyomR5=qhmnp4GLf~nZft^V?eV6t;e`zwF5s%VCfCAe1uA7au& z!9xxT*BZRJT0T>lMFEd{>*4=aGJM!>kiVm*@!6i>4!DxB=oG!62i&a z;9>@E8(nonBU7e}-)1LZIEr0g6Ozhgoc+ks5`m~UoiNB_DJ}!9z{C^MvSd%8aJIw0 z6Jlc@rWBFT9Q%Y z@v(O2cMK%NNm+zzcEHzbYZb^*KL5>S*1rkGg9OS`-CG`F5ZjKE{*!d$LymxvLCUG; z7B)=*pauyEm7evd*xnEzl3lB3Ze^hwC}F&&b^^8?K~u~f4O7F!RxTb*`!>Kmgj~qIeLpEKREA6iT z)~G%9xcMBmj60$B`6cVZImU3^quFPoEv9pQHQu8CdvC2T{`xVrLHJ)I zQND{YlyCG-j=+wTgk-#w=h-EaXY*vDP=`2Y(bTVaGwkz^F)IdJ(1Xe#)(?#~QljI+ z-M`0R8Rc3)x}^w5D*`pGDW%Xvn3b2PM*n{EORn|Qb70tgx-8&WN@6#-rkBd6h@#uU zoeSzCq9Nb@EoB!UxeeR?DF#X1`5#uj^<0L(qmUE6h5^LC0 zvNH*5+9GLe9TukK{m-G}v#5Y$l_DbR7Tx_oai%p)pNgA0GtuY3@fkM%?E@8m_(&WA z;Rrd|e2;3LU4qHOlvhsh?3lV04ecE(I?oj1Mq;^`9!JgtV;7y7y1# zn;@uKxGfFDo{pbITq2By9EX|%8SK-SCK@a=JXz z68F|^2odAa>3MkA*(MU`PktWk=+)isjlgE2N^FhgZ~J#fRkKKmHDv(uXObFQC(sIi z8*+nZh`BSX4aMQF+tc7{P+dDmU{fF`p7z4mP1m~R;)eg=b@HJyGA|w;r^gn0KWfo& zVYFLdCoGa8Fk!Jcx_68?t1dazgHKlb-Ya3!dbkK$g7Kqc=T^QZB8B4Gi7{JE&CAt1 z$+wG3qM6B*Vqp;D2kf`Sl-VO)8({PB;-%!FuV zh;vah^5mF@c+B(w`MW`l2~a%1ad^W`t|d#BK(iK)I2;M1+(tOBVCf|Ay#iy-f9N^K zyy&S21C%x{OM%v#sVHNC_e&inUS~e{!eA{%xSKSP#pvjp@_0~n+vq}7Z*~EU>9DXP z;YSoT!$}#N>oC}2ca-^LP$2X+|4H&!`E<56FDR5oorb+`V>)eH$sV^gb2NJgl6g+q zEF?2qPLY6GS=yib4D2rEi}){2vcFw_zTqqE(YxfwJKLaHX<-KLai0t;>$EG(=*W6E zS5k0EG}$s8v*zFT#&NwS;&;0zYQ_Bc?7HVd^_5lNq|@2*&0$!r$G+<`VF1Y}_^h-+uhPPzbY9B4 z!vOYn8<1#Y>Nxl!3(ZL%+|xHfbyNjD-$t~g94Bz7a!|JZq~46)Nq+D##~$va`RA21 z%+ljD`MZ$(X$CTvEP!xMreP(`EWe0p{p~dBJJ=o0PCS1JRkb!O6ut(anj@ltdjFNG82)`!bk|CHl zc(^^6V$Sio1Nm1y_NR{lCCqy{krNI4dhW)MJisqi2Yf8v)-L zCJW?VmA<ryeQ}a5 zwoPF!r={@6_G|&pqH}K&V6S7TDKi3C8)@DhNZw7H@4Ogy^h4)e%?8`+7pCxxjMGJ| z(%M3Bn=!MdAiZ8maacXVV4Oqk$Idr*@~_)Ta}=+|m9ctW6Z~T@+)0&(^a%H+l};qWkQ>MEP$e4Cy%{ z>r=OTi- zW&Wi7bG+&7A^rQGvy;CE@6KID^;mw4*l#F?j@2g4ibfoFm-&xM2BiBQB#xj&l?YN7 zBe28hNLITxD;46;ICS1{A(+75CFUV%N*ueC0R~gfRgUS2LIix+-D{neu5@A_$*)gQ zXTi#xoSAWJv}0`OQpSjR<2#q+H=NOE^$)X|JTyQ5{{PFgkG1{Ax`QWI1umJpZ{Ty^QDLS4k8FE3= ziDe}q;p9XM^?hXWKj8h6g=CN;*!;w_3MYFsJk}m6@jV{HK>ceB72!DrpY9)S=&mFN z@6R$x?HBxuaE9z{7BJhJ9xv zExRp$JAin5GlmWbx!P?4`Ey!>sWsk&JMDSCpZ6qh=av&}99o6*>^@by3h@hm*+jDh z265kGchye!pQMMI?Q?~yy#kdK(lXlKz5H>SuZ@xR5!>frjpFyC# zaUn}Akl%Vlds4$*Xu`qovh-H(<=Jh(*SYbXHEbyzv9o=Kb;+*Ul#u>9#zc*W8l99o z5$g>-nmn~=IUN|vnvYH1j z2s62W9CH)mzr3Jw&uO6~=Y%OmZ>1N|Eh$xxf|DHr@Pm=i+6WA6qXy1}GaMnzSynb@ zo1gXD75s};VdSdas{;>F7MOnhWzST2%~?{zbQU=1kQR98`f{~3Z1-5DeDwA*ICufA zlAhF~4~_ZEomrb^M&Zs7BU7kFBMoP}E&+3)%u}!yPgcb*n+e$QtH{^KWJI5%Cl4`D zBivva34~XFnvr=I53m2FxEGQ7qwUBk>%4G0hc@3yk$Fl}C z?-U@ve`QjLy&*M>2slDjqL%!yDLb#&DciHSQV9}*A~zSm>F)TGv&ma_5;9vKtAy|c4> z=Ac&G$i|t>Kas^k)$(@*7JcNCS(XQ;LxK>+qtNk#BUy#ZkbB&!V$pJ}-2Kz@8r*lp zSlhO4;7@~hO*CO%E&`Encm>|*#u9lsrc2o(T5AOIM@3elOhKi9_t!sjVwKO*nPJ{v znh{k@*qvQUNb_s95n{F^&Nc-U;aNng)b%G4!m}LS^5fnIP5fE0KTFGyn1@B3+qifq zNn&|Tz5mkluM?z!-ty7jk^W~1gbq!D(*Q6qOZW0Xq+n ztps}wOqeAJp=Pik1h>J<8c4x=?R}i4su^PVywXlOCNUk|$%`wks>hVU@KjHT8^g`d zAD9%@ruBT*@1|31?)vgRn%HuZKR+Hh&81(t&LL}lI>!G}LBR6ffU-a`{2yBYz0GdT0X3p?zZ3baAmX3Y8#Xo8+556{oi{ z6}T-zH;|ZjaT7fa)}J3?@p_lc-KOs|o$uy1KQCL#t@RJO3J>Q9@C{R!xweI9(lmcU zpgxI%ZJR=7e)k~EnAUFvj-jB=(wAzQ{9d{UQq90W$gc6QZ66J7^4yyc+SrEWY+JfD zT9#mjO&4pgz4Ru%KO-};oyJhSqYryt6dDVfFH$WZ1HNOLpt^du_Ly9?+$9494j#hc zIg#N3X%F=dX4>y(JmUi$LDC*LdRUqAfa}szOI*s78iV^FTHVuzs5bMlqegfhX6!4_ zBkb=qGV!%AX2w~zwdDK$MVUFUY)J{ny+RZ zFLg4{aOff!6UL{ReRr0dtw^q!uR|YpJ0QE-b$Iy81W>7Wh6jO3H+^1eEA}ytT7MgZ zizqK1IIVv}ujn5Oa~p0pOHjy9%c5%VPSgczj!qC;H?U`&b%^egU-1HEM=RrOTj)7* zhW~mP^6YfxDVTZr4b4H*9D@$w#r^Tz{n_cOs{?%#A*Nush_@aRGXUJ8cTYzHpJLC- ziiO(;gZ=Yrhe9<~HKJI(Z3Ywb-Z3pxDI?l?Xg?4UvmygXhxsCFDdJf?cI(XAzrIcV z289}Y$(yWo)3$(dZQM9R6UBmZx}mqnjpq3zRj*n5=i%B0dP^vzdx2~ZY$z#6BRH6< z9zA(-hPNJRq*hrHCGQce=4VcLxPK#GRkM zF|YJxXmm3h{NsRE5gC6+E_OF@g@qFIl-;B4xnM=)%h=Hufndkq)1?*(yK$KD%JtP1 zDb`+(d@<5H=lGM z4+!hS62zHX!TE4Yr~1#VojszwAid^`)3W(||spFFb!wQ*D{5iYUgFB=nb& za(q9L9DLG%pS>Q7CF-#5Tft;7i6`!?p09uV;&<~(rO%6)!N+*t+WIU)_}Ahs`R1o- zaV-q*2>O@;iXh&fujKG4{=~E3RT?JA6-$H*kx;4vAxBbXq^SuT`D%(|($n*WjmQGn zc7*1-&2_SCC^O!zv<``rda^|H!&%{hUFmZaqU?8 zh1VxXAKkglCyu^j&n7-5KQwp>qL(Ia6(Hox_F@Qb9IIfI{Shqmwh0j-cFBs)srsYy z!+(fYPV)+QlNku-mEvY72VF)A(7!ONacTE#{r|M}7GP0r-~aHT1f)b11SAv`5fPMB zVhAY_K}C=*r6r_uMv;(4P!xnA1*DO#p;3@-C8Se&gc&B@J>Gl2_x}FR>!VJcvt#Ym z=d<<>?skt#^BTSEr#6xxRh8k_=}L-)&br_1(B|fwoMViw{JJ;neX3z$N%;J=?Mv)83%mX`KJ@v3fVg+<8ahKj4kf2F1FRk!o-K4n=c zbk^Db-EBnls1Dd|wrM#A-Ft+_W4xg!c$-bf9CA+_2w<6N!GjTyqP+v$^vx6*lj?S4 zLaKYYdjVNf=zJByXm^A2?;A&qXm)qV&eaB zDOKT`pLV-0RZ#h{Psmy4>Beb)|4bk3^Hk2M8MCAp!9=yZD&Jz*;VMN&x*ymWuiX#r zoM!i=GbP373;fb*;q(U6pz~8aZrdP#osGd{Y5rGaAo{JX!t%0SeBjJAprV@lPfx>J zik;CoICtPWY(Vn4<1pkl^g~kT)LT?hG__7N|F$n@umeQO3~p9BfK+=JpR=4$eMe?0 zvA5MZK;Zkun5O}qllzrDEWwM#`SWB6a;vFHH)qctf^^`DQ=J;NXH_5UT`^llV0p^& zMU_ERs^KYxiUnqU%^O-&e-VN`Hp>Bl++XPs8f1Nup)*+RaxGp?i6+n{!>Pa9K{Oa-L zt(yo$C6<=o6z`(Ou=QlW*~$aI=76giK}WP;x_O#zV$pL9kMln(%#F}VSq)zaQ7N3zp)><`n;K*xx`f7AliOiryUx{WuCSUK2O;{!7L7mS!*qJ@= z=*Ri~OHTKs2QIIyaqD!%Ri(D0?msKpeuJ9u_WFq0{!Kmmt@owakBQQxhG)S(A-2gf z70Edt^;qtT6iigB%-+iXneW%co;C9bj^x}@s@l8(dODqtaaco{C&Ma|oq&I+l6G%0 z!zI0dm@~D@Y4?V(z~639SmPqQ^#hkTWq6a7Mt9yhLLrmXS{;fQRYuUMo|V`e}XgP^w)KG*i5u;sTi72L)3Q<3Zu zW+h}Gn+%kuHWnDPD)Rcko-qtTA4xCW!YzpX5j;XOSt}qwXDstOoe2`#dry(Qut?ln z?^G{NV(DKyo!o#O>sji46+P3t5HW)0@mV)GODlRuc7&+hjbya*e?EMgdA8s7mj1>$ zrVA8}cF~?EGeS_Q&%HxIpF+x54b+=+_|YMe7zoNTEm^s6;aRR9>I@i>+D+jB1h^*d zXforx=E|}kk-hKqj0Np4`q86iUVIkJ(C*bSaNXWA>0%*p@hZsvpP>BTNzlwl{=);M zf4{h;AIbsIyx{%&Zwt8&1@ym*6(2$N&_6$cYv_2l2A+&O1XbKK-?7CtOG%!|TGi6N z#$^_*$AZV>_|yzP;YP4|xIA2;F(Fee#tG)L`?&lyi)$|K4OT6RV`O^TDMcSz&B68| z;{zSmsS!uv5yCsXnaV$q0X)7Rf z=`17l+WPvU86SKm@JM((w6`OQ^C_b5@N;lUhVP#vQoaY(LH<0N~H^SK!2y_DooWVbbx!xYUe zw{}3);v#*PS>3?AMEt!*a*wt0)^x)n8yppgclp^w*1bZF2*hJ87QV#oh9ci|qrgG0 z)J)vvk%166XCZADwUqR`t?kwa*ADhWu8q9oha$KD;JZeb!fY>BZMB9ixj;PpAeET-T3>9c= zZ(rt)$;rz4xn7JqW-g4+&dw&C2;t`TIlFsi)!lNe$OJ0LCT`ERO3z1%{oL`sVnXn& z7>uwJbH;U%hF?H{g0?C4obrN& z`^d=1;S%h~b;*DtHZJaYii}sQ_2*eHR2`F1rDO9l@|V(W`;(gu2d0icDj8(FHYvZ8 zjU&+OV^+go?g5ghSX!Qc{rai&g#Sqx&u_PHNjKRfj15G`dZkJ3V3Gp5 zggKC^emvejUg5xYwfZNyiZ58NQirjt`&%(2J$rVFwCon2Cw{u$ob{|DgW@l0 zwIoS6{4B~-QOa;{be&h#efUstQ^ILdy1at?)rOY)$uB+K?Kq!3*Uo(zNTG2o{Irm0 zAkG_7FmjObU06=f$RMAXmutR)=Jk3NKH%(?drOHnHc}e){g3R{Bx;k zZwjwT*U4IlazpHV~@%ygxQzy0i;kty=rzO~x9Xc5ASwPU-B z-LBojRS=ZKVKlIpz@1xAAg)jNbzjyWZ6EKPLpA@EEg~Bx`Fnp zfy9GT`ty0ExbgG;*`2Px7bZwrP7`s{o(X5ff&NT zDf(wZBSH4x$h*VptjC1ZV*ktQtcJE|dGb}GRc%!qr2_sAfZk2z$q9AvT# zQ4qq^$LCUEZfx;tw&ub|FPKLr)d`9R(DAY*tL@-ce@2;#nX{ z0n$WV^P%MdoA*k3=&3O^W3&)`<4^x_N6A%{H~eyvfS`{`%*kHA&Q6>yGBIm1c@SiV z+kM8*&u`wBD!1*u<}%Qi9W%MG@K{_z(&|ev8}GGyWgm-iiw~<;mf7a^`Ut_zZ1f$| z4QAv}M@$_pMPH)olLUV}>5)<6kM{>^5&@bU`eegJQIdm+xBi0dG=)=?m8H0h4L84E zTHi=h=4AZSGg3|;N^rvwV?g}oA1CknHmHSHP5g*_5a@dxN-HZn3B5rHH-~)u81HiP zGthaWKv>)5oX*HFPTUy8NmmfS@$r1u40iP&E~-9!a^bGficlizhe?E!PtK+Nqqlq9fL?+CJ&NaGd49)cxtj=>T18bgq@dIKGc70GBkXCP zxf~K}GeWs5htNR|92mG->{#)E$Hn2{;k3fjU%EEy2|q5*d>jz5zd{onm_PQ%qWW%! zxIYcx0xbK*{qdIuw5r_Bw-k)c&W)j=Qz7zD`!%?;XH@W4_s5qws2)jsib#HM8tTv0 zs58BpIS7?Jd*XanuGf%{TWt$RkMRdUjK}bXJu&g+`3|nA$M;*wS7QY6c<8LUhDI!F zXc;Di^7^EJeW}Z=*!b_SlJyO1!V>|_FQ}eH$U^)VCSskcgb1@Ay<`hEWF;i1=-A|g z`d~zQ=lY#v_lNGs#>OIs%lUykgt1y`X~fH)9glch>Xsw!p4b4zzxJ>5{g`!82xl!V zwm2`4>U~nC(z)}KmtOkEj~7`Ko+^Y?4UB9%Gq@X-N%-O3jly+x`{~oCUb5|q;BMl12uXqMgFzePJM4N54aezH18;l&sP)M2 zzhn~uybbIZXY-=EM-&11Q@ zAKK8VUPDEa$ zuGkD^YLy^x5i>>vz05ZpNLm3V__@U?h~KLJ3{ocFU$U{G!otJDX`#0U)dX#_?eJi< zHg(CDPgs>)zkW=roAo=2E^a^TgwN}10}xIJE)ipjEOtF=mFbjlsz7^$+mUY&9CgVx zDLCbt)_-y`dY=@(dM=}}lY7d6=}rR+;L!z`HSVd|XFUQ1BC~V-6agS|Y^q;#K2wJ$ z4w%tGQ62)>sdH5$eDE{RbwP$+SXW} z^)cJLElg-<_yy|nzSukx9StPHf4kZGido}Xrz%dyPzp{dr#4{1@98i5y)u>Dxc&`4 z-x`P>8ylN1)+Rj6gp_Y8>irtrOn?{P+p8v@E)g|FYECirU^30{Xf)azClW)4 z&iQzOwsmC{=Drd(M{pzV+lWg@kTu1S8t*;h3HQKIG)>sB&Befd)zgveM1RcIR2>^| z`4j<7&oYMk_a+iazXRsl&qq~OvJ!EfuwX2vJZYeK^txZK<8K@fIdE`~Mh^57;Yyc9 z-B;SZH;7AuBvObFfgkb5@5#%1-Z~rGhuP)1xo?TX^ud4Uql$_c`(Ow49cH47Tdsbm z58w*}YL769heODOi7Fb6v}*mOjl@&xFU-o&LkqT*NILM>oaz)c%^se%na|Pi+)d8wL7kyv=z0?NquNF z8q~M9g2wD3X*`7`E@&`z$M8dGqMMj?|5|Uad-KYVRH45SQa_>JP4@y*`}-&!Y$b&H zGBtS8R~8#Y?6k8itP8PE<04|Xf;{~Dj1d|?qp z-D16me!b>O#2;i97BXxV7*a!rzntL_z&`oc=o{KH{c7sBU=#AyKuaG?y2SyFN;@w= z4z1Z|!RH)vf0gn?3*xqjzoGBnzxPj1NAom_JT!K&b0mj!6ZB`39N@wG`|j=JVNZMR zGqr0xCw%O%-gi+K;e=zI8!^`96&17jA}BIw(tSwF*1;iYZ2bsYAC>D&2n=l{OYRAg z3D2&8IP5u3VY{U>xuHgUAKU{i<(FLo;}+^fe1?YrySTqTrfmuhtS!!bpUlcf<>j&G zJl1U8!LK5vUC)DIZMQqwSu_JrP<_#CONfX|l_S4Ql*#FVpkcj{%lkYxyl>5-7V@2+ z;HjB#Y1N~XJAGT7R*TXO{p=tt1c6g5n?kuS<|s&uY&(Ytd`@K}BTiX~L7gQ{kp|s8 z+@5k8e(G~WgNZ2}qIo~xF4rLrop0w58xop9rQUrfXlS*K-R8qN5rq0;ao^XAP49)- zYY6)>91_Q$K7D#fC`qUU@$@khf+LNr5vc{g8(^kg(W$X$n$T_0f3N^`4hi}1KOdlu zZgK4%Eu0e*W5FLCjO}~QWl3@sYAJXY-N0LQL@I)zF>)oSUIuY(?GSdt5TgHxDl)v0 zQ?(yDUq)EFym;x@M-;Z2TJGp~|4NlFUI0HjT&y~kDRMn&B+#3}Y>Jn6%|lyDqlJ$% zYaoItYUAQ?ZxLs+)b(wr0t`P7b@JlEd`^;HIhP#TdBULWj7I(VFw zcHwQr?P}^iyuJ6zljtB7%>#Q5yi$^*`a?iQN8c=Tmu0ZkP~RvqGB!0#Cca4;(qWx3^uKQWy6wAu>JDm{MJ{j8{U4RzgBTy>GPf9zG7w3U?n z6Y-~3AMdd_e9C5GjOh%Thovgq4i_)a!vG-T@P&c=)~ptUZE2&<{yJ*HP=OsfE= z$*Qa6))2&v7cX{<{X%xE~O2W^xuxOgkT?hIEp4-FTTb^Zw!$VmQlvjPE3O z!rQlB7tK63C}k_S&kDtdIE>Y#55f+U?LDIsZec_WmyTb%cd@0uVLZ1p`g zR7ldt+{w=30kdvbD9QdeGTD6Yu5h4BV(Hz1a{~ zDcd=%KJ^gb*mFzy@68b3-t=Y}l94x#Z}yc3yxBu)bMx4c5RsDl)RS*HV!-FE9kq}K z5rVixIqwAtgR8`)rFdJX-v*=8z9Q!FtYnn?-N>m2p3aF~#1VL7IPgx7`Mounor$vu z1-(=`O~sB3nAZdxF+vKa+N;Vk`F^O#P^YrXBX>DKf*vPf1_qFcKPWKc`9gs<-$nl z2mc&HIE(ozcE;8f&%ioXtoRrg!9jj&Z2Ut&gPVkENMK*&BWFeydYeH&3~Nfx+(O!wff8RV`0XNe}=pn90GNNQPS5r z2(cH#9AsAb_wV1ArBA=vw|V@yE`is*}59M7voh~n;N6wgN?N&`nB8UR{g3=Jwg z7az^Yr=G5Pn91xGA^hm#fAXw*UC%_3g3th^L5N8boqYa3NYzURa8_oAj1hd?WokFbeU?c; z$n8s=_UxGDyrLpiB_(n|<<|hM_^g8M^yv$bG<$B~QtIp1=j*tzvxcCR{0^r1pE1RD zyDtxHR8e8b#RdD_Ta-g)1_tk;FIX0`a;kiogv7%!XW;HN9`0Vhp?%AB2hINof1a4( z+wul}9;!Ajif0sr2k7`Lw1$z!;ro_~)#fo{bX!b!Q52Bz)x;_= zLkfiyRQW2t&l;=Zk^LE~LiCDkISLvQF=a(jG)%)QnhR~hj)J7NCrYvUA|@Fayl)`> zoFnv3TVyqi!vHb~y5^ z8GEcuBm&Vo<&D30R@Pg`cgMruv2fi`ak8#8#=j*n6T-_D0pdsL_Xr zVq#(3Xt7$>ZacX9S*P%Me0tzAWzc?fO19|SVaTZYUMu*)rL)Jn8^*dzx#HglxWRg} zI!_FZT-102FSfW4OX@{y($y*#NqqE4;JooweLk zPj<`!icH-Us~#0jD!%sn3;# zn%r;BDf27QNwrOv9TLCc z0!^H7m83UzE~+w>PL9Q+mwR$&BhYR1 zv%XB7%BgL0pDDujZr#$ygwU#_zB_kvYxa>ZxU)$1)f*cdbuH(OF2<=`HVJD#oN_Sg z7~Q-a7q4W|#i&@{unOh&sQLHeOOG7nl;Pz0a#~Bt4k2463SUgpV3%`M5Z69IN7h zzobyGn7wg$p6Is!L+mX6H@(_aCtGI8_E`*8ttv*TTZ)?e_Wb^hzMtVwXWs4ZsX5d2 z)?hagbNVdNvaURut%<4D{;PH!&-dgv-NC#@_a3iT(SAA8NWtFfWu7J$yxZ3I*(#)0 z)-3%COOtUU<=(~_=C#^W-6YERGj&?Zy&CnC=J2r$v26@(eIr0vIX)wr-UZ0FE_XJ+ zFPdE`MWFQe#+@P|8tF*btyW^tE2~zn;9avz{aUA;ZSz7s_QrZ@*V`%7^IOco^P2Jf zulh-5Vy!5H`gPVGsXGq54Nd8zTfg6?Yj5(-R`jmf>~QCO7pkXr5T|*33Ng}+EDbn1 zaQR?N;niMMy-~X?G3HEgk(s{Pz+~umpm-7baBKtT&6A3C@l!ZpPCsZ4Z0}y*8TggC zJ@6iXrz)~>kFebIhK=mz&^2$^kH$k0dAvUDhns|q_X2IHeJFN$|!?5VOmL*;HQbY;P|X!qrUCR$tj6r$_p}-|$?K zSq%KHUtiCi9Gd#7N4f9T7E1F-kc~Ap!~xmWL=BH$)5jk$s=Uij^_g+*H9>znsy^N% za=(2n^SwaB)!fdPFQ^|^neXx=rYs*@-q7CsFwGfYZE zEbd*RHJ3Mg;p53Vd(EWh`RIkT^}mI)(DxZ0ov09_e-OY@df-yN_lF}X2Krber1B%H zAK^o;b+I)0Hy-kR*s@R+-@O%Mi+2w1_?)RW1M&`6%dJEw$4%y_){fttqB#*h4d<@7 zCUPAYh1)wcp^RlWwpZ@4iL^7Qoft2fk7`q(FY8Sk6Dw4cM(?%m0JPlmPAL`V)XoYuDcBt6Cd_-c%3hm$WTK?tA^4U= zcs?Z)LbI${N>9AP-i3EIYB3w(NGjdL+Gldi=~sz>aV(F1Z?*1nN9)O5J72anyR!U> zW8es8yftgP_!Y)5n#_}uJ9%4J4`qQ{e08rel2bp6Q`LmvRpGns_*%?yYgS!e=8E>F zFs@=2{nwiC%^fYtre%>Mef`M4C}}vjeHo>q8Nm^m`x4FfQsgsD<+udQd=TrMIjs{QXnUFuRz9&&m$?d6EkfZ5K5xEY58g6K!`@QX0*XTzuqt znkJ>Glvo^vg)fs@Ug{YJvSTMmGO)`ZyUVofC;i>$d`7o_>zM^`XS%4F{7fU)$Rfj< zk6#((YCE6t53XN+wVr&u?SJMkkXrisfPntZ(0 z1t(^Lv?$ITb;(N)zCP6<7c*TmO#`7Kpii^Q&(?)0|3K=P{)W^&&>!maB^YEXr}2>u zyG!7ogOh>ScRDq0WX^gLPoZhY=8A28Q$yoJzmCH-MWpHa_^sy}>`)zG84}Dy6{H%0 zFbAddF}Amh!CKPtkUx_f1YQ!r)98yn76}s0eJmZzo&rBNuE~hv=2G72mT*~dk4N>v zu*{wMAB2Zb(U-mzaJ-k^x&>o)Po>PL5L%!$(p{N>k1t7SN3Ps439pd72CTOI%EsPl z$5iOVlIEpUK+Qt1UvMhr>q_VIoWEzJ^!KDl&5iputD7f_Hv(TZT)7fKvHR_jtBw;**r`A^ zGJ4i~+Ag{DN**GjJjK3s(iP3MplGGOu9+y;k`B|&RU_M0ZSbvA2;6B_P-S}5fMX~6 z+8*I%O-}W&y+>+4V zxSvW7U+d{#c*S0;p1NTA3#J`OQ+>7lS?W7);Na-{SQd*%3ia0xj{pU0;m4#VsJ;Dx zK!eC_49$!M25-!7{JPJ{U>oWa%iS+jW{obuMuG7In{tiSwMgB$w0EoRpvQ+qpw1-E z*@HY~2#S&T)j8Mp{LK9!&R`8eNC~Cz(`}w^ff@2wM$}rEZwMXT5he)S)XS71N6g&U zaz=Z?x8>S49*InAA^k7lBq&hmxJ}e7{P#X1nOuIJS)!=ZL$A^J*WlEf|~05fk|8J&@$L z)j%5%0*?+kW@q~&h^;ZWy?7>b9pyUI8M5;=@G46Ez_)(!75kj9_CBDG$E@r%Wt~2K z8erRzBI&*HCG~EW)xZ(Z1Fk_mU=1`;i@6s#(N?J|%yh)$o5=zS=9sw{+xpPf_X32l z5u(=Y7Z&EvA=R$s671k*XP8CvnnRe8{4s>3P4>o;^DPL5oB4)=SETo8Q=4~MnN3hD zfV48g`kDfFW(|>kmImSr(hi7%u?6pWaVaPmHBg-_HmzpQjI4^MNepaw3Qg#1egqa5L zFC1{dNh}1wT*jV6Q{6XpJD+!w>CM7DQg1>E4{HeBN7H`JEzUN9FB`dk!Z#0tXLWLT z%Fz0VW&HkAMT_mkeHmYv$0ZYALHEBioh_DbFD-4?})rkHRI7!7aH@( zK8HXw&z?feI2y>aD3njjp*Ek5f^vVEAf{9YBU5Z+-k^GP|Gwp6St($A=1YK zmx6^?ValP5g1B|&ZZu`=?giaGI8ZzTT`YXxmW*=u_&NHbxz&u~2W0Z7>NM-aRUm4% z?_kDU0T1{Oh*NRVbFXhh24wBUp}sq?0ZW9v6ug0`x=gP^ftW}g@D3(Lk=)jVILh5P zi{Cu)>~L*)vF`nVqwkHa@H>akcXVB$(iDNJnZStEqoi}(yKQ&mX!&R6&VkVt%94Fs z*5visZDoSF-z@U}B#<7SpFbS0lYlaSgZY0uq3u&dQ4u zOrq?)&!3L2&3v8pU2Om0i}dUBour1Mtz24&9AXa{I*eSBFGvj7l;wQ%Y9vlCJ*$Br zfY)PAI_1f1eI>BD;|~l@*HD7 z!eZYu%A5Wc8vGV*@a~RU$VIt3Vs6WO3Wa9B5>cVw3(GTD{OSoxmAy+Jl9y*q)#gXio=4$|Z=OXS(^k&RC@U*Z7W8KRYoWCP`ty=7 zc)zX)x+mt34ueuC?9KO#9$1W0eA|S1moii5n-7|ihPQ1~-dbA}afE&b=L#Wio@^xFo*O=`AT0at_)k0AQ+m+F-dytS*&aYsc-Fqu zRc*!Z!aZ+CL|*(4X$!b-s1J8NNa=A&ZWQ-YjMVkvW!XGI4e!Uw7oeZ%aZ@i>&BvmC zc85td9r|xMZb^Z&*I*G5#3%0P-7&Du1)Wsv@ia!ZyyIz}>vyPl@o{4!*AazTL|Pkm z?iXd;k2Fv;fPwIUvZyanpx3vopd^HhfADG-^?*c0+-%>9_~3*XA3Mk*t7~Z}J#fpP zGqtyhM=?2?oyww+~p{4QKqtwh)h}c~xwhywbq1qAbxd1Y&Vu)VpS`;y+ zjAdH5qdi1(k}IMm;`-}{(8X9bhkc>jF<64CWz=y+5&YUwUU6LDp!2EJ{i88BDksO^ z5&W(#yJ7>nbp~%qQtZ2`2XMr2-j!9|&dgDJRU`#el zk}jK<$|$}IinG=i@Y>Sd;!b*leLO&niyN&It`5{pI1ots!2J%kFdfz}4R+^q$`kxf z)~RZUZVBJawmHQfeCdVV8+t6c>4n zF-OE*N%ni?wE9${en?vqLOSfxnDfV-R(g|%#66!*EeXV7X8sz}X&^WeV6?E42d^aK z24@Vuamc2hA6`^hoVk&UYgH~;EXM4fy+0%)E;x8@R0sl;nti$NfDZk{3^vhNXUg&9 z{f*YX`PRms@>WS(Ey3jv5n};Zx$34aVYI`3QDla+s9|=?UZh{^1OIuHIgv2 zxECjq;C}P&-$KlDTOIX?G_G0E8z+Rh(bOE&peK4TOXZ%}r0MZD0pbfgo~m&0$ijXF zS7`_LUiQB9`r~u3v--?s(hxb~tXnVqz77&iO$)Uz?#}R@$~DsRp5@%UltA3?#hAhW z;xITr`iPV2#1lweDDM?xu=mf%-6|ax{Ekl#6 zI{rIZ@WE19StQ#dZB^M-Cep%bz`gfl)IX;?-)8T(z`e{65Ff_!G{~D-P!fQ?IZmNH zB~}0$BgxL2E;BLmpCCBixVmFGTXcmKsJ$LtitUL2;c+N)pAc2Pk<=mU358@u)qi9t z<^w@tOfgIV|D1!U;J-?Zi$UnHIAbY-!N6QrZI1O9oO7xX5Z8Tqn;7IQ#31jnb#;b< z-j?AOA4#mh&LNVC-BeI@admY=Wh3L~Pj&OQ4%e@iCR(_poBXbJ(bv-vKIgw4dheL5 zl<6m1F};cisN>T$Q$y+{Q z+4YKu&}z&De87Xt+j&(2P+C?6JMv(&X`T$LnAoV8n89%9(%&h*#9S z49{11hYJ|m?{ zjQoF%4EnIQEs)(HwOG7U^r5SAfnFcuW2_q5iO5?*4idq9mMfBsb_{l)q*Z zOITT_=BHSB;H(|_Nj^NduB^mGpH=lC&l?%2rzn;?H?ShTlZo1uRj03OE{-4%-XgPJ_6^&QVD+VQFZR9+zYGsK-DUQf z=I1y|PMX*Kh=*tiNmti9J$X zRu9Ch-cQr=aibGQD&7_G?Bv2uv=kzRUr2&@>l)<;uD!hs;5;+1sjY|qRgIxbNV0zU za4H6KmvKx;WNG+l(r?P95tbrJjeLlXCQ{An^$hba10eN%qC zychUDHpp`lPy2CCfE%52@uGntocE;>vE>5`gm@TACjGOU!gJ%NEKd=2?O5lVK++7^ z=@L+~~2j?Ix}!(%i!`KE}8h+jnpB(qu9Z= zBK!F<^9HbgCcP5@w&?)QTX0-!~ zgZypIzyru!Sb+RHAP74=ud(n5bb7Y(ThTSpX_>{`9qk9k`UjD_$|)nVz+`m%V%j=8 zRy{I0CK#ge`ACc}G&^12G<7n*%RNC)_siHHC+ZEFA02EN}(lROU` z__A{?oKp2W&A9EbNbbK}M_*frqdA6E{Y3Sw8o$&LJR22uZM25!p%4a+5EaBEiZ zOppI;T}9vg_>q4$j^Pc22vzlDxfp38r6fLP@YI{?Chk3u2iCVRsa+QBf9Y%Xk`KDo z5%cB5Ns|W$*Rks!;@91Mt@$$xil~4m2^9Oo$q1>UM_c*6XDV}-N9X}zBivV+o&Rk? z`(*^Qs~RLGr)AY27OgU?5~6E=`y^N zd<%<)^a<`h9p>C-RbZK=UwQmHGLaS&=;GLEbB&JX*lBff+>LkAdRjM3O2aEI<0MLx4j_s&SKrQWN6^MQz?s_fs%vGvd(wvzWs>e?cJ&L-K= z+lI-?k|H;C_mFC`#p2$>4axpYm(nC+BY`UUuRNJKUQML?6B+vf0J`-xhi?bat|)NFHeL#0ukh{ff(Vt9HeS6XC3YZH)dajV{l2|6~R) zqxAx7BWkR_wx-j?--mb?gtB2$jS8D&iwx%~EX04m2?$aCfN?{YvcDtzzd6LWgG@RY zqf*@ebcHt16~IK2JQmUmSc?A|OmtWh7vY-@=S`f8t*0z#8OrkMhr}b&cSPp}PPB%O z5kV5}Nujn}=_ybL2E2jde_J*aXMpm5kE;+MNW^p!QsCfdsB3fRqB&04NS%& zXnI1}oi%r-b)83)sMuaQvY%g?6e#ree;l_HVa?oBDsWeED~r`fMm+VQ-$vOHaZ_Eb z^z%vZ Date: Tue, 5 Dec 2023 16:13:45 -0500 Subject: [PATCH 115/281] Fixes barsigns breaks all lights and updates barsigns to be machines and not structures We will address this in a later patch --- code/datums/mutable_appearance.dm | 53 +++- code/game/machinery/barsigns.dm | 17 +- code/game/objects/structures/barsigns.dm | 348 ----------------------- yogstation.dme | 1 - 4 files changed, 47 insertions(+), 372 deletions(-) delete mode 100644 code/game/objects/structures/barsigns.dm diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index f248da2a7323..c066b96cea41 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -4,18 +4,45 @@ // Mutable appearances are children of images, just so you know. -/mutable_appearance/New() +// Mutable appearances erase template vars on new, because they accept an appearance to copy as an arg +// If we have nothin to copy, we set the float plane +/mutable_appearance/New(mutable_appearance/to_copy) ..() - plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE - // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var + if(!to_copy) + plane = FLOAT_PLANE -// Helper similar to image() -/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE) - var/mutable_appearance/MA = new() - MA.icon = icon - MA.icon_state = icon_state - MA.layer = layer - MA.plane = plane - MA.alpha = alpha - MA.appearance_flags |= appearance_flags - return MA +/** Helper similar to image() + * + * icon - Our appearance's icon + * icon_state - Our appearance's icon state + * layer - Our appearance's layer + * atom/offset_spokesman - An atom to use as reference for the z position of this appearance. + * Only required if a plane is passed in. If this is not passed in we accept offset_const as a substitute + * plane - The plane to use for the appearance. If this is not FLOAT_PLANE we require context for the offset to use + * alpha - Our appearance's alpha + * appearance_flags - Our appearance's appearance_flags + * offset_const - A constant to offset our plane by, so it renders on the right "z layer" +**/ +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, atom/offset_spokesman, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE, offset_const) + var/mutable_appearance/appearance = new() + appearance.icon = icon + appearance.icon_state = icon_state + appearance.layer = layer + appearance.alpha = alpha + appearance.appearance_flags |= appearance_flags + if(plane != FLOAT_PLANE) + // You need to pass in some non null object to reference + if(isatom(offset_spokesman)) + // Note, we are ok with null turfs, that's not an error condition we'll just default to 0, the error would be + // Not passing ANYTHING in, key difference + SET_PLANE_EXPLICIT(appearance, plane, offset_spokesman) + // That or I'll let you pass in a static offset. Don't be stupid now + else if(!isnull(offset_const)) + SET_PLANE_W_SCALAR(appearance, plane, offset_const) + // otherwise if you're setting plane you better have the guts to back it up + else + stack_trace("No plane offset passed in as context for a non floating mutable appearance, things are gonna go to hell on multiz maps") + else if(!isnull(offset_spokesman) && !isatom(offset_spokesman)) + stack_trace("Why did you pass in offset_spokesman as [offset_spokesman]? We need an atom to properly offset planes") + + return appearance diff --git a/code/game/machinery/barsigns.dm b/code/game/machinery/barsigns.dm index 1842a2dfbbaf..b3172c518943 100644 --- a/code/game/machinery/barsigns.dm +++ b/code/game/machinery/barsigns.dm @@ -13,6 +13,8 @@ /// What kind of sign do we drop upon being disassembled? var/disassemble_result = /obj/item/wallframe/barsign light_color = LIGHT_COLOR_BLUE + /// If barsign has a lighting mask + var/light_mask = FALSE /datum/armor/sign_barsign melee = 20 @@ -64,12 +66,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) /obj/machinery/barsign/update_overlays() . = ..() - + + . += emissive_appearance(icon, "[chosen_sign.icon_state]-light-mask", src) if(((stat & NOPOWER) && !(stat & EMPED)) || (stat & BROKEN)) return if(chosen_sign && chosen_sign.light_mask) - . += emissive_appearance(icon, "[chosen_sign.icon_state]-light-mask", src, alpha = src.alpha) + SSvis_overlays.add_vis_overlay(src, icon, light_mask, EMISSIVE_LAYER, EMISSIVE_PLANE) + . += emissive_appearance(icon, "[chosen_sign.icon_state]-light-mask", src) /obj/machinery/barsign/update_appearance(updates=ALL) . = ..() @@ -209,7 +213,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) /// Rename the area when this sign is selected. var/rename_area = TRUE /// If a barsign has a light mask for emission effects - var/light_mask + var/light_mask = TRUE /// The emission color of the neon light var/neon_color @@ -405,18 +409,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) desc = "When it feels like you're stuck in a pit, might as well have a drink." neon_color = "#aa2811" -/datum/barsign/orangejuice - name = "Oranges' Juicery" - icon_state = "orangejuice" - desc = "For those who wish to be optimally tactful to the non-alcoholic population." - neon_color = COLOR_ORANGE - /datum/barsign/tearoom name = "Little Treats Tea Room" icon_state = "little_treats" desc = "A delightfully relaxing tearoom for all the fancy lads in the cosmos." neon_color = LIGHT_COLOR_ORANGE - light_mask = "little_treats-light-mask" /datum/barsign/assembly_line name = "The Assembly Line" diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm deleted file mode 100644 index e8604b563d7b..000000000000 --- a/code/game/objects/structures/barsigns.dm +++ /dev/null @@ -1,348 +0,0 @@ -// /obj/structure/sign/barsign // All Signs are 64 by 32 pixels, they take two tiles -// name = "bar sign" -// desc = "A bar sign which has not been initialized, somehow. Complain at a coder!" -// icon = 'icons/obj/barsigns.dmi' -// icon_state = "empty" -// req_access = list(ACCESS_BAR) -// max_integrity = 500 -// integrity_failure = 250 -// armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) -// buildable_sign = 0 - -// var/panel_open = FALSE -// var/datum/barsign/chosen_sign - -// // /obj/structure/sign/barsign/Initialize(mapload) -// // . = ..() -// // set_sign(new /datum/barsign/hiddensigns/signoff) - -// /obj/structure/sign/barsign/proc/set_sign(datum/barsign/sign) -// if(!istype(sign)) -// return - -// icon_state = sign.icon - -// if(sign.name) -// name = "[initial(name)] ([sign.name])" -// else -// name = "[initial(name)]" - -// if(sign.desc) -// desc = sign.desc - -// if(sign.rename_area && sign.name) -// rename_area(src, sign.name) - -// return sign - -// /obj/structure/sign/barsign/proc/set_sign_by_name(sign_name) -// for(var/d in subtypesof(/datum/barsign)) -// var/datum/barsign/D = d -// if(initial(D.name) == sign_name) -// var/new_sign = new D -// return set_sign(new_sign) - -// /obj/structure/sign/barsign/obj_break(damage_flag) -// if(!broken && !(flags_1 & NODECONSTRUCT_1)) -// broken = TRUE - -// /obj/structure/sign/barsign/deconstruct(disassembled = TRUE) -// new /obj/item/stack/sheet/metal(drop_location(), 2) -// new /obj/item/stack/cable_coil(drop_location(), 2) -// qdel(src) - -// /obj/structure/sign/barsign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) -// switch(damage_type) -// if(BRUTE) -// playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1) -// if(BURN) -// playsound(src.loc, 'sound/items/welder.ogg', 100, 1) - -// /obj/structure/sign/barsign/attack_ai(mob/user) -// return attack_hand(user) - -// /obj/structure/sign/barsign/attack_hand(mob/user) -// . = ..() -// if(.) -// return -// if(!allowed(user)) -// to_chat(user, span_info("Access denied.")) -// return -// if(broken) -// to_chat(user, "The controls seem unresponsive.") -// return -// pick_sign(user) - -// /obj/structure/sign/barsign/attackby(obj/item/I, mob/user) -// if(I.tool_behaviour == TOOL_SCREWDRIVER) -// if(!panel_open) -// to_chat(user, span_notice("You open the maintenance panel.")) -// set_sign(new /datum/barsign/hiddensigns/signoff) -// panel_open = TRUE -// else -// to_chat(user, span_notice("You close the maintenance panel.")) -// if(!broken) -// if(!chosen_sign) -// set_sign(new /datum/barsign/hiddensigns/signoff) -// else -// set_sign(chosen_sign) -// else -// set_sign(new /datum/barsign/hiddensigns/empbarsign) -// panel_open = FALSE - -// else if(istype(I, /obj/item/stack/cable_coil) && panel_open) -// var/obj/item/stack/cable_coil/C = I -// if(!broken) -// to_chat(user, span_warning("This sign is functioning properly!")) -// return - -// if(C.use(2)) -// to_chat(user, span_notice("You replace the burnt wiring.")) -// broken = FALSE -// else -// to_chat(user, span_warning("You need at least two lengths of cable!")) -// else -// return ..() - - -// /obj/structure/sign/barsign/emp_act(severity) -// . = ..() -// if(. & EMP_PROTECT_SELF) -// return -// set_sign(new /datum/barsign/hiddensigns/empbarsign) -// // broken = TRUE - -// /obj/structure/sign/barsign/emag_act(mob/user, obj/item/card/emag/emag_card) -// if(broken) -// to_chat(user, span_warning("Nothing interesting happens!")) -// return FALSE -// to_chat(user, span_notice("You load an illegal barsign into the memory buffer...")) -// addtimer(CALLBACK(src, PROC_REF(finish_emag_act)), 10 SECONDS) -// return TRUE - -// /obj/structure/sign/barsign/proc/finish_emag_act() -// if(QDELETED(src)) -// return -// chosen_sign = set_sign(new /datum/barsign/hiddensigns/syndibarsign) - -// /obj/structure/sign/barsign/proc/pick_sign(mob/user) -// var/picked_name = input(user, "Available Signage", "Bar Sign", name) as null|anything in get_bar_names() -// if(!picked_name) -// return -// chosen_sign = set_sign_by_name(picked_name) -// SSblackbox.record_feedback("tally", "barsign_picked", 1, chosen_sign.type) - -// /proc/get_bar_names() -// var/list/names = list() -// for(var/d in subtypesof(/datum/barsign)) -// var/datum/barsign/D = d -// if(initial(D.name) && !initial(D.hidden)) -// names += initial(D.name) -// . = names - -// /datum/barsign -// var/name = "Name" -// var/icon = "Icon" -// var/desc = "desc" -// var/hidden = FALSE -// var/rename_area = TRUE - -// /datum/barsign/New() -// if(!desc) -// desc = "It displays \"[name]\"." - -// // Specific bar signs. - -// /datum/barsign/maltesefalcon -// name = "Maltese Falcon" -// icon = "maltesefalcon" -// desc = "The Maltese Falcon, Space Bar and Grill." - -// /datum/barsign/thebark -// name = "The Bark" -// icon = "thebark" -// desc = "Ian's bar of choice." - -// /datum/barsign/harmbaton -// name = "The Harmbaton" -// icon = "theharmbaton" -// desc = "A great dining experience for both security members and assistants." - -// /datum/barsign/thesingulo -// name = "The Singulo" -// icon = "thesingulo" -// desc = "Where people go that'd rather not be called by their name." - -// /datum/barsign/thedrunkcarp -// name = "The Drunk Carp" -// icon = "thedrunkcarp" -// desc = "Don't drink and swim." - -// /datum/barsign/scotchservinwill -// name = "Scotch Servin Willy's" -// icon = "scotchservinwill" -// desc = "Willy sure moved up in the world from clown to bartender." - -// /datum/barsign/officerbeersky -// name = "Officer Beersky's" -// icon = "officerbeersky" -// desc = "Man eat a dong, these drinks are great." - -// /datum/barsign/thecavern -// name = "The Cavern" -// icon = "thecavern" -// desc = "Fine drinks while listening to some fine tunes." - -// /datum/barsign/theouterspess -// name = "The Outer Spess" -// icon = "theouterspess" -// desc = "This bar isn't actually located in outer space." - -// /datum/barsign/slipperyshots -// name = "Slippery Shots" -// icon = "slipperyshots" -// desc = "Slippery slope to drunkenness with our shots!" - -// /datum/barsign/thegreytide -// name = "The Grey Tide" -// icon = "thegreytide" -// desc = "Abandon your toolboxing ways and enjoy a lazy beer!" - -// /datum/barsign/honkednloaded -// name = "Honked 'n' Loaded" -// icon = "honkednloaded" -// desc = "Honk." - -// /datum/barsign/thenest -// name = "The Nest" -// icon = "thenest" -// desc = "A good place to retire for a drink after a long night of crime fighting." - -// /datum/barsign/thecoderbus -// name = "The Coderbus" -// icon = "thecoderbus" -// desc = "A very controversial bar known for its wide variety of constantly-changing drinks." - -// /datum/barsign/theadminbus -// name = "The Adminbus" -// icon = "theadminbus" -// desc = "An establishment visited mainly by space-judges. It isn't bombed nearly as much as court hearings." - -// /datum/barsign/oldcockinn -// name = "The Old Cock Inn" -// icon = "oldcockinn" -// desc = "Something about this sign fills you with despair." - -// /datum/barsign/thewretchedhive -// name = "The Wretched Hive" -// icon = "thewretchedhive" -// desc = "Legally obligated to instruct you to check your drinks for acid before consumption." - -// /datum/barsign/robustacafe -// name = "The Robusta Cafe" -// icon = "robustacafe" -// desc = "Holder of the 'Most Lethal Barfights' record 5 years uncontested." - -// /datum/barsign/emergencyrumparty -// name = "The Emergency Rum Party" -// icon = "emergencyrumparty" -// desc = "Recently relicensed after a long closure." - -// /datum/barsign/combocafe -// name = "The Combo Cafe" -// icon = "combocafe" -// desc = "Renowned system-wide for their utterly uncreative drink combinations." - -// /datum/barsign/vladssaladbar -// name = "Vlad's Salad Bar" -// icon = "vladssaladbar" -// desc = "Under new management. Vlad was always a bit too trigger happy with that shotgun." - -// /datum/barsign/theshaken -// name = "The Shaken" -// icon = "theshaken" -// desc = "This establishment does not serve stirred drinks." - -// /datum/barsign/thealenath -// name = "The Ale' Nath" -// icon = "thealenath" -// desc = "All right, buddy. I think you've had EI NATH. Time to get a cab." - -// /datum/barsign/thealohasnackbar -// name = "The Aloha Snackbar" -// icon = "alohasnackbar" -// desc = "A tasteful, inoffensive tiki bar sign." - -// /datum/barsign/thenet -// name = "The Net" -// icon = "thenet" -// desc = "You just seem to get caught up in it for hours." - -// /datum/barsign/maidcafe -// name = "Maid Cafe" -// icon = "maidcafe" -// desc = "Welcome back, master!" - -// /datum/barsign/the_lightbulb -// name = "The Lightbulb" -// icon = "the_lightbulb" -// desc = "A cafe popular among moths and moffs. Once shut down for a week after the bartender used mothballs to protect her spare uniforms." - -// /datum/barsign/thegoose -// name = "The Goose" -// icon = "thegoose" -// desc = "A nice place to hang loose and relax, while enjoying some electrifying drinks." - -// /datum/barsign/tearoom -// name = "Little Treats Tea Room" -// icon = "little_treats" -// desc = "A delightfully relaxing tearoom for all the fancy lads in the cosmos." - -// /datum/barsign/le_cafe_silencieux -// name = "Le Café Silencieux" -// icon = "le_cafe_silencieux" -// desc = "..." - -// /datum/barsign/maltroach -// name = "Maltroach" -// icon = "maltroach" -// desc = "Mothroaches politely greet you into the bar, or are they greeting eachother?" - -// /datum/barsign/rock_bottom -// name = "Rock Bottom" -// icon = "rock-bottom" -// desc = "When it feels like you're stuck in a pit, might as well have a drink." - -// /datum/barsign/assembly_line -// name = "The Assembly Line" -// icon = "the-assembly-line" -// desc = "Where every drink is masterfully crafted with industrial efficiency!" - -// /datum/barsign/bargonia -// name = "Bargonia" -// icon = "bargonia" -// desc = "The warehouse yearns for a higher calling... so Supply has declared BARGONIA!" - -// /datum/barsign/hiddensigns -// hidden = TRUE - -// //Hidden signs list below this point - - - -// /datum/barsign/hiddensigns/empbarsign -// name = null -// icon = "empbarsign" -// desc = "Something has gone very wrong." -// rename_area = FALSE - -// /datum/barsign/hiddensigns/syndibarsign -// name = "Syndi Cat" -// icon = "syndibarsign" -// desc = "Syndicate or die." - -// /datum/barsign/hiddensigns/signoff -// name = null -// icon = "empty" -// desc = "This sign doesn't seem to be on." -// rename_area = FALSE diff --git a/yogstation.dme b/yogstation.dme index 4d43645ddaf0..fdc92c96e4ba 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -1418,7 +1418,6 @@ #include "code\game\objects\items\two_handed\spears.dm" #include "code\game\objects\structures\aliens.dm" #include "code\game\objects\structures\artstuff.dm" -#include "code\game\objects\structures\barsigns.dm" #include "code\game\objects\structures\bedsheet_bin.dm" #include "code\game\objects\structures\catwalk.dm" #include "code\game\objects\structures\crateshelf.dm" From 37f2c3dc804edc9eeec1e3526ce7dc29ea3ee6df Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Tue, 5 Dec 2023 18:18:05 -0500 Subject: [PATCH 116/281] not sure who changed that oh well --- code/__DEFINES/directional.dm | 12 ------------ code/datums/chatmessage.dm | 5 ----- code/game/machinery/computer/_computer.dm | 2 +- 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/code/__DEFINES/directional.dm b/code/__DEFINES/directional.dm index 83d8ce01d0a8..bfde544b4471 100644 --- a/code/__DEFINES/directional.dm +++ b/code/__DEFINES/directional.dm @@ -13,18 +13,6 @@ /// West direction as a string "[8]" #define TEXT_WEST "[WEST]" -//dir macros -///Returns true if the dir is diagonal, false otherwise -#define ISDIAGONALDIR(d) (d&(d-1)) -///True if the dir is north or south, false therwise -#define NSCOMPONENT(d) (d&(NORTH|SOUTH)) -///True if the dir is east/west, false otherwise -#define EWCOMPONENT(d) (d&(EAST|WEST)) -///Flips the dir for north/south directions -#define NSDIRFLIP(d) (d^(NORTH|SOUTH)) -///Flips the dir for east/west directions -#define EWDIRFLIP(d) (d^(EAST|WEST)) - /// Inverse direction, taking into account UP|DOWN if necessary. #define REVERSE_DIR(dir) ( ((dir & 85) << 1) | ((dir & 170) >> 1) ) diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index dc30f4bfb7f4..e985de6c63dc 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -26,11 +26,6 @@ /// The number of z-layer 'slices' usable by the chat message layering #define CHAT_LAYER_MAX_Z (CHAT_LAYER_MAX - CHAT_LAYER) / CHAT_LAYER_Z_STEP -///Base layer of chat elements -#define CHAT_LAYER 1 -///Highest possible layer of chat elements -#define CHAT_LAYER_MAX 2 - /** * # Chat Message Overlay * diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index 74ef4595c574..a52037615b75 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -96,7 +96,7 @@ if(stat & BROKEN) overlay_state = "[icon_state]_broken" . += mutable_appearance(icon, overlay_state) - . += mutable_appearance(icon, overlay_state, layer, EMISSIVE_PLANE) + . += emissive_appearance(icon, icon_screen, src) /obj/machinery/computer/power_change() . = ..() From 2347a80b64ee510a9e4ab989fe4a186cb894209a Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Tue, 5 Dec 2023 18:21:54 -0500 Subject: [PATCH 117/281] yeah this got moved --- code/__HELPERS/unsorted.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 6dee2a345fba..93e35e863139 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -41,9 +41,6 @@ else if(x<0) .+=360 -//Better performant than an artisanal proc and more reliable than Turn(). From TGMC. -#define REVERSE_DIR(dir) ( ((dir & 85) << 1) | ((dir & 170) >> 1) ) - //Returns location. Returns null if no location was found. /proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = FALSE, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) /* From 5e9ed26c8250c1e6fa50e633d2e691ec2a11af16 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Tue, 5 Dec 2023 18:45:50 -0500 Subject: [PATCH 118/281] this needs updating yeah --- code/game/machinery/mindmachine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/mindmachine.dm b/code/game/machinery/mindmachine.dm index 80ccfd1f7ba6..b1b578674af1 100644 --- a/code/game/machinery/mindmachine.dm +++ b/code/game/machinery/mindmachine.dm @@ -105,7 +105,7 @@ if(stat & BROKEN) overlay_state = "[icon_state]_broken" . += mutable_appearance(icon, overlay_state) - . += mutable_appearance(icon, overlay_state, layer, EMISSIVE_PLANE) + . += emissive_appearance(icon, icon_screen, src) /obj/machinery/mindmachine_hub/RefreshParts() // 2 matter bins. Reduce failure chance by 5 per tier. Results in 30 (tier 1) to 0 (tier 4). From e7a726b27aa6bdf8472a780d323dea5b3806df62 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Tue, 5 Dec 2023 23:56:46 -0500 Subject: [PATCH 119/281] turns off the carbon monoxide alarm duh --- code/datums/mutable_appearance.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index c066b96cea41..aa69c510d8d0 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -40,9 +40,9 @@ else if(!isnull(offset_const)) SET_PLANE_W_SCALAR(appearance, plane, offset_const) // otherwise if you're setting plane you better have the guts to back it up - else - stack_trace("No plane offset passed in as context for a non floating mutable appearance, things are gonna go to hell on multiz maps") - else if(!isnull(offset_spokesman) && !isatom(offset_spokesman)) - stack_trace("Why did you pass in offset_spokesman as [offset_spokesman]? We need an atom to properly offset planes") + // else + // stack_trace("No plane offset passed in as context for a non floating mutable appearance, things are gonna go to hell on multiz maps") + // else if(!isnull(offset_spokesman) && !isatom(offset_spokesman)) + // stack_trace("Why did you pass in offset_spokesman as [offset_spokesman]? We need an atom to properly offset planes") return appearance From ca752c2a8cbaa7733d9bf93b95a06f83c2c0a1bb Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 6 Dec 2023 00:26:02 -0500 Subject: [PATCH 120/281] FIXES IT YES thank you biome --- code/modules/lighting/lighting_object.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index 49b3ec20e454..b51ec1c2a299 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -15,7 +15,7 @@ return . = ..() - current_underlay = mutable_appearance(LIGHTING_ICON, "atransparent", source.z, LIGHTING_PLANE, 255, RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM) + current_underlay = mutable_appearance(LIGHTING_ICON, "atransparent", source.z, source, LIGHTING_PLANE, 255, RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM) affected_turf = source if (affected_turf.lighting_object) From 0f556560e0251d3630aaa1ec21baba8503ae02ba Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 6 Dec 2023 00:36:07 -0500 Subject: [PATCH 121/281] turns this off too yeah --- code/__HELPERS/lighting.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/__HELPERS/lighting.dm b/code/__HELPERS/lighting.dm index 5e5924abc8d2..206d0b7058f0 100644 --- a/code/__HELPERS/lighting.dm +++ b/code/__HELPERS/lighting.dm @@ -7,8 +7,8 @@ var/alpha_ratio = alpha/255 appearance.color = _EMISSIVE_COLOR(alpha_ratio) - if(icon_state && !icon_exists(icon, icon_state, scream = FALSE)) //Scream set to False so we can have a custom stack_trace - stack_trace("An emissive appearance was added with non-existant icon_state \"[icon_state]\" in [icon]!") + // if(icon_state && !icon_exists(icon, icon_state, scream = FALSE)) //Scream set to False so we can have a custom stack_trace + // stack_trace("An emissive appearance was added with non-existant icon_state \"[icon_state]\" in [icon]!") return appearance From b395c253d105b032a99c01c220c2711dd7beec63 Mon Sep 17 00:00:00 2001 From: JohnFulpWillard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 6 Dec 2023 00:43:08 -0500 Subject: [PATCH 122/281] Can't compile yet but ports a ton of shit --- code/__DEFINES/directional.dm | 3 + code/__DEFINES/flags.dm | 2 + code/__DEFINES/icon_smoothing.dm | 235 ++++++ code/__DEFINES/logging.dm | 17 + code/__DEFINES/map_switch.dm | 8 + code/__DEFINES/matrices.dm | 3 + code/__DEFINES/traits.dm | 5 +- code/__DEFINES/turfs.dm | 9 +- code/__HELPERS/icon_smoothing.dm | 795 ++++++++++++------ code/__HELPERS/icons.dm | 3 +- code/__HELPERS/{ => logging}/_logging.dm | 66 +- code/__HELPERS/logging/attack.dm | 64 ++ code/__HELPERS/logging/talk.dm | 15 + code/__HELPERS/unsorted.dm | 15 +- code/_globalvars/bitfields.dm | 8 - code/controllers/subsystem/icon_smooth.dm | 4 +- code/datums/elements/undertile.dm | 84 ++ code/game/{atoms.dm => atom/_atom.dm} | 286 +------ code/game/atom/atom_invisibility.dm | 72 ++ code/game/atom/atom_materials.dm | 34 + code/game/atom/atom_orbit.dm | 18 + code/game/atom/atom_tool_acts.dm | 82 ++ code/game/atoms_movable.dm | 3 + code/game/machinery/Beacon.dm | 13 +- code/game/machinery/deployable.dm | 8 +- code/game/machinery/doors/airlock.dm | 2 +- code/game/machinery/navbeacon.dm | 3 +- .../machinery/telecomms/telecomunications.dm | 3 +- code/game/objects/effects/contraband.dm | 4 +- .../objects/effects/decals/cleanable/misc.dm | 22 +- .../fluid_spread/effects_foam.dm | 3 +- .../fluid_spread/effects_smoke.dm | 2 +- .../objects/items/devices/pressureplates.dm | 2 +- code/game/objects/items/storage/backpack.dm | 1 + code/game/objects/structures.dm | 13 +- code/game/objects/structures/aliens.dm | 27 +- .../structures/beds_chairs/alien_nest.dm | 4 +- code/game/objects/structures/catwalk.dm | 14 +- code/game/objects/structures/false_walls.dm | 135 +-- code/game/objects/structures/grille.dm | 17 +- code/game/objects/structures/lattice.dm | 8 +- code/game/objects/structures/mineral_doors.dm | 12 +- code/game/objects/structures/safe.dm | 4 + code/game/objects/structures/tables_racks.dm | 56 +- code/game/objects/structures/window.dm | 96 +-- code/game/turfs/change_turf.dm | 8 +- code/game/turfs/closed.dm | 30 +- code/game/turfs/open.dm | 28 +- code/game/turfs/openspace/openspace.dm | 2 + code/game/turfs/simulated/chasm.dm | 10 +- code/game/turfs/simulated/floor.dm | 39 +- .../game/turfs/simulated/floor/fancy_floor.dm | 75 +- .../turfs/simulated/floor/mineral_floor.dm | 8 +- code/game/turfs/simulated/floor/plating.dm | 10 +- .../simulated/floor/plating/misc_plating.dm | 39 +- code/game/turfs/simulated/lava.dm | 31 +- code/game/turfs/simulated/minerals.dm | 139 +-- .../turfs/simulated/wall/mineral_walls.dm | 123 ++- code/game/turfs/simulated/wall/misc_walls.dm | 11 +- code/game/turfs/simulated/wall/reinf_walls.dm | 32 +- code/game/turfs/simulated/walls.dm | 16 +- code/game/turfs/space/space.dm | 3 +- code/game/turfs/turf.dm | 40 +- .../clockcult/clock_effects/clock_overlay.dm | 9 +- .../revenant/revenant_abilities.dm | 2 +- .../atmospherics/machinery/other/meter.dm | 2 - .../atmospherics/machinery/pipes/pipes.dm | 4 + .../awaymissions/mission_code/vrhub.dm | 7 +- code/modules/holodeck/turfs.dm | 9 +- code/modules/mining/equipment/survival_pod.dm | 12 +- .../hostile/megafauna/hierophant.dm | 12 +- .../hostile/mining_mobs/elites/elite.dm | 17 +- .../simple_animal/hostile/venus_human_trap.dm | 4 +- code/modules/plumbing/ducts.dm | 1 + code/modules/power/apc.dm | 2 +- code/modules/power/cable.dm | 9 +- code/modules/power/power.dm | 2 +- code/modules/power/smes.dm | 2 +- code/modules/power/terminal.dm | 6 +- .../projectiles/guns/misc/beam_rifle.dm | 2 - .../recycling/disposal/construction.dm | 3 +- code/modules/recycling/disposal/pipe.dm | 5 +- .../ruins/spaceruin_code/hilbertshotel.dm | 3 +- code/modules/shuttle/shuttle_rotate.dm | 4 +- .../spells/spell_types/conjure/_conjure.dm | 8 +- code/modules/unit_tests/focus_only_tests.dm | 3 + yogstation.dme | 14 +- .../objects/structures/bar_stuff/bar_stuff.dm | 3 +- .../game/objects/structures/tables_racks.dm | 5 +- .../code/game/objects/structures/window.dm | 7 +- .../game/turfs/simulated/floor/fancy_floor.dm | 14 +- .../code/game/turfs/simulated/minerals.dm | 6 +- 92 files changed, 2018 insertions(+), 1083 deletions(-) create mode 100644 code/__DEFINES/icon_smoothing.dm create mode 100644 code/__DEFINES/map_switch.dm create mode 100644 code/__DEFINES/matrices.dm rename code/__HELPERS/{ => logging}/_logging.dm (88%) create mode 100644 code/__HELPERS/logging/attack.dm create mode 100644 code/__HELPERS/logging/talk.dm create mode 100644 code/datums/elements/undertile.dm rename code/game/{atoms.dm => atom/_atom.dm} (82%) create mode 100644 code/game/atom/atom_invisibility.dm create mode 100644 code/game/atom/atom_materials.dm create mode 100644 code/game/atom/atom_orbit.dm create mode 100644 code/game/atom/atom_tool_acts.dm diff --git a/code/__DEFINES/directional.dm b/code/__DEFINES/directional.dm index 85d746a43882..1b40d6094633 100644 --- a/code/__DEFINES/directional.dm +++ b/code/__DEFINES/directional.dm @@ -8,3 +8,6 @@ #define TEXT_SOUTH "[SOUTH]" #define TEXT_EAST "[EAST]" #define TEXT_WEST "[WEST]" + +//Better performant than an artisanal proc and more reliable than Turn(). From TGMC. +#define REVERSE_DIR(dir) ( ((dir & 85) << 1) | ((dir & 170) >> 1) ) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 92c389063f8a..3820e833457b 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -55,6 +55,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define RAD_CONTAIN_CONTENTS (1<<17) /// Is the thing currently spinning? #define IS_SPINNING_1 (1<<18) +/// Should we use the initial icon for display? Mostly used by overlay only objects +#define HTML_USE_INITAL_ICON_1 (1<<19) //turf-only flags #define NOJAUNT_1 (1<<0) diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm new file mode 100644 index 000000000000..d4503b4e1efc --- /dev/null +++ b/code/__DEFINES/icon_smoothing.dm @@ -0,0 +1,235 @@ +/* smoothing_flags */ +/// Smoothing system in where adjacencies are calculated and used to build an image by mounting each corner at runtime. +#define SMOOTH_CORNERS (1<<0) +/// Smoothing system in where adjacencies are calculated and used to select a pre-baked icon_state, encoded by bitmasking. +#define SMOOTH_BITMASK (1<<1) +/// Atom has diagonal corners, with underlays under them. +#define SMOOTH_DIAGONAL_CORNERS (1<<2) +/// Atom will smooth with the borders of the map. +#define SMOOTH_BORDER (1<<3) +/// Atom is currently queued to smooth. +#define SMOOTH_QUEUED (1<<4) +/// Smooths with objects, and will thus need to scan turfs for contents. +#define SMOOTH_OBJ (1<<5) +/// Uses directional object smoothing, so we care not only about something being on the right turf, but also its direction +/// Changes the meaning of smoothing_junction, instead of representing the directions we are smoothing in +/// it represents the sides of our directional border object that have a neighbor +/// Is incompatible with SMOOTH_CORNERS because border objects don't have corners +#define SMOOTH_BORDER_OBJECT (1<<6) + +DEFINE_BITFIELD(smoothing_flags, list( + "SMOOTH_CORNERS" = SMOOTH_CORNERS, + "SMOOTH_BITMASK" = SMOOTH_BITMASK, + "SMOOTH_DIAGONAL_CORNERS" = SMOOTH_DIAGONAL_CORNERS, + "SMOOTH_BORDER" = SMOOTH_BORDER, + "SMOOTH_QUEUED" = SMOOTH_QUEUED, + "SMOOTH_OBJ" = SMOOTH_OBJ, + "SMOOTH_BORDER_OBJECT" = SMOOTH_BORDER_OBJECT, +)) + +/// Components of a smoothing junction +/// Redefinitions of the diagonal directions so they can be stored in one var without conflicts +#define NORTH_JUNCTION NORTH //(1<<0) +#define SOUTH_JUNCTION SOUTH //(1<<1) +#define EAST_JUNCTION EAST //(1<<2) +#define WEST_JUNCTION WEST //(1<<3) +#define NORTHEAST_JUNCTION (1<<4) +#define SOUTHEAST_JUNCTION (1<<5) +#define SOUTHWEST_JUNCTION (1<<6) +#define NORTHWEST_JUNCTION (1<<7) + +DEFINE_BITFIELD(smoothing_junction, list( + "NORTH_JUNCTION" = NORTH_JUNCTION, + "SOUTH_JUNCTION" = SOUTH_JUNCTION, + "EAST_JUNCTION" = EAST_JUNCTION, + "WEST_JUNCTION" = WEST_JUNCTION, + "NORTHEAST_JUNCTION" = NORTHEAST_JUNCTION, + "SOUTHEAST_JUNCTION" = SOUTHEAST_JUNCTION, + "SOUTHWEST_JUNCTION" = SOUTHWEST_JUNCTION, + "NORTHWEST_JUNCTION" = NORTHWEST_JUNCTION, +)) + +/*smoothing macros*/ + +#define QUEUE_SMOOTH(thing_to_queue) if(thing_to_queue.smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) {SSicon_smooth.add_to_queue(thing_to_queue)} + +#define QUEUE_SMOOTH_NEIGHBORS(thing_to_queue) for(var/atom/atom_neighbor as anything in orange(1, thing_to_queue)) {QUEUE_SMOOTH(atom_neighbor)} + +/**SMOOTHING GROUPS + * Groups of things to smooth with. + * * Contained in the `list/smoothing_groups` variable. + * * Matched with the `list/canSmoothWith` variable to check whether smoothing is possible or not. + */ + +#define S_TURF(num) (#num + ",") + +/* /turf only */ + +#define SMOOTH_GROUP_TURF_OPEN S_TURF(0) ///turf/open +#define SMOOTH_GROUP_TURF_CHASM S_TURF(1) ///turf/open/chasm, /turf/open/floor/fakepit +#define SMOOTH_GROUP_FLOOR_LAVA S_TURF(2) ///turf/open/lava/smooth +#define SMOOTH_GROUP_FLOOR_TRANSPARENT_GLASS S_TURF(3) ///turf/open/floor/glass + +#define SMOOTH_GROUP_OPEN_FLOOR S_TURF(4) ///turf/open/floor + +#define SMOOTH_GROUP_FLOOR_GRASS S_TURF(5) ///turf/open/misc/grass +#define SMOOTH_GROUP_FLOOR_ASH S_TURF(6) ///turf/open/misc/ashplanet/ash +#define SMOOTH_GROUP_FLOOR_ASH_ROCKY S_TURF(7) ///turf/open/misc/ashplanet/rocky +#define SMOOTH_GROUP_FLOOR_ICE S_TURF(8) ///turf/open/misc/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/indestructible/carpet/royal/black +#define SMOOTH_GROUP_CARPET_ROYAL_GREEN S_TURF(19) ///turf/open/indestructible/carpet/royal/black +#define SMOOTH_GROUP_CARPET_ROYAL_BLUE S_TURF(20) ///turf/open/indestructible/carpet/royal/blue + +//TODO INCREASE IT ALL BY ONE + +#define SMOOTH_GROUP_CARPET_ROYAL_PURPLE S_TURF(20) ///turf/open/indestructible/carpet/royal/purple +#define SMOOTH_GROUP_CARPET_EXECUTIVE S_TURF(21) ///turf/open/floor/carpet/executive +#define SMOOTH_GROUP_CARPET_STELLAR S_TURF(22) ///turf/open/floor/carpet/stellar +#define SMOOTH_GROUP_CARPET_DONK S_TURF(23) ///turf/open/floor/carpet/donk +#define SMOOTH_GROUP_CARPET_NEON S_TURF(24) //![turf/open/floor/carpet/neon] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON S_TURF(25) //![turf/open/floor/carpet/neon/simple] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE S_TURF(26) //![turf/open/floor/carpet/neon/simple/white] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK S_TURF(27) //![turf/open/floor/carpet/neon/simple/black] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED S_TURF(28) //![turf/open/floor/carpet/neon/simple/red] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE S_TURF(29) //![turf/open/floor/carpet/neon/simple/orange] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW S_TURF(30) //![turf/open/floor/carpet/neon/simple/yellow] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME S_TURF(31) //![turf/open/floor/carpet/neon/simple/lime] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN S_TURF(32) //![turf/open/floor/carpet/neon/simple/green] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL S_TURF(33) //![turf/open/floor/carpet/neon/simple/teal] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN S_TURF(34) //![turf/open/floor/carpet/neon/simple/cyan] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE S_TURF(35) //![turf/open/floor/carpet/neon/simple/blue] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE S_TURF(36) //![turf/open/floor/carpet/neon/simple/purple] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET S_TURF(37) //![turf/open/floor/carpet/neon/simple/violet] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK S_TURF(38) //![turf/open/floor/carpet/neon/simple/pink] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_NODOTS S_TURF(39) //![turf/open/floor/carpet/neon/simple/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE_NODOTS S_TURF(40) //![turf/open/floor/carpet/neon/simple/white/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK_NODOTS S_TURF(41) //![turf/open/floor/carpet/neon/simple/black/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED_NODOTS S_TURF(42) //![turf/open/floor/carpet/neon/simple/red/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE_NODOTS S_TURF(43) //![turf/open/floor/carpet/neon/simple/orange/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW_NODOTS S_TURF(44) //![turf/open/floor/carpet/neon/simple/yellow/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME_NODOTS S_TURF(45) //![turf/open/floor/carpet/neon/simple/lime/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN_NODOTS S_TURF(46) //![turf/open/floor/carpet/neon/simple/green/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL_NODOTS S_TURF(47) //![turf/open/floor/carpet/neon/simple/teal/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN_NODOTS S_TURF(48) //![turf/open/floor/carpet/neon/simple/cyan/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE_NODOTS S_TURF(49) //![turf/open/floor/carpet/neon/simple/blue/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE_NODOTS S_TURF(50) //![turf/open/floor/carpet/neon/simple/purple/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET_NODOTS S_TURF(51) //![turf/open/floor/carpet/neon/simple/violet/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK_NODOTS S_TURF(52) //![turf/open/floor/carpet/neon/simple/pink/nodots] +#define SMOOTH_GROUP_BAMBOO_FLOOR S_TURF(53) //![/turf/open/floor/bamboo] +#define SMOOTH_GROUP_BRAZIL S_TURF(54) ///turf/open/indestructible/brazil/lostit + +#define SMOOTH_GROUP_CLOSED_TURFS S_TURF(54) ///turf/closed +#define SMOOTH_GROUP_MATERIAL_WALLS S_TURF(55) ///turf/closed/wall/material +#define SMOOTH_GROUP_SYNDICATE_WALLS S_TURF(56) ///turf/closed/wall/r_wall/syndicate, /turf/closed/indestructible/syndicate +#define SMOOTH_GROUP_HOTEL_WALLS S_TURF(57) ///turf/closed/indestructible/hotelwall +#define SMOOTH_GROUP_MINERAL_WALLS S_TURF(58) ///turf/closed/mineral, /turf/closed/indestructible +#define SMOOTH_GROUP_BOSS_WALLS S_TURF(59) ///turf/closed/indestructible/riveted/boss +#define SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS S_TURF(60) ///turf/closed/wall/mineral/titanium/survival +#define SMOOTH_GROUP_TURF_OPEN_CLIFF S_TURF(61) ///turf/open/cliff +#define SMOOTH_GROUP_TURF_BALLPIT S_TURF(62) ///turf/open/floor/ballpit + +#define MAX_S_TURF 62 //Always match this value with the one above it. + +#define S_OBJ(num) ("-" + #num + ",") +/* /obj included */ + +#define SMOOTH_GROUP_WALLS S_OBJ(1) ///turf/closed/wall, /obj/structure/falsewall +#define SMOOTH_GROUP_URANIUM_WALLS S_OBJ(2) ///turf/closed/wall/mineral/uranium, /obj/structure/falsewall/uranium +#define SMOOTH_GROUP_GOLD_WALLS S_OBJ(3) ///turf/closed/wall/mineral/gold, /obj/structure/falsewall/gold +#define SMOOTH_GROUP_SILVER_WALLS S_OBJ(4) ///turf/closed/wall/mineral/silver, /obj/structure/falsewall/silver +#define SMOOTH_GROUP_DIAMOND_WALLS S_OBJ(5) ///turf/closed/wall/mineral/diamond, /obj/structure/falsewall/diamond +#define SMOOTH_GROUP_PLASMA_WALLS S_OBJ(6) ///turf/closed/wall/mineral/plasma, /obj/structure/falsewall/plasma +#define SMOOTH_GROUP_BANANIUM_WALLS S_OBJ(7) ///turf/closed/wall/mineral/bananium, /obj/structure/falsewall/bananium +#define SMOOTH_GROUP_SANDSTONE_WALLS S_OBJ(8) ///turf/closed/wall/mineral/sandstone, /obj/structure/falsewall/sandstone +#define SMOOTH_GROUP_WOOD_WALLS S_OBJ(9) ///turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood +#define SMOOTH_GROUP_IRON_WALLS S_OBJ(10) ///turf/closed/wall/mineral/iron, /obj/structure/falsewall/iron +#define SMOOTH_GROUP_ABDUCTOR_WALLS S_OBJ(11) ///turf/closed/wall/mineral/abductor, /obj/structure/falsewall/abductor +#define SMOOTH_GROUP_TITANIUM_WALLS S_OBJ(12) ///turf/closed/wall/mineral/titanium, /obj/structure/falsewall/titanium +#define SMOOTH_GROUP_PLASTITANIUM_WALLS S_OBJ(14) ///turf/closed/wall/mineral/plastitanium, /obj/structure/falsewall/plastitanium +#define SMOOTH_GROUP_SURVIVAL_TITANIUM_POD S_OBJ(15) ///turf/closed/wall/mineral/titanium/survival/pod, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/reinforced/shuttle/survival_pod +#define SMOOTH_GROUP_HIERO_WALL S_OBJ(16) ///obj/effect/temp_visual/elite_tumor_wall, /obj/effect/temp_visual/hierophant/wall +#define SMOOTH_GROUP_BAMBOO_WALLS S_TURF(17) //![/turf/closed/wall/mineral/bamboo, /obj/structure/falsewall/bamboo] +#define SMOOTH_GROUP_PLASTINUM_WALLS S_TURF(18) //![turf/closed/indestructible/riveted/plastinum] +#define SMOOTH_GROUP_CLOCKWORK_WALLS S_TURF(19) //![/turf/closed/wall/clockwork, /obj/structure/falsewall/brass] + +#define SMOOTH_GROUP_PAPERFRAME S_OBJ(21) ///obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe + +#define SMOOTH_GROUP_WINDOW_FULLTILE S_OBJ(22) ///turf/closed/indestructible/fakeglass, /obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/reinforced/plasma/fulltile +#define SMOOTH_GROUP_WINDOW_FULLTILE_BRONZE S_OBJ(23) ///obj/structure/window/bronze/fulltile +#define SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM S_OBJ(24) ///turf/closed/indestructible/opsglass, /obj/structure/window/reinforced/plasma/plastitanium +#define SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE S_OBJ(25) ///obj/structure/window/reinforced/shuttle + +#define SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM S_OBJ(26) ///obj/structure/tram + +#define SMOOTH_GROUP_LATTICE S_OBJ(31) ///obj/structure/lattice +#define SMOOTH_GROUP_CATWALK S_OBJ(32) ///obj/structure/lattice/catwalk + +#define SMOOTH_GROUP_AIRLOCK S_OBJ(41) ///obj/machinery/door/airlock + +#define SMOOTH_GROUP_INDUSTRIAL_LIFT S_OBJ(46) ///obj/structure/transport/linear +#define SMOOTH_GROUP_TRAM_STRUCTURE S_OBJ(47) //obj/structure/tram + +#define SMOOTH_GROUP_TABLES S_OBJ(51) ///obj/structure/table +#define SMOOTH_GROUP_WOOD_TABLES S_OBJ(52) ///obj/structure/table/wood +#define SMOOTH_GROUP_FANCY_WOOD_TABLES S_OBJ(53) ///obj/structure/table/wood/fancy +#define SMOOTH_GROUP_BRONZE_TABLES S_OBJ(54) ///obj/structure/table/bronze +#define SMOOTH_GROUP_ABDUCTOR_TABLES S_OBJ(55) ///obj/structure/table/abductor +#define SMOOTH_GROUP_GLASS_TABLES S_OBJ(56) ///obj/structure/table/glass +#define SMOOTH_GROUP_BANANIUM_TABLES S_OBJ(57) ///obj/structure/table/glass + +#define SMOOTH_GROUP_ALIEN_NEST S_OBJ(60) ///obj/structure/bed/nest +#define SMOOTH_GROUP_ALIEN_RESIN S_OBJ(61) ///obj/structure/alien/resin +#define SMOOTH_GROUP_ALIEN_WALLS S_OBJ(62) ///obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane +#define SMOOTH_GROUP_ALIEN_WEEDS S_OBJ(63) ///obj/structure/alien/weeds + +#define SMOOTH_GROUP_SECURITY_BARRICADE S_OBJ(64) ///obj/structure/barricade/security +#define SMOOTH_GROUP_SANDBAGS S_OBJ(65) ///obj/structure/barricade/sandbags + +#define SMOOTH_GROUP_HEDGE_FLUFF S_OBJ(66) ///obj/structure/hedge + +#define SMOOTH_GROUP_SHUTTLE_PARTS S_OBJ(67) ///obj/structure/window/reinforced/shuttle, /obj/structure/window/reinforced/plasma/plastitanium, /turf/closed/indestructible/opsglass, /obj/machinery/power/shuttle_engine + +#define SMOOTH_GROUP_CLEANABLE_DIRT S_OBJ(68) ///obj/effect/decal/cleanable/dirt + +#define SMOOTH_GROUP_GAS_TANK S_OBJ(72) + + +/// Performs the work to set smoothing_groups and canSmoothWith. +/// An inlined function used in both turf/Initialize and atom/Initialize. +#define SETUP_SMOOTHING(...) \ + if (smoothing_groups) { \ + if (PERFORM_ALL_TESTS(focus_only/sorted_smoothing_groups)) { \ + ASSERT_SORTED_SMOOTHING_GROUPS(smoothing_groups); \ + } \ + SET_SMOOTHING_GROUPS(smoothing_groups); \ + } \ +\ + if (canSmoothWith) { \ + if (PERFORM_ALL_TESTS(focus_only/sorted_smoothing_groups)) { \ + ASSERT_SORTED_SMOOTHING_GROUPS(canSmoothWith); \ + } \ + /* S_OBJ is always negative, and we are guaranteed to be sorted. */ \ + if (canSmoothWith[1] == "-") { \ + smoothing_flags |= SMOOTH_OBJ; \ + } \ + SET_SMOOTHING_GROUPS(canSmoothWith); \ + } + +/// Given a smoothing groups variable, will set out to the actual numbers inside it +#define UNWRAP_SMOOTHING_GROUPS(smoothing_groups, out) \ + json_decode("\[[##smoothing_groups]0\]"); \ + ##out.len--; + +#define ASSERT_SORTED_SMOOTHING_GROUPS(smoothing_group_variable) \ + var/list/unwrapped = UNWRAP_SMOOTHING_GROUPS(smoothing_group_variable, unwrapped); \ + assert_sorted(unwrapped, "[#smoothing_group_variable] ([type])"); \ diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 408db118901a..9456a9000ea2 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -55,3 +55,20 @@ #define LOGSRC_CLIENT "Client" #define LOGSRC_MOB "Mob" + +//wrapper macros for easier grepping +#define DIRECT_OUTPUT(A, B) A << B +#define DIRECT_INPUT(A, B) A >> B +#define SEND_IMAGE(target, image) DIRECT_OUTPUT(target, image) +#define SEND_SOUND(target, sound) DIRECT_OUTPUT(target, sound) +#define SEND_TEXT(target, text) DIRECT_OUTPUT(target, text) +#define WRITE_FILE(file, text) DIRECT_OUTPUT(file, text) +#define READ_FILE(file, text) DIRECT_INPUT(file, text) +//This is an external call, "true" and "false" are how rust parses out booleans +#ifdef EXTOOLS_LOGGING +#define WRITE_LOG(log, text) extools_log_write(log, text, TRUE) +#define WRITE_LOG_NO_FORMAT(log, text) extools_log_write(log, text, FALSE) +#else +#define WRITE_LOG(log, text) rustg_log_write(log, "\[[worldtime2text()]\] [text]", "true") +#define WRITE_LOG_NO_FORMAT(log, text) rustg_log_write(log, text, "false") +#endif diff --git a/code/__DEFINES/map_switch.dm b/code/__DEFINES/map_switch.dm new file mode 100644 index 000000000000..dbb0059786ee --- /dev/null +++ b/code/__DEFINES/map_switch.dm @@ -0,0 +1,8 @@ +/// Uses the left operator when compiling, uses the right operator when not compiling. +// Currently uses the CBT macro, but if http://www.byond.com/forum/post/2831057 is ever added, +// or if map tools ever agree on a standard, this should switch to use that. +#ifdef CBT +#define MAP_SWITCH(compile_time, map_time) ##compile_time +#else +#define MAP_SWITCH(compile_time, map_time) ##map_time +#endif diff --git a/code/__DEFINES/matrices.dm b/code/__DEFINES/matrices.dm new file mode 100644 index 000000000000..1bb86f9ff478 --- /dev/null +++ b/code/__DEFINES/matrices.dm @@ -0,0 +1,3 @@ +/// Helper macro for creating a matrix at the given offsets. +/// Works at compile time. +#define TRANSLATE_MATRIX(offset_x, offset_y) matrix(1, 0, (offset_x), 0, 1, (offset_y)) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 31bb25afe2e8..35baf4056ada 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -309,7 +309,8 @@ // item traits #define TRAIT_NODROP "nodrop" -#define TRAIT_T_RAY_VISIBLE "t-ray-visible" // Visible on t-ray scanners if the atom/var/level == 1 +/// Visible on t-ray scanners if the atom/var/level == 1 +#define TRAIT_T_RAY_VISIBLE "t-ray-visible" /// Properly wielded two handed item #define TRAIT_WIELDED "wielded" /// The items needs two hands to be carried @@ -384,6 +385,8 @@ #define ELEMENT_TRAIT(source) "element_trait_[source]" /// Trait from [/datum/element/rust]. Its rusty and should be applying a special overlay to denote this. #define TRAIT_RUSTY "rust_trait" +/// Trait from being under the floor in some manner +#define TRAIT_UNDERFLOOR "underfloor" // unique trait sources, still defines #define CLONING_POD_TRAIT "cloning-pod" diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 549af806ee03..688d80cc9e28 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -3,10 +3,17 @@ #define CHANGETURF_FORCEOP (1<<2) #define CHANGETURF_SKIP (1<<3) // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE #define CHANGETURF_INHERIT_AIR (1<<4) // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR -#define CHANGETURF_RECALC_ADJACENT (1<<5) //Immediately recalc adjacent atmos turfs instead of queuing. +#define CHANGETURF_RECALC_ADJACENT (1<<5) //Immediately recalc adjacent atmos turfs instead of queuing.TRAIT_UNDERFLOOR #define CHANGETURF_TRAPDOOR_INDUCED (1<<6) // Caused by a trapdoor, for trapdoor to know that this changeturf was caused by itself ///Returns all currently loaded turfs #define ALL_TURFS(...) block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz)) #define IS_OPAQUE_TURF(turf) (turf.directional_opacity == ALL_CARDINALS) + +/// The pipes, disposals, and wires are hidden +#define UNDERFLOOR_HIDDEN 0 +/// The pipes, disposals, and wires are visible but cannot be interacted with +#define UNDERFLOOR_VISIBLE 1 +/// The pipes, disposals, and wires are visible and can be interacted with +#define UNDERFLOOR_INTERACTABLE 2 diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 41b9d266c59e..6a1cfd6191a3 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -2,15 +2,16 @@ //generic (by snowflake) tile smoothing code; smooth your icons with this! /* Each tile is divided in 4 corners, each corner has an appearance associated to it; the tile is then overlayed by these 4 appearances - To use this, just set your atom's 'smooth' var to 1. If your atom can be moved/unanchored, set its 'can_be_unanchored' var to 1. + To use this, just set your atom's 'smoothing_flags' var to 1. If your atom can be moved/unanchored, set its 'can_be_unanchored' var to 1. If you don't want your atom's icon to smooth with anything but atoms of the same type, set the list 'canSmoothWith' to null; - Otherwise, put all types you want the atom icon to smooth with in 'canSmoothWith' INCLUDING THE TYPE OF THE ATOM ITSELF. + Otherwise, put all the smoothing groups you want the atom icon to smooth with in 'canSmoothWith', including the group of the atom itself. + Smoothing groups are just shared flags between objects. If one of the 'canSmoothWith' of A matches one of the `smoothing_groups` of B, then A will smooth with B. Each atom has its own icon file with all the possible corner states. See 'smooth_wall.dmi' for a template. DIAGONAL SMOOTHING INSTRUCTIONS To make your atom smooth diagonally you need all the proper icon states (see 'smooth_wall.dmi' for a template) and - to add the 'SMOOTH_DIAGONAL' flag to the atom's smooth var (in addition to either SMOOTH_TRUE or SMOOTH_MORE). + to add the 'SMOOTH_DIAGONAL_CORNERS' flag to the atom's smoothing_flags var (in addition to either SMOOTH_TRUE or SMOOTH_MORE). For turfs, what appears under the diagonal corners depends on the turf that was in the same position previously: if you make a wall on a plating floor, you will see plating under the diagonal wall corner, if it was space, you will see space. @@ -23,298 +24,510 @@ To see an example of a diagonal wall, see '/turf/closed/wall/mineral/titanium' and its subtypes. */ -//Redefinitions of the diagonal directions so they can be stored in one var without conflicts -#define N_NORTH (1<<1) -#define N_SOUTH (1<<2) -#define N_EAST (1<<4) -#define N_WEST (1<<8) -#define N_NORTHEAST (1<<5) -#define N_NORTHWEST (1<<9) -#define N_SOUTHEAST (1<<6) -#define N_SOUTHWEST (1<<10) - -#define SMOOTH_FALSE 0 //not smooth -#define SMOOTH_TRUE (1<<0) //smooths with exact specified types or just itself -#define SMOOTH_MORE (1<<1) //smooths with all subtypes of specified types or just itself (this value can replace SMOOTH_TRUE) -#define SMOOTH_DIAGONAL (1<<2) //if atom should smooth diagonally, this should be present in 'smooth' var -#define SMOOTH_BORDER (1<<3) //atom will smooth with the borders of the map -#define SMOOTH_QUEUED (1<<4) //atom is currently queued to smooth. - -#define NULLTURF_BORDER 123456789 - -#define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi' -#define DEFAULT_UNDERLAY_ICON_STATE "plating" - -/atom/var/smooth = SMOOTH_FALSE -/atom/var/top_left_corner -/atom/var/top_right_corner -/atom/var/bottom_left_corner -/atom/var/bottom_right_corner -/atom/var/list/canSmoothWith = null // TYPE PATHS I CAN SMOOTH WITH~~~~~ If this is null and atom is smooth, it smooths only with itself -/atom/movable/var/can_be_unanchored = FALSE -/turf/var/list/fixed_underlay = null - -/proc/calculate_adjacencies(atom/A) - if(!A.loc) - return 0 - - var/adjacencies = 0 - - var/atom/movable/AM - if(ismovable(A)) - AM = A - if(AM.can_be_unanchored && !AM.anchored) - return 0 +#define NO_ADJ_FOUND 0 +#define ADJ_FOUND 1 +#define NULLTURF_BORDER 2 - for(var/direction in GLOB.cardinals) - AM = find_type_in_direction(A, direction) - if(AM == NULLTURF_BORDER) - if((A.smooth & SMOOTH_BORDER)) - adjacencies |= 1 << direction - else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) - adjacencies |= 1 << direction - - if(adjacencies & N_NORTH) - if(adjacencies & N_WEST) - AM = find_type_in_direction(A, NORTHWEST) - if(AM == NULLTURF_BORDER) - if((A.smooth & SMOOTH_BORDER)) - adjacencies |= N_NORTHWEST - else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) - adjacencies |= N_NORTHWEST - if(adjacencies & N_EAST) - AM = find_type_in_direction(A, NORTHEAST) - if(AM == NULLTURF_BORDER) - if((A.smooth & SMOOTH_BORDER)) - adjacencies |= N_NORTHEAST - else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) - adjacencies |= N_NORTHEAST - - if(adjacencies & N_SOUTH) - if(adjacencies & N_WEST) - AM = find_type_in_direction(A, SOUTHWEST) - if(AM == NULLTURF_BORDER) - if((A.smooth & SMOOTH_BORDER)) - adjacencies |= N_SOUTHWEST - else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) - adjacencies |= N_SOUTHWEST - if(adjacencies & N_EAST) - AM = find_type_in_direction(A, SOUTHEAST) - if(AM == NULLTURF_BORDER) - if((A.smooth & SMOOTH_BORDER)) - adjacencies |= N_SOUTHEAST - else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) - adjacencies |= N_SOUTHEAST - - return adjacencies - -//do not use, use queue_smooth(atom) -/proc/smooth_icon(atom/A) - if(!A || !A.smooth) - return - A.smooth &= ~SMOOTH_QUEUED - if (!A.z) - return - if(QDELETED(A)) +GLOBAL_LIST_INIT(adjacent_direction_lookup, generate_adjacent_directions()) + +/* Attempting to mirror the below + * Each 3x3 grid is a tile, with each X representing a direction a border object could be in IN said grid + * Directions marked with A are acceptable smoothing targets, M is the example direction + * The example given here is of a northfacing border object +xxx AxA xxx +xxx AxA xxx +xxx AxA xxx + +AAA MMM AAA +xxx AxA xxx +xxx AxA xxx + +xxx xxx xxx +xxx xxx xxx +xxx xxx xxx +*/ +/// Encodes connectivity between border objects +/// Returns a list accessable by a border object's dir, the direction between it and a target, and a target +/// Said list will return the direction the two objects connect, if any exists (if the target isn't a border object and the direction is fine, return the inverse of the direction in use) +/proc/generate_adjacent_directions() + // Have to hold all conventional dir pairs, so we size to the largest + // We don't HAVE diagonal border objects, so I'm gonna pretend they'll never exist + + // You might be like, lemon, can't we use GLOB.cardinals/GLOB.alldirs here + // No, they aren't loaded yet. life is pain + var/list/cardinals = list(NORTH, SOUTH, EAST, WEST) + var/list/alldirs = cardinals + list(NORTH|EAST, SOUTH|EAST, NORTH|WEST, SOUTH|WEST) + var/largest_cardinal = max(cardinals) + var/largest_dir = max(alldirs) + + var/list/direction_map = new /list(largest_cardinal) + for(var/dir in cardinals) + var/left = turn(dir, 90) + var/right = turn(dir, -90) + var/opposite = REVERSE_DIR(dir) + // Need to encode diagonals here because it's possible, even if it is always false + var/list/acceptable_adjacents = new /list(largest_dir) + // Alright, what directions are acceptable to us + for(var/connectable_dir in (cardinals + NONE)) + // And what border objects INSIDE those directions are alright + var/list/smoothable_dirs = new /list(largest_cardinal + 1) // + 1 because we need to provide space for NONE to be a valid index + // None is fine, we want to smooth with things on our own turf + // We'll do the two dirs to our left and right + // They connect.. "below" us and on their side + if(connectable_dir == NONE) + smoothable_dirs[left] = dir_to_junction(opposite | left) + smoothable_dirs[right] = dir_to_junction(opposite | right) + // If it's to our right or left we'll include just the dir matching ours + // Left edge touches only our left side, and so on + else if (connectable_dir == left) + smoothable_dirs[dir] = left + else if (connectable_dir == right) + smoothable_dirs[dir] = right + // If it's straight on we'll include our direction as a link + // Then include the two edges on the other side as diagonals + else if(connectable_dir == dir) + smoothable_dirs[opposite] = dir + smoothable_dirs[left] = dir_to_junction(dir | left) + smoothable_dirs[right] = dir_to_junction(dir | right) + // otherwise, go HOME, I don't want to encode anything for you + else + continue + acceptable_adjacents[connectable_dir + 1] = smoothable_dirs + direction_map[dir] = acceptable_adjacents + return direction_map + +/// Are two atoms border adjacent, takes a border object, something to compare against, and the direction between A and B +/// Returns the way in which the first thing is adjacent to the second +#define CAN_DIAGONAL_SMOOTH(border_obj, target, direction) (\ + (target.smoothing_flags & SMOOTH_BORDER_OBJECT) ? \ + GLOB.adjacent_direction_lookup[border_obj.dir][direction + 1]?[target.dir] : \ + (GLOB.adjacent_direction_lookup[border_obj.dir][direction + 1]) ? REVERSE_DIR(direction) : NONE \ + ) + +#define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi' +#define DEFAULT_UNDERLAY_ICON_STATE "plating" + + +///Scans all adjacent turfs to find targets to smooth with. +/atom/proc/calculate_adjacencies() + . = NONE + + if(!loc) return - if(A.smooth & (SMOOTH_TRUE | SMOOTH_MORE)) - var/adjacencies = calculate_adjacencies(A) - if(A.smooth & SMOOTH_DIAGONAL) - A.diagonal_smooth(adjacencies) + for(var/direction in GLOB.cardinals) + switch(find_type_in_direction(direction)) + if(NULLTURF_BORDER) + if((smoothing_flags & SMOOTH_BORDER)) + . |= direction //BYOND and smooth dirs are the same for cardinals + if(ADJ_FOUND) + . |= direction //BYOND and smooth dirs are the same for cardinals + + if(. & NORTH_JUNCTION) + if(. & WEST_JUNCTION) + switch(find_type_in_direction(NORTHWEST)) + if(NULLTURF_BORDER) + if((smoothing_flags & SMOOTH_BORDER)) + . |= NORTHWEST_JUNCTION + if(ADJ_FOUND) + . |= NORTHWEST_JUNCTION + + if(. & EAST_JUNCTION) + switch(find_type_in_direction(NORTHEAST)) + if(NULLTURF_BORDER) + if((smoothing_flags & SMOOTH_BORDER)) + . |= NORTHEAST_JUNCTION + if(ADJ_FOUND) + . |= NORTHEAST_JUNCTION + + if(. & SOUTH_JUNCTION) + if(. & WEST_JUNCTION) + switch(find_type_in_direction(SOUTHWEST)) + if(NULLTURF_BORDER) + if((smoothing_flags & SMOOTH_BORDER)) + . |= SOUTHWEST_JUNCTION + if(ADJ_FOUND) + . |= SOUTHWEST_JUNCTION + + if(. & EAST_JUNCTION) + switch(find_type_in_direction(SOUTHEAST)) + if(NULLTURF_BORDER) + if((smoothing_flags & SMOOTH_BORDER)) + . |= SOUTHEAST_JUNCTION + if(ADJ_FOUND) + . |= SOUTHEAST_JUNCTION + + +/atom/movable/calculate_adjacencies() + if(can_be_unanchored && !anchored) + return NONE + return ..() + + +///do not use, use QUEUE_SMOOTH(atom) +/atom/proc/smooth_icon() + smoothing_flags &= ~SMOOTH_QUEUED + flags_1 |= HTML_USE_INITAL_ICON_1 + if (!z) + CRASH("[type] called smooth_icon() without being on a z-level") + if(smoothing_flags & SMOOTH_CORNERS) + if(smoothing_flags & SMOOTH_DIAGONAL_CORNERS) + corners_diagonal_smooth(calculate_adjacencies()) else - cardinal_smooth(A, adjacencies) + corners_cardinal_smooth(calculate_adjacencies()) + else if(smoothing_flags & SMOOTH_BITMASK) + bitmask_smooth() + else + CRASH("smooth_icon called for [src] with smoothing_flags == [smoothing_flags]") + SEND_SIGNAL(src, COMSIG_ATOM_SMOOTHED_ICON) -/atom/proc/diagonal_smooth(adjacencies) +// As a rule, movables will most always care about smoothing changes +// Turfs on the other hand, don't, so we don't do the update for THEM unless they explicitly request it +/atom/movable/smooth_icon() + . = ..() + update_appearance(~UPDATE_SMOOTHING) + +/atom/proc/corners_diagonal_smooth(adjacencies) switch(adjacencies) - if(N_NORTH|N_WEST) + if(NORTH_JUNCTION|WEST_JUNCTION) replace_smooth_overlays("d-se","d-se-0") - if(N_NORTH|N_EAST) + if(NORTH_JUNCTION|EAST_JUNCTION) replace_smooth_overlays("d-sw","d-sw-0") - if(N_SOUTH|N_WEST) + if(SOUTH_JUNCTION|WEST_JUNCTION) replace_smooth_overlays("d-ne","d-ne-0") - if(N_SOUTH|N_EAST) + if(SOUTH_JUNCTION|EAST_JUNCTION) replace_smooth_overlays("d-nw","d-nw-0") - if(N_NORTH|N_WEST|N_NORTHWEST) + if(NORTH_JUNCTION|WEST_JUNCTION|NORTHWEST_JUNCTION) replace_smooth_overlays("d-se","d-se-1") - if(N_NORTH|N_EAST|N_NORTHEAST) + if(NORTH_JUNCTION|EAST_JUNCTION|NORTHEAST_JUNCTION) replace_smooth_overlays("d-sw","d-sw-1") - if(N_SOUTH|N_WEST|N_SOUTHWEST) + if(SOUTH_JUNCTION|WEST_JUNCTION|SOUTHWEST_JUNCTION) replace_smooth_overlays("d-ne","d-ne-1") - if(N_SOUTH|N_EAST|N_SOUTHEAST) + if(SOUTH_JUNCTION|EAST_JUNCTION|SOUTHEAST_JUNCTION) replace_smooth_overlays("d-nw","d-nw-1") else - cardinal_smooth(src, adjacencies) - return + corners_cardinal_smooth(adjacencies) + return FALSE icon_state = "" - return adjacencies - -//only walls should have a need to handle underlays -/turf/closed/wall/diagonal_smooth(adjacencies) - adjacencies = reverse_ndir(..()) - if(adjacencies) - var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, plane = FLOOR_PLANE) - var/list/U = list(underlay_appearance) - if(fixed_underlay) - if(fixed_underlay["space"]) - underlay_appearance.icon = 'icons/turf/space.dmi' - underlay_appearance.icon_state = SPACE_ICON_STATE - underlay_appearance.plane = PLANE_SPACE - else - underlay_appearance.icon = fixed_underlay["icon"] - underlay_appearance.icon_state = fixed_underlay["icon_state"] - else - var/turned_adjacency = turn(adjacencies, 180) - var/turf/T = get_step(src, turned_adjacency) - if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) - T = get_step(src, turn(adjacencies, 135)) - if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) - T = get_step(src, turn(adjacencies, 225)) - //if all else fails, ask our own turf - if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency) && !get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) - underlay_appearance.icon = DEFAULT_UNDERLAY_ICON - underlay_appearance.icon_state = DEFAULT_UNDERLAY_ICON_STATE - underlays = U - - // Drop posters which were previously placed on this wall. - for(var/obj/structure/sign/poster/P in src) - P.roll_and_drop(src) - - -/proc/cardinal_smooth(atom/A, adjacencies) + return TRUE + + +/atom/proc/corners_cardinal_smooth(adjacencies) + var/mutable_appearance/temp_ma + //NW CORNER var/nw = "1-i" - if((adjacencies & N_NORTH) && (adjacencies & N_WEST)) - if(adjacencies & N_NORTHWEST) + if((adjacencies & NORTH_JUNCTION) && (adjacencies & WEST_JUNCTION)) + if(adjacencies & NORTHWEST_JUNCTION) nw = "1-f" else nw = "1-nw" else - if(adjacencies & N_NORTH) + if(adjacencies & NORTH_JUNCTION) nw = "1-n" - else if(adjacencies & N_WEST) + else if(adjacencies & WEST_JUNCTION) nw = "1-w" + temp_ma = mutable_appearance(icon, nw) + nw = temp_ma.appearance //NE CORNER var/ne = "2-i" - if((adjacencies & N_NORTH) && (adjacencies & N_EAST)) - if(adjacencies & N_NORTHEAST) + if((adjacencies & NORTH_JUNCTION) && (adjacencies & EAST_JUNCTION)) + if(adjacencies & NORTHEAST_JUNCTION) ne = "2-f" else ne = "2-ne" else - if(adjacencies & N_NORTH) + if(adjacencies & NORTH_JUNCTION) ne = "2-n" - else if(adjacencies & N_EAST) + else if(adjacencies & EAST_JUNCTION) ne = "2-e" + temp_ma = mutable_appearance(icon, ne) + ne = temp_ma.appearance //SW CORNER var/sw = "3-i" - if((adjacencies & N_SOUTH) && (adjacencies & N_WEST)) - if(adjacencies & N_SOUTHWEST) + if((adjacencies & SOUTH_JUNCTION) && (adjacencies & WEST_JUNCTION)) + if(adjacencies & SOUTHWEST_JUNCTION) sw = "3-f" else sw = "3-sw" else - if(adjacencies & N_SOUTH) + if(adjacencies & SOUTH_JUNCTION) sw = "3-s" - else if(adjacencies & N_WEST) + else if(adjacencies & WEST_JUNCTION) sw = "3-w" + temp_ma = mutable_appearance(icon, sw) + sw = temp_ma.appearance //SE CORNER var/se = "4-i" - if((adjacencies & N_SOUTH) && (adjacencies & N_EAST)) - if(adjacencies & N_SOUTHEAST) + if((adjacencies & SOUTH_JUNCTION) && (adjacencies & EAST_JUNCTION)) + if(adjacencies & SOUTHEAST_JUNCTION) se = "4-f" else se = "4-se" else - if(adjacencies & N_SOUTH) + if(adjacencies & SOUTH_JUNCTION) se = "4-s" - else if(adjacencies & N_EAST) + else if(adjacencies & EAST_JUNCTION) se = "4-e" + temp_ma = mutable_appearance(icon, se) + se = temp_ma.appearance + + var/list/new_overlays - var/list/New + if(top_left_corner != nw) + cut_overlay(top_left_corner) + top_left_corner = nw + LAZYADD(new_overlays, nw) - if(A.top_left_corner != nw) - A.cut_overlay(A.top_left_corner) - A.top_left_corner = nw - LAZYADD(New, nw) + if(top_right_corner != ne) + cut_overlay(top_right_corner) + top_right_corner = ne + LAZYADD(new_overlays, ne) - if(A.top_right_corner != ne) - A.cut_overlay(A.top_right_corner) - A.top_right_corner = ne - LAZYADD(New, ne) + if(bottom_right_corner != sw) + cut_overlay(bottom_right_corner) + bottom_right_corner = sw + LAZYADD(new_overlays, sw) - if(A.bottom_right_corner != sw) - A.cut_overlay(A.bottom_right_corner) - A.bottom_right_corner = sw - LAZYADD(New, sw) + if(bottom_left_corner != se) + cut_overlay(bottom_left_corner) + bottom_left_corner = se + LAZYADD(new_overlays, se) - if(A.bottom_left_corner != se) - A.cut_overlay(A.bottom_left_corner) - A.bottom_left_corner = se - LAZYADD(New, se) + if(new_overlays) + add_overlay(new_overlays) - if(New) - A.add_overlay(New) -/proc/find_type_in_direction(atom/source, direction) - var/turf/target_turf = get_step(source, direction) +///Scans direction to find targets to smooth with. +/atom/proc/find_type_in_direction(direction) + var/turf/target_turf = get_step(src, direction) if(!target_turf) return NULLTURF_BORDER var/area/target_area = get_area(target_turf) - var/area/source_area = get_area(source) - if(source_area.canSmoothWithAreas && !is_type_in_typecache(target_area, source_area.canSmoothWithAreas)) - return null - if(target_area.canSmoothWithAreas && !is_type_in_typecache(source_area, target_area.canSmoothWithAreas)) - return null - - if(source.canSmoothWith) - var/atom/A - if(source.smooth & SMOOTH_MORE) - for(var/a_type in source.canSmoothWith) - if( istype(target_turf, a_type) ) - return target_turf - A = locate(a_type) in target_turf - if(A) - return A - return null - - for(var/a_type in source.canSmoothWith) - if(a_type == target_turf.type) - return target_turf - A = locate(a_type) in target_turf - if(A && A.type == a_type) - return A - return null - else - if(isturf(source)) - return source.type == target_turf.type ? target_turf : null - var/atom/A = locate(source.type) in target_turf - return A && A.type == source.type ? A : null + var/area/source_area = get_area(src) + if((source_area.area_limited_icon_smoothing && !istype(target_area, source_area.area_limited_icon_smoothing)) || (target_area.area_limited_icon_smoothing && !istype(source_area, target_area.area_limited_icon_smoothing))) + return NO_ADJ_FOUND + + if(isnull(canSmoothWith)) //special case in which it will only smooth with itself + if(isturf(src)) + return (type == target_turf.type) ? ADJ_FOUND : NO_ADJ_FOUND + var/atom/matching_obj = locate(type) in target_turf + return (matching_obj && matching_obj.type == type) ? ADJ_FOUND : NO_ADJ_FOUND + + if(!isnull(target_turf.smoothing_groups)) + for(var/target in canSmoothWith) + if(!(canSmoothWith[target] & target_turf.smoothing_groups[target])) + continue + return ADJ_FOUND + + if(smoothing_flags & SMOOTH_OBJ) + for(var/atom/movable/thing as anything in target_turf) + if(!thing.anchored || isnull(thing.smoothing_groups)) + continue + for(var/target in canSmoothWith) + if(!(canSmoothWith[target] & thing.smoothing_groups[target])) + continue + return ADJ_FOUND + + return NO_ADJ_FOUND + +/** + * Basic smoothing proc. The atom checks for adjacent directions to smooth with and changes the icon_state based on that. + * + * Returns the previous smoothing_junction state so the previous state can be compared with the new one after the proc ends, and see the changes, if any. + * +*/ +/atom/proc/bitmask_smooth() + var/new_junction = NONE + + // cache for sanic speed + var/canSmoothWith = src.canSmoothWith + + var/smooth_border = (smoothing_flags & SMOOTH_BORDER) + var/smooth_obj = (smoothing_flags & SMOOTH_OBJ) + var/border_object_smoothing = (smoothing_flags & SMOOTH_BORDER_OBJECT) + + // Did you know you can pass defines into other defines? very handy, lets take advantage of it here to allow 0 cost variation + #define SEARCH_ADJ_IN_DIR(direction, direction_flag, ADJ_FOUND, WORLD_BORDER, BORDER_CHECK) \ + do { \ + var/turf/neighbor = get_step(src, direction); \ + if(neighbor && ##BORDER_CHECK(neighbor, direction)) { \ + var/neighbor_smoothing_groups = neighbor.smoothing_groups; \ + if(neighbor_smoothing_groups) { \ + for(var/target in canSmoothWith) { \ + if(canSmoothWith[target] & neighbor_smoothing_groups[target]) { \ + ##ADJ_FOUND(neighbor, direction, direction_flag); \ + } \ + } \ + } \ + if(smooth_obj) { \ + for(var/atom/movable/thing as anything in neighbor) { \ + var/thing_smoothing_groups = thing.smoothing_groups; \ + if(!thing.anchored || isnull(thing_smoothing_groups) || !##BORDER_CHECK(thing, direction)) { \ + continue; \ + }; \ + for(var/target in canSmoothWith) { \ + if(canSmoothWith[target] & thing_smoothing_groups[target]) { \ + ##ADJ_FOUND(thing, direction, direction_flag); \ + } \ + } \ + } \ + } \ + } else if (smooth_border) { \ + ##WORLD_BORDER(null, direction, direction_flag); \ + } \ + } while(FALSE) \ + + #define BITMASK_FOUND(target, direction, direction_flag) \ + new_junction |= direction_flag; \ + break set_adj_in_dir; \ + /// Check that non border objects use to smooth against border objects + /// Returns true if the smooth is acceptable, FALSE otherwise + #define BITMASK_ON_BORDER_CHECK(target, direction) (!(target.smoothing_flags & SMOOTH_BORDER_OBJECT) || CAN_DIAGONAL_SMOOTH(target, src, REVERSE_DIR(direction))) + + #define BORDER_FOUND(target, direction, direction_flag) new_junction |= CAN_DIAGONAL_SMOOTH(src, target, direction) + // Border objects require an object as context, so we need a dummy. I'm sorry + #define WORLD_BORDER_FOUND(target, direction, direction_flag) \ + var/static/atom/dummy; \ + if(!dummy) { \ + dummy = new(); \ + dummy.smoothing_flags &= ~SMOOTH_BORDER_OBJECT; \ + } \ + BORDER_FOUND(dummy, direction, direction_flag); + // Handle handle border on border checks. no-op, we handle this check inside CAN_DIAGONAL_SMOOTH + #define BORDER_ON_BORDER_CHECK(target, direction) (TRUE) + + // We're building 2 different types of smoothing searches here + // One for standard bitmask smoothing (We provide a label so our macro can eary exit, as it wants to do) + #define SET_ADJ_IN_DIR(direction, direction_flag) do { set_adj_in_dir: { SEARCH_ADJ_IN_DIR(direction, direction_flag, BITMASK_FOUND, BITMASK_FOUND, BITMASK_ON_BORDER_CHECK) }} while(FALSE) + // and another for border object work (Doesn't early exit because we can hit more then one direction by checking the same turf) + #define SET_BORDER_ADJ_IN_DIR(direction) SEARCH_ADJ_IN_DIR(direction, direction, BORDER_FOUND, WORLD_BORDER_FOUND, BORDER_ON_BORDER_CHECK) + + // Let's go over all our cardinals + if(border_object_smoothing) + SET_BORDER_ADJ_IN_DIR(NORTH) + SET_BORDER_ADJ_IN_DIR(SOUTH) + SET_BORDER_ADJ_IN_DIR(EAST) + SET_BORDER_ADJ_IN_DIR(WEST) + // We want to check against stuff in our own turf + SET_BORDER_ADJ_IN_DIR(NONE) + // Border objects don't do diagonals, so GO HOME + set_smoothed_icon_state(new_junction) + return + + SET_ADJ_IN_DIR(NORTH, NORTH) + SET_ADJ_IN_DIR(SOUTH, SOUTH) + SET_ADJ_IN_DIR(EAST, EAST) + SET_ADJ_IN_DIR(WEST, WEST) + + // If there's nothing going on already + if(!(new_junction & (NORTH|SOUTH)) || !(new_junction & (EAST|WEST))) + set_smoothed_icon_state(new_junction) + return + + if(new_junction & NORTH_JUNCTION) + if(new_junction & WEST_JUNCTION) + SET_ADJ_IN_DIR(NORTHWEST, NORTHWEST_JUNCTION) + + if(new_junction & EAST_JUNCTION) + SET_ADJ_IN_DIR(NORTHEAST, NORTHEAST_JUNCTION) + + if(new_junction & SOUTH_JUNCTION) + if(new_junction & WEST_JUNCTION) + SET_ADJ_IN_DIR(SOUTHWEST, SOUTHWEST_JUNCTION) + + if(new_junction & EAST_JUNCTION) + SET_ADJ_IN_DIR(SOUTHEAST, SOUTHEAST_JUNCTION) + + set_smoothed_icon_state(new_junction) + + #undef SET_BORDER_ADJ_IN_DIR + #undef SET_ADJ_IN_DIR + #undef BORDER_ON_BORDER_CHECK + #undef WORLD_BORDER_FOUND + #undef BORDER_FOUND + #undef BITMASK_ON_BORDER_CHECK + #undef BITMASK_FOUND + #undef SEARCH_ADJ_IN_DIR + +///Changes the icon state based on the new junction bitmask +/atom/proc/set_smoothed_icon_state(new_junction) + . = smoothing_junction + smoothing_junction = new_junction + icon_state = "[base_icon_state]-[smoothing_junction]" + + +/turf/closed/set_smoothed_icon_state(new_junction) + // Avoid calling ..() here to avoid setting icon_state twice, which is expensive given how hot this proc is + var/old_junction = smoothing_junction + smoothing_junction = new_junction + + if (!(smoothing_flags & SMOOTH_DIAGONAL_CORNERS)) + icon_state = "[base_icon_state]-[smoothing_junction]" + return + + switch(new_junction) + if( + NORTH_JUNCTION|WEST_JUNCTION, + NORTH_JUNCTION|EAST_JUNCTION, + SOUTH_JUNCTION|WEST_JUNCTION, + SOUTH_JUNCTION|EAST_JUNCTION, + NORTH_JUNCTION|WEST_JUNCTION|NORTHWEST_JUNCTION, + NORTH_JUNCTION|EAST_JUNCTION|NORTHEAST_JUNCTION, + SOUTH_JUNCTION|WEST_JUNCTION|SOUTHWEST_JUNCTION, + SOUTH_JUNCTION|EAST_JUNCTION|SOUTHEAST_JUNCTION, + ) + icon_state = "[base_icon_state]-[smoothing_junction]-d" + if(new_junction == old_junction || fixed_underlay) // Mutable underlays? + return + + var/junction_dir = reverse_ndir(smoothing_junction) + var/turned_adjacency = REVERSE_DIR(junction_dir) + var/turf/neighbor_turf = get_step(src, turned_adjacency & (NORTH|SOUTH)) + var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, offset_spokesman = src, plane = FLOOR_PLANE) + if(!neighbor_turf.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) + neighbor_turf = get_step(src, turned_adjacency & (EAST|WEST)) + + if(!neighbor_turf.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) + neighbor_turf = get_step(src, turned_adjacency) + + if(!neighbor_turf.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) + if(!get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) //if all else fails, ask our own turf + underlay_appearance.icon = DEFAULT_UNDERLAY_ICON + underlay_appearance.icon_state = DEFAULT_UNDERLAY_ICON_STATE + underlays += underlay_appearance + else + icon_state = "[base_icon_state]-[smoothing_junction]" + +/turf/open/floor/set_smoothed_icon_state(new_junction) + if(broken || burnt) + return + return ..() + //Icon smoothing helpers /proc/smooth_zlevel(zlevel, now = FALSE) - var/list/away_turfs = block(locate(1, 1, zlevel), locate(world.maxx, world.maxy, zlevel)) - for(var/V in away_turfs) - var/turf/T = V - if(T.smooth) + var/list/away_turfs = Z_TURFS(zlevel) + for(var/turf/turf_to_smooth as anything in away_turfs) + if(turf_to_smooth.smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) if(now) - smooth_icon(T) + turf_to_smooth.smooth_icon() else - queue_smooth(T) - for(var/R in T) - var/atom/A = R - if(A.smooth) + QUEUE_SMOOTH(turf_to_smooth) + for(var/atom/movable/movable_to_smooth as anything in turf_to_smooth) + if(movable_to_smooth.smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) if(now) - smooth_icon(A) + movable_to_smooth.smooth_icon() else - queue_smooth(A) + QUEUE_SMOOTH(movable_to_smooth) + /atom/proc/clear_smooth_overlays() cut_overlay(top_left_corner) @@ -326,71 +539,109 @@ cut_overlay(bottom_left_corner) bottom_left_corner = null +/// Internal: Takes icon states as text to replace smoothing corner overlays /atom/proc/replace_smooth_overlays(nw, ne, sw, se) clear_smooth_overlays() - var/list/O = list() + var/mutable_appearance/temp_ma + + temp_ma = mutable_appearance(icon, nw) + nw = temp_ma.appearance + + temp_ma = mutable_appearance(icon, ne) + ne = temp_ma.appearance + + temp_ma = mutable_appearance(icon, sw) + sw = temp_ma.appearance + + temp_ma = mutable_appearance(icon, se) + se = temp_ma.appearance + + var/list/new_overlays = list() + top_left_corner = nw - O += nw + new_overlays += nw + top_right_corner = ne - O += ne + new_overlays += ne + bottom_left_corner = sw - O += sw + new_overlays += sw + bottom_right_corner = se - O += se - add_overlay(O) + new_overlays += se + + add_overlay(new_overlays) + +/// Takes a direction, turns it into all the junctions that contain it +/proc/dir_to_all_junctions(dir) + var/handback = NONE + if(dir & NORTH) + handback |= NORTH_JUNCTION | NORTHEAST_JUNCTION | NORTHWEST_JUNCTION + if(dir & SOUTH) + handback |= SOUTH_JUNCTION | SOUTHEAST_JUNCTION | SOUTHWEST_JUNCTION + if(dir & EAST) + handback |= EAST_JUNCTION | SOUTHEAST_JUNCTION | NORTHEAST_JUNCTION + if(dir & WEST) + handback |= WEST_JUNCTION | NORTHWEST_JUNCTION | SOUTHWEST_JUNCTION + return handback + +/proc/dir_to_junction(dir) + switch(dir) + if(NORTH) + return NORTH_JUNCTION + if(SOUTH) + return SOUTH_JUNCTION + if(WEST) + return WEST_JUNCTION + if(EAST) + return EAST_JUNCTION + if(NORTHWEST) + return NORTHWEST_JUNCTION + if(NORTHEAST) + return NORTHEAST_JUNCTION + if(SOUTHEAST) + return SOUTHEAST_JUNCTION + if(SOUTHWEST) + return SOUTHWEST_JUNCTION + else + return NONE /proc/reverse_ndir(ndir) switch(ndir) - if(N_NORTH) + if(NORTH_JUNCTION) return NORTH - if(N_SOUTH) + if(SOUTH_JUNCTION) return SOUTH - if(N_WEST) + if(WEST_JUNCTION) return WEST - if(N_EAST) + if(EAST_JUNCTION) return EAST - if(N_NORTHWEST) + if(NORTHWEST_JUNCTION) return NORTHWEST - if(N_NORTHEAST) + if(NORTHEAST_JUNCTION) return NORTHEAST - if(N_SOUTHEAST) + if(SOUTHEAST_JUNCTION) return SOUTHEAST - if(N_SOUTHWEST) + if(SOUTHWEST_JUNCTION) return SOUTHWEST - if(N_NORTH|N_WEST) + if(NORTH_JUNCTION | WEST_JUNCTION) return NORTHWEST - if(N_NORTH|N_EAST) + if(NORTH_JUNCTION | EAST_JUNCTION) return NORTHEAST - if(N_SOUTH|N_WEST) + if(SOUTH_JUNCTION | WEST_JUNCTION) return SOUTHWEST - if(N_SOUTH|N_EAST) + if(SOUTH_JUNCTION | EAST_JUNCTION) return SOUTHEAST - if(N_NORTH|N_WEST|N_NORTHWEST) + if(NORTH_JUNCTION | WEST_JUNCTION | NORTHWEST_JUNCTION) return NORTHWEST - if(N_NORTH|N_EAST|N_NORTHEAST) + if(NORTH_JUNCTION | EAST_JUNCTION | NORTHEAST_JUNCTION) return NORTHEAST - if(N_SOUTH|N_WEST|N_SOUTHWEST) + if(SOUTH_JUNCTION | WEST_JUNCTION | SOUTHWEST_JUNCTION) return SOUTHWEST - if(N_SOUTH|N_EAST|N_SOUTHEAST) + if(SOUTH_JUNCTION | EAST_JUNCTION | SOUTHEAST_JUNCTION) return SOUTHEAST else - return 0 - -//SSicon_smooth -/proc/queue_smooth_neighbors(atom/A) - for(var/V in orange(1,A)) - var/atom/T = V - if(T.smooth) - queue_smooth(T) - -//SSicon_smooth -/proc/queue_smooth(atom/A) - if(!A.smooth || A.smooth & SMOOTH_QUEUED) - return - - SSicon_smooth.smooth_queue += A - SSicon_smooth.can_fire = 1 - A.smooth |= SMOOTH_QUEUED + return NONE //Example smooth wall @@ -398,5 +649,23 @@ name = "smooth wall" icon = 'icons/turf/smooth_wall.dmi' icon_state = "smooth" - smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL|SMOOTH_BORDER + smoothing_flags = SMOOTH_CORNERS|SMOOTH_DIAGONAL_CORNERS|SMOOTH_BORDER + smoothing_groups = null canSmoothWith = null + +#undef NORTH_JUNCTION +#undef SOUTH_JUNCTION +#undef EAST_JUNCTION +#undef WEST_JUNCTION +#undef NORTHEAST_JUNCTION +#undef NORTHWEST_JUNCTION +#undef SOUTHEAST_JUNCTION +#undef SOUTHWEST_JUNCTION + +#undef NO_ADJ_FOUND +#undef ADJ_FOUND +#undef NULLTURF_BORDER + +#undef DEFAULT_UNDERLAY_ICON +#undef DEFAULT_UNDERLAY_ICON_STATE +#undef CAN_DIAGONAL_SMOOTH diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 91ee06e97e2e..a4044c5c373b 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1134,7 +1134,8 @@ GLOBAL_DATUM_INIT(dummySave, /savefile, new("tmp/dummySave.sav")) //Cache of ico I = A.icon if (isnull(icon_state)) icon_state = A.icon_state - if (!(icon_state in icon_states(I, 1))) + //Despite casting to atom, this code path supports mutable appearances, so let's be nice to them + if(isnull(icon_state) || (isatom(thing) && A.flags_1 & HTML_USE_INITAL_ICON_1)) icon_state = initial(A.icon_state) if (isnull(dir)) dir = initial(A.dir) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/logging/_logging.dm similarity index 88% rename from code/__HELPERS/_logging.dm rename to code/__HELPERS/logging/_logging.dm index d678e57e513d..9701deeaa52f 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/logging/_logging.dm @@ -1,20 +1,3 @@ -//wrapper macros for easier grepping -#define DIRECT_OUTPUT(A, B) A << B -#define DIRECT_INPUT(A, B) A >> B -#define SEND_IMAGE(target, image) DIRECT_OUTPUT(target, image) -#define SEND_SOUND(target, sound) DIRECT_OUTPUT(target, sound) -#define SEND_TEXT(target, text) DIRECT_OUTPUT(target, text) -#define WRITE_FILE(file, text) DIRECT_OUTPUT(file, text) -#define READ_FILE(file, text) DIRECT_INPUT(file, text) -//This is an external call, "true" and "false" are how rust parses out booleans -#ifdef EXTOOLS_LOGGING -#define WRITE_LOG(log, text) extools_log_write(log, text, TRUE) -#define WRITE_LOG_NO_FORMAT(log, text) extools_log_write(log, text, FALSE) -#else -#define WRITE_LOG(log, text) rustg_log_write(log, "\[[worldtime2text()]\] [text]", "true") -#define WRITE_LOG_NO_FORMAT(log, text) rustg_log_write(log, text, "false") -#endif - //print a warning message to world.log #define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [UNLINT(src)] usr: [usr].") /proc/warning(msg) @@ -361,3 +344,52 @@ return "([AREACOORD(T)])" else if(A.loc) return "(UNKNOWN (?, ?, ?))" + +/// Generic logging helper +/atom/proc/log_message(message, message_type, color=null, log_globally=TRUE) + if(!log_globally) + return + + var/log_text = "[key_name(src)] [message] [loc_name(src)]" + switch(message_type) + if(LOG_ATTACK) + log_attack(log_text) + if(LOG_SAY) + log_say(log_text) + if(LOG_WHISPER) + log_whisper(log_text) + if(LOG_EMOTE) + log_emote(log_text) + if(LOG_DSAY) + log_dsay(log_text) + if(LOG_PDA) + log_pda(log_text) + if(LOG_CHAT) + log_chat(log_text) + if(LOG_COMMENT) + log_comment(log_text) + if(LOG_TELECOMMS) + log_telecomms(log_text) + if(LOG_NTSL) + log_ntsl(log_text) + if(LOG_OOC) + log_ooc(log_text) + if(LOG_LOOC) // yogs - LOOC log + log_looc(log_text) // yogs - LOOC log + if(LOG_DONATOR) // yogs - Donator log + log_donator(log_text) // yogs - Donator log + if(LOG_ADMIN) + log_admin(log_text) + if(LOG_ADMIN_PRIVATE) + log_admin_private(log_text) + if(LOG_ASAY) + log_adminsay(log_text) + if(LOG_OWNERSHIP) + log_game(log_text) + if(LOG_GAME) + log_game(log_text) + if(LOG_MECHA) + log_mecha(log_text) + else + stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).") + log_game(log_text) diff --git a/code/__HELPERS/logging/attack.dm b/code/__HELPERS/logging/attack.dm new file mode 100644 index 000000000000..9340c22d0eee --- /dev/null +++ b/code/__HELPERS/logging/attack.dm @@ -0,0 +1,64 @@ +/** + * Log a combat message in the attack log + * + * 1 argument is the actor performing the action + * 2 argument is the target of the action + * 3 is a verb describing the action (e.g. punched, throwed, kicked, etc.) + * 4 is a tool with which the action was made (usually an item) + * 5 is any additional text, which will be appended to the rest of the log line + */ +/proc/log_combat(atom/user, atom/target, what_done, atom/object=null, addition=null) + var/ssource = key_name(user) + var/starget = key_name(target) + + var/mob/living/living_target = target + var/hp = istype(living_target) ? " (NEWHP: [living_target.health]) " : "" + + var/sobject = "" + if(object) + sobject = " with [object]" + var/saddition = "" + if(addition) + saddition = " [addition]" + + var/postfix = "[sobject][saddition][hp]" + + var/message = "has [what_done] [starget][postfix]" + user.log_message(message, LOG_ATTACK, color="red") + + if(user != target) + var/reverse_message = "has been [what_done] by [ssource][postfix]" + target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE) + +/** + * log_wound() is for when someone is *attacked* and suffers a wound. Note that this only captures wounds from damage, so smites/forced wounds aren't logged, as well as demotions like cuts scabbing over + * + * Note that this has no info on the attack that dealt the wound: information about where damage came from isn't passed to the bodypart's damaged proc. When in doubt, check the attack log for attacks at that same time + * TODO later: Add logging for healed wounds, though that will require some rewriting of healing code to prevent admin heals from spamming the logs. Not high priority + * + * Arguments: + * * victim- The guy who got wounded + * * suffered_wound- The wound, already applied, that we're logging. It has to already be attached so we can get the limb from it + * * dealt_damage- How much damage is associated with the attack that dealt with this wound. + * * dealt_wound_bonus- The wound_bonus, if one was specified, of the wounding attack + * * dealt_bare_wound_bonus- The bare_wound_bonus, if one was specified *and applied*, of the wounding attack. Not shown if armor was present + * * base_roll- Base wounding ability of an attack is a random number from 1 to (dealt_damage ** WOUND_DAMAGE_EXPONENT). This is the number that was rolled in there, before mods + */ +/proc/log_wound(atom/victim, datum/wound/suffered_wound, dealt_damage, dealt_wound_bonus, dealt_bare_wound_bonus, base_roll) + if(QDELETED(victim) || !suffered_wound) + return + var/message = "has suffered: [suffered_wound][suffered_wound.limb ? " to [suffered_wound.limb.name]" : null]"// maybe indicate if it's a promote/demote? + + if(dealt_damage) + message += " | Damage: [dealt_damage]" + // The base roll is useful since it can show how lucky someone got with the given attack. For example, dealing a cut + if(base_roll) + message += "(rolled [base_roll]/[dealt_damage ** WOUND_DAMAGE_EXPONENT])" + + if(dealt_wound_bonus) + message += " | WB: [dealt_wound_bonus]" + + if(dealt_bare_wound_bonus) + message += " | BWB: [dealt_bare_wound_bonus]" + + victim.log_message(message, LOG_ATTACK, color="blue") diff --git a/code/__HELPERS/logging/talk.dm b/code/__HELPERS/logging/talk.dm new file mode 100644 index 000000000000..5f63b3a3ced6 --- /dev/null +++ b/code/__HELPERS/logging/talk.dm @@ -0,0 +1,15 @@ +/// Helper for logging chat messages or other logs with arbitrary inputs (e.g. announcements) +/atom/proc/log_talk(message, message_type, tag=null, log_globally=TRUE, forced_by=null) + var/prefix = tag ? "([tag]) " : "" + var/suffix = forced_by ? " FORCED by [forced_by]" : "" + log_message("[prefix]\"[message]\"[suffix]", message_type, log_globally=log_globally) + +/// Helper for logging of messages with only one sender and receiver +/proc/log_directed_talk(atom/source, atom/target, message, message_type, tag) + if(!tag) + stack_trace("Unspecified tag for private message") + tag = "UNKNOWN" + + source.log_talk(message, message_type, tag="[tag] to [key_name(target)]") + if(source != target) + target.log_talk(message, message_type, tag="[tag] from [key_name(source)]", log_globally=FALSE) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index d346e7fae044..38bfcf2dbd8a 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -34,15 +34,12 @@ /proc/Get_Pixel_Angle(y, x)//for getting the angle when animating something's pixel_x and pixel_y if(!y) - return (x>=0)?90:270 - .=arctan(x/y) - if(y<0) - .+=180 - else if(x<0) - .+=360 - -//Better performant than an artisanal proc and more reliable than Turn(). From TGMC. -#define REVERSE_DIR(dir) ( ((dir & 85) << 1) | ((dir & 170) >> 1) ) + return (x >= 0) ? 90 : 270 + . = arctan(x / y) + if(y < 0) + . += 180 + else if(x < 0) + . += 360 //Returns location. Returns null if no location was found. /proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = FALSE, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 2123f6a32d20..7aa8761ec224 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -198,14 +198,6 @@ DEFINE_BITFIELD(tesla_flags, list( "TESLA_MACHINE_EXPLOSIVE" = TESLA_MACHINE_EXPLOSIVE, )) -DEFINE_BITFIELD(smooth, list( - "SMOOTH_TRUE" = SMOOTH_TRUE, - "SMOOTH_MORE" = SMOOTH_MORE, - "SMOOTH_DIAGONAL" = SMOOTH_DIAGONAL, - "SMOOTH_BORDER" = SMOOTH_BORDER, - "SMOOTH_QUEUED" = SMOOTH_QUEUED, -)) - DEFINE_BITFIELD(car_traits, list( "CAN_KIDNAP" = CAN_KIDNAP, )) diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index c5d02cf9439c..338f50b2021c 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -16,7 +16,7 @@ SUBSYSTEM_DEF(icon_smooth) var/atom/A = cached[cached.len] cached.len-- if (A.flags_1 & INITIALIZED_1) - smooth_icon(A) + A.smooth_icon() else deferred += A if (MC_TICK_CHECK) @@ -38,7 +38,7 @@ SUBSYSTEM_DEF(icon_smooth) var/atom/A = V if(!A || A.z <= 2) continue - smooth_icon(A) + A.smooth_icon() CHECK_TICK return SS_INIT_SUCCESS diff --git a/code/datums/elements/undertile.dm b/code/datums/elements/undertile.dm new file mode 100644 index 000000000000..b540e0e3ae1d --- /dev/null +++ b/code/datums/elements/undertile.dm @@ -0,0 +1,84 @@ +/// The alpha we give to stuff under tiles, if they want it +#define ALPHA_UNDERTILE 128 + +///Add to an object if you want to be able to be hidden under tiles +/datum/element/undertile + element_flags = ELEMENT_BESPOKE | COMPONENT_DUPE_HIGHLANDER + argument_hash_start_idx = 2 + + ///the invisiblity trait applied, like TRAIT_T_RAY_VISIBLE + var/invisibility_trait + ///level of invisibility applied when under a tile. Could be INVISIBILITY_OBSERVER if you still want it to be visible to ghosts + var/invisibility_level + ///an overlay for the tile if we wish to apply that + var/tile_overlay + ///whether we use alpha or not. TRUE uses ALPHA_UNDERTILE because otherwise we have 200 different instances of this element for different alphas + var/use_alpha + ///We will switch between anchored and unanchored. for stuff like satchels that shouldn't be pullable under tiles but are otherwise unanchored + var/use_anchor + +/datum/element/undertile/Attach(datum/target, invisibility_trait, invisibility_level = INVISIBILITY_MAXIMUM, tile_overlay, use_alpha = TRUE, use_anchor = FALSE) + . = ..() + + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_OBJ_HIDE, PROC_REF(hide)) + + src.invisibility_trait = invisibility_trait + src.invisibility_level = invisibility_level + src.tile_overlay = tile_overlay + src.use_alpha = use_alpha + src.use_anchor = use_anchor + +///called when a tile has been covered or uncovered +/datum/element/undertile/proc/hide(atom/movable/source, underfloor_accessibility) + SIGNAL_HANDLER + + if(underfloor_accessibility < UNDERFLOOR_VISIBLE) + source.SetInvisibility(invisibility_level, id=type) + else + source.RemoveInvisibility(type) + + var/turf/T = get_turf(source) + + if(underfloor_accessibility < UNDERFLOOR_INTERACTABLE) + source.plane = FLOOR_PLANE // We do this so that turfs that allow you to see what's underneath them don't have to be on the game plane (which causes ambient occlusion weirdness) + ADD_TRAIT(source, TRAIT_UNDERFLOOR, REF(src)) + + if(tile_overlay) + T.add_overlay(tile_overlay) + + if(use_anchor) + source.set_anchored(TRUE) + + if(underfloor_accessibility < UNDERFLOOR_VISIBLE) + if(use_alpha) + source.alpha = ALPHA_UNDERTILE + + if(invisibility_trait) + ADD_TRAIT(source, invisibility_trait, ELEMENT_TRAIT(type)) + + else + source.plane = initial(source.plane) + REMOVE_TRAIT(source, TRAIT_UNDERFLOOR, REF(src)) + + if(invisibility_trait) + REMOVE_TRAIT(source, invisibility_trait, ELEMENT_TRAIT(type)) + + if(tile_overlay) + T.overlays -= tile_overlay + + if(use_alpha) + source.alpha = initial(source.alpha) + + if(use_anchor) + source.set_anchored(FALSE) + +/datum/element/undertile/Detach(atom/movable/source, visibility_trait, invisibility_level = INVISIBILITY_MAXIMUM) + . = ..() + + hide(source, UNDERFLOOR_INTERACTABLE) + source.RemoveInvisibility(type) + +#undef ALPHA_UNDERTILE diff --git a/code/game/atoms.dm b/code/game/atom/_atom.dm similarity index 82% rename from code/game/atoms.dm rename to code/game/atom/_atom.dm index 191525de75e4..f7c5b8b8a29b 100644 --- a/code/game/atoms.dm +++ b/code/game/atom/_atom.dm @@ -7,7 +7,6 @@ /atom layer = TURF_LAYER plane = GAME_PLANE - var/level = 2 ///If non-null, overrides a/an/some in all cases var/article @@ -119,6 +118,23 @@ ///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy() var/list/targeted_by + ///Icon-smoothing behavior. + var/smoothing_flags = NONE + ///What directions this is currently smoothing with. IMPORTANT: This uses the smoothing direction flags as defined in icon_smoothing.dm, instead of the BYOND flags. + var/smoothing_junction = null //This starts as null for us to know when it's first set, but after that it will hold a 8-bit mask ranging from 0 to 255. + ///Smoothing variable + var/top_left_corner + ///Smoothing variable + var/top_right_corner + ///Smoothing variable + var/bottom_left_corner + ///Smoothing variable + var/bottom_right_corner + ///What smoothing groups does this atom belongs to, to match canSmoothWith. If null, nobody can smooth with it. Must be sorted. + var/list/smoothing_groups = null + ///List of smoothing groups this atom can smooth with. If this is null and atom is smooth, it smooths only with itself. Must be sorted. + var/list/canSmoothWith = null + var/atom/orbit_target //Reference to atom being orbited /** * Called when an atom is created in byond (built in engine proc) @@ -1287,89 +1303,6 @@ /atom/proc/return_temperature() return -/** - * Tool behavior procedure. Redirects to tool-specific procs by default. - * - * You can override it to catch all tool interactions, for use in complex deconstruction procs. - * - * Must return parent proc ..() in the end if overridden - */ -/atom/proc/tool_act(mob/living/user, obj/item/tool, tool_type) - var/act_result - var/signal_result - - signal_result = SEND_SIGNAL(src, COMSIG_ATOM_TOOL_ACT(tool_type), user, tool) - if(signal_result & COMPONENT_BLOCK_TOOL_ATTACK) // The COMSIG_ATOM_TOOL_ACT signal is blocking the act - return TOOL_ACT_SIGNAL_BLOCKING - if(QDELETED(tool)) - return TRUE - - switch(tool_type) - if(TOOL_CROWBAR) - act_result = crowbar_act(user, tool) - if(TOOL_MULTITOOL) - act_result = multitool_act(user, tool) - if(TOOL_SCREWDRIVER) - act_result = screwdriver_act(user, tool) - if(TOOL_WRENCH) - act_result = wrench_act(user, tool) - if(TOOL_WIRECUTTER) - act_result = wirecutter_act(user, tool) - if(TOOL_WELDER) - act_result = welder_act(user, tool) - if(TOOL_ANALYZER) - act_result = analyzer_act(user, tool) - if(!act_result) - return - - if(. && tool.toolspeed < 1) //nice tool bro - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "nice_tool", /datum/mood_event/nice_tool) - - // A tooltype_act has completed successfully -// log_tool("[key_name(user)] used [tool] on [src] at [AREACOORD(src)]") - SEND_SIGNAL(tool, COMSIG_TOOL_ATOM_ACTED_PRIMARY(tool_type), src) - return TOOL_ACT_TOOLTYPE_SUCCESS - - -//! Tool-specific behavior procs. To be overridden in subtypes. -/// - -///Crowbar act -/atom/proc/crowbar_act(mob/living/user, obj/item/I) - return - -///Multitool act -/atom/proc/multitool_act(mob/living/user, obj/item/I) - return - -///Check if the multitool has an item in it's data buffer -/atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE) - if(!istype(I, /obj/item/multitool)) - if(user && !silent) - to_chat(user, span_warning("[I] has no data buffer!")) - return FALSE - return TRUE - -///Screwdriver act -/atom/proc/screwdriver_act(mob/living/user, obj/item/I) - SEND_SIGNAL(src, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), user, I) - -///Wrench act -/atom/proc/wrench_act(mob/living/user, obj/item/I) - return - -///Wirecutter act -/atom/proc/wirecutter_act(mob/living/user, obj/item/I) - return - -///Welder act -/atom/proc/welder_act(mob/living/user, obj/item/I) - return - -///Analyzer act -/atom/proc/analyzer_act(mob/living/user, obj/item/I) - return - ///Generate a tag for this atom /atom/proc/GenerateTag() return @@ -1378,137 +1311,6 @@ /atom/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) return -/// Generic logging helper -/atom/proc/log_message(message, message_type, color=null, log_globally=TRUE) - if(!log_globally) - return - - var/log_text = "[key_name(src)] [message] [loc_name(src)]" - switch(message_type) - if(LOG_ATTACK) - log_attack(log_text) - if(LOG_SAY) - log_say(log_text) - if(LOG_WHISPER) - log_whisper(log_text) - if(LOG_EMOTE) - log_emote(log_text) - if(LOG_DSAY) - log_dsay(log_text) - if(LOG_PDA) - log_pda(log_text) - if(LOG_CHAT) - log_chat(log_text) - if(LOG_COMMENT) - log_comment(log_text) - if(LOG_TELECOMMS) - log_telecomms(log_text) - if(LOG_NTSL) - log_ntsl(log_text) - if(LOG_OOC) - log_ooc(log_text) - if(LOG_LOOC) // yogs - LOOC log - log_looc(log_text) // yogs - LOOC log - if(LOG_DONATOR) // yogs - Donator log - log_donator(log_text) // yogs - Donator log - if(LOG_ADMIN) - log_admin(log_text) - if(LOG_ADMIN_PRIVATE) - log_admin_private(log_text) - if(LOG_ASAY) - log_adminsay(log_text) - if(LOG_OWNERSHIP) - log_game(log_text) - if(LOG_GAME) - log_game(log_text) - if(LOG_MECHA) - log_mecha(log_text) - else - stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).") - log_game(log_text) - -/// Helper for logging chat messages or other logs with arbitrary inputs (e.g. announcements) -/atom/proc/log_talk(message, message_type, tag=null, log_globally=TRUE, forced_by=null) - var/prefix = tag ? "([tag]) " : "" - var/suffix = forced_by ? " FORCED by [forced_by]" : "" - log_message("[prefix]\"[message]\"[suffix]", message_type, log_globally=log_globally) - -/// Helper for logging of messages with only one sender and receiver -/proc/log_directed_talk(atom/source, atom/target, message, message_type, tag) - if(!tag) - stack_trace("Unspecified tag for private message") - tag = "UNKNOWN" - - source.log_talk(message, message_type, tag="[tag] to [key_name(target)]") - if(source != target) - target.log_talk(message, message_type, tag="[tag] from [key_name(source)]", log_globally=FALSE) - -/** - * Log a combat message in the attack log - * - * 1 argument is the actor performing the action - * 2 argument is the target of the action - * 3 is a verb describing the action (e.g. punched, throwed, kicked, etc.) - * 4 is a tool with which the action was made (usually an item) - * 5 is any additional text, which will be appended to the rest of the log line - */ -/proc/log_combat(atom/user, atom/target, what_done, atom/object=null, addition=null) - var/ssource = key_name(user) - var/starget = key_name(target) - - var/mob/living/living_target = target - var/hp = istype(living_target) ? " (NEWHP: [living_target.health]) " : "" - - var/sobject = "" - if(object) - sobject = " with [object]" - var/saddition = "" - if(addition) - saddition = " [addition]" - - var/postfix = "[sobject][saddition][hp]" - - var/message = "has [what_done] [starget][postfix]" - user.log_message(message, LOG_ATTACK, color="red") - - if(user != target) - var/reverse_message = "has been [what_done] by [ssource][postfix]" - target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE) - -/** - * log_wound() is for when someone is *attacked* and suffers a wound. Note that this only captures wounds from damage, so smites/forced wounds aren't logged, as well as demotions like cuts scabbing over - * - * Note that this has no info on the attack that dealt the wound: information about where damage came from isn't passed to the bodypart's damaged proc. When in doubt, check the attack log for attacks at that same time - * TODO later: Add logging for healed wounds, though that will require some rewriting of healing code to prevent admin heals from spamming the logs. Not high priority - * - * Arguments: - * * victim- The guy who got wounded - * * suffered_wound- The wound, already applied, that we're logging. It has to already be attached so we can get the limb from it - * * dealt_damage- How much damage is associated with the attack that dealt with this wound. - * * dealt_wound_bonus- The wound_bonus, if one was specified, of the wounding attack - * * dealt_bare_wound_bonus- The bare_wound_bonus, if one was specified *and applied*, of the wounding attack. Not shown if armor was present - * * base_roll- Base wounding ability of an attack is a random number from 1 to (dealt_damage ** WOUND_DAMAGE_EXPONENT). This is the number that was rolled in there, before mods - */ -/proc/log_wound(atom/victim, datum/wound/suffered_wound, dealt_damage, dealt_wound_bonus, dealt_bare_wound_bonus, base_roll) - if(QDELETED(victim) || !suffered_wound) - return - var/message = "has suffered: [suffered_wound][suffered_wound.limb ? " to [suffered_wound.limb.name]" : null]"// maybe indicate if it's a promote/demote? - - if(dealt_damage) - message += " | Damage: [dealt_damage]" - // The base roll is useful since it can show how lucky someone got with the given attack. For example, dealing a cut - if(base_roll) - message += "(rolled [base_roll]/[dealt_damage ** WOUND_DAMAGE_EXPONENT])" - - if(dealt_wound_bonus) - message += " | WB: [dealt_wound_bonus]" - - if(dealt_bare_wound_bonus) - message += " | BWB: [dealt_bare_wound_bonus]" - - victim.log_message(message, LOG_ATTACK, color="blue") - - /atom/movable/proc/add_filter(name,priority,list/params) if(!filter_data) filter_data = list() @@ -1550,25 +1352,6 @@ /atom/proc/intercept_zImpact(atom/movable/AM, levels = 1) return FALSE -/**Returns the material composition of the atom. - * - * Used when recycling items, specifically to turn alloys back into their component mats. - * - * Exists because I'd need to add a way to un-alloy alloys or otherwise deal - * with people converting the entire stations material supply into alloys. - * - * Arguments: - * - flags: A set of flags determining how exactly the materials are broken down. - */ -/atom/proc/get_material_composition(breakdown_flags=NONE) - . = list() - var/list/cached_materials = custom_materials - for(var/mat in cached_materials) - var/datum/material/material = getmaterialref(mat) - var/list/material_comp = material.return_composition(cached_materials[material], breakdown_flags) - for(var/comp_mat in material_comp) - .[comp_mat] += material_comp[comp_mat] - ///Setter for the `density` variable to append behavior related to its changing. /atom/proc/set_density(new_value) SHOULD_CALL_PARENT(TRUE) @@ -1600,41 +1383,6 @@ /atom/proc/setClosed() return -/** - * Recursive getter method to return a list of all ghosts orbitting this atom - * - * This will work fine without manually passing arguments. - */ -/atom/proc/get_all_orbiters(list/processed, source = TRUE) - var/list/output = list() - if (!processed) - processed = list() - if (src in processed) - return output - if (!source) - output += src - processed += src - for (var/o in orbiters?.orbiters) - var/atom/atom_orbiter = o - output += atom_orbiter.get_all_orbiters(processed, source = FALSE) - return output - -///Sets the custom materials for an item. -/atom/proc/set_custom_materials(list/materials, multiplier = 1) - if(custom_materials) //Only runs if custom materials existed at first. Should usually be the case but check anyways - for(var/i in custom_materials) - var/datum/material/custom_material = i - custom_material.on_removed(src, material_flags) //Remove the current materials - - custom_materials = list() //Reset the list - - for(var/x in materials) - var/datum/material/custom_material = x - - - custom_material.on_applied(src, materials[custom_material] * multiplier, material_flags) - custom_materials[custom_material] += materials[x] * multiplier - ///Passes Stat Browser Panel clicks to the game and calls client click on an atom /atom/Topic(href, list/href_list) . = ..() diff --git a/code/game/atom/atom_invisibility.dm b/code/game/atom/atom_invisibility.dm new file mode 100644 index 000000000000..53fbe895817c --- /dev/null +++ b/code/game/atom/atom_invisibility.dm @@ -0,0 +1,72 @@ +// Index defines +#define INVISIBILITY_VALUE 1 +#define INVISIBILITY_PRIORITY 2 + +/atom + VAR_PRIVATE/list/invisibility_sources + VAR_PRIVATE/current_invisibility_priority = -INFINITY + +/atom/proc/RecalculateInvisibility() + PRIVATE_PROC(TRUE) + + if(!invisibility_sources) + current_invisibility_priority = -INFINITY + invisibility = initial(invisibility) + return + + var/highest_priority + var/list/highest_priority_invisibility_data + for(var/entry in invisibility_sources) + var/list/priority_data + if(islist(entry)) + priority_data = entry + else + priority_data = invisibility_sources[entry] + + var/priority = priority_data[INVISIBILITY_PRIORITY] + if(highest_priority > priority) // In the case of equal priorities, we use the last thing in the list so that more recent changes apply first + continue + + highest_priority = priority + highest_priority_invisibility_data = priority_data + + current_invisibility_priority = highest_priority + invisibility = highest_priority_invisibility_data[INVISIBILITY_VALUE] + +/** + * Sets invisibility according to priority. + * If you want to be able to undo the value you set back to what it would be otherwise, + * you should provide an id here and remove it using RemoveInvisibility(id) + */ +/atom/proc/SetInvisibility(desired_value, id, priority=0) + if(!invisibility_sources) + invisibility_sources = list() + + if(id) + invisibility_sources[id] = list(desired_value, priority) + else + invisibility_sources += list(list(desired_value, priority)) + + if(current_invisibility_priority > priority) + return + + RecalculateInvisibility() + +/// Removes the specified invisibility source from the tracker +/atom/proc/RemoveInvisibility(id) + if(!invisibility_sources) + return + + var/list/priority_data = invisibility_sources[id] + invisibility_sources -= id + + if(length(invisibility_sources) == 0) + invisibility_sources = null + + if(current_invisibility_priority > priority_data[INVISIBILITY_PRIORITY]) + return + + RecalculateInvisibility() + +#undef INVISIBILITY_VALUE +#undef INVISIBILITY_PRIORITY diff --git a/code/game/atom/atom_materials.dm b/code/game/atom/atom_materials.dm new file mode 100644 index 000000000000..e4536e5ede5c --- /dev/null +++ b/code/game/atom/atom_materials.dm @@ -0,0 +1,34 @@ +///Sets the custom materials for an item. +/atom/proc/set_custom_materials(list/materials, multiplier = 1) + if(custom_materials) //Only runs if custom materials existed at first. Should usually be the case but check anyways + for(var/i in custom_materials) + var/datum/material/custom_material = i + custom_material.on_removed(src, material_flags) //Remove the current materials + + custom_materials = list() //Reset the list + + for(var/x in materials) + var/datum/material/custom_material = x + + + custom_material.on_applied(src, materials[custom_material] * multiplier, material_flags) + custom_materials[custom_material] += materials[x] * multiplier + +/**Returns the material composition of the atom. + * + * Used when recycling items, specifically to turn alloys back into their component mats. + * + * Exists because I'd need to add a way to un-alloy alloys or otherwise deal + * with people converting the entire stations material supply into alloys. + * + * Arguments: + * - flags: A set of flags determining how exactly the materials are broken down. + */ +/atom/proc/get_material_composition(breakdown_flags=NONE) + . = list() + var/list/cached_materials = custom_materials + for(var/mat in cached_materials) + var/datum/material/material = getmaterialref(mat) + var/list/material_comp = material.return_composition(cached_materials[material], breakdown_flags) + for(var/comp_mat in material_comp) + .[comp_mat] += material_comp[comp_mat] diff --git a/code/game/atom/atom_orbit.dm b/code/game/atom/atom_orbit.dm new file mode 100644 index 000000000000..6b7a337164f3 --- /dev/null +++ b/code/game/atom/atom_orbit.dm @@ -0,0 +1,18 @@ +/** + * Recursive getter method to return a list of all ghosts orbitting this atom + * + * This will work fine without manually passing arguments. + */ +/atom/proc/get_all_orbiters(list/processed, source = TRUE) + var/list/output = list() + if (!processed) + processed = list() + if (src in processed) + return output + if (!source) + output += src + processed += src + for (var/o in orbiters?.orbiters) + var/atom/atom_orbiter = o + output += atom_orbiter.get_all_orbiters(processed, source = FALSE) + return output diff --git a/code/game/atom/atom_tool_acts.dm b/code/game/atom/atom_tool_acts.dm new file mode 100644 index 000000000000..f706ea21ebd7 --- /dev/null +++ b/code/game/atom/atom_tool_acts.dm @@ -0,0 +1,82 @@ +/** + * Tool behavior procedure. Redirects to tool-specific procs by default. + * + * You can override it to catch all tool interactions, for use in complex deconstruction procs. + * + * Must return parent proc ..() in the end if overridden + */ +/atom/proc/tool_act(mob/living/user, obj/item/tool, tool_type) + var/act_result + var/signal_result + + signal_result = SEND_SIGNAL(src, COMSIG_ATOM_TOOL_ACT(tool_type), user, tool) + if(signal_result & COMPONENT_BLOCK_TOOL_ATTACK) // The COMSIG_ATOM_TOOL_ACT signal is blocking the act + return TOOL_ACT_SIGNAL_BLOCKING + if(QDELETED(tool)) + return TRUE + + switch(tool_type) + if(TOOL_CROWBAR) + act_result = crowbar_act(user, tool) + if(TOOL_MULTITOOL) + act_result = multitool_act(user, tool) + if(TOOL_SCREWDRIVER) + act_result = screwdriver_act(user, tool) + if(TOOL_WRENCH) + act_result = wrench_act(user, tool) + if(TOOL_WIRECUTTER) + act_result = wirecutter_act(user, tool) + if(TOOL_WELDER) + act_result = welder_act(user, tool) + if(TOOL_ANALYZER) + act_result = analyzer_act(user, tool) + if(!act_result) + return + + if(. && tool.toolspeed < 1) //nice tool bro + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "nice_tool", /datum/mood_event/nice_tool) + + // A tooltype_act has completed successfully +// log_tool("[key_name(user)] used [tool] on [src] at [AREACOORD(src)]") + SEND_SIGNAL(tool, COMSIG_TOOL_ATOM_ACTED_PRIMARY(tool_type), src) + return TOOL_ACT_TOOLTYPE_SUCCESS + + +//! Tool-specific behavior procs. To be overridden in subtypes. +/// + +///Crowbar act +/atom/proc/crowbar_act(mob/living/user, obj/item/I) + return + +///Multitool act +/atom/proc/multitool_act(mob/living/user, obj/item/I) + return + +///Check if the multitool has an item in it's data buffer +/atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE) + if(!istype(I, /obj/item/multitool)) + if(user && !silent) + to_chat(user, span_warning("[I] has no data buffer!")) + return FALSE + return TRUE + +///Screwdriver act +/atom/proc/screwdriver_act(mob/living/user, obj/item/I) + SEND_SIGNAL(src, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), user, I) + +///Wrench act +/atom/proc/wrench_act(mob/living/user, obj/item/I) + return + +///Wirecutter act +/atom/proc/wirecutter_act(mob/living/user, obj/item/I) + return + +///Welder act +/atom/proc/welder_act(mob/living/user, obj/item/I) + return + +///Analyzer act +/atom/proc/analyzer_act(mob/living/user, obj/item/I) + return diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 99dc8e01778b..f1fe41b3dfc5 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -50,6 +50,9 @@ ///Internal holder for emissive blocker object, do not use directly use blocks_emissive var/atom/movable/emissive_blocker/em_block + ///Used for the calculate_adjacencies proc for icon smoothing. + var/can_be_unanchored = FALSE + /// The degree of thermal insulation that mobs in list/contents have from the external environment, between 0 and 1 var/contents_thermal_insulation = 0 /// The degree of pressure protection that mobs in list/contents have from the external environment, between 0 and 1 diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index fd481d935f78..f921a9adf129 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -1,10 +1,8 @@ /obj/machinery/bluespace_beacon - icon = 'icons/obj/objects.dmi' icon_state = "floor_beaconf" name = "bluespace gigabeacon" desc = "A device that draws power from bluespace and creates a permanent tracking beacon." - level = 1 // underfloor layer = LOW_OBJ_LAYER use_power = IDLE_POWER_USE idle_power_usage = 0 @@ -14,19 +12,14 @@ . = ..() var/turf/T = loc Beacon = new(T) - Beacon.invisibility = INVISIBILITY_MAXIMUM + Beacon.SetInvisibility(INVISIBILITY_MAXIMUM) - hide(T.intact) + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) /obj/machinery/bluespace_beacon/Destroy() QDEL_NULL(Beacon) return ..() -// update the invisibility and icon -/obj/machinery/bluespace_beacon/hide(intact) - invisibility = intact ? INVISIBILITY_MAXIMUM : 0 - updateicon() - // update the icon_state /obj/machinery/bluespace_beacon/proc/updateicon() var/state="floor_beacon" @@ -41,7 +34,7 @@ if(!Beacon) var/turf/T = loc Beacon = new(T) - Beacon.invisibility = INVISIBILITY_MAXIMUM + Beacon.SetInvisibility(INVISIBILITY_MAXIMUM) else if (Beacon.loc != loc) Beacon.forceMove(loc) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index f89e535290a8..1875ad8524df 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -118,13 +118,15 @@ name = "sandbags" desc = "Bags of sand. Self explanatory." icon = 'icons/obj/smooth_structures/sandbags.dmi' - icon_state = "sandbags" + icon_state = "sandbags-0" + base_icon_state = "sandbags" max_integrity = 280 proj_pass_rate = 20 pass_flags = LETPASSTHROW bar_material = SAND - smooth = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/barricade/sandbags, /turf/closed/wall, /turf/closed/wall/r_wall, /obj/structure/falsewall, /obj/structure/falsewall/reinforced, /turf/closed/wall/rust, /turf/closed/wall/r_wall/rust, /obj/structure/barricade/security) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SANDBAGS + canSmoothWith = SMOOTH_GROUP_SANDBAGS + SMOOTH_GROUP_SECURITY_BARRICADE + SMOOTH_GROUP_WALLS /obj/structure/barricade/sandbags/Initialize(mapload) . = ..() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index fcb931fa2f4a..7fa0e2fc3b70 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -151,7 +151,7 @@ ///Whether wires should all cut themselves when this door is broken. var/cut_wires_on_break = TRUE - flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1 + flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1 | HTML_USE_INITAL_ICON_1 rad_insulation = RAD_MEDIUM_INSULATION var/static/list/airlock_overlays = list() diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 6e14252d83cd..f26d53db9c00 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -27,7 +27,6 @@ set_codes() var/turf/T = loc - hide(T.intact) if(codes["patrol"]) if(!GLOB.navbeacons["[z]"]) GLOB.navbeacons["[z]"] = list() @@ -35,6 +34,8 @@ if(codes["delivery"]) GLOB.deliverybeacons += src GLOB.deliverybeacontags += location + + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) /obj/machinery/navbeacon/Destroy() if (GLOB.navbeacons["[z]"]) diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 2d536cadb7f6..a9d31fb3f18b 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -31,7 +31,8 @@ GLOBAL_LIST_EMPTY(telecomms_list) var/on = TRUE var/toggled = TRUE // Is it toggled on var/long_range_link = FALSE // Can you link it across Z levels or on the otherside of the map? (Relay & Hub) - var/hide = FALSE // Is it a hidden machine? + /// Is it a hidden machine? + var/hide = FALSE var/generates_heat = TRUE //yogs turn off tcomms generating heat var/heatoutput = 2500 //yogs modify power output per trafic removed(usual heat capacity of the air in server room is 1600J/K) diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index f06d0b4be554..d0540c13aebf 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -130,7 +130,7 @@ return // Deny placing posters on currently-diagonal walls, although the wall may change in the future. - if (smooth & SMOOTH_DIAGONAL) + if (smoothing_flags & SMOOTH_DIAGONAL_CORNERS) for (var/O in overlays) var/image/I = O if(copytext(I.icon_state, 1, 3) == "d-") //3 == length("d-") + 1 @@ -169,7 +169,7 @@ /turf/closed/proc/place_borg_poster(obj/item/wantedposterposter/P, mob/user) // Deny placing posters on currently-diagonal walls, although the wall may change in the future. - if (smooth & SMOOTH_DIAGONAL) + if (smoothing_flags & SMOOTH_DIAGONAL_CORNERS) for (var/O in overlays) var/image/I = O if (copytext(I.icon_state, 1, 3) == "d-") diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index b3260fd51c58..7eef9e32d3e1 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -48,23 +48,25 @@ /obj/effect/decal/cleanable/dirt name = "dirt" desc = "Someone should clean that up." - icon_state = "dirt" - canSmoothWith = list(/obj/effect/decal/cleanable/dirt, /turf/closed/wall, /obj/structure/falsewall) - smooth = SMOOTH_FALSE + icon_state = "dirt-flat-0" + base_icon_state = "dirt" mouse_opacity = MOUSE_OPACITY_TRANSPARENT + smoothing_flags = NONE + smoothing_groups = SMOOTH_GROUP_CLEANABLE_DIRT + canSmoothWith = SMOOTH_GROUP_CLEANABLE_DIRT + SMOOTH_GROUP_WALLS /obj/effect/decal/cleanable/dirt/Initialize(mapload) . = ..() var/turf/T = get_turf(src) if(T.tiled_dirt) - smooth = SMOOTH_MORE - icon = 'icons/effects/dirt.dmi' - icon_state = "" - queue_smooth(src) - queue_smooth_neighbors(src) + smoothing_flags = SMOOTH_BITMASK + QUEUE_SMOOTH(src) + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH_NEIGHBORS(src) /obj/effect/decal/cleanable/dirt/Destroy() - queue_smooth_neighbors(src) + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH_NEIGHBORS(src) return ..() /obj/effect/decal/cleanable/dirt/dust @@ -241,4 +243,4 @@ /obj/effect/decal/cleanable/dirt_siding/corner name = "dirt corner" - icon_state = "dirt_side_corner" \ No newline at end of file + icon_state = "dirt_side_corner" diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm index ca003178d8da..5621a07d5f1a 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm @@ -88,8 +88,7 @@ if(object == src) continue if(isturf(object.loc)) - var/turf/turf = object.loc - if(turf.intact && object.level == 1) //hidden under the floor + if(turf_location.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && HAS_TRAIT(object, TRAIT_T_RAY_VISIBLE)) continue reagents.reaction(object, TOUCH|VAPOR, fraction) diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm index 030d78c8d201..585fe1433621 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm @@ -370,7 +370,7 @@ for(var/atom/movable/thing as anything in location) if(thing == src) continue - if(location.intact && thing.level == 1) //hidden under the floor + if(location.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && HAS_TRAIT(thing, TRAIT_T_RAY_VISIBLE)) continue reagents.reaction(thing, TOUCH, fraction) diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm index 516b1d299030..d6ec1ef6c373 100644 --- a/code/game/objects/items/devices/pressureplates.dm +++ b/code/game/objects/items/devices/pressureplates.dm @@ -32,7 +32,7 @@ sigdev.code = roundstart_signaller_code sigdev.frequency = roundstart_signaller_freq if(isopenturf(loc)) - hide(TRUE) + AddElement(/datum/element/undertile, tile_overlay = tile_overlay, use_anchor = TRUE) /obj/item/pressure_plate/Crossed(atom/movable/AM) . = ..() diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index cd41be37a51b..9d8244d815de 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -319,6 +319,7 @@ /obj/item/storage/backpack/satchel/flat/Initialize(mapload) . = ..() + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE, INVISIBILITY_OBSERVER, use_anchor = TRUE) var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_combined_w_class = 15 STR.set_holdable(null, list(/obj/item/storage/backpack/satchel/flat)) //muh recursive backpacks) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 9dd4ff9c89a1..0cd9211a2323 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -12,16 +12,17 @@ if (!armor) armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) . = ..() - if(smooth) - queue_smooth(src) - queue_smooth_neighbors(src) - icon_state = "" + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH(src) + QUEUE_SMOOTH_NEIGHBORS(src) + if(smoothing_flags & SMOOTH_CORNERS) + icon_state = "" GLOB.cameranet.updateVisibility(src) /obj/structure/Destroy() GLOB.cameranet.updateVisibility(src) - if(smooth) - queue_smooth_neighbors(src) + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH_NEIGHBORS(src) return ..() /obj/structure/CanAllowThrough(atom/movable/mover, turf/target) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 8837107f9cb7..3de6b5a2b975 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -53,15 +53,16 @@ name = "resin" desc = "Looks like some kind of thick resin." icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi' - icon_state = "smooth" + icon_state = "resin_wall-0" + base_icon_state = "resin_wall" density = TRUE opacity = TRUE anchored = TRUE - canSmoothWith = list(/obj/structure/alien/resin) max_integrity = 200 - smooth = SMOOTH_TRUE - var/resintype = null CanAtmosPass = ATMOS_PASS_DENSITY + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_ALIEN_RESIN + canSmoothWith = SMOOTH_GROUP_ALIEN_RESIN /obj/structure/alien/resin/Initialize(mapload) @@ -77,9 +78,11 @@ name = "resin wall" desc = "Thick resin solidified into a wall." icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi' - icon_state = "smooth" //same as resin, but consistency ho! + icon_state = "resin_wall-0" + base_icon_state = "resin_wall" resintype = "wall" - canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane) + smoothing_groups = SMOOTH_GROUP_ALIEN_WALLS + SMOOTH_GROUP_ALIEN_RESIN + canSmoothWith = SMOOTH_GROUP_ALIEN_WALLS /obj/structure/alien/resin/wall/BlockThermalConductivity() return 1 @@ -88,11 +91,13 @@ name = "resin membrane" desc = "Resin just thin enough to let light pass through." icon = 'icons/obj/smooth_structures/alien/resin_membrane.dmi' - icon_state = "smooth" + icon_state = "resin_membrane-0" + base_icon_state = "resin_membrane" opacity = FALSE max_integrity = 160 resintype = "membrane" - canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane) + smoothing_groups = SMOOTH_GROUP_ALIEN_WALLS + SMOOTH_GROUP_ALIEN_RESIN + canSmoothWith = SMOOTH_GROUP_ALIEN_WALLS /obj/structure/alien/resin/attack_paw(mob/user) return attack_hand(user) @@ -113,8 +118,10 @@ plane = FLOOR_PLANE icon_state = "weeds" max_integrity = 15 - canSmoothWith = list(/obj/structure/alien/weeds, /turf/closed/wall) - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_ALIEN_WEEDS + SMOOTH_GROUP_ALIEN_RESIN + canSmoothWith = SMOOTH_GROUP_ALIEN_WEEDS + SMOOTH_GROUP_WALLS + var/last_expand = 0 //last world.time this weed expanded var/growth_cooldown_low = 150 var/growth_cooldown_high = 200 diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 0b6c2335a185..53970143aebe 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -6,7 +6,9 @@ icon = 'icons/obj/smooth_structures/alien/nest.dmi' icon_state = "nest" max_integrity = 120 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_ALIEN_NEST + canSmoothWith = SMOOTH_GROUP_ALIEN_NEST can_be_unanchored = FALSE canSmoothWith = null buildstacktype = null diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 0cf459dc0c7f..f38b820b249b 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -4,8 +4,9 @@ icon = 'icons/obj/smooth_structures/catwalk.dmi' icon_state = "catwalk" number_of_rods = 2 - smooth = SMOOTH_TRUE - canSmoothWith = null + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_CATWALK + SMOOTH_GROUP_LATTICE + SMOOTH_GROUP_OPEN_FLOOR + canSmoothWith = SMOOTH_GROUP_CATWALK obj_flags = CAN_BE_HIT /obj/structure/lattice/catwalk/Initialize(mapload) @@ -49,12 +50,9 @@ /obj/structure/lattice/catwalk/clockwork name = "clockwork catwalk" icon = 'icons/obj/smooth_structures/catwalk_clockwork.dmi' - canSmoothWith = list(/obj/structure/lattice, - /turf/open/floor, - /turf/open/indestructible/clock_spawn_room, - /turf/closed/wall, - /obj/structure/falsewall) - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_CATWALK + SMOOTH_GROUP_LATTICE + SMOOTH_GROUP_OPEN_FLOOR + canSmoothWith = SMOOTH_GROUP_CATWALK /obj/structure/lattice/catwalk/clockwork/Initialize(mapload) . = ..() diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 3ca29103d44a..5ae78e1c9da2 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -11,21 +11,13 @@ density = TRUE opacity = TRUE max_integrity = 100 - - canSmoothWith = list( - /turf/closed/wall, - /turf/closed/wall/r_wall, - /obj/structure/falsewall, - /obj/structure/falsewall/brass, - /obj/structure/falsewall/reinforced, - /turf/closed/wall/rust, - /turf/closed/wall/r_wall/rust, - /turf/closed/wall/clockwork) - smooth = SMOOTH_TRUE - can_be_unanchored = FALSE - CanAtmosPass = ATMOS_PASS_DENSITY flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1 + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_WALLS + CanAtmosPass = ATMOS_PASS_DENSITY rad_insulation = RAD_MEDIUM_INSULATION + var/mineral = /obj/item/stack/sheet/metal var/mineral_amount = 2 var/walltype = /turf/closed/wall @@ -70,22 +62,24 @@ update_appearance(UPDATE_ICON) air_update_turf() -/obj/structure/falsewall/update_icon_state() +/obj/structure/falsewall/update_icon(updates=ALL)//Calling icon_update will refresh the smoothwalls if it's closed, otherwise it will make sure the icon is correct if it's open . = ..() + if(!density || !(updates & UPDATE_SMOOTHING)) + return + if(opening) - if(density) - icon_state = "fwall_opening" - smooth = SMOOTH_FALSE - clear_smooth_overlays() - else - icon_state = "fwall_closing" + smoothing_flags = NONE + clear_smooth_overlays() else - if(density) - icon_state = initial(icon_state) - smooth = SMOOTH_TRUE - queue_smooth(src) - else - icon_state = "fwall_open" + smoothing_flags = SMOOTH_BITMASK + QUEUE_SMOOTH(src) + +/obj/structure/falsewall/update_icon_state() + if(opening) + icon_state = "fwall_[density ? "opening" : "closing"]" + return ..() + icon_state = density ? "[base_icon_state]-[smoothing_junction]" : "fwall_open" + return ..() /obj/structure/falsewall/proc/ChangeToWall(delete = 1) var/turf/T = get_turf(src) @@ -183,12 +177,15 @@ name = "uranium wall" desc = "A wall with uranium plating. This is probably a bad idea." icon = 'icons/turf/walls/uranium_wall.dmi' - icon_state = "uranium" + icon_state = "uranium_wall-0" + base_icon_state = "uranium_wall" mineral = /obj/item/stack/sheet/mineral/uranium walltype = /turf/closed/wall/mineral/uranium + smoothing_groups = SMOOTH_GROUP_URANIUM_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_URANIUM_WALLS + var/active = null var/last_event = 0 - canSmoothWith = list(/obj/structure/falsewall/uranium, /turf/closed/wall/mineral/uranium) /obj/structure/falsewall/uranium/attackby(obj/item/W, mob/user, params) radiate() @@ -217,38 +214,50 @@ name = "gold wall" desc = "A wall with gold plating. Swag!" icon = 'icons/turf/walls/gold_wall.dmi' - icon_state = "gold" + icon_state = "gold_wall-0" + base_icon_state = "gold_wall" mineral = /obj/item/stack/sheet/mineral/gold walltype = /turf/closed/wall/mineral/gold - canSmoothWith = list(/obj/structure/falsewall/gold, /turf/closed/wall/mineral/gold) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_GOLD_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_GOLD_WALLS /obj/structure/falsewall/silver name = "silver wall" desc = "A wall with silver plating. Shiny." icon = 'icons/turf/walls/silver_wall.dmi' - icon_state = "silver" + icon_state = "silver_wall-0" + base_icon_state = "silver_wall" mineral = /obj/item/stack/sheet/mineral/silver walltype = /turf/closed/wall/mineral/silver - canSmoothWith = list(/obj/structure/falsewall/silver, /turf/closed/wall/mineral/silver) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SILVER_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_SILVER_WALLS /obj/structure/falsewall/diamond name = "diamond wall" desc = "A wall with diamond plating. You monster." icon = 'icons/turf/walls/diamond_wall.dmi' - icon_state = "diamond" + icon_state = "diamond_wall-0" + base_icon_state = "diamond_wall" mineral = /obj/item/stack/sheet/mineral/diamond walltype = /turf/closed/wall/mineral/diamond - canSmoothWith = list(/obj/structure/falsewall/diamond, /turf/closed/wall/mineral/diamond) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_DIAMOND_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_DIAMOND_WALLS max_integrity = 800 /obj/structure/falsewall/plasma name = "plasma wall" desc = "A wall with plasma plating. This is definitely a bad idea." icon = 'icons/turf/walls/plasma_wall.dmi' - icon_state = "plasma" + icon_state = "plasma_wall-0" + base_icon_state = "plasma_wall" mineral = /obj/item/stack/sheet/mineral/plasma walltype = /turf/closed/wall/mineral/plasma - canSmoothWith = list(/obj/structure/falsewall/plasma, /turf/closed/wall/mineral/plasma) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_PLASMA_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_PLASMA_WALLS /obj/structure/falsewall/plasma/attackby(obj/item/W, mob/user, params) if(W.is_hot() > 300) @@ -273,10 +282,13 @@ name = "bananium wall" desc = "A wall with bananium plating. Honk!" icon = 'icons/turf/walls/bananium_wall.dmi' - icon_state = "bananium" + icon_state = "bananium_wall-0" + base_icon_state = "bananium_wall" mineral = /obj/item/stack/sheet/mineral/bananium walltype = /turf/closed/wall/mineral/bananium - canSmoothWith = list(/obj/structure/falsewall/bananium, /turf/closed/wall/mineral/bananium) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_BANANIUM_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_BANANIUM_WALLS /obj/structure/falsewall/bananium/honk_act() return FALSE @@ -288,44 +300,56 @@ icon_state = "sandstone" mineral = /obj/item/stack/sheet/mineral/sandstone walltype = /turf/closed/wall/mineral/sandstone - canSmoothWith = list(/obj/structure/falsewall/sandstone, /turf/closed/wall/mineral/sandstone) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SANDSTONE_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_SANDSTONE_WALLS /obj/structure/falsewall/wood name = "wooden wall" desc = "A wall with wooden plating. Stiff." icon = 'icons/turf/walls/wood_wall.dmi' - icon_state = "wood" + icon_state = "wood_wall-0" + base_icon_state = "wood_wall" mineral = /obj/item/stack/sheet/mineral/wood walltype = /turf/closed/wall/mineral/wood - canSmoothWith = list(/obj/structure/falsewall/wood, /turf/closed/wall/mineral/wood) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WOOD_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_WOOD_WALLS /obj/structure/falsewall/bamboo name = "bamboo wall" desc = "A wall with bamboo finish. Zen." icon = 'icons/turf/walls/bamboo_wall.dmi' - icon_state = "bamboo" mineral = /obj/item/stack/sheet/mineral/bamboo walltype = /turf/closed/wall/mineral/bamboo - canSmoothWith = list(/obj/structure/falsewall/bamboo, /turf/closed/wall/mineral/bamboo) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_BAMBOO_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_BAMBOO_WALLS /obj/structure/falsewall/iron name = "rough metal wall" desc = "A wall with rough metal plating." icon = 'icons/turf/walls/iron_wall.dmi' - icon_state = "iron" + icon_state = "iron_wall-0" + base_icon_state = "iron_wall" mineral = /obj/item/stack/rods mineral_amount = 2 walltype = /turf/closed/wall/mineral/iron - canSmoothWith = list(/obj/structure/falsewall/iron, /turf/closed/wall/mineral/iron) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_IRON_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_IRON_WALLS /obj/structure/falsewall/abductor name = "alien wall" desc = "A wall with alien alloy plating." icon = 'icons/turf/walls/abductor_wall.dmi' - icon_state = "abductor" + icon_state = "abductor_wall-0" + base_icon_state = "abductor_wall" mineral = /obj/item/stack/sheet/mineral/abductor walltype = /turf/closed/wall/mineral/abductor - canSmoothWith = list(/obj/structure/falsewall/abductor, /turf/closed/wall/mineral/abductor) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_ABDUCTOR_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_ABDUCTOR_WALLS /obj/structure/falsewall/titanium name = "wall" @@ -334,8 +358,9 @@ icon_state = "shuttle" mineral = /obj/item/stack/sheet/mineral/titanium walltype = /turf/closed/wall/mineral/titanium - smooth = SMOOTH_MORE - canSmoothWith = list(/turf/closed/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_TITANIUM_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_TITANIUM_WALLS /obj/structure/falsewall/plastitanium name = "wall" @@ -344,20 +369,24 @@ icon_state = "shuttle" mineral = /obj/item/stack/sheet/mineral/plastitanium walltype = /turf/closed/wall/mineral/plastitanium - smooth = SMOOTH_MORE - canSmoothWith = list(/turf/closed/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_PLASTITANIUM_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_PLASTITANIUM_WALLS /obj/structure/falsewall/brass name = "clockwork wall" desc = "A huge chunk of warm metal. The clanging of machinery emanates from within." icon = 'icons/turf/walls/clockwork_wall.dmi' - icon_state = "clockwork_wall" + icon_state = "clockwork_wall-0" + base_icon_state = "clockwork_wall" resistance_flags = FIRE_PROOF | ACID_PROOF mineral_amount = 1 - canSmoothWith = list(/obj/effect/clockwork/overlay/wall, /obj/structure/falsewall/brass) girder_type = /obj/structure/destructible/clockwork/wall_gear/displaced walltype = /turf/closed/wall/clockwork mineral = /obj/item/stack/tile/brass + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_CLOCKWORK_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_CLOCKWORK_WALLS /obj/structure/falsewall/brass/New(loc) ..() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 57547fbedd0a..494ece9155b0 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -11,9 +11,7 @@ max_integrity = 50 integrity_failure = 20 appearance_flags = KEEP_TOGETHER - smooth = SMOOTH_TRUE can_be_unanchored = TRUE - canSmoothWith = list(/obj/structure/grille, /obj/structure/grille/broken) var/holes = 0 //bitflag var/rods_type = /obj/item/stack/rods var/rods_amount = 2 @@ -41,6 +39,14 @@ update_appearance(UPDATE_ICON) +/obj/structure/grille/update_appearance(updates) + if(QDELETED(src) || broken) + return + + . = ..() + if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))) + QUEUE_SMOOTH(src) + /obj/structure/grille/update_icon(updates=ALL) . = ..() if(QDELETED(src)) @@ -160,8 +166,6 @@ setAnchored(!anchored) user.visible_message(span_notice("[user] [anchored ? "fastens" : "unfastens"] [src]."), \ span_notice("You [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor.")) - queue_smooth(src) - queue_smooth_neighbors(src) return else if(istype(W, /obj/item/stack/rods) && broken) var/obj/item/stack/rods/R = W @@ -258,6 +262,8 @@ if(!in_range(src, user))//To prevent TK and mech users from getting shocked return FALSE var/turf/T = get_turf(src) + if(T.overfloor_placed)//cant be a floor in the way! + return FALSE var/obj/structure/cable/C = T.get_cable_node() if(C) if(electrocute_mob(user, C, src, 1, TRUE)) @@ -281,6 +287,8 @@ var/obj/O = AM if(O.throwforce != 0)//don't want to let people spam tesla bolts, this way it will break after time var/turf/T = get_turf(src) + if(T.overfloor_placed) + return FALSE var/obj/structure/cable/C = T.get_cable_node() if(C) playsound(src, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) @@ -312,7 +320,6 @@ name = "cog grille" desc = "A strangely-shaped grille." broken_type = /obj/structure/grille/ratvar/broken - smooth = SMOOTH_FALSE /obj/structure/grille/ratvar/Initialize(mapload) . = ..() diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 12e7af0c4aa6..43ddfe40434c 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -9,12 +9,10 @@ max_integrity = 50 layer = LATTICE_LAYER //under pipes plane = FLOOR_PLANE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_LATTICE + canSmoothWith = SMOOTH_GROUP_LATTICE + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_OPEN_FLOOR var/number_of_rods = 1 - canSmoothWith = list(/obj/structure/lattice, - /turf/open/floor, - /turf/closed/wall, - /obj/structure/falsewall) - smooth = SMOOTH_MORE // flags = CONDUCT_1 /obj/structure/lattice/examine(mob/user) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index c05798db10ab..027bf49a36df 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -304,7 +304,13 @@ /obj/structure/mineral_door/paperframe/Initialize(mapload) . = ..() - queue_smooth_neighbors(src) + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH_NEIGHBORS(src) + +/obj/structure/mineral_door/paperframe/Destroy() + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH_NEIGHBORS(src) + return ..() /obj/structure/mineral_door/paperframe/examine(mob/user) . = ..() @@ -334,7 +340,3 @@ return TRUE return ..() - -/obj/structure/mineral_door/paperframe/Destroy() - queue_smooth_neighbors(src) - return ..() diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 132df55d8472..0c2b3f61e0d1 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -242,5 +242,9 @@ FLOOR SAFES density = FALSE layer = LOW_OBJ_LAYER +/obj/structure/safe/floor/Initialize(mapload) + . = ..() + AddElement(/datum/element/undertile) + #undef SOUND_CHANCE #undef BROKEN_THRESHOLD diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index eba7e22e45ea..e7dc2d5b409c 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -21,6 +21,11 @@ anchored = TRUE layer = TABLE_LAYER pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.") + max_integrity = 100 + integrity_failure = 30 + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_TABLES + canSmoothWith = SMOOTH_GROUP_TABLES var/frame = /obj/structure/table_frame var/framestack = /obj/item/stack/rods var/buildstack = /obj/item/stack/sheet/metal @@ -28,10 +33,6 @@ var/buildstackamount = 1 var/framestackamount = 2 var/deconstruction_ready = 1 - max_integrity = 100 - integrity_failure = 30 - smooth = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/table, /obj/structure/table/reinforced) /obj/structure/table/Initialize(mapload) . = ..() @@ -79,9 +80,9 @@ /obj/structure/table/update_icon(updates=ALL) . = ..() - if(smooth) - queue_smooth(src) - queue_smooth_neighbors(src) + if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))) + QUEUE_SMOOTH(src) + QUEUE_SMOOTH_NEIGHBORS(src) /obj/structure/table/narsie_act() var/atom/A = loc @@ -331,15 +332,15 @@ name = "wooden table" desc = "Do not apply fire to this. Rumour says it burns easily." icon = 'icons/obj/smooth_structures/wood_table.dmi' - icon_state = "wood_table" + icon_state = "wood_table-0" + base_icon_state = "wood_table" frame = /obj/structure/table_frame/wood framestack = /obj/item/stack/sheet/mineral/wood buildstack = /obj/item/stack/sheet/mineral/wood resistance_flags = FLAMMABLE max_integrity = 70 - canSmoothWith = list(/obj/structure/table/wood, - /obj/structure/table/wood/poker, - /obj/structure/table/wood/bar) + smoothing_groups = SMOOTH_GROUP_WOOD_TABLES //Don't smooth with SMOOTH_GROUP_TABLES + canSmoothWith = SMOOTH_GROUP_WOOD_TABLES /obj/structure/table/wood/narsie_act(total_override = TRUE) if(!total_override) @@ -360,19 +361,12 @@ desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth." icon = 'icons/obj/structures.dmi' icon_state = "fancy_table" + base_icon_state = "fancy_table" frame = /obj/structure/table_frame framestack = /obj/item/stack/rods buildstack = /obj/item/stack/tile/carpet - canSmoothWith = list(/obj/structure/table/wood/fancy, - /obj/structure/table/wood/fancy/black, - /obj/structure/table/wood/fancy/exoticblue, - /obj/structure/table/wood/fancy/cyan, - /obj/structure/table/wood/fancy/exoticgreen, - /obj/structure/table/wood/fancy/orange, - /obj/structure/table/wood/fancy/exoticpurple, - /obj/structure/table/wood/fancy/red, - /obj/structure/table/wood/fancy/royalblack, - /obj/structure/table/wood/fancy/royalblue) + smoothing_groups = SMOOTH_GROUP_FANCY_WOOD_TABLES //Don't smooth with SMOOTH_GROUP_TABLES or SMOOTH_GROUP_WOOD_TABLES + canSmoothWith = SMOOTH_GROUP_FANCY_WOOD_TABLES var/smooth_icon = 'icons/obj/smooth_structures/fancy_table.dmi' // see Initialize(mapload) /obj/structure/table/wood/fancy/Initialize(mapload) @@ -434,10 +428,10 @@ name = "reinforced table" desc = "A reinforced version of the four legged table." icon = 'icons/obj/smooth_structures/reinforced_table.dmi' - icon_state = "r_table" + icon_state = "reinforced_table-0" + base_icon_state = "reinforced_table" deconstruction_ready = 0 buildstack = /obj/item/stack/sheet/plasteel - canSmoothWith = list(/obj/structure/table/reinforced, /obj/structure/table) max_integrity = 200 integrity_failure = 50 armor = list(MELEE = 10, BULLET = 30, LASER = 30, ENERGY = 100, BOMB = 20, BIO = 0, RAD = 0, FIRE = 80, ACID = 70) @@ -470,14 +464,16 @@ name = "brass table" desc = "A solid, slightly beveled brass table." icon = 'icons/obj/smooth_structures/brass_table.dmi' - icon_state = "brass_table" + icon_state = "brass_table-0" + base_icon_state = "brass_table" resistance_flags = FIRE_PROOF | ACID_PROOF frame = /obj/structure/table_frame/brass framestack = /obj/item/stack/tile/brass buildstack = /obj/item/stack/tile/brass framestackamount = 1 buildstackamount = 1 - canSmoothWith = list(/obj/structure/table/reinforced/brass, /obj/structure/table/bronze) + smoothing_groups = SMOOTH_GROUP_BRONZE_TABLES //Don't smooth with SMOOTH_GROUP_TABLES + canSmoothWith = SMOOTH_GROUP_BRONZE_TABLES /obj/structure/table/reinforced/brass/Initialize(mapload) . = ..() @@ -506,10 +502,12 @@ name = "bronze table" desc = "A solid table made out of bronze." icon = 'icons/obj/smooth_structures/brass_table.dmi' - icon_state = "brass_table" + icon_state = "brass_table-0" + base_icon_state = "brass_table" resistance_flags = FIRE_PROOF | ACID_PROOF buildstack = /obj/item/stack/tile/bronze - canSmoothWith = list(/obj/structure/table/reinforced/brass, /obj/structure/table/bronze) + smoothing_groups = SMOOTH_GROUP_BRONZE_TABLES //Don't smooth with SMOOTH_GROUP_TABLES + canSmoothWith = SMOOTH_GROUP_BRONZE_TABLES /obj/structure/table/bronze/tablepush(mob/living/user, mob/living/pushed_mob) ..() @@ -525,7 +523,9 @@ icon = 'icons/obj/surgery.dmi' icon_state = "optable" buildstack = /obj/item/stack/sheet/mineral/silver - smooth = SMOOTH_FALSE + smoothing_flags = NONE + smoothing_groups = null + canSmoothWith = null can_buckle = TRUE buckle_requires_restraints = TRUE diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index d4a01fd2a175..8981b4ce4e45 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -22,7 +22,6 @@ var/fulltile = FALSE var/glass_type = /obj/item/stack/sheet/glass var/glass_amount = 1 - var/mutable_appearance/crack_overlay var/real_explosion_block //ignore this, just use explosion_block var/breaksound = "shatter" var/hitsound = 'sound/effects/Glasshit.ogg' @@ -325,28 +324,24 @@ //This proc is used to update the icons of nearby windows. /obj/structure/window/proc/update_nearby_icons() - update_appearance(UPDATE_ICON) - if(smooth) - queue_smooth_neighbors(src) + update_appearance() + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH_NEIGHBORS(src) //merges adjacent full-tile windows into one /obj/structure/window/update_overlays() . = ..() - if(!QDELETED(src)) - if(!fulltile) - return - - var/ratio = obj_integrity / max_integrity - ratio = CEILING(ratio*4, 1) * 25 + if(QDELETED(src) || !fulltile) + return - if(smooth) - queue_smooth(src) + if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))) + QUEUE_SMOOTH(src) - cut_overlay(crack_overlay) - if(ratio > 75) - return - crack_overlay = mutable_appearance('icons/obj/structures.dmi', "damage[ratio]", -(layer+0.1)) - . += crack_overlay + var/ratio = obj_integrity / max_integrity + ratio = CEILING(ratio*4, 1) * 25 + if(ratio > 75) + return + . += mutable_appearance('icons/obj/structures.dmi', "damage[ratio]", -(layer+0.1)) /obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -631,8 +626,9 @@ max_integrity = 50 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smooth = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE glass_amount = 2 /obj/structure/window/fulltile/unanchored @@ -646,8 +642,9 @@ max_integrity = 300 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smooth = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE glass_amount = 2 /obj/structure/window/plasma/fulltile/unanchored @@ -662,7 +659,9 @@ max_integrity = 1000 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE glass_amount = 2 /obj/structure/window/plasma/reinforced/fulltile/unanchored @@ -671,14 +670,16 @@ /obj/structure/window/reinforced/fulltile icon = 'icons/obj/smooth_structures/reinforced_window.dmi' - icon_state = "r_window" + icon_state = "reinforced_window-0" + base_icon_state = "reinforced_window" dir = FULLTILE_WINDOW_DIR max_integrity = 150 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE state = RWINDOW_SECURE - canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) level = 3 glass_amount = 2 @@ -692,16 +693,17 @@ dir = FULLTILE_WINDOW_DIR fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smooth = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE level = 3 glass_amount = 2 /obj/structure/window/reinforced/fulltile/ice icon = 'icons/obj/smooth_structures/rice_window.dmi' - icon_state = "ice_window" + icon_state = "rice_window-0" + base_icon_state = "rice_window" max_integrity = 150 - canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) level = 3 glass_amount = 2 @@ -725,8 +727,9 @@ reinf = TRUE heat_resistance = 1600 armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 100) - smooth = SMOOTH_TRUE - canSmoothWith = null + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE explosion_block = 3 level = 3 glass_type = /obj/item/stack/sheet/titaniumglass @@ -755,8 +758,9 @@ reinf = TRUE heat_resistance = 1600 armor = list(MELEE = 40, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) - smooth = SMOOTH_TRUE - canSmoothWith = null + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM explosion_block = 3 damage_deflection = 21 //The same as reinforced plasma windows. level = 3 @@ -828,8 +832,9 @@ /obj/structure/window/reinforced/clockwork/fulltile icon_state = "clockwork_window" - smooth = SMOOTH_TRUE - canSmoothWith = null + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE_BRONZE + SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE_BRONZE fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 dir = FULLTILE_WINDOW_DIR @@ -862,8 +867,9 @@ max_integrity = 15 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smooth = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_PAPERFRAME + canSmoothWith = SMOOTH_GROUP_PAPERFRAME glass_amount = 2 glass_type = /obj/item/stack/sheet/paperframes heat_resistance = 233 @@ -906,26 +912,14 @@ user.visible_message(span_danger("[user] tears a hole in [src].")) update_appearance(UPDATE_ICON) -/obj/structure/window/paperframe/update_overlays() - . = ..() - if(obj_integrity < max_integrity) - cut_overlay(paper) - . += torn - set_opacity(FALSE) - else - cut_overlay(torn) - . += paper - set_opacity(TRUE) - queue_smooth(src) - /obj/structure/window/paperframe/update_appearance(updates) . = ..() set_opacity(obj_integrity >= max_integrity) /obj/structure/window/paperframe/update_icon(updates=ALL) . = ..() - if((updates & UPDATE_SMOOTHING) && (smooth & (SMOOTH_TRUE))) - queue_smooth(src) + if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))) + QUEUE_SMOOTH(src) /obj/structure/window/paperframe/update_overlays() . = ..() diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 9c110801ed2a..42e0702d2148 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -137,6 +137,12 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( for(var/turf/open/space/S in RANGE_TURFS(1, src)) //RANGE_TURFS is in code\__HELPERS\game.dm S.update_starlight() + + // only queue for smoothing if SSatom initialized us, and we'd be changing smoothing state + if(flags_1 & INITIALIZED_1) + QUEUE_SMOOTH_NEIGHBORS(src) + QUEUE_SMOOTH(src) + SSdemo.mark_turf(W) return W @@ -304,8 +310,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( for(var/obj/machinery/door/firedoor/FD in T) FD.CalculateAffectingAreas() - queue_smooth_neighbors(src) - HandleTurfChange(src) /turf/open/AfterChange(flags) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 114bcd368b51..8ecdb50ce129 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -54,7 +54,7 @@ icon = 'icons/turf/walls/sandstone_wall.dmi' icon_state = "sandstone" baseturfs = /turf/closed/indestructible/sandstone - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_BITMASK /turf/closed/indestructible/oldshuttle/corner icon_state = "corner" @@ -82,16 +82,21 @@ /turf/closed/indestructible/riveted icon = 'icons/turf/walls/riveted.dmi' icon_state = "riveted" - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS /turf/closed/indestructible/syndicate icon = 'icons/turf/walls/plastitanium_wall.dmi' icon_state = "map-shuttle" - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_SYNDICATE_WALLS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_PLASTITANIUM_WALLS + SMOOTH_GROUP_SYNDICATE_WALLS /turf/closed/indestructible/riveted/uranium icon = 'icons/turf/walls/uranium_wall.dmi' icon_state = "uranium" + smoothing_flags = SMOOTH_BITMASK /turf/closed/indestructible/abductor icon_state = "alien1" @@ -101,10 +106,12 @@ /turf/closed/indestructible/fakeglass name = "window" + icon = 'icons/obj/smooth_structures/reinforced_window.dmi' icon_state = "fake_window" opacity = FALSE - smooth = SMOOTH_TRUE - icon = 'icons/obj/smooth_structures/reinforced_window.dmi' + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE /turf/closed/indestructible/fakeglass/Initialize(mapload) . = ..() @@ -114,10 +121,12 @@ /turf/closed/indestructible/opsglass name = "window" + icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' icon_state = "plastitanium_window" opacity = FALSE - smooth = SMOOTH_TRUE - icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM /turf/closed/indestructible/opsglass/Initialize(mapload) . = ..() @@ -190,8 +199,11 @@ name = "necropolis wall" desc = "A thick, seemingly indestructible stone wall." icon = 'icons/turf/walls/boss_wall.dmi' - icon_state = "wall" - canSmoothWith = list(/turf/closed/indestructible/riveted/boss, /turf/closed/indestructible/riveted/boss/see_through) + icon_state = "boss_wall-0" + base_icon_state = "boss_wall" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_BOSS_WALLS + canSmoothWith = SMOOTH_GROUP_BOSS_WALLS explosion_block = 50 baseturfs = /turf/closed/indestructible/riveted/boss diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 82203455e9de..08be586b0c78 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -59,6 +59,8 @@ /turf/open/indestructible/plating name = "plating" icon_state = "plating" + overfloor_placed = FALSE + underfloor_accessibility = UNDERFLOOR_INTERACTABLE footstep = FOOTSTEP_PLATING barefootstep = FOOTSTEP_HARD_BAREFOOT clawfootstep = FOOTSTEP_HARD_CLAW @@ -103,8 +105,6 @@ desc = "Soft velvet carpeting. Feels good between your toes." icon = 'icons/turf/floors/carpet.dmi' icon_state = "carpet" - smooth = SMOOTH_TRUE - canSmoothWith = list(/turf/open/indestructible/carpet) flags_1 = NONE bullet_bounce_sound = null footstep = FOOTSTEP_CARPET @@ -112,6 +112,9 @@ clawfootstep = FOOTSTEP_CARPET_BAREFOOT heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = FALSE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET + canSmoothWith = SMOOTH_GROUP_CARPET /turf/open/indestructible/carpet/black icon = 'icons/turf/floors/carpet_black.dmi' @@ -145,9 +148,11 @@ name = "carpet" desc = "Soft velvet carpeting. Feels good between your toes." icon = 'icons/turf/floors/carpet_royalblue.dmi' - icon_state = "carpet" - smooth = SMOOTH_TRUE - canSmoothWith = list(/turf/open/indestructible/carpet/royal) + icon_state = "carpet-255" + base_icon_state = "carpet" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET + canSmoothWith = SMOOTH_GROUP_CARPET flags_1 = NONE bullet_bounce_sound = null footstep = FOOTSTEP_CARPET @@ -159,14 +164,20 @@ /turf/open/indestructible/carpet/royal/black icon = 'icons/turf/floors/carpet_royalblack.dmi' icon_state = "carpet" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLACK + canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLACK /turf/open/indestructible/carpet/royal/green icon = 'icons/turf/floors/carpet_exoticgreen.dmi' icon_state = "carpet" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_GREEN + canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_GREEN /turf/open/indestructible/carpet/royal/purple icon = 'icons/turf/floors/carpet_exoticpurple.dmi' icon_state = "carpet" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_PURPLE + canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_PURPLE /turf/open/indestructible/grass name = "grass patch" @@ -337,7 +348,7 @@ icon = 'icons/turf/floors/hierophant_floor.dmi' initial_gas_mix = LAVALAND_DEFAULT_ATMOS baseturfs = /turf/open/indestructible/hierophant - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS tiled_dirt = FALSE /turf/open/indestructible/hierophant/two @@ -453,10 +464,11 @@ icon_state = "necro[rand(2,3)]" /turf/open/indestructible/brazil/lostit - smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE - canSmoothWith = list(/turf/open/indestructible/brazil/lostit) icon = 'yogstation/icons/turf/floors/ballpit_smooth.dmi' icon_state = "smooth" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_BRAZIL + canSmoothWith = SMOOTH_GROUP_BRAZIL /turf/open/indestructible/wiki light_range = 2 diff --git a/code/game/turfs/openspace/openspace.dm b/code/game/turfs/openspace/openspace.dm index 5a06c4bc2234..e6f1914a01c8 100644 --- a/code/game/turfs/openspace/openspace.dm +++ b/code/game/turfs/openspace/openspace.dm @@ -3,6 +3,8 @@ desc = "Watch your step!" icon_state = "grey" baseturfs = /turf/open/openspace + overfloor_placed = FALSE + underfloor_accessibility = UNDERFLOOR_INTERACTABLE CanAtmosPassVertical = ATMOS_PASS_YES flags_1 = NO_RUST //mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 482a7a9a7a7e..391a751f4d67 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -2,11 +2,13 @@ /turf/open/chasm name = "chasm" desc = "Watch your step." - baseturfs = /turf/open/chasm - smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE icon = 'icons/turf/floors/chasms.dmi' - icon_state = "smooth" - canSmoothWith = list(/turf/open/floor/fakepit, /turf/open/chasm) + icon_state = "chasms-255" + base_icon_state = "chasms" + baseturfs = /turf/open/chasm + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_TURF_CHASM + canSmoothWith = SMOOTH_GROUP_TURF_CHASM density = TRUE //This will prevent hostile mobs from pathing into chasms, while the canpass override will still let it function like an open turf bullet_bounce_sound = null //abandon all hope ye who enter diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 676b6d1bc154..78e1f3d209ac 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -11,20 +11,23 @@ clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY + overfloor_placed = TRUE + + thermal_conductivity = 0.040 + heat_capacity = 10000 + + tiled_dirt = TRUE + var/icon_state_regular_floor = "floor" //used to remember what icon state the tile should have by default var/icon_regular_floor = 'icons/turf/floors.dmi' //used to remember what icon the tile should have by default var/icon_plating = "plating" - thermal_conductivity = 0.040 - heat_capacity = 10000 - intact = 1 + var/broken = 0 var/burnt = 0 var/floor_tile = null //tile that this floor drops var/list/broken_states var/list/burnt_states - tiled_dirt = TRUE - /turf/open/floor/Initialize(mapload) if (!broken_states) @@ -110,8 +113,7 @@ /turf/open/floor/is_shielded() for(var/obj/structure/A in contents) - if(A.level == 3) - return 1 + return 1 /turf/open/floor/blob_act(obj/structure/blob/B) return @@ -168,20 +170,25 @@ W.update_appearance(UPDATE_ICON) return W -/turf/open/floor/attackby(obj/item/C, mob/user, params) - if(!C || !user) - return 1 - if(..()) - return 1 - if(intact && istype(C, /obj/item/stack/tile)) - try_replace_tile(C, user, params) - return 0 +/turf/open/floor/attackby(obj/item/object, mob/living/user, params) + if(!object || !user) + return TRUE + . = ..() + if(.) + return . + if(overfloor_placed && istype(object, /obj/item/stack/tile)) + try_replace_tile(object, user, params) + return TRUE + if(underfloor_accessibility >= UNDERFLOOR_INTERACTABLE && istype(object, /obj/item/stack/tile)) + try_replace_tile(object, user, params) + return FALSE /turf/open/floor/crowbar_act(mob/living/user, obj/item/I) if(istype(I,/obj/item/jawsoflife/jimmy)) to_chat(user,"The [I] cannot pry tiles.") return - return intact ? pry_tile(I, user) : FALSE + if(overfloor_placed && pry_tile(I, user)) + return TRUE /turf/open/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params) if(T.turf_type == type) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index c6ec1637b061..626efd2584bd 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -223,8 +223,9 @@ icon_state = "bamboo" floor_tile = /obj/item/stack/tile/bamboo broken_states = list("damaged") - smooth = SMOOTH_TRUE - canSmoothWith = list(/turf/open/floor/bamboo) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_BAMBOO_FLOOR + canSmoothWith = SMOOTH_GROUP_BAMBOO_FLOOR flags_1 = NONE footstep = FOOTSTEP_WOOD barefootstep = FOOTSTEP_WOOD_BAREFOOT @@ -338,8 +339,9 @@ icon_state = "carpet" floor_tile = /obj/item/stack/tile/carpet broken_states = list("damaged") - smooth = SMOOTH_TRUE - canSmoothWith = list(/turf/open/floor/carpet) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET + canSmoothWith = SMOOTH_GROUP_CARPET flags_1 = NONE bullet_bounce_sound = null footstep = FOOTSTEP_CARPET @@ -359,15 +361,15 @@ /turf/open/floor/carpet/update_icon(updates=ALL) . = ..() - if(!.) - return 0 + if(!. || !(updates & UPDATE_SMOOTHING)) + return if(!broken && !burnt) - if(smooth) - queue_smooth(src) + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH(src) else make_plating() - if(smooth) - queue_smooth_neighbors(src) + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH_NEIGHBORS(src) /turf/open/floor/carpet/broken icon_state = "damaged" @@ -375,8 +377,11 @@ /turf/open/floor/carpet/black icon = 'icons/turf/floors/carpet_black.dmi' + icon_state = "carpet_black-255" + base_icon_state = "carpet_black" floor_tile = /obj/item/stack/tile/carpet/black - canSmoothWith = list(/turf/open/floor/carpet/black) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLACK + canSmoothWith = SMOOTH_GROUP_CARPET_BLACK /turf/open/floor/carpet/black/broken icon_state = "damaged" @@ -384,8 +389,11 @@ /turf/open/floor/carpet/exoticblue icon = 'icons/turf/floors/carpet_exoticblue.dmi' + icon_state = "carpet_blue-255" + base_icon_state = "carpet_blue" floor_tile = /obj/item/stack/tile/carpet/exoticblue - canSmoothWith = list(/turf/open/floor/carpet/exoticblue) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLUE + canSmoothWith = SMOOTH_GROUP_CARPET_BLUE /turf/open/floor/carpet/exoticblue/broken icon_state = "damaged" @@ -393,8 +401,11 @@ /turf/open/floor/carpet/cyan icon = 'icons/turf/floors/carpet_cyan.dmi' + icon_state = "carpet_cyan-255" + base_icon_state = "carpet_cyan" floor_tile = /obj/item/stack/tile/carpet/cyan - canSmoothWith = list(/turf/open/floor/carpet/cyan) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_CYAN + canSmoothWith = SMOOTH_GROUP_CARPET_CYAN /turf/open/floor/carpet/cyan/broken icon_state = "damaged" @@ -402,8 +413,11 @@ /turf/open/floor/carpet/exoticgreen icon = 'icons/turf/floors/carpet_exoticgreen.dmi' + icon_state = "carpet_green-255" + base_icon_state = "carpet_green" floor_tile = /obj/item/stack/tile/carpet/exoticgreen - canSmoothWith = list(/turf/open/floor/carpet/exoticgreen) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_GREEN + canSmoothWith = SMOOTH_GROUP_CARPET_GREEN /turf/open/floor/carpet/exoticgreen/broken icon_state = "damaged" @@ -411,8 +425,11 @@ /turf/open/floor/carpet/orange icon = 'icons/turf/floors/carpet_orange.dmi' + icon_state = "carpet_orange-255" + base_icon_state = "carpet_orange" floor_tile = /obj/item/stack/tile/carpet/orange - canSmoothWith = list(/turf/open/floor/carpet/orange) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ORANGE + canSmoothWith = SMOOTH_GROUP_CARPET_ORANGE /turf/open/floor/carpet/orange/broken icon_state = "damaged" @@ -420,8 +437,11 @@ /turf/open/floor/carpet/exoticpurple icon = 'icons/turf/floors/carpet_exoticpurple.dmi' + icon_state = "carpet_purple-255" + base_icon_state = "carpet_purple" floor_tile = /obj/item/stack/tile/carpet/exoticpurple - canSmoothWith = list(/turf/open/floor/carpet/exoticpurple) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_PURPLE + canSmoothWith = SMOOTH_GROUP_CARPET_PURPLE /turf/open/floor/carpet/exoticpurple/broken icon_state = "damaged" @@ -429,8 +449,11 @@ /turf/open/floor/carpet/red icon = 'icons/turf/floors/carpet_red.dmi' + icon_state = "carpet_red-255" + base_icon_state = "carpet_red" floor_tile = /obj/item/stack/tile/carpet/red - canSmoothWith = list(/turf/open/floor/carpet/red) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_RED + canSmoothWith = SMOOTH_GROUP_CARPET_RED /turf/open/floor/carpet/red/broken icon_state = "damaged" @@ -438,8 +461,11 @@ /turf/open/floor/carpet/royalblack icon = 'icons/turf/floors/carpet_royalblack.dmi' + icon_state = "carpet_royalblack-255" + base_icon_state = "carpet_royalblack" floor_tile = /obj/item/stack/tile/carpet/royalblack - canSmoothWith = list(/turf/open/floor/carpet/royalblack) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLACK + canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLACK /turf/open/floor/carpet/royalblack/broken icon_state = "damaged" @@ -447,8 +473,11 @@ /turf/open/floor/carpet/royalblue icon = 'icons/turf/floors/carpet_royalblue.dmi' + icon_state = "carpet_royalblue-255" + base_icon_state = "carpet_royalblue" floor_tile = /obj/item/stack/tile/carpet/royalblue - canSmoothWith = list(/turf/open/floor/carpet/royalblue) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLUE + canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLUE /turf/open/floor/carpet/royalblue/broken icon_state = "damaged" @@ -477,10 +506,12 @@ /turf/open/floor/fakepit desc = "A clever illusion designed to look like a bottomless pit." - smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE - canSmoothWith = list(/turf/open/floor/fakepit) icon = 'icons/turf/floors/Chasms.dmi' - icon_state = "smooth" + icon_state = "chasms-0" + base_icon_state = "chasms" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_TURF_CHASM + canSmoothWith = SMOOTH_GROUP_TURF_CHASM tiled_dirt = FALSE /turf/open/floor/fakepit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm index d13d418043dc..e1d29e00f9e8 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -196,10 +196,12 @@ /turf/open/floor/mineral/plastitanium/red/brig/fakepit name = "brig chasm" desc = "A place for very naughy criminals." - smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE - canSmoothWith = list(/turf/open/floor/mineral/plastitanium/red/brig/fakepit) icon = 'icons/turf/floors/Chasms.dmi' - icon_state = "smooth" + icon_state = "chasms-0" + base_icon_state = "chasms" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_TURF_CHASM + canSmoothWith = SMOOTH_GROUP_TURF_CHASM tiled_dirt = FALSE //BANANIUM diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 5fdd9fa14468..973c922c0cf0 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -10,7 +10,8 @@ /turf/open/floor/plating name = "plating" icon_state = "plating" - intact = FALSE + overfloor_placed = FALSE + underfloor_accessibility = UNDERFLOOR_INTERACTABLE baseturfs = /turf/baseturf_bottom footstep = FOOTSTEP_PLATING barefootstep = FOOTSTEP_HARD_BAREFOOT @@ -87,10 +88,9 @@ else if(istype(C, /obj/item/stack/tile) && !locate(/obj/structure/lattice/catwalk, src)) if(!broken && !burnt) for(var/obj/O in src) - if(O.level == 1) //ex. pipes laid underneath a tile - for(var/M in O.buckled_mobs) - to_chat(user, span_warning("Someone is buckled to \the [O]! Unbuckle [M] to move \him out of the way.")) - return + for(var/M in O.buckled_mobs) + to_chat(user, span_warning("Someone is buckled to \the [O]! Unbuckle [M] to move \him out of the way.")) + return var/obj/item/stack/tile/W = C if(!W.use(1)) return diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm index c3cae2da310b..fad5d6cbee5a 100644 --- a/code/game/turfs/simulated/floor/plating/misc_plating.dm +++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm @@ -39,8 +39,7 @@ gender = PLURAL name = "ash" icon_state = "ash" - smooth = SMOOTH_MORE|SMOOTH_BORDER - var/smooth_icon = 'icons/turf/floors/ash.dmi' + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER desc = "The ground is covered in volcanic ash." baseturfs = /turf/open/floor/plating/ashplanet/wateryrock //I assume this will be a chasm eventually, once this becomes an actual surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS @@ -52,13 +51,16 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = FALSE + var/smooth_icon = 'icons/turf/floors/ash.dmi' + /turf/open/floor/plating/ashplanet/Initialize(mapload) - if(smooth) + . = ..() + if(smoothing_flags & SMOOTH_BITMASK) var/matrix/M = new M.Translate(-4, -4) transform = M icon = smooth_icon - . = ..() + icon_state = "[icon_state]-[smoothing_junction]" /turf/open/floor/plating/ashplanet/try_replace_tile(obj/item/stack/tile/T, mob/user, params) return @@ -70,7 +72,8 @@ return /turf/open/floor/plating/ashplanet/ash - canSmoothWith = list(/turf/open/floor/plating/ashplanet/ash, /turf/closed) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_ASH + canSmoothWith = SMOOTH_GROUP_FLOOR_ASH + SMOOTH_GROUP_CLOSED_TURFS layer = HIGH_TURF_LAYER slowdown = 1 @@ -78,9 +81,11 @@ gender = PLURAL name = "rocky ground" icon_state = "rockyash" - smooth_icon = 'icons/turf/floors/rocky_ash.dmi' + base_icon_state = "rocky_ash" + icon = MAP_SWITCH('icons/turf/floors/rocky_ash.dmi', 'icons/turf/mining.dmi') layer = MID_TURF_LAYER - canSmoothWith = list(/turf/open/floor/plating/ashplanet/rocky, /turf/closed) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_ASH_ROCKY + canSmoothWith = SMOOTH_GROUP_FLOOR_ASH_ROCKY + SMOOTH_GROUP_CLOSED_TURFS footstep = FOOTSTEP_FLOOR barefootstep = FOOTSTEP_HARD_BAREFOOT clawfootstep = FOOTSTEP_HARD_CLAW @@ -89,8 +94,8 @@ /turf/open/floor/plating/ashplanet/wateryrock gender = PLURAL name = "wet rocky ground" - smooth = null icon_state = "wateryrock" + smoothing_flags = NONE slowdown = 2 footstep = FOOTSTEP_FLOOR barefootstep = FOOTSTEP_HARD_BAREFOOT @@ -196,9 +201,11 @@ return /turf/open/floor/plating/ice/smooth - icon_state = "smooth" - smooth = SMOOTH_MORE | SMOOTH_BORDER - canSmoothWith = list(/turf/open/floor/plating/ice/smooth, /turf/open/floor/plating/ice) + icon_state = "ice_turf-255" + base_icon_state = "ice_turf" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_ICE + canSmoothWith = SMOOTH_GROUP_FLOOR_ICE /turf/open/floor/plating/ice/colder initial_temperature = 140 @@ -237,11 +244,13 @@ initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120" /turf/open/floor/plating/snowed/smoothed - smooth = SMOOTH_MORE | SMOOTH_BORDER - canSmoothWith = list(/turf/open/floor/plating/snowed/smoothed, /turf/open/floor/plating/snowed) - planetary_atmos = TRUE icon = 'icons/turf/floors/snow_turf.dmi' - icon_state = "smooth" + icon_state = "snow_turf-0" + base_icon_state = "snow_turf" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_SNOWED + canSmoothWith = SMOOTH_GROUP_FLOOR_SNOWED + planetary_atmos = TRUE /turf/open/floor/plating/snowed/colder initial_temperature = 140 diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index 0a24d89e0e9e..da13fa2a09eb 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -17,6 +17,24 @@ clawfootstep = FOOTSTEP_LAVA heavyfootstep = FOOTSTEP_LAVA + /// The icon state that covers the lava bits of our turf + var/mask_state = "lava-lightmask" + +/turf/open/lava/update_overlays() + . = ..() + // We need a light overlay here because not every lava turf casts light, only the edge ones + var/mutable_appearance/light = mutable_appearance(mask_icon, mask_state, LIGHTING_PRIMARY_LAYER, src, LIGHTING_PLANE) + light.color = light_color + light.blend_mode = BLEND_ADD + . += light + // Mask away our light underlay, so things don't double stack + // This does mean if our light underlay DOESN'T look like the light we emit things will be wrong + // But that's rare, and I'm ok with that, quartering our light source count is useful + var/mutable_appearance/light_mask = mutable_appearance(mask_icon, mask_state, LIGHTING_MASK_LAYER, src, LIGHTING_PLANE) + light_mask.blend_mode = BLEND_MULTIPLY + light_mask.color = list(-1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,1, 1,1,1,0) + . += light_mask + /turf/open/lava/ex_act(severity, target) contents_explosion(severity, target) @@ -163,9 +181,16 @@ name = "lava" baseturfs = /turf/open/lava/smooth icon = 'icons/turf/floors/lava.dmi' - icon_state = "unsmooth" - smooth = SMOOTH_MORE | SMOOTH_BORDER - canSmoothWith = list(/turf/open/lava/smooth) + icon_state = "lava-255" + mask_state = "lava-255" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_LAVA + canSmoothWith = SMOOTH_GROUP_FLOOR_LAVA + +/turf/open/lava/smooth_icon() + . = ..() + mask_state = icon_state + update_appearance(~UPDATE_SMOOTHING) /turf/open/lava/smooth/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index b9e8d6521e16..bf740ed64582 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -2,10 +2,15 @@ /turf/closed/mineral //wall piece name = "rock" - icon = 'icons/turf/mining.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') icon_state = "rock" - var/smooth_icon = 'icons/turf/smoothrocks.dmi' - smooth = SMOOTH_MORE|SMOOTH_BORDER + + // This is static + // Done like this to avoid needing to make it dynamic and save cpu time + // 4 to the left, 4 down + transform = MAP_SWITCH(TRANSLATE_MATRIX(-4, -4), matrix()) + + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1 | NO_RUST canSmoothWith = null baseturfs = /turf/open/floor/plating/asteroid/airless @@ -25,12 +30,13 @@ var/hardness = 1 //how hard the material is, we'll have to have more powerful stuff if we want to blast harder materials. /turf/closed/mineral/Initialize(mapload) - if (!canSmoothWith) - canSmoothWith = list(/turf/closed/mineral, /turf/closed/indestructible) - var/matrix/M = new - M.Translate(-4, -4) - transform = M - icon = smooth_icon + var/static/list/smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_MINERAL_WALLS + var/static/list/canSmoothWith = SMOOTH_GROUP_MINERAL_WALLS + + // The cost of the list() being in the type def is very large for something as common as minerals + src.smoothing_groups = smoothing_groups + src.canSmoothWith = canSmoothWith + . = ..() if (mineralType && mineralAmt && spread && spreadChance) for(var/dir in GLOB.cardinals) @@ -46,7 +52,6 @@ return TRUE return ..() - /turf/closed/mineral/attackby(obj/item/I, mob/user, params) if (!user.IsAdvancedToolUser()) to_chat(usr, span_warning("You don't have the dexterity to do this!")) @@ -184,6 +189,9 @@ M.baseturfs = src.baseturfs src = M M.levelupdate() + else + src = T + T.levelupdate() /turf/closed/mineral/random/high_chance icon_state = "rock_highchance" @@ -205,11 +213,10 @@ /turf/closed/mineral/random/high_chance/snow name = "snowy mountainside" - icon = 'icons/turf/mining.dmi' - smooth_icon = 'icons/turf/walls/mountain_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/mountain_wall.dmi', 'icons/turf/mining.dmi') icon_state = "mountainrock" - smooth = SMOOTH_MORE|SMOOTH_BORDER - canSmoothWith = list (/turf/closed) + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS defer_change = TRUE environment_type = "snow" turf_type = /turf/open/floor/plating/asteroid/snow/icemoon @@ -263,7 +270,7 @@ /turf/closed/mineral/random/volcanic/hard name = "hardened basalt" icon_state = "rock_hard" - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') mineralChance = 15 hardness = 2 @@ -274,7 +281,7 @@ /turf/closed/mineral/random/volcanic/hard/harder name = "granite" icon_state = "rock" - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') color = "#eb9877" mineralChance = 20 hardness = 3 @@ -285,11 +292,10 @@ /turf/closed/mineral/random/snow name = "snowy mountainside" - icon = 'icons/turf/mining.dmi' - smooth_icon = 'icons/turf/walls/mountain_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/mountain_wall.dmi', 'icons/turf/mining.dmi') icon_state = "mountainrock" - smooth = SMOOTH_MORE|SMOOTH_BORDER - canSmoothWith = list (/turf/closed) + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS defer_change = TRUE environment_type = "snow" turf_type = /turf/open/floor/plating/asteroid/snow/icemoon @@ -354,11 +360,11 @@ defer_change = TRUE /turf/closed/mineral/iron/volcanic/hard - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/iron/volcanic/hard/harder - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') mineralAmt = 5 color = "#eb9877" hardness = 3 @@ -366,7 +372,7 @@ /turf/closed/mineral/iron/ice environment_type = "snow_cavern" icon_state = "icerock_iron" - smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice initial_gas_mix = FROZEN_ATMOS @@ -396,11 +402,11 @@ defer_change = TRUE /turf/closed/mineral/uranium/volcanic/hard - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/uranium/volcanic/hard/harder - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') mineralAmt = 5 color = "#eb9877" hardness = 3 @@ -408,7 +414,7 @@ /turf/closed/mineral/uranium/ice environment_type = "snow_cavern" icon_state = "icerock_Uranium" - smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice initial_gas_mix = FROZEN_ATMOS @@ -437,11 +443,11 @@ defer_change = TRUE /turf/closed/mineral/diamond/volcanic/hard - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/diamond/volcanic/hard/harder - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') mineralAmt = 5 color = "#eb9877" hardness = 3 @@ -449,7 +455,7 @@ /turf/closed/mineral/diamond/ice environment_type = "snow_cavern" icon_state = "icerock_diamond" - smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice initial_gas_mix = FROZEN_ATMOS @@ -478,11 +484,11 @@ defer_change = TRUE /turf/closed/mineral/gold/volcanic/hard - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/gold/volcanic/hard/harder - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') mineralAmt = 5 color = "#eb9877" hardness = 3 @@ -490,7 +496,7 @@ /turf/closed/mineral/gold/ice environment_type = "snow_cavern" icon_state = "icerock_gold" - smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice initial_gas_mix = FROZEN_ATMOS @@ -519,11 +525,11 @@ defer_change = TRUE /turf/closed/mineral/silver/volcanic/hard - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/silver/volcanic/hard/harder - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') mineralAmt = 5 color = "#eb9877" hardness = 3 @@ -531,7 +537,7 @@ /turf/closed/mineral/silver/ice environment_type = "snow_cavern" icon_state = "icerock_silver" - smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice initial_gas_mix = FROZEN_ATMOS @@ -560,11 +566,11 @@ defer_change = TRUE /turf/closed/mineral/titanium/volcanic/hard - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/titanium/volcanic/hard/harder - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') mineralAmt = 5 color = "#eb9877" hardness = 3 @@ -572,7 +578,7 @@ /turf/closed/mineral/titanium/ice environment_type = "snow_cavern" icon_state = "icerock_titanium" - smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice initial_gas_mix = FROZEN_ATMOS @@ -602,11 +608,11 @@ defer_change = TRUE /turf/closed/mineral/plasma/volcanic/hard - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/plasma/volcanic/hard/harder - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') mineralAmt = 5 color = "#eb9877" hardness = 3 @@ -614,7 +620,7 @@ /turf/closed/mineral/plasma/ice environment_type = "snow_cavern" icon_state = "icerock_plasma" - smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice initial_gas_mix = FROZEN_ATMOS @@ -639,7 +645,7 @@ /turf/closed/mineral/bananium/ice environment_type = "snow_cavern" icon_state = "icerock_Bananium" - smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice initial_gas_mix = FROZEN_ATMOS @@ -658,11 +664,11 @@ defer_change = TRUE /turf/closed/mineral/bananium/volcanic/hard - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/bananium/volcanic/hard/harder - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') mineralAmt = 3 color = "#eb9877" hardness = 3 @@ -682,11 +688,11 @@ defer_change = TRUE /turf/closed/mineral/bscrystal/volcanic/hard - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/bscrystal/volcanic/hard/harder - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') mineralAmt = 3 color = "#eb9877" hardness = 3 @@ -694,7 +700,7 @@ /turf/closed/mineral/bscrystal/ice environment_type = "snow_cavern" icon_state = "icerock_BScrystal" - smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice initial_gas_mix = FROZEN_ATMOS @@ -722,21 +728,20 @@ defer_change = TRUE /turf/closed/mineral/volcanic/lava_land_surface/hard - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/volcanic/lava_land_surface/hard/harder - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') color = "#eb9877" hardness = 3 /turf/closed/mineral/ash_rock //wall piece name = "rock" - icon = 'icons/turf/mining.dmi' - smooth_icon = 'icons/turf/walls/rock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/rock_wall.dmi', 'icons/turf/mining.dmi') icon_state = "rock2" - smooth = SMOOTH_MORE|SMOOTH_BORDER - canSmoothWith = list (/turf/closed) + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS baseturfs = /turf/open/floor/plating/ashplanet/wateryrock initial_gas_mix = LAVALAND_DEFAULT_ATMOS environment_type = "waste" @@ -750,11 +755,10 @@ /turf/closed/mineral/snowmountain name = "snowy mountainside" - icon = 'icons/turf/mining.dmi' - smooth_icon = 'icons/turf/walls/mountain_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/mountain_wall.dmi', 'icons/turf/mining.dmi') icon_state = "mountainrock" - smooth = SMOOTH_MORE|SMOOTH_BORDER - canSmoothWith = list (/turf/closed) + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS baseturfs = /turf/open/floor/plating/asteroid/snow initial_gas_mix = FROZEN_ATMOS environment_type = "snow" @@ -768,11 +772,10 @@ /turf/closed/mineral/snowmountain/cavern name = "ice cavern rock" - icon = 'icons/turf/mining.dmi' - smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') icon_state = "icerock" - smooth = SMOOTH_MORE|SMOOTH_BORDER - canSmoothWith = list (/turf/closed) + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS baseturfs = /turf/open/floor/plating/asteroid/snow/ice environment_type = "snow_cavern" turf_type = /turf/open/floor/plating/asteroid/snow/ice @@ -893,18 +896,18 @@ defer_change = TRUE /turf/closed/mineral/gibtonite/volcanic/hard - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/gibtonite/volcanic/hard/harder - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') color = "#eb9877" hardness = 3 /turf/closed/mineral/gibtonite/ice environment_type = "snow_cavern" icon_state = "icerock_Gibtonite" - smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice initial_gas_mix = FROZEN_ATMOS @@ -937,11 +940,11 @@ defer_change = TRUE /turf/closed/mineral/magmite/volcanic/hard - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/magmite/volcanic/hard/harder - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') color = "#eb9877" hardness = 3 @@ -960,11 +963,11 @@ /turf/closed/mineral/gem/volcanic/hard mineralAmt = 2 - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/gem/volcanic/hard/harder mineralAmt = 3 - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') color = "#eb9877" hardness = 3 diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index 5636dce78a18..95e80aaa101c 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -2,45 +2,57 @@ name = "mineral wall" desc = "This shouldn't exist" icon_state = "" + smoothing_flags = SMOOTH_BITMASK + canSmoothWith = null + var/last_event = 0 var/active = null - canSmoothWith = null - smooth = SMOOTH_TRUE /turf/closed/wall/mineral/gold name = "gold wall" desc = "A wall with gold plating. Swag!" icon = 'icons/turf/walls/gold_wall.dmi' - icon_state = "gold" + icon_state = "gold_wall-0" + base_icon_state = "gold_wall" sheet_type = /obj/item/stack/sheet/mineral/gold explosion_block = 0 //gold is a soft metal you dingus. - canSmoothWith = list(/turf/closed/wall/mineral/gold, /obj/structure/falsewall/gold) + smoothing_groups = SMOOTH_GROUP_GOLD_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_GOLD_WALLS /turf/closed/wall/mineral/silver name = "silver wall" desc = "A wall with silver plating. Shiny!" icon = 'icons/turf/walls/silver_wall.dmi' - icon_state = "silver" + icon_state = "silver_wall-0" + base_icon_state = "silver_wall" sheet_type = /obj/item/stack/sheet/mineral/silver - canSmoothWith = list(/turf/closed/wall/mineral/silver, /obj/structure/falsewall/silver) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SILVER_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_SILVER_WALLS /turf/closed/wall/mineral/diamond name = "diamond wall" desc = "A wall with diamond plating. You monster." icon = 'icons/turf/walls/diamond_wall.dmi' - icon_state = "diamond" + icon_state = "diamond_wall-0" + base_icon_state = "diamond_wall" sheet_type = /obj/item/stack/sheet/mineral/diamond slicing_duration = 400 //diamond wall takes twice as much time to slice explosion_block = 3 - canSmoothWith = list(/turf/closed/wall/mineral/diamond, /obj/structure/falsewall/diamond) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_DIAMOND_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_DIAMOND_WALLS /turf/closed/wall/mineral/bananium name = "bananium wall" desc = "A wall with bananium plating. Honk!" icon = 'icons/turf/walls/bananium_wall.dmi' - icon_state = "bananium" + icon_state = "bananium_wall-0" + base_icon_state = "bananium_wall" sheet_type = /obj/item/stack/sheet/mineral/bananium - canSmoothWith = list(/turf/closed/wall/mineral/bananium, /obj/structure/falsewall/bananium) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_BANANIUM_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_BANANIUM_WALLS /turf/closed/wall/mineral/bananium/honk_act() return FALSE @@ -49,19 +61,25 @@ name = "sandstone wall" desc = "A wall with sandstone plating. Rough." icon = 'icons/turf/walls/sandstone_wall.dmi' - icon_state = "sandstone" + icon_state = "sandstone_wall-0" + base_icon_state = "sandstone_wall" sheet_type = /obj/item/stack/sheet/mineral/sandstone explosion_block = 0 - canSmoothWith = list(/turf/closed/wall/mineral/sandstone, /obj/structure/falsewall/sandstone) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SANDSTONE_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_SANDSTONE_WALLS /turf/closed/wall/mineral/uranium article = "a" name = "uranium wall" desc = "A wall with uranium plating. This is probably a bad idea." icon = 'icons/turf/walls/uranium_wall.dmi' - icon_state = "uranium" + icon_state = "uranium_wall-0" + base_icon_state = "uranium_wall" sheet_type = /obj/item/stack/sheet/mineral/uranium - canSmoothWith = list(/turf/closed/wall/mineral/uranium, /obj/structure/falsewall/uranium) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_URANIUM_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_URANIUM_WALLS /turf/closed/wall/mineral/uranium/proc/radiate() if(!active) @@ -91,10 +109,13 @@ name = "plasma wall" desc = "A wall with plasma plating. This is definitely a bad idea." icon = 'icons/turf/walls/plasma_wall.dmi' - icon_state = "plasma" + icon_state = "plasma_wall-0" + base_icon_state = "plasma_wall" sheet_type = /obj/item/stack/sheet/mineral/plasma thermal_conductivity = 0.04 - canSmoothWith = list(/turf/closed/wall/mineral/plasma, /obj/structure/falsewall/plasma) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_PLASMA_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_PLASMA_WALLS rad_insulation = RAD_FULL_INSULATION /turf/closed/wall/mineral/plasma/attackby(obj/item/W, mob/user, params) @@ -130,20 +151,25 @@ name = "wooden wall" desc = "A wall with wooden plating. Stiff." icon = 'icons/turf/walls/wood_wall.dmi' - icon_state = "wood" + icon_state = "wood_wall-0" + base_icon_state = "wood_wall" sheet_type = /obj/item/stack/sheet/mineral/wood hardness = 70 explosion_block = 0 - canSmoothWith = list(/turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood, /turf/closed/wall/mineral/wood/nonmetal) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WOOD_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_WOOD_WALLS /turf/closed/wall/mineral/bamboo name = "bamboo wall" desc = "A wall with a bamboo finish." icon = 'icons/turf/walls/bamboo_wall.dmi' - icon_state = "bamboo" + icon_state = "wall-0" sheet_type = /obj/item/stack/sheet/mineral/bamboo hardness = 60 - canSmoothWith = list(/turf/closed/wall/mineral/bamboo, /obj/structure/falsewall/bamboo) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_BAMBOO_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_BAMBOO_WALLS /turf/closed/wall/mineral/wood/attackby(obj/item/W, mob/user) if(W.is_sharp() && W.force) @@ -159,22 +185,25 @@ desc = "A solidly wooden wall. It's a bit weaker than a wall made with metal." girder_type = /obj/structure/barricade/wooden hardness = 50 - canSmoothWith = list(/turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood, /turf/closed/wall/mineral/wood/nonmetal) /turf/closed/wall/mineral/iron name = "rough metal wall" desc = "A wall with rough metal plating." icon = 'icons/turf/walls/iron_wall.dmi' - icon_state = "iron" + icon_state = "iron_wall-0" + base_icon_state = "iron_wall" sheet_type = /obj/item/stack/rods sheet_amount = 5 - canSmoothWith = list(/turf/closed/wall/mineral/iron, /obj/structure/falsewall/iron) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_IRON_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_IRON_WALLS /turf/closed/wall/mineral/snow name = "packed snow wall" desc = "A wall made of densely packed snow blocks." icon = 'icons/turf/walls/snow_wall.dmi' - icon_state = "snow" + icon_state = "snow_wall-0" + base_icon_state = "snow_wall" hardness = 80 explosion_block = 0 slicing_duration = 30 @@ -188,12 +217,14 @@ name = "alien wall" desc = "A wall with alien alloy plating." icon = 'icons/turf/walls/abductor_wall.dmi' - icon_state = "abductor" - smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL + icon_state = "abductor_wall-0" + base_icon_state = "abductor_wall" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS + smoothing_groups = SMOOTH_GROUP_ABDUCTOR_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_ABDUCTOR_WALLS sheet_type = /obj/item/stack/sheet/mineral/abductor slicing_duration = 400 //alien wall takes twice as much time to slice explosion_block = 3 - canSmoothWith = list(/turf/closed/wall/mineral/abductor, /obj/structure/falsewall/abductor) /////////////////////Titanium walls///////////////////// @@ -201,21 +232,24 @@ name = "wall" desc = "A light-weight titanium wall used in shuttles." icon = 'icons/turf/walls/shuttle_wall.dmi' - icon_state = "map-shuttle" + icon_state = "shuttle_wall-0" + base_icon_state = "shuttle_wall" explosion_block = 3 flags_1 = CAN_BE_DIRTY_1 | CHECK_RICOCHET_1 sheet_type = /obj/item/stack/sheet/mineral/titanium - smooth = SMOOTH_MORE|SMOOTH_DIAGONAL - canSmoothWith = list(/turf/closed/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater, /obj/structure/falsewall/titanium) + smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS + smoothing_groups = SMOOTH_GROUP_TITANIUM_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_TITANIUM_WALLS /turf/closed/wall/mineral/titanium/nodiagonal - smooth = SMOOTH_MORE icon_state = "map-shuttle_nd" + base_icon_state = "shuttle_wall" + smoothing_flags = SMOOTH_BITMASK /turf/closed/wall/mineral/titanium/nosmooth icon = 'icons/turf/shuttle.dmi' icon_state = "wall" - smooth = SMOOTH_FALSE + smoothing_flags = NONE /turf/closed/wall/mineral/titanium/overspace icon_state = "map-overspace" @@ -248,15 +282,17 @@ name = "pod wall" desc = "An easily-compressable wall used for temporary shelter." icon = 'icons/turf/walls/survival_pod_walls.dmi' - icon_state = "smooth" - smooth = SMOOTH_MORE|SMOOTH_DIAGONAL - canSmoothWith = list(/turf/closed/wall/mineral/titanium/survival, /obj/machinery/door/airlock, /obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/shuttle, /obj/structure/shuttle/engine) + icon_state = "survival_pod_walls-0" + base_icon_state = "survival_pod_walls" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_TITANIUM_WALLS /turf/closed/wall/mineral/titanium/survival/nodiagonal - smooth = SMOOTH_MORE + smoothing_flags = SMOOTH_BITMASK /turf/closed/wall/mineral/titanium/survival/pod - canSmoothWith = list(/turf/closed/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod) + smoothing_groups = SMOOTH_GROUP_SURVIVAL_TITANIUM_POD + SMOOTH_GROUP_TITANIUM_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_SURVIVAL_TITANIUM_POD /////////////////////Plastitanium walls///////////////////// @@ -264,21 +300,24 @@ name = "wall" desc = "A durable wall made of an alloy of plasma and titanium." icon = 'icons/turf/walls/plastitanium_wall.dmi' - icon_state = "map-shuttle" + icon_state = "plastitanium_wall-0" + base_icon_state = "plastitanium_wall" explosion_block = 4 sheet_type = /obj/item/stack/sheet/mineral/plastitanium - smooth = SMOOTH_MORE|SMOOTH_DIAGONAL - canSmoothWith = list(/turf/closed/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plastitanium, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) + smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS + smoothing_groups = SMOOTH_GROUP_PLASTITANIUM_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_PLASTITANIUM_WALLS + SMOOTH_GROUP_SYNDICATE_WALLS rad_insulation = RAD_FULL_INSULATION /turf/closed/wall/mineral/plastitanium/nodiagonal - smooth = SMOOTH_MORE icon_state = "map-shuttle_nd" + base_icon_state = "plastitanium_wall" + smoothing_flags = SMOOTH_BITMASK /turf/closed/wall/mineral/plastitanium/nosmooth icon = 'icons/turf/shuttle.dmi' icon_state = "wall" - smooth = SMOOTH_FALSE + smoothing_flags = NONE /turf/closed/wall/mineral/plastitanium/overspace icon_state = "map-overspace" diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm index 3f6374a3668b..5e5cb5de0ba5 100644 --- a/code/game/turfs/simulated/wall/misc_walls.dm +++ b/code/game/turfs/simulated/wall/misc_walls.dm @@ -2,9 +2,10 @@ name = "runed metal wall" desc = "A cold metal wall engraved with indecipherable symbols. Studying them causes your head to pound." icon = 'icons/turf/walls/cult_wall.dmi' - icon_state = "cult" + icon_state = "cult_wall-0" + base_icon_state = "cult_wall" + smoothing_flags = SMOOTH_BITMASK canSmoothWith = null - smooth = SMOOTH_MORE sheet_type = /obj/item/stack/sheet/runed_metal sheet_amount = 1 girder_type = /obj/structure/girder/cult @@ -49,6 +50,8 @@ /turf/closed/wall/clockwork name = "clockwork wall" desc = "A huge chunk of warm metal. The clanging of machinery emanates from within." + icon_state = "clockwork_wall-0" + base_icon_state = "clockwork_wall" explosion_block = 3 hardness = 5 slicing_duration = 150 @@ -56,6 +59,10 @@ sheet_amount = 1 girder_type = /obj/structure/destructible/clockwork/wall_gear baseturfs = /turf/open/floor/clockwork/reebe + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_CLOCKWORK_WALLS + SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_CLOCKWORK_WALLS + var/heated var/obj/effect/clockwork/overlay/wall/realappearance diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 94e94e57333f..72db8935f8b0 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -194,14 +194,21 @@ /turf/closed/wall/r_wall/update_icon(updates=ALL) . = ..() if(d_state != INTACT) - smooth = SMOOTH_FALSE - clear_smooth_overlays() + smoothing_flags = NONE + return + if (!(updates & UPDATE_SMOOTHING)) + return + smoothing_flags = SMOOTH_BITMASK + QUEUE_SMOOTH_NEIGHBORS(src) + QUEUE_SMOOTH(src) + +// We don't react to smoothing changing here because this else exists only to "revert" intact changes +/turf/closed/wall/r_wall/update_icon_state() + if(d_state != INTACT) icon_state = "r_wall-[d_state]" else - smooth = SMOOTH_TRUE - queue_smooth_neighbors(src) - queue_smooth(src) - icon_state = "r_wall" + icon_state = "[base_icon_state]-[smoothing_junction]" + return ..() /turf/closed/wall/r_wall/singularity_pull(S, current_size) if(current_size >= STAGE_FIVE) @@ -228,23 +235,26 @@ name = "hull" desc = "The armored hull of an ominous looking ship." icon = 'icons/turf/walls/plastitanium_wall.dmi' - icon_state = "map-shuttle" + icon_state = "plastitanium_wall-0" + base_icon_state = "plastitanium_wall" explosion_block = 20 sheet_type = /obj/item/stack/sheet/mineral/plastitanium - smooth = SMOOTH_MORE|SMOOTH_DIAGONAL - canSmoothWith = list(/turf/closed/wall/r_wall/syndicate, /turf/closed/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plastitanium, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) + smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_SYNDICATE_WALLS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_PLASTITANIUM_WALLS + SMOOTH_GROUP_SYNDICATE_WALLS /turf/closed/wall/r_wall/syndicate/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) return FALSE /turf/closed/wall/r_wall/syndicate/nodiagonal - smooth = SMOOTH_MORE icon_state = "map-shuttle_nd" + base_icon_state = "plastitanium_wall" + smoothing_flags = SMOOTH_BITMASK /turf/closed/wall/r_wall/syndicate/nosmooth icon = 'icons/turf/shuttle.dmi' icon_state = "wall" - smooth = SMOOTH_FALSE + smoothing_flags = NONE /turf/closed/wall/r_wall/syndicate/overspace icon_state = "map-overspace" diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index aff1b3ae03f4..04b083241531 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -16,24 +16,16 @@ pipe_astar_cost = 50 /* nich really doesn't like pipes that go through walls */\ ) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_WALLS + var/hardness = 30 //lower numbers are harder. Used to determine the probability of a hulk smashing through. var/slicing_duration = 200 //default time taken to slice the wall var/sheet_type = /obj/item/stack/sheet/metal var/sheet_amount = 2 var/girder_type = /obj/structure/girder - canSmoothWith = list( - /turf/closed/wall, - /turf/closed/wall/r_wall, - /obj/structure/falsewall, - /obj/structure/falsewall/brass, - /obj/structure/falsewall/reinforced, - /turf/closed/wall/explosive, - /turf/closed/wall/rust, - /turf/closed/wall/r_wall/rust, - /turf/closed/wall/clockwork) - smooth = SMOOTH_TRUE - var/list/dent_decals /turf/closed/wall/Initialize(mapload) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 253cf793e805..6ffa1922438b 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -2,7 +2,8 @@ icon = 'icons/turf/space.dmi' icon_state = "0" name = "\proper space" - intact = 0 + overfloor_placed = FALSE + underfloor_accessibility = UNDERFLOOR_INTERACTABLE initial_temperature = TCMB thermal_conductivity = 0 diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 0d676cd092d3..2c48b953c4c3 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -7,8 +7,6 @@ GLOBAL_LIST_EMPTY(station_turfs) var/dynamic_lighting = DYNAMIC_LIGHTING_ENABLED - var/intact = 1 - // baseturfs can be either a list or a single turf type. // In class definition like here it should always be a single type. // A list will be created in initialization that figures out the baseturf's baseturf etc. @@ -22,6 +20,11 @@ GLOBAL_LIST_EMPTY(station_turfs) var/blocks_air = FALSE + /// If there's a tile over a basic floor that can be ripped out + var/overfloor_placed = FALSE + /// How accessible underfloor pieces such as wires, pipes, etc are on this turf. Can be HIDDEN, VISIBLE, or INTERACTABLE. + var/underfloor_accessibility = UNDERFLOOR_HIDDEN + flags_1 = CAN_BE_DIRTY_1 var/list/image/blueprint_data //for the station blueprints, images of objects eg: pipes @@ -39,6 +42,9 @@ GLOBAL_LIST_EMPTY(station_turfs) var/tiled_dirt = FALSE // use smooth tiled dirt decal + ///Icon-smoothing variable to map a diagonal wall corner with a fixed underlay. + var/list/fixed_underlay = null + ///Lumcount added by sources other than lighting datum objects, such as the overlay lighting component. var/dynamic_lumcount = 0 @@ -75,8 +81,12 @@ GLOBAL_LIST_EMPTY(station_turfs) assemble_baseturfs() levelupdate() - if(smooth) - queue_smooth(src) + + SETUP_SMOOTHING() + + if (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH(src) + visibilityChanged() for(var/atom/movable/AM in src) @@ -362,14 +372,12 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/proc/levelupdate() for(var/obj/O in src) - if(O.level == 1 && (O.flags_1 & INITIALIZED_1)) - O.hide(src.intact) + if(O.flags_1 & INITIALIZED_1) + SEND_SIGNAL(O, COMSIG_OBJ_HIDE, underfloor_accessibility) // override for space turfs, since they should never hide anything /turf/open/space/levelupdate() - for(var/obj/O in src) - if(O.level == 1 && (O.flags_1 & INITIALIZED_1)) - O.hide(0) + return // Removes all signs of lattice on the pos of the turf -Donkieyo /turf/proc/RemoveLattice() @@ -474,12 +482,10 @@ GLOBAL_LIST_EMPTY(station_turfs) //////////////////////////////////////////////////// /turf/singularity_act() - if(intact) - for(var/obj/O in contents) //this is for deleting things like wires contained in the turf - if(O.level != 1) - continue - if(O.invisibility == INVISIBILITY_MAXIMUM) - O.singularity_act() + if(underfloor_accessibility < UNDERFLOOR_INTERACTABLE) + for(var/obj/on_top in contents) //this is for deleting things like wires contained in the turf + if(HAS_TRAIT(on_top, TRAIT_T_RAY_VISIBLE)) + on_top.singularity_act() ScrapeAway(flags = CHANGETURF_INHERIT_AIR) return(2) @@ -487,7 +493,7 @@ GLOBAL_LIST_EMPTY(station_turfs) return TRUE /turf/proc/can_lay_cable() - return can_have_cabling() & !intact + return can_have_cabling() && underfloor_accessibility >= UNDERFLOOR_INTERACTABLE /turf/proc/visibilityChanged() GLOB.cameranet.updateVisibility(src) @@ -562,7 +568,7 @@ GLOBAL_LIST_EMPTY(station_turfs) acid_type = /obj/effect/acid/alien var/has_acid_effect = FALSE for(var/obj/O in src) - if(intact && O.level == 1) //hidden under the floor + if(intact && O.location.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) //hidden under the floor continue if(istype(O, acid_type)) var/obj/effect/acid/A = O diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm b/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm index 5707fd0a9fef..b585b0e82dd1 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_overlay.dm @@ -29,17 +29,16 @@ name = "clockwork wall" icon = 'icons/turf/walls/clockwork_wall.dmi' icon_state = "clockwork_wall" - canSmoothWith = list(/obj/effect/clockwork/overlay/wall, /obj/structure/falsewall/brass) - smooth = SMOOTH_TRUE layer = CLOSED_TURF_LAYER + smoothing_flags = SMOOTH_BITMASK + canSmoothWith = null /obj/effect/clockwork/overlay/wall/Initialize(mapload) . = ..() - queue_smooth_neighbors(src) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(queue_smooth), src), 1) + QUEUE_SMOOTH_NEIGHBORS(src) /obj/effect/clockwork/overlay/wall/Destroy() - queue_smooth_neighbors(src) + QUEUE_SMOOTH_NEIGHBORS(src) return ..() /obj/effect/clockwork/overlay/floor diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 1253d94a738a..815ade06d3dd 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -268,7 +268,7 @@ if(!isplatingturf(victim) && !istype(victim, /turf/open/floor/engine/cult) && isfloorturf(victim) && prob(15)) var/turf/open/floor/floor = victim - if(floor.floor_tile) + if(floor.overfloor_placed && floor.floor_tile) new floor.floor_tile(floor) floor.broken = 0 floor.burnt = 0 diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 3e511d438366..cf791d594a39 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -49,8 +49,6 @@ for(var/obj/machinery/atmospherics/pipe/pipe in loc) if(pipe.piping_layer == target_layer) candidate = pipe - if(pipe.level == 2) - break if(candidate) target = candidate setAttachLayer(candidate.piping_layer) diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index e14ef7818dab..927e0a3ef46d 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -18,6 +18,10 @@ ),\ ) +/obj/machinery/atmospherics/pipe/Initialize(mapload) + . = ..() + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) //if changing this, change the subtypes RemoveElements too, because thats how bespoke works + /obj/machinery/atmospherics/pipe/New(mapload) add_atom_colour(pipe_color, FIXED_COLOUR_PRIORITY) volume = 35 * device_type diff --git a/code/modules/awaymissions/mission_code/vrhub.dm b/code/modules/awaymissions/mission_code/vrhub.dm index a69bf9ba0f99..a2e3ec95fe83 100644 --- a/code/modules/awaymissions/mission_code/vrhub.dm +++ b/code/modules/awaymissions/mission_code/vrhub.dm @@ -155,5 +155,8 @@ name = "rough metal wall" desc = "A wall with rough metal plating." icon = 'icons/turf/walls/iron_wall.dmi' - icon_state = "iron" - canSmoothWith = list(/turf/closed/indestructible/iron) + icon_state = "iron_wall-0" + base_icon_state = "iron_wall" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_IRON_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_IRON_WALLS diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 1ac4884134ef..c8194c73af82 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -110,8 +110,9 @@ icon = 'icons/turf/floors/carpet.dmi' icon_state = "carpet" floor_tile = /obj/item/stack/tile/carpet - smooth = SMOOTH_TRUE - canSmoothWith = null + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET + canSmoothWith = SMOOTH_GROUP_CARPET bullet_bounce_sound = null tiled_dirt = FALSE @@ -123,8 +124,8 @@ . = ..() if(!.) return FALSE - if(intact) - queue_smooth(src) + if((updates & UPDATE_SMOOTHING) && overfloor_placed && smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH(src) /turf/open/floor/holofloor/wood icon_state = "wood" diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 9669eacfe860..31ad560e6bd6 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -83,9 +83,11 @@ /obj/structure/window/shuttle/survival_pod name = "pod window" icon = 'icons/obj/smooth_structures/pod_window.dmi' - icon_state = "smooth" - smooth = SMOOTH_MORE - canSmoothWith = list(/turf/closed/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod) + icon_state = "pod_window-0" + base_icon_state = "pod_window" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_SURVIVAL_TITANIUM_POD + canSmoothWith = SMOOTH_GROUP_SURVIVAL_TITANIUM_POD /obj/structure/window/shuttle/survival_pod/spawner/north dir = NORTH @@ -131,7 +133,9 @@ /obj/structure/table/survival_pod icon = 'icons/obj/lavaland/survival_pod.dmi' icon_state = "table" - smooth = SMOOTH_FALSE + smoothing_flags = NONE + smoothing_groups = null + canSmoothWith = null //Sleeper /obj/machinery/sleeper/survival_pod diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index edb852181af4..862c0c31063c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -516,15 +516,19 @@ Difficulty: Hard icon_state = "wall" light_range = MINIMUM_USEFUL_LIGHT_RANGE duration = 100 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_HIERO_WALL + canSmoothWith = SMOOTH_GROUP_HIERO_WALL /obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caster) . = ..() - queue_smooth_neighbors(src) - queue_smooth(src) + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH_NEIGHBORS(src) + QUEUE_SMOOTH(src) /obj/effect/temp_visual/hierophant/wall/Destroy() - queue_smooth_neighbors(src) + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH_NEIGHBORS(src) return ..() /obj/effect/temp_visual/hierophant/wall/CanAllowThrough(atom/movable/mover, turf/target) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 496b7338074f..926a51372c92 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -321,21 +321,26 @@ obj/structure/elite_tumor/proc/onEliteWon() icon = 'icons/turf/walls/hierophant_wall_temp.dmi' icon_state = "wall" duration = 50 - smooth = SMOOTH_TRUE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_HIERO_WALL + canSmoothWith = SMOOTH_GROUP_HIERO_WALL layer = BELOW_MOB_LAYER - var/mob/living/carbon/human/activator = null - var/mob/living/simple_animal/hostile/asteroid/elite/ourelite = null color = rgb(255,0,0) light_range = MINIMUM_USEFUL_LIGHT_RANGE light_color = LIGHT_COLOR_RED + var/mob/living/carbon/human/activator = null + var/mob/living/simple_animal/hostile/asteroid/elite/ourelite = null + /obj/effect/temp_visual/elite_tumor_wall/Initialize(mapload, new_caster) . = ..() - queue_smooth_neighbors(src) - queue_smooth(src) + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH_NEIGHBORS(src) + QUEUE_SMOOTH(src) /obj/effect/temp_visual/elite_tumor_wall/Destroy() - queue_smooth_neighbors(src) + if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH_NEIGHBORS(src) activator = null ourelite = null return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 4ed3901312fe..70ca436a4350 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -15,8 +15,8 @@ icon_state = "flower_bud" layer = SPACEVINE_MOB_LAYER opacity = FALSE - canSmoothWith = list() - smooth = SMOOTH_FALSE + canSmoothWith = null + smoothing_flags = NONE /// The amount of time it takes to create a venus human trap, in deciseconds var/growth_time = 1200 /// Used by countdown to check time, this is when the timer will complete and the venus trap will spawn. diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm index 94d793dc5bde..4460fac89aaf 100644 --- a/code/modules/plumbing/ducts.dm +++ b/code/modules/plumbing/ducts.dm @@ -47,6 +47,7 @@ All the important duct code: qdel(src) //replace with dropping or something if(active) attempt_connect() + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) /obj/machinery/duct/proc/attempt_connect() reset_connects(0) //All connects are gathered here again eitherway, we might aswell reset it so they properly update when reconnecting diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 215bfb7fab95..214e864f1259 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -630,7 +630,7 @@ var/turf/host_turf = get_turf(src) if(!host_turf) CRASH("attackby on APC when it's not on a turf") - if (host_turf.intact) + if(host_turf.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) to_chat(user, span_warning("You must remove the floor plating in front of the APC first!")) return else if (terminal) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index b3f8caafb3de..86e647815690 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -84,8 +84,7 @@ By design, d1 is the smallest direction and d2 is the highest d2 = text2num( copytext( icon_state, dash+1 ) ) var/turf/T = get_turf(src) // hide if turf is not intact - if(level==1) - hide(T.intact) + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) GLOB.cable_list += src //add it to the global cable list var/list/cable_colors = GLOB.cable_colors @@ -131,7 +130,7 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/proc/handlecable(obj/item/W, mob/user, params) var/turf/T = get_turf(src) - if(T.intact) + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) return if(W.tool_behaviour == TOOL_WIRECUTTER) if (shock(user, 50)) @@ -614,8 +613,8 @@ By design, d1 is the smallest direction and d2 is the highest if(!isturf(user.loc)) return - if(!isturf(T) || T.intact || !T.can_have_cabling()) - to_chat(user, span_warning("You can only lay cables on top of exterior catwalks and plating!")) + if(!isturf(T) || T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE || !T.can_have_cabling()) + to_chat(user, span_warning("You can only lay cables on catwalks and plating!")) return if(get_amount() < 1) // Out of cable diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 91ba0b8c813f..3935249d42fd 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -156,7 +156,7 @@ if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W var/turf/T = user.loc - if(T.intact || !isfloorturf(T)) + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE || !isfloorturf(T)) return if(get_dist(src, user) > 1) return diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index c17a460347bb..33a0bf6eeac7 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -116,7 +116,7 @@ return var/turf/T = get_turf(user) - if (T.intact) //is the floor plating removed ? + if (T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) //can we get to the underfloor? to_chat(user, span_warning("You must first remove the floor plating!")) return diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 50b70d1d1834..9e8e451fae02 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -14,9 +14,7 @@ /obj/machinery/power/terminal/Initialize(mapload) . = ..() - var/turf/T = get_turf(src) - if(level == 1) - hide(T.intact) + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE, use_alpha = TRUE) /obj/machinery/power/terminal/Destroy() if(master) @@ -50,7 +48,7 @@ /obj/machinery/power/terminal/proc/dismantle(mob/living/user, obj/item/I) if(isturf(loc)) var/turf/T = loc - if(T.intact) + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) to_chat(user, span_warning("You must first expose the power terminal!")) return diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index d6dadf6ccf50..c2fd1de84a8c 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -458,8 +458,6 @@ new /obj/effect/hotspot(T) for(var/obj/O in range(aoe_structure_range, epicenter)) if(!isitem(O)) - if(O.level == 1) //Please don't break underfloor items! - continue O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, LASER, FALSE) /obj/projectile/beam/beam_rifle/proc/check_pierce(atom/target) diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index 42d680720e3f..c27e613b5c6b 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -31,6 +31,7 @@ var/datum/component/simple_rotation/rotcomp = AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_FLIP | ROTATION_VERBS, null, CALLBACK(src, PROC_REF(can_be_rotated)), CALLBACK(src, PROC_REF(after_rot))) if(flip) rotcomp.BaseRot(null,ROTATION_FLIP) + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) update_appearance(UPDATE_ICON) @@ -115,7 +116,7 @@ var/ispipe = is_pipe() // Indicates if we should change the level of this pipe var/turf/T = get_turf(src) - if(T.intact && isfloorturf(T)) + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && isfloorturf(T)) to_chat(user, span_warning("You can only attach the [pipename] if the floor plating is removed!")) return TRUE diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index 4b6baf096ccb..8e7bc3937d48 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -34,13 +34,14 @@ if(initialize_dirs != DISP_DIR_NONE) dpdir = dir - if(initialize_dirs & DISP_DIR_LEFT) dpdir |= turn(dir, 90) if(initialize_dirs & DISP_DIR_RIGHT) dpdir |= turn(dir, -90) if(initialize_dirs & DISP_DIR_FLIP) dpdir |= turn(dir, 180) + + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) update() // pipe is deleted @@ -97,7 +98,7 @@ var/eject_range = 5 var/turf/open/floor/floorturf - if(isfloorturf(T)) //intact floor, pop the tile + if(isfloorturf(T) && T.overfloor_placed) // pop the tile if present floorturf = T floorturf.remove_tile() diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index 00e9c80bd5ae..f608f35c61c6 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -198,7 +198,8 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) name = "hotel wall" desc = "A wall designed to protect the security of the hotel's guests." icon_state = "hotelwall" - canSmoothWith = list(/turf/closed/indestructible/hotelwall) + smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_HOTEL_WALLS + canSmoothWith = SMOOTH_GROUP_HOTEL_WALLS explosion_block = INFINITY /turf/open/indestructible/hotelwood diff --git a/code/modules/shuttle/shuttle_rotate.dm b/code/modules/shuttle/shuttle_rotate.dm index 958c9aa5c5ab..af9401994adb 100644 --- a/code/modules/shuttle/shuttle_rotate.dm +++ b/code/modules/shuttle/shuttle_rotate.dm @@ -12,8 +12,8 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate setDir(angle2dir(rotation+dir2angle(dir))) //resmooth if need be. - if(smooth && (params & ROTATE_SMOOTH)) - queue_smooth(src) + if(params & ROTATE_SMOOTH && smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + QUEUE_SMOOTH(src) //rotate the pixel offsets too. if((pixel_x || pixel_y) && (params & ROTATE_OFFSET)) diff --git a/code/modules/spells/spell_types/conjure/_conjure.dm b/code/modules/spells/spell_types/conjure/_conjure.dm index 2e49ce063280..f4b7b7d2c17f 100644 --- a/code/modules/spells/spell_types/conjure/_conjure.dm +++ b/code/modules/spells/spell_types/conjure/_conjure.dm @@ -34,7 +34,11 @@ to_summon_in -= spawn_place if(ispath(summoned_object_type, /turf)) - spawn_place.ChangeTurf(summoned_object_type, flags = CHANGETURF_INHERIT_AIR) + if (spawn_place.overfloor_placed) + spawn_place.ChangeTurf(summoned_object_type, flags = CHANGETURF_INHERIT_AIR) + else + spawn_place.PlaceOnTop(summoned_object_type, flags = CHANGETURF_INHERIT_AIR) + return else var/atom/summoned_object = new summoned_object_type(spawn_place) @@ -47,4 +51,4 @@ /// Called on atoms summoned after they are created, allows extra variable editing and such of created objects /datum/action/cooldown/spell/conjure/proc/post_summon(atom/summoned_object, atom/cast_on) - return \ No newline at end of file + return diff --git a/code/modules/unit_tests/focus_only_tests.dm b/code/modules/unit_tests/focus_only_tests.dm index 426a236ab4bd..89c702ca2313 100644 --- a/code/modules/unit_tests/focus_only_tests.dm +++ b/code/modules/unit_tests/focus_only_tests.dm @@ -11,3 +11,6 @@ /// Checks that every overlay passed into build_appearance_list exists in the icon ///datum/unit_test/focus_only/invalid_overlays + +/// Checks that smoothing_groups and canSmoothWith are properly sorted in /atom/Initialize +/datum/unit_test/focus_only/sorted_smoothing_groups diff --git a/yogstation.dme b/yogstation.dme index 8c2967dc5e4c..e800a2e89f5c 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -71,6 +71,7 @@ #include "code\__DEFINES\footsteps.dm" #include "code\__DEFINES\forensics.dm" #include "code\__DEFINES\hud.dm" +#include "code\__DEFINES\icon_smoothing.dm" #include "code\__DEFINES\instruments.dm" #include "code\__DEFINES\interaction_flags.dm" #include "code\__DEFINES\inventory.dm" @@ -82,9 +83,11 @@ #include "code\__DEFINES\logging.dm" #include "code\__DEFINES\machines.dm" #include "code\__DEFINES\magic.dm" +#include "code\__DEFINES\map_switch.dm" #include "code\__DEFINES\maps.dm" #include "code\__DEFINES\materials.dm" #include "code\__DEFINES\maths.dm" +#include "code\__DEFINES\matrices.dm" #include "code\__DEFINES\MC.dm" #include "code\__DEFINES\melee.dm" #include "code\__DEFINES\menu.dm" @@ -204,7 +207,6 @@ #include "code\__DEFINES\{yogs_defines}\wires.dm" #include "code\__HELPERS\_extools_api.dm" #include "code\__HELPERS\_lists.dm" -#include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" #include "code\__HELPERS\animations.dm" #include "code\__HELPERS\areas.dm" @@ -250,6 +252,9 @@ #include "code\__HELPERS\verbs.dm" #include "code\__HELPERS\view.dm" #include "code\__HELPERS\weakref.dm" +#include "code\__HELPERS\logging\_logging.dm" +#include "code\__HELPERS\logging\attack.dm" +#include "code\__HELPERS\logging\talk.dm" #include "code\__HELPERS\sorts\__main.dm" #include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\MergeSort.dm" @@ -674,6 +679,7 @@ #include "code\datums\elements\regenerator.dm" #include "code\datums\elements\rust.dm" #include "code\datums\elements\squish.dm" +#include "code\datums\elements\undertile.dm" #include "code\datums\elements\update_icon_blocker.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" @@ -816,7 +822,6 @@ #include "code\datums\wounds\slash.dm" #include "code\datums\wounds\scars\_scars.dm" #include "code\game\alternate_appearance.dm" -#include "code\game\atoms.dm" #include "code\game\atoms_movable.dm" #include "code\game\communications.dm" #include "code\game\data_huds.dm" @@ -838,6 +843,11 @@ #include "code\game\area\areas\ruins\lavaland.dm" #include "code\game\area\areas\ruins\space.dm" #include "code\game\area\areas\ruins\templates.dm" +#include "code\game\atom\_atom.dm" +#include "code\game\atom\atom_invisibility.dm" +#include "code\game\atom\atom_materials.dm" +#include "code\game\atom\atom_orbit.dm" +#include "code\game\atom\atom_tool_acts.dm" #include "code\game\gamemodes\events.dm" #include "code\game\gamemodes\game_mode.dm" #include "code\game\gamemodes\objective.dm" diff --git a/yogstation/code/game/objects/structures/bar_stuff/bar_stuff.dm b/yogstation/code/game/objects/structures/bar_stuff/bar_stuff.dm index 9cf4a684cbf4..a516fed1e226 100644 --- a/yogstation/code/game/objects/structures/bar_stuff/bar_stuff.dm +++ b/yogstation/code/game/objects/structures/bar_stuff/bar_stuff.dm @@ -49,7 +49,8 @@ turf/open/floor/plasteel/ameridiner desc = "A counter with a red and black motif." icon = 'yogstation/icons/obj/smooth_structures/ameritable.dmi' icon_state = "table" - smooth = SMOOTH_FALSE + smoothing_flags = NONE + smoothing_groups = null canSmoothWith = null /obj/structure/table/american/end diff --git a/yogstation/code/game/objects/structures/tables_racks.dm b/yogstation/code/game/objects/structures/tables_racks.dm index 01d65350de98..ef7917503157 100644 --- a/yogstation/code/game/objects/structures/tables_racks.dm +++ b/yogstation/code/game/objects/structures/tables_racks.dm @@ -9,7 +9,8 @@ buildstack = /obj/item/stack/sheet/mineral/bananium framestackamount = 1 buildstackamount = 1 - canSmoothWith = list(/obj/structure/table/bananium) + smoothing_groups = SMOOTH_GROUP_BANANIUM_TABLES //Don't smooth with SMOOTH_GROUP_TABLES + canSmoothWith = SMOOTH_GROUP_BANANIUM_TABLES var/spam_flag = 0 /obj/structure/table/bananium/attackby(obj/item/W, mob/user, params) @@ -44,4 +45,4 @@ icon_state = "minibar_left" /obj/structure/rack/skeletal/right - icon_state = "minibar_right" \ No newline at end of file + icon_state = "minibar_right" diff --git a/yogstation/code/game/objects/structures/window.dm b/yogstation/code/game/objects/structures/window.dm index dc3bee66c1e1..2441012f083e 100644 --- a/yogstation/code/game/objects/structures/window.dm +++ b/yogstation/code/game/objects/structures/window.dm @@ -50,9 +50,10 @@ max_integrity = 50 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smooth = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile, /obj/structure/window/bananium/fulltile) + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE glass_amount = 2 /obj/structure/window/bananium/fulltile/unanchored - anchored = FALSE \ No newline at end of file + anchored = FALSE diff --git a/yogstation/code/game/turfs/simulated/floor/fancy_floor.dm b/yogstation/code/game/turfs/simulated/floor/fancy_floor.dm index 72f5c3483f84..c9e42ab68e0e 100644 --- a/yogstation/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/yogstation/code/game/turfs/simulated/floor/fancy_floor.dm @@ -1,24 +1,28 @@ /turf/open/floor/ballpit desc = "A bunch of balls compressed together into a tile. Fun for the whole family!" - smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE - canSmoothWith = list(/turf/open/floor/ballpit) icon = 'yogstation/icons/turf/floors/ballpit_smooth.dmi' icon_state = "smooth" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + smoothing_groups = SMOOTH_GROUP_TURF_BALLPIT + canSmoothWith = SMOOTH_GROUP_TURF_BALLPIT /turf/open/floor/carpet/purple icon = 'goon/icons/turfs/carpet_purple.dmi' floor_tile = /obj/item/stack/tile/carpet/purple - canSmoothWith = list(/turf/open/floor/carpet/purple) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_PURPLE + canSmoothWith = SMOOTH_GROUP_CARPET_PURPLE /turf/open/floor/carpet/green icon = 'goon/icons/turfs/carpet_green.dmi' floor_tile = /obj/item/stack/tile/carpet/green - canSmoothWith = list(/turf/open/floor/carpet/green) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_GREEN + canSmoothWith = SMOOTH_GROUP_CARPET_GREEN /turf/open/floor/carpet/blue icon = 'goon/icons/turfs/carpet_blue.dmi' floor_tile = /obj/item/stack/tile/carpet/blue - canSmoothWith = list(/turf/open/floor/carpet/blue) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLUE + canSmoothWith = SMOOTH_GROUP_CARPET_BLUE /turf/open/floor/plasteel/stairs/goon icon = 'goon/icons/turfs/floors.dmi' diff --git a/yogstation/code/game/turfs/simulated/minerals.dm b/yogstation/code/game/turfs/simulated/minerals.dm index 6cb7132a317d..55595332209f 100644 --- a/yogstation/code/game/turfs/simulated/minerals.dm +++ b/yogstation/code/game/turfs/simulated/minerals.dm @@ -13,18 +13,18 @@ defer_change = 1 /turf/closed/mineral/dilithium/volcanic/hard - smooth_icon = 'icons/turf/smoothrocks_hard.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks_hard.dmi', 'icons/turf/mining.dmi') hardness = 2 /turf/closed/mineral/dilithium/volcanic/hard/harder - smooth_icon = 'icons/turf/smoothrocks.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') mineralAmt = 5 color = "#eb9877" hardness = 3 /turf/closed/mineral/dilithium/ice environment_type = "snow_cavern" - smooth_icon = 'icons/turf/walls/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi') turf_type = /turf/open/floor/plating/asteroid/snow/ice baseturfs = /turf/open/floor/plating/asteroid/snow/ice initial_gas_mix = FROZEN_ATMOS From 558feacf2505b8e8be55a7f37207086aa22cc4a2 Mon Sep 17 00:00:00 2001 From: JohnFulpWillard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 6 Dec 2023 00:44:05 -0500 Subject: [PATCH 123/281] L --- code/game/machinery/magnet.dm | 1 + code/game/objects/objs.dm | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 1c5e2c5b055c..ef5c5de0d74e 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -29,6 +29,7 @@ /obj/machinery/magnetic_module/Initialize(mapload) ..() + AddElement(/datum/element/undertile, tile_overlay = tile_overlay, use_anchor = TRUE) var/turf/T = loc hide(T.intact) center = T diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 686438b8b836..95933f1c03a7 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -226,9 +226,6 @@ if(istype(M) && M.client && M.machine == src) src.attack_self(M) -/obj/proc/hide(h) - return - /obj/singularity_pull(S, current_size) ..() if(!anchored || current_size >= STAGE_FIVE) From 19aab784e350ff253d5fdcef2ebf85409681830c Mon Sep 17 00:00:00 2001 From: JohnFulpWillard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 6 Dec 2023 01:52:18 -0500 Subject: [PATCH 124/281] the game opens ig --- _maps/map_files/generic/CentCom.dmm | 30 ++----- code/__DEFINES/subsystems.dm | 4 +- code/__DEFINES/traits.dm | 2 +- code/__HELPERS/_lists.dm | 12 +++ code/__HELPERS/bitflag_lists.dm | 28 +++++++ code/controllers/subsystem/atoms.dm | 63 +++++++++------ code/controllers/subsystem/fire_burning.dm | 2 +- code/controllers/subsystem/icon_smooth.dm | 74 +++++++++++++----- code/controllers/subsystem/minor_mapping.dm | 19 +++-- code/datums/elements/undertile.dm | 4 +- code/game/area/areas.dm | 8 +- code/game/area/areas/shuttles.dm | 16 ++-- code/game/machinery/magnet.dm | 12 +-- code/game/machinery/navbeacon.dm | 13 +-- code/game/machinery/pipe/construction.dm | 3 +- code/game/mecha/equipment/tools/work_tools.dm | 2 +- .../fluid_spread/effects_foam.dm | 2 +- code/game/objects/items/RCL.dm | 6 +- code/game/objects/items/devices/powersink.dm | 2 +- .../objects/items/devices/pressureplates.dm | 28 +++---- code/game/objects/items/devices/scanners.dm | 5 +- code/game/objects/items/puzzle_pieces.dm | 6 ++ code/game/objects/items/storage/backpack.dm | 13 --- code/game/objects/obj_defense.dm | 6 +- code/game/objects/structures/aliens.dm | 1 + code/game/objects/structures/tables_racks.dm | 30 +++---- code/game/objects/structures/window.dm | 8 +- .../simulated/floor/plating/misc_plating.dm | 31 ++++---- code/game/turfs/simulated/lava.dm | 4 + code/game/turfs/turf.dm | 6 +- code/modules/antagonists/blob/blob_report.dm | 8 +- .../atmospherics/machinery/atmosmachinery.dm | 15 ++-- .../binary_devices/binary_devices.dm | 4 - .../components/binary_devices/dp_vent_pump.dm | 2 +- .../machinery/components/components_base.dm | 22 ++++-- .../unary_devices/outlet_injector.dm | 2 +- .../components/unary_devices/passive_vent.dm | 1 + .../unary_devices/portables_connector.dm | 4 +- .../components/unary_devices/unary_devices.dm | 4 - .../components/unary_devices/vent_pump.dm | 2 +- .../components/unary_devices/vent_scrubber.dm | 2 +- .../machinery/pipes/heat_exchange/he_pipes.dm | 13 ++- .../machinery/pipes/layermanifold.dm | 3 - .../atmospherics/machinery/pipes/mapping.dm | 8 +- .../atmospherics/machinery/pipes/pipes.dm | 16 ---- code/modules/holodeck/computer.dm | 2 +- code/modules/mapping/reader.dm | 11 +-- code/modules/mob/dead/observer/observer.dm | 7 +- .../living/simple_animal/friendly/mouse.dm | 2 +- .../mob/living/simple_animal/hostile/rat.dm | 2 +- code/modules/power/cable.dm | 21 ++--- code/modules/power/terminal.dm | 10 --- .../recycling/disposal/construction.dm | 10 --- code/modules/recycling/disposal/pipe.dm | 12 --- code/modules/shuttle/on_move.dm | 23 ------ icons/turf/floors/rocky_ash.dmi | Bin 3004 -> 8601 bytes yogstation.dme | 1 + .../atmospherics/machinery/pipes/bluespace.dm | 5 +- 58 files changed, 292 insertions(+), 360 deletions(-) create mode 100644 code/__HELPERS/bitflag_lists.dm diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 60a5237310a9..d5cb76726efa 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -6861,11 +6861,7 @@ /area/centcom/testchamber) "apy" = ( /obj/machinery/smartfridge, -/turf/closed/indestructible{ - icon = 'icons/turf/walls/wood_wall.dmi'; - icon_state = "wood"; - smooth = 1 - }, +/turf/closed/indestructible/rock/wood, /area/centcom/holding) "apz" = ( /obj/structure/rack, @@ -13119,11 +13115,7 @@ /area/yogs/infiltrator_base/outside) "aBV" = ( /obj/machinery/chem_dispenser/drinks/beer, -/turf/closed/indestructible{ - icon = 'icons/turf/walls/wood_wall.dmi'; - icon_state = "wood"; - smooth = 1 - }, +/turf/closed/indestructible/rock/wood, /area/centcom/holding) "aBW" = ( /obj/machinery/atmospherics/components/binary/pump/on{ @@ -14652,11 +14644,7 @@ /area/wizard_station) "aED" = ( /obj/machinery/vending/boozeomat, -/turf/closed/indestructible{ - icon = 'icons/turf/walls/wood_wall.dmi'; - icon_state = "wood"; - smooth = 1 - }, +/turf/closed/indestructible/rock/wood, /area/centcom/holding) "aEE" = ( /obj/structure/closet/crate/bin, @@ -19174,11 +19162,7 @@ }, /area/holodeck/rec_center/medical) "aNd" = ( -/turf/closed/indestructible{ - icon = 'icons/turf/walls/wood_wall.dmi'; - icon_state = "wood"; - smooth = 1 - }, +/turf/closed/indestructible/rock/wood, /area/centcom/holding) "aNe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -21031,11 +21015,7 @@ /area/centcom/testchamber) "aQT" = ( /obj/machinery/chem_dispenser/drinks, -/turf/closed/indestructible{ - icon = 'icons/turf/walls/wood_wall.dmi'; - icon_state = "wood"; - smooth = 1 - }, +/turf/closed/indestructible/rock/wood, /area/centcom/holding) "aQU" = ( /obj/structure/table/reinforced, diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 944f6ef36c98..b92b3a398214 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -188,11 +188,11 @@ #define FIRE_PRIORITY_THROWING 25 #define FIRE_PRIORITY_SPACEDRIFT 30 #define FIRE_PRIORITY_FIELDS 30 -#define FIRE_PRIOTITY_SMOOTHING 35 +#define FIRE_PRIORITY_SMOOTHING 35 #define FIRE_PRIORITY_NETWORKS 40 #define FIRE_PRIORITY_OBJ 40 #define FIRE_PRIORITY_ACID 40 -#define FIRE_PRIOTITY_BURNING 40 +#define FIRE_PRIORITY_BURNING 40 #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_PARALLAX 65 #define FIRE_PRIORITY_INSTRUMENTS 80 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 35baf4056ada..0fb442556932 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -309,7 +309,7 @@ // item traits #define TRAIT_NODROP "nodrop" -/// Visible on t-ray scanners if the atom/var/level == 1 +/// Visible on t-ray scanners. #define TRAIT_T_RAY_VISIBLE "t-ray-visible" /// Properly wielded two handed item #define TRAIT_WIELDED "wielded" diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index d5cd95b2db6b..4324f060a4d2 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -737,3 +737,15 @@ ///sort any value in a list /proc/sort_list(list/list_to_sort, cmp=/proc/cmp_text_asc) return sortTim(list_to_sort.Copy(), cmp) + +/// Runtimes if the passed in list is not sorted +/proc/assert_sorted(list/list, name, cmp = GLOBAL_PROC_REF(cmp_numeric_asc)) + var/last_value = list[1] + + for (var/index in 2 to list.len) + var/value = list[index] + + if (call(cmp)(value, last_value) < 0) + stack_trace("[name] is not sorted. value at [index] ([value]) is in the wrong place compared to the previous value of [last_value] (when compared to by [cmp])") + + last_value = value diff --git a/code/__HELPERS/bitflag_lists.dm b/code/__HELPERS/bitflag_lists.dm new file mode 100644 index 000000000000..48e35bd6b913 --- /dev/null +++ b/code/__HELPERS/bitflag_lists.dm @@ -0,0 +1,28 @@ +GLOBAL_LIST_EMPTY(bitflag_lists) + +/** + * System for storing bitflags past the 24 limit, making use of an associative list. + * + * Macro converts a list of integers into an associative list of bitflag entries for quicker comparison. + * Example: list(0, 4, 26, 32)) => list( "0" = ( (1<<0) | (1<<4) ), "1" = ( (1<<2) | (1<<8) ) ) + * Lists are cached into a global list of lists to avoid identical duplicates. + * This system makes value comparisons faster than pairing every element of one list with every element of the other for evaluation. + * + * Arguments: + * * target - List of integers. + */ +#define SET_SMOOTHING_GROUPS(target) \ + do { \ + var/txt_signature = target; \ + if(isnull((target = GLOB.bitflag_lists[txt_signature]))) { \ + var/list/new_bitflag_list = list(); \ + var/list/decoded = UNWRAP_SMOOTHING_GROUPS(txt_signature, decoded); \ + for(var/value in decoded) { \ + if (value < 0) { \ + value = MAX_S_TURF + 1 + abs(value); \ + } \ + new_bitflag_list["[round(value / 24)]"] |= (1 << (value % 24)); \ + }; \ + target = GLOB.bitflag_lists[txt_signature] = new_bitflag_list; \ + }; \ + } while (FALSE) diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index e7e6275cd8bc..c4d493d2dff9 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -1,3 +1,5 @@ +#define SUBSYSTEM_INIT_SOURCE "subsystem init" + #define BAD_INIT_QDEL_BEFORE 1 #define BAD_INIT_DIDNT_INIT 2 #define BAD_INIT_SLEPT 4 @@ -9,9 +11,10 @@ SUBSYSTEM_DEF(atoms) flags = SS_NO_FIRE loading_points = 30 SECONDS // Yogs -- smarter loading times - var/old_initialized - /// A count of how many initalize changes we've made. We want to prevent old_initialize being overriden by some other value, breaking init code - var/initialized_changed = 0 + /// A stack of list(source, desired initialized state) + /// We read the source of init changes from the last entry, and assert that all changes will come with a reset + var/list/initialized_state = list() + var/base_initialized var/list/late_loaders = list() @@ -39,11 +42,11 @@ SUBSYSTEM_DEF(atoms) if(initialized == INITIALIZATION_INSSATOMS) return - set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD) + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, SUBSYSTEM_INIT_SOURCE) // This may look a bit odd, but if the actual atom creation runtimes for some reason, we absolutely need to set initialized BACK CreateAtoms(atoms) - clear_tracked_initalize() + clear_tracked_initalize(SUBSYSTEM_INIT_SOURCE) if(late_loaders.len) for(var/I in 1 to late_loaders.len) @@ -136,31 +139,41 @@ SUBSYSTEM_DEF(atoms) return qdeleted || QDELING(A) -/datum/controller/subsystem/atoms/proc/map_loader_begin() - set_tracked_initalized(INITIALIZATION_INSSATOMS) - -/datum/controller/subsystem/atoms/proc/map_loader_stop() - clear_tracked_initalize() - -/// Use this to set initialized to prevent error states where old_initialized is overriden. It keeps happening and it's cheesing me off -/datum/controller/subsystem/atoms/proc/set_tracked_initalized(value) - if(!initialized_changed) - old_initialized = initialized - initialized = value - else - stack_trace("We started maploading while we were already maploading. You doing something odd?") - initialized_changed += 1 +/datum/controller/subsystem/atoms/proc/map_loader_begin(source) + set_tracked_initalized(INITIALIZATION_INSSATOMS, source) + +/datum/controller/subsystem/atoms/proc/map_loader_stop(source) + clear_tracked_initalize(source) + +/// Use this to set initialized to prevent error states where the old initialized is overriden, and we end up losing all context +/// Accepts a state and a source, the most recent state is used, sources exist to prevent overriding old values accidentially +/datum/controller/subsystem/atoms/proc/set_tracked_initalized(state, source) + if(!length(initialized_state)) + base_initialized = initialized + initialized_state += list(list(source, state)) + initialized = state + +/datum/controller/subsystem/atoms/proc/clear_tracked_initalize(source) + for(var/i in length(initialized_state) to 1) + if(initialized_state[i][1] == source) + initialized_state.Cut(i, i+1) + break + + if(!length(initialized_state)) + initialized = base_initialized + base_initialized = INITIALIZATION_INNEW_REGULAR + return + initialized = initialized_state[length(initialized_state)][2] -/datum/controller/subsystem/atoms/proc/clear_tracked_initalize() - initialized_changed -= 1 - if(!initialized_changed) - initialized = old_initialized +/// Returns TRUE if anything is currently being initialized +/datum/controller/subsystem/atoms/proc/initializing_something() + return length(initialized_state) > 1 /datum/controller/subsystem/atoms/Recover() initialized = SSatoms.initialized if(initialized == INITIALIZATION_INNEW_MAPLOAD) InitializeAtoms() - old_initialized = SSatoms.old_initialized + initialized_state = SSatoms.initialized_state BadInitializeCalls = SSatoms.BadInitializeCalls /datum/controller/subsystem/atoms/proc/setupGenetics() @@ -217,3 +230,5 @@ SUBSYSTEM_DEF(atoms) #undef BAD_INIT_DIDNT_INIT #undef BAD_INIT_SLEPT #undef BAD_INIT_NO_HINT + +#undef SUBSYSTEM_INIT_SOURCE diff --git a/code/controllers/subsystem/fire_burning.dm b/code/controllers/subsystem/fire_burning.dm index 2a4d48f14f26..df138faf013e 100644 --- a/code/controllers/subsystem/fire_burning.dm +++ b/code/controllers/subsystem/fire_burning.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(fire_burning) name = "Fire Burning" - priority = FIRE_PRIOTITY_BURNING + priority = FIRE_PRIORITY_BURNING flags = SS_NO_INIT|SS_BACKGROUND runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index 338f50b2021c..4d5f3069eca6 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -2,43 +2,77 @@ SUBSYSTEM_DEF(icon_smooth) name = "Icon Smoothing" init_order = INIT_ORDER_ICON_SMOOTHING wait = 1 - priority = FIRE_PRIOTITY_SMOOTHING + priority = FIRE_PRIORITY_SMOOTHING flags = SS_TICKER - loading_points = 3.3 SECONDS // Yogs -- loading times - + ///Blueprints assemble an image of what pipes/manifolds/wires look like on initialization, and thus should be taken after everything's been smoothed + var/list/blueprint_queue = list() var/list/smooth_queue = list() var/list/deferred = list() /datum/controller/subsystem/icon_smooth/fire() - var/list/cached = smooth_queue - while(cached.len) - var/atom/A = cached[cached.len] - cached.len-- - if (A.flags_1 & INITIALIZED_1) - A.smooth_icon() + // We do not want to smooth icons of atoms whose neighbors are not initialized yet, + // this causes runtimes. + // Icon smoothing SS runs after atoms, so this only happens for something like shuttles. + // This kind of map loading shouldn't take too long, so the delay is not a problem. + if (SSatoms.initializing_something()) + return + + var/list/smooth_queue_cache = smooth_queue + while(length(smooth_queue_cache)) + var/atom/smoothing_atom = smooth_queue_cache[length(smooth_queue_cache)] + smooth_queue_cache.len-- + if(QDELETED(smoothing_atom) || !(smoothing_atom.smoothing_flags & SMOOTH_QUEUED)) + continue + if(smoothing_atom.flags_1 & INITIALIZED_1) + smoothing_atom.smooth_icon() else - deferred += A + deferred += smoothing_atom if (MC_TICK_CHECK) return - if (!cached.len) + if (!length(smooth_queue_cache)) if (deferred.len) smooth_queue = deferred - deferred = cached + deferred = smooth_queue_cache else - can_fire = 0 + can_fire = FALSE /datum/controller/subsystem/icon_smooth/Initialize() - smooth_zlevel(1,TRUE) - smooth_zlevel(2,TRUE) - var/queue = smooth_queue + var/list/queue = smooth_queue smooth_queue = list() - for(var/V in queue) - var/atom/A = V - if(!A || A.z <= 2) + + while(length(queue)) + var/atom/smoothing_atom = queue[length(queue)] + queue.len-- + if(QDELETED(smoothing_atom) || !(smoothing_atom.smoothing_flags & SMOOTH_QUEUED) || !smoothing_atom.z) continue - A.smooth_icon() + smoothing_atom.smooth_icon() CHECK_TICK + queue = blueprint_queue + blueprint_queue = null + + for(var/atom/movable/movable_item as anything in queue) + if(!isturf(movable_item.loc)) + continue + var/turf/item_loc = movable_item.loc + item_loc.add_blueprints(movable_item) + return SS_INIT_SUCCESS + + +/datum/controller/subsystem/icon_smooth/proc/add_to_queue(atom/thing) + if(thing.smoothing_flags & SMOOTH_QUEUED) + return + thing.smoothing_flags |= SMOOTH_QUEUED + smooth_queue += thing + if(!can_fire) + can_fire = TRUE + +/datum/controller/subsystem/icon_smooth/proc/remove_from_queues(atom/thing) + thing.smoothing_flags &= ~SMOOTH_QUEUED + smooth_queue -= thing + if(blueprint_queue) + blueprint_queue -= thing + deferred -= thing diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm index d5d385170877..cac72a1d00d3 100644 --- a/code/controllers/subsystem/minor_mapping.dm +++ b/code/controllers/subsystem/minor_mapping.dm @@ -37,14 +37,21 @@ SUBSYSTEM_DEF(minor_mapping) num_mice -= 1 M = null -/datum/controller/subsystem/minor_mapping/proc/place_satchels(amount=10) +/datum/controller/subsystem/minor_mapping/proc/place_satchels(satchel_amount = 10) var/list/turfs = find_satchel_suitable_turfs() + ///List of areas where satchels should not be placed. + var/list/blacklisted_area_types = list( + /area/holodeck, + ) - while(turfs.len && amount > 0) - var/turf/T = pick_n_take(turfs) - var/obj/item/storage/backpack/satchel/flat/S = new(T) - S.hide(intact=TRUE) - amount-- + while(turfs.len && satchel_amount > 0) + var/turf/turf = pick_n_take(turfs) + if(is_type_in_list(get_area(turf), blacklisted_area_types)) + continue + var/obj/item/storage/backpack/satchel/flat/flat_satchel = new(turf) + + SEND_SIGNAL(flat_satchel, COMSIG_OBJ_HIDE, turf.underfloor_accessibility) + satchel_amount-- /proc/find_exposed_wires() diff --git a/code/datums/elements/undertile.dm b/code/datums/elements/undertile.dm index b540e0e3ae1d..de055bb0bd75 100644 --- a/code/datums/elements/undertile.dm +++ b/code/datums/elements/undertile.dm @@ -50,7 +50,7 @@ T.add_overlay(tile_overlay) if(use_anchor) - source.set_anchored(TRUE) + source.anchored = TRUE if(underfloor_accessibility < UNDERFLOOR_VISIBLE) if(use_alpha) @@ -73,7 +73,7 @@ source.alpha = initial(source.alpha) if(use_anchor) - source.set_anchored(FALSE) + source.anchored = FALSE /datum/element/undertile/Detach(atom/movable/source, visibility_trait, invisibility_level = INVISIBILITY_MAXIMUM) . = ..() diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index afab00c7f397..efbd67433b71 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -4,7 +4,6 @@ * A grouping of tiles into a logical space, mostly used by map editors */ /area - level = null name = "Space" icon = 'icons/turf/areas.dmi' icon_state = "unknown" @@ -115,11 +114,13 @@ var/list/cameras var/list/firealarms var/list/airalarms + + ///Typepath to limit the areas (subtypes included) that atoms in this area can smooth with. Used for shuttles. + var/area/area_limited_icon_smoothing + var/firedoors_last_closed_on = 0 /// Can the Xenobio management console transverse this area by default? var/xenobiology_compatible = FALSE - /// typecache to limit the areas that atoms in this area can smooth with, used for shuttles IIRC - var/list/canSmoothWithAreas var/minimap_color = null // if null, chooses random one @@ -197,7 +198,6 @@ GLOBAL_LIST_EMPTY(teleportlocs) layer = AREA_LAYER uid = ++global_uid map_name = name // Save the initial (the name set in the map) name of the area. - canSmoothWithAreas = typecacheof(canSmoothWithAreas) add_delta_areas() diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index 7d7bdffa26eb..ca3186d59540 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -11,15 +11,12 @@ icon_state = "shuttle" // Loading the same shuttle map at a different time will produce distinct area instances. unique = FALSE - ///list of miners & their mining points from gems to be given once all exports are processed, used by supply shuttles - var/list/gem_payout = list() + area_limited_icon_smoothing = /area/shuttle lighting_colour_tube = "#fff0dd" lighting_colour_bulb = "#ffe1c1" -/area/shuttle/Initialize(mapload) - if(!canSmoothWithAreas) - canSmoothWithAreas = type - . = ..() + ///list of miners & their mining points from gems to be given once all exports are processed, used by supply shuttles + var/list/gem_payout = list() /area/shuttle/PlaceOnTopReact(list/new_baseturfs, turf/fake_turf_type, flags) . = ..() @@ -36,7 +33,7 @@ name = "Syndicate Infiltrator" blob_allowed = FALSE ambience_index = AMBIENCE_DANGER - canSmoothWithAreas = /area/shuttle/syndicate + area_limited_icon_smoothing = /area/shuttle/syndicate /area/shuttle/syndicate/bridge name = "Syndicate Infiltrator Control" @@ -61,7 +58,6 @@ name = "Pirate Shuttle" blob_allowed = FALSE requires_power = TRUE - canSmoothWithAreas = /area/shuttle/pirate ////////////////////////////Bounty Hunter Shuttles//////////////////////////// @@ -69,7 +65,6 @@ name = "Hunter Shuttle" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED blob_allowed = FALSE - canSmoothWithAreas = /area/shuttle/hunter ////////////////////////////White Ship//////////////////////////// @@ -77,7 +72,7 @@ name = "Abandoned Ship" blob_allowed = FALSE requires_power = TRUE - canSmoothWithAreas = /area/shuttle/abandoned + area_limited_icon_smoothing = /area/shuttle/abandoned /area/shuttle/abandoned/bridge name = "Abandoned Ship Bridge" @@ -149,6 +144,7 @@ /area/shuttle/escape name = "Emergency Shuttle" + area_limited_icon_smoothing = /area/shuttle/escape /area/shuttle/escape/backup name = "Backup Emergency Shuttle" diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index ef5c5de0d74e..b25a7c47d683 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -9,7 +9,6 @@ icon_state = "floor_magnet-f" name = "electromagnetic generator" desc = "A device that uses station power to create points of magnetic energy." - level = 1 // underfloor layer = LOW_OBJ_LAYER use_power = IDLE_POWER_USE idle_power_usage = 50 @@ -29,10 +28,8 @@ /obj/machinery/magnetic_module/Initialize(mapload) ..() - AddElement(/datum/element/undertile, tile_overlay = tile_overlay, use_anchor = TRUE) - var/turf/T = loc - hide(T.intact) - center = T + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) + center = loc SSradio.add_object(src, freq, RADIO_MAGNETS) return INITIALIZE_HINT_LATELOAD @@ -44,11 +41,6 @@ center = null return ..() -// update the invisibility and icon -/obj/machinery/magnetic_module/hide(intact) - invisibility = intact ? INVISIBILITY_MAXIMUM : 0 - update_appearance(UPDATE_ICON) - // update the icon_state /obj/machinery/magnetic_module/update_icon_state() . = ..() diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index f26d53db9c00..a43b57a85e8d 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -7,7 +7,6 @@ icon_state = "navbeacon0-f" name = "navigation beacon" desc = "A radio beacon used for bot navigation." - level = 1 // underfloor layer = UNDER_CATWALK max_integrity = 500 armor = list(MELEE = 70, BULLET = 70, LASER = 70, ENERGY = 70, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80) @@ -26,7 +25,6 @@ set_codes() - var/turf/T = loc if(codes["patrol"]) if(!GLOB.navbeacons["[z]"]) GLOB.navbeacons["[z]"] = list() @@ -68,13 +66,6 @@ else codes[e] = "1" - -// called when turf state changes -// hide the object if turf is intact -/obj/machinery/navbeacon/hide(intact) - invisibility = intact ? INVISIBILITY_MAXIMUM : 0 - update_appearance(UPDATE_ICON) - // update the icon_state /obj/machinery/navbeacon/update_icon_state() . = ..() @@ -89,7 +80,7 @@ /obj/machinery/navbeacon/attackby(obj/item/I, mob/user, params) var/turf/T = loc - if(T.intact) + if(T.underfloor_accessibility >= UNDERFLOOR_INTERACTABLE) return // prevent intraction when T-scanner revealed if(I.tool_behaviour == TOOL_SCREWDRIVER) @@ -122,7 +113,7 @@ . = ..() var/ai = isAI(user) var/turf/T = loc - if(T.intact) + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) return // prevent intraction when T-scanner revealed if(!open && !ai) // can't alter controls if not open, unless you're an AI diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 33c9676d86dc..ad609496b776 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -18,8 +18,9 @@ Buildable meters icon_state = "simple" item_state = "buildpipe" w_class = WEIGHT_CLASS_NORMAL - level = 2 + ///Piping layer that we are going to be on var/piping_layer = PIPING_LAYER_DEFAULT + ///Type of pipe-object made, selected from the RPD var/RPD_type var/disposable = TRUE // yogs diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 2fe788ba5dd0..855df49cacb3 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -470,7 +470,7 @@ if(!T.broken && !T.burnt) new T.floor_tile(T) T.make_plating() - return !new_turf.intact + return new_turf.underfloor_accessibility >= UNDERFLOOR_INTERACTABLE /obj/item/mecha_parts/mecha_equipment/cable_layer/proc/layCable(turf/new_turf) if(equip_ready || !istype(new_turf) || !dismantle_floor(new_turf)) diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm index 5621a07d5f1a..8e013e9e167f 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm @@ -88,7 +88,7 @@ if(object == src) continue if(isturf(object.loc)) - if(turf_location.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && HAS_TRAIT(object, TRAIT_T_RAY_VISIBLE)) + if(location.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && HAS_TRAIT(object, TRAIT_T_RAY_VISIBLE)) continue reagents.reaction(object, TOUCH|VAPOR, fraction) diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index 23c6ccc93454..deaa3a2a02b1 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -190,7 +190,7 @@ if(last) if(get_dist(last, user) == 1) //hacky, but it works var/turf/T = get_turf(user) - if(T.intact || !T.can_have_cabling()) + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE || !T.can_have_cabling()) last = null return if(get_dir(last, user) == last.d2) @@ -215,7 +215,7 @@ return T = get_turf(user) - if(T.intact || !T.can_have_cabling()) + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE || !T.can_have_cabling()) return for(var/obj/structure/cable/C in T) @@ -275,7 +275,7 @@ return var/turf/T = get_turf(user) - if(T.intact || !T.can_have_cabling()) + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE || !T.can_have_cabling()) return loaded.color = colors[current_color_index] diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 7135a929bc4e..ce10148b852f 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -64,7 +64,7 @@ if(I.tool_behaviour == TOOL_SCREWDRIVER) if(mode == DISCONNECTED) var/turf/T = loc - if(isturf(T) && !T.intact) + if(isturf(T) && T.underfloor_accessibility >= UNDERFLOOR_INTERACTABLE) attached = locate() in T if(!attached) to_chat(user, span_warning("This device must be placed over an exposed, powered cable node!")) diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm index d6ec1ef6c373..84414419d2fd 100644 --- a/code/game/objects/items/devices/pressureplates.dm +++ b/code/game/objects/items/devices/pressureplates.dm @@ -5,7 +5,6 @@ icon = 'icons/obj/puzzle_small.dmi' item_state = "flash" icon_state = "pressureplate" - level = 1 layer = LOW_OBJ_LAYER var/trigger_mob = TRUE var/trigger_item = FALSE @@ -23,6 +22,7 @@ var/can_trigger = TRUE var/trigger_delay = 10 var/protected = FALSE + var/undertile_pressureplate = TRUE /obj/item/pressure_plate/Initialize(mapload) . = ..() @@ -31,8 +31,10 @@ sigdev = new sigdev.code = roundstart_signaller_code sigdev.frequency = roundstart_signaller_freq - if(isopenturf(loc)) - AddElement(/datum/element/undertile, tile_overlay = tile_overlay, use_anchor = TRUE) + + if(undertile_pressureplate) + AddElement(/datum/element/undertile, tile_overlay = tile_overlay, use_anchor = TRUE) + RegisterSignal(src, COMSIG_OBJ_HIDE, PROC_REF(ToggleActive)) /obj/item/pressure_plate/Crossed(atom/movable/AM) . = ..() @@ -77,20 +79,8 @@ else to_chat(user, span_notice("You turn [src] off.")) -/obj/item/pressure_plate/hide(yes) - if(yes) - invisibility = INVISIBILITY_MAXIMUM - anchored = TRUE - icon_state = null - active = TRUE - can_trigger = TRUE - if(tile_overlay) - loc.add_overlay(tile_overlay) - else - invisibility = initial(invisibility) - anchored = FALSE - icon_state = initial(icon_state) - active = FALSE - if(tile_overlay) - loc.overlays -= tile_overlay +///Called from COMSIG_OBJ_HIDE to toggle the active part, because yeah im not making a special exception on the element to support it +/obj/item/pressure_plate/proc/ToggleActive(datum/source, underfloor_accessibility) + SIGNAL_HANDLER + active = underfloor_accessibility < UNDERFLOOR_VISIBLE diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 39633ed98f4d..4950ae7cd3da 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -69,10 +69,7 @@ GENE SCANNER return var/list/t_ray_images = list() for(var/obj/O in orange(distance, viewer) ) - if(O.level != 1) - continue - - if(O.invisibility == INVISIBILITY_MAXIMUM || HAS_TRAIT(O, TRAIT_T_RAY_VISIBLE)) + if(HAS_TRAIT(O, TRAIT_T_RAY_VISIBLE)) var/image/I = new(loc = get_turf(O)) var/mutable_appearance/MA = new(O) MA.alpha = 128 diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index 977744dfae41..b098d3320d53 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -129,9 +129,15 @@ trigger_delay = 10 protected = TRUE resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + undertile_pressureplate = FALSE var/reward = /obj/item/reagent_containers/food/snacks/cookie var/claimed = FALSE +/obj/item/pressure_plate/hologrid/Initialize(mapload) + . = ..() + if(undertile_pressureplate) + AddElement(/datum/element/undertile, tile_overlay = tile_overlay, use_anchor = FALSE) //we remove use_anchor here, so it ALWAYS stays anchored + /obj/item/pressure_plate/hologrid/examine(mob/user) . = ..() if(claimed) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 9d8244d815de..39ef72ac0864 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -315,7 +315,6 @@ desc = "A very slim satchel that can easily fit into tight spaces." icon_state = "satchel-flat" w_class = WEIGHT_CLASS_NORMAL //Can fit in backpacks itself. - level = 1 /obj/item/storage/backpack/satchel/flat/Initialize(mapload) . = ..() @@ -324,18 +323,6 @@ STR.max_combined_w_class = 15 STR.set_holdable(null, list(/obj/item/storage/backpack/satchel/flat)) //muh recursive backpacks) -/obj/item/storage/backpack/satchel/flat/hide(intact) - if(intact) - invisibility = INVISIBILITY_OBSERVER - anchored = TRUE //otherwise you can start pulling, cover it, and drag around an invisible backpack. - icon_state = "[initial(icon_state)]2" - ADD_TRAIT(src, TRAIT_T_RAY_VISIBLE, TRAIT_GENERIC) - else - invisibility = initial(invisibility) - anchored = FALSE - icon_state = initial(icon_state) - REMOVE_TRAIT(src, TRAIT_T_RAY_VISIBLE, TRAIT_GENERIC) - /obj/item/storage/backpack/satchel/flat/PopulateContents() var/datum/supply_pack/costumes_toys/randomised/contraband/C = new for(var/i in 1 to 2) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 9b0f45b5b393..00e8c4dde120 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -102,7 +102,7 @@ /obj/blob_act(obj/structure/blob/B) if(isturf(loc)) var/turf/T = loc - if(T.intact && level == 1) //the blob doesn't destroy thing below the floor + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && HAS_TRAIT(src, TRAIT_T_RAY_VISIBLE)) return take_damage(400, BRUTE, MELEE, 0, get_dir(src, B)) @@ -215,8 +215,8 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e ///Called when the obj is exposed to fire. /obj/fire_act(exposed_temperature, exposed_volume) if(isturf(loc)) - var/turf/T = loc - if(T.intact && level == 1) //fire can't damage things hidden below the floor. + var/turf/our_turf = loc + if(our_turf.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && HAS_TRAIT(src, TRAIT_T_RAY_VISIBLE)) return if(exposed_temperature && !(resistance_flags & FIRE_PROOF)) take_damage(clamp(0.02 * exposed_temperature, 0, 20), BURN, FIRE, 0) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 3de6b5a2b975..0b9f71cc914b 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -63,6 +63,7 @@ smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_ALIEN_RESIN canSmoothWith = SMOOTH_GROUP_ALIEN_RESIN + var/resintype = null /obj/structure/alien/resin/Initialize(mapload) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index e7dc2d5b409c..6299ee2a76fb 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -359,7 +359,7 @@ /obj/structure/table/wood/fancy name = "fancy table" desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth." - icon = 'icons/obj/structures.dmi' + icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table.dmi', 'icons/obj/structures.dmi') icon_state = "fancy_table" base_icon_state = "fancy_table" frame = /obj/structure/table_frame @@ -367,60 +367,52 @@ buildstack = /obj/item/stack/tile/carpet smoothing_groups = SMOOTH_GROUP_FANCY_WOOD_TABLES //Don't smooth with SMOOTH_GROUP_TABLES or SMOOTH_GROUP_WOOD_TABLES canSmoothWith = SMOOTH_GROUP_FANCY_WOOD_TABLES - var/smooth_icon = 'icons/obj/smooth_structures/fancy_table.dmi' // see Initialize(mapload) - -/obj/structure/table/wood/fancy/Initialize(mapload) - . = ..() - // Needs to be set dynamically because table smooth sprites are 32x34, - // which the editor treats as a two-tile-tall object. The sprites are that - // size so that the north/south corners look nice - examine the detail on - // the sprites in the editor to see why. - icon = smooth_icon /obj/structure/table/wood/fancy/black icon_state = "fancy_table_black" buildstack = /obj/item/stack/tile/carpet/black - smooth_icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' + icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_black.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/exoticblue icon_state = "fancy_table_exoticblue" buildstack = /obj/item/stack/tile/carpet/exoticblue - smooth_icon = 'icons/obj/smooth_structures/fancy_table_exoticblue.dmi' + icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_exoticblue.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/cyan icon_state = "fancy_table_cyan" buildstack = /obj/item/stack/tile/carpet/cyan - smooth_icon = 'icons/obj/smooth_structures/fancy_table_cyan.dmi' + icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_cyan.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/exoticgreen icon_state = "fancy_table_exoticgreen" buildstack = /obj/item/stack/tile/carpet/exoticgreen - smooth_icon = 'icons/obj/smooth_structures/fancy_table_exoticgreen.dmi' + icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_exoticgreen.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/orange icon_state = "fancy_table_orange" buildstack = /obj/item/stack/tile/carpet/orange - smooth_icon = 'icons/obj/smooth_structures/fancy_table_orange.dmi' + icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_orange.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/exoticpurple icon_state = "fancy_table_exoticpurple" buildstack = /obj/item/stack/tile/carpet/exoticpurple - smooth_icon = 'icons/obj/smooth_structures/fancy_table_exoticpurple.dmi' + icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_exoticpurple.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/red icon_state = "fancy_table_red" buildstack = /obj/item/stack/tile/carpet/red - smooth_icon = 'icons/obj/smooth_structures/fancy_table_red.dmi' + icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_red.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/royalblack icon_state = "fancy_table_royalblack" buildstack = /obj/item/stack/tile/carpet/royalblack - smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblack.dmi' + icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_royalblack.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/royalblue icon_state = "fancy_table_royalblue" buildstack = /obj/item/stack/tile/carpet/royalblue - smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblue.dmi' + icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_royalblue.dmi', 'icons/obj/structures.dmi') + /* * Reinforced tables */ diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 8981b4ce4e45..f2c72e76b83e 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -329,7 +329,7 @@ QUEUE_SMOOTH_NEIGHBORS(src) //merges adjacent full-tile windows into one -/obj/structure/window/update_overlays() +/obj/structure/window/update_overlays(updates=ALL) . = ..() if(QDELETED(src) || !fulltile) return @@ -680,7 +680,6 @@ smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE state = RWINDOW_SECURE - level = 3 glass_amount = 2 /obj/structure/window/reinforced/fulltile/unanchored @@ -696,7 +695,6 @@ smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE - level = 3 glass_amount = 2 /obj/structure/window/reinforced/fulltile/ice @@ -704,7 +702,6 @@ icon_state = "rice_window-0" base_icon_state = "rice_window" max_integrity = 150 - level = 3 glass_amount = 2 /obj/structure/window/reinforced/fulltile/bronze @@ -731,7 +728,6 @@ smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE explosion_block = 3 - level = 3 glass_type = /obj/item/stack/sheet/titaniumglass glass_amount = 2 @@ -763,7 +759,6 @@ canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM explosion_block = 3 damage_deflection = 21 //The same as reinforced plasma windows. - level = 3 glass_type = /obj/item/stack/sheet/plastitaniumglass glass_amount = 2 rad_insulation = RAD_FULL_INSULATION @@ -839,7 +834,6 @@ flags_1 = PREVENT_CLICK_UNDER_1 dir = FULLTILE_WINDOW_DIR max_integrity = 600 - level = 3 glass_amount = 2 /obj/structure/window/reinforced/clockwork/spawnDebris(location) diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm index fad5d6cbee5a..0136e9796db3 100644 --- a/code/game/turfs/simulated/floor/plating/misc_plating.dm +++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm @@ -35,12 +35,13 @@ /turf/open/floor/plating/ashplanet - icon = 'icons/turf/mining.dmi' - gender = PLURAL name = "ash" + desc = "The ground is covered in volcanic ash." icon_state = "ash" + base_icon_state = "ash" + icon = MAP_SWITCH('icons/turf/floors/ash.dmi', 'icons/turf/mining.dmi') smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - desc = "The ground is covered in volcanic ash." + gender = PLURAL baseturfs = /turf/open/floor/plating/ashplanet/wateryrock //I assume this will be a chasm eventually, once this becomes an actual surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS planetary_atmos = TRUE @@ -51,16 +52,14 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = FALSE - var/smooth_icon = 'icons/turf/floors/ash.dmi' - /turf/open/floor/plating/ashplanet/Initialize(mapload) . = ..() - if(smoothing_flags & SMOOTH_BITMASK) - var/matrix/M = new - M.Translate(-4, -4) - transform = M - icon = smooth_icon - icon_state = "[icon_state]-[smoothing_junction]" + if(!(smoothing_flags & SMOOTH_BITMASK)) + return + var/matrix/M = new + M.Translate(-4, -4) + transform = M + icon_state = "[base_icon_state]-[smoothing_junction]" /turf/open/floor/plating/ashplanet/try_replace_tile(obj/item/stack/tile/T, mob/user, params) return @@ -80,7 +79,7 @@ /turf/open/floor/plating/ashplanet/rocky gender = PLURAL name = "rocky ground" - icon_state = "rockyash" + icon_state = "rocky_ash" base_icon_state = "rocky_ash" icon = MAP_SWITCH('icons/turf/floors/rocky_ash.dmi', 'icons/turf/mining.dmi') layer = MID_TURF_LAYER @@ -94,7 +93,8 @@ /turf/open/floor/plating/ashplanet/wateryrock gender = PLURAL name = "wet rocky ground" - icon_state = "wateryrock" + icon_state = "watery_rock" + base_icon_state = "watery_rock" smoothing_flags = NONE slowdown = 2 footstep = FOOTSTEP_FLOOR @@ -103,9 +103,8 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY /turf/open/floor/plating/ashplanet/wateryrock/Initialize(mapload) - icon_state = "[icon_state][rand(1, 9)]" - . = ..() - + icon_state = "[base_icon_state][rand(1, 9)]" + return ..() /turf/open/floor/plating/beach name = "beach" diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index da13fa2a09eb..42d75d1e52bc 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -17,9 +17,12 @@ clawfootstep = FOOTSTEP_LAVA heavyfootstep = FOOTSTEP_LAVA + /// The icon that covers the lava bits of our turf + var/mask_icon = 'icons/turf/floors.dmi' /// The icon state that covers the lava bits of our turf var/mask_state = "lava-lightmask" +/* //to add when emissives are added :thumbsup: /turf/open/lava/update_overlays() . = ..() // We need a light overlay here because not every lava turf casts light, only the edge ones @@ -34,6 +37,7 @@ light_mask.blend_mode = BLEND_MULTIPLY light_mask.color = list(-1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,1, 1,1,1,0) . += light_mask +*/ /turf/open/lava/ex_act(severity, target) contents_explosion(severity, target) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 2c48b953c4c3..10896ec5b30c 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -2,7 +2,6 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf icon = 'icons/turf/floors.dmi' - level = 1 luminosity = 1 var/dynamic_lighting = DYNAMIC_LIGHTING_ENABLED @@ -568,11 +567,12 @@ GLOBAL_LIST_EMPTY(station_turfs) acid_type = /obj/effect/acid/alien var/has_acid_effect = FALSE for(var/obj/O in src) - if(intact && O.location.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) //hidden under the floor + var/turf/loc = get_turf(O) + if(loc.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) //hidden under the floor continue if(istype(O, acid_type)) var/obj/effect/acid/A = O - A.acid_level = min(A.level + acid_volume * acidpwr, 12000)//capping acid level to limit power of the acid + A.acid_level = min(acid_volume * acidpwr, 12000)//capping acid level to limit power of the acid has_acid_effect = 1 continue O.acid_act(acidpwr, acid_volume) diff --git a/code/modules/antagonists/blob/blob_report.dm b/code/modules/antagonists/blob/blob_report.dm index f0d46888c2f6..d8ee7857d635 100644 --- a/code/modules/antagonists/blob/blob_report.dm +++ b/code/modules/antagonists/blob/blob_report.dm @@ -29,15 +29,11 @@ floor += 1 if(iswallturf(T)) - var/turf/closed/wall/TW = T - if(TW.intact) - wall += 2 - else - wall += 1 + wall += 1 if(istype(T, /turf/closed/wall/r_wall)) var/turf/closed/wall/r_wall/TRW = T - if(TRW.intact) + if(TRW.d_state == INTACT) r_wall += 2 else r_wall += 1 diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 73f2b391ca04..ad3d4dbf857f 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -7,9 +7,6 @@ // Pipes -> Pipelines // Pipelines + Other Objects -> Pipe network -#define PIPE_VISIBLE_LEVEL 2 -#define PIPE_HIDDEN_LEVEL 1 - GLOBAL_LIST_EMPTY(iconsetids) GLOBAL_LIST_EMPTY(pipeimages) @@ -33,6 +30,9 @@ GLOBAL_LIST_EMPTY(pipeimages) var/piping_layer = PIPING_LAYER_DEFAULT var/pipe_flags = NONE + ///This only works on pipes, because they have 1000 subtypes wich need to be visible and invisible under tiles, so we track this here + var/hide = TRUE + var/image/pipe_vision_img = null var/device_type = 0 @@ -64,6 +64,8 @@ GLOBAL_LIST_EMPTY(pipeimages) /obj/machinery/atmospherics/Initialize(mapload) if(init_processing) SSair_machinery.start_processing_machine(src) + if(hide) + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) //if changing this, change the subtypes RemoveElements too, because thats how bespoke works return ..() /obj/machinery/atmospherics/Destroy() @@ -216,11 +218,6 @@ GLOBAL_LIST_EMPTY(pipeimages) if(!can_unwrench(user)) return ..() - var/turf/T = get_turf(src) - if (level==1 && isturf(T) && T.intact) - to_chat(user, span_warning("You must remove the plating first!")) - return TRUE - var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() add_fingerprint(user) @@ -319,8 +316,6 @@ GLOBAL_LIST_EMPTY(pipeimages) add_atom_colour(obj_color, FIXED_COLOUR_PRIORITY) pipe_color = obj_color set_piping_layer(set_layer) - var/turf/T = get_turf(src) - level = T.intact ? 2 : 1 atmos_init() var/list/nodes = pipeline_expansion() for(var/obj/machinery/atmospherics/A in nodes) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm b/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm index 5f3741f24519..8733af600244 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm @@ -13,10 +13,6 @@ if(EAST, WEST) initialize_directions = EAST|WEST -/obj/machinery/atmospherics/components/binary/hide(intact) - update_appearance(UPDATE_ICON) - ..() - /obj/machinery/atmospherics/components/binary/get_node_connects() return list(turn(dir, 180), dir) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm index d82bde6274b8..6e4e519edf5b 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm @@ -13,8 +13,8 @@ name = "dual-port air vent" desc = "Has a valve and pump attached to it. There are two ports." + hide = TRUE - level = 1 var/frequency = 0 var/id = null var/datum/radio_frequency/radio_connection diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index 2f1863532f74..c4c17760d6bd 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -2,18 +2,26 @@ // On top of that, now people can add component-speciic procs/vars if they want! /obj/machinery/atmospherics/components - var/welded = FALSE //Used on pumps and scrubbers - var/showpipe = TRUE - var/shift_underlay_only = TRUE //Layering only shifts underlay? - - var/update_parents_after_rebuild = FALSE + hide = FALSE + layer = GAS_PUMP_LAYER + ///Is the component welded? + var/welded = FALSE + ///Should the component should show the pipe underneath it? + var/showpipe = TRUE + ///When the component is on a non default layer should we shift everything? Or just the underlay pipe + var/shift_underlay_only = TRUE + ///Stores the parent pipeline, used in components var/list/datum/pipeline/parents + ///If this is queued for a rebuild this var signifies whether parents should be updated after it's done + var/update_parents_after_rebuild = FALSE + ///Stores the gasmix for each node, used in components var/list/datum/gas_mixture/airs - var/startingvolume = 200 - + ///Handles whether the custom reconcilation handling should be used var/custom_reconcilation = FALSE + var/startingvolume = 200 + /obj/machinery/atmospherics/components/New() parents = new(device_type) airs = new(device_type) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index 40d7ebc0af8c..6bedbe6f1c9a 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -7,6 +7,7 @@ use_power = IDLE_POWER_USE can_unwrench = TRUE shift_underlay_only = FALSE + hide = TRUE resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF //really helpful in building gas chambers for xenomorphs @@ -18,7 +19,6 @@ var/id = null var/datum/radio_frequency/radio_connection - level = 1 layer = GAS_SCRUBBER_LAYER pipe_state = "injector" diff --git a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm index 8a44fb2bcb61..4b9e5121aa63 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm @@ -4,6 +4,7 @@ desc = "It is an open vent." can_unwrench = TRUE layer = GAS_SCRUBBER_LAYER + hide = TRUE shift_underlay_only = FALSE pipe_state = "pvent" diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm index a5d1fe5b0a29..177c281d79e4 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm @@ -4,8 +4,8 @@ desc = "For connecting portables devices related to atmospherics control." can_unwrench = TRUE use_power = NO_POWER_USE - level = 0 layer = GAS_FILTER_LAYER + hide = TRUE shift_underlay_only = FALSE pipe_flags = PIPING_ONE_PER_TURF pipe_state = "connector" @@ -63,8 +63,8 @@ icon_state = "connector_map-4" /obj/machinery/atmospherics/components/unary/portables_connector/visible - level = 3 piping_layer = 3 + hide = FALSE /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2 piping_layer = 2 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm index b61cc02b516e..ae12b69d8928 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm @@ -20,10 +20,6 @@ ..() update_appearance(UPDATE_ICON) -/obj/machinery/atmospherics/components/unary/hide(intact) - update_appearance(UPDATE_ICON) - ..(intact) - /obj/machinery/atmospherics/components/unary/proc/assign_uid_vents() uid = num2text(gl_uid++) return uid diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 18c8cc194bfb..fced240852cc 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -14,8 +14,8 @@ use_power = IDLE_POWER_USE can_unwrench = TRUE welded = FALSE - level = 1 layer = GAS_SCRUBBER_LAYER + hide = TRUE shift_underlay_only = FALSE showpipe = FALSE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 4631397bb504..5a1d640884d5 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -11,8 +11,8 @@ active_power_usage = 60 can_unwrench = TRUE welded = FALSE - level = 1 layer = GAS_SCRUBBER_LAYER + hide = TRUE shift_underlay_only = FALSE showpipe = FALSE diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index 43721f5de7b1..457a8c174e54 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -1,11 +1,11 @@ /obj/machinery/atmospherics/pipe/heat_exchanging - level = 2 - var/minimum_temperature_difference = 20 - var/thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT color = "#404040" buckle_lying = -1 - var/icon_temperature = T20C //stop small changes in temperature causing icon refresh resistance_flags = LAVA_PROOF | FIRE_PROOF + hide = FALSE + var/minimum_temperature_difference = 20 + var/thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT + var/icon_temperature = T20C //stop small changes in temperature causing icon refresh /obj/machinery/atmospherics/pipe/heat_exchanging/Initialize(mapload) . = ..() @@ -14,10 +14,7 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/is_connectable(obj/machinery/atmospherics/pipe/heat_exchanging/target, given_layer, HE_type_check = TRUE) if(istype(target, /obj/machinery/atmospherics/pipe/heat_exchanging) != HE_type_check) return FALSE - . = ..() - -/obj/machinery/atmospherics/pipe/heat_exchanging/hide() - return + return ..() /obj/machinery/atmospherics/pipe/heat_exchanging/process_atmos() var/environment_temperature = 0 diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index d979f42c53a0..c2c11020b4ec 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -106,8 +106,6 @@ /obj/machinery/atmospherics/pipe/layer_manifold/atmos_init() normalize_cardinal_directions() findAllConnections() - var/turf/T = loc // hide if turf is not intact - hide(T.intact) /obj/machinery/atmospherics/pipe/layer_manifold/set_piping_layer() piping_layer = PIPING_LAYER_DEFAULT @@ -141,5 +139,4 @@ to_chat(user, "You align yourself with the [user.ventcrawl_layer]\th output.") /obj/machinery/atmospherics/pipe/layer_manifold/visible - level = PIPE_VISIBLE_LEVEL layer = GAS_PIPE_VISIBLE_LAYER diff --git a/code/modules/atmospherics/machinery/pipes/mapping.dm b/code/modules/atmospherics/machinery/pipes/mapping.dm index 887f7788b2b3..61ea729cf538 100644 --- a/code/modules/atmospherics/machinery/pipes/mapping.dm +++ b/code/modules/atmospherics/machinery/pipes/mapping.dm @@ -5,9 +5,9 @@ pipe_color = Color; \ color = Color; \ } \ - ##Fulltype/visible { \ - level = PIPE_VISIBLE_LEVEL; \ - layer = GAS_PIPE_VISIBLE_LAYER; \ + ##Fulltype/visible { \ + hide = FALSE; \ + layer = GAS_PIPE_VISIBLE_LAYER; \ FASTDMM_PROP(pipe_group = "atmos-[piping_layer]-"+Type+"-visible");\ } \ ##Fulltype/visible/layer2 { \ @@ -19,7 +19,7 @@ icon_state = Iconbase + "-4"; \ } \ ##Fulltype/hidden { \ - level = PIPE_HIDDEN_LEVEL; \ + hide = TRUE; \ FASTDMM_PROP(pipe_group = "atmos-[piping_layer]-"+Type+"-hidden");\ } \ ##Fulltype/hidden/layer2 { \ diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 927e0a3ef46d..c904e40ebd4f 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -2,8 +2,6 @@ var/datum/gas_mixture/air_temporary //used when reconstructing a pipeline that broke var/volume = 0 - level = 1 - use_power = NO_POWER_USE can_unwrench = 1 var/datum/pipeline/parent = null @@ -18,10 +16,6 @@ ),\ ) -/obj/machinery/atmospherics/pipe/Initialize(mapload) - . = ..() - AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) //if changing this, change the subtypes RemoveElements too, because thats how bespoke works - /obj/machinery/atmospherics/pipe/New(mapload) add_atom_colour(pipe_color, FIXED_COLOUR_PRIORITY) volume = 35 * device_type @@ -42,16 +36,6 @@ parent = new return list(parent) -/obj/machinery/atmospherics/pipe/atmos_init() - var/turf/T = loc // hide if turf is not intact - hide(T.intact) - ..() - -/obj/machinery/atmospherics/pipe/hide(i) - if(level == 1 && isturf(loc)) - invisibility = i ? INVISIBILITY_MAXIMUM : 0 - update_appearance(UPDATE_ICON) - /obj/machinery/atmospherics/pipe/proc/releaseAirToTurf() if(air_temporary) var/turf/T = loc diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index 8d2fc26e966d..fda9e32c3c5e 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -224,7 +224,7 @@ /obj/machinery/computer/holodeck/proc/floorcheck() for(var/turf/T in linked) - if(!T.intact || isspaceturf(T)) + if(T.underfloor_accessibility >= UNDERFLOOR_INTERACTABLE || isspaceturf(T)) return FALSE return TRUE diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 6a604037a7a7..50dc28ac4194 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -250,9 +250,9 @@ #define MAPLOADING_CHECK_TICK \ if(TICK_CHECK) { \ - SSatoms.map_loader_stop(); \ + SSatoms.map_loader_stop(REF(src)); \ stoplag(); \ - SSatoms.map_loader_begin(); \ + SSatoms.map_loader_begin(REF(src)); \ } // Do not call except via load() above. @@ -260,7 +260,7 @@ PRIVATE_PROC(TRUE) // Tell ss atoms that we're doing maploading // We'll have to account for this in the following tick_checks so it doesn't overflow - SSatoms.map_loader_begin() + SSatoms.map_loader_begin(REF(src)) // Loading used to be done in this proc // We make the assumption that if the inner procs runtime, we WANT to do cleanup on them, but we should stil tell our parents we failed @@ -273,7 +273,7 @@ sucessful = _dmm_load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z) // And we are done lads, call it off - SSatoms.map_loader_stop() + SSatoms.map_loader_stop(REF(src)) if(new_z) for(var/z_index in bounds[MAP_MINZ] to bounds[MAP_MAXZ]) @@ -404,7 +404,7 @@ var/list/cache = modelCache[gset.gridLines[i]] if(!cache) - SSatoms.map_loader_stop() + SSatoms.map_loader_stop(REF(src)) CRASH("Undefined model key in DMM: [gset.gridLines[i]]") build_coordinate(cache, locate(true_xcrd, ycrd, zcrd), no_afterchange, placeOnTop, new_z) @@ -945,6 +945,7 @@ GLOBAL_LIST_EMPTY(map_model_default) /datum/parsed_map/Destroy() ..() + SSatoms.map_loader_stop(REF(src)) // Just in case, I don't want to double up here if(turf_blacklist) turf_blacklist.Cut() parsed_bounds.Cut() diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 6f2f8e73ed36..8aa2bff2d42e 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1020,10 +1020,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/list/t_ray_images = list() var/static/list/stored_t_ray_images = list() for(var/obj/O in orange(client.view, src) ) - if(O.level != 1) - continue - - if(O.invisibility == INVISIBILITY_MAXIMUM) + if(HAS_TRAIT(O, TRAIT_T_RAY_VISIBLE)) var/image/I = new(loc = get_turf(O)) var/mutable_appearance/MA = new(O) MA.alpha = 128 @@ -1031,7 +1028,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp I.appearance = MA t_ray_images += I stored_t_ray_images += t_ray_images - if(t_ray_images.len) + if(length(t_ray_images)) if(t_ray_view) client.images += t_ray_images else diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 0db366f360e3..020f212798ec 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -103,7 +103,7 @@ GLOBAL_VAR_INIT(mouse_killed, 0) /mob/living/simple_animal/mouse/handle_automated_action() if(prob(chew_probability)) var/turf/open/floor/F = get_turf(src) - if(istype(F) && !F.intact) + if(istype(F) && !F.underfloor_accessibility >= UNDERFLOOR_INTERACTABLE) var/obj/structure/cable/C = locate() in F if(C && prob(15)) if(C.avail()) diff --git a/code/modules/mob/living/simple_animal/hostile/rat.dm b/code/modules/mob/living/simple_animal/hostile/rat.dm index a99c17ffc4eb..63785ab2dc26 100644 --- a/code/modules/mob/living/simple_animal/hostile/rat.dm +++ b/code/modules/mob/living/simple_animal/hostile/rat.dm @@ -81,7 +81,7 @@ if (!mind) if(prob(40)) var/turf/open/floor/F = get_turf(src) - if(istype(F) && !F.intact) + if(istype(F) && F.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) var/obj/structure/cable/C = locate() in F if(C && prob(15)) if(C.avail()) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 86e647815690..6747f04952d6 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -27,7 +27,6 @@ By design, d1 is the smallest direction and d2 is the highest desc = "A flexible, superconducting insulated cable for heavy-duty power transfer." icon = 'icons/obj/power_cond/cables.dmi' icon_state = "0-1" - level = 1 //is underfloor layer = WIRE_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER anchored = TRUE obj_flags = CAN_BE_HIT | ON_BLUEPRINTS @@ -83,7 +82,6 @@ By design, d1 is the smallest direction and d2 is the highest d1 = text2num( copytext( icon_state, 1, dash ) ) d2 = text2num( copytext( icon_state, dash+1 ) ) - var/turf/T = get_turf(src) // hide if turf is not intact AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) GLOB.cable_list += src //add it to the global cable list @@ -115,13 +113,6 @@ By design, d1 is the smallest direction and d2 is the highest // General procedures /////////////////////////////////// -//If underfloor, hide the cable -/obj/structure/cable/hide(i) - - if(level == 1 && isturf(loc)) - invisibility = i ? INVISIBILITY_MAXIMUM : 0 - update_appearance(UPDATE_ICON) - /obj/structure/cable/update_icon(updates=ALL) . = ..() icon_state = "[d1]-[d2]" @@ -675,14 +666,18 @@ By design, d1 is the smallest direction and d2 is the highest var/turf/T = C.loc - if(!isturf(T) || T.intact) // sanity checks, also stop use interacting with T-scanner revealed cable + if(!isturf(T) || T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE || !T.can_have_cabling()) + to_chat(user, span_warning("You can only lay cables on catwalks and plating!")) + return + + if(get_amount() < 1) // Out of cable + to_chat(user, span_warning("There is no cable left!")) return - if(get_dist(C, user) > 1) // make sure it's close enough + if(get_dist(C, user) > 1) // make sure it's close enough to_chat(user, span_warning("You can't lay cable at a place that far away!")) return - if(U == T && !forceddir) //if clicked on the turf we're standing on and a direction wasn't supplied, try to put a cable in the direction we're facing place_turf(T,user) return @@ -697,7 +692,7 @@ By design, d1 is the smallest direction and d2 is the highest if (showerror) to_chat(user, span_warning("You can only lay cables on catwalks and plating!")) return - if(U.intact) //can't place a cable if it's a plating with a tile on it + if(U.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) //can't place a cable if it's a plating with a tile on it to_chat(user, span_warning("You can't lay cable there unless the floor tiles are removed!")) return else diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 9e8e451fae02..d94ad80fc17f 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -7,7 +7,6 @@ name = "terminal" icon_state = "term" desc = "It's an underfloor wiring terminal for power equipment." - level = 1 layer = WIRE_TERMINAL_LAYER //a bit above wires var/obj/machinery/power/master = null @@ -22,15 +21,6 @@ master = null return ..() -/obj/machinery/power/terminal/hide(i) - if(i) - invisibility = INVISIBILITY_MAXIMUM - icon_state = "term-f" - else - invisibility = 0 - icon_state = "term" - - /obj/machinery/power/proc/can_terminal_dismantle() . = FALSE diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index c27e613b5c6b..ca3b71f99003 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -9,7 +9,6 @@ anchored = FALSE density = FALSE pressure_resistance = 5*ONE_ATMOSPHERE - level = 2 max_integrity = 200 var/obj/pipe_type = /obj/structure/disposalpipe/segment var/pipename @@ -47,10 +46,8 @@ if(is_pipe()) icon_state = "con[icon_state]" if(anchored) - level = initial(pipe_type.level) layer = initial(pipe_type.layer) else - level = initial(level) layer = initial(layer) else if(ispath(pipe_type, /obj/machinery/disposal/bin)) @@ -60,13 +57,6 @@ else icon_state = "condisposal" - -// hide called by levelupdate if turf intact status changes -// change visibility status and force update of icon -/obj/structure/disposalconstruct/hide(intact) - invisibility = (intact && level==1) ? INVISIBILITY_MAXIMUM: 0 // hide if floor is intact - update_appearance(UPDATE_ICON) - /obj/structure/disposalconstruct/proc/get_disposal_dir() if(!is_pipe()) return NONE diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index 8e7bc3937d48..32c30dc8552a 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -7,7 +7,6 @@ anchored = TRUE density = FALSE obj_flags = CAN_BE_HIT | ON_BLUEPRINTS - level = 1 // underfloor only dir = NONE // dir will contain dominant direction for junction pipes max_integrity = 200 armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30) @@ -42,7 +41,6 @@ dpdir |= turn(dir, 180) AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) - update() // pipe is deleted // ensure if holder is present, it is expelled @@ -81,16 +79,6 @@ H.forceMove(get_turf(src)) return null -// update the icon_state to reflect hidden status -/obj/structure/disposalpipe/proc/update() - var/turf/T = get_turf(src) - hide(T.intact && !isspaceturf(T)) // space never hides pipes - -// hide called by levelupdate if turf intact status changes -// change visibility status and force update of icon -/obj/structure/disposalpipe/hide(intact) - invisibility = intact ? INVISIBILITY_MAXIMUM: 0 // hide if floor is intact - // expel the held objects into a turf // called when there is a break in the pipe /obj/structure/disposalpipe/proc/expel(obj/structure/disposalholder/H, turf/T, direction) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 2a02cd5503a7..4b259f7f3a46 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -253,11 +253,6 @@ All ShuttleMove procs go here // atmosinit() calls update_appearance(UPDATE_ICON), so we don't need to call it update_appearance(UPDATE_ICON) -/obj/machinery/atmospherics/pipe/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) - . = ..() - var/turf/T = loc - hide(T.intact) - /obj/machinery/navbeacon/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() GLOB.navbeacons["[z]"] -= src @@ -265,8 +260,6 @@ All ShuttleMove procs go here /obj/machinery/navbeacon/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) . = ..() - var/turf/T = loc - hide(T.intact) if(codes["patrol"]) if(!GLOB.navbeacons["[z]"]) GLOB.navbeacons["[z]"] = list() @@ -275,12 +268,6 @@ All ShuttleMove procs go here GLOB.deliverybeacons += src GLOB.deliverybeacontags += location -/obj/machinery/power/terminal/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) - . = ..() - var/turf/T = src.loc - if(level==1) - hide(T.intact) - /************************************Item move procs************************************/ /obj/item/storage/pod/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) @@ -336,16 +323,6 @@ All ShuttleMove procs go here if(. & MOVE_AREA) . |= MOVE_CONTENTS -/obj/structure/disposalpipe/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) - . = ..() - update() - -/obj/structure/cable/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) - . = ..() - var/turf/T = loc - if(level==1) - hide(T.intact) - /obj/structure/shuttle/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(. & MOVE_AREA) diff --git a/icons/turf/floors/rocky_ash.dmi b/icons/turf/floors/rocky_ash.dmi index 2a57edfc53a404cb9986043ce3d1642f67aee273..d0c12fed2a87e44a35ea8acb0a8dcd7cf5153479 100644 GIT binary patch literal 8601 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 A3;+NC literal 3004 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 aSBpyW+-BH05UcvBLj>#y@+ Date: Wed, 6 Dec 2023 02:01:12 -0500 Subject: [PATCH 125/281] extra shit --- .../IceRuins/icemoon_surface_syndicate.dmm | 3 +- .../StationRuins/BoxStation/engine_sm.dmm | 3 +- _maps/RandomZLevels/moonoutpost19.dmm | 3 +- _maps/RandomZLevels/undergroundoutpost45.dmm | 40 +++----- .../AsteroidStation/AsteroidStation.dmm | 3 +- _maps/map_files/GaxStation/GaxStation.dmm | 3 +- _maps/map_files/YogStation/YogStation.dmm | 10 +- code/__DEFINES/icon_smoothing.dm | 97 +++++++++---------- code/game/atom/_atom.dm | 3 - code/game/objects/structures/lattice.dm | 3 +- 10 files changed, 70 insertions(+), 98 deletions(-) diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_syndicate.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_syndicate.dmm index 4422f1676409..6a62784416f4 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_syndicate.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_syndicate.dmm @@ -1697,8 +1697,7 @@ /area/ruin/syndicate_icemoon/medical) "lY" = ( /obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4; - level = 2 + dir = 4 }, /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_icemoon/engine) diff --git a/_maps/RandomRuins/StationRuins/BoxStation/engine_sm.dmm b/_maps/RandomRuins/StationRuins/BoxStation/engine_sm.dmm index 733a2ef2a261..2be707c2207d 100644 --- a/_maps/RandomRuins/StationRuins/BoxStation/engine_sm.dmm +++ b/_maps/RandomRuins/StationRuins/BoxStation/engine_sm.dmm @@ -1246,8 +1246,7 @@ "dI" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4; - level = 2 + dir = 4 }, /turf/open/floor/engine, /area/engine/engineering) diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 1e0cf6ce459a..b2faff225898 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -2291,8 +2291,7 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/manifold{ - dir = 4; - level = 2 + dir = 4 }, /turf/open/floor/plasteel/white, /area/awaymission/moonoutpost19/research) diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index 3bb3fb1b1440..0d42897eb659 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -611,8 +611,7 @@ /area/awaymission/undergroundoutpost45/central) "bB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5; - level = 1 + dir = 5 }, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -637,8 +636,7 @@ /area/awaymission/undergroundoutpost45/central) "bD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10; - level = 1 + dir = 10 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -796,8 +794,7 @@ /area/awaymission/undergroundoutpost45/central) "bV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10; - level = 1 + dir = 10 }, /turf/closed/wall, /area/awaymission/undergroundoutpost45/central) @@ -1189,8 +1186,7 @@ /area/awaymission/undergroundoutpost45/central) "cM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5; - level = 2 + dir = 5 }, /turf/open/floor/plating{ heat_capacity = 1e+006 @@ -1274,8 +1270,7 @@ /area/awaymission/undergroundoutpost45/central) "cV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10; - level = 1 + dir = 10 }, /turf/closed/wall/rust, /area/awaymission/undergroundoutpost45/central) @@ -3014,15 +3009,13 @@ /area/awaymission/undergroundoutpost45/central) "gc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5; - level = 1 + dir = 5 }, /turf/closed/wall/r_wall, /area/awaymission/undergroundoutpost45/central) "gd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10; - level = 1 + dir = 10 }, /turf/closed/wall/r_wall, /area/awaymission/undergroundoutpost45/central) @@ -3917,8 +3910,7 @@ /area/awaymission/undergroundoutpost45/crew_quarters) "hU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4; - level = 2 + dir = 4 }, /obj/structure/table, /obj/item/book/manual/chef_recipes, @@ -3930,8 +3922,7 @@ "hV" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4; - level = 2 + dir = 4 }, /turf/open/floor/plating{ heat_capacity = 1e+006 @@ -4490,8 +4481,7 @@ /area/awaymission/undergroundoutpost45/gateway) "iX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10; - level = 1 + dir = 10 }, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 @@ -9779,8 +9769,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4; - level = 2 + dir = 4 }, /obj/machinery/door/airlock/maintenance{ name = "Research Maintenance"; @@ -11090,8 +11079,7 @@ /area/awaymission/undergroundoutpost45/engineering) "tK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5; - level = 1 + dir = 5 }, /turf/closed/wall/rust, /area/awaymission/undergroundoutpost45/research) @@ -11744,7 +11732,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/computer/atmos_control{ dir = 4; - level = 3; name = "Distribution and Waste Monitor"; sensors = list("UO45_air_sensor" = "Mixed Air Supply Tank", "UO45_distro_meter" = "Distribution Loop", "UO45_waste_meter" = "Waste Loop") }, @@ -11758,8 +11745,7 @@ /area/awaymission/undergroundoutpost45/engineering) "uV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5; - level = 1 + dir = 5 }, /obj/structure/chair/office/dark{ dir = 8 diff --git a/_maps/map_files/AsteroidStation/AsteroidStation.dmm b/_maps/map_files/AsteroidStation/AsteroidStation.dmm index e21554301c0c..9ab34cd54dc4 100644 --- a/_maps/map_files/AsteroidStation/AsteroidStation.dmm +++ b/_maps/map_files/AsteroidStation/AsteroidStation.dmm @@ -74962,8 +74962,7 @@ /area/tcommsat/server) "wJw" = ( /obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4; - level = 2 + dir = 4 }, /turf/closed/wall, /area/engine/atmos/storage) diff --git a/_maps/map_files/GaxStation/GaxStation.dmm b/_maps/map_files/GaxStation/GaxStation.dmm index eb04435ea5f7..e04f23cdf1d5 100644 --- a/_maps/map_files/GaxStation/GaxStation.dmm +++ b/_maps/map_files/GaxStation/GaxStation.dmm @@ -14329,8 +14329,7 @@ /area/hallway/secondary/entry) "gRV" = ( /obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4; - level = 2 + dir = 4 }, /turf/closed/wall/r_wall, /area/engine/atmos/distro) diff --git a/_maps/map_files/YogStation/YogStation.dmm b/_maps/map_files/YogStation/YogStation.dmm index c460a527c8c9..4d0f7e801bd6 100644 --- a/_maps/map_files/YogStation/YogStation.dmm +++ b/_maps/map_files/YogStation/YogStation.dmm @@ -3175,9 +3175,7 @@ /turf/open/floor/plasteel, /area/security/processing) "axJ" = ( -/obj/machinery/atmospherics/pipe/layer_manifold{ - level = 2 - }, +/obj/machinery/atmospherics/pipe/layer_manifold, /turf/closed/wall/r_wall, /area/engine/atmos/mix) "axL" = ( @@ -37026,8 +37024,7 @@ "kRZ" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 6; - layer = 2.35; - level = 1 + layer = 2.35 }, /turf/closed/wall, /area/science/mixing) @@ -54097,8 +54094,7 @@ /area/security/brig) "rrF" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ - layer = 2.35; - level = 1 + layer = 2.35 }, /turf/closed/wall, /area/science/mixing) diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index d4503b4e1efc..05844512da3d 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -89,56 +89,53 @@ DEFINE_BITFIELD(smoothing_junction, list( #define SMOOTH_GROUP_CARPET_ROYAL_BLACK S_TURF(18) ///turf/open/indestructible/carpet/royal/black #define SMOOTH_GROUP_CARPET_ROYAL_GREEN S_TURF(19) ///turf/open/indestructible/carpet/royal/black #define SMOOTH_GROUP_CARPET_ROYAL_BLUE S_TURF(20) ///turf/open/indestructible/carpet/royal/blue - -//TODO INCREASE IT ALL BY ONE - -#define SMOOTH_GROUP_CARPET_ROYAL_PURPLE S_TURF(20) ///turf/open/indestructible/carpet/royal/purple -#define SMOOTH_GROUP_CARPET_EXECUTIVE S_TURF(21) ///turf/open/floor/carpet/executive -#define SMOOTH_GROUP_CARPET_STELLAR S_TURF(22) ///turf/open/floor/carpet/stellar -#define SMOOTH_GROUP_CARPET_DONK S_TURF(23) ///turf/open/floor/carpet/donk -#define SMOOTH_GROUP_CARPET_NEON S_TURF(24) //![turf/open/floor/carpet/neon] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON S_TURF(25) //![turf/open/floor/carpet/neon/simple] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE S_TURF(26) //![turf/open/floor/carpet/neon/simple/white] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK S_TURF(27) //![turf/open/floor/carpet/neon/simple/black] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED S_TURF(28) //![turf/open/floor/carpet/neon/simple/red] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE S_TURF(29) //![turf/open/floor/carpet/neon/simple/orange] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW S_TURF(30) //![turf/open/floor/carpet/neon/simple/yellow] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME S_TURF(31) //![turf/open/floor/carpet/neon/simple/lime] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN S_TURF(32) //![turf/open/floor/carpet/neon/simple/green] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL S_TURF(33) //![turf/open/floor/carpet/neon/simple/teal] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN S_TURF(34) //![turf/open/floor/carpet/neon/simple/cyan] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE S_TURF(35) //![turf/open/floor/carpet/neon/simple/blue] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE S_TURF(36) //![turf/open/floor/carpet/neon/simple/purple] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET S_TURF(37) //![turf/open/floor/carpet/neon/simple/violet] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK S_TURF(38) //![turf/open/floor/carpet/neon/simple/pink] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_NODOTS S_TURF(39) //![turf/open/floor/carpet/neon/simple/nodots] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE_NODOTS S_TURF(40) //![turf/open/floor/carpet/neon/simple/white/nodots] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK_NODOTS S_TURF(41) //![turf/open/floor/carpet/neon/simple/black/nodots] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED_NODOTS S_TURF(42) //![turf/open/floor/carpet/neon/simple/red/nodots] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE_NODOTS S_TURF(43) //![turf/open/floor/carpet/neon/simple/orange/nodots] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW_NODOTS S_TURF(44) //![turf/open/floor/carpet/neon/simple/yellow/nodots] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME_NODOTS S_TURF(45) //![turf/open/floor/carpet/neon/simple/lime/nodots] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN_NODOTS S_TURF(46) //![turf/open/floor/carpet/neon/simple/green/nodots] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL_NODOTS S_TURF(47) //![turf/open/floor/carpet/neon/simple/teal/nodots] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN_NODOTS S_TURF(48) //![turf/open/floor/carpet/neon/simple/cyan/nodots] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE_NODOTS S_TURF(49) //![turf/open/floor/carpet/neon/simple/blue/nodots] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE_NODOTS S_TURF(50) //![turf/open/floor/carpet/neon/simple/purple/nodots] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET_NODOTS S_TURF(51) //![turf/open/floor/carpet/neon/simple/violet/nodots] -#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK_NODOTS S_TURF(52) //![turf/open/floor/carpet/neon/simple/pink/nodots] -#define SMOOTH_GROUP_BAMBOO_FLOOR S_TURF(53) //![/turf/open/floor/bamboo] -#define SMOOTH_GROUP_BRAZIL S_TURF(54) ///turf/open/indestructible/brazil/lostit - -#define SMOOTH_GROUP_CLOSED_TURFS S_TURF(54) ///turf/closed -#define SMOOTH_GROUP_MATERIAL_WALLS S_TURF(55) ///turf/closed/wall/material -#define SMOOTH_GROUP_SYNDICATE_WALLS S_TURF(56) ///turf/closed/wall/r_wall/syndicate, /turf/closed/indestructible/syndicate -#define SMOOTH_GROUP_HOTEL_WALLS S_TURF(57) ///turf/closed/indestructible/hotelwall -#define SMOOTH_GROUP_MINERAL_WALLS S_TURF(58) ///turf/closed/mineral, /turf/closed/indestructible -#define SMOOTH_GROUP_BOSS_WALLS S_TURF(59) ///turf/closed/indestructible/riveted/boss -#define SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS S_TURF(60) ///turf/closed/wall/mineral/titanium/survival -#define SMOOTH_GROUP_TURF_OPEN_CLIFF S_TURF(61) ///turf/open/cliff -#define SMOOTH_GROUP_TURF_BALLPIT S_TURF(62) ///turf/open/floor/ballpit - -#define MAX_S_TURF 62 //Always match this value with the one above it. +#define SMOOTH_GROUP_CARPET_ROYAL_PURPLE S_TURF(21) ///turf/open/indestructible/carpet/royal/purple +#define SMOOTH_GROUP_CARPET_EXECUTIVE S_TURF(22) ///turf/open/floor/carpet/executive +#define SMOOTH_GROUP_CARPET_STELLAR S_TURF(23) ///turf/open/floor/carpet/stellar +#define SMOOTH_GROUP_CARPET_DONK S_TURF(24) ///turf/open/floor/carpet/donk +#define SMOOTH_GROUP_CARPET_NEON S_TURF(25) //![turf/open/floor/carpet/neon] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON S_TURF(26) //![turf/open/floor/carpet/neon/simple] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE S_TURF(27) //![turf/open/floor/carpet/neon/simple/white] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK S_TURF(28) //![turf/open/floor/carpet/neon/simple/black] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED S_TURF(29) //![turf/open/floor/carpet/neon/simple/red] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE S_TURF(30) //![turf/open/floor/carpet/neon/simple/orange] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW S_TURF(31) //![turf/open/floor/carpet/neon/simple/yellow] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME S_TURF(32) //![turf/open/floor/carpet/neon/simple/lime] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN S_TURF(33) //![turf/open/floor/carpet/neon/simple/green] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL S_TURF(34) //![turf/open/floor/carpet/neon/simple/teal] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN S_TURF(35) //![turf/open/floor/carpet/neon/simple/cyan] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE S_TURF(36) //![turf/open/floor/carpet/neon/simple/blue] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE S_TURF(37) //![turf/open/floor/carpet/neon/simple/purple] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET S_TURF(38) //![turf/open/floor/carpet/neon/simple/violet] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK S_TURF(39) //![turf/open/floor/carpet/neon/simple/pink] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_NODOTS S_TURF(40) //![turf/open/floor/carpet/neon/simple/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE_NODOTS S_TURF(41) //![turf/open/floor/carpet/neon/simple/white/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK_NODOTS S_TURF(42) //![turf/open/floor/carpet/neon/simple/black/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED_NODOTS S_TURF(43) //![turf/open/floor/carpet/neon/simple/red/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE_NODOTS S_TURF(44) //![turf/open/floor/carpet/neon/simple/orange/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW_NODOTS S_TURF(45) //![turf/open/floor/carpet/neon/simple/yellow/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME_NODOTS S_TURF(46) //![turf/open/floor/carpet/neon/simple/lime/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN_NODOTS S_TURF(47) //![turf/open/floor/carpet/neon/simple/green/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL_NODOTS S_TURF(48) //![turf/open/floor/carpet/neon/simple/teal/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN_NODOTS S_TURF(49) //![turf/open/floor/carpet/neon/simple/cyan/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE_NODOTS S_TURF(50) //![turf/open/floor/carpet/neon/simple/blue/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE_NODOTS S_TURF(51) //![turf/open/floor/carpet/neon/simple/purple/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET_NODOTS S_TURF(52) //![turf/open/floor/carpet/neon/simple/violet/nodots] +#define SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK_NODOTS S_TURF(53) //![turf/open/floor/carpet/neon/simple/pink/nodots] +#define SMOOTH_GROUP_BAMBOO_FLOOR S_TURF(54) //![/turf/open/floor/bamboo] +#define SMOOTH_GROUP_BRAZIL S_TURF(55) ///turf/open/indestructible/brazil/lostit + +#define SMOOTH_GROUP_CLOSED_TURFS S_TURF(56) ///turf/closed +#define SMOOTH_GROUP_MATERIAL_WALLS S_TURF(57) ///turf/closed/wall/material +#define SMOOTH_GROUP_SYNDICATE_WALLS S_TURF(58) ///turf/closed/wall/r_wall/syndicate, /turf/closed/indestructible/syndicate +#define SMOOTH_GROUP_HOTEL_WALLS S_TURF(59) ///turf/closed/indestructible/hotelwall +#define SMOOTH_GROUP_MINERAL_WALLS S_TURF(60) ///turf/closed/mineral, /turf/closed/indestructible +#define SMOOTH_GROUP_BOSS_WALLS S_TURF(61) ///turf/closed/indestructible/riveted/boss +#define SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS S_TURF(62) ///turf/closed/wall/mineral/titanium/survival +#define SMOOTH_GROUP_TURF_OPEN_CLIFF S_TURF(63) ///turf/open/cliff +#define SMOOTH_GROUP_TURF_BALLPIT S_TURF(64) ///turf/open/floor/ballpit + +#define MAX_S_TURF 64 //Always match this value with the one above it. #define S_OBJ(num) ("-" + #num + ",") /* /obj included */ diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index f7c5b8b8a29b..91d5c1de82e6 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -209,9 +209,6 @@ if (light_system == STATIC_LIGHT && light_power && light_range) update_light() - if (canSmoothWith) - canSmoothWith = typelist("canSmoothWith", canSmoothWith) - if(custom_materials && custom_materials.len) var/temp_list = list() for(var/i in custom_materials) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 43ddfe40434c..6c2175fcf068 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -2,7 +2,8 @@ name = "lattice" desc = "A lightweight support lattice. These hold our station together." icon = 'icons/obj/smooth_structures/lattice.dmi' - icon_state = "lattice" + icon_state = "lattice-255" + base_icon_state = "lattice" density = FALSE anchored = TRUE armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50) From 868313131923f13c1a6bd1f186f3567ec3632562 Mon Sep 17 00:00:00 2001 From: JohnFulpWillard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 6 Dec 2023 03:35:55 -0500 Subject: [PATCH 126/281] fixes --- code/__HELPERS/icon_smoothing.dm | 8 +++-- code/datums/mutable_appearance.dm | 33 ++++++++++++------- code/game/atom/_atom.dm | 1 + code/game/objects/structures/aliens.dm | 32 ++++++++++++------ .../structures/beds_chairs/alien_nest.dm | 4 +-- code/game/objects/structures/catwalk.dm | 3 +- code/game/objects/structures/false_walls.dm | 6 ++-- code/game/objects/structures/lattice.dm | 1 - code/game/turfs/simulated/wall/reinf_walls.dm | 3 +- code/game/turfs/simulated/walls.dm | 3 +- 10 files changed, 62 insertions(+), 32 deletions(-) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 6a1cfd6191a3..09a07b8a2342 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -406,7 +406,11 @@ xxx xxx xxx // We're building 2 different types of smoothing searches here // One for standard bitmask smoothing (We provide a label so our macro can eary exit, as it wants to do) - #define SET_ADJ_IN_DIR(direction, direction_flag) do { set_adj_in_dir: { SEARCH_ADJ_IN_DIR(direction, direction_flag, BITMASK_FOUND, BITMASK_FOUND, BITMASK_ON_BORDER_CHECK) }} while(FALSE) + #define SET_ADJ_IN_DIR(direction, direction_flag) \ + do { set_adj_in_dir: { \ + SEARCH_ADJ_IN_DIR(direction, direction_flag, BITMASK_FOUND, BITMASK_FOUND, BITMASK_ON_BORDER_CHECK) \ + }} \ + while(FALSE) // and another for border object work (Doesn't early exit because we can hit more then one direction by checking the same turf) #define SET_BORDER_ADJ_IN_DIR(direction) SEARCH_ADJ_IN_DIR(direction, direction, BORDER_FOUND, WORLD_BORDER_FOUND, BORDER_ON_BORDER_CHECK) @@ -491,7 +495,7 @@ xxx xxx xxx var/junction_dir = reverse_ndir(smoothing_junction) var/turned_adjacency = REVERSE_DIR(junction_dir) var/turf/neighbor_turf = get_step(src, turned_adjacency & (NORTH|SOUTH)) - var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, offset_spokesman = src, plane = FLOOR_PLANE) + var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, plane = FLOOR_PLANE) if(!neighbor_turf.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) neighbor_turf = get_step(src, turned_adjacency & (EAST|WEST)) diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index f248da2a7323..eeb022a49352 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -4,18 +4,27 @@ // Mutable appearances are children of images, just so you know. -/mutable_appearance/New() +// Mutable appearances erase template vars on new, because they accept an appearance to copy as an arg +// If we have nothin to copy, we set the float plane +/mutable_appearance/New(mutable_appearance/to_copy) ..() - plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE - // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var + if(!to_copy) + plane = FLOAT_PLANE -// Helper similar to image() +/** Helper similar to image() + * + * icon - Our appearance's icon + * icon_state - Our appearance's icon state + * layer - Our appearance's layer + * plane - The plane to use for the appearance. If this is not FLOAT_PLANE we require context for the offset to use + * alpha - Our appearance's alpha + * appearance_flags - Our appearance's appearance_flags +**/ /proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE) - var/mutable_appearance/MA = new() - MA.icon = icon - MA.icon_state = icon_state - MA.layer = layer - MA.plane = plane - MA.alpha = alpha - MA.appearance_flags |= appearance_flags - return MA + var/mutable_appearance/appearance = new() + appearance.icon = icon + appearance.icon_state = icon_state + appearance.layer = layer + appearance.alpha = alpha + appearance.appearance_flags |= appearance_flags + return appearance diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index 91d5c1de82e6..a8a3d6215c37 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -136,6 +136,7 @@ var/list/canSmoothWith = null var/atom/orbit_target //Reference to atom being orbited + /** * Called when an atom is created in byond (built in engine proc) * diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 0b9f71cc914b..8778c7d18ab2 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -139,16 +139,24 @@ /turf/open/chasm, /turf/open/lava)) + set_base_icon() last_expand = world.time + rand(growth_cooldown_low, growth_cooldown_high) - if(icon == initial(icon)) - switch(rand(1,3)) - if(1) - icon = 'icons/obj/smooth_structures/alien/weeds1.dmi' - if(2) - icon = 'icons/obj/smooth_structures/alien/weeds2.dmi' - if(3) - icon = 'icons/obj/smooth_structures/alien/weeds3.dmi' + +///Randomizes the weeds' starting icon, gets redefined by children for them not to share the behavior. +/obj/structure/alien/weeds/proc/set_base_icon() + . = base_icon_state + switch(rand(1,3)) + if(1) + icon = 'icons/obj/smooth_structures/alien/weeds1.dmi' + base_icon_state = "weeds1" + if(2) + icon = 'icons/obj/smooth_structures/alien/weeds2.dmi' + base_icon_state = "weeds2" + if(3) + icon = 'icons/obj/smooth_structures/alien/weeds3.dmi' + base_icon_state = "weeds3" + set_smoothed_icon_state(smoothing_junction) /obj/structure/alien/weeds/Click(atom/A) var/turf/T = loc @@ -183,14 +191,15 @@ /obj/structure/alien/weeds/node name = "glowing resin" desc = "Blue bioluminescence shines from beneath the surface." - icon_state = "weednode" + icon = 'icons/obj/smooth_structures/alien/weednode.dmi' + icon_state = "weednode-0" + base_icon_state = "weednode" light_color = LIGHT_COLOR_BLUE light_power = 0.5 var/lon_range = 4 var/node_range = NODERANGE /obj/structure/alien/weeds/node/Initialize(mapload) - icon = 'icons/obj/smooth_structures/alien/weednode.dmi' . = ..() set_light(lon_range) var/obj/structure/alien/weeds/W = locate(/obj/structure/alien/weeds) in loc @@ -208,6 +217,9 @@ if(W.expand()) W.last_expand = world.time + rand(growth_cooldown_low, growth_cooldown_high) +/obj/structure/alien/weeds/node/set_base_icon() + return //No icon randomization at init. The node's icon is already well defined. + #undef NODERANGE diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 53970143aebe..dd18b16b135c 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -4,13 +4,13 @@ name = "alien nest" desc = "It's a gruesome pile of thick, sticky resin shaped like a nest." icon = 'icons/obj/smooth_structures/alien/nest.dmi' - icon_state = "nest" + icon_state = "nest-0" + base_icon_state = "nest" max_integrity = 120 smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_ALIEN_NEST canSmoothWith = SMOOTH_GROUP_ALIEN_NEST can_be_unanchored = FALSE - canSmoothWith = null buildstacktype = null flags_1 = NODECONSTRUCT_1 bolts = FALSE diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index f38b820b249b..f9ba10381828 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -2,7 +2,8 @@ name = "catwalk" desc = "A catwalk for easier EVA maneuvering and cable placement." icon = 'icons/obj/smooth_structures/catwalk.dmi' - icon_state = "catwalk" + icon_state = "catwalk-0" + base_icon_state = "catwalk" number_of_rods = 2 smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_CATWALK + SMOOTH_GROUP_LATTICE + SMOOTH_GROUP_OPEN_FLOOR diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 5ae78e1c9da2..ed25a37e1eed 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -6,7 +6,8 @@ desc = "A huge chunk of metal used to separate rooms." anchored = TRUE icon = 'icons/turf/walls/wall.dmi' - icon_state = "wall" + icon_state = "wall-0" + base_icon_state = "wall" layer = CLOSED_TURF_LAYER density = TRUE opacity = TRUE @@ -157,7 +158,8 @@ name = "reinforced wall" desc = "A huge chunk of reinforced metal used to separate rooms." icon = 'icons/turf/walls/reinforced_wall.dmi' - icon_state = "r_wall" + icon_state = "reinforced_wall-0" + base_icon_state = "reinforced_wall" walltype = /turf/closed/wall/r_wall mineral = /obj/item/stack/sheet/plasteel diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 6c2175fcf068..4d73a9dad331 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -74,7 +74,6 @@ icon = 'icons/obj/smooth_structures/lattice_clockwork.dmi' /obj/structure/lattice/clockwork/Initialize(mapload) - canSmoothWith += /turf/open/indestructible/clock_spawn_room //list overrides are a terrible thing . = ..() ratvar_act() if(is_reebe(z)) diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 72db8935f8b0..46c34c1b5581 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -2,7 +2,8 @@ name = "reinforced wall" desc = "A huge chunk of reinforced metal used to separate rooms." icon = 'icons/turf/walls/reinforced_wall.dmi' - icon_state = "r_wall" + icon_state = "reinforced_wall-0" + base_icon_state = "reinforced_wall" opacity = TRUE density = TRUE diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 04b083241531..0467013da8d5 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -4,7 +4,8 @@ name = "wall" desc = "A huge chunk of metal used to separate rooms." icon = 'icons/turf/walls/wall.dmi' - icon_state = "wall" + icon_state = "wall-0" + base_icon_state = "wall" explosion_block = 1 thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT From 39f7a9d155926d8c05e1bf2bb7e1493baee69c20 Mon Sep 17 00:00:00 2001 From: JohnFulpWillard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 6 Dec 2023 03:54:00 -0500 Subject: [PATCH 127/281] signals and smooth queue --- .../dcs/signals/signals_atom/signals_atom_movement.dm | 5 +++++ code/game/atom/_atom.dm | 9 +++++++++ code/game/turfs/simulated/walls.dm | 1 + 3 files changed, 15 insertions(+) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm index 2aeb70768075..3746bdc2100e 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm @@ -34,8 +34,13 @@ #define COMSIG_ATOM_RELAYMOVE "atom_relaymove" ///prevents the "you cannot move while buckled! message" #define COMSIG_BLOCK_RELAYMOVE (1<<0) +/// From base of atom/setDir(): (old_dir, new_dir). Called before the direction changes +#define COMSIG_ATOM_PRE_DIR_CHANGE "atom_pre_face_atom" + #define COMPONENT_ATOM_BLOCK_DIR_CHANGE (1<<0) ///from base of atom/setDir(): (old_dir, new_dir). Called before the direction changes. #define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" +///from base of atom/setDir(): (old_dir, new_dir). Called after the direction changes. +#define COMSIG_ATOM_POST_DIR_CHANGE "atom_dir_change" ///from base of atom/setShift(): (dir). Called before the shift changes. #define COMSIG_ATOM_SHIFT_CHANGE "atom_shift_change" /// from /datum/component/singularity/proc/can_move(), as well as /obj/energy_ball/proc/can_move() diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index a8a3d6215c37..88d27eb52bf5 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -271,6 +271,9 @@ QDEL_NULL(light) if (length(light_sources)) light_sources.Cut() + + if(smoothing_flags & SMOOTH_QUEUED) + SSicon_smooth.remove_from_queues(src) return ..() @@ -992,8 +995,14 @@ */ /atom/proc/setDir(newdir) SHOULD_CALL_PARENT(TRUE) + if (SEND_SIGNAL(src, COMSIG_ATOM_PRE_DIR_CHANGE, dir, newdir) & COMPONENT_ATOM_BLOCK_DIR_CHANGE) + newdir = dir + return SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) dir = newdir + SEND_SIGNAL(src, COMSIG_ATOM_POST_DIR_CHANGE, dir, newdir) + if(smoothing_flags & SMOOTH_BORDER_OBJECT) + QUEUE_SMOOTH_NEIGHBORS(src) /** * Used to change the pixel shift of an atom diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 0467013da8d5..012626e355f1 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -75,6 +75,7 @@ P.roll_and_drop(src) ScrapeAway() + QUEUE_SMOOTH_NEIGHBORS(src) /turf/closed/wall/proc/break_wall() new sheet_type(src, sheet_amount) From f64bece50379846b2030a5696b360eac4dfae8c7 Mon Sep 17 00:00:00 2001 From: JohnFulpWillard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 6 Dec 2023 05:02:00 -0500 Subject: [PATCH 128/281] look ma im going horribly out of scope --- code/__HELPERS/_string_lists.dm | 4 +- code/controllers/subsystem/overlays.dm | 12 +-- code/datums/components/archaeology.dm | 2 +- code/game/turfs/simulated/floor.dm | 3 + code/game/turfs/simulated/minerals.dm | 25 +++++- code/game/turfs/simulated/wall/misc_walls.dm | 17 ++++ code/game/turfs/simulated/walls.dm | 8 +- code/game/turfs/turf.dm | 3 - code/modules/unit_tests/_unit_tests.dm | 1 + code/modules/unit_tests/baseturfs.dm | 76 ++++++++++++++++++ code/modules/unit_tests/focus_only_tests.dm | 6 +- icons/obj/smooth_structures/catwalk.dmi | Bin 2149 -> 3692 bytes icons/obj/smooth_structures/lattice.dmi | Bin 1104 -> 2113 bytes .../smooth_structures/reinforced_window.dmi | Bin 9138 -> 13410 bytes icons/obj/smooth_structures/window.dmi | Bin 5063 -> 7919 bytes icons/turf/walls/red_wall.dmi | Bin 0 -> 3787 bytes icons/turf/walls/reinforced_rock.dmi | Bin 0 -> 5077 bytes icons/turf/walls/reinforced_wall.dmi | Bin 2574 -> 15211 bytes icons/turf/walls/wall.dmi | Bin 1567 -> 2871 bytes 19 files changed, 139 insertions(+), 18 deletions(-) create mode 100644 code/modules/unit_tests/baseturfs.dm create mode 100644 icons/turf/walls/red_wall.dmi create mode 100644 icons/turf/walls/reinforced_rock.dmi diff --git a/code/__HELPERS/_string_lists.dm b/code/__HELPERS/_string_lists.dm index 3b8acba15d16..5ad2a6493cd9 100644 --- a/code/__HELPERS/_string_lists.dm +++ b/code/__HELPERS/_string_lists.dm @@ -13,7 +13,7 @@ GLOBAL_VAR(string_filename_current_key) if((filename in GLOB.string_cache) && (key in GLOB.string_cache[filename])) var/response = pick(GLOB.string_cache[filename][key]) var/regex/r = regex("@pick\\((\\D+?)\\)", "g") - response = r.Replace(response, /proc/strings_subkey_lookup) + response = r.Replace(response, GLOBAL_PROC_REF(strings_subkey_lookup)) return response else CRASH("strings list not found: [directory]/[filename], index=[key]") @@ -39,4 +39,4 @@ GLOBAL_VAR(string_filename_current_key) if(fexists("[directory]/[filename]")) GLOB.string_cache[filename] = json_load("[directory]/[filename]") else - CRASH("file not found: [directory]/[filename]") \ No newline at end of file + CRASH("file not found: [directory]/[filename]") diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm index 11cc15426c29..99dbe5d1eba8 100644 --- a/code/controllers/subsystem/overlays.dm +++ b/code/controllers/subsystem/overlays.dm @@ -47,12 +47,12 @@ SUBSYSTEM_DEF(overlays) continue if (istext(overlay)) // This is too expensive to run normally but running it during CI is a good test - // if (PERFORM_ALL_TESTS(focus_only/invalid_overlays)) - // var/list/icon_states_available = icon_states(icon) - // if(!(overlay in icon_states_available)) - // var/icon_file = "[icon]" || "Unknown Generated Icon" - // stack_trace("Invalid overlay: Icon object '[icon_file]' [REF(icon)] used in '[src]' [type] is missing icon state [overlay].") - // continue + if (PERFORM_ALL_TESTS(focus_only/invalid_overlays)) + var/list/icon_states_available = icon_states(icon) + if(!(overlay in icon_states_available)) + var/icon_file = "[icon]" || "Unknown Generated Icon" + stack_trace("Invalid overlay: Icon object '[icon_file]' [REF(icon)] used in '[src]' [type] is missing icon state [overlay].") + continue var/index = build_overlays.Find(overlay) build_overlays[index] = iconstate2appearance(icon, overlay) diff --git a/code/datums/components/archaeology.dm b/code/datums/components/archaeology.dm index b32a679f61b8..79edc0a94a69 100644 --- a/code/datums/components/archaeology.dm +++ b/code/datums/components/archaeology.dm @@ -56,7 +56,7 @@ if(isopenturf(OT)) if(OT.postdig_icon_change) - if(istype(OT, /turf/open/floor/plating/asteroid/) && !OT.postdig_icon) + if(istype(OT, /turf/open/floor/plating/asteroid) && !OT.postdig_icon) var/turf/open/floor/plating/asteroid/AOT = parent AOT.icon_plating = "[AOT.environment_type]_dug" AOT.icon_state = "[AOT.environment_type]_dug" diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 78e1f3d209ac..d5a97ccf059b 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -11,6 +11,9 @@ clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_OPEN_FLOOR + canSmoothWith = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_OPEN_FLOOR + overfloor_placed = TRUE thermal_conductivity = 0.040 diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index bf740ed64582..6d8d875540dc 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -12,13 +12,13 @@ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1 | NO_RUST - canSmoothWith = null baseturfs = /turf/open/floor/plating/asteroid/airless initial_gas_mix = AIRLESS_ATMOS opacity = TRUE density = TRUE layer = EDGED_TURF_LAYER initial_temperature = TCMB + var/environment_type = "asteroid" var/turf/open/floor/plating/turf_type = /turf/open/floor/plating/asteroid/airless var/mineralType = null @@ -971,3 +971,26 @@ icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') color = "#eb9877" hardness = 3 + +//yoo RED ROCK RED ROCK + +/turf/closed/mineral/asteroid + name = "iron rock" + icon = MAP_SWITCH('icons/turf/walls/red_wall.dmi', 'icons/turf/mining.dmi') + icon_state = "redrock" + base_icon_state = "red_wall" + +/turf/closed/mineral/random/stationside/asteroid + name = "iron rock" + icon = MAP_SWITCH('icons/turf/walls/red_wall.dmi', 'icons/turf/mining.dmi') + base_icon_state = "red_wall" + +/turf/closed/mineral/random/stationside/asteroid/porus + name = "porous iron rock" + desc = "This rock is filled with pockets of breathable air." + baseturfs = /turf/open/floor/plating/asteroid + +/turf/closed/mineral/asteroid/porous + name = "porous rock" + desc = "This rock is filled with pockets of breathable air." + baseturfs = /turf/open/floor/plating/asteroid diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm index 5e5cb5de0ba5..654656630fb1 100644 --- a/code/game/turfs/simulated/wall/misc_walls.dm +++ b/code/game/turfs/simulated/wall/misc_walls.dm @@ -194,3 +194,20 @@ var/obj/item/bombcore/large/bombcore = new(get_turf(src)) bombcore.detonate() ..() + +/turf/closed/wall/rock + name = "reinforced rock" + desc = "It has metal struts that need to be welded away before it can be mined." + icon = 'icons/turf/walls/reinforced_rock.dmi' + icon_state = "porous_rock-0" + base_icon_state = "porous_rock" + flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1 | NO_RUST + sheet_amount = 1 + hardness = 50 + girder_type = null + decon_type = /turf/closed/mineral/asteroid + +/turf/closed/wall/rock/porous + name = "reinforced porous rock" + desc = "This rock is filled with pockets of breathable air. It has metal struts to protect it from mining." + decon_type = /turf/closed/mineral/asteroid/porous diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 012626e355f1..537fe7fa5b3f 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -26,6 +26,8 @@ var/sheet_type = /obj/item/stack/sheet/metal var/sheet_amount = 2 var/girder_type = /obj/structure/girder + /// A turf that will replace this turf when this turf is destroyed + var/decon_type var/list/dent_decals @@ -73,8 +75,10 @@ if(istype(O, /obj/structure/sign/poster)) var/obj/structure/sign/poster/P = O P.roll_and_drop(src) - - ScrapeAway() + if(decon_type) + ChangeTurf(decon_type, flags = CHANGETURF_INHERIT_AIR) + else + ScrapeAway() QUEUE_SMOOTH_NEIGHBORS(src) /turf/closed/wall/proc/break_wall() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 10896ec5b30c..3121733f6fb9 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -317,9 +317,6 @@ GLOBAL_LIST_EMPTY(station_turfs) if(!AM.zfalling) zFall(AM) -/turf/proc/is_plasteel_floor() - return FALSE - // A proc in case it needs to be recreated or badmins want to change the baseturfs /turf/proc/assemble_baseturfs(turf/fake_baseturf_type) var/static/list/created_baseturf_lists = list() diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index af3d3c365116..2db748e1f0cc 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -65,6 +65,7 @@ #define TRAIT_SOURCE_UNIT_TESTS "unit_tests" #include "anchored_mobs.dm" +#include "baseturfs.dm" #include "component_tests.dm" #include "dragon_expiration.dm" #include "dynamic_ruleset_sanity.dm" diff --git a/code/modules/unit_tests/baseturfs.dm b/code/modules/unit_tests/baseturfs.dm new file mode 100644 index 000000000000..918db53bb90d --- /dev/null +++ b/code/modules/unit_tests/baseturfs.dm @@ -0,0 +1,76 @@ +#define EXPECTED_FLOOR_TYPE /turf/open/floor/plasteel +// Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior +#define RESET_TO_EXPECTED(turf) \ + turf.ChangeTurf(EXPECTED_FLOOR_TYPE);\ + turf.assemble_baseturfs(initial(turf.baseturfs)) + +/// Validates that unmodified baseturfs tear down properly +/datum/unit_test/baseturfs_unmodified_scrape + +/datum/unit_test/baseturfs_unmodified_scrape/Run() + // What this is specifically doesn't matter, just as long as the test is built for it + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "run_loc_floor_bottom_left should be an iron floor") + + RESET_TO_EXPECTED(run_loc_floor_bottom_left) + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating, "Iron floors should scrape away to plating") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/space, "Plating should scrape away to space") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/space, "Space should scrape away to space") + +/datum/unit_test/baseturfs_unmodified_scrape/Destroy() + RESET_TO_EXPECTED(run_loc_floor_bottom_left) + return ..() + +/// Validates that specially placed baseturfs tear down properly +/datum/unit_test/baseturfs_placed_on_top + +/datum/unit_test/baseturfs_placed_on_top/Run() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "run_loc_floor_bottom_left should be a plasteel floor") + + // Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior + RESET_TO_EXPECTED(run_loc_floor_bottom_left) + + run_loc_floor_bottom_left.PlaceOnTop(/turf/closed/wall/rock) + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/closed/wall/rock, "Rock wall should've been placed on top") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "Rock wall should've been scraped off, back into the expected type") + +/datum/unit_test/baseturfs_placed_on_top/Destroy() + RESET_TO_EXPECTED(run_loc_floor_bottom_left) + return ..() + +/// Validates that specially placed baseturfs BELOW tear down properly +/datum/unit_test/baseturfs_placed_on_bottom + +/datum/unit_test/baseturfs_placed_on_bottom/Run() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "run_loc_floor_bottom_left should be a plasteel floor") + + // Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior + RESET_TO_EXPECTED(run_loc_floor_bottom_left) + + run_loc_floor_bottom_left.PlaceOnBottom(/turf/closed/wall/rock) + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "PlaceOnBottom shouldn't have changed turf") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating, "Plasteel floors should scrape away to plating") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/space, "Plating should've scraped off to space") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/closed/wall/rock, "Space should've scraped down to a rock wall") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating, "Rock wall should've scraped down back to plating (because it's a wall)") + +/datum/unit_test/baseturfs_placed_on_bottom/Destroy() + RESET_TO_EXPECTED(run_loc_floor_bottom_left) + return ..() + +#undef RESET_TO_EXPECTED +#undef EXPECTED_FLOOR_TYPE diff --git a/code/modules/unit_tests/focus_only_tests.dm b/code/modules/unit_tests/focus_only_tests.dm index 89c702ca2313..2d48294cbaa9 100644 --- a/code/modules/unit_tests/focus_only_tests.dm +++ b/code/modules/unit_tests/focus_only_tests.dm @@ -6,11 +6,11 @@ /// and you will only test the check for invalid overlays in appearance building. /datum/unit_test/focus_only +/// Checks that every overlay passed into build_appearance_list exists in the icon +/datum/unit_test/focus_only/invalid_overlays + /// Checks that every created emissive has a valid icon_state /datum/unit_test/focus_only/multiple_space_initialization -/// Checks that every overlay passed into build_appearance_list exists in the icon -///datum/unit_test/focus_only/invalid_overlays - /// Checks that smoothing_groups and canSmoothWith are properly sorted in /atom/Initialize /datum/unit_test/focus_only/sorted_smoothing_groups diff --git a/icons/obj/smooth_structures/catwalk.dmi b/icons/obj/smooth_structures/catwalk.dmi index 4b71fb507316716348e933692ae426dfe6167955..0920cc571f1e59d36ac1cb734d755280df6b0163 100644 GIT binary patch literal 3692 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 Thj#GaM+DBn$-eZE&-H%;AO4vW literal 2149 zcmZWreK-?p8{Z6Tk|C+2HZr7WIU-*hp%KN2gVdN(S-z5;LfZ_lucY}poQRpv)WLB` zzQT%lm5*5=$wJu}Ml%~4@A6*P`_KEwbKlQ%KfmX9U-$jo*L~e7Zs#$(6f_h70KhIM zNBav>UG#J9keABTfg6TWRTJ&uO|ZWfarHL-76Bg?3IIetPV28#cnw!en7l}v%6ylj zfyLgZ2RKgHYPgqG$^9`Sw3Kb$GjQiPQFF7`bp8nli;>%N(8CoQZh=%Ux^2Vj| z{c%*08@0m2%X*V)czir&C zqLN`&6XU6V+(=}=c{Z$~Hs&zL8xRm9UOjdrixuVLTZU?rd$4QIsee7&1l{OjNaZbB zLcGWS{Ox2+mbEQ52k(tx=Z~Nf1GF%gT#T}){pf|Yknn;$T6Ia~r#kP!V1=&|P9NOu z&;szqHxS;*q^gX4nuk+)0@a@?;W#%nH{X0;clq)n6YPTIfplxkzJbn43cKR2yAOhO z{OM3f^+9kjfYh;C1RYger<_d}wF?$LnJu(W<}F8Bq4$68SbdE*x3Zdl&%C$Q&@xLf zh$?)`8KBV(JsQ>#;YHA9(w`KB)k^D;36k5Y-D#Lw%8?T~hmJ82-1tzKE)KF@^eGA9 z&5hSSfk^C(M>NWkIu>5b9-E|doaxX;&>*-Qe_?TNHH zlZ({%Ya>3|+LW{`Z&(l9Ag<0o+Jrn=riX?-n`UX>Cj8(}of;#)Nqzg$vydWS;Fd}; z4Z)HDVjE}aU{jzH6#ARxQ@t#R3E4*yGK#Dw>4V-EbO-h)z30BT1=K-S2`Rp!5;|VB zJ>YXEyEuQ&ORq>I2@K5Z92jDkKVQEz3$*5Aexc}+)vr_zg-yyh;)+mkyt))_4{iMF z9k5GMwL&TUNuhy08YpCeJKZhG!^DoSjXC60$-s5|OD@vI_2yo;Bh!^4B&o&UZI>ucFuf^a`$1l2UeXcJYpUwC&_Bnsl|3EE)&nPd~L_}T>H{X#pdD)#rOX)d11X6)va}=&2;wxo1#H* z0MrrY7JpX~IJjH_b>xCF8w0d&dqvlm3wXok7?InAu;gNA&G>W~=YRlM!KzI5Xfv?2 zH@F%x;)9vQqVu%L5;Dw~cH*r7?bnr~^zM9;UbPQ~&ZJ$N6ixTuI+abZD)>PfvbLD0 zYOMyMV9GCH=TfEazEA=6(6X);vdNOH{f3*5G=!^+#O1~5s1YcF2-u+>2|2^Zu%@tR zjYyedQ3-yz8kUxzI!{8=?n>NVfhoAyTpS;j_mk?sncBYonKIZ}F+lm)lIr~SVV4!~ zK6(4Gh7%L1yB$ejbZULN)pIthHuG%z>R$j+hw066e zv0urhchnDqhQL9IA~9b0VhCiUBIJ%)@G`cMp3yezID`Ko2f?z_*5nmn!M2oa%M?F2 z3eFKo5>Q2%x~TLXb`ya~hd!yOg_>w8T@o)ZLKZ-Gl$4Za>OKZf8{{&1!mqrM8oKi> z!apB_b@fUPs8phdJzIQT%n;$Tt;Dt4WaH)|XX-=K>I5z*648j=9>dv)D84wTP-D&;89<`~U#8buCxB%t82r(x;aW+{={Iz?82WV3C46#(BxtpFk0X6a+6?mEMK_Q<-q zmRzc=m1WJ$l&Sn4CRnGytH!r4MzSuqyJOP6b`54&$JRMax_U-BHvpU*&f8a?#>M>y Da0fTN diff --git a/icons/obj/smooth_structures/lattice.dmi b/icons/obj/smooth_structures/lattice.dmi index 5adab0caf1beb71a2ae71ad199fa1fac986b2e1a..d9223ded775fb68f515c9e3a009ed4a113d51556 100644 GIT binary patch literal 2113 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 literal 9138 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 literal 5063 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 literal 0 HcmV?d00001 diff --git a/icons/turf/walls/reinforced_rock.dmi b/icons/turf/walls/reinforced_rock.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f2621f5a86382e552a724f090fed08574cc47b34 GIT binary patch literal 5077 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 MZfs8qs@i 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 RY@!7{dZ?*fp=1&Ce*g-YlT82s literal 2574 zcmZ{md05if8pjcF!8FtqZE`oWu#ys7Py<{L_a(*5tu!@rOiP(86a<^W%rU2CGPhB4 zOv}k7OS8OyWiFXvBSvP3xhv(G3-U`Y&Arb&&;8^6an5@_&wJkY`~BlQ=bS5kK5l9% z->HB=AT@WQOMonn$_7VSUN$2l%O+(Z-p?!0mBZnn(dfXyKwDc|3UJ(QNwl2n4-^#(o?O;6ShmQXct!6^zW(KN@lO5Q@8mzm zENm<-^RqMram=>z*+b?w=wpIiPb$y<%eegyQ6o7k+r1x=akeX_AsUUiplUZ@3_as` z%;uaX%9-rnD^85!D07IM<_8NIAyc1s|AJ^11lq50$p6KZX*CPvh_OAI@(O*trX(#{5ot zrd;H%UQ?%gpN7Q7tz#xgf+6+N+fUG22@U|ozisI3jqvEbEH$s@VQ;;U0GI0@&0S`W ziE4)P?bUT(ST;VG2?G4ua$7sE(&5nLt$uLi*2N)SGi?V}%Q9*^BHdJR}#b3!8HxH`@&Nk`7m_VBPAIdRA4p;K2qtz5~L(on9jm z`w+UeY}+i!*OQTDH&B);T9FfXG4!F6?CQHG-T?xuTkwl{V=E?Vq;?}QC9eN4zCq>i zM3+)pTyQ3ZVgHmV*zsX#|EJ$^CHSS^tweT&AbbHZ550Z;qS?ev8i64>-us&9cX-== z=}lZ6|NdXIjnaHq;fZZc8J0i%8G5sj;}KvU^%HchvF93I*CB9xt}@HTi2l`PMQ;`C&J^ zwNMmYZtbaWB=w?Oi-X>kDA~2*+^DAuvGIN6eRp03D0Q<_rkVD=Kw?k0SpQARzO=2- z8q*OI9o@ZBd1&gyg$c0yWN?A>&$^wZoP2Rie;C!x40)Qm6V;O9{hvjFqaReYh)q!p zpVc5MWKArT;@zlj5%?T{2jodqbam0}aTZgF(6{h7?jzlQ#eP+E4RZd@;9_PNc37!7 zUXquW=ysbm$9bQSMKTHQlV3oW>RB45{hr z7GaHVoIx>Koi4hzJHOhjf@bCOwFgDvdkJYof%d6s=H}M(+%%dgW%{^K>?A0Ri-T>B zn4M{U=5y_fAdZ)sTWUBbfhkG0wOWi88T8`TJv=+*EF5`DO=BptUM92S#8?yol~>Rd_|MWTLGx%Ba*T zb+WU|_6iJSIp6R$u7m#%?gyrnc{>T;%t0=xD>_k?ulpq#{*PX&;y1h*)ULs@#tTq% ztacbtflr0i{QyTVJ%Y}?E$ZQKs)cIwMOd)yz)O!Lkv)IX4xE`vu+V(`o?pe(uzk(n zQxlr7M;HaEYnweKOPt6o@79qM9vz>Q%dx8b zWK|3EQ+q0|eT;G6A;oN*i~BCM**{K?d}lB%s67^V#8_=8mIlT=!X_Y4i@}Y_T|wNW zcKECB!A)vbp?>2cm61-qQq4~S;OW3%eVy!T4V!e0c;Se>Xl%`^zjLW1&!NGzs1L2Eui*I8j#m}YTD1XrgzeM< zX_0$-zPE8N6omX(c?dvb+T$WQR>4TG_) zY|Hmh)T7-10P!}ritO;N)w)?`@OQM@gVVhi^k|W< z6{W+)Q`2wxA5#Wr&))=d&B>V<+6~zoH=_fV$jVw&NI$l*E^`L%)({Z80iiHpw57-L z{V0MPHCby zM4qYi^-=%6+tYVL9Y3PG96}z*P?9PQJq3g9wON*{Jsr*SnYB4?J#JcQz O1#)-wajA1U!T2|ImfiCJ diff --git a/icons/turf/walls/wall.dmi b/icons/turf/walls/wall.dmi index 5df919097cac674b9acda380097ea61274bb63ad..651227fe8de21c4cbc5c30a99b9be907371bb5bb 100644 GIT binary patch literal 2871 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 From 78786dee02d6fa4b58a9e93d9327623d36b5680e Mon Sep 17 00:00:00 2001 From: JohnFulpWillard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 6 Dec 2023 05:23:14 -0500 Subject: [PATCH 129/281] fixes chasms --- code/__HELPERS/icon_smoothing.dm | 1 + code/game/objects/structures/window.dm | 3 ++- .../game/turfs/simulated/floor/fancy_floor.dm | 2 +- .../turfs/simulated/floor/mineral_floor.dm | 2 +- code/modules/flufftext/Hallucination.dm | 2 +- icons/turf/floors/chasms.dmi | Bin 2078 -> 3329 bytes 6 files changed, 6 insertions(+), 4 deletions(-) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 09a07b8a2342..c2b3a7f86056 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -653,6 +653,7 @@ xxx xxx xxx name = "smooth wall" icon = 'icons/turf/smooth_wall.dmi' icon_state = "smooth" + base_icon_state = "smooth" smoothing_flags = SMOOTH_CORNERS|SMOOTH_DIAGONAL_CORNERS|SMOOTH_BORDER smoothing_groups = null canSmoothWith = null diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index f2c72e76b83e..6d26a188e3f1 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -621,7 +621,8 @@ /obj/structure/window/fulltile icon = 'icons/obj/smooth_structures/window.dmi' - icon_state = "window" + icon_state = "window-0" + base_icon_state = "window" dir = FULLTILE_WINDOW_DIR max_integrity = 50 fulltile = TRUE diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 626efd2584bd..e1a2c1b9174d 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -506,7 +506,7 @@ /turf/open/floor/fakepit desc = "A clever illusion designed to look like a bottomless pit." - icon = 'icons/turf/floors/Chasms.dmi' + icon = 'icons/turf/floors/chasms.dmi' icon_state = "chasms-0" base_icon_state = "chasms" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm index e1d29e00f9e8..a53f6eb2e7f8 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -196,7 +196,7 @@ /turf/open/floor/mineral/plastitanium/red/brig/fakepit name = "brig chasm" desc = "A place for very naughy criminals." - icon = 'icons/turf/floors/Chasms.dmi' + icon = 'icons/turf/floors/chasms.dmi' icon_state = "chasms-0" base_icon_state = "chasms" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 8ede48819396..caab0a55f498 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -1120,7 +1120,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( name = "chasm" /obj/effect/hallucination/danger/chasm/show_icon() - image = image('icons/turf/floors/Chasms.dmi',src,"smooth",TURF_LAYER) + image = image('icons/turf/floors/chasms.dmi',src,"smooth",TURF_LAYER) if(target.client) target.client.images += image diff --git a/icons/turf/floors/chasms.dmi b/icons/turf/floors/chasms.dmi index cc4feb2e032cf2ac2494acde4b5dc432e3fae25e..2e93b5391120cfb7936249cf244dec9f5031baf2 100644 GIT binary patch literal 3329 zcmZu!c{rQt`qnW+t4ZTb7pX1P%aoaF6Gc;LNHyrDmRf5GN(rXc(8QL}%p?@Gl_<5B z+D5e)dqQJtsid{EwkokiR0T~*B%E+&uHWxm*ZJdnpZmF=`+lD9y}tMTpkr2@-Y> z?uNOw)P=bZUXo-z+{OWCd^^M=*e4L@6W}i;g@2r$Zgk)tOy1=E*F(TcJu|0Dt#NRy zyV~7j_g{W@UGweYHBawbs~_rSe$o-4h*=yDLbfZWan6%%3=G`?i^GJ`wrc z)Wl_Mve~Ec_p(Q$0A-=-t*XGV46;*S}QyuoJw(#)J&D}!=!vh`$ zA664^GNni!(SxvF8Q|n+> zG}$CHf|S?Ap?41{cl{w~E}k6lR#~8X{P~o9aEoQXLEZSEYvgPeep4yJGs6_>Xwk1$ zR{WN*a`TyyXecxwA>PXl4S&}3*7{N&`?{lw%2_+_&e@1mFp=Nd(E!dW4u9>#EosUg zvptZg{7uHz1BYp$rgv-62z@8Tcj#2H&=BxfQc1BHWot9wc`+%2}DulTXeb#F|^J( zgQ}!~jteTFJ|NqzSE>S|gtx8M^j~AKiH$+r*22K$u0*x2&Q+a0zX|>e$dM*YZR$YK z0aHb$Ac)IbufNOgl4oDEPq&+~pyTVm#tao9`r9iCde5RT3-dL1+252dI%9PJ;Ullg zsWpudP6)uTSh0q!`^B}373YMGjlY?=`0bIf%4*RO%EiKT!`~zgz@rU|mEdHsLSp$s zYAtHQvNx`OK)VkyWcEXlKv8C4=Z#F@z)d3i|2GuJgX3JGP zTK6bWdTA#6fMjuEaO*yMKl);``Y+B@kZ$R$ldQ0>UPWf~RXy3u6jPsY({>1qHL2qkxp0d19?jXDPgrLX@o`$3Xg2M|>`%D5mj^JkB=J~=H z1>v;_)>7l=MJ(_jC-oaH_51FScsp;>UQkBI_3e9X{V4NKR;pTY*;_w!hb-z7O$pWN z{z3(-T&GD{P&qfV-(0mXb{Wa(y1sq9DZ1F%F&n-;EAiaY>*$2i~DTaFco1OTrXIP$yV08n zf`*dBOObm;VaTUKo_lGl09uHeW>89hSXDYz|5wu56nb!R<_$6Cufb^&LLeWySpBjqp7xL0;bVv$H$%ZFWJ%JmJECqa5dbNi z8{Izxf3VJx&k@v;jo#ELC^H*H8-y>@K5$gYh)`|yac|N$fd=;P%sKI72+Kd(tb38N zFE{&>d|}v{2f`6$wz4Dp*2x^pZHb}mc#79@{u?KmMd5Dw!+J>Y@zDcZ# zf&2@984UlQBhbvRUUImcD%s=P?h&XwfD270GB&GXH-*w`EDk1t+ywG^_8{Y}{hMp{dtc6;mwdR! zaJT!AJH!h5MfuZ{M-7eN3`tvyu+x~%J6Du;C8Q`kn8P|PqWgrNPJ6epa%ErwAQJdl~?f0J!`B{cj^RNt(L?hH5n zJ)dEQN#MD?py6FmeKVbIK*pc~bdhosoSb^z4W$7rWm3YlBM{378bV={C;s^{33aF^z;N=9tX_)XnTh0hBWdy2(~~+JY!1lr7`?7duE2ag;$YRFj&F=; z_~mN^%Z%pd#*LF)4<}$ASdY34Jg#qGB{|R3t3>sjC`*}%125fb0a})Zy*fxn^<(NME&Onm!&G zU|1X3!~68p_U*Y%9m5s1ZW2{QeFWi2z>a$tycbcayI|i|?`zOTGQ0iSR&U=f@RNW` zhBJ6rJCPvhp(uk+Y(RA;b84$ZQ%W@0K*3&u4=1JUmNg^8m=-uCX=uWh4YsgT|ovVy7U9UH3M|yc`*3Ox*p)c)K=@%%1~h)G65Rz>!=@UoC2M?bbxOvrb6?kQ6$kq(~!MLn7VMml)m zr6EV68Bo_F|A=;(9p7y-{2yQJrV(8m@|UY#hd7^D2FW=3GMYsn1jPe_P#jmTWI_Yv vE0oVTjvfaIsY3S@_iD&j5Fg#YynW@})qnwoSEZ646{#yG=EhYQ-R}JxXpE=M literal 2078 zcmZ`)YdDna8h*d|jLFy^GEOy%K{mRQLum;~IhJH-oJy;ia-3QjIb<29kBQ15tYl50 zhFVcMq*6*4+7cZ^#vx)zl2hXpW;E8=?dw|m$KF4l`+n~Cx$o!s`JQ)maYXRz@c;m1 z?;g7Y66UU!6f8l`%qdd|sku74+jF^GJRYyCtgNG>V`OAxVPUZ%u}L1Y4v>g9On2{aJO41>Poe>PcZ+YqOD)0@)3h1DDRLa{oYv1`rw0VA^smCPR zP>4Z<7xp5dwCs>(-%0buHP%{QDZXKJOE;>I_}<#Xf+5XU!L2=G$)=xnd*$u#w7U5K z$rSp{R=Bn+=OKnRSCs;NCseER>uzeR?Ke)QWzU__=nImOfc|4era=L&u1R64`KztW zOtv;h2l|t)qciA0NYhgDw%J2yaSb^=n^ss&oM<)Mvf?qWWqAtU_8DuxGr#c-#j?mh-;A;A4HrE1xBdzjftk8sfx^qFfHTe$|`^9I^v1g7x6~DCk+mYqlNpwYW1bbze(~K zLHq>Ts2lj0Uj|L#%gB*gf(KD7g}fx|gLqAwlG=LpBZDfe0Wj=@dey&UC{Sax>-o$| z%j*lJRatm996>_~ltp@=iR0-rF-J{CkZ>jDA3mp!20NHg;1FzA7?ST7Ws(xGR%P8s zC#dR_2k<@hOIO9Rri<`6cyI{J^hs(bfNJ$soS&-^SOTWgcOIg#e2Q+ z>~T_w697By^4Ny!1?MMk4kDO4afM0d(Y^T}+P7vSx}|*&-N4{4$~5=x;1-$Zt;C=W z-X>5OD=vk{>$tUMYv&m!82RPdMqse@UhQGxjIbBODqymb-5jo5?i3!=#euv^AB4|y zF-*QO&9jc4mI9lg+-iv4)H}417MXX^QiCppqI*wEyZ%o6An)BB{La-HVpj*k7EuS< zr6V!mk@UBYIBp3krTLhHt!liCV8;_^H~05#m&kZDa8CZ64^ffABAP1W>U0T0*G733dsX-ne)hJ6lWQo_ss; zDl*^nte`;9QVvfU0V)*+_siiNe<@liP@_76?x&vLYQze_l-MP zP3M=pF3c*u4=BS(MbE)!L{p6vP;}i{kwY5T z{ARszMdk%%8MLV!9&)<+FcTQ5mv3`Lrp&EU8a%O8A8H1g#{dfZq_aM_RDW&_J9mHF zKL!=y0Tt)X1GJ1elhkqFlnFkWKhQx&N)1~nVXPkUx!d8?L_sUqp8wbb+9Yd+sas<}@(Z$!Iby628juIYxd+eP*63}Z6ki+2QcQw!}v zgpeOgo)0gQfOrwviLSQt;Nc>kBg|Nsj64$|=bG?}eNmUXSjH@(%pj=h5PPj&-4Kt+ zh61}3w0V&2y$VM$n8n5iCO=aY|D4ph0kC=XScUDs6VC{56;V#@ z=-wbT`$ob6(4qRzeayna|KbW;vguE#Q2X@g`DECYdgjNp;A&8e9!aR(K}g5_v`Pq$ zQ@du~?io~UWMkD90>)BZ$)<6I>Z`NwS?6Li52#mvND;6Z+iaK>bqke}6VBeXR~tXM{r`JH!RJ<2+&|EElUVmT+j^VE`zfSV|(<{zsBgd~FVO z(WC=cpi%6>$QECl!Bs9dFwl6>N-6WY9=FJMc-CsUDRiYya!`s*TMfVbzT#QaHoLN= z=6h7!U{h#pn}EqWOf`Mlui2%Fl$*Vnx38IRN%|x#>}P&z2wfsGYPQIXmUNzbP?@m`YXQmDR;&&$1l-$1^zJULXxZw=h2bJy*uYyZp4mV+AHeVbn)9Q jFWpH>x$}D-^HV&~zjVtZks6;W`M<$ldl$Ph8(QLDG6BqK From 85b0a32f2c6138f17591df05cb28f1aadf617a27 Mon Sep 17 00:00:00 2001 From: JohnFulpWillard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 6 Dec 2023 05:35:25 -0500 Subject: [PATCH 130/281] this fixed nothing --- code/game/turfs/simulated/floor/plating/asteroid.dm | 3 +++ code/game/turfs/simulated/lava.dm | 1 + code/game/turfs/turf.dm | 7 +++++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index 4f3960ac2d02..eab099daa196 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -7,6 +7,7 @@ baseturfs = /turf/open/floor/plating/asteroid icon = 'icons/turf/floors.dmi' icon_state = "asteroid" + base_icon_state = "asteroid" icon_plating = "asteroid" postdig_icon_change = TRUE footstep = FOOTSTEP_SAND @@ -97,6 +98,7 @@ baseturfs = /turf/open/floor/plating/asteroid/basalt icon = 'icons/turf/floors.dmi' icon_state = "basalt" + base_icon_state = "basalt" icon_plating = "basalt" environment_type = "basalt" floor_variance = 15 @@ -146,6 +148,7 @@ icon = 'icons/turf/snow.dmi' baseturfs = /turf/open/floor/plating/asteroid/snow icon_state = "snow" + base_icon_state = "snow" icon_plating = "snow" initial_gas_mix = FROZEN_ATMOS environment_type = "snow" diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index 42d75d1e52bc..55b554a113e0 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -187,6 +187,7 @@ icon = 'icons/turf/floors/lava.dmi' icon_state = "lava-255" mask_state = "lava-255" + base_icon_state = "lava" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_LAVA canSmoothWith = SMOOTH_GROUP_FLOOR_LAVA diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 3121733f6fb9..6cd10564bdfb 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -551,8 +551,11 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/proc/add_blueprints_preround(atom/movable/AM) - if(!SSticker.HasRoundStarted()) - add_blueprints(AM) + if(!SSicon_smooth.initialized) + if(AM.layer == WIRE_LAYER) //wires connect to adjacent positions after its parent init, meaning we need to wait (in this case, until smoothing) to take its image + SSicon_smooth.blueprint_queue += AM + else + add_blueprints(AM) /turf/proc/is_transition_turf() return From c12b970daea94cea903685255482f9d355ba777a Mon Sep 17 00:00:00 2001 From: JohnFulpWillard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 6 Dec 2023 05:58:32 -0500 Subject: [PATCH 131/281] ??? --- code/game/objects/structures/tables_racks.dm | 21 ++++++++++++++---- .../game/turfs/simulated/floor/fancy_floor.dm | 2 +- icons/obj/smooth_structures/poker_table.dmi | Bin 789 -> 4825 bytes .../smooth_structures/reinforced_table.dmi | Bin 842 -> 4855 bytes icons/obj/smooth_structures/table.dmi | Bin 670 -> 1144 bytes icons/obj/smooth_structures/wood_table.dmi | Bin 670 -> 3703 bytes icons/turf/floors/ash.dmi | Bin 2721 -> 3817 bytes icons/turf/floors/bamboo_mat.dmi | Bin 5327 -> 3843 bytes icons/turf/floors/carpet.dmi | Bin 3405 -> 3481 bytes icons/turf/floors/carpet_black.dmi | Bin 1828 -> 1907 bytes icons/turf/floors/carpet_blue.dmi | Bin 0 -> 3273 bytes icons/turf/floors/carpet_cyan.dmi | Bin 2675 -> 2883 bytes icons/turf/floors/carpet_donk.dmi | Bin 0 -> 2842 bytes icons/turf/floors/carpet_executive.dmi | Bin 0 -> 2535 bytes icons/turf/floors/carpet_green.dmi | Bin 0 -> 4382 bytes icons/turf/floors/carpet_neon_simple.dmi | Bin 0 -> 12520 bytes icons/turf/floors/carpet_orange.dmi | Bin 7950 -> 3293 bytes icons/turf/floors/carpet_purple.dmi | Bin 0 -> 2427 bytes icons/turf/floors/carpet_red.dmi | Bin 8171 -> 3011 bytes icons/turf/floors/carpet_royalblack.dmi | Bin 7139 -> 2967 bytes icons/turf/floors/carpet_royalblue.dmi | Bin 3522 -> 3133 bytes icons/turf/floors/carpet_stellar.dmi | Bin 0 -> 3176 bytes icons/turf/floors/catwalk_plating.dmi | Bin 0 -> 4353 bytes icons/turf/floors/glass.dmi | Bin 0 -> 8083 bytes icons/turf/floors/grass.dmi | Bin 0 -> 5205 bytes icons/turf/floors/ice_turf.dmi | Bin 3120 -> 4712 bytes icons/turf/floors/icechasms.dmi | Bin 3080 -> 4129 bytes icons/turf/floors/junglechasm.dmi | Bin 2461 -> 3648 bytes icons/turf/floors/junglegrass.dmi | Bin 0 -> 5209 bytes icons/turf/floors/lava.dmi | Bin 7740 -> 9697 bytes icons/turf/floors/lava_mask.dmi | Bin 0 -> 1628 bytes icons/turf/floors/plasma_glass.dmi | Bin 0 -> 2695 bytes icons/turf/floors/reinf_glass.dmi | Bin 0 -> 4257 bytes icons/turf/floors/reinf_plasma_glass.dmi | Bin 0 -> 4047 bytes icons/turf/floors/rocky_ash.dmi | Bin 8601 -> 3881 bytes icons/turf/floors/snow_turf.dmi | Bin 10907 -> 5159 bytes 36 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 icons/turf/floors/carpet_blue.dmi create mode 100644 icons/turf/floors/carpet_donk.dmi create mode 100644 icons/turf/floors/carpet_executive.dmi create mode 100644 icons/turf/floors/carpet_green.dmi create mode 100644 icons/turf/floors/carpet_neon_simple.dmi create mode 100644 icons/turf/floors/carpet_purple.dmi create mode 100644 icons/turf/floors/carpet_stellar.dmi create mode 100644 icons/turf/floors/catwalk_plating.dmi create mode 100644 icons/turf/floors/glass.dmi create mode 100644 icons/turf/floors/grass.dmi create mode 100644 icons/turf/floors/junglegrass.dmi create mode 100644 icons/turf/floors/lava_mask.dmi create mode 100644 icons/turf/floors/plasma_glass.dmi create mode 100644 icons/turf/floors/reinf_glass.dmi create mode 100644 icons/turf/floors/reinf_plasma_glass.dmi diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 6299ee2a76fb..3349cf16ee1e 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -16,7 +16,8 @@ name = "table" desc = "A square piece of metal standing on four metal legs. It can not move." icon = 'icons/obj/smooth_structures/table.dmi' - icon_state = "table" + icon_state = "table-0" + base_icon_state = "table" density = TRUE anchored = TRUE layer = TABLE_LAYER @@ -254,9 +255,11 @@ name = "glass table" desc = "What did I say about leaning on the glass tables? Now you need surgery." icon = 'icons/obj/smooth_structures/glass_table.dmi' - icon_state = "glass_table" + icon_state = "glass_table-0" + base_icon_state = "glass_table" buildstack = /obj/item/stack/sheet/glass - canSmoothWith = null + smoothing_groups = SMOOTH_GROUP_GLASS_TABLES + canSmoothWith = SMOOTH_GROUP_GLASS_TABLES max_integrity = 70 resistance_flags = ACID_PROOF armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100) @@ -350,7 +353,8 @@ name = "gambling table" desc = "A seedy table for seedy dealings in seedy places." icon = 'icons/obj/smooth_structures/poker_table.dmi' - icon_state = "poker_table" + icon_state = "poker_table-0" + base_icon_state = "poker_table" buildstack = /obj/item/stack/tile/carpet /obj/structure/table/wood/poker/narsie_act() @@ -370,46 +374,55 @@ /obj/structure/table/wood/fancy/black icon_state = "fancy_table_black" + base_icon_state = "fancy_table_black" buildstack = /obj/item/stack/tile/carpet/black icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_black.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/exoticblue icon_state = "fancy_table_exoticblue" + base_icon_state = "fancy_table_exoticblue" buildstack = /obj/item/stack/tile/carpet/exoticblue icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_exoticblue.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/cyan icon_state = "fancy_table_cyan" + base_icon_state = "fancy_table_cyan" buildstack = /obj/item/stack/tile/carpet/cyan icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_cyan.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/exoticgreen icon_state = "fancy_table_exoticgreen" + base_icon_state = "fancy_table_exoticgreen" buildstack = /obj/item/stack/tile/carpet/exoticgreen icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_exoticgreen.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/orange icon_state = "fancy_table_orange" + base_icon_state = "fancy_table_orange" buildstack = /obj/item/stack/tile/carpet/orange icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_orange.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/exoticpurple icon_state = "fancy_table_exoticpurple" + base_icon_state = "fancy_table_exoticpurple" buildstack = /obj/item/stack/tile/carpet/exoticpurple icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_exoticpurple.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/red icon_state = "fancy_table_red" + base_icon_state = "fancy_table_red" buildstack = /obj/item/stack/tile/carpet/red icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_red.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/royalblack icon_state = "fancy_table_royalblack" + base_icon_state = "fancy_table_royalblack" buildstack = /obj/item/stack/tile/carpet/royalblack icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_royalblack.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/royalblue icon_state = "fancy_table_royalblue" + base_icon_state = "fancy_table_royalblue" buildstack = /obj/item/stack/tile/carpet/royalblue icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_royalblue.dmi', 'icons/obj/structures.dmi') diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index e1a2c1b9174d..96b94613a3f8 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -336,7 +336,7 @@ name = "carpet" desc = "Soft velvet carpeting. Feels good between your toes." icon = 'icons/turf/floors/carpet.dmi' - icon_state = "carpet" + icon_state = "carpet-255" floor_tile = /obj/item/stack/tile/carpet broken_states = list("damaged") smoothing_flags = SMOOTH_BITMASK diff --git a/icons/obj/smooth_structures/poker_table.dmi b/icons/obj/smooth_structures/poker_table.dmi index 2e16a5468dcb055dd39c5deb743625272e5d9766..d0b70822771fb5edc117137dfe59ea4b2ad44160 100644 GIT binary patch literal 4825 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 literal 789 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 U<>q`c{Qv*}07*qoM6N<$f*wDAF#rGn diff --git a/icons/obj/smooth_structures/table.dmi b/icons/obj/smooth_structures/table.dmi index ffd88a84fc7aacfa166c1b32e9415aca155202a4..3b15d2a27dd5474dcba569b753d6a192daf95c56 100644 GIT binary patch literal 1144 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 literal 670 zcmV;P0%84$P)005u_0{{R3dEt5<0000LP)t-sz`(#Y zAQNFT6ogABbwD6cDG153d0~2h2dGBLXz21qidIvP%<>HP%N4%vsK1+Ry^Ci@N@YP?Adv` z%nKW@Gkx2XeGKfx)Zs|U=1p;Rkpm^p`iCp~l8Y|3j-BAXqr~`>>n12!lYZHK{xt*8 zNT5+bBX|Hj?MCtpc-oEN8{n~kr+r5Ock25fpn!-nLdu9~1xW2i0*wNiEk<)I`u_Y& z@7c7B-~aLfYr@(oFdPwv0004bNkl;ls`LGOQ< zsmZiiW;n*U9jNd9bjg3=kl| zSwQ0j>Kg)_0?b=@d9Rv4Y0j~LL7Ejc(<0ByYjx^dE*}Q)Ie*p$0gFyz{e@ewDf#o{!Feyo(Veb_nK!7&^d*4CP4&Z=b&eHy1Sufi$P`!sxNipZB zcR4Dl&5HJLuzOHA*xiR59KR3e1A9juAV7csX9u+xsBZ{xSnzl~*a#l4Wg5ZbU5-}p z$ZH0@2j%>LeK;^Uasr8mw?q<;Kk?T@;<#xG5FkK+0Nue%;sVk+#RCk%dD=Lwbh0{a%=VWk}8cmMzZ07*qoM6N<$ Ef|%zdVgLXD diff --git a/icons/turf/floors/ash.dmi b/icons/turf/floors/ash.dmi index 718cd120194e9437c4187d634de0121fe3d184ec..1ebe8d713970c69dbbe056bf7e4d928d0cd04c86 100644 GIT binary patch literal 3817 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 HY1DrLn*bv# diff --git a/icons/turf/floors/carpet.dmi b/icons/turf/floors/carpet.dmi index 52208611a4766c9876a8c3036ff94031900a02ee..1af03a1df8234593dae6bdc97abe510489857cea 100644 GIT binary patch literal 3481 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 JwVi+Re*iZ%>J9(^ literal 3405 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ö>#>}hWS&hVc>cu;g&3v9c!;(4 z4XBR0AhO9Ip#>fnIbypDGzz)rD0$}*k^(W=L%aZv(($GQK4(+ zu;s$i=^ri*y_^4PgWp(Od|NGVhs~<1Raxv@WL@M`@dZ^$UCT9*N&TxpSG~M{ zTVzYgi2L{AGR&^C8zW1Cf?ox%$4@t2{k~kc0-k|r-0NL8?hLJWXYS-s`P;7&iYt`v zIhT5X-p@FX^e+A*_txzsp9zSx5hpl;MFHPf0#-zy z5!p%_OFF@s#7&YdHq4x=Xy*Z`xd<|D`1uE{&8u>tMQU%9yzE{2`i$a*BLh&i4HGboF(32Bzhw zl44ebDuM;r3vFpKB3NVLss`EZUZyR_-g1%AcO~1hvfjhbwblwIPv)gQ81G1KMOT4R zJ5l)z2IbB%c=Z0@aX{;|cj8CKRS%0E%Vwa4c%e?!GtA`R4_Qe4b6?FGUrlT3zo166 z7k1Q-(|UZOOqS{!F~_Bugn6!zg_53gftv}ff9u~~a~I^{Yxfrr9+a(Ownaun*+;cL z7Ok158-th@2V{^>_z8Y&^Z-A?lmt%!}NXmZz DCb8ZD diff --git a/icons/turf/floors/carpet_black.dmi b/icons/turf/floors/carpet_black.dmi index d8cbc1c45342499ed093405ffa66cef5c9ac33af..e2fea9085b2303c8e0128ede042e5bd08fb56ac8 100644 GIT binary patch literal 1907 zcmV-(2aNcMP)TYI^_x00DGTPE!Ct=GbNc008`YR9JLGWpiV4X>fFDZ*Bkp zc$}4%%MOAt5JlJYD;ivDn6_A1xG@^zLVm%ZRv|tEjsCtwwz@dGHrysNbMD+Q(u>u4 zQ|je*qh6uyn#WzwwVPxrc{j&c_ZMqaQitYT$Kle&Du(`;9;)^k;%w~lk_#~H0m5t!5T^G(%N8g_ewOrP0}b0mv-2k}5~;u6Ddr)kr@Io(^w4X$wfWP# z5|`I1vO!#@`O9&GkAWUWr^(3a#%}Cfy z13AwlLd^&}m^0L4eIp3xAqeJ|GmYoxhLID3 zXnuVEgitP=vmYEDB|$hZ>aODb7s5+6z;8eJmBRv-e^2sX?=J|`OD*XK`!1g&mQQNC z<^9DR!T^OIR0~)>AzadO4j~%+)S?R{c|GK(6hEXbJV64M$HL{hR443l#C=(w6B+}n z)@nF}*@#PZDPfBr+sz3P)FkMMt|Yv?`Fb@Weh9nX)OdjU29z+pozw!6)NPj%p^gzY z*#OU`o@#qj#|S6?CYP1r#Y}%b%JnbPB$D;e_CydO&5V*p#YZ`qHoogBl zB&sE>@(QKLKNn$@-zz=-F@!+^%!hSG7$m@aSRap2x}6BYjp!F);^!g+SE3nV;^zW{ z?akLIA@g&LP}Hk>h^&8@h46C$!rWVe&iaQK($6u%rQX(A|1c*U{!>Ee>#TpsqU85X zi>!Z$A^lv0kX?djoteD}v;HBAlGT76|1*T*d5qBM2UZdGFc8#UKTr$r_zJm{XlJb z!{d=~_II;CM6FMeozITX<`A!8P-6t|k*n84({7Wm5zV7OZ4p{|@0uvI7sDV7=bw9fOdyK3Vq`mS z&eyEIf)F<)q?*>35DI^%YF1xE*k66k>dOd+VE3?t*EI1tWcRRx*EDg$jXE(eLYttn z6LTO!4CW;&>+K!1%nw%9ABfPnGi64w{+S7lJ5y!^>rF!RgHiv->L)_x2TlJMtPjm0 z`a#z_#_R1lL_etczlwT~@OwZ)dxW8Sn{cPF3DFO-Z6v|^0}<{Nzn-wo2rDmL4oi5! zZ+3061=!*1kP!QUOqWHQ5fV@6_6uWi2EwJ^7u2DU%UDX7_XC-(ii8jb$8=RBgfJMU zR}*fsQ~gCK33oo#{6a#teosQR{!oN#&ouO}w>%%=+A|IP`!pHh#n+Tjt9J?Kexac$ zp;m7bl0Bm|jCzL<`-ygcQ4hV|nZsR9H0~Vk65gk@bjt;XT7M|QUE)ay+4l!=zbMOl z%glr3kZl-k{ItG574w3SeSZ-5i?Y1ee_ZyLx`e&&54HWNn4byh_XlzRDa(`oqugI= zA+Y_X*8Wt?PlUrym4sTb{if`mHxd^8O@v6^>(1@+mp{B^=1BbSa-X01z}zPu%588f4F82tNMp4=CH1R txQdYI?FotAoUrPK>5Fjl&dlKm{{e*z6(K%}Dy#qi002ovPDHLkV1ipru#x}( literal 1828 zcmV+<2iy3GP)Y*2)u)y|tPgIU*q*7)mXgJpIHW~ZlnmBghqx{w>S)tg z2<{3>jPoIFf|B0r(XR8yRDh9yQGgMA0($aB@&NSYjo=H=V}YLh9R=J;?}G$QNKrtN z0@Bn2NqHjyqX2W!{%&KI89nN&HQ>4M9MALZi+6u<)c)7qk~LlZ{;Mxyx&C_HNaDKy z00neOL_t(|ob8;6cH1fth8s<3-5AMEnz(7*I$e_6-tGNguLx~`m9k0$KJ$}fTN#Y4 z`49{k@v6Gg(<_U7^ShP@exDEH=fAG>WGlcoziWBm_xUh>J`so%5g-DQA_BviFvfrZ zfUN+LMPy_wI|2-RJOC^|0`jcD?g5#r%8vjDuY#KgL`KB}kxER!%>$Vd2=qXtk`aL3 z2etzG^9LfJmxuQG@gBsM(u%ozFkveet&1VR`g-Y-U$9EnlSfNw#Td8|XnV|D34omd zWJ-X6&ouzadh%$E1U$p>>#S@@w09!-=TSOpMgD0?Nm!k;|p1}TvCYT@*h!hbZ0+A}7Ky)}x1R_P( z01=235g-DQA_7DpQppG~KMy2dxl06!C&2tXkbLECECKK(;M!_AmKRQ7Sb*e9z;%I> zV|nq{fb0pt#RH)90vQk(&jpzK>U9Rr9&;%#9RXJlWJw^@1CdHc!0#R!A`n{MAFhEw z4@3(4^U(=L3*CdUn)(qR0_pmZXk88gzq_C^Bmm6)4i1*CABmPm09*(_UIfN)-0vDl z7LG@2jAi}$0p>aeUtB|7#u`&cYpBauW9n!PoD_g&x0|5%r;KJpytdu+x-OFd-||kIvIx|TeBSM=x@l^Wcwq#ZMm*kZ zo7<-Qt4kx$+*Vh7!<+F8N+VDU0`E6m)*ty-9D(*4xZ@)Loxm`_G50UB*;gdc+_sO~ z_Pg)LDs(qk8K`-u{flh&H3-}vd-cg+x(x3558_g%&fKRECI(;bUzW2fW-WxiD1zsP1^o`6W- z`q-^MzL5t{ZXUK0FwZpJ<1^{0kKX!Y{b;P$YMLQ1Z;zf`c1sVZw(&fD>W-deOL{as ztoV4o6`HlLLqN1Wec#m`iC*BZM>h}WK!87s$Dg%~9)5KH`*kvNF{NIsyWiOCD-byH z)3JT-I$wT2p9`kn|F!*xZ1&{|G;IWZ-@ZDu;Sb;coXt1vPh{>tWV5e8;HC{g{}!(v z+vtHe`|VsVruiJsd*T=Dt6T#j463))^Ile=y60hf*a(+h?d!BcmAHQYsbvH$#{(aO zN|{Y7^#j95_`dogpMM3FGMCos2cG08a@W4vx33O`5qQnp2<|&?U%!`eL}>(M{I>0n zj+?tg{$Gzk^Y8Wbf8){rcZvMJ9)YXs-J4`y#~`p+3ioIxDLao6fzlEYz)nN}J56gH z0_W$k?bCXn!1;M>ySmyWXnr2suB>$ko1e$F8w9%KGe3`QKU;0mC+FE=Y`e1FCv1Km z+kQy|v@>>|9mck+t&nS z<*qrer`$hiaa|69m*VZ*MFg;Q9)IewDfaiX>T(F^zXBFW0H)OlS?&L0lSTm4=RydW z`vVQ*fnvhxF%~t(1KI5VV-t;uu{ARq&|*{U?`IVez}8GZto6m%-_NSj3H$~}3$04r SfVy@70000gjFoxj$y!_gTJo&YAC-IWws~yS)qz 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 Iw;WFR52v)#{{R30 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_cyan.dmi b/icons/turf/floors/carpet_cyan.dmi index feca351ca925de74d85304b194a01b5658bf2b9e..85e053a5a6de40cefec4a6d7f08ecf812fcc809c 100644 GIT binary patch literal 2883 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 literal 2675 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 T^+Ec<0|3-L4EJW&aL#`Lg&v*> diff --git a/icons/turf/floors/carpet_donk.dmi b/icons/turf/floors/carpet_donk.dmi new file mode 100644 index 0000000000000000000000000000000000000000..04c4148d2bc5a62d89c95530dae729a8b9ce443f GIT binary patch literal 2842 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 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_executive.dmi b/icons/turf/floors/carpet_executive.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2c17e542fcd1981558207b7ef7c3fbbb0ebb429c GIT binary patch literal 2535 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 M9Nk~G_w>d80q1#zqyPW_ literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_orange.dmi b/icons/turf/floors/carpet_orange.dmi index ddf239b63b20e5df880c98bf49242783c2c6b711..4f0b2078fca38ac8abc90f9da781d86a25d412b1 100644 GIT binary patch literal 3293 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 C;Ol?@ literal 7950 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 K|BJeH`2PV8C9)s@ diff --git a/icons/turf/floors/carpet_purple.dmi b/icons/turf/floors/carpet_purple.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f07ce75d33406485a9a3c3ec45a7c46b108f1db2 GIT binary patch literal 2427 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 FzX5sU({%s< literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_red.dmi b/icons/turf/floors/carpet_red.dmi index 926655688ed27b84d065d3bbffd9d1dfd24b7461..eb0527f430dc4a4044ba9be0806e3ba1682a7e7e 100644 GIT binary patch literal 3011 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 literal 8171 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 z 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

    {cY+KJ*^}aJFLdDq ze_1sa{%Q-CL~lpt;;FDV2dg-oGljI}=CDOp7R^KO$S7##qPo2qaEGuuNaTtE$-r(W zN_6jz*Bkh!r+h!uRz}vRNTV0dJ%3s3d;VbgXT`q$gV>uPJD|ir{&esVZA?SH|6Tw{ zH9ZS89!#n5bq&WFl7II_%s~;L13vo~@0lAi?53;dj~zeo?l7~o$MNf7X6mZ^cGSL_07+2dKx(L(_1rJ2 z@-f6(iM;+;hlDRJ=Dl>Q5ols5{eVs{a}@O}K{vv)KQvz2r;5yJT(T7cn!JU z>!IZSJ0si1M5G^Tn@p9F)kdyI-21tZ;k>F{Q{bu$*TOH&v$*-c_@&iQs89Go==pfu z6FB;5dKs||mfD|1m4+iCRD2eGO}1Z;3oAcNSqu5&Vqm=9VJ)3_ z>RU=PQqGbXt{&WxT9oVJ$$jTlUt&Jjo9hQo0|_r=uLn#e1a?#NA0(Iv^|?|%K;_NH zbWgWAZ_^BjiD_J6Y_4aKt=k7+M52|5zq4!B6{KiQae@~T2xgQNYKO_3#r4x#HP%1# znBh0aX{vsl^>$RkeB#Dnr4}{SdP^k-V>+M6XK2(NBt;`vtj>wKP_HzEwo>(n!^D8u z;e}ah1xUhy^s-o9#0anJ1UE)E_^q~zvy8mY{>&$OiFX%c2Ck5*GhO!-gb3e=?MqYP zpxgx4N4|T`N=y|{7sAfWX~JLPT8eMW*I#F@%ZjbwY1VJLs0yj#UzCg{ZH%XSeuP+{ z|3ZR2vZl8!DHR1c+}N1A#i&UqgLqW#tLq8BBaSqe=UiC4L#?;dEHqBj-zOOLh_RV# zaJ}7oDGt`G)4Ro}xH-yFW=B&aZj1Uwy7oB{*(!H7IQ#H*oB16aV*GE_nQa3ih&Lf; zxX9TgDXHB#o*tyZq7^jgp5I4$EoFK{-2bC5JNi+D_ab=y%1M>xXW-&& z?~iq5eWB({#D$K+m00%|6sZQyNHB=G8QC%-Yv!w#2EyyS$n|(M_(x*K+Wa;{$Dgjr zV!u55pdZn);gjts@YgkF*9QQOS3*s9B3fh~>+w{XkSnLA&0d|ZY_Svxx%eq6qS|m! zEf?jG_;K-?QF$+A_JnzYImxEB$?QX_)aK{xl{r)9P(VMAw9`ILH`uzg`kw9gt-fd& z1koOaRBCv*=gosjby~n@x8gow{2gj@mT42>=pJ6DcVNHp`NvuHjqpk@Z>Vx)RM-;t z@%Cljmo*z&iNc!=!8G4oTo^2Xw-zCb$eI+II%*$xdgqT}z2O5N2vgX*$_0%a_fjGB z!iBG|7dn;(ihGNOKiFm1JMYL{y7NIFxnX;(P%~fZuE(i$f=#@6E#9+Z?(KOQanyX| zYI2U7I&kXb>=JHbdERfj)Bwr|xaZlBlDIq|!eq%--eIn>3`G6J0FZ95t(d9M3tiM& z!uirUw)lR_@r>4RRVORMxYUK|ie*G^J~86kd~LE#j@d8hPGX4so2A#iuQF8@L?-SF zGFR5XXjovabPy)Mg&bz>BiKbUT5t0x_Q+-L1&)qAKxTw z&r5D!$Gw#<{;^LgYriL%UowuCW4nm=@dXYB0a+%1xlHD%rQ2m2`yA))4T$v4o!Gr0 zbrqOscId}<(iHn3A^+31uc&+c zCj{okl1AN2@)j$$N2$(1sR4E02NaAC4GP5a5mftk3tg;jsxzE1HBXSRu+_Vc_69Gr zWG!*3?+%5vvyF0vjRRg&n*`=sMNp+fxa91G(`A>5aV#9H{UqT!Q9k&`3GYuQV5uuq zlitgO@MRn*46|)YV6}dDTQ2{_lT&0s8cD0D^YK&+;-5*Wy-S;jl74HJmT`)|i5sqQ zp7GY}(0S;1FjNQ>SwaaiD}sOGCtn%v&#Y0E!*^&b7F^(yG4aa13YBsp-S!7XtZM#0)X~0{f@N6=u4I3)GxwKPI+AL09OZp8ZTd-|v3uaGs zMzK(Ek?sI|nx_r zqket>&Hd_U$;nv~tO>&nxC7W(=JqYvZCcM94OEDRW2pSc@Gjyc8nV4#a>8JuGc`%t zZ2J|ixR0KSm!S~vA$t0_Uyi|~=OS@+-vH@yJ@KNDzIOGjoXb@BtsaV<1i8fPb55zwTc7Cu`M+p2;5G5qHOhpLjoVnou8!^hU+bb zMS;H2uAc1tc&HjIaW4p(w(Ns$xCGr&5COJ;yf3)x;PVAI#H(8amF|!zixPLeu$*t; z9iocRF(a$ph(%r2_q<=d7AAJIk7)iIp!3_|jo4V{&``vx?FdAyXa@Jn?vNd@HhCpi zW$m@y-GBS%h=?8Md2)nN>veyUlOq)V>nkG=hl+$Eo{V2G4D2%JlLI`uc#Z#e$M>kj zm`kV~Kf_ku?RmCHPETA{Hijd8j{|?-Jo9~vsh(Ez_Z_EN&65z{3ps&0iH9>JwXkMe O4bPca8ke7OiTXb;WZ>NZ From 543605e80a8665d21162ddb6d5a6fa604f80d37e Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Wed, 6 Dec 2023 19:57:57 -0800 Subject: [PATCH 133/281] forgive me cowboy. also fuck diagonals --- code/__DEFINES/colors.dm | 2 + code/__DEFINES/layers.dm | 7 +- code/__HELPERS/icon_smoothing.dm | 6 +- code/__HELPERS/lighting.dm | 6 +- code/_onclick/hud/fullscreen.dm | 7 +- code/_onclick/hud/render_plate.dm | 2 +- code/controllers/admin.dm | 2 +- code/game/area/areas.dm | 2 +- code/game/atoms_movable.dm | 189 +++++++++++------- code/game/machinery/_machinery.dm | 1 + code/game/machinery/barsigns.dm | 1 - code/game/machinery/computer/_computer.dm | 45 +++-- code/game/machinery/computer/law.dm | 2 +- code/game/machinery/doors/airlock.dm | 3 +- code/game/machinery/doors/door.dm | 1 + code/game/machinery/firealarm.dm | 72 ++++--- code/game/machinery/lightswitch.dm | 58 +++--- .../machinery/porta_turret/portable_turret.dm | 1 + code/game/objects/effects/misc.dm | 1 + code/game/objects/structures.dm | 1 + .../structures/crates_lockers/closets.dm | 45 +++-- code/game/objects/structures/statues.dm | 1 + code/game/objects/structures/watercloset.dm | 38 ++-- code/game/objects/structures/window.dm | 2 +- code/game/turfs/closed.dm | 1 + code/game/turfs/space/space.dm | 4 +- code/game/turfs/space/transit.dm | 2 +- code/game/turfs/turf.dm | 5 +- code/modules/lighting/lighting_object.dm | 6 +- code/modules/mining/lavaland/ruins/gym.dm | 1 + code/modules/mob/living/carbon/alien/alien.dm | 1 + .../mob/living/carbon/carbon_defines.dm | 1 + .../living/silicon/ai/freelook/cameranet.dm | 139 ++++++++----- .../mob/living/silicon/ai/freelook/chunk.dm | 116 ++++++----- .../modules/mob/living/silicon/robot/robot.dm | 4 +- .../computers/item/computer.dm | 50 ++--- .../modular_computers/hardware/card_slot.dm | 3 +- code/modules/power/apc.dm | 104 +++++----- code/modules/power/solar.dm | 1 + code/modules/power/tracker.dm | 1 + code/modules/projectiles/projectile.dm | 1 + code/modules/unit_tests/focus_only_tests.dm | 6 + code/modules/vehicles/_vehicle.dm | 1 + code/modules/vending/_vending.dm | 22 +- icons/effects/alphacolors.dmi | Bin 641 -> 654 bytes icons/effects/lighting_object.dmi | Bin 1893 -> 1899 bytes 46 files changed, 556 insertions(+), 408 deletions(-) diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index b6fbca4f6dce..ac767ac5e016 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -231,6 +231,8 @@ #define LIGHT_COLOR_LAVA "#C48A18" /// Bright, non-saturated red. Leaning slightly towards pink for visibility. rgb(250, 100, 75) #define LIGHT_COLOR_FLARE "#FA644B" +/// Vivid red. Leans a bit darker to accentuate red colors and leave other channels a bit dry. rgb(200, 25, 25) +#define LIGHT_COLOR_INTENSE_RED "#C81919" /// Weird color, between yellow and green, very slimy. rgb(175, 200, 75) #define LIGHT_COLOR_SLIME_LAMP "#AFC84B" /// Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 863ade0a5012..57d0eb01291c 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -75,6 +75,9 @@ ///Pipecrawling images #define PIPECRAWL_IMAGES_PLANE 20 +///AI Camera Static +#define CAMERA_STATIC_PLANE 21 + ///Anything that wants to be part of the game plane, but also wants to draw above literally everything else #define HIGH_GAME_PLANE 22 @@ -87,10 +90,6 @@ /// Plane for balloon text (text that fades up) #define BALLOON_CHAT_PLANE 31 -///AI Camera Static -- YOG -#define CAMERA_STATIC_LAYER 40 -#define CAMERA_STATIC_PLANE 40 - //-------------------- HUD --------------------- //HUD layer defines #define HUD_PLANE 40 diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 41b9d266c59e..2b00c7c4db39 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -156,13 +156,11 @@ /turf/closed/wall/diagonal_smooth(adjacencies) adjacencies = reverse_ndir(..()) if(adjacencies) - var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, plane = FLOOR_PLANE) + var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, offset_spokesman = src, plane = FLOOR_PLANE) var/list/U = list(underlay_appearance) if(fixed_underlay) if(fixed_underlay["space"]) - underlay_appearance.icon = 'icons/turf/space.dmi' - underlay_appearance.icon_state = SPACE_ICON_STATE - underlay_appearance.plane = PLANE_SPACE + generate_space_underlay(underlay_appearance, src) else underlay_appearance.icon = fixed_underlay["icon"] underlay_appearance.icon_state = fixed_underlay["icon_state"] diff --git a/code/__HELPERS/lighting.dm b/code/__HELPERS/lighting.dm index 206d0b7058f0..96087ba17377 100644 --- a/code/__HELPERS/lighting.dm +++ b/code/__HELPERS/lighting.dm @@ -7,8 +7,10 @@ var/alpha_ratio = alpha/255 appearance.color = _EMISSIVE_COLOR(alpha_ratio) - // if(icon_state && !icon_exists(icon, icon_state, scream = FALSE)) //Scream set to False so we can have a custom stack_trace - // stack_trace("An emissive appearance was added with non-existant icon_state \"[icon_state]\" in [icon]!") + //Test to make sure emissives with broken or missing icon states are created + if(PERFORM_ALL_TESTS(focus_only/invalid_emissives)) + if(icon_state && !icon_exists(icon, icon_state, scream = FALSE)) //Scream set to False so we can have a custom stack_trace + stack_trace("An emissive appearance was added with non-existant icon_state \"[icon_state]\" in [icon]!") return appearance diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 44448a99468a..dea8b8806d2b 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -14,6 +14,9 @@ if (client && screen.should_show_to(src)) screen.update_for_view(client.view) client.screen += screen + + if(screen.needs_offsetting) + SET_PLANE_EXPLICIT(screen, PLANE_TO_TRUE(screen.plane), src) return screen @@ -67,6 +70,7 @@ var/view = 7 var/severity = 0 var/show_when_dead = FALSE + var/needs_offsetting = TRUE /atom/movable/screen/fullscreen/proc/update_for_view(client_view) if (screen_loc == "CENTER-7,CENTER-7" && view != client_view) @@ -186,15 +190,16 @@ icon_state = "flash" screen_loc = "WEST,SOUTH to EAST,NORTH" plane = LIGHTING_PLANE + layer = LIGHTING_ABOVE_ALL blend_mode = BLEND_OVERLAY show_when_dead = TRUE + needs_offsetting = FALSE //Provides darkness to the back of the lighting plane /atom/movable/screen/fullscreen/lighting_backdrop/lit invisibility = INVISIBILITY_LIGHTING layer = BACKGROUND_LAYER+21 color = "#000" - show_when_dead = TRUE //Provides whiteness in case you don't see lights so everything is still visible /atom/movable/screen/fullscreen/lighting_backdrop/unlit diff --git a/code/_onclick/hud/render_plate.dm b/code/_onclick/hud/render_plate.dm index 584d8b4275d9..a50bd33ce52d 100644 --- a/code/_onclick/hud/render_plate.dm +++ b/code/_onclick/hud/render_plate.dm @@ -280,7 +280,7 @@ emissive.remove_filter("lighting_mask") // We max alpha here, so our darkness is actually.. dark // Can't do it before cause it fucks with the filter - add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME, offset)) + add_relay_to(GET_NEW_PLANE(RENDER_PLANE_GAME, offset), relay_color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,1)) ///render plate for OOC stuff like ghosts, hud-screen effects, etc /atom/movable/screen/plane_master/rendering_plate/non_game diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm index 524e568b8f56..2c01e55f2626 100644 --- a/code/controllers/admin.dm +++ b/code/controllers/admin.dm @@ -1,7 +1,7 @@ // Clickable stat() button. /obj/effect/statclick name = "Initializing..." - blocks_emissive = NONE + blocks_emissive = EMISSIVE_BLOCK_NONE var/target INITIALIZE_IMMEDIATE(/obj/effect/statclick) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 1e4f2d754cd6..fbac7a5be042 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -623,7 +623,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/proc/power_change() for(var/obj/machinery/M in src) // for each machine in the area M.power_change() // reverify power status (to update icons etc.) - update_appearance(UPDATE_ICON) + update_appearance() /** * Return the usage of power per channel diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 67607e1d09c2..9a8f477e2a2a 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1,5 +1,8 @@ /atom/movable layer = OBJ_LAYER + glide_size = 8 + appearance_flags = TILE_BOUND|PIXEL_SCALE|LONG_GLIDE + var/last_move = null var/last_move_time = 0 var/anchored = FALSE @@ -31,8 +34,7 @@ var/atom/movable/moving_from_pull //attempt to resume grab after moving instead of before. var/list/client_mobs_in_contents // This contains all the client mobs within this container var/list/acted_explosions //for explosion dodging - glide_size = 8 - appearance_flags = TILE_BOUND|PIXEL_SCALE|LONG_GLIDE + var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm var/movement_type = GROUND //Incase you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc. var/atom/movable/pulling @@ -50,9 +52,9 @@ /// Either FALSE, [EMISSIVE_BLOCK_GENERIC], or [EMISSIVE_BLOCK_UNIQUE] - var/blocks_emissive = FALSE + var/blocks_emissive = EMISSIVE_BLOCK_NONE ///Internal holder for emissive blocker object, do not use directly use blocks_emissive - var/atom/movable/emissive_blocker/em_block + var/atom/movable/render_step/emissive_blocker/em_block /// The degree of thermal insulation that mobs in list/contents have from the external environment, between 0 and 1 var/contents_thermal_insulation = 0 @@ -64,20 +66,68 @@ ///Highest-intensity light affecting us, which determines our visibility. var/affecting_dynamic_lumi = 0 +/mutable_appearance/emissive_blocker + +/mutable_appearance/emissive_blocker/New() + . = ..() + // Need to do this here because it's overriden by the parent call + color = EM_BLOCK_COLOR + plane = EMISSIVE_PLANE + appearance_flags = EMISSIVE_APPEARANCE_FLAGS /atom/movable/Initialize(mapload, ...) . = ..() - switch(blocks_emissive) - if(EMISSIVE_BLOCK_GENERIC) - update_emissive_block() - if(EMISSIVE_BLOCK_UNIQUE) +#ifdef UNIT_TESTS + if(explosion_block && !HAS_TRAIT(src, TRAIT_BLOCKING_EXPLOSIVES)) + stack_trace("[type] blocks explosives, but does not have the managing element applied") +#endif + +#if EMISSIVE_BLOCK_GENERIC != 0 + #error EMISSIVE_BLOCK_GENERIC is expected to be 0 to faciliate a weird optimization hack where we rely on it being the most common. + #error Read the comment in code/game/atoms_movable.dm for details. +#endif + + // This one is incredible. + // `if (x) else { /* code */ }` is surprisingly fast, and it's faster than a switch, which is seemingly not a jump table. + // From what I can tell, a switch case checks every single branch individually, although sane, is slow in a hot proc like this. + // So, we make the most common `blocks_emissive` value, EMISSIVE_BLOCK_GENERIC, 0, getting to the fast else branch quickly. + // If it fails, then we can check over every value it can be (here, EMISSIVE_BLOCK_UNIQUE is the only one that matters). + // This saves several hundred milliseconds of init time. + if (blocks_emissive) + if (blocks_emissive == EMISSIVE_BLOCK_UNIQUE) render_target = ref(src) - em_block = new(src, render_target) - vis_contents += em_block + em_block = new(null, src) + overlays += em_block + if(managed_overlays) + if(islist(managed_overlays)) + managed_overlays += em_block + else + managed_overlays = list(managed_overlays, em_block) + else + managed_overlays = em_block + else + var/static/mutable_appearance/emissive_blocker/blocker = new() + blocker.icon = icon + blocker.icon_state = icon_state + blocker.dir = dir + blocker.appearance_flags |= appearance_flags + //blocker.plane = GET_NEW_PLANE(EMISSIVE_PLANE, PLANE_TO_OFFSET(plane)) + // Ok so this is really cursed, but I want to set with this blocker cheaply while + // Still allowing it to be removed from the overlays list later + // So I'm gonna flatten it, then insert the flattened overlay into overlays AND the managed overlays list, directly + // I'm sorry + var/mutable_appearance/flat = blocker.appearance + overlays += flat + if(managed_overlays) + if(islist(managed_overlays)) + managed_overlays += flat + else + managed_overlays = list(managed_overlays, flat) + else + managed_overlays = flat if(opacity) AddElement(/datum/element/light_blocking) - switch(light_system) if(MOVABLE_LIGHT) AddComponent(/datum/component/overlay_lighting) @@ -149,6 +199,65 @@ else return fast_emissive_blocker(src) +/// Generates a space underlay for a turf +/// This provides proper lighting support alongside just looking nice +/// Accepts the appearance to make "spaceish", and the turf we're doing this for +/proc/generate_space_underlay(mutable_appearance/underlay_appearance, turf/generate_for) + underlay_appearance.icon = 'icons/turf/space.dmi' + underlay_appearance.icon_state = "0" + SET_PLANE(underlay_appearance, PLANE_SPACE, generate_for) + if(!generate_for.render_target) + generate_for.render_target = ref(generate_for) + var/atom/movable/render_step/emissive_blocker/em_block = new(null, generate_for) + underlay_appearance.overlays += em_block + // We used it because it's convienient and easy, but it's gotta go now or it'll hang refs + QDEL_NULL(em_block) + // We're gonna build a light, and mask it with the base turf's appearance + // grab a 32x32 square of it + // I would like to use GLOB.starbright_overlays here + // But that breaks down for... some? reason. I think recieving a render relay breaks keep_together or something + // So we're just gonna accept that this'll break with starlight color changing. hardly matters since this is really only for offset stuff, but I'd love to fix it someday + var/mutable_appearance/light = new(GLOB.starlight_objects[GET_TURF_PLANE_OFFSET(generate_for) + 1]) + light.render_target = "" + light.appearance_flags |= KEEP_TOGETHER + // Now apply a copy of the turf, set to multiply + // This will multiply against our light, so we only light up the bits that aren't "on" the wall + var/mutable_appearance/mask = new(generate_for.appearance) + mask.blend_mode = BLEND_MULTIPLY + mask.render_target = "" + mask.pixel_x = 0 + mask.pixel_y = 0 + mask.pixel_w = 0 + mask.pixel_z = 0 + mask.transform = null + mask.underlays = list() // Begone foul lighting overlay + SET_PLANE(mask, FLOAT_PLANE, generate_for) + mask.layer = FLOAT_LAYER + + // Bump the opacity to full, will this work? + mask.color = list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,255, 0,0,0,0) + light.overlays += mask + underlay_appearance.overlays += light + + // Now, we're going to make a copy of the mask. Instead of using it to multiply against our light + // We're going to use it to multiply against the turf lighting plane. Going to mask away the turf light + // And rely on LIGHTING_MASK_LAYER to ensure we mask ONLY that bit + var/mutable_appearance/turf_mask = new(mask.appearance) + SET_PLANE(turf_mask, LIGHTING_PLANE, generate_for) + turf_mask.layer = LIGHTING_MASK_LAYER + /// Any color becomes white. Anything else is black, and it's fully opaque + /// Ought to work + turf_mask.color = list(255,255,255,0, 255,255,255,0, 255,255,255,0, 0,0,0,0, 0,0,0,255) + underlay_appearance.overlays += turf_mask + +/atom/movable/update_overlays() + var/list/overlays = ..() + var/emissive_block = update_emissive_block() + if(emissive_block) + // Emissive block should always go at the beginning of the list + overlays.Insert(1, emissive_block) + return overlays + /atom/movable/proc/can_zFall(turf/source, levels = 1, turf/target, direction) if(!direction) direction = DOWN @@ -1155,61 +1264,3 @@ currently_z_moving = max(currently_z_moving, new_z_moving_value) return currently_z_moving > old_z_moving_value -/// Generates a space underlay for a turf -/// This provides proper lighting support alongside just looking nice -/// Accepts the appearance to make "spaceish", and the turf we're doing this for -/proc/generate_space_underlay(mutable_appearance/underlay_appearance, turf/generate_for) - underlay_appearance.icon = 'icons/turf/space.dmi' - underlay_appearance.icon_state = "space" - SET_PLANE(underlay_appearance, PLANE_SPACE, generate_for) - if(!generate_for.render_target) - generate_for.render_target = ref(generate_for) - var/atom/movable/render_step/emissive_blocker/em_block = new(null, generate_for) - underlay_appearance.overlays += em_block - // We used it because it's convienient and easy, but it's gotta go now or it'll hang refs - QDEL_NULL(em_block) - // We're gonna build a light, and mask it with the base turf's appearance - // grab a 32x32 square of it - // I would like to use GLOB.starbright_overlays here - // But that breaks down for... some? reason. I think recieving a render relay breaks keep_together or something - // So we're just gonna accept that this'll break with starlight color changing. hardly matters since this is really only for offset stuff, but I'd love to fix it someday - var/mutable_appearance/light = new(GLOB.starlight_objects[GET_TURF_PLANE_OFFSET(generate_for) + 1]) - light.render_target = "" - light.appearance_flags |= KEEP_TOGETHER - // Now apply a copy of the turf, set to multiply - // This will multiply against our light, so we only light up the bits that aren't "on" the wall - var/mutable_appearance/mask = new(generate_for.appearance) - mask.blend_mode = BLEND_MULTIPLY - mask.render_target = "" - mask.pixel_x = 0 - mask.pixel_y = 0 - mask.pixel_w = 0 - mask.pixel_z = 0 - mask.transform = null - mask.underlays = list() // Begone foul lighting overlay - SET_PLANE(mask, FLOAT_PLANE, generate_for) - mask.layer = FLOAT_LAYER - - // Bump the opacity to full, will this work? - mask.color = list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,255, 0,0,0,0) - light.overlays += mask - underlay_appearance.overlays += light - - // Now, we're going to make a copy of the mask. Instead of using it to multiply against our light - // We're going to use it to multiply against the turf lighting plane. Going to mask away the turf light - // And rely on LIGHTING_MASK_LAYER to ensure we mask ONLY that bit - var/mutable_appearance/turf_mask = new(mask.appearance) - SET_PLANE(turf_mask, LIGHTING_PLANE, generate_for) - turf_mask.layer = LIGHTING_MASK_LAYER - /// Any color becomes white. Anything else is black, and it's fully opaque - /// Ought to work - turf_mask.color = list(255,255,255,0, 255,255,255,0, 255,255,255,0, 0,0,0,0, 0,0,0,255) - underlay_appearance.overlays += turf_mask - -/atom/movable/update_overlays() - var/list/overlays = ..() - var/emissive_block = update_emissive_block() - if(emissive_block) - // Emissive block should always go at the beginning of the list - overlays.Insert(1, emissive_block) - return overlays diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 8a017d1be4f5..3960ef4f6ddc 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -95,6 +95,7 @@ Class Procs: anchored = TRUE interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT + blocks_emissive = EMISSIVE_BLOCK_GENERIC var/stat = 0 var/use_power = IDLE_POWER_USE diff --git a/code/game/machinery/barsigns.dm b/code/game/machinery/barsigns.dm index 53edc780a79c..f65c784142ee 100644 --- a/code/game/machinery/barsigns.dm +++ b/code/game/machinery/barsigns.dm @@ -72,7 +72,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) return if(chosen_sign && chosen_sign.light_mask) - SSvis_overlays.add_vis_overlay(src, icon, light_mask, EMISSIVE_LAYER, EMISSIVE_PLANE) . += emissive_appearance(icon, "[chosen_sign.icon_state]-light-mask", src) /obj/machinery/barsign/update_appearance(updates=ALL) diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index a52037615b75..d4ad71aa8e3a 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -10,16 +10,21 @@ integrity_failure = 100 armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 40, ACID = 20) clicksound = "keyboard" - light_system = STATIC_LIGHT - light_range = 2 - light_power = 1 - light_on = TRUE + /// How bright we are when turned on. + var/brightness_on = 1 + /// Icon_state of the keyboard overlay. var/icon_keyboard = "generic_key" + /// Should we render an unique icon for the keyboard when off? + var/keyboard_change_icon = TRUE + /// Icon_state of the emissive screen overlay. var/icon_screen = "generic" - var/clockwork = FALSE - var/time_to_scewdrive = 20 + /// Time it takes to deconstruct with a screwdriver. + var/time_to_unscrew = 2 SECONDS + /// Are we authenticated to use this? Used by things like comms console, security and medical data, and apc controller. var/authenticated = FALSE + var/clockwork = FALSE + /obj/machinery/computer/Initialize(mapload, obj/item/circuitboard/C) . = ..() if(mapload) @@ -86,17 +91,23 @@ /obj/machinery/computer/update_overlays() . = ..() - if(stat & NOPOWER) - . += "[icon_keyboard]_off" - return - . += icon_keyboard + if(icon_keyboard) + if(keyboard_change_icon && (stat & NOPOWER)) + . += "[icon_keyboard]_off" + else + . += icon_keyboard - // This whole block lets screens ignore lighting and be visible even in the darkest room - var/overlay_state = icon_screen if(stat & BROKEN) - overlay_state = "[icon_state]_broken" - . += mutable_appearance(icon, overlay_state) - . += emissive_appearance(icon, icon_screen, src) + . += mutable_appearance(icon, "[icon_state]_broken") + return // If we don't do this broken computers glow in the dark. + + if(stat & NOPOWER) // Your screen can't be on if you've got no damn charge + return + + // This lets screens ignore lighting and be visible even in the darkest room + if(icon_screen) + . += mutable_appearance(icon, icon_screen) + . += emissive_appearance(icon, icon_screen, src) /obj/machinery/computer/power_change() . = ..() @@ -105,14 +116,14 @@ if(stat & NOPOWER) set_light_on(FALSE) else - set_light_on(TRUE) + set_light_on(brightness_on) /obj/machinery/computer/screwdriver_act(mob/living/user, obj/item/I) if(..()) return TRUE if(circuit && !(flags_1&NODECONSTRUCT_1)) to_chat(user, span_notice("You start to disconnect the monitor...")) - if(I.use_tool(src, user, time_to_scewdrive, volume=50)) + if(I.use_tool(src, user, time_to_unscrew, volume=50)) deconstruct(TRUE, user) return TRUE diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 1d94d7aaa442..c2457531d61b 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -5,7 +5,7 @@ icon_screen = "command" var/obj/item/gps/internal/ai_upload/embedded_gps var/obj/item/gps/internal/ai_upload/embedded_gps_type = /obj/item/gps/internal/ai_upload - time_to_scewdrive = 60 + time_to_unscrew = 6 SECONDS /obj/item/gps/internal/ai_upload icon_state = null diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index fcb931fa2f4a..345c410881b4 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -70,7 +70,8 @@ ) interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN - + blocks_emissive = EMISSIVE_BLOCK_NONE + /// How much are wires secured var/security_level = 0 /// If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 4d298a074a71..171f0c510fc7 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -15,6 +15,7 @@ damage_deflection = 10 interaction_flags_atom = INTERACT_ATOM_UI_INTERACT + blocks_emissive = EMISSIVE_BLOCK_UNIQUE /// TRUE means density will be set as soon as the door begins to close var/air_tight = FALSE diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 9a25df359b09..d946d60f8ffc 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -26,8 +26,8 @@ power_channel = AREA_USAGE_ENVIRON resistance_flags = FIRE_PROOF - light_power = 0 - light_range = 7 + light_power = 1 + light_range = 1.6 light_color = "#ff3232" //Trick to get the glowing overlay visible from a distance luminosity = 1 @@ -56,7 +56,7 @@ panel_open = TRUE pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0 - update_appearance(UPDATE_ICON) + update_appearance() myarea = get_area(src) LAZYADD(myarea.firealarms, src) radio = new(src) @@ -84,42 +84,40 @@ /obj/machinery/firealarm/update_overlays() . = ..() - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(stat & (NOPOWER|BROKEN)) return - . += "fire_overlay" - 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_PLANE, dir) - . += emissive_appearance(icon, "fire_level_e", src, alpha = src.alpha) + var/current_level = GLOB.security_level + . += mutable_appearance(icon, "fire_[GLOB.security_level]") + . += emissive_appearance(icon, "fire_[GLOB.security_level]", src) + switch(current_level) + if(SEC_LEVEL_GREEN) + set_light(l_color = LIGHT_COLOR_BLUEGREEN) + if(SEC_LEVEL_BLUE) + set_light(l_color = LIGHT_COLOR_ELECTRIC_CYAN) + if(SEC_LEVEL_RED) + set_light(l_color = LIGHT_COLOR_FLARE) + if(SEC_LEVEL_DELTA) + set_light(l_color = LIGHT_COLOR_INTENSE_RED) 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_PLANE, dir) - . += emissive_appearance(icon, "fire_level_e", src, alpha = src.alpha) + . += mutable_appearance(icon, "fire_[SEC_LEVEL_GREEN]") + . += emissive_appearance(icon, "fire_[SEC_LEVEL_GREEN]", src) set_light(l_color = LIGHT_COLOR_BLUE) var/area/A = src.loc A = A.loc if(!A.fire && !A.delta_light) - . += "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_PLANE, dir) + . += mutable_appearance(icon, "fire_off") + . += emissive_appearance(icon, "fire_off", src) 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_PLANE, dir) - . += emissive_appearance(icon, "fire_alerting_e", src, alpha = src.alpha) + . += mutable_appearance(icon, "fire_emagged") + . += emissive_appearance(icon, "fire_emagged", src) set_light(l_color = LIGHT_COLOR_RED) 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_PLANE, dir) - . += emissive_appearance(icon, "fire_alerting_e", src, alpha = src.alpha) + . += mutable_appearance(icon, "fire_on") + . += emissive_appearance(icon, "fire_on", src) set_light(l_color = LIGHT_COLOR_RED) /obj/machinery/firealarm/emp_act(severity) @@ -135,7 +133,7 @@ if(obj_flags & EMAGGED) return FALSE obj_flags |= EMAGGED - update_appearance(UPDATE_ICON) + update_appearance() if(user) user.visible_message(span_warning("Sparks fly out of [src]!"), span_notice("You emag [src], disabling its thermal sensors.")) @@ -214,7 +212,7 @@ W.play_tool_sound(src) panel_open = !panel_open to_chat(user, span_notice("The wires have been [panel_open ? "exposed" : "unexposed"].")) - update_appearance(UPDATE_ICON) + update_appearance() return if(panel_open) @@ -247,7 +245,7 @@ W.play_tool_sound(src) new /obj/item/stack/cable_coil(user.loc, 5) to_chat(user, span_notice("You cut the wires from \the [src].")) - update_appearance(UPDATE_ICON) + update_appearance() return else if(W.force) //hit and turn it on @@ -265,7 +263,7 @@ coil.use(5) buildstage = 2 to_chat(user, span_notice("You wire \the [src].")) - update_appearance(UPDATE_ICON) + update_appearance() return else if(W.tool_behaviour == TOOL_CROWBAR) @@ -280,14 +278,14 @@ to_chat(user, span_notice("You pry out the circuit.")) new /obj/item/electronics/firealarm(user.loc) buildstage = 0 - update_appearance(UPDATE_ICON) + update_appearance() return if(0) if(istype(W, /obj/item/electronics/firealarm)) to_chat(user, span_notice("You insert the circuit.")) qdel(W) buildstage = 1 - update_appearance(UPDATE_ICON) + update_appearance() return else if(istype(W, /obj/item/electroadaptive_pseudocircuit)) @@ -297,7 +295,7 @@ user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ span_notice("You adapt a fire alarm circuit and slot it into the assembly.")) buildstage = 1 - update_appearance(UPDATE_ICON) + update_appearance() return else if(W.tool_behaviour == TOOL_WRENCH) @@ -323,7 +321,7 @@ user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ span_notice("You adapt a fire alarm circuit and slot it into the assembly.")) buildstage = 1 - update_appearance(UPDATE_ICON) + update_appearance() return TRUE return FALSE @@ -362,11 +360,11 @@ if(fire == !!light_power) return // do nothing if we're already active if(fire) - set_light(l_power = 0.8) - update_appearance(UPDATE_ICON) + set_light(l_power = 3) + update_appearance() else - set_light(l_power = 0) - update_appearance(UPDATE_ICON) + set_light(l_power = 1) + update_appearance() /* * Return of the Return of the Party button diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 2c93e617313a..3830ecb17ec3 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -62,8 +62,8 @@ desc = "Make dark." power_channel = AREA_USAGE_LIGHT - light_power = 0 - light_range = 7 + ///Range of the light emitted when powered, but off + var/light_on_range = 1 /// Set this to a string, path, or area instance to control that area /// instead of the switch's location. @@ -86,7 +86,7 @@ if(mapload) construction_state = LIGHT_CONSTRUCTED - update_appearance(UPDATE_ICON) + update_appearance() if(mapload) return INITIALIZE_HINT_LATELOAD return INITIALIZE_HINT_NORMAL @@ -99,25 +99,39 @@ return turn_off() +/obj/machinery/light_switch/update_appearance(updates=ALL) + . = ..() + luminosity = (stat & NOPOWER) ? 0 : 1 + +/obj/machinery/light_switch/update_icon_state() + set_light(area.lightswitch ? 0 : light_on_range) + switch(construction_state) + if(LIGHT_BARE) + icon_state = "light-b" + if(LIGHT_WIRE) + icon_state = "light-w" + if(LIGHT_CONSTRUCTED) + icon_state = "light-c" + + return ..() + /obj/machinery/light_switch/update_overlays() . = ..() if(stat & (NOPOWER|BROKEN)) return if(construction_state != LIGHT_CONSTRUCTED) return - if(area.lightswitch) - . += "light1" - else - . += "light0" + . += mutable_appearance(icon, "[area.lightswitch ? "light1" : "light0"]") + . += emissive_appearance(icon, "[area.lightswitch ? "light1" : "light0"]", src) /obj/machinery/light_switch/proc/turn_off() if(!area.lightswitch) return area.lightswitch = FALSE - area.update_icon() + area.update_appearance() for(var/obj/machinery/light_switch/L in area) - L.update_icon() + L.update_appearance() area.power_change() @@ -125,10 +139,10 @@ if(area.lightswitch) return area.lightswitch = TRUE - area.update_icon() + area.update_appearance() for(var/obj/machinery/light_switch/L in area) - L.update_icon() + L.update_appearance() area.power_change() @@ -146,11 +160,10 @@ . = ..() area.lightswitch = !area.lightswitch - area.update_appearance(UPDATE_ICON) play_click_sound("button") for(var/obj/machinery/light_switch/L in area) - L.update_appearance(UPDATE_ICON) + L.update_appearance() area.power_change() @@ -161,7 +174,7 @@ if(istype(c) && c.use(1)) to_chat(user, span_notice("You insert wiring into [src].")) construction_state = LIGHT_WIRE - update_appearance(UPDATE_ICON) + update_appearance() return if(W.tool_behaviour == TOOL_WRENCH) W.play_tool_sound(src) @@ -174,7 +187,7 @@ to_chat(user, span_notice("You cut the wires out.")) new /obj/item/stack/cable_coil(loc, 1) construction_state = LIGHT_BARE - update_appearance(UPDATE_ICON) + update_appearance() return if(panel_open && is_wire_tool(W)) wires.interact(user) @@ -184,7 +197,7 @@ to_chat(user, span_notice("You screw the cover on.")) panel_open = FALSE construction_state = LIGHT_CONSTRUCTED - update_appearance(UPDATE_ICON) + update_appearance() return if(LIGHT_CONSTRUCTED) if(W.tool_behaviour == TOOL_SCREWDRIVER) @@ -192,21 +205,10 @@ to_chat(user, span_notice("You take the cover off.")) panel_open = TRUE construction_state = LIGHT_WIRE - update_appearance(UPDATE_ICON) + update_appearance() return return ..() -/obj/machinery/light_switch/update_icon_state() - . = ..() - switch(construction_state) - if(LIGHT_BARE) - icon_state = "light-b" - if(LIGHT_WIRE) - icon_state = "light-w" - if(LIGHT_CONSTRUCTED) - icon_state = "light-c" - - /obj/machinery/light_switch/power_change() if(area == get_area(src)) return ..() diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 75e316392d43..466411473c78 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -9,6 +9,7 @@ icon = 'icons/obj/turrets.dmi' icon_state = "turretCover" base_icon_state = "standard" + blocks_emissive = EMISSIVE_BLOCK_UNIQUE layer = OBJ_LAYER invisibility = INVISIBILITY_OBSERVER //the turret is invisible if it's inside its cover density = TRUE diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 9e64edab098d..0086228f3d94 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -77,6 +77,7 @@ light_color = "#FFFFFF" light_system = MOVABLE_LIGHT light_range = MINIMUM_USEFUL_LIGHT_RANGE + blocks_emissive = EMISSIVE_BLOCK_NONE mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/effect/dummy/lighting_obj/Initialize(mapload, range, power, color, duration) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 9dd4ff9c89a1..0366d3874365 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -4,6 +4,7 @@ max_integrity = 300 interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT layer = BELOW_OBJ_LAYER + blocks_emissive = EMISSIVE_BLOCK_GENERIC var/broken = 0 //similar to machinery's stat BROKEN diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 16f0459abe58..75136c9095e9 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -17,6 +17,7 @@ GLOBAL_LIST_EMPTY(lockers) max_integrity = 200 integrity_failure = 50 armor = list(MELEE = 20, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 70, ACID = 60) + blocks_emissive = EMISSIVE_BLOCK_GENERIC var/breakout_time = 1200 var/message_cooldown var/can_weld_shut = TRUE @@ -33,6 +34,7 @@ GLOBAL_LIST_EMPTY(lockers) var/delivery_icon = "deliverycloset" //which icon to use when packagewrapped. null to be unwrappable. var/anchorable = TRUE var/icon_welded = "welded" + var/icon_broken = "sparking" /// Protection against weather that being inside of it provides. var/list/weather_protection = null /// How close being inside of the thing provides complete pressure safety. Must be between 0 and 1! @@ -56,7 +58,7 @@ GLOBAL_LIST_EMPTY(lockers) if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents . = INITIALIZE_HINT_LATELOAD - update_appearance(UPDATE_ICON) + update_appearance() PopulateContents() var/static/list/loc_connections = list( COMSIG_ATOM_MAGICALLY_UNLOCKED = PROC_REF(on_magic_unlock), @@ -84,10 +86,16 @@ GLOBAL_LIST_EMPTY(lockers) update_appearance() . = TRUE +/obj/structure/closet/update_appearance(updates=ALL) + . = ..() + if(opened || broken || !secure) + luminosity = 0 + return + luminosity = 1 + /obj/structure/closet/update_overlays() . = ..() - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) - luminosity = 0 + //SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(opened) layer = BELOW_OBJ_LAYER if(is_animating_door) @@ -106,14 +114,17 @@ GLOBAL_LIST_EMPTY(lockers) . += "[icon_state]_door" if(welded) . += icon_welded - if(secure && !broken) + if(broken && secure) + . += mutable_appearance(icon, icon_broken, alpha = alpha) + . += emissive_appearance(icon, icon_broken, src, alpha = alpha) + return + if(broken || !secure) + return //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_LAYER, EMISSIVE_PLANE, dir, alpha) - if(locked) - . += "locked" - else - . += "unlocked" + //luminosity = 1 + //SSvis_overlays.add_vis_overlay(src, icon, "locked", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) + . += emissive_appearance(icon, "locked", src, alpha = src.alpha) + . += locked ? "locked" : "unlocked" /obj/structure/closet/proc/animate_door(closing = FALSE) if(!door_anim_time) @@ -143,7 +154,7 @@ GLOBAL_LIST_EMPTY(lockers) /obj/structure/closet/proc/end_door_animation() is_animating_door = FALSE vis_contents -= door_obj - update_appearance(UPDATE_ICON) + update_appearance() /obj/structure/closet/proc/get_door_transform(angle) var/matrix/M = matrix() @@ -222,7 +233,7 @@ GLOBAL_LIST_EMPTY(lockers) density = FALSE dump_contents() animate_door(FALSE) - update_appearance(UPDATE_ICON) + update_appearance() update_airtightness() return 1 @@ -275,7 +286,7 @@ GLOBAL_LIST_EMPTY(lockers) opened = FALSE density = TRUE animate_door(TRUE) - update_appearance(UPDATE_ICON) + update_appearance() update_airtightness() close_storage(user) return TRUE @@ -349,7 +360,7 @@ GLOBAL_LIST_EMPTY(lockers) user.visible_message(span_notice("[user] [welded ? "welds shut" : "unwelded"] \the [src]."), span_notice("You [welded ? "weld" : "unwelded"] \the [src] with \the [W]."), span_italics("You hear welding.")) - update_appearance(UPDATE_ICON) + update_appearance() else if(W.tool_behaviour == TOOL_WRENCH && anchorable) if(isinspace() && !anchored) return @@ -525,7 +536,7 @@ GLOBAL_LIST_EMPTY(lockers) locked = !locked user.visible_message(span_notice("[user] [locked ? null : "un"]locks [src]."), span_notice("You [locked ? null : "un"]lock [src].")) - update_appearance(UPDATE_ICON) + update_appearance() else if(!silent) to_chat(user, span_notice("Access Denied")) else if(secure && broken) @@ -540,7 +551,7 @@ GLOBAL_LIST_EMPTY(lockers) playsound(src, "sparks", 50, 1) broken = TRUE locked = FALSE - update_appearance(UPDATE_ICON) + update_appearance() return TRUE /obj/structure/closet/get_remote_view_fullscreens(mob/user) @@ -557,7 +568,7 @@ GLOBAL_LIST_EMPTY(lockers) if(secure && !broken && !(. & EMP_PROTECT_SELF)) if(prob(5 * severity)) locked = !locked - update_appearance(UPDATE_ICON) + update_appearance() if(prob(2 * severity) && !opened) if(!locked) open() diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 30862146bfb1..7ae13941e176 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -15,6 +15,7 @@ var/material_drop_type = /obj/item/stack/sheet/metal var/impressiveness = 15 CanAtmosPass = ATMOS_PASS_DENSITY + blocks_emissive = EMISSIVE_BLOCK_UNIQUE /obj/structure/statue/Initialize(mapload) . = ..() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index c1050969b625..424517cfbfbe 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -387,26 +387,34 @@ opacity = FALSE density = FALSE var/open = TRUE + /// if it can be seen through when closed + var/opaque_closed = FALSE + +/obj/structure/curtain/Initialize(mapload) + // see-through curtains should let emissives shine through + if(!opaque_closed) + blocks_emissive = EMISSIVE_BLOCK_NONE + return ..() /obj/structure/curtain/proc/toggle() open = !open - update_appearance(UPDATE_ICON) - -/obj/structure/curtain/update_icon_state() - . = ..() - if(!open) - icon_state = "closed" - layer = WALL_OBJ_LAYER - density = TRUE - open = FALSE - set_opacity(TRUE) - - else - icon_state = "open" + if(open) layer = SIGN_LAYER - density = FALSE - open = TRUE + SET_PLANE_IMPLICIT(src, GAME_PLANE) + set_density(FALSE) set_opacity(FALSE) + else + layer = WALL_OBJ_LAYER + SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) + set_density(TRUE) + if(opaque_closed) + set_opacity(TRUE) + + update_appearance() + +/obj/structure/curtain/update_icon_state() + icon_state = "[open ? "open" : "closed"]" + return ..() /obj/structure/curtain/attackby(obj/item/W, mob/user) if (istype(W, /obj/item/toy/crayon)) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index d4a01fd2a175..6726248bf79d 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -325,7 +325,7 @@ //This proc is used to update the icons of nearby windows. /obj/structure/window/proc/update_nearby_icons() - update_appearance(UPDATE_ICON) + update_appearance() if(smooth) queue_smooth_neighbors(src) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 114bcd368b51..07e3ca8f1869 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -1,5 +1,6 @@ /turf/closed layer = CLOSED_TURF_LAYER + plane = WALL_PLANE opacity = TRUE density = TRUE blocks_air = TRUE diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index e5ce5053fad7..d9dac63995ee 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -98,8 +98,8 @@ GLOBAL_LIST_EMPTY(starlight) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 - var/area/A = loc - if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) + var/area/our_area = loc + if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(our_area)) add_overlay(/obj/effect/fullbright) if (light_system == STATIC_LIGHT && light_power && light_range) diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index 39d0c255272a..3ab965eb643e 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -8,7 +8,7 @@ /turf/open/space/transit/Initialize(mapload) . = ..() - update_appearance(UPDATE_ICON) + update_appearance() RegisterSignal(src, COMSIG_TURF_RESERVATION_RELEASED, PROC_REF(launch_contents)) /turf/open/space/transit/Destroy() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 9173c4486564..0a817e55332b 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -2,6 +2,7 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf icon = 'icons/turf/floors.dmi' + vis_flags = VIS_INHERIT_ID // Important for interaction with and visualization of openspace. level = 1 luminosity = 1 @@ -92,8 +93,8 @@ GLOBAL_LIST_EMPTY(station_turfs) for(var/atom/movable/AM in src) Entered(AM) - var/area/A = loc - if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) + var/area/our_area = loc + if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(our_area)) add_overlay(/obj/effect/fullbright) if(requires_activation) diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index b51ec1c2a299..4a26ae86279e 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -15,7 +15,7 @@ return . = ..() - current_underlay = mutable_appearance(LIGHTING_ICON, "atransparent", source.z, source, LIGHTING_PLANE, 255, RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM) + current_underlay = mutable_appearance(LIGHTING_ICON, "transparent", source.z, source, LIGHTING_PLANE, 255, RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM) affected_turf = source if (affected_turf.lighting_object) @@ -88,12 +88,12 @@ if((rr & gr & br & ar) && (rg + gg + bg + ag + rb + gb + bb + ab == 8)) //anything that passes the first case is very likely to pass the second, and addition is a little faster in this case affected_turf.underlays -= current_underlay - current_underlay.icon_state = "atransparent" + current_underlay.icon_state = "lighting_transparent" current_underlay.color = null affected_turf.underlays += current_underlay else if(!set_luminosity) affected_turf.underlays -= current_underlay - current_underlay.icon_state = "adark" + current_underlay.icon_state = "lighting_dark" current_underlay.color = null affected_turf.underlays += current_underlay else diff --git a/code/modules/mining/lavaland/ruins/gym.dm b/code/modules/mining/lavaland/ruins/gym.dm index 54d4a61cabf5..0ecbf2db6693 100644 --- a/code/modules/mining/lavaland/ruins/gym.dm +++ b/code/modules/mining/lavaland/ruins/gym.dm @@ -24,6 +24,7 @@ desc = "Just looking at this thing makes you feel tired." density = TRUE anchored = TRUE + blocks_emissive = EMISSIVE_BLOCK_UNIQUE var/icon_state_inuse /obj/structure/weightmachine/proc/AnimateMachine(mob/living/user) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index b11914cd7329..5250deb93416 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -10,6 +10,7 @@ initial_language_holder = /datum/language_holder/alien bubble_icon = "alien" type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno + blocks_emissive = EMISSIVE_BLOCK_UNIQUE var/obj/item/card/id/wear_id = null // Fix for station bounced radios -- Skie var/has_fine_manipulation = 0 diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 3e46bd2d5f20..39c2d4f18ec9 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -4,6 +4,7 @@ possible_a_intents = list(INTENT_HELP, INTENT_HARM) hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD) has_limbs = 1 + blocks_emissive = EMISSIVE_BLOCK_NONE held_items = list(null, null) /// List of /obj/item/organ in the mob. /// They don't go in the contents for some reason I don't want to know. diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 91345e031a87..cf4f9fca9fcb 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -1,3 +1,7 @@ +// CAMERA NET +// +// The datum containing all the chunks. + GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) /datum/cameranet @@ -5,38 +9,54 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) var/name = "Camera Net" /// The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). - var/list/cameras = list() + var/list/obj/machinery/camera/cameras = list() /// The chunks of the map, mapping the areas that the cameras can see. var/list/chunks = list() var/ready = 0 - // The object used for the clickable stat() button. - var/obj/effect/statclick/statclick - ///The image given to the effect in vis_contents on AI clients - var/image/obscured + + /// List of images cloned by all chunk static images put onto turfs cameras cant see + /// Indexed by the plane offset to use + var/list/image/obscured_images /datum/cameranet/New() - obscured = new('icons/effects/cameravis.dmi') - obscured.plane = CAMERA_STATIC_PLANE - obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART - obscured.override = TRUE + obscured_images = list() + update_offsets(SSmapping.max_plane_offset) + RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_offset_growth)) + +/datum/cameranet/proc/update_offsets(new_offset) + for(var/i in length(obscured_images) to new_offset) + var/image/obscured = new('icons/effects/cameravis.dmi') + SET_PLANE_W_SCALAR(obscured, CAMERA_STATIC_PLANE, i) + obscured.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR | KEEP_APART + obscured.override = TRUE + obscured_images += obscured + +/datum/cameranet/proc/on_offset_growth(datum/source, old_offset, new_offset) + SIGNAL_HANDLER + update_offsets(new_offset) /// Checks if a chunk has been Generated in x, y, z. /datum/cameranet/proc/chunkGenerated(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) + if(GET_LOWEST_STACK_OFFSET(z) != 0) + var/turf/lowest = get_lowest_turf(locate(x, y, z)) + return chunks["[x],[y],[lowest.z]"] + return chunks["[x],[y],[z]"] // Returns the chunk in the x, y, z. // If there is no chunk, it creates a new chunk and returns that. /datum/cameranet/proc/getCameraChunk(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) - var/key = "[x],[y],[z]" + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) + var/turf/lowest = get_lowest_turf(locate(x, y, z)) + var/key = "[x],[y],[lowest.z]" . = chunks[key] if(!.) - chunks[key] = . = new /datum/camerachunk(x, y, z) + chunks[key] = . = new /datum/camerachunk(x, y, lowest.z) -/// Updates what the ai_eye can see. It is recommended you use this when the ai_eye moves or it's location is set. +/// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. /datum/cameranet/proc/visibility(list/moved_eyes, client/C, list/other_eyes, use_static = TRUE) if(!islist(moved_eyes)) moved_eyes = moved_eyes ? list(moved_eyes) : list() @@ -47,21 +67,18 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/mob/camera/aiEye/eye as anything in moved_eyes) var/list/visibleChunks = list() + //Get the eye's turf in case it's located in an object like a mecha + var/turf/eye_turf = get_turf(eye) if(eye.loc) - var/x_value = eye.x - var/y_value = eye.y - var/z_value = eye.z - // 0xf = 15 var/static_range = eye.static_visibility_range - var/x1 = max(0, x_value - static_range) & ~(CHUNK_SIZE - 1) - var/y1 = max(0, y_value - static_range) & ~(CHUNK_SIZE - 1) - var/x2 = min(world.maxx, x_value + static_range) & ~(CHUNK_SIZE - 1) - var/y2 = min(world.maxy, y_value + static_range) & ~(CHUNK_SIZE - 1) - + var/x1 = max(1, eye_turf.x - static_range) + var/y1 = max(1, eye_turf.y - static_range) + var/x2 = min(world.maxx, eye_turf.x + static_range) + var/y2 = min(world.maxy, eye_turf.y + static_range) for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) - visibleChunks |= getCameraChunk(x, y, z_value) + visibleChunks |= getCameraChunk(x, y, eye_turf.z) var/list/remove = eye.visibleCameraChunks - visibleChunks var/list/add = visibleChunks - eye.visibleCameraChunks @@ -72,7 +89,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/datum/camerachunk/chunk as anything in add) chunk.add(eye) -/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. +/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. /datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) if(!SSticker || (opacity_check && !A.opacity)) return @@ -93,10 +110,14 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) if(c.can_use()) majorChunkChange(c, 1) -/// Used for Cyborg cameras. Since portable cameras can be in ANY chunk. -/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/c) - if(c.can_use()) - majorChunkChange(c, 1) +/** + * Used for Cyborg/mecha cameras. Since portable cameras can be in ANY chunk. + * update_delay_buffer is passed all the way to hasChanged() from their camera updates on movement + * to change the time between static updates. +*/ +/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/updating_camera, update_delay_buffer) + if(updating_camera.can_use()) + majorChunkChange(updating_camera, 1, update_delay_buffer) /** * Never access this proc directly!!!! @@ -104,37 +125,52 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) * It will also add the atom to the cameras list if you set the choice to 1. * Setting the choice to 0 will remove the camera from the chunks. * If you want to update the chunks around an object, without adding/removing a camera, use choice 2. + * update_delay_buffer is passed all the way to hasChanged() from portable camera updates on movement + * to change the time between static updates. */ -/datum/cameranet/proc/majorChunkChange(atom/c, choice) - if(!c) - return +/datum/cameranet/proc/majorChunkChange(atom/c, choice, update_delay_buffer) + if(QDELETED(c) && choice == 1) + CRASH("Tried to add a qdeleting camera to the net") var/turf/T = get_turf(c) if(T) - var/x1 = max(0, T.x - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/y1 = max(0, T.y - (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) - var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) & ~(CHUNK_SIZE - 1) + var/x1 = max(1, T.x - (CHUNK_SIZE / 2)) + var/y1 = max(1, T.y - (CHUNK_SIZE / 2)) + var/x2 = min(world.maxx, T.x + (CHUNK_SIZE / 2)) + var/y2 = min(world.maxy, T.y + (CHUNK_SIZE / 2)) for(var/x = x1; x <= x2; x += CHUNK_SIZE) for(var/y = y1; y <= y2; y += CHUNK_SIZE) var/datum/camerachunk/chunk = chunkGenerated(x, y, T.z) if(chunk) if(choice == 0) // Remove the camera. - chunk.cameras -= c + chunk.cameras["[T.z]"] -= c else if(choice == 1) // You can't have the same camera in the list twice. - chunk.cameras |= c - chunk.hasChanged() + chunk.cameras["[T.z]"] |= c + chunk.hasChanged(update_delay_buffer = update_delay_buffer) + +/// A faster, turf only version of [/datum/cameranet/proc/majorChunkChange] +/// For use in sensitive code, be careful with it +/datum/cameranet/proc/bareMajorChunkChange(turf/changed) + var/x1 = max(1, changed.x - (CHUNK_SIZE / 2)) + var/y1 = max(1, changed.y - (CHUNK_SIZE / 2)) + var/x2 = min(world.maxx, changed.x + (CHUNK_SIZE / 2)) + var/y2 = min(world.maxy, changed.y + (CHUNK_SIZE / 2)) + for(var/x = x1; x <= x2; x += CHUNK_SIZE) + for(var/y = y1; y <= y2; y += CHUNK_SIZE) + var/datum/camerachunk/chunk = chunkGenerated(x, y, changed.z) + chunk?.hasChanged() /// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. /datum/cameranet/proc/checkCameraVis(mob/living/target) var/turf/position = get_turf(target) + if(!position) + return return checkTurfVis(position) - /datum/cameranet/proc/checkTurfVis(turf/position) - var/datum/camerachunk/chunk = chunkGenerated(position.x, position.y, position.z) + var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) if(chunk) if(chunk.changed) chunk.hasChanged(1) // Update now, no matter if it's visible or not. @@ -142,22 +178,25 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) return TRUE return FALSE -/datum/cameranet/proc/stat_entry() - if(!statclick) - statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - - stat(name, statclick.update("Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]")) +/datum/cameranet/proc/getTurfVis(turf/position) + RETURN_TYPE(/datum/camerachunk) + var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) + if(!chunk) + return FALSE + if(chunk.changed) + chunk.hasChanged(1) // Update now, no matter if it's visible or not. + if(chunk.visibleTurfs[position]) + return chunk /obj/effect/overlay/camera_static name = "static" icon = null icon_state = null anchored = TRUE // should only appear in vis_contents, but to be safe - appearance_flags = RESET_TRANSFORM | TILE_BOUND | RESET_COLOR + appearance_flags = RESET_TRANSFORM | TILE_BOUND | LONG_GLIDE // this combination makes the static block clicks to everything below it, // without appearing in the right-click menu for non-AI clients mouse_opacity = MOUSE_OPACITY_ICON invisibility = INVISIBILITY_ABSTRACT - layer = CAMERA_STATIC_LAYER plane = CAMERA_STATIC_PLANE diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index abf891b011ac..fca64a1e1681 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -11,20 +11,21 @@ ///turfs our cameras can see inside our grid var/list/visibleTurfs = list() ///cameras that can see into our grid + ///indexed by the z level of the camera var/list/cameras = list() - ///list of all turfs + ///list of all turfs, associative with that turf's static image + ///turf -> /image var/list/turfs = list() ///camera mobs that can see turfs in our grid var/list/seenby = list() - ///images created to represent obscured turfs - var/list/inactive_static_images = list() ///images currently in use on obscured turfs. var/list/active_static_images = list() var/changed = FALSE var/x = 0 var/y = 0 - var/z = 0 + var/lower_z + var/upper_z /// Add an AI eye to the chunk, then update if changed. /datum/camerachunk/proc/add(mob/camera/aiEye/eye) @@ -55,28 +56,33 @@ /** * Updates the chunk, makes sure that it doesn't update too much. If the chunk isn't being watched it will * instead be flagged to update the next time an AI Eye moves near it. + * update_delay_buffer is used for cameras that are moving around, which are cyborg inbuilt cameras and + * mecha onboard cameras. This buffer should be usually lower than UPDATE_BUFFER_TIME because + * otherwise a moving camera can run out of its own view before updating static. */ -/datum/camerachunk/proc/hasChanged(update_now = 0) +/datum/camerachunk/proc/hasChanged(update_now = 0, update_delay_buffer = UPDATE_BUFFER_TIME) if(seenby.len || update_now) - addtimer(CALLBACK(src, PROC_REF(update)), UPDATE_BUFFER_TIME, TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(update)), update_delay_buffer, TIMER_UNIQUE) else changed = TRUE /// The actual updating. It gathers the visible turfs from cameras and puts them into the appropiate lists. -/datum/camerachunk/proc/update() +/// Accepts an optional partial_update argument, that blocks any calls out to chunks that could affect us, like above or below +/datum/camerachunk/proc/update(partial_update = FALSE) var/list/updated_visible_turfs = list() - for(var/obj/machinery/camera/current_camera as anything in cameras) - if(!current_camera || !current_camera.can_use()) - continue + for(var/z_level in lower_z to upper_z) + for(var/obj/machinery/camera/current_camera as anything in cameras["[z_level]"]) + if(!current_camera || !current_camera.can_use()) + continue - var/turf/point = locate(src.x + (CHUNK_SIZE / 2), src.y + (CHUNK_SIZE / 2), src.z) - if(get_dist(point, current_camera) > CHUNK_SIZE + (CHUNK_SIZE / 2)) - continue + var/turf/point = locate(src.x + (CHUNK_SIZE / 2), src.y + (CHUNK_SIZE / 2), z_level) + if(get_dist(point, current_camera) > CHUNK_SIZE + (CHUNK_SIZE / 2)) + continue - for(var/turf/vis_turf in current_camera.can_see()) - if(turfs[vis_turf]) - updated_visible_turfs[vis_turf] = vis_turf + for(var/turf/vis_turf in current_camera.can_see()) + if(turfs[vis_turf]) + updated_visible_turfs[vis_turf] = vis_turf ///new turfs that we couldnt see last update but can now var/list/newly_visible_turfs = updated_visible_turfs - visibleTurfs @@ -91,31 +97,24 @@ client.images -= active_static_images for(var/turf/visible_turf as anything in newly_visible_turfs) - var/image/static_image_to_deallocate = obscuredTurfs[visible_turf] - if(!static_image_to_deallocate) + var/image/static_image = obscuredTurfs[visible_turf] + if(!static_image) continue - static_image_to_deallocate.loc = null - active_static_images -= static_image_to_deallocate - inactive_static_images += static_image_to_deallocate - + active_static_images -= static_image obscuredTurfs -= visible_turf for(var/turf/obscured_turf as anything in newly_obscured_turfs) if(obscuredTurfs[obscured_turf] || istype(obscured_turf, /turf/open/ai_visible)) continue - var/image/static_image_to_allocate = inactive_static_images[length(inactive_static_images)] - if(!static_image_to_allocate) - stack_trace("somehow a camera chunk ran out of static images!") + var/image/static_image = turfs[obscured_turf] + if(!static_image) + stack_trace("somehow a camera chunk used a turf it didn't contain!!") break - obscuredTurfs[obscured_turf] = static_image_to_allocate - static_image_to_allocate.loc = obscured_turf - - inactive_static_images -= static_image_to_allocate - active_static_images += static_image_to_allocate - + obscuredTurfs[obscured_turf] = static_image + active_static_images += static_image visibleTurfs = updated_visible_turfs changed = FALSE @@ -127,39 +126,52 @@ client.images += active_static_images + /// Create a new camera chunk, since the chunks are made as they are needed. -/datum/camerachunk/New(x, y, z) - x &= ~(CHUNK_SIZE - 1) - y &= ~(CHUNK_SIZE - 1) +/datum/camerachunk/New(x, y, lower_z) + x = GET_CHUNK_COORD(x) + y = GET_CHUNK_COORD(y) src.x = x src.y = y - src.z = z + src.lower_z = lower_z + var/turf/upper_turf = get_highest_turf(locate(x, y, lower_z)) + src.upper_z = upper_turf.z - for(var/obj/machinery/camera/camera in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z))) - if(camera.can_use()) - cameras += camera + for(var/z_level in lower_z to upper_z) + var/list/local_cameras = list() + for(var/obj/machinery/camera/camera in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z_level))) + if(camera.can_use()) + local_cameras += camera - for(var/turf/t as anything in block(locate(max(x, 1), max(y, 1), z), locate(min(x + CHUNK_SIZE - 1, world.maxx), min(y + CHUNK_SIZE - 1, world.maxy), z))) - turfs[t] = t + for(var/mob/living/silicon/sillycone in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z_level))) + if(sillycone.builtInCamera?.can_use()) + local_cameras += sillycone.builtInCamera - for(var/turf in turfs)//one for each 16x16 = 256 turfs this camera chunk encompasses - inactive_static_images += new/image(GLOB.cameranet.obscured) - for(var/obj/machinery/camera/camera as anything in cameras) - if(!camera || !camera.can_use()) - continue + cameras["[z_level]"] = local_cameras + + var/image/mirror_from = GLOB.cameranet.obscured_images[GET_Z_PLANE_OFFSET(z_level) + 1] + var/turf/chunk_corner = locate(x, y, z_level) + for(var/turf/lad as anything in CORNER_BLOCK(chunk_corner, CHUNK_SIZE, CHUNK_SIZE)) //we use CHUNK_SIZE for width and height here as it handles subtracting 1 from those two parameters by itself + var/image/our_image = new /image(mirror_from) + our_image.loc = lad + turfs[lad] = our_image + + for(var/obj/machinery/camera/camera as anything in local_cameras) + if(!camera) + continue + + if(!camera.can_use()) + continue - for(var/turf/vis_turf in camera.can_see()) - if(turfs[vis_turf]) - visibleTurfs[vis_turf] = vis_turf + for(var/turf/vis_turf in camera.can_see()) + if(turfs[vis_turf]) + visibleTurfs[vis_turf] = vis_turf for(var/turf/obscured_turf as anything in turfs - visibleTurfs) - var/image/new_static = inactive_static_images[inactive_static_images.len] - new_static.loc = obscured_turf + var/image/new_static = turfs[obscured_turf] active_static_images += new_static - inactive_static_images -= new_static obscuredTurfs[obscured_turf] = new_static #undef UPDATE_BUFFER_TIME -#undef CHUNK_SIZE diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 36cd6b981425..5245db86dbca 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -9,8 +9,8 @@ designation = "Default" ///used for displaying the prefix & getting the current module of cyborg has_limbs = 1 hud_type = /datum/hud/robot - blocks_emissive = EMISSIVE_BLOCK_GENERIC - light_system = MOVABLE_LIGHT + blocks_emissive = EMISSIVE_BLOCK_UNIQUE + light_system = MOVABLE_LIGHT_DIRECTIONAL light_on = FALSE var/custom_name = "" diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 18a00b5e236f..e2cd3fd4170a 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -268,35 +268,23 @@ . += get_modular_computer_parts_examine(user) -/obj/item/modular_computer/update_icon(updates=ALL) +/obj/item/modular_computer/update_icon_state() + if(!icon_state_powered || !icon_state_unpowered) //no valid icon, don't update. + return ..() + icon_state = enabled ? icon_state_powered : icon_state_unpowered + return ..() + +/obj/item/modular_computer/update_overlays() . = ..() - if(!physical) + var/init_icon = initial(icon) + if(!init_icon) return - SSvis_overlays.remove_vis_overlay(physical, physical.managed_vis_overlays) - var/program_overlay = "" - var/is_broken = obj_integrity <= integrity_failure - if(overlay_skin) - program_overlay = "[overlay_skin]-" - if(!enabled) - if(use_power() && !isnull(icon_state_screensaver)) - program_overlay += icon_state_screensaver - else - icon_state = icon_state_unpowered - else - icon_state = icon_state_powered - if(is_broken) - program_overlay += "bsod" - else - if(active_program) - program_overlay += active_program.program_icon_state ? "[active_program.program_icon_state]" : "[icon_state_menu]" - else - program_overlay += icon_state_menu - - SSvis_overlays.add_vis_overlay(physical, physical.icon, program_overlay, physical.layer, physical.plane, physical.dir) - SSvis_overlays.add_vis_overlay(physical, physical.icon, program_overlay, physical.layer, EMISSIVE_PLANE, physical.dir) - if(is_broken) - SSvis_overlays.add_vis_overlay(physical, physical.icon, "broken", physical.layer, physical.plane, physical.dir) + if(enabled) + . += active_program ? mutable_appearance(init_icon, active_program.program_icon_state) : mutable_appearance(init_icon, icon_state_menu) + if(obj_integrity <= integrity_failure) + . += mutable_appearance(init_icon, "bsod") + . += mutable_appearance(init_icon, "broken") /obj/item/modular_computer/equipped() . = ..() @@ -345,7 +333,7 @@ else to_chat(user, span_notice("You press the power button and start up \the [src].")) enabled = TRUE - update_appearance(UPDATE_ICON) + update_appearance() play_computer_sound(startup_sound, get_clamped_volume(), FALSE) ui_interact(user) else // Unpowered @@ -487,7 +475,7 @@ var/mob/user = usr if(user && istype(user)) ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. - update_appearance(UPDATE_ICON) + update_appearance() // Returns 0 for No Signal, 1 for Low Signal and 2 for Good Signal. 3 is for wired connection (always-on) /obj/item/modular_computer/proc/get_ntnet_status(specific_action = 0) @@ -503,7 +491,7 @@ var/obj/item/computer_hardware/network_card/network_card = all_components[MC_NET] return SSnetworks.station_network.add_log(text, network_card) -/obj/item/modular_computer/proc/shutdown_computer(loud = 1) +/obj/item/modular_computer/proc/shutdown_computer(loud = TRUE) kill_program(forced = TRUE) for(var/datum/computer_file/program/P in idle_threads) P.kill_program(forced = TRUE) @@ -511,8 +499,8 @@ if(loud) physical.visible_message(span_notice("\The [src] shuts down.")) enabled = FALSE - update_appearance(UPDATE_ICON) play_computer_sound(shutdown_sound, get_clamped_volume(), FALSE) + update_appearance() /** * Toggles the computer's flashlight, if it has one. @@ -524,7 +512,7 @@ if(!has_light) return FALSE set_light_on(!light_on) - update_appearance(UPDATE_ICON) + update_appearance() return TRUE /** diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm index f0d10f749525..807c43d78b64 100644 --- a/code/modules/modular_computers/hardware/card_slot.dm +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -77,7 +77,7 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user H.sec_hud_set_ID() - + holder.update_appearance() return TRUE @@ -93,6 +93,7 @@ to_chat(user, "You remove the card from \the [src].") playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + holder.update_appearance() return TRUE /obj/item/computer_hardware/card_slot/attackby(obj/item/I, mob/living/user) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 215bfb7fab95..b7555ca63918 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -69,7 +69,7 @@ dir_amount = 4\ ) - var/lon_range = 1.5 + var/light_on_range = 1.5 var/area/area var/areastring = null var/obj/item/stock_parts/cell/cell @@ -230,7 +230,7 @@ /obj/machinery/power/apc/handle_atom_del(atom/A) if(A == cell) cell = null - update_appearance(UPDATE_ICON) + update_appearance() updateUsrDialog() /obj/machinery/power/apc/proc/make_terminal() @@ -265,7 +265,7 @@ make_terminal() addtimer(CALLBACK(src, PROC_REF(update)), 5) - update_appearance(UPDATE_ICON) + update_appearance() /obj/machinery/power/apc/examine(mob/user) . = ..() @@ -323,8 +323,11 @@ cell = best_cell W.play_rped_sound() -/obj/machinery/power/apc/update_icon(updates) - updates = check_updates() +/obj/machinery/power/apc/update_appearance(updates = check_updates()) + icon_update_needed = FALSE + if(!updates) + return + . = ..() // And now, separately for cleanness, the lighting changing if(update_state & UPSTATE_ALLGOOD) @@ -335,15 +338,13 @@ light_color = LIGHT_COLOR_BLUE if(APC_FULLY_CHARGED) light_color = LIGHT_COLOR_GREEN - set_light(lon_range) + set_light(light_on_range) else if(update_state & UPSTATE_BLUESCREEN) light_color = LIGHT_COLOR_BLUE - set_light(lon_range) + set_light(light_on_range) else set_light(0) - icon_update_needed = FALSE - // update the APC icon to show the three base states // also add overlays for indicator lights /obj/machinery/power/apc/update_icon_state() @@ -374,21 +375,20 @@ /obj/machinery/power/apc/update_overlays() . = ..() if(!(update_state & UPSTATE_ALLGOOD)) - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + return - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(!(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) + . += mutable_appearance(icon, "apcox-[locked]") + . += emissive_appearance(icon, "apcox-[locked]", src) + . += mutable_appearance(icon, "apco3-[charging]") + . += emissive_appearance(icon, "apco3-[charging]", src) 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) + . += mutable_appearance(icon, "apco0-[equipment]") + . += emissive_appearance(icon, "apco0-[equipment]", src) + . += mutable_appearance(icon, "apco1-[lighting]") + . += emissive_appearance(icon, "apco1-[lighting]", src) + . += mutable_appearance(icon, "apco2-[environ]") + . += emissive_appearance(icon, "apco2-[environ]", src) /obj/machinery/power/apc/proc/check_updates() var/last_update_state = update_state @@ -515,7 +515,7 @@ else if (opened!=APC_COVER_REMOVED) opened = APC_COVER_CLOSED coverlocked = TRUE //closing cover relocks it - update_appearance(UPDATE_ICON) + update_appearance() return else if (!(stat & BROKEN)) if(coverlocked && !(stat & MAINT)) // locked... @@ -526,7 +526,7 @@ return else opened = APC_COVER_OPENED - update_appearance(UPDATE_ICON) + update_appearance() return else W.play_tool_sound(src) @@ -535,7 +535,7 @@ W.play_tool_sound(src) to_chat(user, span_notice("You pry the broken cover off of [src].")) opened = APC_COVER_REMOVED - update_appearance(UPDATE_ICON) + update_appearance() return /obj/machinery/power/apc/screwdriver_act(mob/living/user, obj/item/W) @@ -547,10 +547,10 @@ user.visible_message("[user] removes \the [cell] from [src]!",span_notice("You remove \the [cell].")) var/turf/T = get_turf(user) cell.forceMove(T) - cell.update_appearance(UPDATE_ICON) + cell.update_appearance() cell = null charging = APC_NOT_CHARGING - update_appearance(UPDATE_ICON) + update_appearance() return else switch (has_electronics) @@ -567,14 +567,14 @@ else to_chat(user, span_warning("There is nothing to secure!")) return - update_appearance(UPDATE_ICON) + update_appearance() else if(obj_flags & EMAGGED) to_chat(user, span_warning("The interface is broken!")) return else panel_open = !panel_open to_chat(user, span_notice("The wires have been [panel_open ? "exposed" : "unexposed"].")) - update_appearance(UPDATE_ICON) + update_appearance() /obj/machinery/power/apc/wirecutter_act(mob/living/user, obj/item/W) if (terminal && opened) @@ -623,7 +623,7 @@ "[user.name] has inserted the power cell to [src.name]!",\ span_notice("You insert the power cell.")) chargecount = 0 - update_appearance(UPDATE_ICON) + update_appearance() else if (W.GetID()) togglelock(user) else if (istype(W, /obj/item/stack/cable_coil) && opened) @@ -701,7 +701,7 @@ chargecount = 0 user.visible_message(span_notice("[user] fabricates a weak power cell and places it into [src]."), \ span_warning("Your [P.name] whirrs with strain as you create a weak power cell and place it into [src]!")) - update_appearance(UPDATE_ICON) + update_appearance() else to_chat(user, span_warning("[src] has both electronics and a cell.")) return @@ -716,7 +716,7 @@ to_chat(user, span_notice("You replace missing APC's cover.")) qdel(W) opened = APC_COVER_OPENED - update_appearance(UPDATE_ICON) + update_appearance() return if (has_electronics) to_chat(user, span_warning("You cannot repair this APC until you remove the electronics still inside!")) @@ -730,7 +730,7 @@ obj_integrity = max_integrity if (opened==APC_COVER_REMOVED) opened = APC_COVER_OPENED - update_appearance(UPDATE_ICON) + update_appearance() else if(istype(W, /obj/item/clockwork/integration_cog) && is_servant_of_ratvar(user)) if(integration_cog) to_chat(user, span_warning("This APC already has a cog.")) @@ -739,7 +739,7 @@ user.visible_message(span_warning("[user] slices [src]'s cover lock, and it swings wide open!"), \ span_alloy("You slice [src]'s cover lock apart with [W], and the cover swings open.")) opened = APC_COVER_OPENED - update_appearance(UPDATE_ICON) + update_appearance() else user.visible_message(span_warning("[user] presses [W] into [src]!"), \ span_alloy("You hold [W] in place within [src], and it slowly begins to warm up...")) @@ -756,7 +756,7 @@ playsound(src, 'sound/machines/clockcult/steam_whoosh.ogg', 50, FALSE) opened = APC_COVER_CLOSED locked = FALSE - update_appearance(UPDATE_ICON) + update_appearance() return else if(istype(W, /obj/item/apc_powercord)) return //because we put our fancy code in the right places, and this is all in the powercord's afterattack() @@ -812,7 +812,7 @@ chargecount = 0 user.visible_message(span_notice("[user] fabricates a weak power cell and places it into [src]."), \ span_warning("Your [the_rcd.name] whirrs with strain as you create a weak power cell and place it into [src]!")) - update_appearance(UPDATE_ICON) + update_appearance() return TRUE else to_chat(user, span_warning("[src] has both electronics and a cell.")) @@ -832,7 +832,7 @@ if((allowed(usr) && !wires.is_cut(WIRE_IDSCAN) && !malfhack) || integration_cog) locked = !locked to_chat(user, span_notice("You [ locked ? "lock" : "unlock"] the APC interface.")) - update_appearance(UPDATE_ICON) + update_appearance() updateUsrDialog() else to_chat(user, span_warning("Access denied.")) @@ -843,10 +843,10 @@ return last_light_switch = world.time area.lightswitch = !area.lightswitch - area.update_appearance(UPDATE_ICON) + area.update_appearance() for(var/obj/machinery/light_switch/L in area) - L.update_appearance(UPDATE_ICON) + L.update_appearance() area.power_change() @@ -876,7 +876,7 @@ opened = APC_COVER_REMOVED coverlocked = FALSE visible_message(span_warning("The APC cover is knocked down!")) - update_appearance(UPDATE_ICON) + update_appearance() /obj/machinery/power/apc/emag_act(mob/user, obj/item/card/emag/emag_card) if((obj_flags & EMAGGED) || malfhack) @@ -895,7 +895,7 @@ obj_flags |= EMAGGED locked = FALSE to_chat(user, span_notice("You emag the APC interface.")) - update_appearance(UPDATE_ICON) + update_appearance() return TRUE // attack with hand - remove cell (if cover open) or interact with the APC @@ -912,10 +912,10 @@ if(cell) user.visible_message("[user] removes \the [cell] from [src]!",span_notice("You remove \the [cell].")) user.put_in_hands(cell) - cell.update_appearance(UPDATE_ICON) + cell.update_appearance() src.cell = null charging = APC_NOT_CHARGING - src.update_appearance(UPDATE_ICON) + src.update_appearance() return if((stat & MAINT) && !opened) //no board; no interface return @@ -1064,7 +1064,7 @@ to_chat(usr, "The APC does not respond to the command.") else locked = !locked - update_appearance(UPDATE_ICON) + update_appearance() . = TRUE if("cover") coverlocked = !coverlocked @@ -1076,20 +1076,20 @@ chargemode = !chargemode if(!chargemode) charging = APC_NOT_CHARGING - update_appearance(UPDATE_ICON) + update_appearance() . = TRUE if("channel") if(params["eqp"]) equipment = setsubsystem(text2num(params["eqp"])) - update_appearance(UPDATE_ICON) + update_appearance() update() else if(params["lgt"]) lighting = setsubsystem(text2num(params["lgt"])) - update_appearance(UPDATE_ICON) + update_appearance() update() else if(params["env"]) environ = setsubsystem(text2num(params["env"])) - update_appearance(UPDATE_ICON) + update_appearance() update() . = TRUE if("overload") @@ -1107,7 +1107,7 @@ malfvacate() if("reboot") failure_timer = 0 - update_appearance(UPDATE_ICON) + update_appearance() update() if("emergency_lighting") emergency_lights = !emergency_lights @@ -1132,7 +1132,7 @@ add_hiddenprint(user) log_combat(user, src, "turned [operating ? "on" : "off"]") update() - update_appearance(UPDATE_ICON) + update_appearance() /obj/machinery/power/apc/proc/malfhack(mob/living/silicon/ai/malf) if(!istype(malf)) @@ -1273,7 +1273,7 @@ /obj/machinery/power/apc/process() if(icon_update_needed) - update_appearance(UPDATE_ICON) + update_appearance() if(stat & (BROKEN|MAINT)) return if(!area.requires_power) @@ -1448,7 +1448,7 @@ if(APC_RESET_EMP) equipment = 3 environ = 3 - update_appearance(UPDATE_ICON) + update_appearance() update() // damage and destruction acts @@ -1464,7 +1464,7 @@ lighting = 0 equipment = 0 environ = 0 - update_appearance(UPDATE_ICON) + update_appearance() update() addtimer(CALLBACK(src, PROC_REF(reset), APC_RESET_EMP), (6 * severity) SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 49c3ec5f7170..82412f16069c 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -214,6 +214,7 @@ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' w_class = WEIGHT_CLASS_BULKY // Pretty big! anchored = FALSE + blocks_emissive = EMISSIVE_BLOCK_UNIQUE var/tracker = 0 var/glass_type = null var/multiplier = 1 diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index ec2bc2e82197..5aaa474a3c5f 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -10,6 +10,7 @@ icon_state = "tracker" density = TRUE use_power = NO_POWER_USE + blocks_emissive = EMISSIVE_BLOCK_UNIQUE max_integrity = 250 integrity_failure = 0.2 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index f8c23aa21917..47a101e41893 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -13,6 +13,7 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT movement_type = FLYING wound_bonus = CANT_WOUND // can't wound by default + blocks_emissive = EMISSIVE_BLOCK_GENERIC var/hitsound = 'sound/weapons/pierce.ogg' var/hitsound_wall = "" diff --git a/code/modules/unit_tests/focus_only_tests.dm b/code/modules/unit_tests/focus_only_tests.dm index 426a236ab4bd..ba6d827b7f0a 100644 --- a/code/modules/unit_tests/focus_only_tests.dm +++ b/code/modules/unit_tests/focus_only_tests.dm @@ -6,6 +6,12 @@ /// and you will only test the check for invalid overlays in appearance building. /datum/unit_test/focus_only +/// Checks that every created emissive has a valid icon_state +/datum/unit_test/focus_only/invalid_emissives + +/// Checks that every overlay passed into build_appearance_list exists in the icon +/datum/unit_test/focus_only/invalid_overlays + /// Checks that every created emissive has a valid icon_state /datum/unit_test/focus_only/multiple_space_initialization diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index 0fe04abfd05a..836fcd5035c2 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -7,6 +7,7 @@ armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 60, ACID = 60) density = TRUE anchored = FALSE + blocks_emissive = EMISSIVE_BLOCK_GENERIC var/list/mob/occupants //mob = bitflags of their control level. var/max_occupants = 1 var/max_drivers = 1 diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index e93b30dd9af8..96927a06ac2e 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -92,7 +92,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C var/forcecrit = 0 var/num_shards = 7 var/list/pinned_mobs = list() - light_power = 0.5 + light_power = 0.7 light_range = MINIMUM_USEFUL_LIGHT_RANGE @@ -271,28 +271,28 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C else ..() -/obj/machinery/vending/update_icon_state() +/obj/machinery/vending/update_appearance(updates=ALL) . = ..() if(stat & BROKEN) - icon_state = "[initial(icon_state)]-broken" set_light(0) return + set_light(powered() ? MINIMUM_USEFUL_LIGHT_RANGE : 0) - if(powered()) - icon_state = initial(icon_state) - set_light(1.4) - else - icon_state = "[initial(icon_state)]-off" - set_light(0) +/obj/machinery/vending/update_icon_state() + if(stat & BROKEN) + icon_state = "[initial(icon_state)]-broken" + return ..() + icon_state = "[initial(icon_state)][powered() ? null : "-off"]" + return ..() /obj/machinery/vending/update_overlays() . = ..() if(!light_mask) return - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + //SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(!(stat & BROKEN) && powered()) - SSvis_overlays.add_vis_overlay(src, icon, light_mask, EMISSIVE_LAYER, EMISSIVE_PLANE) + . += emissive_appearance(icon, light_mask, src) /obj/machinery/vending/obj_break(damage_flag) diff --git a/icons/effects/alphacolors.dmi b/icons/effects/alphacolors.dmi index c3dbcaee39be41c346cc2b5f39183d2aa24b9cf2..f3241ba010d9a0fb2ebbc6dba88be3f3102a2399 100644 GIT binary patch literal 654 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRStE)mHN?cNllZ!G7N;32F7#J$% zOr3a;>yQCY+xfG>Q{HNAI$QZgNqSRrb-UMNsTrY{Ufj4HE!)AK>ZNyI{@YSqj>EU7?Jp6ifZo1dnjI`3MC}vv4`%D0_2G!K3L9FT{V` zys{_u&DkFZTm@g}u1a?K?``(kB0G7@|NI0`nNL=;eZ|e}Vt5u$k9_~YV_%GNd&u?N zuQi8cJ2`UOB`?WmFfcIA^K@|xshIQj%0^!nM*-J^k}hl<%##%+6kMoc=`EejocKWT zq26>?>GfKT_m2g?f1SsBt9q~RyZe86-v9UQv-jyU_Gc($>JWCA!|;ejK)u0&@d&4a z9~nYBj_#xl9-QC#zrPat>TLRS1u%gzc)I$ztaD0e F0swdo^1c87 literal 641 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRS%c?>mN?cNllZ!G7N;32F7#J$% zOzm^zI%FW?a{cFWiCei7qh1?HXHL|6Bdhe&tWoNzy4K#k-Ay|JR_&Io_&h^qciH`~ z8GN#LBNy#w$+)t5(v`!vpDft8(!=swvv+alNtHIYX%jcaDVbbb;+J&J=DB!*O#UCq zRi2S@XIXl8t>{`+5zTu@rmnEtr+dbRzyBM*p4^yo+O=9p_|a94_Ak9>FMi{lGx$FPded^E8e^7qIPQGcV&e(oFs{f&MUHkWV_2b{8-z6L7|91#Ej delta 53 zcmV-50LuUC4&@GzBmsJnC0!*FONtWniVG5pQu9g(D^5u)%EqNiS;5uM1?)%w=;1J3 LpX#hyv8}!aJlz*` From 8248523bf938c7c38194671040192cb54af53cb5 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 6 Dec 2023 23:32:41 -0500 Subject: [PATCH 134/281] oops we need this apparently --- code/__DEFINES/traits.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 6f9b8e46ec68..9d5262de697d 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -515,3 +515,5 @@ #define TURF_Z_TRANSPARENT_TRAIT "turf_z_transparent" /// This mob overrides certian SSlag_switch measures with this special trait #define TRAIT_BYPASS_MEASURES "bypass_lagswitch_measures" +/// This movable atom has the explosive block element +#define TRAIT_BLOCKING_EXPLOSIVES "blocking_explosives" From 4676f1e0d10c8560471b7b6bc854834ddd6b6d5e Mon Sep 17 00:00:00 2001 From: JohnFulpWillard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Thu, 7 Dec 2023 08:59:50 -0500 Subject: [PATCH 135/281] fuck it we ball --- code/__DEFINES/dcs/flags.dm | 31 +- code/__DEFINES/dcs/helpers.dm | 7 +- .../signals/signals_atom/signals_atom_main.dm | 2 + code/__DEFINES/dcs/signals/signals_datum.dm | 6 +- code/__DEFINES/dcs/signals/signals_turf.dm | 5 + code/__DEFINES/flags.dm | 5 + code/__DEFINES/traits.dm | 42 +- code/__DEFINES/vv.dm | 2 + code/__HELPERS/cmp.dm | 7 + code/__HELPERS/duplicating.dm | 10 +- code/_compile_options.dm | 2 + code/_globalvars/traits.dm | 42 +- code/controllers/subsystem/dcs.dm | 101 ++++- code/controllers/subsystem/timer.dm | 8 +- code/datums/components/README.md | 128 +----- code/datums/components/_component.dm | 422 ++++++++---------- code/datums/components/crafting/crafting.dm | 2 - code/datums/components/decal.dm | 76 ---- code/datums/components/decals/blood.dm | 39 -- code/datums/components/forensics.dm | 4 +- code/datums/components/rotation.dm | 4 +- code/datums/datum.dm | 70 +-- code/datums/datumvars.dm | 15 +- code/datums/elements/_element.dm | 10 +- code/datums/elements/connect_loc.dm | 2 +- code/datums/elements/decals/_decal.dm | 179 ++++++++ code/datums/elements/decals/blood.dm | 47 ++ code/datums/mind.dm | 2 +- code/datums/signals.dm | 131 ++++++ code/datums/status_effects/buffs/buffs.dm | 3 +- .../objects/effects/decals/cleanable/misc.dm | 2 +- code/game/objects/effects/decals/decal.dm | 2 +- code/game/objects/items/airlock_painter.dm | 4 +- code/game/objects/structures/window.dm | 3 +- code/game/turfs/change_turf.dm | 24 +- code/game/turfs/simulated/wall/reinf_walls.dm | 1 + code/modules/admin/verbs/randomverbs.dm | 46 ++ .../admin/view_variables/topic_basic.dm | 73 ++- .../antagonists/bloodsuckers/vassal/vassal.dm | 2 +- code/modules/antagonists/creep/creep.dm | 2 +- code/modules/antagonists/demon/demons.dm | 2 +- .../antagonists/traitor/datum_traitor.dm | 2 +- code/modules/cargo/supplypod.dm | 12 +- code/modules/mob/living/brain/brain_item.dm | 9 +- code/modules/pool/components/swimming.dm | 4 +- code/modules/pool/pool.dm | 20 +- code/modules/shuttle/on_move.dm | 1 + code/modules/surgery/organs/stomach.dm | 34 +- code/modules/unit_tests/_unit_tests.dm | 11 +- .../unit_tests/dcs_check_list_arguments.dm | 55 +++ .../unit_tests/trait_addition_and_removal.dm | 94 ++++ code/modules/uplink/uplink_devices.dm | 2 +- .../obj/smooth_structures/shuttle_window.dmi | Bin 3738 -> 6254 bytes yogstation.dme | 5 +- yogstation/code/datums/components/crawl.dm | 2 +- .../code/datums/components/storage/storage.dm | 8 +- yogstation/code/datums/components/walks.dm | 2 +- .../game/objects/items/storage/backpack.dm | 7 +- 58 files changed, 1176 insertions(+), 657 deletions(-) delete mode 100644 code/datums/components/decal.dm delete mode 100644 code/datums/components/decals/blood.dm create mode 100644 code/datums/elements/decals/_decal.dm create mode 100644 code/datums/elements/decals/blood.dm create mode 100644 code/datums/signals.dm create mode 100644 code/modules/unit_tests/dcs_check_list_arguments.dm create mode 100644 code/modules/unit_tests/trait_addition_and_removal.dm diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm index 916eb247b68b..dbeb0b933a1e 100644 --- a/code/__DEFINES/dcs/flags.dm +++ b/code/__DEFINES/dcs/flags.dm @@ -1,4 +1,4 @@ -/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. +/// Return this from `/datum/component/Initialize` or `/datum/component/OnTransfer` or `/datum/component/on_source_add` to have the component be deleted if it's applied to an incorrect type. /// `parent` must not be modified if this is to be returned. /// This will be noted in the runtime logs #define COMPONENT_INCOMPATIBLE 1 @@ -22,19 +22,36 @@ /// Causes all detach arguments to be passed to detach instead of only being used to identify the element /// When this is used your Detach proc should have the same signature as your Attach proc #define ELEMENT_COMPLEX_DETACH (1 << 2) +/** + * Elements with this flag will have their datum lists arguments compared as is, + * without the contents being sorted alpha-numerically first. + * This is good for those elements where the position of the keys matter, like in the case of color matrices. + */ +#define ELEMENT_DONT_SORT_LIST_ARGS (1<<3) +/** + * Elements with this flag will be ignored by the dcs_check_list_arguments test. + * A good example is connect_loc, for which it's pratically undoable unless we force every signal proc to have a different name. + */ +#define ELEMENT_NO_LIST_UNIT_TEST (1<<4) // How multiple components of the exact same type are handled in the same datum /// old component is deleted (default) -#define COMPONENT_DUPE_HIGHLANDER 0 +#define COMPONENT_DUPE_HIGHLANDER 0 /// duplicates allowed -#define COMPONENT_DUPE_ALLOWED 1 +#define COMPONENT_DUPE_ALLOWED 1 /// new component is deleted -#define COMPONENT_DUPE_UNIQUE 2 +#define COMPONENT_DUPE_UNIQUE 2 +/** + * Component uses source tracking to manage adding and removal logic. + * Add a source/spawn to/the component by using AddComponentFrom(source, component_type, args...) + * Removing the last source will automatically remove the component from the parent. + * Arguments will be passed to on_source_add(source, args...); ensure that Initialize and on_source_add have the same signature. + */ +#define COMPONENT_DUPE_SOURCES 3 /// old component is given the initialization args of the new -#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 +#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 /// each component of the same type is consulted as to whether the duplicate should be allowed -#define COMPONENT_DUPE_SELECTIVE 5 - +#define COMPONENT_DUPE_SELECTIVE 5 //Arch #define ARCH_PROB "probability" //Probability for each item diff --git a/code/__DEFINES/dcs/helpers.dm b/code/__DEFINES/dcs/helpers.dm index 12eea34e1560..df6acffd761a 100644 --- a/code/__DEFINES/dcs/helpers.dm +++ b/code/__DEFINES/dcs/helpers.dm @@ -2,7 +2,7 @@ /// The datum hosting the signal is automaticaly added as the first argument /// Returns a bitfield gathered from all registered procs /// Arguments given here are packaged in a list and given to _SendSignal -#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) +#define SEND_SIGNAL(target, sigtype, arguments...) ( !target._listen_lookup?[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) #define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) ) @@ -12,12 +12,15 @@ /// A wrapper for _AddElement that allows us to pretend we're using normal named arguments #define AddElement(arguments...) _AddElement(list(##arguments)) - /// A wrapper for _RemoveElement that allows us to pretend we're using normal named arguments #define RemoveElement(arguments...) _RemoveElement(list(##arguments)) /// A wrapper for _AddComponent that allows us to pretend we're using normal named arguments #define AddComponent(arguments...) _AddComponent(list(##arguments)) +/// A wrapper for _AddComonent that passes in a source. +/// Necessary if dupe_mode is set to COMPONENT_DUPE_SOURCES. +#define AddComponentFrom(source, arguments...) _AddComponent(list(##arguments), source) + /// A wrapper for _LoadComponent that allows us to pretend we're using normal named arguments #define LoadComponent(arguments...) _LoadComponent(list(##arguments)) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm index 43db37a73bd4..4fc26240b084 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -43,6 +43,8 @@ #define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon" ///from base of [/atom/proc/smooth_icon]: () #define COMSIG_ATOM_SMOOTHED_ICON "atom_smoothed_icon" +///from [/datum/controller/subsystem/processing/dcs/proc/rotate_decals]: (list/datum/element/decal/rotating) +#define COMSIG_ATOM_DECALS_ROTATING "atom_decals_rotating" ///from base of atom/Entered(): (atom/movable/arrived, atom/old_loc, list/atom/old_locs) #define COMSIG_ATOM_ENTERED "atom_entered" ///from base of atom/movable/Moved(): (atom/movable/arrived, atom/old_loc, list/atom/old_locs) diff --git a/code/__DEFINES/dcs/signals/signals_datum.dm b/code/__DEFINES/dcs/signals/signals_datum.dm index 9b3067bc8a45..b75bc99b7a4f 100644 --- a/code/__DEFINES/dcs/signals/signals_datum.dm +++ b/code/__DEFINES/dcs/signals/signals_datum.dm @@ -7,7 +7,11 @@ #define COMSIG_COMPONENT_REMOVING "component_removing" //! before a component is removed from a datum because of RemoveComponent: (/datum/component) #define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" //! before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation #define COMSIG_PARENT_QDELETING "parent_qdeleting" //! just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called -#define COMSIG_TOPIC "handle_topic" //! generic topic handler (usr, href_list) +/// generic topic handler (usr, href_list) +#define COMSIG_TOPIC "handle_topic" +/// handler for vv_do_topic (usr, href_list) +#define COMSIG_VV_TOPIC "vv_topic" + #define COMPONENT_VV_HANDLED (1<<0) /// fires on the target datum when an element is attached to it (/datum/element) #define COMSIG_ELEMENT_ATTACH "element_attach" diff --git a/code/__DEFINES/dcs/signals/signals_turf.dm b/code/__DEFINES/dcs/signals/signals_turf.dm index 08b1a59d7bc0..9e56fb8a102d 100644 --- a/code/__DEFINES/dcs/signals/signals_turf.dm +++ b/code/__DEFINES/dcs/signals/signals_turf.dm @@ -6,10 +6,15 @@ #define COMSIG_TURF_CHANGE "turf_change" //! from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps) #define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" //! from base of atom/has_gravity(): (atom/asker, list/forced_gravities) #define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" //! from base of turf/New(): (turf/source, direction) +///from base of turf/proc/onShuttleMove(): (turf/new_turf) +#define COMSIG_TURF_ON_SHUTTLE_MOVE "turf_on_shuttle_move" #define COMSIG_TURF_AFTER_SHUTTLE_MOVE "turf_after_shuttle_move" //! from base of turf/proc/afterShuttleMove: (turf/new_turf) ///from base of /datum/turf_reservation/proc/Release: (datum/turf_reservation/reservation) #define COMSIG_TURF_RESERVATION_RELEASED "turf_reservation_released" +///from /datum/element/decal/Detach(): (description, cleanable, directional, mutable_appearance/pic) +#define COMSIG_TURF_DECAL_DETACHED "turf_decal_detached" + ///from /datum/element/footstep/prepare_step(): (list/steps) #define COMSIG_TURF_PREPARE_STEP_SOUND "turf_prepare_step_sound" ///from base of datum/thrownthing/finalize(): (turf/turf, atom/movable/thrownthing) when something is thrown and lands on us diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 3820e833457b..92c198dd18c5 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -69,6 +69,11 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define NO_RUINS_1 (1<<18) /// Blocks this turf from being rusted #define NO_RUST (1<<19) +/// If this atom has experienced a decal element "init finished" sourced appearance update +/// We use this to ensure stacked decals don't double up appearance updates for no rasin +/// Flag as an optimization, don't make this a trait without profiling +/// Yes I know this is a stupid flag, no you can't take him from me +#define DECAL_INIT_UPDATE_EXPERIENCED_1 (1<<20) //AREA FLAGS /// If blobs can spawn there and if it counts towards their score. diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 0fb442556932..9e1c49fc6a9c 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -5,13 +5,13 @@ #define ADD_TRAIT(target, trait, source) \ do { \ var/list/_L; \ - if (!target.status_traits) { \ - target.status_traits = list(); \ - _L = target.status_traits; \ + if (!target._status_traits) { \ + target._status_traits = list(); \ + _L = target._status_traits; \ _L[trait] = list(source); \ SEND_SIGNAL(target, SIGNAL_ADDTRAIT(trait), trait); \ } else { \ - _L = target.status_traits; \ + _L = target._status_traits; \ if (_L[trait]) { \ _L[trait] |= list(source); \ } else { \ @@ -22,14 +22,14 @@ } while (0) #define REMOVE_TRAIT(target, trait, sources) \ do { \ - var/list/_L = target.status_traits; \ + var/list/_L = target._status_traits; \ var/list/_S; \ if (sources && !islist(sources)) { \ _S = list(sources); \ } else { \ _S = sources\ }; \ - if (_L && _L[trait]) { \ + if (_L?[trait]) { \ for (var/_T in _L[trait]) { \ if ((!_S && (_T != ROUNDSTART_TRAIT)) || (_T in _S)) { \ _L[trait] -= _T \ @@ -40,20 +40,20 @@ SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \ }; \ if (!length(_L)) { \ - target.status_traits = null \ + target._status_traits = null \ }; \ } \ } while (0) #define REMOVE_TRAIT_NOT_FROM(target, trait, sources) \ do { \ - var/list/_traits_list = target.status_traits; \ + var/list/_traits_list = target._status_traits; \ var/list/_sources_list; \ if (sources && !islist(sources)) { \ _sources_list = list(sources); \ } else { \ _sources_list = sources\ }; \ - if (_traits_list && _traits_list[trait]) { \ + if (_traits_list?[trait]) { \ for (var/_trait_source in _traits_list[trait]) { \ if (!(_trait_source in _sources_list)) { \ _traits_list[trait] -= _trait_source \ @@ -64,13 +64,13 @@ SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \ }; \ if (!length(_traits_list)) { \ - target.status_traits = null \ + target._status_traits = null \ }; \ } \ } while (0) #define REMOVE_TRAITS_NOT_IN(target, sources) \ do { \ - var/list/_L = target.status_traits; \ + var/list/_L = target._status_traits; \ var/list/_S = sources; \ if (_L) { \ for (var/_T in _L) { \ @@ -81,14 +81,14 @@ }; \ };\ if (!length(_L)) { \ - target.status_traits = null\ + target._status_traits = null\ };\ }\ } while (0) #define REMOVE_TRAITS_IN(target, sources) \ do { \ - var/list/_L = target.status_traits; \ + var/list/_L = target._status_traits; \ var/list/_S = sources; \ if (sources && !islist(sources)) { \ _S = list(sources); \ @@ -104,12 +104,22 @@ }; \ };\ if (!length(_L)) { \ - target.status_traits = null\ + target._status_traits = null\ };\ }\ } while (0) -#define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE) -#define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE) + +#define HAS_TRAIT(target, trait) (target._status_traits?[trait] ? TRUE : FALSE) +#define HAS_TRAIT_FROM(target, trait, source) (HAS_TRAIT(target, trait) && (source in target._status_traits[trait])) +#define HAS_TRAIT_FROM_ONLY(target, trait, source) (HAS_TRAIT(target, trait) && (source in target._status_traits[trait]) && (length(target._status_traits[trait]) == 1)) +#define HAS_TRAIT_NOT_FROM(target, trait, source) (HAS_TRAIT(target, trait) && (length(target._status_traits[trait] - source) > 0)) +/// Returns a list of trait sources for this trait. Only useful for wacko cases and internal futzing +/// You should not be using this +#define GET_TRAIT_SOURCES(target, trait) (target._status_traits?[trait] || list()) +/// Returns the amount of sources for a trait. useful if you don't want to have a "thing counter" stuck around all the time +#define COUNT_TRAIT_SOURCES(target, trait) length(GET_TRAIT_SOURCES(target, trait)) +/// A simple helper for checking traits in a mob's mind +#define HAS_MIND_TRAIT(target, trait) (HAS_TRAIT(target, trait) || (target.mind ? HAS_TRAIT(target.mind, trait) : FALSE)) //Remember to update code/datums/traits/ folder if you're adding/removing/renaming traits. diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 7be173cddf12..5d008e22a7d3 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -65,6 +65,8 @@ #define VV_HK_CALLPROC "proc_call" #define VV_HK_MARK "mark" #define VV_HK_ADDCOMPONENT "addcomponent" +#define VV_HK_REMOVECOMPONENT "removecomponent" +#define VV_HK_MASS_REMOVECOMPONENT "massremovecomponent" #define VV_HK_MODIFY_TRAITS "modtraits" #define VV_HK_VIEW_REFERENCES "viewreferences" #define VV_HK_WEAKREF_RESOLVE "weakref_resolve" diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 73118506fcf1..dac2c41b9b30 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -10,6 +10,13 @@ /proc/cmp_text_dsc(a,b) return sorttext(a,b) +/proc/cmp_embed_text_asc(a,b) + if(isdatum(a)) + a = REF(a) + if(isdatum(b)) + b = REF(b) + return sorttext("[b]", "[a]") + /proc/cmp_name_asc(atom/a, atom/b) return sorttext(b.name, a.name) diff --git a/code/__HELPERS/duplicating.dm b/code/__HELPERS/duplicating.dm index 45d065127fe8..a21399e68273 100644 --- a/code/__HELPERS/duplicating.dm +++ b/code/__HELPERS/duplicating.dm @@ -1,19 +1,21 @@ ///List of all vars that will not be copied over when using duplicate_object() GLOBAL_LIST_INIT(duplicate_forbidden_vars, list( + "_active_timers", + "_datum_components", + "_listen_lookup", + "_status_traits", + "_signal_procs", "actions", "active_hud_list", - "active_timers", "AIStatus", "appearance", "area", "atmos_adjacent_turfs", "bodyparts", "ckey", - "comp_lookup", "computer_id", "contents", "cooldowns", - "datum_components", "external_organs", "external_organs_slot", "group", @@ -38,8 +40,6 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars, list( "power_supply", "quirks", "reagents", - "signal_procs", - "status_traits", "stat", "tag", "tgui_shared_states", diff --git a/code/_compile_options.dm b/code/_compile_options.dm index ff9cabf129ae..b296be969328 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -31,6 +31,8 @@ #endif // 1 to use the default behaviour; // 2 for preloading absolutely everything; +#define LOWMEMORYMODE + #ifdef LOWMEMORYMODE #define FORCE_MAP "_maps/runtimestation.json" #endif diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index ebc3d1b0de4c..70449111c7d2 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -3,21 +3,43 @@ Try to keep this in sync with __DEFINES/traits.dm quirks have it's own panel so we don't need them here. */ -GLOBAL_LIST_INIT(traits_by_type, list( - /mob = list(/atom/movable = list( - "TRAIT_MOVE_PHASING" = TRAIT_MOVE_PHASING, +GLOBAL_LIST_INIT(admin_visible_traits, list( + /atom/movable = list( + "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, + ), + /atom/movable = list( "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, - )))) -/// value -> trait name, generated on use from trait_by_type global -GLOBAL_LIST(trait_name_map) + ), + /mob = list( + "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING, + "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, + "TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE, + "TRAIT_DEAF" = TRAIT_DEAF, + "TRAIT_HOLY" = TRAIT_HOLY, + "TRAIT_NO_SOUL" = TRAIT_NO_SOUL, + ), + /obj/item = list( + "TRAIT_NODROP" = TRAIT_NODROP, + "TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE, + ), + /obj/item/organ/liver = list( + "TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST, + ), +)) -/proc/generate_trait_name_map() +/// value -> trait name, generated as needed for adminning. +GLOBAL_LIST(admin_trait_name_map) + +/proc/generate_admin_trait_name_map() . = list() - for(var/key in GLOB.traits_by_type) - for(var/tname in GLOB.traits_by_type[key]) - var/val = GLOB.traits_by_type[key][tname] + for(var/key in GLOB.admin_visible_traits) + for(var/tname in GLOB.admin_visible_traits[key]) + var/val = GLOB.admin_visible_traits[key][tname] .[val] = tname + return . + + GLOBAL_LIST_INIT(movement_type_trait_to_flag, list( TRAIT_MOVE_GROUND = GROUND, TRAIT_MOVE_FLYING = FLYING, diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index f9abd6db3dc6..e130b6dc0ff8 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -5,10 +5,34 @@ PROCESSING_SUBSYSTEM_DEF(dcs) var/list/elements_by_type = list() + /** + * A nested assoc list of bespoke element types (keys) and superlists containing all lists used as arguments (values). + * Inside the superlists, lists that've been sorted alphabetically are keys, while the original unsorted lists are values. + * + * e.g. list( + * /datum/element/first = list(list(A, B, C) = list(B, A, C), list(A, B) = list(A, B)), + * /datum/element/second = list(list(B, C) = list(C, B), list(D) = list(D)), + * ) + * + * Used by the dcs_check_list_arguments unit test. + */ + var/list/arguments_that_are_lists_by_element = list() + /** + * An assoc list of list instances and their sorted counterparts. + * + * e.g. list( + * list(B, A, C) = list(A, B, C), + * list(C, B) = list(B, C), + * ) + * + * Used to make sure each list instance is sorted no more than once, or the unit test won't work. + */ + var/list/sorted_arguments_that_are_lists = list() + /datum/controller/subsystem/processing/dcs/Recover() - comp_lookup = SSdcs.comp_lookup + _listen_lookup = SSdcs._listen_lookup -/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments) +/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments, init_element = TRUE) var/datum/element/eletype = arguments[1] var/element_id = eletype @@ -16,39 +40,70 @@ PROCESSING_SUBSYSTEM_DEF(dcs) CRASH("Attempted to instantiate [eletype] as a /datum/element") if(initial(eletype.element_flags) & ELEMENT_BESPOKE) - element_id = GetIdFromArguments(arguments) + element_id = length(arguments) == 1 ? "[arguments[1]]" : GetIdFromArguments(arguments) . = elements_by_type[element_id] - if(.) + if(. || !init_element) return . = elements_by_type[element_id] = new eletype /**** - * Generates an id for bespoke elements when given the argument list - * Generating the id here is a bit complex because we need to support named arguments - * Named arguments can appear in any order and we need them to appear after ordered arguments - * We assume that no one will pass in a named argument with a value of null - **/ + * Generates an id for bespoke elements when given the argument list + * Generating the id here is a bit complex because we need to support named arguments + * Named arguments can appear in any order and we need them to appear after ordered arguments + * We assume that no one will pass in a named argument with a value of null + **/ /datum/controller/subsystem/processing/dcs/proc/GetIdFromArguments(list/arguments) var/datum/element/eletype = arguments[1] - var/list/fullid = list("[eletype]") - var/list/named_arguments = list() + var/list/fullid = list(eletype) + var/list/named_arguments for(var/i in initial(eletype.argument_hash_start_idx) to length(arguments)) var/key = arguments[i] - var/value + if(istext(key)) - value = arguments[key] - if(!(istext(key) || isnum(key))) - key = ref(key) - key = "[key]" // Key is stringified so numbers dont break things - if(!isnull(value)) - if(!(istext(value) || isnum(value))) - value = ref(value) - named_arguments["[key]"] = value + var/value = arguments[key] + if (isnull(value)) + fullid += key + else + if (!istext(value) && !isnum(value)) + if(PERFORM_ALL_TESTS(dcs_check_list_arguments) && islist(value)) + add_to_arguments_that_are_lists(value, eletype) + value = REF(value) + + if (!named_arguments) + named_arguments = list() + + named_arguments[key] = value + continue + + if (isnum(key)) + fullid += key else - fullid += "[key]" + if(PERFORM_ALL_TESTS(dcs_check_list_arguments) && islist(key)) + add_to_arguments_that_are_lists(key, eletype) + fullid += REF(key) - if(length(named_arguments)) - named_arguments = sortList(named_arguments) + if(named_arguments) + named_arguments = sortTim(named_arguments, GLOBAL_PROC_REF(cmp_text_asc)) fullid += named_arguments + return list2params(fullid) + +/** + * Offloading the first half of the dcs_check_list_arguments here, which is populating the superlist + * with sublists that will be later compared with each other by the dcs_check_list_arguments unit test. + */ +/datum/controller/subsystem/processing/dcs/proc/add_to_arguments_that_are_lists(list/argument, datum/element/element_type) + if(initial(element_type.element_flags) & ELEMENT_NO_LIST_UNIT_TEST) + return + var/list/element_type_superlist = arguments_that_are_lists_by_element[element_type] + if(!element_type_superlist) + arguments_that_are_lists_by_element[element_type] = element_type_superlist = list() + + var/list/sorted_argument = argument + if(!(initial(element_type.element_flags) & ELEMENT_DONT_SORT_LIST_ARGS)) + sorted_argument = sorted_arguments_that_are_lists[argument] + if(!sorted_argument) + sorted_arguments_that_are_lists[argument] = sorted_argument = sortTim(argument.Copy(), GLOBAL_PROC_REF(cmp_embed_text_asc)) + + element_type_superlist[sorted_argument] = argument diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 54df5a5e312e..a056a6c07512 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -429,7 +429,7 @@ SUBSYSTEM_DEF(timer) CRASH("Invalid timer state: Timer created that would require a backtrack to run (addtimer would never let this happen): [SStimer.get_timer_debug_string(src)]") if (callBack.object != GLOBAL_PROC && !QDESTROYING(callBack.object)) - LAZYADD(callBack.object.active_timers, src) + LAZYADD(callBack.object._active_timers, src) bucketJoin() @@ -438,9 +438,9 @@ SUBSYSTEM_DEF(timer) if (flags & TIMER_UNIQUE && hash) timer_subsystem.hashes -= hash - if (callBack && callBack.object && callBack.object != GLOBAL_PROC && callBack.object.active_timers) - callBack.object.active_timers -= src - UNSETEMPTY(callBack.object.active_timers) + if (callBack && callBack.object && callBack.object != GLOBAL_PROC && callBack.object._active_timers) + callBack.object._active_timers -= src + UNSETEMPTY(callBack.object._active_timers) callBack = null diff --git a/code/datums/components/README.md b/code/datums/components/README.md index 9db03c5dfc5d..db8bf10a327f 100644 --- a/code/datums/components/README.md +++ b/code/datums/components/README.md @@ -4,130 +4,6 @@ Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening. -### In the code +### [HackMD page for an introduction to the system as a whole.](https://hackmd.io/@tgstation/SignalsComponentsElements) -#### Slippery things - -At the time of this writing, every object that is slippery overrides atom/Crossed does some checks, then slips the mob. Instead of all those Crossed overrides they could add a slippery component to all these objects. And have the checks in one proc that is run by the Crossed event - -#### Powercells - -A lot of objects have powercells. The `get_cell()` proc was added to give generic access to the cell var if it had one. This is just a specific use case of `GetComponent()` - -#### Radios - -The radio object as it is should not exist, given that more things use the _concept_ of radios rather than the object itself. The actual function of the radio can exist in a component which all the things that use it (Request consoles, actual radios, the SM shard) can add to themselves. - -#### Standos - -Stands have a lot of procs which mimic mob procs. Rather than inserting hooks for all these procs in overrides, the same can be accomplished with signals - -## API - -### Defines - -1. `COMPONENT_INCOMPATIBLE` Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. `parent` must not be modified if this is to be returned. This will be noted in the runtime logs - -### Vars - -1. `/datum/var/list/datum_components` (private) - * Lazy associated list of type -> component/list of components. -1. `/datum/var/list/comp_lookup` (private) - * Lazy associated list of signal -> registree/list of registrees -1. `/datum/var/list/signal_procs` (private) - * Associated lazy list of signals -> `/datum/callback`s that will be run when the parent datum receives that signal -1. `/datum/var/signal_enabled` (protected, boolean) - * If the datum is signal enabled. If not, it will not react to signals - * `FALSE` by default, set to `TRUE` when a signal is registered -1. `/datum/component/var/dupe_mode` (protected, enum) - * How duplicate component types are handled when added to the datum. - * `COMPONENT_DUPE_HIGHLANDER` (default): Old component will be deleted, new component will first have `/datum/component/proc/InheritComponent(datum/component/old, FALSE)` on it - * `COMPONENT_DUPE_ALLOWED`: The components will be treated as separate, `GetComponent()` will return the first added - * `COMPONENT_DUPE_UNIQUE`: New component will be deleted, old component will first have `/datum/component/proc/InheritComponent(datum/component/new, TRUE)` on it - * `COMPONENT_DUPE_UNIQUE_PASSARGS`: New component will never exist and instead its initialization arguments will be passed on to the old component. -1. `/datum/component/var/dupe_type` (protected, type) - * Definition of a duplicate component type - * `null` means exact match on `type` (default) - * Any other type means that and all subtypes -1. `/datum/component/var/datum/parent` (protected, read-only) - * The datum this component belongs to - * Never `null` in child procs -1. `report_signal_origin` (protected, boolean) - * If `TRUE`, will invoke the callback when signalled with the signal type as the first argument. - * `FALSE` by default. - -### Procs - -1. `/datum/proc/GetComponent(component_type(type)) -> datum/component?` (public, final) - * Returns a reference to a component of component_type if it exists in the datum, null otherwise -1. `/datum/proc/GetComponents(component_type(type)) -> list` (public, final) - * Returns a list of references to all components of component_type that exist in the datum -1. `/datum/proc/GetExactComponent(component_type(type)) -> datum/component?` (public, final) - * Returns a reference to a component whose type MATCHES component_type if that component exists in the datum, null otherwise -1. `SEND_SIGNAL(target, sigtype, ...)` (public, final) - * Use to send signals to target datum - * Extra arguments are to be specified in the signal definition - * Returns a bitflag with signal specific information assembled from all activated components - * Arguments are packaged in a list and handed off to _SendSignal() -1. `/datum/proc/AddComponent(component_type(type), ...) -> datum/component` (public, final) - * Creates an instance of `component_type` in the datum and passes `...` to its `Initialize(mapload)` call - * Sends the `COMSIG_COMPONENT_ADDED` signal to the datum - * All components a datum owns are deleted with the datum - * Returns the component that was created. Or the old component in a dupe situation where `COMPONENT_DUPE_UNIQUE` was set - * If this tries to add an component to an incompatible type, the component will be deleted and the result will be `null`. This is very unperformant, try not to do it - * Properly handles duplicate situations based on the `dupe_mode` var -1. `/datum/proc/LoadComponent(component_type(type), ...) -> datum/component` (public, final) - * Equivalent to calling `GetComponent(component_type)` where, if the result would be `null`, returns `AddComponent(component_type, ...)` instead -1. `/datum/proc/ComponentActivated(datum/component/C)` (abstract, async) - * Called on a component's `parent` after a signal received causes it to activate. `src` is the parameter - * Will only be called if a component's callback returns `TRUE` -1. `/datum/proc/TakeComponent(datum/component/C)` (public, final) - * Properly transfers ownership of a component from one datum to another - * Signals `COMSIG_COMPONENT_REMOVING` on the parent - * Called on the datum you want to own the component with another datum's component -1. `/datum/proc/_SendSignal(signal, list/arguments)` (private, final) - * Handles most of the actual signaling procedure - * Will runtime if used on datums with an empty component list -1. `/datum/proc/RegisterSignal(datum/target, signal(string/list of strings), proc_ref(type), override(boolean))` (protected, final) - * If signal is a list it will be as if RegisterSignal was called for each of the entries with the same following arguments - * Makes the datum listen for the specified `signal` on it's `parent` datum. - * When that signal is received `proc_ref` will be called on the component, along with associated arguments - * Example proc ref: `PROC_REF(OnEvent)` - * If a previous registration is overwritten by the call, a runtime occurs. Setting `override` to TRUE prevents this - * These callbacks run asyncronously - * Returning `TRUE` from these callbacks will trigger a `TRUE` return from the `SendSignal()` that initiated it -1. `/datum/component/New(datum/parent, ...)` (private, final) - * Runs internal setup for the component - * Extra arguments are passed to `Initialize(mapload)` -1. `/datum/component/Initialize(...)` (abstract, no-sleep) - * Called by `New()` with the same argments excluding `parent` - * Component does not exist in `parent`'s `datum_components` list yet, although `parent` is set and may be used - * Signals will not be received while this function is running - * Component may be deleted after this function completes without being attached - * Do not call `qdel(src)` from this function -1. `/datum/component/Destroy(force(bool), silent(bool))` (virtual, no-sleep) - * Sends the `COMSIG_COMPONENT_REMOVING` signal to the parent datum if the `parent` isn't being qdeleted - * Properly removes the component from `parent` and cleans up references - * Setting `force` makes it not check for and remove the component from the parent - * Setting `silent` deletes the component without sending a `COMSIG_COMPONENT_REMOVING` signal -1. `/datum/component/proc/InheritComponent(datum/component/C, i_am_original(boolean))` (abstract, no-sleep) - * Called on a component when a component of the same type was added to the same parent - * See `/datum/component/var/dupe_mode` - * `C`'s type will always be the same of the called component -1. `/datum/component/proc/AfterComponentActivated()` (abstract, async) - * Called on a component that was activated after it's `parent`'s `ComponentActivated()` is called -1. `/datum/component/proc/OnTransfer(datum/new_parent)` (abstract, no-sleep) - * Called before `new_parent` is assigned to `parent` in `TakeComponent()` - * Allows the component to react to ownership transfers -1. `/datum/component/proc/_RemoveFromParent()` (private, final) - * Clears `parent` and removes the component from it's component list -1. `/datum/component/proc/_JoinParent` (private, final) - * Tries to add the component to it's `parent`s `datum_components` list -1. `/datum/component/proc/RegisterWithParent` (abstract, no-sleep) - * Used to register the signals that should be on the `parent` object - * Use this if you plan on the component transfering between parents -1. `/datum/component/proc/UnregisterFromParent` (abstract, no-sleep) - * Counterpart to `RegisterWithParent()` - * Used to unregister the signals that should only be on the `parent` object - -### See/Define signals and their arguments in __DEFINES\components.dm +### See/Define signals and their arguments in [__DEFINES\components.dm](../../__DEFINES/components.dm) diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 3d201a78c066..e461aa2ee36d 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -10,18 +10,41 @@ * Useful when you want shared behaviour independent of type inheritance */ /datum/component + /** + * Defines how duplicate existing components are handled when added to a datum + * + * See [COMPONENT_DUPE_*][COMPONENT_DUPE_ALLOWED] definitions for available options + */ var/dupe_mode = COMPONENT_DUPE_HIGHLANDER + + /** + * The type to check for duplication + * + * `null` means exact match on `type` (default) + * + * Any other type means that and all subtypes + */ var/dupe_type + + /// The datum this components belongs to var/datum/parent - //only set to true if you are able to properly transfer this component - //At a minimum RegisterWithParent and UnregisterFromParent should be used - //Make sure you also implement PostTransfer for any post transfer handling + + /** + * Only set to true if you are able to properly transfer this component + * + * At a minimum [RegisterWithParent][/datum/component/proc/RegisterWithParent] and [UnregisterFromParent][/datum/component/proc/UnregisterFromParent] should be used + * + * Make sure you also implement [PostTransfer][/datum/component/proc/PostTransfer] for any post transfer handling + */ var/can_transfer = FALSE + /// A lazy list of the sources for this component + var/list/sources + /** * Create a new component. * - * Additional arguments are passed to [Initialize(mapload)][/datum/component/proc/Initialize] + * Additional arguments are passed to [Initialize()][/datum/component/proc/Initialize] * * Arguments: * * datum/P the parent datum this component reacts to signals from @@ -30,8 +53,9 @@ parent = raw_args[1] var/list/arguments = raw_args.Copy(2) if(Initialize(arglist(arguments)) == COMPONENT_INCOMPATIBLE) + stack_trace("Incompatible [type] assigned to a [parent.type]! args: [json_encode(arguments)]") qdel(src, TRUE, TRUE) - CRASH("Incompatible [type] assigned to a [parent.type]! args: [json_encode(arguments)]") + return _JoinParent(parent) @@ -53,7 +77,7 @@ /datum/component/Destroy(force=FALSE, silent=FALSE) if(!parent) return ..() - if (!force) + if(!force) _RemoveFromParent() if(!silent) SEND_SIGNAL(parent, COMSIG_COMPONENT_REMOVING, src) @@ -66,22 +90,22 @@ /datum/component/proc/_JoinParent() var/datum/P = parent //lazy init the parent's dc list - var/list/dc = P.datum_components + var/list/dc = P._datum_components if(!dc) - P.datum_components = dc = list() + P._datum_components = dc = list() //set up the typecache var/our_type = type for(var/I in _GetInverseTypeList(our_type)) var/test = dc[I] - if(test) //already another component of this type here + if(test) //already another component of this type here var/list/components_of_type if(!length(test)) components_of_type = list(test) dc[I] = components_of_type else components_of_type = test - if(I == our_type) //exact match, take priority + if(I == our_type) //exact match, take priority var/inserted = FALSE for(var/J in 1 to components_of_type.len) var/datum/component/C = components_of_type[J] @@ -91,44 +115,48 @@ break if(!inserted) components_of_type += src - else //indirect match, back of the line with ya + else //indirect match, back of the line with ya components_of_type += src - else //only component of this type, no list + else //only component of this type, no list dc[I] = src RegisterWithParent() -/** - * Register the component with the parent object - * - * Use this proc to register with your parent object - * - * Overridable proc that's called when added to a new parent - */ -/datum/component/proc/RegisterWithParent() - return - /** * Internal proc to handle behaviour when being removed from a parent */ /datum/component/proc/_RemoveFromParent() - var/datum/P = parent - var/list/dc = P.datum_components + var/datum/parent = src.parent + var/list/parents_components = parent._datum_components for(var/I in _GetInverseTypeList()) - var/list/components_of_type = dc[I] - if(length(components_of_type)) // + var/list/components_of_type = parents_components[I] + + if(length(components_of_type)) // var/list/subtracted = components_of_type - src - if(subtracted.len == 1) //only 1 guy left - dc[I] = subtracted[1] //make him special + + if(subtracted.len == 1) //only 1 guy left + parents_components[I] = subtracted[1] //make him special else - dc[I] = subtracted - else //just us - dc -= I - if(!dc.len) - P.datum_components = null + parents_components[I] = subtracted + + else //just us + parents_components -= I + + if(!parents_components.len) + parent._datum_components = null UnregisterFromParent() +/** + * Register the component with the parent object + * + * Use this proc to register with your parent object + * + * Overridable proc that's called when added to a new parent + */ +/datum/component/proc/RegisterWithParent() + return + /** * Unregister from our parent object * @@ -141,101 +169,26 @@ return /** - * Register to listen for a signal from the passed in target - * - * This sets up a listening relationship such that when the target object emits a signal - * the source datum this proc is called upon, will receive a callback to the given proctype - * Use PROC_REF(procname), TYPE_PROC_REF(type,procname) or GLOBAL_PROC_REF(procname) macros to validate the passed in proc at compile time. - * PROC_REF for procs defined on current type or it's ancestors, TYPE_PROC_REF for procs defined on unrelated type and GLOBAL_PROC_REF for global procs. - * Return values from procs registered must be a bitfield - * - * Arguments: - * * datum/target The target to listen for signals from - * * signal_type A signal name - * * proctype The proc to call back when the signal is emitted - * * override If a previous registration exists you must explicitly set this + * Called when the component has a new source registered. + * Return COMPONENT_INCOMPATIBLE to signal that the source is incompatible and should not be added */ -/datum/proc/RegisterSignal(datum/target, signal_type, proctype, override = FALSE) - if(QDELETED(src) || QDELETED(target)) - return - - if (islist(signal_type)) - var/static/list/known_failures = list() - var/list/signal_type_list = signal_type - var/message = "([target.type]) is registering [signal_type_list.Join(", ")] as a list, the older method. Change it to RegisterSignals." - - if (!(message in known_failures)) - known_failures[message] = TRUE - stack_trace("[target] [message]") - - RegisterSignals(target, signal_type, proctype, override) - return - - var/list/procs = (signal_procs ||= list()) - var/list/target_procs = (procs[target] ||= list()) - var/list/lookup = (target.comp_lookup ||= list()) - - if(!override && target_procs[signal_type]) - log_signal("[signal_type] overridden. Use override = TRUE to suppress this warning.\nTarget: [target] ([target.type]) Proc: [proctype]") - - target_procs[signal_type] = proctype - var/list/looked_up = lookup[signal_type] - - if(isnull(looked_up)) // Nothing has registered here yet - lookup[signal_type] = src - else if(looked_up == src) // We already registered here - return - else if(!length(looked_up)) // One other thing registered here - lookup[signal_type] = list((looked_up) = TRUE, (src) = TRUE) - else // Many other things have registered here - looked_up[src] = TRUE - -/// Registers multiple signals to the same proc. -/datum/proc/RegisterSignals(datum/target, list/signal_types, proctype, override = FALSE) - for (var/signal_type in signal_types) - RegisterSignal(target, signal_type, proctype) +/datum/component/proc/on_source_add(source, ...) + SHOULD_CALL_PARENT(TRUE) + if(dupe_mode != COMPONENT_DUPE_SOURCES) + return COMPONENT_INCOMPATIBLE + LAZYOR(sources, source) /** - * Stop listening to a given signal from target - * - * Breaks the relationship between target and source datum, removing the callback when the signal fires - * - * Doesn't care if a registration exists or not - * - * Arguments: - * * datum/target Datum to stop listening to signals from - * * sig_typeor_types Signal string key or list of signal keys to stop listening to specifically + * Called when the component has a source removed. + * You probably want to call parent after you do your logic because at the end of this we qdel if we have no sources remaining! */ -/datum/proc/UnregisterSignal(datum/target, sig_type_or_types) - if(!target) - return - var/list/lookup = target.comp_lookup - if(!signal_procs || !signal_procs[target] || !lookup) - return - if(!islist(sig_type_or_types)) - sig_type_or_types = list(sig_type_or_types) - for(var/sig in sig_type_or_types) - switch(length(lookup[sig])) - if(2) - lookup[sig] = (lookup[sig]-src)[1] - if(1) - stack_trace("[target] ([target.type]) somehow has single length list inside comp_lookup") - if(src in lookup[sig]) - lookup -= sig - if(!length(lookup)) - target.comp_lookup = null - break - if(0) - lookup -= sig - if(!length(lookup)) - target.comp_lookup = null - break - else - lookup[sig] -= src - - signal_procs[target] -= sig_type_or_types - if(!signal_procs[target].len) - signal_procs -= target +/datum/component/proc/on_source_remove(source) + SHOULD_CALL_PARENT(TRUE) + if(dupe_mode != COMPONENT_DUPE_SOURCES) + CRASH("Component '[type]' does not use sources but is trying to remove a source") + LAZYREMOVE(sources, source) + if(!LAZYLEN(sources)) + qdel(src) /** * Called on a component when a component of the same type was added to the same parent @@ -247,6 +200,7 @@ /datum/component/proc/InheritComponent(datum/component/C, i_am_original) return + /** * Called on a component when a component of the same type was added to the same parent with [COMPONENT_DUPE_SELECTIVE] * @@ -259,6 +213,7 @@ /datum/component/proc/CheckDupeComponent(datum/component/C, ...) return + /** * Callback Just before this component is transferred * @@ -282,34 +237,12 @@ */ /datum/component/proc/_GetInverseTypeList(our_type = type) //we can do this one simple trick + . = list(our_type) var/current_type = parent_type - . = list(our_type, current_type) //and since most components are root level + 1, this won't even have to run while (current_type != /datum/component) - current_type = type2parent(current_type) . += current_type - -/** - * Internal proc to handle most all of the signaling procedure - * - * Will runtime if used on datums with an empty component list - * - * Use the [SEND_SIGNAL] define instead - */ -/datum/proc/_SendSignal(sigtype, list/arguments) - var/target = comp_lookup[sigtype] - if(!length(target)) - var/datum/listening_datum = target - return NONE | call(listening_datum, listening_datum.signal_procs[src][sigtype])(arglist(arguments)) - . = NONE - // This exists so that even if one of the signal receivers unregisters the signal, - // all the objects that are receiving the signal get the signal this final time. - // AKA: No you can't cancel the signal reception of another object by doing an unregister in the same signal. - var/list/queued_calls = list() - for(var/datum/listening_datum as anything in target) - queued_calls[listening_datum] = listening_datum.signal_procs[src][sigtype] - for(var/datum/listening_datum as anything in queued_calls) - . |= call(listening_datum, queued_calls[listening_datum])(arglist(arguments)) + current_type = type2parent(current_type) // The type arg is casted so initial works, you shouldn't be passing a real instance into this /** @@ -324,7 +257,7 @@ RETURN_TYPE(c_type) if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED || initial(c_type.dupe_mode) == COMPONENT_DUPE_SELECTIVE) stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]") - var/list/dc = datum_components + var/list/dc = _datum_components if(!dc) return null . = dc[c_type] @@ -341,10 +274,10 @@ * * datum/component/c_type The typepath of the component you want to get a reference to */ /datum/proc/GetExactComponent(datum/component/c_type) - RETURN_TYPE(c_type) + RETURN_TYPE(c_type) if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED || initial(c_type.dupe_mode) == COMPONENT_DUPE_SELECTIVE) stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]") - var/list/dc = datum_components + var/list/dc = _datum_components if(!dc) return null var/datum/component/C = dc[c_type] @@ -362,12 +295,10 @@ * * c_type The component type path */ /datum/proc/GetComponents(c_type) - var/list/dc = datum_components - if(!dc) - return null - . = dc[c_type] - if(!length(.)) - return list(.) + var/list/components = _datum_components?[c_type] + if(!components) + return list() + return islist(components) ? components : list(components) /** * Creates an instance of `new_type` in the datum and attaches to it as parent @@ -380,70 +311,112 @@ * * Properly handles duplicate situations based on the `dupe_mode` var */ -/datum/proc/_AddComponent(list/raw_args) - var/new_type = raw_args[1] - var/datum/component/nt = new_type - var/dm = initial(nt.dupe_mode) - var/dt = initial(nt.dupe_type) - - var/datum/component/old_comp - var/datum/component/new_comp - - if(ispath(nt)) - if(nt == /datum/component) - CRASH("[nt] attempted instantiation!") - else - new_comp = nt - nt = new_comp.type +/datum/proc/_AddComponent(list/raw_args, source) + var/original_type = raw_args[1] + var/datum/component/component_type = original_type - raw_args[1] = src + if(QDELING(src)) + CRASH("Attempted to add a new component of type \[[component_type]\] to a qdeleting parent of type \[[type]\]!") + + var/datum/component/new_component + + if(!ispath(component_type, /datum/component)) + if(!istype(component_type, /datum/component)) + CRASH("Attempted to instantiate \[[component_type]\] as a component added to parent of type \[[type]\]!") + else + new_component = component_type + component_type = new_component.type + else if(component_type == /datum/component) + CRASH("[component_type] attempted instantiation!") + + var/dupe_mode = initial(component_type.dupe_mode) + var/dupe_type = initial(component_type.dupe_type) + var/uses_sources = (dupe_mode == COMPONENT_DUPE_SOURCES) + if(uses_sources && !source) + CRASH("Attempted to add a sourced component of type '[component_type]' to '[type]' without a source!") + else if(!uses_sources && source) + CRASH("Attempted to add a normal component of type '[component_type]' to '[type]' with a source!") - if(dm != COMPONENT_DUPE_ALLOWED) - if(!dt) - old_comp = GetExactComponent(nt) + var/datum/component/old_component + + raw_args[1] = src + if(dupe_mode != COMPONENT_DUPE_ALLOWED && dupe_mode != COMPONENT_DUPE_SELECTIVE && dupe_mode != COMPONENT_DUPE_SOURCES) + if(!dupe_type) + old_component = GetExactComponent(component_type) else - old_comp = GetComponent(dt) - if(old_comp) - switch(dm) + old_component = GetComponent(dupe_type) + + if(old_component) + switch(dupe_mode) if(COMPONENT_DUPE_UNIQUE) - if(!new_comp) - new_comp = new nt(raw_args) - if(!QDELETED(new_comp)) - old_comp.InheritComponent(new_comp, TRUE) - QDEL_NULL(new_comp) + if(!new_component) + new_component = new component_type(raw_args) + if(!QDELETED(new_component)) + old_component.InheritComponent(new_component, TRUE) + QDEL_NULL(new_component) + if(COMPONENT_DUPE_HIGHLANDER) - if(!new_comp) - new_comp = new nt(raw_args) - if(!QDELETED(new_comp)) - new_comp.InheritComponent(old_comp, FALSE) - QDEL_NULL(old_comp) + if(!new_component) + new_component = new component_type(raw_args) + if(!QDELETED(new_component)) + new_component.InheritComponent(old_component, FALSE) + QDEL_NULL(old_component) + if(COMPONENT_DUPE_UNIQUE_PASSARGS) - if(!new_comp) + if(!new_component) var/list/arguments = raw_args.Copy(2) arguments.Insert(1, null, TRUE) - old_comp.InheritComponent(arglist(arguments)) + old_component.InheritComponent(arglist(arguments)) else - old_comp.InheritComponent(new_comp, TRUE) - if(COMPONENT_DUPE_SELECTIVE) - var/list/arguments = raw_args.Copy() - arguments[1] = new_comp - var/make_new_component = TRUE - for(var/datum/component/existing_component as anything in GetComponents(new_type)) - if(existing_component.CheckDupeComponent(arglist(arguments))) - make_new_component = FALSE - QDEL_NULL(new_comp) - break - if(!new_comp && make_new_component) - new_comp = new nt(raw_args) - else if(!new_comp) - new_comp = new nt(raw_args) // There's a valid dupe mode but there's no old component, act like normal - else if(!new_comp) - new_comp = new nt(raw_args) // Dupes are allowed, act like normal - - if(!old_comp && !QDELETED(new_comp)) // Nothing related to duplicate components happened and the new component is healthy - SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp) - return new_comp - return old_comp + old_component.InheritComponent(new_component, TRUE) + + if(COMPONENT_DUPE_SOURCES) + if(source in old_component.sources) + return old_component // source already registered, no work to do + + if(old_component.on_source_add(arglist(list(source) + raw_args.Copy(2))) == COMPONENT_INCOMPATIBLE) + stack_trace("incompatible source added to a [old_component.type]. Args: [json_encode(raw_args)]") + return null + + else if(!new_component) + new_component = new component_type(raw_args) // There's a valid dupe mode but there's no old component, act like normal + + else if(dupe_mode == COMPONENT_DUPE_SELECTIVE) + var/list/arguments = raw_args.Copy() + arguments[1] = new_component + var/make_new_component = TRUE + for(var/datum/component/existing_component as anything in GetComponents(original_type)) + if(existing_component.CheckDupeComponent(arglist(arguments))) + make_new_component = FALSE + QDEL_NULL(new_component) + break + if(!new_component && make_new_component) + new_component = new component_type(raw_args) + + else if(dupe_mode == COMPONENT_DUPE_SOURCES) + new_component = new component_type(raw_args) + if(new_component.on_source_add(arglist(list(source) + raw_args.Copy(2))) == COMPONENT_INCOMPATIBLE) + stack_trace("incompatible source added to a [new_component.type]. Args: [json_encode(raw_args)]") + return null + + else if(!new_component) + new_component = new component_type(raw_args) // Dupes are allowed, act like normal + + if(!old_component && !QDELETED(new_component)) // Nothing related to duplicate components happened and the new component is healthy + SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_component) + return new_component + + return old_component + +/** + * Removes a component source from this datum + */ +/datum/proc/RemoveComponentSource(source, datum/component/component_type) + if(ispath(component_type)) + component_type = GetExactComponent(component_type) + if(!component_type) + return + component_type.on_source_remove(source) /** * Get existing component of type, or create it and return a reference to it @@ -463,7 +436,7 @@ * Removes the component from parent, ends up with a null parent * Used as a helper proc by the component transfer proc, does not clean up the component like Destroy does */ -/datum/component/proc/RemoveComponent() +/datum/component/proc/ClearFromParent() if(!parent) return var/datum/old_parent = parent @@ -484,7 +457,7 @@ if(!target || target.parent == src) return if(target.parent) - target.RemoveComponent() + target.ClearFromParent() target.parent = src var/result = target.PostTransfer() switch(result) @@ -505,18 +478,19 @@ * * /datum/target the target to move the components to */ /datum/proc/TransferComponents(datum/target) - var/list/dc = datum_components + var/list/dc = _datum_components if(!dc) return - var/comps = dc[/datum/component] - if(islist(comps)) - for(var/datum/component/I in comps) - if(I.can_transfer) - target.TakeComponent(I) - else - var/datum/component/C = comps - if(C.can_transfer) - target.TakeComponent(comps) + for(var/component_key in dc) + var/component_or_list = dc[component_key] + if(islist(component_or_list)) + for(var/datum/component/I in component_or_list) + if(I.can_transfer) + target.TakeComponent(I) + else + var/datum/component/C = component_or_list + if(C.can_transfer) + target.TakeComponent(C) /** * Return the object that is the host of any UI's that this component has diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index d5cf7fb89133..0a9521646b6f 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -76,8 +76,6 @@ .["other"] = list() .["instances"] = list() for(var/obj/item/item in get_environment(a, blacklist)) - if(item.status_traits && HAS_TRAIT(item, TRAIT_NODROP) || item.flags_1 & HOLOGRAM_1) - continue LAZYADDASSOCLIST(.["instances"], item.type, item) if(isstack(item)) var/obj/item/stack/stack = item diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm deleted file mode 100644 index b601ff1475bb..000000000000 --- a/code/datums/components/decal.dm +++ /dev/null @@ -1,76 +0,0 @@ -/datum/component/decal - dupe_mode = COMPONENT_DUPE_ALLOWED - can_transfer = TRUE - var/cleanable - var/description - var/mutable_appearance/pic - - var/first_dir // This only stores the dir arg from init - -/datum/component/decal/Initialize(_icon, _icon_state, _dir, _cleanable=FALSE, _color, _layer=TURF_LAYER, _description, _alpha=255) - if(!isatom(parent) || !generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha)) - return COMPONENT_INCOMPATIBLE - first_dir = _dir - description = _description - cleanable = _cleanable - - apply() - -/datum/component/decal/RegisterWithParent() - if(first_dir) - RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, PROC_REF(rotate_react)) - if(cleanable != FALSE) - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_react)) - if(description) - RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine)) - -/datum/component/decal/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE)) - -/datum/component/decal/Destroy() - remove() - return ..() - -/datum/component/decal/PreTransfer() - remove() - -/datum/component/decal/PostTransfer() - remove() - apply() - -/datum/component/decal/proc/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha) - if(!_icon || !_icon_state) - return FALSE - // It has to be made from an image or dir breaks because of a byond bug - var/temp_image = image(_icon, null, _icon_state, _layer, _dir) - pic = new(temp_image) - pic.color = _color - pic.alpha = _alpha - return TRUE - -/datum/component/decal/proc/apply(atom/thing) - var/atom/master = thing || parent - master.add_overlay(pic, TRUE) - if(isitem(master)) - addtimer(CALLBACK(master, TYPE_PROC_REF(/obj/item, update_slot_icon)), 0, TIMER_UNIQUE) - -/datum/component/decal/proc/remove(atom/thing) - var/atom/master = thing || parent - master.cut_overlay(pic, TRUE) - if(isitem(master)) - addtimer(CALLBACK(master, TYPE_PROC_REF(/obj/item, update_slot_icon)), 0, TIMER_UNIQUE) - -/datum/component/decal/proc/rotate_react(datum/source, old_dir, new_dir) - if(old_dir == new_dir) - return - remove() - pic.dir = turn(pic.dir, dir2angle(old_dir) - dir2angle(new_dir)) - apply() - -/datum/component/decal/proc/clean_react(datum/source, clean_types) - if(clean_types & cleanable) - qdel(src) - return TRUE - -/datum/component/decal/proc/examine(datum/source, mob/user, list/examine_list) - examine_list += description diff --git a/code/datums/components/decals/blood.dm b/code/datums/components/decals/blood.dm deleted file mode 100644 index a0a97af3982c..000000000000 --- a/code/datums/components/decals/blood.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/component/decal/blood - dupe_mode = COMPONENT_DUPE_UNIQUE - -/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_TYPE_BLOOD, _color, _layer=ABOVE_OBJ_LAYER) - if(!isitem(parent)) - return COMPONENT_INCOMPATIBLE - . = ..() - RegisterSignal(parent, COMSIG_ATOM_GET_EXAMINE_NAME, PROC_REF(get_examine_name)) - -/datum/component/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _color) - var/obj/item/I = parent - if(!_icon) - _icon = 'icons/effects/blood.dmi' - if(!_icon_state) - _icon_state = "itemblood" - var/icon = initial(I.icon) - var/icon_state = initial(I.icon_state) - if(!icon || !icon_state) - // It's something which takes on the look of other items, probably - icon = I.icon - icon_state = I.icon_state - var/static/list/blood_splatter_appearances = list() - //try to find a pre-processed blood-splatter. otherwise, make a new one - var/index = "[REF(icon)]-[icon_state]" - pic = blood_splatter_appearances[index] - - if(!pic) - var/icon/blood_splatter_icon = icon(initial(I.icon), initial(I.icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object - blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) - blood_splatter_icon.Blend(icon(_icon, _icon_state), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant - pic = mutable_appearance(blood_splatter_icon, initial(I.icon_state)) - blood_splatter_appearances[index] = pic - return TRUE - -/datum/component/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override) - var/atom/A = parent - override[EXAMINE_POSITION_ARTICLE] = A.gender == PLURAL? "some" : "a" - override[EXAMINE_POSITION_BEFORE] = " blood-stained " - return COMPONENT_EXNAME_CHANGED diff --git a/code/datums/components/forensics.dm b/code/datums/components/forensics.dm index b9d618d4092d..ebc47dff7faa 100644 --- a/code/datums/components/forensics.dm +++ b/code/datums/components/forensics.dm @@ -49,7 +49,7 @@ /datum/component/forensics/proc/wipe_blood_DNA() blood_DNA = null if(isitem(parent)) - qdel(parent.GetComponent(/datum/component/decal/blood)) + RemoveElement(/datum/element/decal/blood) return TRUE /datum/component/forensics/proc/wipe_fibers() @@ -193,7 +193,7 @@ return if(!length(blood_DNA)) return - parent.LoadComponent(/datum/component/decal/blood) + parent.AddElement(/datum/element/decal/blood) //yog code for olfaction /datum/component/forensics/proc/wipe_scents() diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index e149013a48fa..da158f331644 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -94,9 +94,9 @@ //Signals + verbs removed via UnRegister . = ..() -/datum/component/simple_rotation/RemoveComponent() +/datum/component/simple_rotation/ClearFromParent() remove_verbs() - . = ..() + return ..() /datum/component/simple_rotation/proc/ExamineMessage(datum/source, mob/user, list/examine_list) if(rotation_flags & ROTATION_ALTCLICK) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index a2d370e2ee68..409ec48731bd 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -19,15 +19,26 @@ var/gc_destroyed /// Active timers with this datum as the target - var/list/active_timers - /// Components attached to this datum - var/list/datum_components - /// Status traits attached to this datum - var/list/status_traits - /// Any datum registered to receive signals from this datum is in this list - var/list/comp_lookup - /// List of callbacks for signal procs - var/list/list/datum/callback/signal_procs + var/list/_active_timers + /// Status traits attached to this datum. associative list of the form: list(trait name (string) = list(source1, source2, source3,...)) + var/list/_status_traits + + /** + * Components attached to this datum + * + * Lazy associated list in the structure of `type -> component/list of components` + */ + var/list/_datum_components + + /** + * Any datum registered to receive signals from this datum is in this list + * + * Lazy associated list in the structure of `signal -> registree/list of registrees` + */ + var/list/_listen_lookup + /// Lazy associated list in the structure of `target -> list(signal -> proctype)` that are run when the datum receives that signal + var/list/list/_signal_procs + /// Datum level flags var/datum_flags = NONE @@ -87,24 +98,25 @@ datum_flags &= ~DF_USE_TAG //In case something tries to REF us weak_reference = null //ensure prompt GCing of weakref. - var/list/timers = active_timers - active_timers = null - for(var/thing in timers) - var/datum/timedevent/timer = thing - if (timer.spent) - continue - qdel(timer) + if(_active_timers) + var/list/timers = _active_timers + _active_timers = null + for(var/datum/timedevent/timer as anything in timers) + if (timer.spent && !(timer.flags & TIMER_DELETE_ME)) + continue + qdel(timer) - // Handle components & signals - var/list/dc = datum_components + //BEGIN: ECS SHIT + var/list/dc = _datum_components if(dc) - var/all_components = dc[/datum/component] - if(length(all_components)) - for(var/datum/component/component as anything in all_components) - qdel(component, FALSE, TRUE) - else - var/datum/component/C = all_components - qdel(C, FALSE, TRUE) + for(var/component_key in dc) + var/component_or_list = dc[component_key] + if(islist(component_or_list)) + for(var/datum/component/component as anything in component_or_list) + qdel(component, FALSE, TRUE) + else + var/datum/component/C = component_or_list + qdel(C, FALSE, TRUE) dc.Cut() clear_signal_refs() @@ -114,7 +126,7 @@ ///Only override this if you know what you're doing. You do not know what you're doing ///This is a threat /datum/proc/clear_signal_refs() - var/list/lookup = comp_lookup + var/list/lookup = _listen_lookup if(lookup) for(var/sig in lookup) var/list/comps = lookup[sig] @@ -124,10 +136,10 @@ else var/datum/component/comp = comps comp.UnregisterSignal(src, sig) - comp_lookup = lookup = null + _listen_lookup = lookup = null - for(var/target in signal_procs) - UnregisterSignal(target, signal_procs[target]) + for(var/target in _signal_procs) + UnregisterSignal(target, _signal_procs[target]) #ifdef DATUMVAR_DEBUGGING_MODE /datum/proc/save_vars() diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index c50f7f30f5c9..1f5b7946739b 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -31,17 +31,24 @@ VV_DROPDOWN_OPTION(VV_HK_DELETE, "Delete") VV_DROPDOWN_OPTION(VV_HK_EXPOSE, "Show VV To Player") VV_DROPDOWN_OPTION(VV_HK_ADDCOMPONENT, "Add Component/Element") - //VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRAITS, "Modify Traits") + VV_DROPDOWN_OPTION(VV_HK_MASS_REMOVECOMPONENT, "Mass Remove Component/Element") + VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRAITS, "Modify Traits") /datum/proc/on_reagent_change(changetype) return -//This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks! -//href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables! -//This proc is for "high level" actions like admin heal/set species/etc/etc. The low level debugging things should go in admin/view_variables/topic_basic.dm incase this runtimes. +/** + * This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks! + * href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables! + * This proc is for "high level" actions like admin heal/set species/etc/etc. The low level debugging things should go in admin/view_variables/topic_basic.dm incase this runtimes. + */ /datum/proc/vv_do_topic(list/href_list) if(!usr || !usr.client || !usr.client.holder || !check_rights(NONE)) return FALSE //This is VV, not to be called by anything else. + if(SEND_SIGNAL(src, COMSIG_VV_TOPIC, usr, href_list) & COMPONENT_VV_HANDLED) + return FALSE + if(href_list[VV_HK_MODIFY_TRAITS]) + usr.client.holder.modify_traits(src) return TRUE /datum/proc/vv_get_header() diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index a3ec8be5dddc..4b91bf2caf9f 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -51,10 +51,10 @@ /// Finds the singleton for the element type given and attaches it to src /datum/proc/_AddElement(list/arguments) if(QDELING(src)) - //linter shits because of the way we init the maps and delete unused assets - //CRASH("We just tried to add an element to a qdeleted datum, something is fucked") - return + CRASH("We just tried to add an element to a qdeleted datum, something is fucked") var/datum/element/ele = SSdcs.GetElement(arguments) + if(!ele) // We couldn't fetch the element, likely because it was not an element. + return // the crash message has already been sent arguments[1] = src if(ele.Attach(arglist(arguments)) == ELEMENT_INCOMPATIBLE) CRASH("Incompatible element [ele.type] was assigned to a [type]! args: [json_encode(args)]") @@ -64,7 +64,9 @@ * You only need additional arguments beyond the type if you're using [ELEMENT_BESPOKE] */ /datum/proc/_RemoveElement(list/arguments) - var/datum/element/ele = SSdcs.GetElement(arguments) + var/datum/element/ele = SSdcs.GetElement(arguments, FALSE) + if(!ele) // We couldn't fetch the element, likely because it didn't exist. + return if(ele.element_flags & ELEMENT_COMPLEX_DETACH) arguments[1] = src ele.Detach(arglist(arguments)) diff --git a/code/datums/elements/connect_loc.dm b/code/datums/elements/connect_loc.dm index e6aecbe6aded..32b3b50b783a 100644 --- a/code/datums/elements/connect_loc.dm +++ b/code/datums/elements/connect_loc.dm @@ -1,7 +1,7 @@ /// This element hooks a signal onto the loc the current object is on. /// When the object moves, it will unhook the signal and rehook it to the new object. /datum/element/connect_loc - element_flags = ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE|ELEMENT_NO_LIST_UNIT_TEST argument_hash_start_idx = 2 /// An assoc list of signal -> procpath to register to the loc this object is on. diff --git a/code/datums/elements/decals/_decal.dm b/code/datums/elements/decals/_decal.dm new file mode 100644 index 000000000000..3b347fd4e2a5 --- /dev/null +++ b/code/datums/elements/decals/_decal.dm @@ -0,0 +1,179 @@ +/datum/element/decal + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY|ELEMENT_DONT_SORT_LIST_ARGS + argument_hash_start_idx = 2 + /// Whether this decal can be cleaned. + var/cleanable + /// A description this decal appends to the target's examine message. + var/description + /// If true this was initialized with no set direction - will follow the parent dir. + var/directional + /// The base icon state that this decal was initialized with. + var/base_icon_state + /// What smoothing junction this was initialized with. + var/smoothing + /// The overlay applied by this decal to the target. + var/mutable_appearance/pic + +/// Remove old decals and apply new decals after rotation as necessary +/datum/controller/subsystem/processing/dcs/proc/rotate_decals(datum/source, old_dir, new_dir) + SIGNAL_HANDLER + + if(old_dir == new_dir) + return + + var/list/datum/element/decal/old_decals = list() //instances + SEND_SIGNAL(source, COMSIG_ATOM_DECALS_ROTATING, old_decals) + + if(!length(old_decals)) + UnregisterSignal(source, COMSIG_ATOM_DIR_CHANGE) + return + + var/list/resulting_decals_params = list() // param lists + for(var/datum/element/decal/rotating as anything in old_decals) + resulting_decals_params += list(rotating.get_rotated_parameters(old_dir,new_dir)) + + //Instead we could generate ids and only remove duplicates to save on churn on four-corners symmetry ? + for(var/datum/element/decal/decal in old_decals) + decal.Detach(source) + + for(var/result in resulting_decals_params) + source.AddElement(/datum/element/decal, result["icon"], result["icon_state"], result["dir"], result["plane"], result["layer"], result["alpha"], result["color"], result["smoothing"], result["cleanable"], result["desc"]) + +/datum/element/decal/proc/get_rotated_parameters(old_dir,new_dir) + var/rotation = 0 + if(directional) //Even when the dirs are the same rotation is coming out as not 0 for some reason + rotation = SIMPLIFY_DEGREES(dir2angle(new_dir)-dir2angle(old_dir)) + new_dir = turn(pic.dir,-rotation) + return list( + "icon" = pic.icon, + "icon_state" = base_icon_state, + "dir" = new_dir, + "plane" = pic.plane, + "layer" = pic.layer, + "alpha" = pic.alpha, + "color" = pic.color, + "smoothing" = smoothing, + "cleanable" = cleanable, + "desc" = description, + ) + +/datum/element/decal/Attach(atom/target, _icon, _icon_state, _dir, _plane=FLOAT_PLANE, _layer=FLOAT_LAYER, _alpha=255, _color, _smoothing, _cleanable=FALSE, _description, mutable_appearance/_pic) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + if(_pic) + pic = _pic + else if(!generate_appearance(_icon, _icon_state, _dir, _plane, _layer, _color, _alpha, _smoothing, target)) + return ELEMENT_INCOMPATIBLE + description = _description + cleanable = _cleanable + directional = _dir + base_icon_state = _icon_state + smoothing = _smoothing + + RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(apply_overlay), TRUE) + if(target.flags_1 & INITIALIZED_1) + target.update_appearance(UPDATE_OVERLAYS) //could use some queuing here now maybe. + else + RegisterSignal(target,COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE, PROC_REF(late_update_icon), TRUE) + if(isitem(target)) + INVOKE_ASYNC(target, TYPE_PROC_REF(/obj/item/, update_slot_icon), TRUE) + if(_dir) + RegisterSignal(target, COMSIG_ATOM_DECALS_ROTATING, PROC_REF(shuttle_rotate), TRUE) + SSdcs.RegisterSignal(target, COMSIG_ATOM_DIR_CHANGE, TYPE_PROC_REF(/datum/controller/subsystem/processing/dcs, rotate_decals), override=TRUE) + if(!isnull(_smoothing)) + RegisterSignal(target, COMSIG_ATOM_SMOOTHED_ICON, PROC_REF(smooth_react), TRUE) + if(_cleanable) + RegisterSignal(target, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_react), TRUE) + if(_description) + RegisterSignal(target, COMSIG_PARENT_EXAMINE, PROC_REF(examine), TRUE) + + RegisterSignal(target, COMSIG_TURF_ON_SHUTTLE_MOVE, PROC_REF(shuttle_move_react), TRUE) + +/** + * ## generate_appearance + * + * If the decal was not given an appearance, it will generate one based on the other given arguments. + * element won't be compatible if it cannot do either + * all args are fed into creating an image, they are byond vars for images you'll recognize in the byond docs + * (except source, source is the object whose appearance we're copying.) + */ +/datum/element/decal/proc/generate_appearance(_icon, _icon_state, _dir, _plane, _layer, _color, _alpha, _smoothing, source) + if(!_icon || !_icon_state) + return FALSE + var/temp_image = image(_icon, null, isnull(_smoothing) ? _icon_state : "[_icon_state]-[_smoothing]", _layer, _dir) + pic = new(temp_image) + pic.plane = _plane + pic.color = _color + pic.alpha = _alpha + return TRUE + +/datum/element/decal/Detach(atom/source) + UnregisterSignal(source, list( + COMSIG_ATOM_DIR_CHANGE, + COMSIG_COMPONENT_CLEAN_ACT, + COMSIG_PARENT_EXAMINE, + COMSIG_ATOM_UPDATE_OVERLAYS, + COMSIG_TURF_ON_SHUTTLE_MOVE, + COMSIG_ATOM_SMOOTHED_ICON, + )) + SSdcs.UnregisterSignal(source, COMSIG_ATOM_DIR_CHANGE) + source.update_appearance(UPDATE_OVERLAYS) + if(isitem(source)) + INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item/, update_slot_icon)) + SEND_SIGNAL(source, COMSIG_TURF_DECAL_DETACHED, description, cleanable, directional, pic) + return ..() + +/datum/element/decal/proc/late_update_icon(atom/source) + SIGNAL_HANDLER + + if(istype(source) && !(source.flags_1 & DECAL_INIT_UPDATE_EXPERIENCED_1)) + source.flags_1 |= DECAL_INIT_UPDATE_EXPERIENCED_1 // I am so sorry, but it saves like 80ms I gotta + source.update_appearance(UPDATE_OVERLAYS) + UnregisterSignal(source, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) + +/datum/element/decal/proc/apply_overlay(atom/source, list/overlay_list) + SIGNAL_HANDLER + + overlay_list += pic + +/datum/element/decal/proc/clean_react(datum/source, clean_types) + SIGNAL_HANDLER + + if(clean_types & cleanable) + Detach(source) + return COMPONENT_CLEANED + return NONE + +/datum/element/decal/proc/examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + examine_list += description + +/datum/element/decal/proc/shuttle_move_react(datum/source, turf/new_turf) + SIGNAL_HANDLER + + if(new_turf == source) + return + Detach(source) + new_turf.AddElement(type, pic.icon, base_icon_state, directional, pic.plane, pic.layer, pic.alpha, pic.color, smoothing, cleanable, description) + +/datum/element/decal/proc/shuttle_rotate(datum/source, list/datum/element/decal/rotating) + SIGNAL_HANDLER + rotating += src + +/** + * Reacts to the source atom smoothing. + * + * Arguments: + * - [source][/atom]: The source of the signal and recently smoothed atom. + */ +/datum/element/decal/proc/smooth_react(atom/source) + SIGNAL_HANDLER + var/smoothing_junction = source.smoothing_junction + if(smoothing_junction == smoothing) + return NONE + + Detach(source) + source.AddElement(type, pic.icon, base_icon_state, directional, pic.plane, pic.layer, pic.alpha, pic.color, smoothing_junction, cleanable, description) + return NONE diff --git a/code/datums/elements/decals/blood.dm b/code/datums/elements/decals/blood.dm new file mode 100644 index 000000000000..889ebb12904b --- /dev/null +++ b/code/datums/elements/decals/blood.dm @@ -0,0 +1,47 @@ +/datum/element/decal/blood + +/datum/element/decal/blood/Attach(datum/target, _icon, _icon_state, _dir, _plane, _layer, _alpha, _color, _smoothing, _cleanable=CLEAN_TYPE_BLOOD, _description, mutable_appearance/_pic) + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + . = ..() + RegisterSignal(target, COMSIG_ATOM_GET_EXAMINE_NAME, PROC_REF(get_examine_name), TRUE) + +/datum/element/decal/blood/Detach(atom/source) + UnregisterSignal(source, COMSIG_ATOM_GET_EXAMINE_NAME) + return ..() + +/datum/element/decal/blood/generate_appearance(_icon, _icon_state, _dir, _plane, _layer, _color, _alpha, _smoothing, source) + var/obj/item/I = source + if(!_icon) + _icon = 'icons/effects/blood.dmi' + if(!_icon_state) + _icon_state = "itemblood" + var/icon = I.icon + var/icon_state = I.icon_state + if(!icon || !icon_state) + // It's something which takes on the look of other items, probably + icon = I.icon + icon_state = I.icon_state + var/static/list/blood_splatter_appearances = list() + //try to find a pre-processed blood-splatter. otherwise, make a new one + var/index = "[REF(icon)]-[icon_state]" + pic = blood_splatter_appearances[index] + + if(!pic) + var/icon/blood_splatter_icon = icon(I.icon, I.icon_state, , 1) //icon of the item that will become splattered + var/icon/blood_icon = icon(_icon, _icon_state) //icon of the blood that we apply + blood_icon.Scale(blood_splatter_icon.Width(), blood_splatter_icon.Height()) + blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) + blood_splatter_icon.Blend(blood_icon, ICON_MULTIPLY) //adds blood and the remaining white areas become transparant + pic = mutable_appearance(blood_splatter_icon, I.icon_state) + blood_splatter_appearances[index] = pic + return TRUE + +/datum/element/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override) + SIGNAL_HANDLER + + var/atom/A = source + override[EXAMINE_POSITION_ARTICLE] = A.gender == PLURAL? "some" : "a" + override[EXAMINE_POSITION_BEFORE] = " blood-stained " + return COMPONENT_EXNAME_CHANGED diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 0bc0245972e2..9ccdf913bb23 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -123,7 +123,7 @@ mood_was_enabled = TRUE var/datum/component/mood/c = H.GetComponent(/datum/component/mood) if(c) - c.RemoveComponent() + qdel(c) // Yogs End current.mind = null UnregisterSignal(current, COMSIG_GLOB_MOB_DEATH) diff --git a/code/datums/signals.dm b/code/datums/signals.dm new file mode 100644 index 000000000000..832ad69a2fa9 --- /dev/null +++ b/code/datums/signals.dm @@ -0,0 +1,131 @@ +/** + * Register to listen for a signal from the passed in target + * + * This sets up a listening relationship such that when the target object emits a signal + * the source datum this proc is called upon, will receive a callback to the given proctype + * Use PROC_REF(procname), TYPE_PROC_REF(type,procname) or GLOBAL_PROC_REF(procname) macros to validate the passed in proc at compile time. + * PROC_REF for procs defined on current type or it's ancestors, TYPE_PROC_REF for procs defined on unrelated type and GLOBAL_PROC_REF for global procs. + * Return values from procs registered must be a bitfield + * + * Arguments: + * * datum/target The target to listen for signals from + * * signal_type A signal name + * * proctype The proc to call back when the signal is emitted + * * override If a previous registration exists you must explicitly set this + */ +/datum/proc/RegisterSignal(datum/target, signal_type, proctype, override = FALSE) + if(QDELETED(src) || QDELETED(target)) + return + + if (islist(signal_type)) + var/static/list/known_failures = list() + var/list/signal_type_list = signal_type + var/message = "([target.type]) is registering [signal_type_list.Join(", ")] as a list, the older method. Change it to RegisterSignals." + + if (!(message in known_failures)) + known_failures[message] = TRUE + stack_trace("[target] [message]") + + RegisterSignals(target, signal_type, proctype, override) + return + + var/list/procs = (_signal_procs ||= list()) + var/list/target_procs = (procs[target] ||= list()) + var/list/lookup = (target._listen_lookup ||= list()) + + var/exists = target_procs[signal_type] + target_procs[signal_type] = proctype + + if(exists) + if(!override) + var/override_message = "[signal_type] overridden. Use override = TRUE to suppress this warning.\nTarget: [target] ([target.type]) Proc: [proctype]" + log_signal(override_message) + stack_trace(override_message) + return + + var/list/looked_up = lookup[signal_type] + + if(isnull(looked_up)) // Nothing has registered here yet + lookup[signal_type] = src + else if(!islist(looked_up)) // One other thing registered here + lookup[signal_type] = list(looked_up, src) + else // Many other things have registered here + looked_up += src + +/// Registers multiple signals to the same proc. +/datum/proc/RegisterSignals(datum/target, list/signal_types, proctype, override = FALSE) + for (var/signal_type in signal_types) + RegisterSignal(target, signal_type, proctype, override) + +/** + * Stop listening to a given signal from target + * + * Breaks the relationship between target and source datum, removing the callback when the signal fires + * + * Doesn't care if a registration exists or not + * + * Arguments: + * * datum/target Datum to stop listening to signals from + * * sig_typeor_types Signal string key or list of signal keys to stop listening to specifically + */ +/datum/proc/UnregisterSignal(datum/target, sig_type_or_types) + //Yogs edit: One day we should remove this, but it's too much work to port it all at once and too many snowflake exceptions to fix. + //Sorry, but this check stays for now. + if(!target) + return + //Yogs edit end + var/list/lookup = target._listen_lookup + if(!_signal_procs || !_signal_procs[target] || !lookup) + return + if(!islist(sig_type_or_types)) + sig_type_or_types = list(sig_type_or_types) + for(var/sig in sig_type_or_types) + if(!_signal_procs[target][sig]) + if(!istext(sig)) + stack_trace("We're unregistering with something that isn't a valid signal \[[sig]\], you fucked up") + continue + switch(length(lookup[sig])) + if(2) + lookup[sig] = (lookup[sig]-src)[1] + if(1) + stack_trace("[target] ([target.type]) somehow has single length list inside _listen_lookup") + if(src in lookup[sig]) + lookup -= sig + if(!length(lookup)) + target._listen_lookup = null + break + if(0) + if(lookup[sig] != src) + continue + lookup -= sig + if(!length(lookup)) + target._listen_lookup = null + break + else + lookup[sig] -= src + + _signal_procs[target] -= sig_type_or_types + if(!_signal_procs[target].len) + _signal_procs -= target + +/** + * Internal proc to handle most all of the signaling procedure + * + * Will runtime if used on datums with an empty lookup list + * + * Use the [SEND_SIGNAL] define instead + */ +/datum/proc/_SendSignal(sigtype, list/arguments) + var/target = _listen_lookup[sigtype] + if(!length(target)) + var/datum/listening_datum = target + return NONE | call(listening_datum, listening_datum._signal_procs[src][sigtype])(arglist(arguments)) + . = NONE + // This exists so that even if one of the signal receivers unregisters the signal, + // all the objects that are receiving the signal get the signal this final time. + // AKA: No you can't cancel the signal reception of another object by doing an unregister in the same signal. + var/list/queued_calls = list() + for(var/datum/listening_datum as anything in target) + queued_calls[listening_datum] = listening_datum._signal_procs[src][sigtype] + for(var/datum/listening_datum as anything in queued_calls) + . |= call(listening_datum, queued_calls[listening_datum])(arglist(arguments)) diff --git a/code/datums/status_effects/buffs/buffs.dm b/code/datums/status_effects/buffs/buffs.dm index 112529026ff8..a3774b7437cd 100644 --- a/code/datums/status_effects/buffs/buffs.dm +++ b/code/datums/status_effects/buffs/buffs.dm @@ -743,7 +743,8 @@ /datum/status_effect/holylight_healboost/on_remove() var/datum/component/heal_react/boost/holylight/healing = owner.GetComponent(/datum/component/heal_react/boost/holylight) - healing?.RemoveComponent() + if(healing) + qdel(healing) var/filter = owner.get_filter(HEALBOOST_FILTER) if(filter) animate(filter) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 7eef9e32d3e1..4e36645bdeba 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -97,7 +97,7 @@ light_range = 0 update_light() if(R) - R.RemoveComponent() + qdel(R) /obj/effect/decal/cleanable/greenglow/filled/Initialize(mapload) . = ..() diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index bbdba5ee4fdc..dc4972b30fbf 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -41,5 +41,5 @@ var/turf/T = loc if(!istype(T)) //you know this will happen somehow CRASH("Turf decal initialized in an object/nullspace") - T.AddComponent(/datum/component/decal, icon, icon_state, dir, FALSE, color, null, null, alpha) + T.AddElement(/datum/element/decal, icon, icon_state, dir, null, layer, alpha, color, null, FALSE, null) return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index b2e7fb5d761f..d8f3fc908ca0 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -439,7 +439,7 @@ * * target - The turf being painted to */ /obj/item/airlock_painter/decal/proc/paint_floor(turf/open/floor/target) - target.AddComponent(/datum/component/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, FALSE, color, null, null, 255) + target.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, null, null, alpha, color, null, FALSE, null) /** * Return the final icon_state for the given decal options @@ -641,4 +641,4 @@ decal_color = rgba_regex.group[1] decal_alpha = text2num(rgba_regex.group[2], 16) - target.AddComponent(/datum/component/decal, 'icons/turf/decals.dmi', source_decal, source_dir, FALSE, decal_color, null, null, decal_alpha) + target.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', source_decal, source_dir, null, null, decal_alpha, decal_color, null, FALSE, null) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 6d26a188e3f1..0044f7796b5a 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -716,7 +716,8 @@ name = "shuttle window" desc = "A reinforced, air-locked pod window." icon = 'icons/obj/smooth_structures/shuttle_window.dmi' - icon_state = "shuttle_window" + icon_state = "shuttle_window-0" + base_icon_state = "shuttle_window" dir = FULLTILE_WINDOW_DIR max_integrity = 100 wtype = "shuttle" diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 42e0702d2148..a3fdfa780022 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -91,18 +91,26 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/list/old_baseturfs = baseturfs - var/list/transferring_comps = list() - SEND_SIGNAL(src, COMSIG_TURF_CHANGE, path, new_baseturfs, flags, transferring_comps) - for(var/i in transferring_comps) - var/datum/component/comp = i - comp.RemoveComponent() + var/list/post_change_callbacks = list() + SEND_SIGNAL(src, COMSIG_TURF_CHANGE, path, new_baseturfs, flags, post_change_callbacks) changing_turf = TRUE - qdel(src) //Just get the side effects and call Destroy + qdel(src) //Just get the side effects and call Destroy + //We do this here so anything that doesn't want to persist can clear itself + var/list/old_listen_lookup = _listen_lookup?.Copy() + var/list/old_signal_procs = _signal_procs?.Copy() var/turf/W = new path(src) - for(var/i in transferring_comps) - W.TakeComponent(i) + // WARNING WARNING + // Turfs DO NOT lose their signals when they get replaced, REMEMBER THIS + // It's possible because turfs are fucked, and if you have one in a list and it's replaced with another one, the list ref points to the new turf + if(old_listen_lookup) + LAZYOR(W._listen_lookup, old_listen_lookup) + if(old_signal_procs) + LAZYOR(W._signal_procs, old_signal_procs) + + for(var/datum/callback/callback as anything in post_change_callbacks) + callback.InvokeAsync(W) if(new_baseturfs) W.baseturfs = new_baseturfs diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 46c34c1b5581..3f36ebade727 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -6,6 +6,7 @@ base_icon_state = "reinforced_wall" opacity = TRUE density = TRUE + smoothing_flags = SMOOTH_BITMASK var/d_state = INTACT hardness = 10 diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index a74290108199..b8924ae03639 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1430,6 +1430,52 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name_admin(C)]") log_admin("[key_name(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name(C)]") +/// Allow admin to add or remove traits of datum +/datum/admins/proc/modify_traits(datum/D) + if(!D) + return + + var/add_or_remove = input("Remove/Add?", "Trait Remove/Add") as null|anything in list("Add","Remove") + if(!add_or_remove) + return + var/list/available_traits = list() + + switch(add_or_remove) + if("Add") + for(var/key in GLOB.admin_visible_traits) + if(istype(D,key)) + available_traits += GLOB.admin_visible_traits[key] + if("Remove") + if(!GLOB.admin_trait_name_map) + GLOB.admin_trait_name_map = generate_admin_trait_name_map() + for(var/trait in D._status_traits) + var/name = GLOB.admin_trait_name_map[trait] || trait + available_traits[name] = trait + + var/chosen_trait = input("Select trait to modify", "Trait") as null|anything in sort_list(available_traits) + if(!chosen_trait) + return + chosen_trait = available_traits[chosen_trait] + + var/source = "adminabuse" + switch(add_or_remove) + if("Add") //Not doing source choosing here intentionally to make this bit faster to use, you can always vv it. + if(GLOB.movement_type_trait_to_flag[chosen_trait]) //include the required element. + D.AddElement(/datum/element/movetype_handler) + ADD_TRAIT(D,chosen_trait,source) + if("Remove") + var/specific = input("All or specific source ?", "Trait Remove/Add") as null|anything in list("All","Specific") + if(!specific) + return + switch(specific) + if("All") + source = null + if("Specific") + source = input("Source to be removed","Trait Remove/Add") as null|anything in sort_list(GET_TRAIT_SOURCES(D, chosen_trait)) + if(!source) + return + REMOVE_TRAIT(D,chosen_trait,source) + /mob/living/carbon/proc/adminpie(mob/user) var/obj/item/reagent_containers/food/snacks/pie/cream/admin/p = new (get_turf(pick(oview(3,user)))) p.item_flags = UNCATCHABLE diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index 46c15f28f68c..4e929a7afe25 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -54,29 +54,86 @@ if(!check_rights(NONE)) return var/list/names = list() - var/list/componentsubtypes = sortList(subtypesof(/datum/component), /proc/cmp_typepaths_asc) + var/list/componentsubtypes = sort_list(subtypesof(/datum/component), GLOBAL_PROC_REF(cmp_typepaths_asc)) names += "---Components---" names += componentsubtypes names += "---Elements---" - names += sortList(subtypesof(/datum/element), /proc/cmp_typepaths_asc) - var/result = input(usr, "Choose a component/element to add","better know what ur fuckin doin pal") as null|anything in names - if(!usr || !result || result == "---Components---" || result == "---Elements---") + names += sort_list(subtypesof(/datum/element), GLOBAL_PROC_REF(cmp_typepaths_asc)) + + var/result = tgui_input_list(usr, "Choose a component/element to add", "Add Component", names) + if(isnull(result)) + return + if(!usr || result == "---Components---" || result == "---Elements---") return + if(QDELETED(src)) - to_chat(usr, "That thing doesn't exist anymore!") + to_chat(usr, "That thing doesn't exist anymore!", confidential = TRUE) return + + var/add_source + if(ispath(result, /datum/component)) + var/datum/component/comp_path = result + if(initial(comp_path.dupe_mode) == COMPONENT_DUPE_SOURCES) + add_source = tgui_input_text(usr, "Enter a source for the component", "Add Component", "ADMIN-ABUSE") + if(isnull(add_source)) + return + var/list/lst = get_callproc_args() if(!lst) return + var/datumname = "error" lst.Insert(1, result) if(result in componentsubtypes) datumname = "component" - target._AddComponent(lst) + target._AddComponent(lst, add_source) else datumname = "element" target._AddElement(lst) - log_admin("[key_name(usr)] has added [result] [datumname] to [key_name(src)].") - message_admins("[key_name_admin(usr)] has added [result] [datumname] to [key_name_admin(src)].") + log_admin("[key_name(usr)] has added [result] [datumname] to [key_name(target)].") + message_admins(span_notice("[key_name_admin(usr)] has added [result] [datumname] to [key_name_admin(target)].")) + if(href_list[VV_HK_REMOVECOMPONENT] || href_list[VV_HK_MASS_REMOVECOMPONENT]) + if(!check_rights(NONE)) + return + var/mass_remove = href_list[VV_HK_MASS_REMOVECOMPONENT] + var/list/components = list() + for(var/datum/component/component in target.GetComponents(/datum/component)) + components += component.type + var/list/names = list() + names += "---Components---" + if(length(components)) + names += sort_list(components, GLOBAL_PROC_REF(cmp_typepaths_asc)) + names += "---Elements---" + // We have to list every element here because there is no way to know what element is on this object without doing some sort of hack. + names += sort_list(subtypesof(/datum/element), GLOBAL_PROC_REF(cmp_typepaths_asc)) + var/path = tgui_input_list(usr, "Choose a component/element to remove. All elements listed here may not be on the datum.", "Remove element", names) + if(isnull(path)) + return + if(!usr || path == "---Components---" || path == "---Elements---") + return + if(QDELETED(src)) + to_chat(usr, "That thing doesn't exist anymore!") + return + var/list/targets_to_remove_from = list(target) + if(mass_remove) + var/method = vv_subtype_prompt(target.type) + targets_to_remove_from = get_all_of_type(target.type, method) + + if(alert(usr, "Are you sure you want to mass-delete [path] on [target.type]?", "Mass Remove Confirmation", "Yes", "No") == "No") + return + + for(var/datum/target_to_remove_from as anything in targets_to_remove_from) + if(ispath(path, /datum/element)) + var/list/lst = get_callproc_args() + if(!lst) + lst = list() + lst.Insert(1, path) + target._RemoveElement(lst) + else + var/list/components_actual = target_to_remove_from.GetComponents(path) + for(var/to_delete in components_actual) + qdel(to_delete) + + message_admins(span_notice("[key_name_admin(usr)] has [mass_remove? "mass" : ""] removed [path] component from [mass_remove? target.type : key_name_admin(target)].")) if(href_list[VV_HK_CALLPROC]) usr.client.callproc_datum(target) diff --git a/code/modules/antagonists/bloodsuckers/vassal/vassal.dm b/code/modules/antagonists/bloodsuckers/vassal/vassal.dm index 3b2cc4f7347a..674f6190c30e 100644 --- a/code/modules/antagonists/bloodsuckers/vassal/vassal.dm +++ b/code/modules/antagonists/bloodsuckers/vassal/vassal.dm @@ -102,7 +102,7 @@ master.special_vassals[special_type] -= src master.vassals -= src owner.enslaved_to = null - for(var/all_status_traits in owner.current.status_traits) + for(var/all_status_traits in owner.current._status_traits) REMOVE_TRAIT(owner.current, all_status_traits, BLOODSUCKER_TRAIT) //Remove Recuperate Power while(powers.len) diff --git a/code/modules/antagonists/creep/creep.dm b/code/modules/antagonists/creep/creep.dm index 23cbf6779ce4..c586841df3bd 100644 --- a/code/modules/antagonists/creep/creep.dm +++ b/code/modules/antagonists/creep/creep.dm @@ -85,7 +85,7 @@ var/datum/component/C = M.GetComponent(/datum/component/mood) if(C) //we cannot be too sure they may have somehow removed it to_chat(owner, span_danger("Your need for mental fitness vanishes alongside the voices, mood has been disabled.")) - C.RemoveComponent() + qdel(C) /datum/antagonist/obsessed/proc/forge_objectives(datum/mind/obsessionmind) var/list/objectives_left = list("spendtime", "polaroid", "hug") diff --git a/code/modules/antagonists/demon/demons.dm b/code/modules/antagonists/demon/demons.dm index 7310800742c6..b0147f260b40 100644 --- a/code/modules/antagonists/demon/demons.dm +++ b/code/modules/antagonists/demon/demons.dm @@ -177,7 +177,7 @@ /datum/antagonist/sinfuldemon/on_removal() owner.special_role = null owner.current.faction -= "hell" - for(var/all_status_traits in owner.current.status_traits) //removes demon traits + for(var/all_status_traits in owner.current._status_traits) //removes demon traits REMOVE_TRAIT(owner.current, all_status_traits, SINFULDEMON_TRAIT) for(var/datum/action/cooldown/spell/spell in owner.current.actions) if(spell.target == owner) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 877b97da4936..61f086b1e319 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -70,7 +70,7 @@ if(uplink_holder) var/datum/component/uplink/uplink = uplink_holder.GetComponent(/datum/component/uplink) if(uplink)//remove uplink so they can't keep using it if admin abuse happens - uplink.RemoveComponent() + qdel(uplink) UnregisterSignal(owner.current, COMSIG_MOVABLE_HEAR) SSticker.mode.traitors -= owner if(!silent && owner.current) diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 2f491f0ebc5c..48318064622b 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -371,14 +371,10 @@ return FALSE if(istype(obj_to_insert, /obj/effect/supplypod_rubble)) return FALSE - if((obj_to_insert.comp_lookup && obj_to_insert.comp_lookup[COMSIG_OBJ_HIDE]) && reverse_option_list["Underfloor"]) - return TRUE - else if ((obj_to_insert.comp_lookup && obj_to_insert.comp_lookup[COMSIG_OBJ_HIDE]) && !reverse_option_list["Underfloor"]) - return FALSE - if(isProbablyWallMounted(obj_to_insert) && reverse_option_list["Wallmounted"]) - return TRUE - else if (isProbablyWallMounted(obj_to_insert) && !reverse_option_list["Wallmounted"]) - return FALSE + if(HAS_TRAIT(obj_to_insert, TRAIT_UNDERFLOOR)) + return !!reverse_option_list["Underfloor"] + if(isProbablyWallMounted(obj_to_insert)) + return !!reverse_option_list["Wallmounted"] if(!obj_to_insert.anchored && reverse_option_list["Unanchored"]) return TRUE if(obj_to_insert.anchored && !ismecha(obj_to_insert) && reverse_option_list["Anchored"]) //Mecha are anchored but there is a separate option for them diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 7ceb3f3f93b4..52d935f24f3e 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -105,10 +105,11 @@ if(!brainmob.stored_dna) brainmob.stored_dna = new /datum/dna/stored(brainmob) C.dna.copy_dna(brainmob.stored_dna) - if(HAS_TRAIT(L, TRAIT_BADDNA)) - brainmob.status_traits[TRAIT_BADDNA] = L.status_traits[TRAIT_BADDNA] - if(HAS_TRAIT(L, TRAIT_NOCLONE)) // YOU CAN'T ESCAPE - brainmob.status_traits[TRAIT_NOCLONE] = L.status_traits[TRAIT_NOCLONE] + // Hack, fucked dna needs to follow the brain to prevent memes, so we need to copy over the trait sources and shit + for(var/source in GET_TRAIT_SOURCES(L, TRAIT_BADDNA)) + ADD_TRAIT(brainmob, TRAIT_BADDNA, source) + for(var/source in GET_TRAIT_SOURCES(L, TRAIT_NOCLONE)) + ADD_TRAIT(brainmob, TRAIT_NOCLONE, source) var/obj/item/organ/zombie_infection/ZI = L.getorganslot(ORGAN_SLOT_ZOMBIE) if(ZI) brainmob.set_species(ZI.old_species) //For if the brain is cloned diff --git a/code/modules/pool/components/swimming.dm b/code/modules/pool/components/swimming.dm index c61f8a12a204..290e5ee9bfc3 100644 --- a/code/modules/pool/components/swimming.dm +++ b/code/modules/pool/components/swimming.dm @@ -41,7 +41,7 @@ if(istype(C) && C?.dna?.species) component_type = C.dna.species.swimming_component var/mob/M = parent - RemoveComponent() + qdel(src) M.AddComponent(component_type) /datum/component/swimming/proc/try_leave_pool(datum/source, turf/clicked_turf) @@ -56,7 +56,7 @@ if(do_after(parent, 1 SECONDS, clicked_turf)) L.forceMove(clicked_turf) L.visible_message("[parent] climbs out of the pool.") - RemoveComponent() + qdel(src) /datum/component/swimming/UnregisterFromParent() exit_pool() diff --git a/code/modules/pool/pool.dm b/code/modules/pool/pool.dm index d9021beac0c6..c59bbf5c5af6 100644 --- a/code/modules/pool/pool.dm +++ b/code/modules/pool/pool.dm @@ -74,20 +74,22 @@ Place a pool filter somewhere in the pool if you want people to be able to modif . = ..() if(!istype(newloc, /turf/open/indestructible/sound/pool)) var/datum/component/swimming/S = Obj.GetComponent(/datum/component/swimming) //Handling admin TPs here. - S?.RemoveComponent() + if(S) + qdel(S) /turf/open/MouseDrop_T(atom/dropping, mob/user) + . = ..() if(!isliving(user) || !isliving(dropping)) //No I don't want ghosts to be able to dunk people into the pool. return var/atom/movable/AM = dropping var/datum/component/swimming/S = dropping.GetComponent(/datum/component/swimming) - if(S) - if(do_after(user, 1 SECONDS, src)) - S.RemoveComponent() - visible_message("[dropping] climbs out of the pool.") - AM.forceMove(src) - else - . = ..() + if(!S) + return + if(!do_after(user, 1 SECONDS, src)) + return + qdel(S) + visible_message("[dropping] climbs out of the pool.") + AM.forceMove(src) /turf/open/indestructible/sound/pool/MouseDrop_T(atom/dropping, mob/user) if(!isliving(user) || !isliving(dropping)) //No I don't want ghosts to be able to dunk people into the pool. @@ -314,7 +316,7 @@ GLOBAL_LIST_EMPTY(pool_filters) if(S) to_chat(user, "You start to climb out of the pool...") if(do_after(user, 1 SECONDS, src)) - S.RemoveComponent() + qdel(S) visible_message("[user] climbs out of the pool.") if(!reversed) user.forceMove(get_turf(get_step(src, NORTH))) //Ladders shouldn't adjoin another pool section. Ever. diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 4b259f7f3a46..c5200f5843c1 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -58,6 +58,7 @@ All ShuttleMove procs go here CRASH("A turf queued to move via shuttle somehow had no skipover in baseturfs. [src]([type]):[loc]") var/depth = baseturfs.len - shuttle_boundary + 1 newT.CopyOnTop(src, 1, depth, TRUE, CHANGETURF_DEFER_CHANGE) + SEND_SIGNAL(src, COMSIG_TURF_ON_SHUTTLE_MOVE, newT) return TRUE // Called on the new turf after everything has been moved diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 943b22f41a02..55941be88d2f 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -147,21 +147,22 @@ to_chat(owner, emp_message) charge(amount = owner.nutrition * -0.02 * severity) -/obj/item/organ/stomach/cell/Insert(mob/living/carbon/M, special, drop_if_replaced) +/obj/item/organ/stomach/cell/Insert(mob/living/carbon/stomach_owner, special, drop_if_replaced) . = ..() - if(HAS_TRAIT(M, TRAIT_POWERHUNGRY)) - M.nutrition = stored_charge - RegisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(charge)) + if(HAS_TRAIT(stomach_owner, TRAIT_POWERHUNGRY)) + stomach_owner.nutrition = stored_charge + RegisterSignal(stomach_owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(charge)) -/obj/item/organ/stomach/cell/Remove(mob/living/carbon/M, special) +/obj/item/organ/stomach/cell/Remove(mob/living/carbon/stomach_owner, special) . = ..() - if(HAS_TRAIT(M, TRAIT_POWERHUNGRY)) - stored_charge = M.nutrition - M.nutrition = 0 + if(HAS_TRAIT(stomach_owner, TRAIT_POWERHUNGRY)) + stored_charge = stomach_owner.nutrition + stomach_owner.nutrition = 0 UnregisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) - M.dna?.species.handle_digestion(M) // update nutrition stuff + stomach_owner.dna?.species.handle_digestion(stomach_owner) // update nutrition stuff /obj/item/organ/stomach/cell/proc/charge(datum/source, amount, repairs) + SIGNAL_HANDLER if(!HAS_TRAIT(owner, TRAIT_POWERHUNGRY)) return // do nothing in the owner doesn't run on electricity owner.adjust_nutrition(amount/100) // ipcs can't get fat anymore @@ -174,15 +175,16 @@ organ_flags = NONE compatible_biotypes = ALL_NON_ROBOTIC -/obj/item/organ/stomach/cell/ethereal/Insert(mob/living/carbon/M, special = 0) - ..() - RegisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT, PROC_REF(on_electrocute)) +/obj/item/organ/stomach/cell/ethereal/Insert(mob/living/carbon/stomach_owner, special = 0) + . = ..() + RegisterSignal(stomach_owner, COMSIG_LIVING_ELECTROCUTE_ACT, PROC_REF(on_electrocute)) -/obj/item/organ/stomach/cell/ethereal/Remove(mob/living/carbon/M, special = 0) - UnregisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT) - ..() +/obj/item/organ/stomach/cell/ethereal/Remove(mob/living/carbon/stomach_owner, special = 0) + UnregisterSignal(stomach_owner, COMSIG_LIVING_ELECTROCUTE_ACT) + return ..() /obj/item/organ/stomach/cell/ethereal/proc/on_electrocute(mob/living/victim, shock_damage, obj/source, siemens_coeff = 1, zone = null, tesla_shock = 0, illusion = 0) + SIGNAL_HANDLER if(illusion) return if(!HAS_TRAIT(owner, TRAIT_POWERHUNGRY)) @@ -233,4 +235,4 @@ ..() var/datum/component/crawl/vomit/B = M.GetComponent(/datum/component/crawl/vomit) if(B) - B.RemoveComponent() + qdel(B) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 2db748e1f0cc..ca029b16733c 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -58,8 +58,13 @@ #define TEST_DEFAULT 1 /// After most test steps, used for tests that run long so shorter issues can be noticed faster #define TEST_LONGER 10 -/// This must be the last test to run due to the inherent nature of the test iterating every single tangible atom in the game and qdeleting all of them (while taking long sleeps to make sure the garbage collector fires properly) taking a large amount of time. -#define TEST_CREATE_AND_DESTROY INFINITY +/// This must be the one of last tests to run due to the inherent nature of the test iterating every single tangible atom in the game and qdeleting all of them (while taking long sleeps to make sure the garbage collector fires properly) taking a large amount of time. +#define TEST_CREATE_AND_DESTROY 9001 +/** + * For tests that rely on create and destroy having iterated through every (tangible) atom so they don't have to do something similar. + * Keep in mind tho that create and destroy will absolutely break the test platform, anything that relies on its shape cannot come after it. + */ +#define TEST_AFTER_CREATE_AND_DESTROY INFINITY /// A trait source when adding traits through unit tests #define TRAIT_SOURCE_UNIT_TESTS "unit_tests" @@ -67,6 +72,7 @@ #include "anchored_mobs.dm" #include "baseturfs.dm" #include "component_tests.dm" +#include "dcs_check_list_arguments.dm" #include "dragon_expiration.dm" #include "dynamic_ruleset_sanity.dm" #include "focus_only_tests.dm" @@ -78,6 +84,7 @@ #include "species_whitelists.dm" #include "subsystem_init.dm" #include "timer_sanity.dm" +#include "trait_addition_and_removal.dm" #include "unit_test.dm" #undef TEST_ASSERT diff --git a/code/modules/unit_tests/dcs_check_list_arguments.dm b/code/modules/unit_tests/dcs_check_list_arguments.dm new file mode 100644 index 000000000000..67d7417062b2 --- /dev/null +++ b/code/modules/unit_tests/dcs_check_list_arguments.dm @@ -0,0 +1,55 @@ +/** + * list arguments for bespoke elements are treated as a text ref in the ID, like any other datum. + * Which means that, unless cached, using lists as arguments will lead to multiple instance of the same element + * being created over and over. + * + * Because of how it works, this unit test checks that these list datum args + * do not share similar contents (when rearranged in descending alpha-numerical order), to ensure that + * the least necessary amount of elements is created. So, using static lists may not be enough, + * for example, in the case of two different critters using the death_drops element to drop ectoplasm on death, since, + * despite being static lists, the two are different instances assigned to different mob types. + * + * Most of the time, you won't encounter two different static lists with similar contents used as element args, + * meaning using static lists is accepted. However, should that happen, it's advised to replace the instances + * with various string_x procs: lists, assoc_lists, assoc_nested_lists or numbers_list, depending on the type. + * + * In the case of an element where the position of the contents of each datum list argument is important, + * ELEMENT_DONT_SORT_LIST_ARGS should be added to its flags, to prevent such issues where the contents are similar + * when sorted, but the element instances are not. + * + * In the off-chance the element is not compatible with this unit test (such as for connect_loc et simila), + * you can also use ELEMENT_NO_LIST_UNIT_TEST so that they won't be processed by this unit test at all. + */ +/datum/unit_test/dcs_check_list_arguments + /** + * This unit test requires every (unless ignored) atom to have been created at least once + * for a more accurate search, which is why it's run after create_and_destroy is done running. + */ + priority = TEST_AFTER_CREATE_AND_DESTROY + +/datum/unit_test/dcs_check_list_arguments/Run() + var/we_failed = FALSE + for(var/element_type in SSdcs.arguments_that_are_lists_by_element) + // Keeps track of the lists that shouldn't be compared with again. + var/list/to_ignore = list() + var/list/superlist = SSdcs.arguments_that_are_lists_by_element[element_type] + for(var/list/current as anything in superlist) + to_ignore[current] = TRUE + var/list/bad_lists + for(var/list/compare as anything in superlist) + if(to_ignore[compare]) + continue + if(deep_compare_list(current, compare)) + if(!bad_lists) + bad_lists = list(list(current)) + bad_lists += list(compare) + to_ignore[compare] = TRUE + if(bad_lists) + we_failed = TRUE + //Include the original, unsorted list in the report. It should be easier to find by the contributor. + var/list/unsorted_list = superlist[current] + TEST_FAIL("Found [length(bad_lists)] datum list arguments with similar contents for [element_type]. Contents: [json_encode(unsorted_list)].") + ///Let's avoid sending the same instructions over and over, as it's just going to clutter the CI and confuse someone. + if(we_failed) + TEST_FAIL("Ensure that each list is static or cached. string_lists() (as well as similar procs) is your friend here.\n\ + Check the documentation from dcs_check_list_arguments.dm for more information!") diff --git a/code/modules/unit_tests/trait_addition_and_removal.dm b/code/modules/unit_tests/trait_addition_and_removal.dm new file mode 100644 index 000000000000..273cf102a00a --- /dev/null +++ b/code/modules/unit_tests/trait_addition_and_removal.dm @@ -0,0 +1,94 @@ +/// Simple Unit Test to ensure multiple methods of adding/removing a trait work as intended. +/datum/unit_test/trait_addition_and_removal + +#define TRAIT_UNIT_TEST_MAIN "trait_main" +#define TRAIT_UNIT_TEST_ALT "trait_alternate" +#define TRAIT_UNIT_TEST_A "trait_a" +#define TRAIT_UNIT_TEST_B "trait_b" +#define TRAIT_UNIT_TEST_C "trait_c" +#define UNIT_TEST_SOURCE_MAIN "source_main" +#define UNIT_TEST_SOURCE_ALT "source_alt" +#define UNIT_TEST_SOURCE_A "source_a" +#define UNIT_TEST_SOURCE_B "source_b" + +/datum/unit_test/trait_addition_and_removal/Run() + var/datum/trait_target = allocate(/datum) // traits work on the datum-level, so use a datum to ensure that it'll work on all children + + // We want to ensure that what we add is also removed when we're done with our "block" of tests, if it starts to get messy we might just have to reset the datum between tests to ensure cleanliness + + // The basics, if these fail burn down the codebase + ADD_TRAIT(trait_target, TRAIT_UNIT_TEST_A, UNIT_TEST_SOURCE_A) + TEST_ASSERT(HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_A), "Basic trait addition failed for [TRAIT_UNIT_TEST_A], source being [UNIT_TEST_SOURCE_A]!") + + ADD_TRAIT(trait_target, TRAIT_UNIT_TEST_B, UNIT_TEST_SOURCE_B) + TEST_ASSERT(HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_B), "Basic trait addition failed for [TRAIT_UNIT_TEST_B], source being [UNIT_TEST_SOURCE_B]!") + TEST_ASSERT(HAS_TRAIT_FROM(trait_target, TRAIT_UNIT_TEST_B, UNIT_TEST_SOURCE_B), "Failed to verify source for [TRAIT_UNIT_TEST_B], expected source being [UNIT_TEST_SOURCE_B]!") + TEST_ASSERT(HAS_TRAIT_NOT_FROM(trait_target, TRAIT_UNIT_TEST_B, UNIT_TEST_SOURCE_A), "Failed to verify source for [TRAIT_UNIT_TEST_B], expected source being [UNIT_TEST_SOURCE_B] but was actually [UNIT_TEST_SOURCE_A]!") + + REMOVE_TRAIT(trait_target, TRAIT_UNIT_TEST_B, UNIT_TEST_SOURCE_B) + TEST_ASSERT(!HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_B), "Basic trait removal failed for [TRAIT_UNIT_TEST_B], source being [UNIT_TEST_SOURCE_B]!") + TEST_ASSERT(HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_A), "Trait [TRAIT_UNIT_TEST_A] was removed when it shouldn't have been!") + REMOVE_TRAIT(trait_target, TRAIT_UNIT_TEST_A, UNIT_TEST_SOURCE_A) + + // Test adding the trait multiple times from different sources + ADD_TRAIT(trait_target, TRAIT_UNIT_TEST_MAIN, UNIT_TEST_SOURCE_A) + ADD_TRAIT(trait_target, TRAIT_UNIT_TEST_MAIN, UNIT_TEST_SOURCE_B) + TEST_ASSERT(!HAS_TRAIT_FROM_ONLY(trait_target, TRAIT_UNIT_TEST_MAIN, UNIT_TEST_SOURCE_A), "Failed to recognize that [TRAIT_UNIT_TEST_MAIN] was added by both [UNIT_TEST_SOURCE_A] and [UNIT_TEST_SOURCE_B]!") + + // as well as its removal + REMOVE_TRAIT_NOT_FROM(trait_target, TRAIT_UNIT_TEST_MAIN, UNIT_TEST_SOURCE_A) + TEST_ASSERT(!HAS_TRAIT_FROM(trait_target, TRAIT_UNIT_TEST_MAIN, UNIT_TEST_SOURCE_B), "Failed to remove [TRAIT_UNIT_TEST_MAIN] with [UNIT_TEST_SOURCE_B] when removal was expected!") + TEST_ASSERT(HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_MAIN), "[TRAIT_UNIT_TEST_MAIN] was completely removed when it should not have been!") + REMOVE_TRAIT(trait_target, TRAIT_UNIT_TEST_MAIN, UNIT_TEST_SOURCE_A) + TEST_ASSERT(!HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_MAIN), "[TRAIT_UNIT_TEST_MAIN] was not removed when it should have been!") + + // Test adding multiple traits from the same source + ADD_TRAIT(trait_target, TRAIT_UNIT_TEST_A, UNIT_TEST_SOURCE_MAIN) + ADD_TRAIT(trait_target, TRAIT_UNIT_TEST_B, UNIT_TEST_SOURCE_MAIN) + TEST_ASSERT(HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_B), "Failed to add [TRAIT_UNIT_TEST_B] with common source [UNIT_TEST_SOURCE_MAIN]!") + + ADD_TRAIT(trait_target, TRAIT_UNIT_TEST_C, UNIT_TEST_SOURCE_ALT) + REMOVE_TRAITS_NOT_IN(trait_target, UNIT_TEST_SOURCE_MAIN) + TEST_ASSERT(!HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_C), "Failed to remove [TRAIT_UNIT_TEST_C] when expected to be removed with remove_traits_NOT_IN(), was added with source [UNIT_TEST_SOURCE_ALT]!") + + // as well as its removal + REMOVE_TRAITS_IN(trait_target, UNIT_TEST_SOURCE_MAIN) + TEST_ASSERT(!HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_A), "Failed to remove [TRAIT_UNIT_TEST_A] with common source [UNIT_TEST_SOURCE_MAIN]!") + TEST_ASSERT(!HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_B), "Failed to remove [TRAIT_UNIT_TEST_B] with common source [UNIT_TEST_SOURCE_MAIN]!") + + // Lastly, let's ensure that adding/removing traits using lists still works. + var/static/list/standardized_traits_list = list(TRAIT_UNIT_TEST_A, TRAIT_UNIT_TEST_B, TRAIT_UNIT_TEST_C) + trait_target.add_traits(standardized_traits_list, UNIT_TEST_SOURCE_MAIN) + for(var/trait in standardized_traits_list) + TEST_ASSERT(HAS_TRAIT(trait_target, trait), "Failed to add [trait] when using add_traits() using [UNIT_TEST_SOURCE_MAIN]!") + trait_target.remove_traits(standardized_traits_list, UNIT_TEST_SOURCE_MAIN) + for(var/trait in standardized_traits_list) + TEST_ASSERT(!HAS_TRAIT(trait_target, trait), "Failed to remove [trait] when using remove_traits() using [UNIT_TEST_SOURCE_MAIN]!") + + // As well as ensure mixing-and-matching types of trait addition/removal works. + ADD_TRAIT(trait_target, TRAIT_UNIT_TEST_A, UNIT_TEST_SOURCE_MAIN) + ADD_TRAIT(trait_target, TRAIT_UNIT_TEST_B, UNIT_TEST_SOURCE_MAIN) + trait_target.remove_traits(standardized_traits_list, UNIT_TEST_SOURCE_MAIN) + TEST_ASSERT(!HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_A), "Failed to remove [TRAIT_UNIT_TEST_A] when using remove_traits() using [UNIT_TEST_SOURCE_MAIN] (was added using ADD_TRAIT())!") + TEST_ASSERT(!HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_B), "Failed to remove [TRAIT_UNIT_TEST_B] when using remove_traits() using [UNIT_TEST_SOURCE_MAIN] (was added using ADD_TRAIT())!") + TEST_ASSERT(!HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_C), "[TRAIT_UNIT_TEST_C] somehow came into existence when using remove_traits() using [UNIT_TEST_SOURCE_MAIN] (what the actual fuck)!") + + trait_target.add_traits(standardized_traits_list, UNIT_TEST_SOURCE_MAIN) + REMOVE_TRAIT(trait_target, TRAIT_UNIT_TEST_A, UNIT_TEST_SOURCE_MAIN) + REMOVE_TRAIT(trait_target, TRAIT_UNIT_TEST_B, UNIT_TEST_SOURCE_MAIN) + TEST_ASSERT(!HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_A), "Failed to remove [TRAIT_UNIT_TEST_A] when using REMOVE_TRAIT() using [UNIT_TEST_SOURCE_MAIN] (was added using add_traits())!") + TEST_ASSERT(!HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_B), "Failed to remove [TRAIT_UNIT_TEST_B] when using REMOVE_TRAIT() using [UNIT_TEST_SOURCE_MAIN] (was added using add_traits())!") + TEST_ASSERT(HAS_TRAIT(trait_target, TRAIT_UNIT_TEST_C), "[TRAIT_UNIT_TEST_C] was unexpectedly removed when using REMOVE_TRAIT() using [UNIT_TEST_SOURCE_MAIN] (was added using add_traits())!") + REMOVE_TRAIT(trait_target, TRAIT_UNIT_TEST_C, UNIT_TEST_SOURCE_MAIN) //just for cleanliness+completeness + + TEST_ASSERT(!length(trait_target._status_traits), "Failed to clean up all status traits at the end of the unit test!") + +#undef TRAIT_UNIT_TEST_MAIN +#undef TRAIT_UNIT_TEST_ALT +#undef TRAIT_UNIT_TEST_A +#undef TRAIT_UNIT_TEST_B +#undef TRAIT_UNIT_TEST_C +#undef UNIT_TEST_SOURCE_MAIN +#undef UNIT_TEST_SOURCE_ALT +#undef UNIT_TEST_SOURCE_A +#undef UNIT_TEST_SOURCE_B diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm index d7a4e4f6baa6..5c839e3e09de 100644 --- a/code/modules/uplink/uplink_devices.dm +++ b/code/modules/uplink/uplink_devices.dm @@ -103,7 +103,7 @@ /obj/item/ntuplink/proc/finalize() //if the uplink type has been modified somehow, remove it and replace it var/datum/component/uplink/nanotrasen/uplink = GetComponent(/datum/component/uplink/nanotrasen) if(uplink) - uplink.RemoveComponent() + qdel(uplink) AddComponent(nt_datum, datum_owner, FALSE, TRUE, null, wc_start) /obj/item/ntuplink/official diff --git a/icons/obj/smooth_structures/shuttle_window.dmi b/icons/obj/smooth_structures/shuttle_window.dmi index 67acefd53da0b5514b5081018a3560f32a1421de..9b9891e9d2c8e13a9387dc9257ea4289a534cf91 100644 GIT binary patch literal 6254 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 literal 3738 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 Date: Thu, 7 Dec 2023 09:04:17 -0500 Subject: [PATCH 136/281] Update _lists.dm --- code/__HELPERS/_lists.dm | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 4324f060a4d2..4e49da925c8b 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -749,3 +749,32 @@ stack_trace("[name] is not sorted. value at [index] ([value]) is in the wrong place compared to the previous value of [last_value] (when compared to by [cmp])") last_value = value + +/// Compares 2 lists, returns TRUE if they are the same +/proc/deep_compare_list(list/list_1, list/list_2) + if(!islist(list_1) || !islist(list_2)) + return FALSE + + if(list_1 == list_2) + return TRUE + + if(list_1.len != list_2.len) + return FALSE + + for(var/i in 1 to list_1.len) + var/key_1 = list_1[i] + var/key_2 = list_2[i] + if (islist(key_1) && islist(key_2)) + if(!deep_compare_list(key_1, key_2)) + return FALSE + else if(key_1 != key_2) + return FALSE + if(istext(key_1) || islist(key_1) || ispath(key_1) || isdatum(key_1) || key_1 == world) + var/value_1 = list_1[key_1] + var/value_2 = list_2[key_1] + if (islist(value_1) && islist(value_2)) + if(!deep_compare_list(value_1, value_2)) + return FALSE + else if(value_1 != value_2) + return FALSE + return TRUE From 126b5a0ab63ff98202c42f657b0d0b323e15d3d7 Mon Sep 17 00:00:00 2001 From: JohnFulpWillard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Thu, 7 Dec 2023 09:24:57 -0500 Subject: [PATCH 137/281] Update icon_smoothing.dm --- code/__HELPERS/icon_smoothing.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index c2b3a7f86056..e820e82df219 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -390,7 +390,9 @@ xxx xxx xxx break set_adj_in_dir; \ /// Check that non border objects use to smooth against border objects /// Returns true if the smooth is acceptable, FALSE otherwise - #define BITMASK_ON_BORDER_CHECK(target, direction) (!(target.smoothing_flags & SMOOTH_BORDER_OBJECT) || CAN_DIAGONAL_SMOOTH(target, src, REVERSE_DIR(direction))) + #define BITMASK_ON_BORDER_CHECK(target, direction) \ + (!(target.smoothing_flags & SMOOTH_BORDER_OBJECT) || CAN_DIAGONAL_SMOOTH(target, src, REVERSE_DIR(direction)) \ + ) #define BORDER_FOUND(target, direction, direction_flag) new_junction |= CAN_DIAGONAL_SMOOTH(src, target, direction) // Border objects require an object as context, so we need a dummy. I'm sorry @@ -411,6 +413,7 @@ xxx xxx xxx SEARCH_ADJ_IN_DIR(direction, direction_flag, BITMASK_FOUND, BITMASK_FOUND, BITMASK_ON_BORDER_CHECK) \ }} \ while(FALSE) + // and another for border object work (Doesn't early exit because we can hit more then one direction by checking the same turf) #define SET_BORDER_ADJ_IN_DIR(direction) SEARCH_ADJ_IN_DIR(direction, direction, BORDER_FOUND, WORLD_BORDER_FOUND, BORDER_ON_BORDER_CHECK) From 0fff429fb1c60f6d2a3a70d4280c2b52af639fae Mon Sep 17 00:00:00 2001 From: JohnFulpWillard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Thu, 7 Dec 2023 09:50:43 -0500 Subject: [PATCH 138/281] it now works kinda --- code/__DEFINES/_atoms.dm | 7 + code/__DEFINES/flags.dm | 6 +- code/__DEFINES/subsystems.dm | 29 ++-- code/_compile_options.dm | 2 - code/controllers/subsystem/atoms.dm | 93 ++++------- code/datums/armor.dm | 2 +- code/game/atom/_atom.dm | 107 +------------ code/game/atom/atom_initializing_EXPENSIVE.dm | 151 ++++++++++++++++++ code/modules/mob/mob.dm | 14 +- code/modules/mob/mob_defines.dm | 1 - yogstation.dme | 2 + 11 files changed, 224 insertions(+), 190 deletions(-) create mode 100644 code/__DEFINES/_atoms.dm create mode 100644 code/game/atom/atom_initializing_EXPENSIVE.dm diff --git a/code/__DEFINES/_atoms.dm b/code/__DEFINES/_atoms.dm new file mode 100644 index 000000000000..21ae4ae23b36 --- /dev/null +++ b/code/__DEFINES/_atoms.dm @@ -0,0 +1,7 @@ +#define BAD_INIT_QDEL_BEFORE 1 +#define BAD_INIT_DIDNT_INIT 2 +#define BAD_INIT_SLEPT 4 +#define BAD_INIT_NO_HINT 8 + +#define PROFILE_INIT_ATOM_BEGIN(...) +#define PROFILE_INIT_ATOM_END(...) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 92c198dd18c5..f4c1ce20fa94 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -20,9 +20,9 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768)) // for /datum/var/datum_flags -#define DF_USE_TAG (1<<0) -#define DF_VAR_EDITED (1<<1) -#define DF_ISPROCESSING (1<<2) +#define DF_USE_TAG (1<<0) +#define DF_VAR_EDITED (1<<1) +#define DF_ISPROCESSING (1<<2) //FLAGS BITMASK diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index b92b3a398214..abfbd91b42dd 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -69,9 +69,9 @@ ///New should not call Initialize #define INITIALIZATION_INSSATOMS 0 -///New should call Initialize(mapload, TRUE) +///New should call Initialize(TRUE) #define INITIALIZATION_INNEW_MAPLOAD 2 -///New should call Initialize(mapload, FALSE) +///New should call Initialize(FALSE) #define INITIALIZATION_INNEW_REGULAR 1 //! ### Initialization hints @@ -79,12 +79,12 @@ ///Nothing happens #define INITIALIZE_HINT_NORMAL 0 /** - * call LateInitialize at the end of all atom Initalization - * - * The item will be added to the late_loaders list, this is iterated over after - * initalization of subsystems is complete and calls LateInitalize on the atom - * see [this file for the LateIntialize proc](atom.html#proc/LateInitialize) - */ + * call LateInitialize at the end of all atom Initalization + * + * The item will be added to the late_loaders list, this is iterated over after + * initalization of subsystems is complete and calls LateInitalize on the atom + * see [this file for the LateIntialize proc](atom.html#proc/LateInitialize) + */ #define INITIALIZE_HINT_LATELOAD 1 ///Call qdel on the atom after intialization @@ -92,11 +92,14 @@ ///type and all subtypes should always immediately call Initialize in New() #define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){\ - ..();\ - if(!(flags_1 & INITIALIZED_1)) {\ - args[1] = TRUE;\ - SSatoms.InitAtom(src, args);\ - }\ + ..();\ + if(!(flags_1 & INITIALIZED_1)) {\ + var/previous_initialized_value = SSatoms.initialized;\ + SSatoms.initialized = INITIALIZATION_INNEW_MAPLOAD;\ + args[1] = TRUE;\ + SSatoms.InitAtom(src, FALSE, args);\ + SSatoms.initialized = previous_initialized_value;\ + }\ } //! ### SS initialization hints diff --git a/code/_compile_options.dm b/code/_compile_options.dm index b296be969328..ff9cabf129ae 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -31,8 +31,6 @@ #endif // 1 to use the default behaviour; // 2 for preloading absolutely everything; -#define LOWMEMORYMODE - #ifdef LOWMEMORYMODE #define FORCE_MAP "_maps/runtimestation.json" #endif diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index c4d493d2dff9..2e803eb8fb9a 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -1,14 +1,9 @@ #define SUBSYSTEM_INIT_SOURCE "subsystem init" - -#define BAD_INIT_QDEL_BEFORE 1 -#define BAD_INIT_DIDNT_INIT 2 -#define BAD_INIT_SLEPT 4 -#define BAD_INIT_NO_HINT 8 - SUBSYSTEM_DEF(atoms) name = "Atoms" init_order = INIT_ORDER_ATOMS flags = SS_NO_FIRE + loading_points = 30 SECONDS // Yogs -- smarter loading times /// A stack of list(source, desired initialized state) @@ -20,32 +15,34 @@ SUBSYSTEM_DEF(atoms) var/list/BadInitializeCalls = list() - var/init_start_time + ///initAtom() adds the atom its creating to this list iff InitializeAtoms() has been given a list to populate as an argument + var/list/created_atoms /// Atoms that will be deleted once the subsystem is initialized var/list/queued_deletions = list() + var/init_start_time + initialized = INITIALIZATION_INSSATOMS -/datum/controller/subsystem/atoms/Initialize(timeofday) +/datum/controller/subsystem/atoms/Initialize() init_start_time = world.time - GLOB.fire_overlay.appearance_flags = RESET_COLOR setupGenetics() //to set the mutations' sequence initialized = INITIALIZATION_INNEW_MAPLOAD InitializeAtoms() initialized = INITIALIZATION_INNEW_REGULAR - + return SS_INIT_SUCCESS -/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms) +/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms, list/atoms_to_return) if(initialized == INITIALIZATION_INSSATOMS) return set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, SUBSYSTEM_INIT_SOURCE) // This may look a bit odd, but if the actual atom creation runtimes for some reason, we absolutely need to set initialized BACK - CreateAtoms(atoms) + CreateAtoms(atoms, atoms_to_return) clear_tracked_initalize(SUBSYSTEM_INIT_SOURCE) if(late_loaders.len) @@ -57,7 +54,11 @@ SUBSYSTEM_DEF(atoms) A.LateInitialize() testing("Late initialized [late_loaders.len] atoms") late_loaders.Cut() - + + if (created_atoms) + atoms_to_return += created_atoms + created_atoms = null + for (var/queued_deletion in queued_deletions) qdel(queued_deletion) @@ -65,7 +66,10 @@ SUBSYSTEM_DEF(atoms) queued_deletions.Cut() /// Actually creates the list of atoms. Exists soley so a runtime in the creation logic doesn't cause initalized to totally break -/datum/controller/subsystem/atoms/proc/CreateAtoms(list/atoms) +/datum/controller/subsystem/atoms/proc/CreateAtoms(list/atoms, list/atoms_to_return = null) + if (atoms_to_return) + LAZYINITLIST(created_atoms) + #ifdef TESTING var/count #endif @@ -81,7 +85,9 @@ SUBSYSTEM_DEF(atoms) var/atom/A = atoms[I] if(!(A.flags_1 & INITIALIZED_1)) CHECK_TICK - InitAtom(A, mapload_arg) + PROFILE_INIT_ATOM_BEGIN() + InitAtom(A, TRUE, mapload_arg) + PROFILE_INIT_ATOM_END(A) else #ifdef TESTING count = 0 @@ -89,7 +95,9 @@ SUBSYSTEM_DEF(atoms) for(var/atom/A as anything in world) if(!(A.flags_1 & INITIALIZED_1)) - InitAtom(A, mapload_arg) + PROFILE_INIT_ATOM_BEGIN() + InitAtom(A, FALSE, mapload_arg) + PROFILE_INIT_ATOM_END(A) #ifdef TESTING ++count #endif @@ -97,48 +105,6 @@ SUBSYSTEM_DEF(atoms) testing("Initialized [count] atoms") -/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments) - var/the_type = A.type - if(QDELING(A)) - // Check init_start_time to not worry about atoms created before the atoms SS that are cleaned up before this - if (A.gc_destroyed > init_start_time) - BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE - return TRUE - - #ifdef UNIT_TESTS - var/start_tick = world.time - #endif - - var/result = A.Initialize(arglist(arguments)) - - #ifdef UNIT_TESTS - if(start_tick != world.time) - BadInitializeCalls[the_type] |= BAD_INIT_SLEPT - #endif - - var/qdeleted = FALSE - - switch(result) - if (INITIALIZE_HINT_NORMAL) - // pass - if (INITIALIZE_HINT_LATELOAD) - if(arguments[1]) //mapload - late_loaders += A - else - A.LateInitialize() - if (INITIALIZE_HINT_QDEL) - qdel(A) - qdeleted = TRUE - else - BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT - - if(!A) //possible harddel - qdeleted = TRUE - else if(!(A.flags_1 & INITIALIZED_1)) - BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT - - return qdeleted || QDELING(A) - /datum/controller/subsystem/atoms/proc/map_loader_begin(source) set_tracked_initalized(INITIALIZATION_INSSATOMS, source) @@ -154,7 +120,9 @@ SUBSYSTEM_DEF(atoms) initialized = state /datum/controller/subsystem/atoms/proc/clear_tracked_initalize(source) - for(var/i in length(initialized_state) to 1) + if(!length(initialized_state)) + return + for(var/i in length(initialized_state) to 1 step -1) if(initialized_state[i][1] == source) initialized_state.Cut(i, i+1) break @@ -211,7 +179,7 @@ SUBSYSTEM_DEF(atoms) if(fails & BAD_INIT_QDEL_BEFORE) . += "- Qdel'd in New()\n" if(fails & BAD_INIT_SLEPT) - . += "- Slept during Initialize(mapload)\n" + . += "- Slept during Initialize()\n" /// Prepares an atom to be deleted once the atoms SS is initialized. /datum/controller/subsystem/atoms/proc/prepare_deletion(atom/target) @@ -226,9 +194,4 @@ SUBSYSTEM_DEF(atoms) if(initlog) text2file(initlog, "[GLOB.log_directory]/initialize.log") -#undef BAD_INIT_QDEL_BEFORE -#undef BAD_INIT_DIDNT_INIT -#undef BAD_INIT_SLEPT -#undef BAD_INIT_NO_HINT - #undef SUBSYSTEM_INIT_SOURCE diff --git a/code/datums/armor.dm b/code/datums/armor.dm index fa995f3490a5..d9b07d7be0f0 100644 --- a/code/datums/armor.dm +++ b/code/datums/armor.dm @@ -6,7 +6,6 @@ . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic, wound, electric) /datum/armor - datum_flags = DF_USE_TAG var/melee var/bullet var/laser @@ -34,6 +33,7 @@ src.wound = wound src.electric = electric tag = ARMORID + GenerateTag() /datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, wound = 0, electric=0) return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.magic+magic, src.wound+wound, src.electric+electric) diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index 88d27eb52bf5..e6f819701a78 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -137,104 +137,6 @@ var/atom/orbit_target //Reference to atom being orbited -/** - * Called when an atom is created in byond (built in engine proc) - * - * Not a lot happens here in SS13 code, as we offload most of the work to the - * [Intialization](atom.html#proc/Initialize) proc, mostly we run the preloader - * if the preloader is being used and then call InitAtom of which the ultimate - * result is that the Intialize proc is called. - * - * We also generate a tag here if the DF_USE_TAG flag is set on the atom - */ -/atom/New(loc, ...) - //atom creation method that preloads variables at creation - if(GLOB.use_preloader && (src.type == GLOB._preloader_path))//in case the instanciated atom is creating other atoms in New() - world.preloader_load(src) - - if(datum_flags & DF_USE_TAG) - GenerateTag() - - var/do_initialize = SSatoms.initialized - if(do_initialize != INITIALIZATION_INSSATOMS) - args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD - if(SSatoms.InitAtom(src, args)) - //we were deleted - return - SSdemo.mark_new(src) - -/** - * The primary method that objects are setup in SS13 with - * - * we don't use New as we have better control over when this is called and we can choose - * to delay calls or hook other logic in and so forth - * - * During roundstart map parsing, atoms are queued for intialization in the base atom/New(), - * After the map has loaded, then Initalize is called on all atoms one by one. NB: this - * is also true for loading map templates as well, so they don't Initalize until all objects - * in the map file are parsed and present in the world - * - * If you're creating an object at any point after SSInit has run then this proc will be - * immediately be called from New. - * - * mapload: This parameter is true if the atom being loaded is either being intialized during - * the Atom subsystem intialization, or if the atom is being loaded from the map template. - * If the item is being created at runtime any time after the Atom subsystem is intialized then - * it's false. - * - * You must always call the parent of this proc, otherwise failures will occur as the item - * will not be seen as initalized (this can lead to all sorts of strange behaviour, like - * the item being completely unclickable) - * - * You must not sleep in this proc, or any subprocs - * - * Any parameters from new are passed through (excluding loc), naturally if you're loading from a map - * there are no other arguments - * - * Must return an [initialization hint](code/__DEFINES/subsystems.html) or a runtime will occur. - * - * Note: the following functions don't call the base for optimization and must copypasta handling: - * * /turf/Initialize - * * /turf/open/space/Initialize - */ -/atom/proc/Initialize(mapload, ...) - SHOULD_CALL_PARENT(TRUE) - if(flags_1 & INITIALIZED_1) - stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 - - //atom color stuff - if(color) - add_atom_colour(color, FIXED_COLOUR_PRIORITY) - - if (light_system == STATIC_LIGHT && light_power && light_range) - update_light() - - if(custom_materials && custom_materials.len) - var/temp_list = list() - for(var/i in custom_materials) - var/datum/material/material = getmaterialref(i) || i - temp_list[material] = custom_materials[material] //Get the proper instanced version - - custom_materials = null //Null the list to prepare for applying the materials properly - set_custom_materials(temp_list) - - return INITIALIZE_HINT_NORMAL - -/** - * Late Intialization, for code that should run after all atoms have run Intialization - * - * To have your LateIntialize proc be called, your atoms [Initalization](atom.html#proc/Initialize) - * proc must return the hint - * [INITIALIZE_HINT_LATELOAD](code/__DEFINES/subsystems.html#define/INITIALIZE_HINT_LATELOAD) - * otherwise you will never be called. - * - * useful for doing things like finding other machines on GLOB.machines because you can guarantee - * that all atoms will actually exist in the "WORLD" at this time and that all their Intialization - * code has been run - */ -/atom/proc/LateInitialize() - return /** * Top level of the destroy chain for most atoms @@ -1310,9 +1212,12 @@ /atom/proc/return_temperature() return -///Generate a tag for this atom -/atom/proc/GenerateTag() - return +///Generate a tag for this /datum, if it implements one +///Should be called as early as possible, best would be in New, to avoid weakref mistargets +///Really just don't use this, you don't need it, global lists will do just fine MOST of the time +///We really only use it for mobs to make id'ing people easier +/datum/proc/GenerateTag() + datum_flags |= DF_USE_TAG ///Connect this atom to a shuttle /atom/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) diff --git a/code/game/atom/atom_initializing_EXPENSIVE.dm b/code/game/atom/atom_initializing_EXPENSIVE.dm new file mode 100644 index 000000000000..a6218922e8be --- /dev/null +++ b/code/game/atom/atom_initializing_EXPENSIVE.dm @@ -0,0 +1,151 @@ +/// Init this specific atom +/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, from_template = FALSE, list/arguments) + var/the_type = A.type + + if(QDELING(A)) + // Check init_start_time to not worry about atoms created before the atoms SS that are cleaned up before this + if (A.gc_destroyed > init_start_time) + BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE + return TRUE + + // This is handled and battle tested by dreamchecker. Limit to UNIT_TESTS just in case that ever fails. + #ifdef UNIT_TESTS + var/start_tick = world.time + #endif + + var/result = A.Initialize(arglist(arguments)) + + #ifdef UNIT_TESTS + if(start_tick != world.time) + BadInitializeCalls[the_type] |= BAD_INIT_SLEPT + #endif + + var/qdeleted = FALSE + + switch(result) + if (INITIALIZE_HINT_NORMAL) + // pass + if(INITIALIZE_HINT_LATELOAD) + if(arguments[1]) //mapload + late_loaders += A + else + A.LateInitialize() + if(INITIALIZE_HINT_QDEL) + qdel(A) + qdeleted = TRUE + else + BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT + + if(!A) //possible harddel + qdeleted = TRUE + else if(!(A.flags_1 & INITIALIZED_1)) + BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT + else + SEND_SIGNAL(A, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) + if(created_atoms && from_template && ispath(the_type, /atom/movable))//we only want to populate the list with movables + created_atoms += A.get_all_contents() + + return qdeleted || QDELING(A) + +/** + * Called when an atom is created in byond (built in engine proc) + * + * Not a lot happens here in SS13 code, as we offload most of the work to the + * [Intialization][/atom/proc/Initialize] proc, mostly we run the preloader + * if the preloader is being used and then call [InitAtom][/datum/controller/subsystem/atoms/proc/InitAtom] of which the ultimate + * result is that the Intialize proc is called. + * + */ +/atom/New(loc, ...) + //atom creation method that preloads variables at creation + if(GLOB.use_preloader && src.type == GLOB._preloader_path)//in case the instanciated atom is creating other atoms in New() + world.preloader_load(src) + + var/do_initialize = SSatoms.initialized + if(do_initialize != INITIALIZATION_INSSATOMS) + args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD + if(SSatoms.InitAtom(src, FALSE, args)) + //we were deleted + return + //Yogs edit: Demos + SSdemo.mark_new(src) + //Yogs edit ends + +/** + * The primary method that objects are setup in SS13 with + * + * we don't use New as we have better control over when this is called and we can choose + * to delay calls or hook other logic in and so forth + * + * During roundstart map parsing, atoms are queued for intialization in the base atom/New(), + * After the map has loaded, then Initalize is called on all atoms one by one. NB: this + * is also true for loading map templates as well, so they don't Initalize until all objects + * in the map file are parsed and present in the world + * + * If you're creating an object at any point after SSInit has run then this proc will be + * immediately be called from New. + * + * mapload: This parameter is true if the atom being loaded is either being intialized during + * the Atom subsystem intialization, or if the atom is being loaded from the map template. + * If the item is being created at runtime any time after the Atom subsystem is intialized then + * it's false. + * + * The mapload argument occupies the same position as loc when Initialize() is called by New(). + * loc will no longer be needed after it passed New(), and thus it is being overwritten + * with mapload at the end of atom/New() before this proc (atom/Initialize()) is called. + * + * You must always call the parent of this proc, otherwise failures will occur as the item + * will not be seen as initalized (this can lead to all sorts of strange behaviour, like + * the item being completely unclickable) + * + * You must not sleep in this proc, or any subprocs + * + * Any parameters from new are passed through (excluding loc), naturally if you're loading from a map + * there are no other arguments + * + * Must return an [initialization hint][INITIALIZE_HINT_NORMAL] or a runtime will occur. + * + * Note: the following functions don't call the base for optimization and must copypasta handling: + * * [/turf/proc/Initialize] + * * [/turf/open/space/proc/Initialize] + */ +/atom/proc/Initialize(mapload, ...) + SHOULD_NOT_SLEEP(TRUE) + SHOULD_CALL_PARENT(TRUE) + + if(flags_1 & INITIALIZED_1) + stack_trace("Warning: [src]([type]) initialized multiple times!") + flags_1 |= INITIALIZED_1 + + //atom color stuff + if(color) + add_atom_colour(color, FIXED_COLOUR_PRIORITY) + + if (light_system == STATIC_LIGHT && light_power && light_range) + update_light() + + SETUP_SMOOTHING() + + if(custom_materials && custom_materials.len) + var/temp_list = list() + for(var/i in custom_materials) + var/datum/material/material = getmaterialref(i) || i + temp_list[material] = custom_materials[material] //Get the proper instanced version + custom_materials = null //Null the list to prepare for applying the materials properly + set_custom_materials(temp_list) + + return INITIALIZE_HINT_NORMAL + +/** + * Late Intialization, for code that should run after all atoms have run Intialization + * + * To have your LateIntialize proc be called, your atoms [Initalization][/atom/proc/Initialize] + * proc must return the hint + * [INITIALIZE_HINT_LATELOAD] otherwise it will never be called. + * + * useful for doing things like finding other machines on GLOB.machines because you can guarantee + * that all atoms will actually exist in the "WORLD" at this time and that all their Intialization + * code has been run + */ +/atom/proc/LateInitialize() + set waitfor = FALSE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 399aa3e7786d..455c77749671 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -87,12 +87,18 @@ update_config_movespeed() update_movespeed(TRUE) +/mob/New() + // This needs to happen IMMEDIATELY. I'm sorry :( + GenerateTag() + return ..() + /** - * Generate the tag for this mob - * - * This is simply "mob_"+ a global incrementing counter that goes up for every mob - */ + * Generate the tag for this mob + * + * This is simply "mob_"+ a global incrementing counter that goes up for every mob + */ /mob/GenerateTag() + . = ..() tag = "mob_[next_mob_id++]" /** diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 469261640cb2..82854737eb19 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -7,7 +7,6 @@ * Has a lot of the creature game world logic, such as health etc */ /mob - datum_flags = DF_USE_TAG density = TRUE layer = MOB_LAYER animate_movement = 2 diff --git a/yogstation.dme b/yogstation.dme index 7e4414441c6e..f1e8b345d09d 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -18,6 +18,7 @@ #include "code\_compile_options.dm" #include "code\_debugger.dm" #include "code\world.dm" +#include "code\__DEFINES\_atoms.dm" #include "code\__DEFINES\_auxtools.dm" #include "code\__DEFINES\_bitfields.dm" #include "code\__DEFINES\_click.dm" @@ -846,6 +847,7 @@ #include "code\game\area\areas\ruins\space.dm" #include "code\game\area\areas\ruins\templates.dm" #include "code\game\atom\_atom.dm" +#include "code\game\atom\atom_initializing_EXPENSIVE.dm" #include "code\game\atom\atom_invisibility.dm" #include "code\game\atom\atom_materials.dm" #include "code\game\atom\atom_orbit.dm" From f6d806fac74421188f071255e0d001675ae3297f Mon Sep 17 00:00:00 2001 From: JohnFulpWillard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Thu, 7 Dec 2023 09:59:11 -0500 Subject: [PATCH 139/281] Update atom_initializing_EXPENSIVE.dm --- code/game/atom/atom_initializing_EXPENSIVE.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/atom/atom_initializing_EXPENSIVE.dm b/code/game/atom/atom_initializing_EXPENSIVE.dm index a6218922e8be..d4055267b2ca 100644 --- a/code/game/atom/atom_initializing_EXPENSIVE.dm +++ b/code/game/atom/atom_initializing_EXPENSIVE.dm @@ -110,7 +110,7 @@ * * [/turf/open/space/proc/Initialize] */ /atom/proc/Initialize(mapload, ...) - SHOULD_NOT_SLEEP(TRUE) +// SHOULD_NOT_SLEEP(TRUE) //Yogs edit: This is fucked and needs an in-depth review before commenting back in. But we should eventually. SHOULD_CALL_PARENT(TRUE) if(flags_1 & INITIALIZED_1) From 4b721b919658abb035b21af37177e15bae0cf267 Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Fri, 8 Dec 2023 18:40:34 -0800 Subject: [PATCH 140/281] lighting don't work --- _maps/_basemap.dm | 2 +- code/__DEFINES/layers.dm | 16 ++ code/__DEFINES/subsystems.dm | 6 +- code/__HELPERS/_planes.dm | 88 +++++++++ code/__HELPERS/icon_smoothing.dm | 14 +- code/controllers/subsystem/lighting.dm | 86 ++++++--- code/controllers/subsystem/mapping.dm | 169 +++++++++++++++++- code/datums/mutable_appearance.dm | 25 ++- code/game/machinery/computer/_computer.dm | 2 +- code/game/machinery/mindmachine.dm | 2 +- code/game/turfs/turf.dm | 2 + code/modules/lighting/lighting_object.dm | 13 +- code/modules/lighting/lighting_setup.dm | 4 +- .../space_management/zlevel_manager.dm | 16 +- icons/effects/lighting_object.dmi | Bin 1893 -> 1899 bytes yogstation.dme | 2 + 16 files changed, 384 insertions(+), 63 deletions(-) create mode 100644 code/__HELPERS/_planes.dm diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 48b96c8948f7..aadbfa88a035 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 0c9c2a3d769b..a72119750133 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -1,6 +1,9 @@ //Defines for atom layers and planes //KEEP THESE IN A NICE ACSCENDING ORDER, PLEASE +//NEVER HAVE ANYTHING BELOW THIS PLANE ADJUST IF YOU NEED MORE SPACE +#define LOWEST_EVER_PLANE -100 + #define CLICKCATCHER_PLANE -99 #define PLANE_SPACE -95 @@ -158,6 +161,19 @@ #define RENDER_PLANE_GAME 100 #define RENDER_PLANE_NON_GAME 101 +#define RENDER_PLANE_MASTER 110 +// Lummox I swear to god I will find you +// NOTE! You can only ever have planes greater then -10000, if you add too many with large offsets you will brick multiz +// Same can be said for large multiz maps. Tread carefully mappers +#define HIGHEST_EVER_PLANE RENDER_PLANE_MASTER +/// The range unique planes can be in +#define PLANE_RANGE (HIGHEST_EVER_PLANE - LOWEST_EVER_PLANE) + ///1000 is an unimportant number, it's just to normalize copied layers #define RADIAL_CONTENT_LAYER 1000 + +/// We expect at most 3 layers of multiz +/// Increment this define if you make a huge map. We unit test for it too just to make it easy for you +/// If you modify this, you'll need to modify the tsx file too +#define MAX_EXPECTED_Z_DEPTH 3 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index abfbd91b42dd..72912c548c8b 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -141,8 +141,8 @@ #define INIT_ORDER_QUIRKS 73 #define INIT_ORDER_EVENTS 70 #define INIT_ORDER_JOBS 65 -#define INIT_ORDER_MAPPING 60 -#define INIT_ORDER_TICKER 50 +#define INIT_ORDER_TICKER 55 +#define INIT_ORDER_MAPPING 50 #define INIT_ORDER_EARLY_ASSETS 48 #define INIT_ORDER_NETWORKS 45 #define INIT_ORDER_ECONOMY 40 @@ -154,7 +154,7 @@ #define INIT_ORDER_TIMER 1 #define INIT_ORDER_DEFAULT 0 #define INIT_ORDER_AIR_MACHINERY -0.5 -#define INIT_ORDER_AIR -2 +#define INIT_ORDER_AIR -1 #define INIT_ORDER_PERSISTENCE -2 #define INIT_ORDER_PERSISTENT_PAINTINGS -3 // Assets relies on this #define INIT_ORDER_ASSETS -4 diff --git a/code/__HELPERS/_planes.dm b/code/__HELPERS/_planes.dm new file mode 100644 index 000000000000..769c4283ea62 --- /dev/null +++ b/code/__HELPERS/_planes.dm @@ -0,0 +1,88 @@ +// This file contains helper macros for plane operations +// See the planes section of Visuals.md for more detail, but essentially +// When we render multiz, we do it by placing all atoms on lower levels on well, lower planes +// This is done with stacks of plane masters (things we use to apply effects to planes) +// These macros exist to facilitate working with this system, and other associated small bits + +/// Takes an atom to change the plane of, a new plane value, and something that can be used as a reference to a z level as input +/// Modifies the new value to match the plane we actually want. Note, if you pass in an already offset plane the offsets will add up +/// Use PLANE_TO_TRUE() to avoid this +#define SET_PLANE(thing, new_value, z_reference) (thing.plane = MUTATE_PLANE(new_value, z_reference)) + +/// Takes a plane and a z reference, and offsets the plane by the mutation +/// The SSmapping.max_plane_offset bit here is technically redundant, but saves a bit of work in the base case +/// And the base case is important to me. Non multiz shouldn't get hit too bad by this code +#define MUTATE_PLANE(new_value, z_reference) ((SSmapping.max_plane_offset) ? GET_NEW_PLANE(new_value, GET_TURF_PLANE_OFFSET(z_reference)) : (new_value)) + +/// Takes a z reference that we are unsure of, sanity checks it +/// Returns either its offset, or 0 if it's not a valid ref +/// Will return the reference's PLANE'S offset if we can't get anything out of the z level. We do our best +#define GET_TURF_PLANE_OFFSET(z_reference) ((SSmapping.max_plane_offset && isatom(z_reference)) ? (z_reference.z ? GET_Z_PLANE_OFFSET(z_reference.z) : PLANE_TO_OFFSET(z_reference.plane)) : 0) +/// Essentially just an unsafe version of GET_TURF_PLANE_OFFSET() +/// Takes a z value we returns its offset with a list lookup +/// Will runtime during parts of init. Be careful :) +#define GET_Z_PLANE_OFFSET(z) (SSmapping.z_level_to_plane_offset[z]) + +/// Takes a plane to offset, and the multiplier to use, and well, does the offsetting +/// Respects a blacklist we use to remove redundant plane masters, such as hud objects +#define GET_NEW_PLANE(new_value, multiplier) (SSmapping.plane_offset_blacklist?["[new_value]"] ? new_value : (new_value) - (PLANE_RANGE * (multiplier))) + +// Now for the more niche things + +/// Takes an object, new plane, and multipler, and offsets the plane +/// This is for cases where you have a multipler precalculated, and just want to use it +/// Often an optimization, sometimes a necessity +#define SET_PLANE_W_SCALAR(thing, new_value, multiplier) (thing.plane = GET_NEW_PLANE(new_value, multiplier)) + + +/// Implicit plane set. We take the turf from the object we're changing the plane of, and use ITS z as a spokesperson for our plane value +#define SET_PLANE_IMPLICIT(thing, new_value) SET_PLANE_EXPLICIT(thing, new_value, thing) + +// This is an unrolled and optimized version of SET_PLANE, for use anywhere where you are unsure of a source's "turfness" +// We do also try and guess at what the thing's z level is, even if it's not a z +// The plane is cached to allow for fancy stuff to be eval'd once, rather then often +#define SET_PLANE_EXPLICIT(thing, new_value, source) \ + do {\ + if(SSmapping.max_plane_offset) {\ + var/_cached_plane = new_value;\ + var/turf/_our_turf = get_turf(source);\ + if(_our_turf){\ + thing.plane = GET_NEW_PLANE(_cached_plane, GET_Z_PLANE_OFFSET(_our_turf.z));\ + }\ + else if(source) {\ + thing.plane = GET_NEW_PLANE(_cached_plane, PLANE_TO_OFFSET(source.plane));\ + }\ + else {\ + thing.plane = _cached_plane;\ + }\ + }\ + else {\ + thing.plane = new_value;\ + }\ + }\ + while (FALSE) + +// Now for macros that exist to get info from SSmapping +// Mostly about details of planes, or z levels + +/// Takes a z level, gets the lowest plane offset in its "stack" +#define GET_LOWEST_STACK_OFFSET(z) ((SSmapping.max_plane_offset) ? SSmapping.z_level_to_lowest_plane_offset[z] : 0) +/// Takes a plane, returns the canonical, unoffset plane it represents +#define PLANE_TO_TRUE(plane) ((SSmapping.plane_offset_to_true) ? SSmapping.plane_offset_to_true["[plane]"] : plane) +/// Takes a plane, returns the offset it uses +#define PLANE_TO_OFFSET(plane) ((SSmapping.plane_to_offset) ? SSmapping.plane_to_offset["[plane]"] : plane) +/// Takes a plane, returns TRUE if it is of critical priority, FALSE otherwise +#define PLANE_IS_CRITICAL(plane) ((SSmapping.plane_to_offset) ? !!SSmapping.critical_planes["[plane]"] : FALSE) +/// Takes a true plane, returns the offset planes that would canonically represent it +#define TRUE_PLANE_TO_OFFSETS(plane) ((SSmapping.true_to_offset_planes) ? SSmapping.true_to_offset_planes["[plane]"] : list(plane)) +/// Takes a render target and an offset, returns a canonical render target string for it +#define OFFSET_RENDER_TARGET(render_target, offset) (_OFFSET_RENDER_TARGET(render_target, SSmapping.render_offset_blacklist?["[render_target]"] ? 0 : offset)) +/// Helper macro for the above +/// Honestly just exists to make the pattern of render target strings more readable +#define _OFFSET_RENDER_TARGET(render_target, offset) ("[(render_target)] #[(offset)]") + +// Known issues: +// Potentially too much client load? Hard to tell due to not having a potato pc to hand. +// This is solvable with lowspec preferences, which would not be hard to implement +// Player popups will now render their effects, like overlay lights. this is fixable, but I've not gotten to it +// I think overlay lights can render on the wrong z layer. s fucked diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index e820e82df219..6a1cfd6191a3 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -390,9 +390,7 @@ xxx xxx xxx break set_adj_in_dir; \ /// Check that non border objects use to smooth against border objects /// Returns true if the smooth is acceptable, FALSE otherwise - #define BITMASK_ON_BORDER_CHECK(target, direction) \ - (!(target.smoothing_flags & SMOOTH_BORDER_OBJECT) || CAN_DIAGONAL_SMOOTH(target, src, REVERSE_DIR(direction)) \ - ) + #define BITMASK_ON_BORDER_CHECK(target, direction) (!(target.smoothing_flags & SMOOTH_BORDER_OBJECT) || CAN_DIAGONAL_SMOOTH(target, src, REVERSE_DIR(direction))) #define BORDER_FOUND(target, direction, direction_flag) new_junction |= CAN_DIAGONAL_SMOOTH(src, target, direction) // Border objects require an object as context, so we need a dummy. I'm sorry @@ -408,12 +406,7 @@ xxx xxx xxx // We're building 2 different types of smoothing searches here // One for standard bitmask smoothing (We provide a label so our macro can eary exit, as it wants to do) - #define SET_ADJ_IN_DIR(direction, direction_flag) \ - do { set_adj_in_dir: { \ - SEARCH_ADJ_IN_DIR(direction, direction_flag, BITMASK_FOUND, BITMASK_FOUND, BITMASK_ON_BORDER_CHECK) \ - }} \ - while(FALSE) - + #define SET_ADJ_IN_DIR(direction, direction_flag) do { set_adj_in_dir: { SEARCH_ADJ_IN_DIR(direction, direction_flag, BITMASK_FOUND, BITMASK_FOUND, BITMASK_ON_BORDER_CHECK) }} while(FALSE) // and another for border object work (Doesn't early exit because we can hit more then one direction by checking the same turf) #define SET_BORDER_ADJ_IN_DIR(direction) SEARCH_ADJ_IN_DIR(direction, direction, BORDER_FOUND, WORLD_BORDER_FOUND, BORDER_ON_BORDER_CHECK) @@ -498,7 +491,7 @@ xxx xxx xxx var/junction_dir = reverse_ndir(smoothing_junction) var/turned_adjacency = REVERSE_DIR(junction_dir) var/turf/neighbor_turf = get_step(src, turned_adjacency & (NORTH|SOUTH)) - var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, plane = FLOOR_PLANE) + var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, offset_spokesman = src, plane = FLOOR_PLANE) if(!neighbor_turf.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) neighbor_turf = get_step(src, turned_adjacency & (EAST|WEST)) @@ -656,7 +649,6 @@ xxx xxx xxx name = "smooth wall" icon = 'icons/turf/smooth_wall.dmi' icon_state = "smooth" - base_icon_state = "smooth" smoothing_flags = SMOOTH_CORNERS|SMOOTH_DIAGONAL_CORNERS|SMOOTH_BORDER smoothing_groups = null canSmoothWith = null diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index 9dd624b5cf84..6fd1915cb8c7 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -6,6 +6,7 @@ SUBSYSTEM_DEF(lighting) var/static/list/sources_queue = list() // List of lighting sources queued for update. var/static/list/corners_queue = list() // List of lighting corners queued for update. var/static/list/objects_queue = list() // List of lighting objects queued for update. + var/static/list/current_sources = list() loading_points = 6 SECONDS // Yogs -- loading times @@ -13,12 +14,6 @@ SUBSYSTEM_DEF(lighting) msg = "L:[length(sources_queue)]|C:[length(corners_queue)]|O:[length(objects_queue)]" return ..() -/datum/controller/subsystem/lighting/get_metrics() - . = ..() - .["queue_sources"] = length(sources_queue) - .["queue_corners"] = length(corners_queue) - .["queue_objects"] = length(objects_queue) - /datum/controller/subsystem/lighting/Initialize(timeofday) if(!initialized) if (CONFIG_GET(flag/starlight)) @@ -38,62 +33,95 @@ SUBSYSTEM_DEF(lighting) MC_SPLIT_TICK_INIT(3) if(!init_tick_checks) MC_SPLIT_TICK - var/list/queue = sources_queue + + if(!resumed) + current_sources = sources_queue + sources_queue = list() + + var/list/queue = current_sources var/i = 0 - for (i in 1 to length(queue)) + for (i < length(queue)) + i += 1 + var/datum/light_source/L = queue[i] - L.update_corners() + if(!QDELETED(L)) + L.needs_update = LIGHTING_NO_UPDATE + else + i -= 1 // update_corners() has removed L from the list, move back so we don't overflow or skip the next element - L.needs_update = LIGHTING_NO_UPDATE - + // We unroll TICK_CHECK here so we can clear out the queue to ensure any removals/additions when sleeping don't fuck us if(init_tick_checks) - CHECK_TICK - else if (MC_TICK_CHECK) + if(!TICK_CHECK) + continue + queue.Cut(1, i + 1) + i = 0 + stoplag() + else if(MC_TICK_CHECK) break - if (i) - queue.Cut(1, i+1) + if(i) + queue.Cut(1, i + 1) i = 0 if(!init_tick_checks) MC_SPLIT_TICK + // UPDATE CORNERS QUEUE queue = corners_queue - for (i in 1 to length(queue)) - var/datum/lighting_corner/C = queue[i] + while(i < length(queue)) //we don't use for loop here because i cannot be changed during an iteration + i += 1 + var/datum/lighting_corner/C = queue[i] C.needs_update = FALSE //update_objects() can call qdel if the corner is storing no data C.update_objects() + // We unroll TICK_CHECK here so we can clear out the queue to ensure any removals/additions when sleeping don't fuck us if(init_tick_checks) - CHECK_TICK - else if (MC_TICK_CHECK) + if(!TICK_CHECK) + continue + queue.Cut(1, i + 1) + i = 0 + stoplag() + else if(MC_TICK_CHECK) break - if (i) + if(i) queue.Cut(1, i+1) i = 0 - if(!init_tick_checks) MC_SPLIT_TICK + // UPDATE OBJECTS QUEUE queue = objects_queue - for (i in 1 to length(queue)) - var/datum/lighting_object/O = queue[i] + while(i < length(queue)) //we don't use for loop here because i cannot be changed during an iteration + i += 1 - if (QDELETED(O)) + var/datum/lighting_object/O = queue[i] + if(QDELETED(O)) continue - O.update() O.needs_update = FALSE + + // We unroll TICK_CHECK here so we can clear out the queue to ensure any removals/additions when sleeping don't fuck us if(init_tick_checks) - CHECK_TICK - else if (MC_TICK_CHECK) + if(!TICK_CHECK) + continue + queue.Cut(1, i + 1) + i = 0 + stoplag() + else if(MC_TICK_CHECK) break - if (i) - queue.Cut(1, i+1) + if(i) + queue.Cut(1, i + 1) /datum/controller/subsystem/lighting/Recover() initialized = SSlighting.initialized ..() + +///Yog metric tracking +/datum/controller/subsystem/lighting/get_metrics() + . = ..() + .["queue_sources"] = length(sources_queue) + .["queue_corners"] = length(corners_queue) + .["queue_objects"] = length(objects_queue) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 697a2fa61a3a..29d3a42e586f 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -27,23 +27,64 @@ SUBSYSTEM_DEF(mapping) var/list/station_minimaps = list() var/list/areas_in_z = list() + /// List of z level (as number) -> plane offset of that z level + /// Used to maintain the plane cube + var/list/z_level_to_plane_offset = list() + /// List of z level (as number) -> list of all z levels vertically connected to ours + /// Useful for fast grouping lookups and such + var/list/z_level_to_stack = list() + /// List of z level (as number) -> The lowest plane offset in that z stack + var/list/z_level_to_lowest_plane_offset = list() + // This pair allows for easy conversion between an offset plane, and its true representation + // Both are in the form "input plane" -> output plane(s) + /// Assoc list of string plane values to their true, non offset representation + var/list/plane_offset_to_true + /// Assoc list of true string plane values to a list of all potential offset planess + var/list/true_to_offset_planes + /// Assoc list of string plane to the plane's offset value + var/list/plane_to_offset + /// List of planes that do not allow for offsetting + var/list/plane_offset_blacklist + /// List of render targets that do not allow for offsetting + var/list/render_offset_blacklist + /// List of plane masters that are of critical priority + var/list/critical_planes + /// The largest plane offset we've generated so far + var/max_plane_offset = 0 var/loading_ruins = FALSE - var/list/turf/unused_turfs = list() //Not actually unused turfs they're unused but reserved for use for whatever requests them. "[zlevel_of_turf]" = list(turfs) - var/list/datum/turf_reservations //list of turf reservations - var/list/used_turfs = list() //list of turf = datum/turf_reservation + var/list/turf/unused_turfs = list() //Not actually unused turfs they're unused but reserved for use for whatever requests them. "[zlevel_of_turf]" = list(turfs) + var/list/datum/turf_reservations //list of turf reservations + var/list/used_turfs = list() //list of turf = datum/turf_reservation /// List of lists of turfs to reserve var/list/lists_to_reserve = list() + var/list/reservation_ready = list() var/clearing_reserved_turfs = FALSE // Z-manager stuff var/station_start // should only be used for maploading-related tasks var/space_levels_so_far = 0 - var/list/z_list + ///list of all z level datums in the order of their z (z level 1 is at index 1, etc.) + var/list/datum/space_level/z_list + ///list of all z level indices that form multiz connections and whether theyre linked up or down. + ///list of lists, inner lists are of the form: list("up or down link direction" = TRUE) + var/list/multiz_levels = list() var/datum/space_level/transit var/datum/space_level/empty_space var/num_of_res_levels = 1 + /// True when in the process of adding a new Z-level, global locking + var/adding_new_zlevel = FALSE + + ///shows the default gravity value for each z level. recalculated when gravity generators change. + ///List in the form: list(z level num = max generator gravity in that z level OR the gravity level trait) + var/list/gravity_by_z_level = list() + + /// list of traits and their associated z leves + var/list/z_trait_levels = list() + + /// list of lazy templates that have been loaded + var/list/loaded_lazy_templates //dlete dis once #39770 is resolved /datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig() @@ -612,6 +653,39 @@ GLOBAL_LIST_EMPTY(the_station_areas) var/area/A = B A.reg_in_areas_in_z() +/// Takes a z level datum, and tells the mapping subsystem to manage it +/// Also handles things like plane offset generation, and other things that happen on a z level to z level basis +/datum/controller/subsystem/mapping/proc/manage_z_level(datum/space_level/new_z, filled_with_space, contain_turfs = TRUE) + // First, add the z + z_list += new_z + + // Then we build our lookup lists + var/z_value = new_z.z_value + // We are guarenteed that we'll always grow bottom up + // Suck it jannies + z_level_to_plane_offset.len += 1 + z_level_to_lowest_plane_offset.len += 1 + //gravity_by_z_level.len += 1 + z_level_to_stack.len += 1 + //Bare minimum we have ourselves + z_level_to_stack[z_value] = list(z_value) + //0's the default value, we'll update it later if required + z_level_to_plane_offset[z_value] = 0 + z_level_to_lowest_plane_offset[z_value] = 0 + + // Now we check if this plane is offset or not + var/below_offset = new_z.traits[ZTRAIT_DOWN] + if(below_offset) + update_plane_tracking(new_z) + + if(contain_turfs) + build_area_turfs(z_value, filled_with_space) + + // And finally, misc global generation + + // We'll have to update this if offsets change, because we load lowest z to highest z + generate_lighting_appearance_by_z(z_value) + /datum/controller/subsystem/mapping/proc/build_area_turfs(z_level, space_guaranteed) // If we know this is filled with default tiles, we can use the default area // Faster @@ -623,3 +697,90 @@ GLOBAL_LIST_EMPTY(the_station_areas) for(var/turf/to_contain as anything in Z_TURFS(z_level)) var/area/our_area = to_contain.loc our_area.contained_turfs += to_contain + +/datum/controller/subsystem/mapping/proc/update_plane_tracking(datum/space_level/update_with) + // We're essentially going to walk down the stack of connected z levels, and set their plane offset as we go + var/plane_offset = 0 + var/datum/space_level/current_z = update_with + var/list/datum/space_level/levels_checked = list() + var/list/z_stack = list() + while(TRUE) + var/z_level = current_z.z_value + z_stack += z_level + z_level_to_plane_offset[z_level] = plane_offset + levels_checked += current_z + if(!current_z.traits[ZTRAIT_DOWN]) // If there's nothing below, stop looking + break + // Otherwise, down down down we go + current_z = z_list[z_level - 1] + plane_offset += 1 + + /// Updates the lowest offset value + for(var/datum/space_level/level_to_update in levels_checked) + z_level_to_lowest_plane_offset[level_to_update.z_value] = plane_offset + z_level_to_stack[level_to_update.z_value] = z_stack + + // This can be affected by offsets, so we need to update it + // PAIN + for(var/i in 1 to length(z_list)) + generate_lighting_appearance_by_z(i) + + var/old_max = max_plane_offset + max_plane_offset = max(max_plane_offset, plane_offset) + if(max_plane_offset == old_max) + return + + //generate_offset_lists(old_max + 1, max_plane_offset) + //SEND_SIGNAL(src, COMSIG_PLANE_OFFSET_INCREASE, old_max, max_plane_offset) + // Sanity check + if(max_plane_offset > MAX_EXPECTED_Z_DEPTH) + stack_trace("We've loaded a map deeper then the max expected z depth. Preferences won't cover visually disabling all of it!") + +/// Takes an offset to generate misc lists to, and a base to start from +/// Use this to react globally to maintain parity with plane offsets +// /datum/controller/subsystem/mapping/proc/generate_offset_lists(gen_from, new_offset) +// //create_plane_offsets(gen_from, new_offset) +// for(var/offset in gen_from to new_offset) +// GLOB.starlight_objects += starlight_object(offset) +// GLOB.starlight_overlays += starlight_overlay(offset) + +// // [Yog] pretty sure auxmos would shit if this was included +// for(var/datum/gas/gas_type as anything in GLOB.meta_gas_info) +// var/list/gas_info = GLOB.meta_gas_info[gas_type] +// if(initial(gas_type.moles_visible) != null) +// gas_info[META_GAS_OVERLAY] += generate_gas_overlays(gen_from, new_offset, gas_type) + +// /datum/controller/subsystem/mapping/proc/create_plane_offsets(gen_from, new_offset) +// for(var/plane_offset in gen_from to new_offset) +// for(var/atom/movable/screen/plane_master/master_type as anything in subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/rendering_plate) +// var/plane_to_use = initial(master_type.plane) +// var/string_real = "[plane_to_use]" + +// var/offset_plane = GET_NEW_PLANE(plane_to_use, plane_offset) +// var/string_plane = "[offset_plane]" + +// if(!initial(master_type.allows_offsetting)) +// plane_offset_blacklist[string_plane] = TRUE +// var/render_target = initial(master_type.render_target) +// if(!render_target) +// render_target = get_plane_master_render_base(initial(master_type.name)) +// render_offset_blacklist[render_target] = TRUE +// if(plane_offset != 0) +// continue + +// if(initial(master_type.critical) & PLANE_CRITICAL_DISPLAY) +// critical_planes[string_plane] = TRUE + +// plane_offset_to_true[string_plane] = plane_to_use +// plane_to_offset[string_plane] = plane_offset + +// if(!true_to_offset_planes[string_real]) +// true_to_offset_planes[string_real] = list() + +// true_to_offset_planes[string_real] |= offset_plane + +/proc/generate_lighting_appearance_by_z(z_level) + if(length(GLOB.default_lighting_underlays_by_z) < z_level) + GLOB.default_lighting_underlays_by_z.len = z_level + + GLOB.default_lighting_underlays_by_z[z_level] = mutable_appearance(LIGHTING_ICON, "transparent", z_level * 0.01, null, LIGHTING_PLANE, 255, RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM, offset_const = GET_Z_PLANE_OFFSET(z_level)) diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index eeb022a49352..c67a01a28d15 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -16,15 +16,38 @@ * icon - Our appearance's icon * icon_state - Our appearance's icon state * layer - Our appearance's layer + * atom/offset_spokesman - An atom to use as reference for the z position of this appearance. + * Only required if a plane is passed in. If this is not passed in we accept offset_const as a substitute * plane - The plane to use for the appearance. If this is not FLOAT_PLANE we require context for the offset to use * alpha - Our appearance's alpha * appearance_flags - Our appearance's appearance_flags + * offset_const - A constant to offset our plane by, so it renders on the right "z layer" **/ -/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE) +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, atom/offset_spokesman, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE, offset_const) var/mutable_appearance/appearance = new() appearance.icon = icon appearance.icon_state = icon_state appearance.layer = layer appearance.alpha = alpha appearance.appearance_flags |= appearance_flags + if(plane != FLOAT_PLANE) + // You need to pass in some non null object to reference + if(isatom(offset_spokesman)) + // Note, we are ok with null turfs, that's not an error condition we'll just default to 0, the error would be + // Not passing ANYTHING in, key difference + //SET_PLANE_EXPLICIT(appearance, plane, offset_spokesman) + + var/turf/our_turf = get_turf(offset_spokesman) + plane = MUTATE_PLANE(plane, our_turf) + // That or I'll let you pass in a static offset. Don't be stupid now + else if(!isnull(offset_const)) + //SET_PLANE_W_SCALAR(appearance, plane, offset_const) + + plane = GET_NEW_PLANE(plane, offset_const) + // otherwise if you're setting plane you better have the guts to back it up + else + stack_trace("No plane offset passed in as context for a non floating mutable appearance, things are gonna go to hell on multiz maps") + else if(!isnull(offset_spokesman) && !isatom(offset_spokesman)) + stack_trace("Why did you pass in offset_spokesman as [offset_spokesman]? We need an atom to properly offset planes") + return appearance diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index c0077e4fa619..ef32c85ea262 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -96,7 +96,7 @@ if(stat & BROKEN) overlay_state = "[icon_state]_broken" . += mutable_appearance(icon, overlay_state) - . += mutable_appearance(icon, overlay_state, layer, EMISSIVE_PLANE) + . += mutable_appearance(icon, overlay_state, layer, src, EMISSIVE_PLANE) /obj/machinery/computer/power_change() . = ..() diff --git a/code/game/machinery/mindmachine.dm b/code/game/machinery/mindmachine.dm index 80ccfd1f7ba6..9bae8a07e663 100644 --- a/code/game/machinery/mindmachine.dm +++ b/code/game/machinery/mindmachine.dm @@ -105,7 +105,7 @@ if(stat & BROKEN) overlay_state = "[icon_state]_broken" . += mutable_appearance(icon, overlay_state) - . += mutable_appearance(icon, overlay_state, layer, EMISSIVE_PLANE) + . += mutable_appearance(icon, overlay_state, layer, src, EMISSIVE_PLANE) /obj/machinery/mindmachine_hub/RefreshParts() // 2 matter bins. Reduce failure chance by 5 per tier. Results in 30 (tier 1) to 0 (tier 4). diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 6cd10564bdfb..17c90a1a98e3 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -2,7 +2,9 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf icon = 'icons/turf/floors.dmi' + vis_flags = VIS_INHERIT_ID // Important for interaction with and visualization of openspace. luminosity = 1 + //light_height = LIGHTING_HEIGHT_FLOOR var/dynamic_lighting = DYNAMIC_LIGHTING_ENABLED diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index 49b3ec20e454..5fdd74bfff74 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -8,14 +8,18 @@ ///the turf that our light is applied to var/turf/affected_turf +// Global list of lighting underlays, indexed by z level +GLOBAL_LIST_EMPTY(default_lighting_underlays_by_z) + /datum/lighting_object/New(turf/source) if(!isturf(source)) qdel(src, force=TRUE) stack_trace("a lighting object was assigned to [source], a non turf! ") return + . = ..() - current_underlay = mutable_appearance(LIGHTING_ICON, "atransparent", source.z, LIGHTING_PLANE, 255, RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM) + current_underlay = new(GLOB.default_lighting_underlays_by_z[source.z]) affected_turf = source if (affected_turf.lighting_object) @@ -23,7 +27,8 @@ stack_trace("a lighting object was assigned to a turf that already had a lighting object!") affected_turf.lighting_object = src - affected_turf.luminosity = 0 + // Default to fullbright, so things can "see" if they use view() before we update + affected_turf.luminosity = 1 for(var/turf/open/space/space_tile in RANGE_TURFS(1, affected_turf)) space_tile.update_starlight() @@ -88,12 +93,12 @@ if((rr & gr & br & ar) && (rg + gg + bg + ag + rb + gb + bb + ab == 8)) //anything that passes the first case is very likely to pass the second, and addition is a little faster in this case affected_turf.underlays -= current_underlay - current_underlay.icon_state = "atransparent" + current_underlay.icon_state = "lighting_transparent" current_underlay.color = null affected_turf.underlays += current_underlay else if(!set_luminosity) affected_turf.underlays -= current_underlay - current_underlay.icon_state = "adark" + current_underlay.icon_state = "lighting_dark" current_underlay.color = null affected_turf.underlays += current_underlay else diff --git a/code/modules/lighting/lighting_setup.dm b/code/modules/lighting/lighting_setup.dm index 4d365d6646d0..d7e7d44582b6 100644 --- a/code/modules/lighting/lighting_setup.dm +++ b/code/modules/lighting/lighting_setup.dm @@ -1,3 +1,4 @@ + /proc/create_all_lighting_objects() for(var/area/A as anything in GLOB.areas) if(!IS_DYNAMIC_LIGHTING(A)) @@ -6,7 +7,6 @@ for(var/turf/T as anything in A.get_contained_turfs()) if(!IS_DYNAMIC_LIGHTING(T)) continue - - new/datum/lighting_object(T) + new /datum/lighting_object(T) CHECK_TICK CHECK_TICK diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm index dbaad83f229b..094bb0abdb9f 100644 --- a/code/modules/mapping/space_management/zlevel_manager.dm +++ b/code/modules/mapping/space_management/zlevel_manager.dm @@ -4,6 +4,8 @@ return z_list = list() + z_level_to_plane_offset = list() + z_level_to_lowest_plane_offset = list() var/list/default_map_traits = DEFAULT_MAP_TRAITS if (default_map_traits.len != world.maxz) @@ -14,20 +16,22 @@ for (var/I in 1 to default_map_traits.len) var/list/features = default_map_traits[I] var/datum/space_level/S = new(I, features[DL_NAME], features[DL_TRAITS]) - build_area_turfs(I, FALSE) - z_list += S + manage_z_level(S, filled_with_space = FALSE) + //generate_z_level_linkages() // Default Zs don't use add_new_zlevel() so they don't automatically generate z-linkages. /datum/controller/subsystem/mapping/proc/add_new_zlevel(name, traits = list(), z_type = /datum/space_level, filled_with_space = TRUE, contain_turfs = TRUE) - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_Z, args) + UNTIL(!adding_new_zlevel) + adding_new_zlevel = TRUE var/new_z = z_list.len + 1 if (world.maxz < new_z) world.incrementMaxZ() CHECK_TICK // TODO: sleep here if the Z level needs to be cleared var/datum/space_level/S = new z_type(new_z, name, traits) - if(contain_turfs) - build_area_turfs(new_z, filled_with_space) - z_list += S + manage_z_level(S, filled_with_space = TRUE, contain_turfs = contain_turfs) + //generate_linkages_for_z_level(new_z) + adding_new_zlevel = FALSE + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_Z, S) return S /datum/controller/subsystem/mapping/proc/get_level(z) diff --git a/icons/effects/lighting_object.dmi b/icons/effects/lighting_object.dmi index 077043809d6492e464d706c471a9f9153e95552f..49d16c58acf8f0eb86d26a749069dfdd38302dbd 100644 GIT binary patch delta 59 zcmV-B0L1_04(kq(BmsbtC0#3WK$-z6L7|91#Ej delta 53 zcmV-50LuUC4&@GzBmsJnC0!*FONtWniVG5pQu9g(D^5u)%EqNiS;5uM1?)%w=;1J3 LpX#hyv8}!aJlz*` diff --git a/yogstation.dme b/yogstation.dme index f1e8b345d09d..7ad2403c178e 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -208,6 +208,8 @@ #include "code\__DEFINES\{yogs_defines}\wires.dm" #include "code\__HELPERS\_extools_api.dm" #include "code\__HELPERS\_lists.dm" +#include "code\__HELPERS\_planes.dm" +#include "code\__HELPERS\_planes.dm" #include "code\__HELPERS\_string_lists.dm" #include "code\__HELPERS\animations.dm" #include "code\__HELPERS\areas.dm" From 45806f0f4cc8d89a11b0f9ace3b4d9677c372b84 Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Mon, 11 Dec 2023 13:09:11 -0800 Subject: [PATCH 141/281] we have light --- code/__DEFINES/misc.dm | 20 --- code/__DEFINES/turfs.dm | 99 ++++++++++++-- code/__HELPERS/areas.dm | 3 + code/__HELPERS/game.dm | 8 -- code/__HELPERS/icon_smoothing.dm | 31 +---- code/__HELPERS/logging/_logging.dm | 12 -- code/controllers/subsystem/lighting.dm | 2 +- code/controllers/subsystem/mapping.dm | 121 ++++++++---------- code/datums/mutable_appearance.dm | 10 +- code/game/atom/_atom.dm | 9 -- code/game/atom/atom_initializing_EXPENSIVE.dm | 2 +- code/game/atom_invisibility.dm | 72 ----------- code/game/machinery/navbeacon.dm | 1 - code/game/turfs/turf.dm | 97 +++++++++----- code/modules/lighting/lighting_turf.dm | 12 ++ yogstation.dme | 3 - 16 files changed, 228 insertions(+), 274 deletions(-) delete mode 100644 code/game/atom_invisibility.dm diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 6c09f9fd4a86..16a155614d68 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -142,18 +142,6 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define HAS_SENSORS 1 #define LOCKED_SENSORS 2 -//Wet floor type flags. Stronger ones should be higher in number. -#define TURF_DRY (0) -#define TURF_WET_WATER (1<<0) -#define TURF_WET_PERMAFROST (1<<1) -#define TURF_WET_ICE (1<<2) -#define TURF_WET_LUBE (1<<3) -#define TURF_WET_SUPERLUBE (1<<4) - -#define IS_WET_OPEN_TURF(O) O.GetComponent(/datum/component/wet_floor) - -//Maximum amount of time, (in deciseconds) a tile can be wet for. -#define MAXIMUM_WET_TIME 5 MINUTES //unmagic-strings for types of polls #define POLLTYPE_OPTION "OPTION" @@ -162,17 +150,9 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define POLLTYPE_MULTI "MULTICHOICE" #define POLLTYPE_IRV "IRV" - - //subtypesof(), typesof() without the parent path #define subtypesof(typepath) ( typesof(typepath) - typepath ) -//Gets the turf this atom inhabits -#define get_turf(A) (get_step(A, 0)) - -//Same as above except gets the area instead -#define get_area(A) (isarea(A) ? A : get_step(A, 0)?.loc) - //Ghost orbit types: #define GHOST_ORBIT_CIRCLE "circle" #define GHOST_ORBIT_TRIANGLE "triangle" diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 1d3f6234dfc2..7b972abc20cb 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -3,22 +3,30 @@ #define CHANGETURF_FORCEOP (1<<2) #define CHANGETURF_SKIP (1<<3) // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE #define CHANGETURF_INHERIT_AIR (1<<4) // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR -#define CHANGETURF_RECALC_ADJACENT (1<<5) //Immediately recalc adjacent atmos turfs instead of queuing.TRAIT_UNDERFLOOR +#define CHANGETURF_RECALC_ADJACENT (1<<5) //Immediately recalc adjacent atmos turfs instead of queuing. #define CHANGETURF_TRAPDOOR_INDUCED (1<<6) // Caused by a trapdoor, for trapdoor to know that this changeturf was caused by itself -///Returns all currently loaded turfs -#define ALL_TURFS(...) block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz)) - #define IS_OPAQUE_TURF(turf) (turf.directional_opacity == ALL_CARDINALS) -/// The pipes, disposals, and wires are hidden -#define UNDERFLOOR_HIDDEN 0 -/// The pipes, disposals, and wires are visible but cannot be interacted with -#define UNDERFLOOR_VISIBLE 1 -/// The pipes, disposals, and wires are visible and can be interacted with -#define UNDERFLOOR_INTERACTABLE 2 +//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a +///Returns a list of turf in a square +#define RANGE_TURFS(RADIUS, CENTER) \ + RECT_TURFS(RADIUS, RADIUS, CENTER) + +#define RECT_TURFS(H_RADIUS, V_RADIUS, CENTER) \ + block( \ + locate(max((CENTER).x-(H_RADIUS),1), max((CENTER).y-(V_RADIUS),1), (CENTER).z), \ + locate(min((CENTER).x+(H_RADIUS),world.maxx), min((CENTER).y+(V_RADIUS),world.maxy), (CENTER).z) \ + ) + +///Returns all turfs in a zlevel +#define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL)) + +///Returns all currently loaded turfs +#define ALL_TURFS(...) block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz)) #define TURF_FROM_COORDS_LIST(List) (locate(List[1], List[2], List[3])) + /// Returns a list of turfs in the rectangle specified by BOTTOM LEFT corner and height/width, checks for being outside the world border for you #define CORNER_BLOCK(corner, width, height) CORNER_BLOCK_OFFSET(corner, width, height, 0, 0) @@ -31,3 +39,74 @@ CORNER_BLOCK_OFFSET(corner, width + 2, 1, -1, height) + \ CORNER_BLOCK_OFFSET(corner, 1, height, -1, 0) + \ CORNER_BLOCK_OFFSET(corner, 1, height, width, 0)) + +/// Returns a list of around us +#define TURF_NEIGHBORS(turf) (CORNER_BLOCK_OFFSET(turf, 3, 3, -1, -1) - turf) + +/// The pipes, disposals, and wires are hidden +#define UNDERFLOOR_HIDDEN 0 +/// The pipes, disposals, and wires are visible but cannot be interacted with +#define UNDERFLOOR_VISIBLE 1 +/// The pipes, disposals, and wires are visible and can be interacted with +#define UNDERFLOOR_INTERACTABLE 2 + +//Wet floor type flags. Stronger ones should be higher in number. +/// Turf is dry and mobs won't slip +#define TURF_DRY (0) +/// Turf has water on the floor and mobs will slip unless walking or using galoshes +#define TURF_WET_WATER (1<<0) +/// Turf has a thick layer of ice on the floor and mobs will slip in the direction until they bump into something +#define TURF_WET_PERMAFROST (1<<1) +/// Turf has a thin layer of ice on the floor and mobs will slip +#define TURF_WET_ICE (1<<2) +/// Turf has lube on the floor and mobs will slip +#define TURF_WET_LUBE (1<<3) +/// Turf has superlube on the floor and mobs will slip even if they are crawling +#define TURF_WET_SUPERLUBE (1<<4) + +/// Checks if a turf is wet +#define IS_WET_OPEN_TURF(O) O.GetComponent(/datum/component/wet_floor) + +/// Maximum amount of time, (in deciseconds) a tile can be wet for. +#define MAXIMUM_WET_TIME (5 MINUTES) + +/** + * Get the turf that `A` resides in, regardless of any containers. + * + * Use in favor of `A.loc` or `src.loc` so that things work correctly when + * stored inside an inventory, locker, or other container. + */ +#define get_turf(A) (get_step(A, 0)) + +/** + * Get the ultimate area of `A`, similarly to [get_turf]. + * + * Use instead of `A.loc.loc`. + */ +#define get_area(A) (isarea(A) ? A : get_step(A, 0)?.loc) + +#define TEMPORARY_THERMAL_CONDUCTIVITY 1 + +#define MAX_TEMPORARY_THERMAL_CONDUCTIVITY 1 +/// Turf will be passable if density is 0 +#define TURF_PATHING_PASS_DENSITY 0 +/// Turf will be passable depending on [CanAStarPass] return value +#define TURF_PATHING_PASS_PROC 1 +/// Turf is never passable +#define TURF_PATHING_PASS_NO 2 + +/// Define the alpha for holiday/colored tile decals +#define DECAL_ALPHA 60 +/// Generate horizontal striped color turf decals +#define PATTERN_DEFAULT "default" +/// Generate vertical striped color turf decals +#define PATTERN_VERTICAL_STRIPE "vertical" +/// Generate random color turf decals +#define PATTERN_RANDOM "random" +/// Generate rainbow color turf decals +#define PATTERN_RAINBOW "rainbow" + +/** + * Finds the midpoint of two given turfs. + */ +#define TURF_MIDPOINT(a, b) (locate(((a.x + b.x) * 0.5), (a.y + b.y) * 0.5, (a.z + b.z) * 0.5)) diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 06537f8e7123..24422b2d3313 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -100,6 +100,9 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(list(/area/engin newA.reg_in_areas_in_z() newA.add_delta_areas() + // if(!isarea(area_choice) && newA.static_lighting) + // newA.create_area_lighting_objects() + var/list/firedoors = oldA.firedoors for(var/door in firedoors) var/obj/machinery/door/firedoor/FD = door diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 54be14a5a6de..a8aea321d8ad 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -1,11 +1,3 @@ -//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a -#define RANGE_TURFS(RADIUS, CENTER) \ - block( \ - locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ - locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ - ) - -#define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL)) #define CULT_POLL_WAIT 2400 /proc/get_area_name(atom/X, format_text = FALSE, is_sensor = FALSE) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index f8c139204405..6a1cfd6191a3 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -212,36 +212,7 @@ xxx xxx xxx return FALSE icon_state = "" - return adjacencies - -//only walls should have a need to handle underlays -/turf/closed/wall/diagonal_smooth(adjacencies) - adjacencies = reverse_ndir(..()) - if(adjacencies) - var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, offset_spokesman = src, plane = FLOOR_PLANE) - var/list/U = list(underlay_appearance) - if(fixed_underlay) - if(fixed_underlay["space"]) - generate_space_underlay(underlay_appearance, src) - else - underlay_appearance.icon = fixed_underlay["icon"] - underlay_appearance.icon_state = fixed_underlay["icon_state"] - else - var/turned_adjacency = turn(adjacencies, 180) - var/turf/T = get_step(src, turned_adjacency) - if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) - T = get_step(src, turn(adjacencies, 135)) - if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) - T = get_step(src, turn(adjacencies, 225)) - //if all else fails, ask our own turf - if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency) && !get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) - underlay_appearance.icon = DEFAULT_UNDERLAY_ICON - underlay_appearance.icon_state = DEFAULT_UNDERLAY_ICON_STATE - underlays = U - - // Drop posters which were previously placed on this wall. - for(var/obj/structure/sign/poster/P in src) - P.roll_and_drop(src) + return TRUE /atom/proc/corners_cardinal_smooth(adjacencies) diff --git a/code/__HELPERS/logging/_logging.dm b/code/__HELPERS/logging/_logging.dm index f3d42fea6260..be71df957ae3 100644 --- a/code/__HELPERS/logging/_logging.dm +++ b/code/__HELPERS/logging/_logging.dm @@ -1,15 +1,3 @@ -//wrapper macros for easier grepping -#define DIRECT_OUTPUT(A, B) A << B -#define DIRECT_INPUT(A, B) A >> B -#define SEND_IMAGE(target, image) DIRECT_OUTPUT(target, image) -#define SEND_SOUND(target, sound) DIRECT_OUTPUT(target, sound) -#define SEND_TEXT(target, text) DIRECT_OUTPUT(target, text) -#define WRITE_FILE(file, text) DIRECT_OUTPUT(file, text) -#define READ_FILE(file, text) DIRECT_INPUT(file, text) -//This is an external call, "true" and "false" are how rust parses out booleans -#define WRITE_LOG(log, text) rustg_log_write(log, "\[[worldtime2text()]\] [text]", "true") -#define WRITE_LOG_NO_FORMAT(log, text) rustg_log_write(log, text, "false") - //print a warning message to world.log #define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [UNLINT(src)] usr: [usr].") /proc/warning(msg) diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index 6fd1915cb8c7..3caeb8fa7f88 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -40,7 +40,7 @@ SUBSYSTEM_DEF(lighting) var/list/queue = current_sources var/i = 0 - for (i < length(queue)) + while(i < length(queue)) i += 1 var/datum/light_source/L = queue[i] diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index c956d074fbba..5725adb82b65 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -11,7 +11,12 @@ SUBSYSTEM_DEF(mapping) var/datum/map_config/config var/datum/map_config/next_map_config + /// Has the map for the next round been voted for already? var/map_voted = FALSE + /// Has the map for the next round been deliberately chosen by an admin? + var/map_force_chosen = FALSE + /// Has the map vote been rocked? + var/map_vote_rocked = FALSE var/list/map_templates = list() @@ -23,36 +28,10 @@ SUBSYSTEM_DEF(mapping) var/list/shuttle_templates = list() var/list/shelter_templates = list() + var/list/holodeck_templates = list() var/list/station_minimaps = list() - /// The largest plane offset we've generated so far - var/max_plane_offset = 0 - - /// List of z level (as number) -> The lowest plane offset in that z stack - var/list/z_level_to_lowest_plane_offset = list() - - /// Assoc list of string plane to the plane's offset value - var/list/plane_to_offset - - /// Used to maintain the plane cube - var/list/z_level_to_plane_offset = list() - - /// List of planes that do not allow for offsetting - var/list/plane_offset_blacklist - - /// Assoc list of true string plane values to a list of all potential offset planess - var/list/true_to_offset_planes - - /// List of render targets that do not allow for offsetting - var/list/render_offset_blacklist - - /// List of plane masters that are of critical priority - var/list/critical_planes - - /// Assoc list of string plane values to their true, non offset representation - var/list/plane_offset_to_true - var/list/areas_in_z = list() /// List of z level (as number) -> plane offset of that z level /// Used to maintain the plane cube @@ -79,9 +58,6 @@ SUBSYSTEM_DEF(mapping) /// The largest plane offset we've generated so far var/max_plane_offset = 0 - ///list of lists, inner lists are of the form: list("up or down link direction" = TRUE) - var/list/multiz_levels = list() - var/loading_ruins = FALSE var/list/turf/unused_turfs = list() //Not actually unused turfs they're unused but reserved for use for whatever requests them. "[zlevel_of_turf]" = list(turfs) var/list/datum/turf_reservations //list of turf reservations @@ -92,6 +68,9 @@ SUBSYSTEM_DEF(mapping) var/list/reservation_ready = list() var/clearing_reserved_turfs = FALSE + ///All possible biomes in assoc list as type || instance + var/list/biomes = list() + // Z-manager stuff var/station_start // should only be used for maploading-related tasks var/space_levels_so_far = 0 @@ -760,7 +739,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) if(max_plane_offset == old_max) return - //generate_offset_lists(old_max + 1, max_plane_offset) + generate_offset_lists(old_max + 1, max_plane_offset) //SEND_SIGNAL(src, COMSIG_PLANE_OFFSET_INCREASE, old_max, max_plane_offset) // Sanity check if(max_plane_offset > MAX_EXPECTED_Z_DEPTH) @@ -768,46 +747,46 @@ GLOBAL_LIST_EMPTY(the_station_areas) /// Takes an offset to generate misc lists to, and a base to start from /// Use this to react globally to maintain parity with plane offsets -// /datum/controller/subsystem/mapping/proc/generate_offset_lists(gen_from, new_offset) -// //create_plane_offsets(gen_from, new_offset) -// for(var/offset in gen_from to new_offset) -// GLOB.starlight_objects += starlight_object(offset) -// GLOB.starlight_overlays += starlight_overlay(offset) - -// // [Yog] pretty sure auxmos would shit if this was included -// for(var/datum/gas/gas_type as anything in GLOB.meta_gas_info) -// var/list/gas_info = GLOB.meta_gas_info[gas_type] -// if(initial(gas_type.moles_visible) != null) -// gas_info[META_GAS_OVERLAY] += generate_gas_overlays(gen_from, new_offset, gas_type) - -// /datum/controller/subsystem/mapping/proc/create_plane_offsets(gen_from, new_offset) -// for(var/plane_offset in gen_from to new_offset) -// for(var/atom/movable/screen/plane_master/master_type as anything in subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/rendering_plate) -// var/plane_to_use = initial(master_type.plane) -// var/string_real = "[plane_to_use]" - -// var/offset_plane = GET_NEW_PLANE(plane_to_use, plane_offset) -// var/string_plane = "[offset_plane]" - -// if(!initial(master_type.allows_offsetting)) -// plane_offset_blacklist[string_plane] = TRUE -// var/render_target = initial(master_type.render_target) -// if(!render_target) -// render_target = get_plane_master_render_base(initial(master_type.name)) -// render_offset_blacklist[render_target] = TRUE -// if(plane_offset != 0) -// continue - -// if(initial(master_type.critical) & PLANE_CRITICAL_DISPLAY) -// critical_planes[string_plane] = TRUE - -// plane_offset_to_true[string_plane] = plane_to_use -// plane_to_offset[string_plane] = plane_offset - -// if(!true_to_offset_planes[string_real]) -// true_to_offset_planes[string_real] = list() - -// true_to_offset_planes[string_real] |= offset_plane +/datum/controller/subsystem/mapping/proc/generate_offset_lists(gen_from, new_offset) + create_plane_offsets(gen_from, new_offset) + for(var/offset in gen_from to new_offset) + GLOB.starlight_objects += starlight_object(offset) + GLOB.starlight_overlays += starlight_overlay(offset) + + // [Yog] pretty sure auxmos would shit if this was included + // for(var/datum/gas/gas_type as anything in GLOB.meta_gas_info) + // var/list/gas_info = GLOB.meta_gas_info[gas_type] + // if(initial(gas_type.moles_visible) != null) + // gas_info[META_GAS_OVERLAY] += generate_gas_overlays(gen_from, new_offset, gas_type) + +/datum/controller/subsystem/mapping/proc/create_plane_offsets(gen_from, new_offset) + for(var/plane_offset in gen_from to new_offset) + for(var/atom/movable/screen/plane_master/master_type as anything in subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/rendering_plate) + var/plane_to_use = initial(master_type.plane) + var/string_real = "[plane_to_use]" + + var/offset_plane = GET_NEW_PLANE(plane_to_use, plane_offset) + var/string_plane = "[offset_plane]" + + if(!initial(master_type.allows_offsetting)) + plane_offset_blacklist[string_plane] = TRUE + var/render_target = initial(master_type.render_target) + if(!render_target) + render_target = get_plane_master_render_base(initial(master_type.name)) + render_offset_blacklist[render_target] = TRUE + if(plane_offset != 0) + continue + + if(initial(master_type.critical) & PLANE_CRITICAL_DISPLAY) + critical_planes[string_plane] = TRUE + + plane_offset_to_true[string_plane] = plane_to_use + plane_to_offset[string_plane] = plane_offset + + if(!true_to_offset_planes[string_real]) + true_to_offset_planes[string_real] = list() + + true_to_offset_planes[string_real] |= offset_plane /proc/generate_lighting_appearance_by_z(z_level) if(length(GLOB.default_lighting_underlays_by_z) < z_level) diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index c67a01a28d15..0a63b4f08fa4 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -35,15 +35,15 @@ if(isatom(offset_spokesman)) // Note, we are ok with null turfs, that's not an error condition we'll just default to 0, the error would be // Not passing ANYTHING in, key difference - //SET_PLANE_EXPLICIT(appearance, plane, offset_spokesman) + SET_PLANE_EXPLICIT(appearance, plane, offset_spokesman) - var/turf/our_turf = get_turf(offset_spokesman) - plane = MUTATE_PLANE(plane, our_turf) + // var/turf/our_turf = get_turf(offset_spokesman) + // plane = MUTATE_PLANE(plane, our_turf) // That or I'll let you pass in a static offset. Don't be stupid now else if(!isnull(offset_const)) - //SET_PLANE_W_SCALAR(appearance, plane, offset_const) + SET_PLANE_W_SCALAR(appearance, plane, offset_const) - plane = GET_NEW_PLANE(plane, offset_const) + //plane = GET_NEW_PLANE(plane, offset_const) // otherwise if you're setting plane you better have the guts to back it up else stack_trace("No plane offset passed in as context for a non floating mutable appearance, things are gonna go to hell on multiz maps") diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index 8f4a4e1aa0bc..48b6b152669a 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -1224,15 +1224,6 @@ /atom/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) return -/atom/movable/proc/add_filter(name,priority,list/params) - if(!filter_data) - filter_data = list() - var/list/p = params.Copy() - p["priority"] = priority - filter_data[name] = p - update_filters() - - /obj/item/update_filters() . = ..() for(var/X in actions) diff --git a/code/game/atom/atom_initializing_EXPENSIVE.dm b/code/game/atom/atom_initializing_EXPENSIVE.dm index d4055267b2ca..84c9a322ec99 100644 --- a/code/game/atom/atom_initializing_EXPENSIVE.dm +++ b/code/game/atom/atom_initializing_EXPENSIVE.dm @@ -121,7 +121,7 @@ if(color) add_atom_colour(color, FIXED_COLOUR_PRIORITY) - if (light_system == STATIC_LIGHT && light_power && light_range) + if (light_power && light_range) update_light() SETUP_SMOOTHING() diff --git a/code/game/atom_invisibility.dm b/code/game/atom_invisibility.dm deleted file mode 100644 index 53fbe895817c..000000000000 --- a/code/game/atom_invisibility.dm +++ /dev/null @@ -1,72 +0,0 @@ -// Index defines -#define INVISIBILITY_VALUE 1 -#define INVISIBILITY_PRIORITY 2 - -/atom - VAR_PRIVATE/list/invisibility_sources - VAR_PRIVATE/current_invisibility_priority = -INFINITY - -/atom/proc/RecalculateInvisibility() - PRIVATE_PROC(TRUE) - - if(!invisibility_sources) - current_invisibility_priority = -INFINITY - invisibility = initial(invisibility) - return - - var/highest_priority - var/list/highest_priority_invisibility_data - for(var/entry in invisibility_sources) - var/list/priority_data - if(islist(entry)) - priority_data = entry - else - priority_data = invisibility_sources[entry] - - var/priority = priority_data[INVISIBILITY_PRIORITY] - if(highest_priority > priority) // In the case of equal priorities, we use the last thing in the list so that more recent changes apply first - continue - - highest_priority = priority - highest_priority_invisibility_data = priority_data - - current_invisibility_priority = highest_priority - invisibility = highest_priority_invisibility_data[INVISIBILITY_VALUE] - -/** - * Sets invisibility according to priority. - * If you want to be able to undo the value you set back to what it would be otherwise, - * you should provide an id here and remove it using RemoveInvisibility(id) - */ -/atom/proc/SetInvisibility(desired_value, id, priority=0) - if(!invisibility_sources) - invisibility_sources = list() - - if(id) - invisibility_sources[id] = list(desired_value, priority) - else - invisibility_sources += list(list(desired_value, priority)) - - if(current_invisibility_priority > priority) - return - - RecalculateInvisibility() - -/// Removes the specified invisibility source from the tracker -/atom/proc/RemoveInvisibility(id) - if(!invisibility_sources) - return - - var/list/priority_data = invisibility_sources[id] - invisibility_sources -= id - - if(length(invisibility_sources) == 0) - invisibility_sources = null - - if(current_invisibility_priority > priority_data[INVISIBILITY_PRIORITY]) - return - - RecalculateInvisibility() - -#undef INVISIBILITY_VALUE -#undef INVISIBILITY_PRIORITY diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index e4e72ecabbaa..287e5ab40616 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -7,7 +7,6 @@ icon_state = "navbeacon0-f" name = "navigation beacon" desc = "A radio beacon used for bot navigation." - level = 1 // underfloor layer = LOW_OBJ_LAYER max_integrity = 500 armor = list(MELEE = 70, BULLET = 70, LASER = 70, ENERGY = 70, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 106fdd461ed7..b24a289f3845 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -1,11 +1,11 @@ GLOBAL_LIST_EMPTY(station_turfs) +/// Any floor or wall. What makes up the station and the rest of the map. /turf icon = 'icons/turf/floors.dmi' vis_flags = VIS_INHERIT_ID // Important for interaction with and visualization of openspace. - level = 1 luminosity = 1 - //light_height = LIGHTING_HEIGHT_FLOOR + light_height = LIGHTING_HEIGHT_FLOOR var/dynamic_lighting = DYNAMIC_LIGHTING_ENABLED @@ -17,23 +17,18 @@ GLOBAL_LIST_EMPTY(station_turfs) var/list/baseturfs = /turf/baseturf_bottom var/initial_temperature = T20C - var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed - var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to - /// If there's a tile over a basic floor that can be ripped out - var/overfloor_placed = FALSE - /// How accessible underfloor pieces such as wires, pipes, etc are on this turf. Can be HIDDEN, VISIBLE, or INTERACTABLE. - var/underfloor_accessibility = UNDERFLOOR_HIDDEN - var/blocks_air = FALSE + ///Used for fire, if a melting temperature was reached, it will be destroyed + var/to_be_destroyed = 0 + ///The max temperature of the fire which it was subjected to + var/max_fire_temperature_sustained = 0 + var/blocks_air = FALSE + /// If there's a tile over a basic floor that can be ripped out var/overfloor_placed = FALSE /// How accessible underfloor pieces such as wires, pipes, etc are on this turf. Can be HIDDEN, VISIBLE, or INTERACTABLE. var/underfloor_accessibility = UNDERFLOOR_HIDDEN - ///Bool, whether this turf will always be illuminated no matter what area it is in - ///Makes it look blue, be warned - var/space_lit = FALSE - var/force_no_gravity = TRUE flags_1 = CAN_BE_DIRTY_1 /// If there is a lattice underneat this turf. Used for the attempt_lattice_replacement proc to determine if it should place lattice. var/lattice_underneath = TRUE @@ -41,12 +36,12 @@ GLOBAL_LIST_EMPTY(station_turfs) var/turf_flags = NONE var/list/image/blueprint_data //for the station blueprints, images of objects eg: pipes - + var/explosion_level = 0 //for preventing explosion dodging var/explosion_id = 0 var/list/explosion_throw_details - var/requires_activation //add to air processing after initialize? + var/requires_activation //add to air processing after initialize? var/changing_turf = FALSE var/bullet_bounce_sound = 'sound/weapons/bulletremove.ogg' //sound played when a shell casing is ejected ontop of the turf. @@ -61,6 +56,10 @@ GLOBAL_LIST_EMPTY(station_turfs) ///Lumcount added by sources other than lighting datum objects, such as the overlay lighting component. var/dynamic_lumcount = 0 + ///Bool, whether this turf will always be illuminated no matter what area it is in + ///Makes it look blue, be warned + var/space_lit = FALSE + var/tmp/lighting_corners_initialised = FALSE ///Our lighting object. @@ -71,11 +70,39 @@ GLOBAL_LIST_EMPTY(station_turfs) var/tmp/datum/lighting_corner/lighting_corner_SW var/tmp/datum/lighting_corner/lighting_corner_NW + ///Which directions does this turf block the vision of, taking into account both the turf's opacity and the movable opacity_sources. var/directional_opacity = NONE ///Lazylist of movable atoms providing opacity sources. var/list/atom/movable/opacity_sources + ///the holodeck can load onto this turf if TRUE + var/holodeck_compatible = FALSE + + /// If this turf contained an RCD'able object (or IS one, for walls) + /// but is now destroyed, this will preserve the value. + /// See __DEFINES/construction.dm for RCD_MEMORY_*. + var/rcd_memory + ///whether or not this turf forces movables on it to have no gravity (unless they themselves have forced gravity) + var/force_no_gravity = FALSE + + /// How pathing algorithm will check if this turf is passable by itself (not including content checks). By default it's just density check. + /// WARNING: Currently to use a density shortcircuiting this does not support dense turfs with special allow through function + var/pathing_pass_method = TURF_PATHING_PASS_DENSITY + +#if defined(UNIT_TESTS) || defined(SPACEMAN_DMM) + /// For the area_contents list unit test + /// Allows us to know our area without needing to preassign it + /// Sorry for the mess + var/area/in_contents_of +#endif + /// How much explosive resistance this turf is providing to itself + /// Defaults to -1, interpreted as initial(explosive_resistance) + /// This is an optimization to prevent turfs from needing to set these on init + /// This would either be expensive, or impossible to manage. Let's just avoid it yes? + /// Never directly access this, use get_explosive_block() instead + var/inherent_explosive_resistance = -1 + /turf/vv_edit_var(var_name, new_value) var/static/list/banned_edits = list("x", "y", "z") if(var_name in banned_edits) @@ -88,8 +115,22 @@ GLOBAL_LIST_EMPTY(station_turfs) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 - // by default, vis_contents is inherited from the turf that was here before - vis_contents.Cut() + /// We do NOT use the shortcut here, because this is faster + if(SSmapping.max_plane_offset) + if(!SSmapping.plane_offset_blacklist["[plane]"]) + plane = plane - (PLANE_RANGE * SSmapping.z_level_to_plane_offset[z]) + + var/turf/T = GET_TURF_ABOVE(src) + if(T) + T.multiz_turf_new(src, DOWN) + T = GET_TURF_BELOW(src) + if(T) + T.multiz_turf_new(src, UP) + + // by default, vis_contents is inherited from the turf that was here before. + // Checking length(vis_contents) in a proc this hot has huge wins for performance. + if (length(vis_contents)) + vis_contents.Cut() assemble_baseturfs() @@ -102,30 +143,22 @@ GLOBAL_LIST_EMPTY(station_turfs) visibilityChanged() - for(var/atom/movable/AM in src) - Entered(AM) + for(var/atom/movable/content as anything in src) + Entered(content, null) var/area/our_area = loc - if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(our_area)) - add_overlay(/obj/effect/fullbright) + if(!our_area.area_has_base_lighting && space_lit) //Only provide your own lighting if the area doesn't for you + add_overlay(GLOB.starlight_overlays[GET_TURF_PLANE_OFFSET(src) + 1]) if(requires_activation) ImmediateCalculateAdjacentTurfs() if(color) add_atom_colour(color, FIXED_COLOUR_PRIORITY) - if (light_system == STATIC_LIGHT && light_power && light_range) + + if(light_power && light_range) update_light() - var/turf/T = GET_TURF_ABOVE(src) - if(T) - T.multiz_turf_new(src, DOWN) - SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, DOWN) - T = GET_TURF_BELOW(src) - if(T) - T.multiz_turf_new(src, UP) - SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, UP) - if (opacity) directional_opacity = ALL_CARDINALS @@ -193,8 +226,10 @@ GLOBAL_LIST_EMPTY(station_turfs) user.Move_Pulled(src) /turf/proc/multiz_turf_del(turf/T, dir) + SEND_SIGNAL(src, COMSIG_TURF_MULTIZ_DEL, T, dir) /turf/proc/multiz_turf_new(turf/T, dir) + SEND_SIGNAL(src, COMSIG_TURF_MULTIZ_NEW, T, dir) //zPassIn doesn't necessarily pass an atom! //direction is direction of travel of air diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index 871099973730..e6f2292f7db5 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -1,3 +1,15 @@ +/area + luminosity = 1 + ///List of mutable appearances we underlay to show light + ///In the form plane offset + 1 -> appearance to use + var/list/mutable_appearance/lighting_effects = null + ///Whether this area has a currently active base lighting, bool + var/area_has_base_lighting = FALSE + ///alpha 0-255 of lighting_effect and thus baselighting intensity + var/base_lighting_alpha = 0 + ///The colour of the light acting on this area + var/base_lighting_color = COLOR_WHITE + // Causes any affecting light sources to be queued for a visibility update, for example a door got opened. /turf/proc/reconsider_lights() lighting_corner_NE?.vis_update() diff --git a/yogstation.dme b/yogstation.dme index a70aa52facb0..c81a1268ec8c 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -216,7 +216,6 @@ #include "code\__DEFINES\{yogs_defines}\wires.dm" #include "code\__HELPERS\_extools_api.dm" #include "code\__HELPERS\_lists.dm" -#include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_planes.dm" #include "code\__HELPERS\_string_lists.dm" #include "code\__HELPERS\animations.dm" @@ -851,8 +850,6 @@ #include "code\datums\wounds\slash.dm" #include "code\datums\wounds\scars\_scars.dm" #include "code\game\alternate_appearance.dm" -#include "code\game\atom_invisibility.dm" -#include "code\game\atoms.dm" #include "code\game\atoms_movable.dm" #include "code\game\communications.dm" #include "code\game\data_huds.dm" From d63b90c8777b48d0fa2221d5c45d69468bf8abf0 Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Mon, 11 Dec 2023 13:13:44 -0800 Subject: [PATCH 142/281] sort turfs better --- code/game/turfs/{closed.dm => closed/_closed.dm} | 0 code/game/turfs/{open.dm => open/_open.dm} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename code/game/turfs/{closed.dm => closed/_closed.dm} (100%) rename code/game/turfs/{open.dm => open/_open.dm} (100%) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed/_closed.dm similarity index 100% rename from code/game/turfs/closed.dm rename to code/game/turfs/closed/_closed.dm diff --git a/code/game/turfs/open.dm b/code/game/turfs/open/_open.dm similarity index 100% rename from code/game/turfs/open.dm rename to code/game/turfs/open/_open.dm From 743cfd8d8f0af2472ce53372f04c46cdf02d4e02 Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Mon, 11 Dec 2023 13:32:41 -0800 Subject: [PATCH 143/281] big fucking reorganize --- code/game/turfs/{baseturfs => }/baseturfs.dm | 0 code/game/turfs/closed/_closed.dm | 203 ------------------ code/game/turfs/closed/indestructible.dm | 202 +++++++++++++++++ .../turfs/{simulated => closed}/minerals.dm | 0 .../wall/mineral_walls.dm | 0 .../{simulated => closed}/wall/misc_walls.dm | 0 .../{simulated => closed}/wall/reinf_walls.dm | 0 .../game/turfs/{simulated => closed}/walls.dm | 0 code/game/turfs/{simulated => open}/chasm.dm | 0 .../turfs/{simulated => open}/dirtystation.dm | 0 code/game/turfs/{simulated => open}/floor.dm | 0 .../{simulated => open}/floor/fancy_floor.dm | 0 .../{simulated => open}/floor/light_floor.dm | 0 .../floor/mineral_floor.dm | 0 .../{simulated => open}/floor/misc_floor.dm | 0 .../floor/plasteel_floor.dm | 0 .../{simulated => open}/floor/plating.dm | 0 .../floor/plating/asteroid.dm | 0 .../{simulated => open}/floor/plating/dirt.dm | 0 .../floor/plating/misc_plating.dm | 0 .../{simulated => open}/floor/reinf_floor.dm | 0 code/game/turfs/{simulated => open}/lava.dm | 0 .../turfs/{openspace => open}/openspace.dm | 0 .../turfs/{simulated => open}/reebe_void.dm | 0 code/game/turfs/{simulated => open}/river.dm | 0 code/game/turfs/{ => open}/space/space.dm | 0 code/game/turfs/{ => open}/space/transit.dm | 0 code/game/turfs/{simulated => open}/water.dm | 0 yogstation.dme | 57 ++--- 29 files changed, 231 insertions(+), 231 deletions(-) rename code/game/turfs/{baseturfs => }/baseturfs.dm (100%) create mode 100644 code/game/turfs/closed/indestructible.dm rename code/game/turfs/{simulated => closed}/minerals.dm (100%) rename code/game/turfs/{simulated => closed}/wall/mineral_walls.dm (100%) rename code/game/turfs/{simulated => closed}/wall/misc_walls.dm (100%) rename code/game/turfs/{simulated => closed}/wall/reinf_walls.dm (100%) rename code/game/turfs/{simulated => closed}/walls.dm (100%) rename code/game/turfs/{simulated => open}/chasm.dm (100%) rename code/game/turfs/{simulated => open}/dirtystation.dm (100%) rename code/game/turfs/{simulated => open}/floor.dm (100%) rename code/game/turfs/{simulated => open}/floor/fancy_floor.dm (100%) rename code/game/turfs/{simulated => open}/floor/light_floor.dm (100%) rename code/game/turfs/{simulated => open}/floor/mineral_floor.dm (100%) rename code/game/turfs/{simulated => open}/floor/misc_floor.dm (100%) rename code/game/turfs/{simulated => open}/floor/plasteel_floor.dm (100%) rename code/game/turfs/{simulated => open}/floor/plating.dm (100%) rename code/game/turfs/{simulated => open}/floor/plating/asteroid.dm (100%) rename code/game/turfs/{simulated => open}/floor/plating/dirt.dm (100%) rename code/game/turfs/{simulated => open}/floor/plating/misc_plating.dm (100%) rename code/game/turfs/{simulated => open}/floor/reinf_floor.dm (100%) rename code/game/turfs/{simulated => open}/lava.dm (100%) rename code/game/turfs/{openspace => open}/openspace.dm (100%) rename code/game/turfs/{simulated => open}/reebe_void.dm (100%) rename code/game/turfs/{simulated => open}/river.dm (100%) rename code/game/turfs/{ => open}/space/space.dm (100%) rename code/game/turfs/{ => open}/space/transit.dm (100%) rename code/game/turfs/{simulated => open}/water.dm (100%) diff --git a/code/game/turfs/baseturfs/baseturfs.dm b/code/game/turfs/baseturfs.dm similarity index 100% rename from code/game/turfs/baseturfs/baseturfs.dm rename to code/game/turfs/baseturfs.dm diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index 9473a439eb0c..546449267f50 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -18,206 +18,3 @@ . = ..() if(istype(mover) && (mover.pass_flags & PASSCLOSEDTURF)) return TRUE - -/turf/closed/indestructible - name = "wall" - icon = 'icons/turf/walls.dmi' - explosion_block = 50 - flags_1 = NOJAUNT_1 | CAN_BE_DIRTY_1 | NO_RUST - -/turf/closed/indestructible/TerraformTurf(path, new_baseturf, flags, defer_change = FALSE, ignore_air = FALSE) - return - -/turf/closed/indestructible/acid_act(acidpwr, acid_volume, acid_id) - return 0 - -/turf/closed/indestructible/Melt() - to_be_destroyed = FALSE - return src - -/turf/closed/indestructible/singularity_act() - return - -/turf/closed/indestructible/abductor/attackby(obj/item/attacking_item, mob/user, params) - if(istype(attacking_item, /obj/item/poster) && Adjacent(user)) - return place_poster(attacking_item, user) - - return ..() - -/turf/closed/indestructible/oldshuttle - name = "strange shuttle wall" - icon = 'icons/turf/shuttleold.dmi' - icon_state = "block" - -/turf/closed/indestructible/sandstone - name = "sandstone wall" - desc = "A wall with sandstone plating. Rough." - icon = 'icons/turf/walls/sandstone_wall.dmi' - icon_state = "sandstone" - baseturfs = /turf/closed/indestructible/sandstone - smoothing_flags = SMOOTH_BITMASK - -/turf/closed/indestructible/oldshuttle/corner - icon_state = "corner" - -/turf/closed/indestructible/splashscreen - name = "Space Station 13" - icon = 'icons/blanks/blank_title.png' - icon_state = "" - layer = FLY_LAYER - bullet_bounce_sound = null - -/turf/closed/indestructible/splashscreen/New() - SStitle.splash_turf = src - if(SStitle.icon) - icon = SStitle.icon - ..() - -/turf/closed/indestructible/splashscreen/vv_edit_var(var_name, var_value) - . = ..() - if(.) - switch(var_name) - if("icon") - SStitle.icon = icon - -/turf/closed/indestructible/riveted - icon = 'icons/turf/walls/riveted.dmi' - icon_state = "riveted" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS - canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS - -/turf/closed/indestructible/syndicate - icon = 'icons/turf/walls/plastitanium_wall.dmi' - icon_state = "map-shuttle" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_SYNDICATE_WALLS - canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_PLASTITANIUM_WALLS + SMOOTH_GROUP_SYNDICATE_WALLS - -/turf/closed/indestructible/riveted/uranium - icon = 'icons/turf/walls/uranium_wall.dmi' - icon_state = "uranium" - smoothing_flags = SMOOTH_BITMASK - -/turf/closed/indestructible/abductor - icon_state = "alien1" - -/turf/closed/indestructible/opshuttle - icon_state = "wall3" - -/turf/closed/indestructible/fakeglass - name = "window" - icon = 'icons/obj/smooth_structures/reinforced_window.dmi' - icon_state = "fake_window" - opacity = FALSE - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE - canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE - -/turf/closed/indestructible/fakeglass/Initialize(mapload) - . = ..() - icon_state = null //set the icon state to null, so our base state isn't visible - underlays += mutable_appearance('icons/obj/structures.dmi', "grille") //add a grille underlay - underlays += mutable_appearance('icons/turf/floors.dmi', "plating") //add the plating underlay, below the grille - -/turf/closed/indestructible/opsglass - name = "window" - icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' - icon_state = "plastitanium_window" - opacity = FALSE - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM - canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM - -/turf/closed/indestructible/opsglass/Initialize(mapload) - . = ..() - icon_state = null - underlays += mutable_appearance('icons/obj/structures.dmi', "grille") - underlays += mutable_appearance('icons/turf/floors.dmi', "plating") - -/turf/closed/indestructible/fakedoor - name = "CentCom Access" - icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' - icon_state = "fake_door" - -/turf/closed/indestructible/fakedoor/poddoor - name = "blast door" - icon = 'icons/obj/doors/blastdoor.dmi' - icon_state = "closed" - -/turf/closed/indestructible/rock - name = "dense rock" - desc = "An extremely densely-packed rock, most mining tools or explosives would never get through this." - icon = 'icons/turf/mining.dmi' - icon_state = "rock" - -/turf/closed/indestructible/rock/snow - name = "mountainside" - desc = "An extremely densely-packed rock, sheeted over with centuries worth of ice and snow." - icon = 'icons/turf/walls.dmi' - icon_state = "snowrock" - bullet_sizzle = TRUE - bullet_bounce_sound = null - -/turf/closed/indestructible/rock/snow/ice - name = "iced rock" - desc = "Extremely densely-packed sheets of ice and rock, forged over the years of the harsh cold." - icon = 'icons/turf/walls.dmi' - icon_state = "icerock" - -/turf/closed/indestructible/rock/wood - name = "wooden wall" - desc = "A wall with wooden plating. Stiff." - icon = 'icons/turf/walls/wood_wall.dmi' - icon_state = "wood" - -/turf/closed/indestructible/paper - name = "thick paper wall" - desc = "A wall layered with impenetrable sheets of paper." - icon = 'icons/turf/walls.dmi' - icon_state = "paperwall" - -/turf/closed/indestructible/vault - name = "sturdy wall" - desc = "A huge chunk of metal used to separate rooms." - icon = 'icons/turf/walls.dmi' - icon_state = "rockvault" - -/turf/closed/indestructible/necropolis - name = "necropolis wall" - desc = "A seemingly impenetrable wall." - icon = 'icons/turf/walls.dmi' - icon_state = "necro" - explosion_block = 50 - baseturfs = /turf/closed/indestructible/necropolis - -/turf/closed/indestructible/necropolis/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - underlay_appearance.icon = 'icons/turf/floors.dmi' - underlay_appearance.icon_state = "necro1" - return TRUE - -/turf/closed/indestructible/riveted/boss - name = "necropolis wall" - desc = "A thick, seemingly indestructible stone wall." - icon = 'icons/turf/walls/boss_wall.dmi' - icon_state = "boss_wall-0" - base_icon_state = "boss_wall" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_BOSS_WALLS - canSmoothWith = SMOOTH_GROUP_BOSS_WALLS - explosion_block = 50 - baseturfs = /turf/closed/indestructible/riveted/boss - -/turf/closed/indestructible/riveted/boss/see_through - opacity = FALSE - -/turf/closed/indestructible/riveted/boss/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - underlay_appearance.icon = 'icons/turf/floors.dmi' - underlay_appearance.icon_state = "basalt" - return TRUE - -/turf/closed/indestructible/riveted/hierophant - name = "wall" - desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern." - icon = 'icons/turf/walls/hierophant_wall.dmi' - icon_state = "wall" diff --git a/code/game/turfs/closed/indestructible.dm b/code/game/turfs/closed/indestructible.dm new file mode 100644 index 000000000000..4a2012046cf8 --- /dev/null +++ b/code/game/turfs/closed/indestructible.dm @@ -0,0 +1,202 @@ +/turf/closed/indestructible + name = "wall" + icon = 'icons/turf/walls.dmi' + explosion_block = 50 + flags_1 = NOJAUNT_1 | CAN_BE_DIRTY_1 | NO_RUST + +/turf/closed/indestructible/TerraformTurf(path, new_baseturf, flags, defer_change = FALSE, ignore_air = FALSE) + return + +/turf/closed/indestructible/acid_act(acidpwr, acid_volume, acid_id) + return 0 + +/turf/closed/indestructible/Melt() + to_be_destroyed = FALSE + return src + +/turf/closed/indestructible/singularity_act() + return + +/turf/closed/indestructible/abductor/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/poster) && Adjacent(user)) + return place_poster(attacking_item, user) + + return ..() + +/turf/closed/indestructible/oldshuttle + name = "strange shuttle wall" + icon = 'icons/turf/shuttleold.dmi' + icon_state = "block" + +/turf/closed/indestructible/sandstone + name = "sandstone wall" + desc = "A wall with sandstone plating. Rough." + icon = 'icons/turf/walls/sandstone_wall.dmi' + icon_state = "sandstone" + baseturfs = /turf/closed/indestructible/sandstone + smoothing_flags = SMOOTH_BITMASK + +/turf/closed/indestructible/oldshuttle/corner + icon_state = "corner" + +/turf/closed/indestructible/splashscreen + name = "Space Station 13" + icon = 'icons/blanks/blank_title.png' + icon_state = "" + layer = FLY_LAYER + bullet_bounce_sound = null + +/turf/closed/indestructible/splashscreen/New() + SStitle.splash_turf = src + if(SStitle.icon) + icon = SStitle.icon + ..() + +/turf/closed/indestructible/splashscreen/vv_edit_var(var_name, var_value) + . = ..() + if(.) + switch(var_name) + if("icon") + SStitle.icon = icon + +/turf/closed/indestructible/riveted + icon = 'icons/turf/walls/riveted.dmi' + icon_state = "riveted" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS + +/turf/closed/indestructible/syndicate + icon = 'icons/turf/walls/plastitanium_wall.dmi' + icon_state = "map-shuttle" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_SYNDICATE_WALLS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_PLASTITANIUM_WALLS + SMOOTH_GROUP_SYNDICATE_WALLS + +/turf/closed/indestructible/riveted/uranium + icon = 'icons/turf/walls/uranium_wall.dmi' + icon_state = "uranium" + smoothing_flags = SMOOTH_BITMASK + +/turf/closed/indestructible/abductor + icon_state = "alien1" + +/turf/closed/indestructible/opshuttle + icon_state = "wall3" + +/turf/closed/indestructible/fakeglass + name = "window" + icon = 'icons/obj/smooth_structures/reinforced_window.dmi' + icon_state = "fake_window" + opacity = FALSE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE + +/turf/closed/indestructible/fakeglass/Initialize(mapload) + . = ..() + icon_state = null //set the icon state to null, so our base state isn't visible + underlays += mutable_appearance('icons/obj/structures.dmi', "grille") //add a grille underlay + underlays += mutable_appearance('icons/turf/floors.dmi', "plating") //add the plating underlay, below the grille + +/turf/closed/indestructible/opsglass + name = "window" + icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' + icon_state = "plastitanium_window" + opacity = FALSE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + +/turf/closed/indestructible/opsglass/Initialize(mapload) + . = ..() + icon_state = null + underlays += mutable_appearance('icons/obj/structures.dmi', "grille") + underlays += mutable_appearance('icons/turf/floors.dmi', "plating") + +/turf/closed/indestructible/fakedoor + name = "CentCom Access" + icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' + icon_state = "fake_door" + +/turf/closed/indestructible/fakedoor/poddoor + name = "blast door" + icon = 'icons/obj/doors/blastdoor.dmi' + icon_state = "closed" + +/turf/closed/indestructible/rock + name = "dense rock" + desc = "An extremely densely-packed rock, most mining tools or explosives would never get through this." + icon = 'icons/turf/mining.dmi' + icon_state = "rock" + +/turf/closed/indestructible/rock/snow + name = "mountainside" + desc = "An extremely densely-packed rock, sheeted over with centuries worth of ice and snow." + icon = 'icons/turf/walls.dmi' + icon_state = "snowrock" + bullet_sizzle = TRUE + bullet_bounce_sound = null + +/turf/closed/indestructible/rock/snow/ice + name = "iced rock" + desc = "Extremely densely-packed sheets of ice and rock, forged over the years of the harsh cold." + icon = 'icons/turf/walls.dmi' + icon_state = "icerock" + +/turf/closed/indestructible/rock/wood + name = "wooden wall" + desc = "A wall with wooden plating. Stiff." + icon = 'icons/turf/walls/wood_wall.dmi' + icon_state = "wood" + +/turf/closed/indestructible/paper + name = "thick paper wall" + desc = "A wall layered with impenetrable sheets of paper." + icon = 'icons/turf/walls.dmi' + icon_state = "paperwall" + +/turf/closed/indestructible/vault + name = "sturdy wall" + desc = "A huge chunk of metal used to separate rooms." + icon = 'icons/turf/walls.dmi' + icon_state = "rockvault" + +/turf/closed/indestructible/necropolis + name = "necropolis wall" + desc = "A seemingly impenetrable wall." + icon = 'icons/turf/walls.dmi' + icon_state = "necro" + explosion_block = 50 + baseturfs = /turf/closed/indestructible/necropolis + +/turf/closed/indestructible/necropolis/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/floors.dmi' + underlay_appearance.icon_state = "necro1" + return TRUE + +/turf/closed/indestructible/riveted/boss + name = "necropolis wall" + desc = "A thick, seemingly indestructible stone wall." + icon = 'icons/turf/walls/boss_wall.dmi' + icon_state = "boss_wall-0" + base_icon_state = "boss_wall" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_BOSS_WALLS + canSmoothWith = SMOOTH_GROUP_BOSS_WALLS + explosion_block = 50 + baseturfs = /turf/closed/indestructible/riveted/boss + +/turf/closed/indestructible/riveted/boss/see_through + opacity = FALSE + +/turf/closed/indestructible/riveted/boss/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/floors.dmi' + underlay_appearance.icon_state = "basalt" + return TRUE + +/turf/closed/indestructible/riveted/hierophant + name = "wall" + desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern." + icon = 'icons/turf/walls/hierophant_wall.dmi' + icon_state = "wall" diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/closed/minerals.dm similarity index 100% rename from code/game/turfs/simulated/minerals.dm rename to code/game/turfs/closed/minerals.dm diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm similarity index 100% rename from code/game/turfs/simulated/wall/mineral_walls.dm rename to code/game/turfs/closed/wall/mineral_walls.dm diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm similarity index 100% rename from code/game/turfs/simulated/wall/misc_walls.dm rename to code/game/turfs/closed/wall/misc_walls.dm diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm similarity index 100% rename from code/game/turfs/simulated/wall/reinf_walls.dm rename to code/game/turfs/closed/wall/reinf_walls.dm diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/closed/walls.dm similarity index 100% rename from code/game/turfs/simulated/walls.dm rename to code/game/turfs/closed/walls.dm diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/open/chasm.dm similarity index 100% rename from code/game/turfs/simulated/chasm.dm rename to code/game/turfs/open/chasm.dm diff --git a/code/game/turfs/simulated/dirtystation.dm b/code/game/turfs/open/dirtystation.dm similarity index 100% rename from code/game/turfs/simulated/dirtystation.dm rename to code/game/turfs/open/dirtystation.dm diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/open/floor.dm similarity index 100% rename from code/game/turfs/simulated/floor.dm rename to code/game/turfs/open/floor.dm diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm similarity index 100% rename from code/game/turfs/simulated/floor/fancy_floor.dm rename to code/game/turfs/open/floor/fancy_floor.dm diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/open/floor/light_floor.dm similarity index 100% rename from code/game/turfs/simulated/floor/light_floor.dm rename to code/game/turfs/open/floor/light_floor.dm diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/open/floor/mineral_floor.dm similarity index 100% rename from code/game/turfs/simulated/floor/mineral_floor.dm rename to code/game/turfs/open/floor/mineral_floor.dm diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm similarity index 100% rename from code/game/turfs/simulated/floor/misc_floor.dm rename to code/game/turfs/open/floor/misc_floor.dm diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/open/floor/plasteel_floor.dm similarity index 100% rename from code/game/turfs/simulated/floor/plasteel_floor.dm rename to code/game/turfs/open/floor/plasteel_floor.dm diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/open/floor/plating.dm similarity index 100% rename from code/game/turfs/simulated/floor/plating.dm rename to code/game/turfs/open/floor/plating.dm diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/open/floor/plating/asteroid.dm similarity index 100% rename from code/game/turfs/simulated/floor/plating/asteroid.dm rename to code/game/turfs/open/floor/plating/asteroid.dm diff --git a/code/game/turfs/simulated/floor/plating/dirt.dm b/code/game/turfs/open/floor/plating/dirt.dm similarity index 100% rename from code/game/turfs/simulated/floor/plating/dirt.dm rename to code/game/turfs/open/floor/plating/dirt.dm diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm similarity index 100% rename from code/game/turfs/simulated/floor/plating/misc_plating.dm rename to code/game/turfs/open/floor/plating/misc_plating.dm diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/open/floor/reinf_floor.dm similarity index 100% rename from code/game/turfs/simulated/floor/reinf_floor.dm rename to code/game/turfs/open/floor/reinf_floor.dm diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/open/lava.dm similarity index 100% rename from code/game/turfs/simulated/lava.dm rename to code/game/turfs/open/lava.dm diff --git a/code/game/turfs/openspace/openspace.dm b/code/game/turfs/open/openspace.dm similarity index 100% rename from code/game/turfs/openspace/openspace.dm rename to code/game/turfs/open/openspace.dm diff --git a/code/game/turfs/simulated/reebe_void.dm b/code/game/turfs/open/reebe_void.dm similarity index 100% rename from code/game/turfs/simulated/reebe_void.dm rename to code/game/turfs/open/reebe_void.dm diff --git a/code/game/turfs/simulated/river.dm b/code/game/turfs/open/river.dm similarity index 100% rename from code/game/turfs/simulated/river.dm rename to code/game/turfs/open/river.dm diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/open/space/space.dm similarity index 100% rename from code/game/turfs/space/space.dm rename to code/game/turfs/open/space/space.dm diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/open/space/transit.dm similarity index 100% rename from code/game/turfs/space/transit.dm rename to code/game/turfs/open/space/transit.dm diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/open/water.dm similarity index 100% rename from code/game/turfs/simulated/water.dm rename to code/game/turfs/open/water.dm diff --git a/yogstation.dme b/yogstation.dme index c81a1268ec8c..7c4bb4c8f72d 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -1542,36 +1542,37 @@ #include "code\game\objects\structures\transit_tubes\transit_tube_construction.dm" #include "code\game\objects\structures\transit_tubes\transit_tube_pod.dm" #include "code\game\turfs\baseturf_skipover.dm" +#include "code\game\turfs\baseturfs.dm" #include "code\game\turfs\change_turf.dm" -#include "code\game\turfs\closed.dm" -#include "code\game\turfs\open.dm" #include "code\game\turfs\turf.dm" -#include "code\game\turfs\baseturfs\baseturfs.dm" -#include "code\game\turfs\openspace\openspace.dm" -#include "code\game\turfs\simulated\chasm.dm" -#include "code\game\turfs\simulated\dirtystation.dm" -#include "code\game\turfs\simulated\floor.dm" -#include "code\game\turfs\simulated\lava.dm" -#include "code\game\turfs\simulated\minerals.dm" -#include "code\game\turfs\simulated\reebe_void.dm" -#include "code\game\turfs\simulated\river.dm" -#include "code\game\turfs\simulated\walls.dm" -#include "code\game\turfs\simulated\water.dm" -#include "code\game\turfs\simulated\floor\fancy_floor.dm" -#include "code\game\turfs\simulated\floor\light_floor.dm" -#include "code\game\turfs\simulated\floor\mineral_floor.dm" -#include "code\game\turfs\simulated\floor\misc_floor.dm" -#include "code\game\turfs\simulated\floor\plasteel_floor.dm" -#include "code\game\turfs\simulated\floor\plating.dm" -#include "code\game\turfs\simulated\floor\reinf_floor.dm" -#include "code\game\turfs\simulated\floor\plating\asteroid.dm" -#include "code\game\turfs\simulated\floor\plating\dirt.dm" -#include "code\game\turfs\simulated\floor\plating\misc_plating.dm" -#include "code\game\turfs\simulated\wall\mineral_walls.dm" -#include "code\game\turfs\simulated\wall\misc_walls.dm" -#include "code\game\turfs\simulated\wall\reinf_walls.dm" -#include "code\game\turfs\space\space.dm" -#include "code\game\turfs\space\transit.dm" +#include "code\game\turfs\closed\_closed.dm" +#include "code\game\turfs\closed\indestructible.dm" +#include "code\game\turfs\closed\minerals.dm" +#include "code\game\turfs\closed\walls.dm" +#include "code\game\turfs\closed\wall\mineral_walls.dm" +#include "code\game\turfs\closed\wall\misc_walls.dm" +#include "code\game\turfs\closed\wall\reinf_walls.dm" +#include "code\game\turfs\open\_open.dm" +#include "code\game\turfs\open\chasm.dm" +#include "code\game\turfs\open\dirtystation.dm" +#include "code\game\turfs\open\floor.dm" +#include "code\game\turfs\open\lava.dm" +#include "code\game\turfs\open\openspace.dm" +#include "code\game\turfs\open\reebe_void.dm" +#include "code\game\turfs\open\river.dm" +#include "code\game\turfs\open\water.dm" +#include "code\game\turfs\open\floor\fancy_floor.dm" +#include "code\game\turfs\open\floor\light_floor.dm" +#include "code\game\turfs\open\floor\mineral_floor.dm" +#include "code\game\turfs\open\floor\misc_floor.dm" +#include "code\game\turfs\open\floor\plasteel_floor.dm" +#include "code\game\turfs\open\floor\plating.dm" +#include "code\game\turfs\open\floor\reinf_floor.dm" +#include "code\game\turfs\open\floor\plating\asteroid.dm" +#include "code\game\turfs\open\floor\plating\dirt.dm" +#include "code\game\turfs\open\floor\plating\misc_plating.dm" +#include "code\game\turfs\open\space\space.dm" +#include "code\game\turfs\open\space\transit.dm" #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_investigate.dm" #include "code\modules\admin\admin_verbs.dm" From 1ccd32f9ad30ed726320a0b2238f764f622f7c61 Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Tue, 12 Dec 2023 23:11:21 -0800 Subject: [PATCH 144/281] like everything except templates --- .../LavaRuins/lavaland_surface_golem_ship.dmm | 24 +- .../StationRuins/BoxStation/dorms_edoor5.dmm | 12 +- .../StationRuins/BoxStation/dorms_edoor6.dmm | 12 +- .../StationRuins/maint/10x10/10x10_wizard.dmm | 38 +-- _maps/_basemap.dm | 2 +- .../AsteroidStation/AsteroidStation.dmm | 18 +- _maps/map_files/GaxStation/GaxStation.dmm | 64 ++--- _maps/shuttles/emergency_mafia.dmm | 30 +- code/__DEFINES/icon_smoothing.dm | 10 +- code/__DEFINES/maps.dm | 3 + code/__DEFINES/subsystems.dm | 5 +- code/__HELPERS/icon_smoothing.dm | 2 + code/_globalvars/lists/mapping.dm | 4 + .../configuration/entries/general.dm | 17 +- code/controllers/master.dm | 59 ++-- code/controllers/subsystem.dm | 5 + code/controllers/subsystem/demo.dm | 2 +- code/controllers/subsystem/mapping.dm | 76 ++++- code/controllers/subsystem/profiler.dm | 74 +++++ code/controllers/subsystem/shuttle.dm | 87 ++++-- code/controllers/subsystem/timer.dm | 66 ++++- code/datums/profiling.dm | 2 +- code/game/area/areas/shuttles.dm | 4 + code/game/atom/atom_initializing_EXPENSIVE.dm | 4 +- .../game/machinery/computer/communications.dm | 2 +- code/game/machinery/doors/airlock.dm | 2 +- code/game/machinery/flasher.dm | 3 - code/game/objects/effects/landmarks.dm | 29 +- code/game/objects/effects/misc.dm | 17 ++ .../objects/effects/spawners/structure.dm | 13 +- .../objects/items/stacks/tiles/tile_types.dm | 57 ++-- code/game/objects/structures/grille.dm | 6 +- code/game/objects/structures/tables_racks.dm | 30 +- code/game/objects/structures/window.dm | 3 +- code/game/turfs/open/_open.dm | 136 ++++++--- code/game/turfs/open/floor.dm | 97 +++---- code/game/turfs/open/floor/fancy_floor.dm | 127 +++++---- code/game/turfs/open/floor/light_floor.dm | 6 +- code/game/turfs/open/floor/mineral_floor.dm | 24 +- code/game/turfs/open/floor/misc_floor.dm | 14 +- code/game/turfs/open/floor/plasteel_floor.dm | 24 +- code/game/turfs/open/floor/plating.dm | 24 +- .../game/turfs/open/floor/plating/asteroid.dm | 15 +- code/game/turfs/turf.dm | 20 ++ code/game/world.dm | 31 +++ code/modules/assembly/flash.dm | 2 +- .../machinery/portable/canister.dm | 3 - code/modules/cargo/packs.dm | 12 +- code/modules/lighting/lighting_turf.dm | 26 +- code/modules/mapping/map_template.dm | 10 +- code/modules/mapping/reader.dm | 260 +++++++++++++----- .../mapping/space_management/space_level.dm | 8 + .../space_management/space_reservation.dm | 75 ++++- .../mapping/space_management/traits.dm | 29 -- code/modules/photography/camera/camera.dm | 2 +- .../camera/camera_image_capturing.dm | 8 +- .../mapGenerators/repair.dm | 2 +- .../ruins/spaceruin_code/hilbertshotel.dm | 34 +-- code/modules/shuttle/shuttle.dm | 25 +- icons/obj/smooth_structures/alien/nest.dmi | Bin 2052 -> 11467 bytes icons/obj/smooth_structures/alien/nest.png | Bin 0 -> 13955 bytes .../obj/smooth_structures/alien/nest.png.toml | 2 + .../alien/resin_membrane.dmi | Bin 9121 -> 15225 bytes .../alien/resin_membrane.png | Bin 0 -> 15317 bytes .../alien/resin_membrane.png.toml | 2 + .../smooth_structures/alien/resin_wall.dmi | Bin 2442 -> 11095 bytes .../smooth_structures/alien/resin_wall.png | Bin 0 -> 15141 bytes .../alien/resin_wall.png.toml | 2 + .../obj/smooth_structures/alien/weednode.dmi | Bin 2064 -> 17482 bytes .../obj/smooth_structures/alien/weednode.png | Bin 0 -> 17073 bytes .../smooth_structures/alien/weednode.png.toml | 14 + icons/obj/smooth_structures/alien/weeds1.dmi | Bin 1657 -> 13568 bytes icons/obj/smooth_structures/alien/weeds1.png | Bin 0 -> 16137 bytes .../smooth_structures/alien/weeds1.png.toml | 14 + icons/obj/smooth_structures/alien/weeds2.dmi | Bin 1657 -> 13633 bytes icons/obj/smooth_structures/alien/weeds2.png | Bin 0 -> 16107 bytes .../smooth_structures/alien/weeds2.png.toml | 14 + icons/obj/smooth_structures/alien/weeds3.dmi | Bin 1658 -> 14031 bytes icons/obj/smooth_structures/alien/weeds3.png | Bin 0 -> 16605 bytes .../smooth_structures/alien/weeds3.png.toml | 14 + icons/obj/smooth_structures/alien_table.dmi | Bin 1578 -> 6440 bytes icons/obj/smooth_structures/alien_table.png | Bin 0 -> 4871 bytes .../smooth_structures/alien_table.png.toml | 2 + icons/obj/smooth_structures/brass_table.dmi | Bin 882 -> 3958 bytes icons/obj/smooth_structures/brass_table.png | Bin 0 -> 2029 bytes .../smooth_structures/brass_table.png.toml | 2 + icons/obj/smooth_structures/catwalk.dmi | Bin 3692 -> 3565 bytes icons/obj/smooth_structures/catwalk.png | Bin 0 -> 6394 bytes icons/obj/smooth_structures/catwalk.png.toml | 2 + .../smooth_structures/clockwork_window.dmi | Bin 3573 -> 4356 bytes .../smooth_structures/clockwork_window.png | Bin 0 -> 1176 bytes .../clockwork_window.png.toml | 2 + icons/obj/smooth_structures/fancy_table.dmi | Bin 3437 -> 5968 bytes icons/obj/smooth_structures/fancy_table.png | Bin 0 -> 2929 bytes .../smooth_structures/fancy_table.png.toml | 14 + .../smooth_structures/fancy_table_black.dmi | Bin 3295 -> 5680 bytes .../smooth_structures/fancy_table_black.png | Bin 0 -> 2852 bytes .../fancy_table_black.png.toml | 14 + .../smooth_structures/fancy_table_blue.dmi | Bin 0 -> 5698 bytes .../smooth_structures/fancy_table_blue.png | Bin 0 -> 3117 bytes .../fancy_table_blue.png.toml | 14 + .../smooth_structures/fancy_table_cyan.dmi | Bin 3545 -> 6152 bytes .../smooth_structures/fancy_table_cyan.png | Bin 0 -> 3004 bytes .../fancy_table_cyan.png.toml | 14 + .../fancy_table_exoticblue.dmi | Bin 3405 -> 0 bytes .../fancy_table_exoticgreen.dmi | Bin 3271 -> 0 bytes .../fancy_table_exoticpurple.dmi | Bin 3190 -> 0 bytes .../smooth_structures/fancy_table_green.dmi | Bin 0 -> 5754 bytes .../smooth_structures/fancy_table_green.png | Bin 0 -> 2887 bytes .../fancy_table_green.png.toml | 14 + .../smooth_structures/fancy_table_orange.dmi | Bin 3208 -> 5807 bytes .../smooth_structures/fancy_table_orange.png | Bin 0 -> 2938 bytes .../fancy_table_orange.png.toml | 14 + .../smooth_structures/fancy_table_purple.dmi | Bin 0 -> 5871 bytes .../smooth_structures/fancy_table_purple.png | Bin 0 -> 2937 bytes .../fancy_table_purple.png.toml | 14 + .../obj/smooth_structures/fancy_table_red.dmi | Bin 3195 -> 5763 bytes .../obj/smooth_structures/fancy_table_red.png | Bin 0 -> 2893 bytes .../fancy_table_red.png.toml | 14 + .../fancy_table_royalblack.dmi | Bin 3252 -> 5661 bytes .../fancy_table_royalblack.png | Bin 0 -> 2861 bytes .../fancy_table_royalblack.png.toml | 14 + .../fancy_table_royalblue.dmi | Bin 3296 -> 5805 bytes .../fancy_table_royalblue.png | Bin 0 -> 3020 bytes .../fancy_table_royalblue.png.toml | 14 + icons/obj/smooth_structures/glass_table.dmi | Bin 2311 -> 5347 bytes icons/obj/smooth_structures/glass_table.png | Bin 0 -> 4578 bytes .../smooth_structures/glass_table.png.toml | 2 + icons/obj/smooth_structures/hedge.dmi | Bin 0 -> 17493 bytes icons/obj/smooth_structures/hedge.png | Bin 0 -> 13823 bytes icons/obj/smooth_structures/hedge.png.toml | 2 + icons/obj/smooth_structures/lattice.dmi | Bin 2113 -> 3827 bytes icons/obj/smooth_structures/lattice.png | Bin 0 -> 856 bytes icons/obj/smooth_structures/lattice.png.toml | 2 + icons/obj/smooth_structures/paperframes.dmi | Bin 725 -> 1922 bytes icons/obj/smooth_structures/paperframes.png | Bin 0 -> 804 bytes .../smooth_structures/paperframes.png.toml | 2 + icons/obj/smooth_structures/plasma_window.dmi | Bin 6337 -> 12390 bytes icons/obj/smooth_structures/plasma_window.png | Bin 0 -> 5057 bytes .../smooth_structures/plasma_window.png.toml | 2 + .../smooth_structures/plasmaglass_table.dmi | Bin 0 -> 5431 bytes .../smooth_structures/plasmaglass_table.png | Bin 0 -> 4076 bytes .../plasmaglass_table.png.toml | 2 + .../smooth_structures/plastitanium_window.dmi | Bin 2401 -> 4385 bytes .../smooth_structures/plastitanium_window.png | Bin 0 -> 2447 bytes .../plastitanium_window.png.toml | 2 + .../plastitaniumglass_table.dmi | Bin 0 -> 5784 bytes .../plastitaniumglass_table.png | Bin 0 -> 4393 bytes .../plastitaniumglass_table.png.toml | 2 + icons/obj/smooth_structures/pod_window.dmi | Bin 3723 -> 6398 bytes icons/obj/smooth_structures/pod_window.png | Bin 0 -> 9542 bytes .../obj/smooth_structures/pod_window.png.toml | 2 + icons/obj/smooth_structures/poker_table.dmi | Bin 4825 -> 3282 bytes icons/obj/smooth_structures/poker_table.png | Bin 0 -> 1406 bytes .../smooth_structures/poker_table.png.toml | 2 + .../smooth_structures/reinforced_table.dmi | Bin 4855 -> 3125 bytes .../smooth_structures/reinforced_table.png | Bin 0 -> 1390 bytes .../reinforced_table.png.toml | 2 + .../smooth_structures/reinforced_window.dmi | Bin 13410 -> 10760 bytes .../smooth_structures/reinforced_window.png | Bin 0 -> 5981 bytes .../reinforced_window.png.toml | 2 + icons/obj/smooth_structures/rglass_table.dmi | Bin 0 -> 5939 bytes icons/obj/smooth_structures/rglass_table.png | Bin 0 -> 5110 bytes .../smooth_structures/rglass_table.png.toml | 2 + icons/obj/smooth_structures/rice_window.dmi | Bin 9440 -> 25764 bytes icons/obj/smooth_structures/rice_window.png | Bin 0 -> 15418 bytes .../smooth_structures/rice_window.png.toml | 2 + icons/obj/smooth_structures/rollingtable.dmi | Bin 0 -> 406 bytes .../obj/smooth_structures/rplasma_window.dmi | Bin 9413 -> 16158 bytes .../obj/smooth_structures/rplasma_window.png | Bin 0 -> 13568 bytes .../smooth_structures/rplasma_window.png.toml | 2 + .../smooth_structures/rplasmaglass_table.dmi | Bin 0 -> 5961 bytes .../smooth_structures/rplasmaglass_table.png | Bin 0 -> 4520 bytes .../rplasmaglass_table.png.toml | 2 + icons/obj/smooth_structures/sandbags.dmi | Bin 993 -> 4328 bytes icons/obj/smooth_structures/sandbags.png | Bin 0 -> 4747 bytes icons/obj/smooth_structures/sandbags.png.toml | 2 + .../obj/smooth_structures/shuttle_window.dmi | Bin 6254 -> 6064 bytes .../obj/smooth_structures/shuttle_window.png | Bin 0 -> 8348 bytes .../smooth_structures/shuttle_window.png.toml | 2 + .../structure_variations.dmi | Bin 0 -> 4264 bytes icons/obj/smooth_structures/table.dmi | Bin 1144 -> 2424 bytes icons/obj/smooth_structures/table.png | Bin 0 -> 930 bytes icons/obj/smooth_structures/table.png.toml | 2 + .../obj/smooth_structures/table_greyscale.dmi | Bin 0 -> 2315 bytes .../obj/smooth_structures/table_greyscale.png | Bin 0 -> 925 bytes .../table_greyscale.png.toml | 2 + icons/obj/smooth_structures/tinted_window.dmi | Bin 7301 -> 12130 bytes icons/obj/smooth_structures/tinted_window.png | Bin 0 -> 6278 bytes .../smooth_structures/tinted_window.png.toml | 2 + .../smooth_structures/titaniumglass_table.dmi | Bin 0 -> 6403 bytes .../smooth_structures/titaniumglass_table.png | Bin 0 -> 5133 bytes .../titaniumglass_table.png.toml | 2 + icons/obj/smooth_structures/window.dmi | Bin 7919 -> 8026 bytes icons/obj/smooth_structures/window.png | Bin 0 -> 3380 bytes icons/obj/smooth_structures/window.png.toml | 2 + icons/obj/smooth_structures/wood_table.dmi | Bin 3703 -> 2405 bytes icons/obj/smooth_structures/wood_table.png | Bin 0 -> 966 bytes .../obj/smooth_structures/wood_table.png.toml | 2 + icons/obj/tiles.dmi | Bin 16907 -> 17242 bytes icons/turf/damaged.dmi | Bin 0 -> 89666 bytes icons/turf/floors/ash.dmi | Bin 3817 -> 21959 bytes icons/turf/floors/ash.png | Bin 0 -> 13384 bytes icons/turf/floors/ash.png.toml | 14 + icons/turf/floors/bamboo_mat.dmi | Bin 3843 -> 4607 bytes icons/turf/floors/bamboo_mat.png | Bin 0 -> 6253 bytes icons/turf/floors/bamboo_mat.png.toml | 2 + icons/turf/floors/carpet.dmi | Bin 3481 -> 8055 bytes icons/turf/floors/carpet.png | Bin 0 -> 14564 bytes icons/turf/floors/carpet.png.toml | 2 + icons/turf/floors/carpet_black.dmi | Bin 1907 -> 3806 bytes icons/turf/floors/carpet_black.png | Bin 0 -> 18591 bytes icons/turf/floors/carpet_black.png.toml | 2 + icons/turf/floors/carpet_blue.dmi | Bin 3273 -> 8306 bytes icons/turf/floors/carpet_blue.png | Bin 0 -> 16491 bytes icons/turf/floors/carpet_blue.png.toml | 2 + icons/turf/floors/carpet_cyan.dmi | Bin 2883 -> 7716 bytes icons/turf/floors/carpet_cyan.png | Bin 0 -> 14856 bytes icons/turf/floors/carpet_cyan.png.toml | 2 + icons/turf/floors/carpet_donk.dmi | Bin 2842 -> 6364 bytes icons/turf/floors/carpet_donk.png | Bin 0 -> 17068 bytes icons/turf/floors/carpet_donk.png.toml | 5 + icons/turf/floors/carpet_executive.dmi | Bin 2535 -> 5941 bytes icons/turf/floors/carpet_executive.png | Bin 0 -> 10972 bytes icons/turf/floors/carpet_executive.png.toml | 6 + icons/turf/floors/carpet_exoticblue.dmi | Bin 7368 -> 0 bytes icons/turf/floors/carpet_exoticgreen.dmi | Bin 8705 -> 0 bytes icons/turf/floors/carpet_exoticpurple.dmi | Bin 6957 -> 0 bytes icons/turf/floors/carpet_green.dmi | Bin 4382 -> 12336 bytes icons/turf/floors/carpet_green.png | Bin 0 -> 14390 bytes icons/turf/floors/carpet_green.png.toml | 2 + icons/turf/floors/carpet_neon_base.dmi | Bin 0 -> 2833 bytes icons/turf/floors/carpet_neon_base.png | Bin 0 -> 16351 bytes icons/turf/floors/carpet_neon_base.png.toml | 2 + icons/turf/floors/carpet_neon_base_nodots.dmi | Bin 0 -> 2990 bytes icons/turf/floors/carpet_neon_base_nodots.png | Bin 0 -> 16340 bytes .../floors/carpet_neon_base_nodots.png.toml | 2 + icons/turf/floors/carpet_neon_glow.dmi | Bin 0 -> 2279 bytes icons/turf/floors/carpet_neon_glow.png | Bin 0 -> 855 bytes icons/turf/floors/carpet_neon_glow.png.toml | 2 + icons/turf/floors/carpet_neon_glow_nodots.dmi | Bin 0 -> 2092 bytes icons/turf/floors/carpet_neon_glow_nodots.png | Bin 0 -> 770 bytes .../floors/carpet_neon_glow_nodots.png.toml | 2 + icons/turf/floors/carpet_neon_light.dmi | Bin 0 -> 1770 bytes icons/turf/floors/carpet_neon_light.png | Bin 0 -> 678 bytes icons/turf/floors/carpet_neon_light.png.toml | 2 + .../turf/floors/carpet_neon_light_nodots.dmi | Bin 0 -> 1631 bytes .../turf/floors/carpet_neon_light_nodots.png | Bin 0 -> 580 bytes .../floors/carpet_neon_light_nodots.png.toml | 2 + icons/turf/floors/carpet_orange.dmi | Bin 3293 -> 10705 bytes icons/turf/floors/carpet_orange.png | Bin 0 -> 16306 bytes icons/turf/floors/carpet_orange.png.toml | 2 + icons/turf/floors/carpet_purple.dmi | Bin 2427 -> 6622 bytes icons/turf/floors/carpet_purple.png | Bin 0 -> 15486 bytes icons/turf/floors/carpet_purple.png.toml | 2 + icons/turf/floors/carpet_red.dmi | Bin 3011 -> 9295 bytes icons/turf/floors/carpet_red.png | Bin 0 -> 15094 bytes icons/turf/floors/carpet_red.png.toml | 2 + icons/turf/floors/carpet_royalblack.dmi | Bin 2967 -> 7023 bytes icons/turf/floors/carpet_royalblack.png | Bin 0 -> 13926 bytes icons/turf/floors/carpet_royalblack.png.toml | 2 + icons/turf/floors/carpet_royalblue.dmi | Bin 3133 -> 10303 bytes icons/turf/floors/carpet_royalblue.png | Bin 0 -> 17474 bytes icons/turf/floors/carpet_royalblue.png.toml | 2 + icons/turf/floors/carpet_stellar.dmi | Bin 3176 -> 7527 bytes icons/turf/floors/carpet_stellar.png | Bin 0 -> 7218 bytes icons/turf/floors/carpet_stellar.png.toml | 2 + icons/turf/floors/chasms.dmi | Bin 3329 -> 7643 bytes icons/turf/floors/chasms.png | Bin 0 -> 6029 bytes icons/turf/floors/chasms.png.toml | 2 + icons/turf/floors/floor_variations.dmi | Bin 0 -> 2873 bytes icons/turf/floors/glass.dmi | Bin 8083 -> 8081 bytes icons/turf/floors/glass.png | Bin 0 -> 3238 bytes icons/turf/floors/glass.png.toml | 2 + icons/turf/floors/grass.dmi | Bin 5205 -> 15697 bytes icons/turf/floors/grass.png | Bin 0 -> 14338 bytes icons/turf/floors/grass.png.toml | 14 + icons/turf/floors/ice_turf.dmi | Bin 4712 -> 13249 bytes icons/turf/floors/ice_turf.png | Bin 0 -> 11601 bytes icons/turf/floors/ice_turf.png.toml | 2 + icons/turf/floors/icechasms.dmi | Bin 4129 -> 7713 bytes icons/turf/floors/icechasms.png | Bin 0 -> 4131 bytes icons/turf/floors/icechasms.png.toml | 2 + icons/turf/floors/junglechasm.dmi | Bin 3648 -> 11464 bytes icons/turf/floors/junglechasm.png | Bin 0 -> 8641 bytes icons/turf/floors/junglechasm.png.toml | 2 + icons/turf/floors/junglegrass.dmi | Bin 5209 -> 15478 bytes icons/turf/floors/junglegrass.png | Bin 0 -> 14976 bytes icons/turf/floors/junglegrass.png.toml | 14 + icons/turf/floors/lava.dmi | Bin 9697 -> 93049 bytes icons/turf/floors/lava.png | Bin 0 -> 64976 bytes icons/turf/floors/lava.png.toml | 5 + icons/turf/floors/lava_mask.dmi | Bin 1628 -> 2884 bytes icons/turf/floors/lava_mask.png | Bin 0 -> 1270 bytes icons/turf/floors/lava_mask.png.toml | 2 + icons/turf/floors/plasma_glass.dmi | Bin 2695 -> 2588 bytes icons/turf/floors/plasma_glass.png | Bin 0 -> 1041 bytes icons/turf/floors/plasma_glass.png.toml | 2 + icons/turf/floors/reinf_glass.dmi | Bin 4257 -> 4161 bytes icons/turf/floors/reinf_glass.png | Bin 0 -> 9078 bytes icons/turf/floors/reinf_glass.png.toml | 2 + icons/turf/floors/reinf_plasma_glass.dmi | Bin 4047 -> 3923 bytes icons/turf/floors/reinf_plasma_glass.png | Bin 0 -> 9787 bytes icons/turf/floors/reinf_plasma_glass.png.toml | 2 + icons/turf/floors/rocky_ash.dmi | Bin 3881 -> 24275 bytes icons/turf/floors/rocky_ash.png | Bin 0 -> 14328 bytes icons/turf/floors/rocky_ash.png.toml | 14 + icons/turf/floors/snow_turf.dmi | Bin 5159 -> 14571 bytes icons/turf/floors/snow_turf.png | Bin 0 -> 5128 bytes icons/turf/floors/snow_turf.png.toml | 2 + icons/turf/smoothrocks.dmi | Bin 4949 -> 8880 bytes icons/turf/smoothrocks.png | Bin 0 -> 9893 bytes icons/turf/smoothrocks.png.toml | 14 + icons/turf/smoothrocks_overlays.dmi | Bin 0 -> 1243 bytes icons/turf/walls/abductor_wall.dmi | Bin 2606 -> 4519 bytes icons/turf/walls/bamboo_wall.dmi | Bin 2814 -> 4667 bytes icons/turf/walls/bananium_wall.dmi | Bin 1406 -> 2613 bytes icons/turf/walls/boss_wall.dmi | Bin 2444 -> 4611 bytes icons/turf/walls/clockwork_wall.dmi | Bin 2773 -> 3276 bytes icons/turf/walls/cult_wall.dmi | Bin 1338 -> 2898 bytes icons/turf/walls/diamond_wall.dmi | Bin 1358 -> 2552 bytes icons/turf/walls/gold_wall.dmi | Bin 1384 -> 2568 bytes icons/turf/walls/hierophant_wall.dmi | Bin 5351 -> 5347 bytes icons/turf/walls/hierophant_wall_temp.dmi | Bin 1715 -> 3547 bytes icons/turf/walls/icedmetal_wall.dmi | Bin 1990 -> 3680 bytes icons/turf/walls/icerock_wall.dmi | Bin 1740 -> 2451 bytes icons/turf/walls/iron_wall.dmi | Bin 1381 -> 2568 bytes icons/turf/walls/materialwall.dmi | Bin 0 -> 1188 bytes icons/turf/walls/meat.dmi | Bin 0 -> 17694 bytes icons/turf/walls/mountain_wall.dmi | Bin 1565 -> 2532 bytes icons/turf/walls/plasma_wall.dmi | Bin 6426 -> 8763 bytes icons/turf/walls/plastinum_wall.dmi | Bin 0 -> 4799 bytes icons/turf/walls/plastitanium_wall.dmi | Bin 3811 -> 5728 bytes icons/turf/walls/riveted.dmi | Bin 1252 -> 2339 bytes icons/turf/walls/rock_wall.dmi | Bin 1727 -> 2443 bytes icons/turf/walls/rusty_reinforced_wall.dmi | Bin 0 -> 34674 bytes icons/turf/walls/rusty_wall.dmi | Bin 0 -> 24047 bytes icons/turf/walls/sandstone_wall.dmi | Bin 1387 -> 2576 bytes icons/turf/walls/shuttle_wall.dmi | Bin 3272 -> 5329 bytes icons/turf/walls/silver_wall.dmi | Bin 1386 -> 2570 bytes icons/turf/walls/snow_wall.dmi | Bin 1016 -> 2465 bytes icons/turf/walls/survival_pod_walls.dmi | Bin 3647 -> 6024 bytes icons/turf/walls/uranium_wall.dmi | Bin 16177 -> 38601 bytes icons/turf/walls/wood_wall.dmi | Bin 1520 -> 2666 bytes yogstation.dme | 1 + .../objects/items/stacks/tiles/tile_types.dm | 30 -- .../game/turfs/simulated/floor/fancy_floor.dm | 18 -- 347 files changed, 1587 insertions(+), 658 deletions(-) create mode 100644 code/controllers/subsystem/profiler.dm create mode 100644 icons/obj/smooth_structures/alien/nest.png create mode 100644 icons/obj/smooth_structures/alien/nest.png.toml create mode 100644 icons/obj/smooth_structures/alien/resin_membrane.png create mode 100644 icons/obj/smooth_structures/alien/resin_membrane.png.toml create mode 100644 icons/obj/smooth_structures/alien/resin_wall.png create mode 100644 icons/obj/smooth_structures/alien/resin_wall.png.toml create mode 100644 icons/obj/smooth_structures/alien/weednode.png create mode 100644 icons/obj/smooth_structures/alien/weednode.png.toml create mode 100644 icons/obj/smooth_structures/alien/weeds1.png create mode 100644 icons/obj/smooth_structures/alien/weeds1.png.toml create mode 100644 icons/obj/smooth_structures/alien/weeds2.png create mode 100644 icons/obj/smooth_structures/alien/weeds2.png.toml create mode 100644 icons/obj/smooth_structures/alien/weeds3.png create mode 100644 icons/obj/smooth_structures/alien/weeds3.png.toml create mode 100644 icons/obj/smooth_structures/alien_table.png create mode 100644 icons/obj/smooth_structures/alien_table.png.toml create mode 100644 icons/obj/smooth_structures/brass_table.png create mode 100644 icons/obj/smooth_structures/brass_table.png.toml create mode 100644 icons/obj/smooth_structures/catwalk.png create mode 100644 icons/obj/smooth_structures/catwalk.png.toml create mode 100644 icons/obj/smooth_structures/clockwork_window.png create mode 100644 icons/obj/smooth_structures/clockwork_window.png.toml create mode 100644 icons/obj/smooth_structures/fancy_table.png create mode 100644 icons/obj/smooth_structures/fancy_table.png.toml create mode 100644 icons/obj/smooth_structures/fancy_table_black.png create mode 100644 icons/obj/smooth_structures/fancy_table_black.png.toml create mode 100644 icons/obj/smooth_structures/fancy_table_blue.dmi create mode 100644 icons/obj/smooth_structures/fancy_table_blue.png create mode 100644 icons/obj/smooth_structures/fancy_table_blue.png.toml create mode 100644 icons/obj/smooth_structures/fancy_table_cyan.png create mode 100644 icons/obj/smooth_structures/fancy_table_cyan.png.toml delete mode 100644 icons/obj/smooth_structures/fancy_table_exoticblue.dmi delete mode 100644 icons/obj/smooth_structures/fancy_table_exoticgreen.dmi delete mode 100644 icons/obj/smooth_structures/fancy_table_exoticpurple.dmi create mode 100644 icons/obj/smooth_structures/fancy_table_green.dmi create mode 100644 icons/obj/smooth_structures/fancy_table_green.png create mode 100644 icons/obj/smooth_structures/fancy_table_green.png.toml create mode 100644 icons/obj/smooth_structures/fancy_table_orange.png create mode 100644 icons/obj/smooth_structures/fancy_table_orange.png.toml create mode 100644 icons/obj/smooth_structures/fancy_table_purple.dmi create mode 100644 icons/obj/smooth_structures/fancy_table_purple.png create mode 100644 icons/obj/smooth_structures/fancy_table_purple.png.toml create mode 100644 icons/obj/smooth_structures/fancy_table_red.png create mode 100644 icons/obj/smooth_structures/fancy_table_red.png.toml create mode 100644 icons/obj/smooth_structures/fancy_table_royalblack.png create mode 100644 icons/obj/smooth_structures/fancy_table_royalblack.png.toml create mode 100644 icons/obj/smooth_structures/fancy_table_royalblue.png create mode 100644 icons/obj/smooth_structures/fancy_table_royalblue.png.toml create mode 100644 icons/obj/smooth_structures/glass_table.png create mode 100644 icons/obj/smooth_structures/glass_table.png.toml create mode 100644 icons/obj/smooth_structures/hedge.dmi create mode 100644 icons/obj/smooth_structures/hedge.png create mode 100644 icons/obj/smooth_structures/hedge.png.toml create mode 100644 icons/obj/smooth_structures/lattice.png create mode 100644 icons/obj/smooth_structures/lattice.png.toml create mode 100644 icons/obj/smooth_structures/paperframes.png create mode 100644 icons/obj/smooth_structures/paperframes.png.toml create mode 100644 icons/obj/smooth_structures/plasma_window.png create mode 100644 icons/obj/smooth_structures/plasma_window.png.toml create mode 100644 icons/obj/smooth_structures/plasmaglass_table.dmi create mode 100644 icons/obj/smooth_structures/plasmaglass_table.png create mode 100644 icons/obj/smooth_structures/plasmaglass_table.png.toml create mode 100644 icons/obj/smooth_structures/plastitanium_window.png create mode 100644 icons/obj/smooth_structures/plastitanium_window.png.toml create mode 100644 icons/obj/smooth_structures/plastitaniumglass_table.dmi create mode 100644 icons/obj/smooth_structures/plastitaniumglass_table.png create mode 100644 icons/obj/smooth_structures/plastitaniumglass_table.png.toml create mode 100644 icons/obj/smooth_structures/pod_window.png create mode 100644 icons/obj/smooth_structures/pod_window.png.toml create mode 100644 icons/obj/smooth_structures/poker_table.png create mode 100644 icons/obj/smooth_structures/poker_table.png.toml create mode 100644 icons/obj/smooth_structures/reinforced_table.png create mode 100644 icons/obj/smooth_structures/reinforced_table.png.toml create mode 100644 icons/obj/smooth_structures/reinforced_window.png create mode 100644 icons/obj/smooth_structures/reinforced_window.png.toml create mode 100644 icons/obj/smooth_structures/rglass_table.dmi create mode 100644 icons/obj/smooth_structures/rglass_table.png create mode 100644 icons/obj/smooth_structures/rglass_table.png.toml create mode 100644 icons/obj/smooth_structures/rice_window.png create mode 100644 icons/obj/smooth_structures/rice_window.png.toml create mode 100644 icons/obj/smooth_structures/rollingtable.dmi create mode 100644 icons/obj/smooth_structures/rplasma_window.png create mode 100644 icons/obj/smooth_structures/rplasma_window.png.toml create mode 100644 icons/obj/smooth_structures/rplasmaglass_table.dmi create mode 100644 icons/obj/smooth_structures/rplasmaglass_table.png create mode 100644 icons/obj/smooth_structures/rplasmaglass_table.png.toml create mode 100644 icons/obj/smooth_structures/sandbags.png create mode 100644 icons/obj/smooth_structures/sandbags.png.toml create mode 100644 icons/obj/smooth_structures/shuttle_window.png create mode 100644 icons/obj/smooth_structures/shuttle_window.png.toml create mode 100644 icons/obj/smooth_structures/structure_variations.dmi create mode 100644 icons/obj/smooth_structures/table.png create mode 100644 icons/obj/smooth_structures/table.png.toml create mode 100644 icons/obj/smooth_structures/table_greyscale.dmi create mode 100644 icons/obj/smooth_structures/table_greyscale.png create mode 100644 icons/obj/smooth_structures/table_greyscale.png.toml create mode 100644 icons/obj/smooth_structures/tinted_window.png create mode 100644 icons/obj/smooth_structures/tinted_window.png.toml create mode 100644 icons/obj/smooth_structures/titaniumglass_table.dmi create mode 100644 icons/obj/smooth_structures/titaniumglass_table.png create mode 100644 icons/obj/smooth_structures/titaniumglass_table.png.toml create mode 100644 icons/obj/smooth_structures/window.png create mode 100644 icons/obj/smooth_structures/window.png.toml create mode 100644 icons/obj/smooth_structures/wood_table.png create mode 100644 icons/obj/smooth_structures/wood_table.png.toml create mode 100644 icons/turf/damaged.dmi create mode 100644 icons/turf/floors/ash.png create mode 100644 icons/turf/floors/ash.png.toml create mode 100644 icons/turf/floors/bamboo_mat.png create mode 100644 icons/turf/floors/bamboo_mat.png.toml create mode 100644 icons/turf/floors/carpet.png create mode 100644 icons/turf/floors/carpet.png.toml create mode 100644 icons/turf/floors/carpet_black.png create mode 100644 icons/turf/floors/carpet_black.png.toml create mode 100644 icons/turf/floors/carpet_blue.png create mode 100644 icons/turf/floors/carpet_blue.png.toml create mode 100644 icons/turf/floors/carpet_cyan.png create mode 100644 icons/turf/floors/carpet_cyan.png.toml create mode 100644 icons/turf/floors/carpet_donk.png create mode 100644 icons/turf/floors/carpet_donk.png.toml create mode 100644 icons/turf/floors/carpet_executive.png create mode 100644 icons/turf/floors/carpet_executive.png.toml delete mode 100644 icons/turf/floors/carpet_exoticblue.dmi delete mode 100644 icons/turf/floors/carpet_exoticgreen.dmi delete mode 100644 icons/turf/floors/carpet_exoticpurple.dmi create mode 100644 icons/turf/floors/carpet_green.png create mode 100644 icons/turf/floors/carpet_green.png.toml create mode 100644 icons/turf/floors/carpet_neon_base.dmi create mode 100644 icons/turf/floors/carpet_neon_base.png create mode 100644 icons/turf/floors/carpet_neon_base.png.toml create mode 100644 icons/turf/floors/carpet_neon_base_nodots.dmi create mode 100644 icons/turf/floors/carpet_neon_base_nodots.png create mode 100644 icons/turf/floors/carpet_neon_base_nodots.png.toml create mode 100644 icons/turf/floors/carpet_neon_glow.dmi create mode 100644 icons/turf/floors/carpet_neon_glow.png create mode 100644 icons/turf/floors/carpet_neon_glow.png.toml create mode 100644 icons/turf/floors/carpet_neon_glow_nodots.dmi create mode 100644 icons/turf/floors/carpet_neon_glow_nodots.png create mode 100644 icons/turf/floors/carpet_neon_glow_nodots.png.toml create mode 100644 icons/turf/floors/carpet_neon_light.dmi create mode 100644 icons/turf/floors/carpet_neon_light.png create mode 100644 icons/turf/floors/carpet_neon_light.png.toml create mode 100644 icons/turf/floors/carpet_neon_light_nodots.dmi create mode 100644 icons/turf/floors/carpet_neon_light_nodots.png create mode 100644 icons/turf/floors/carpet_neon_light_nodots.png.toml create mode 100644 icons/turf/floors/carpet_orange.png create mode 100644 icons/turf/floors/carpet_orange.png.toml create mode 100644 icons/turf/floors/carpet_purple.png create mode 100644 icons/turf/floors/carpet_purple.png.toml create mode 100644 icons/turf/floors/carpet_red.png create mode 100644 icons/turf/floors/carpet_red.png.toml create mode 100644 icons/turf/floors/carpet_royalblack.png create mode 100644 icons/turf/floors/carpet_royalblack.png.toml create mode 100644 icons/turf/floors/carpet_royalblue.png create mode 100644 icons/turf/floors/carpet_royalblue.png.toml create mode 100644 icons/turf/floors/carpet_stellar.png create mode 100644 icons/turf/floors/carpet_stellar.png.toml create mode 100644 icons/turf/floors/chasms.png create mode 100644 icons/turf/floors/chasms.png.toml create mode 100644 icons/turf/floors/floor_variations.dmi create mode 100644 icons/turf/floors/glass.png create mode 100644 icons/turf/floors/glass.png.toml create mode 100644 icons/turf/floors/grass.png create mode 100644 icons/turf/floors/grass.png.toml create mode 100644 icons/turf/floors/ice_turf.png create mode 100644 icons/turf/floors/ice_turf.png.toml create mode 100644 icons/turf/floors/icechasms.png create mode 100644 icons/turf/floors/icechasms.png.toml create mode 100644 icons/turf/floors/junglechasm.png create mode 100644 icons/turf/floors/junglechasm.png.toml create mode 100644 icons/turf/floors/junglegrass.png create mode 100644 icons/turf/floors/junglegrass.png.toml create mode 100644 icons/turf/floors/lava.png create mode 100644 icons/turf/floors/lava.png.toml create mode 100644 icons/turf/floors/lava_mask.png create mode 100644 icons/turf/floors/lava_mask.png.toml create mode 100644 icons/turf/floors/plasma_glass.png create mode 100644 icons/turf/floors/plasma_glass.png.toml create mode 100644 icons/turf/floors/reinf_glass.png create mode 100644 icons/turf/floors/reinf_glass.png.toml create mode 100644 icons/turf/floors/reinf_plasma_glass.png create mode 100644 icons/turf/floors/reinf_plasma_glass.png.toml create mode 100644 icons/turf/floors/rocky_ash.png create mode 100644 icons/turf/floors/rocky_ash.png.toml create mode 100644 icons/turf/floors/snow_turf.png create mode 100644 icons/turf/floors/snow_turf.png.toml create mode 100644 icons/turf/smoothrocks.png create mode 100644 icons/turf/smoothrocks.png.toml create mode 100644 icons/turf/smoothrocks_overlays.dmi create mode 100644 icons/turf/walls/materialwall.dmi create mode 100644 icons/turf/walls/meat.dmi create mode 100644 icons/turf/walls/plastinum_wall.dmi create mode 100644 icons/turf/walls/rusty_reinforced_wall.dmi create mode 100644 icons/turf/walls/rusty_wall.dmi diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm index 1119504c293d..80e3f887e5d9 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm @@ -25,7 +25,7 @@ name = "Broken Computer" }, /obj/effect/decal/cleanable/glass, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/ruin/powered/golem_ship) "da" = ( /turf/open/floor/pod/dark, @@ -43,7 +43,7 @@ /turf/open/floor/plating, /area/ruin/powered/golem_ship) "fy" = ( -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/ruin/powered/golem_ship) "gl" = ( /obj/effect/decal/cleanable/dirt, @@ -59,7 +59,7 @@ "hk" = ( /obj/effect/mob_spawn/human/golem/adamantine, /obj/effect/decal/cleanable/cobweb, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/ruin/powered/golem_ship) "hB" = ( /obj/effect/decal/cleanable/dirt, @@ -274,7 +274,7 @@ /obj/effect/mob_spawn/human/golem/adamantine, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/ruin/powered/golem_ship) "xc" = ( /obj/effect/decal/cleanable/dirt, @@ -378,7 +378,7 @@ /area/ruin/powered/golem_ship) "Dq" = ( /obj/effect/mob_spawn/human/golem/adamantine, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/ruin/powered/golem_ship) "Dw" = ( /obj/structure/table/reinforced, @@ -480,7 +480,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/ruin/powered/golem_ship) "Iu" = ( /obj/structure/frame/computer, @@ -526,7 +526,7 @@ /area/ruin/powered/golem_ship) "Ls" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/ruin/powered/golem_ship) "LB" = ( /obj/effect/decal/cleanable/oil, @@ -549,7 +549,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/glass, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/ruin/powered/golem_ship) "MH" = ( /obj/machinery/light/small{ @@ -593,7 +593,7 @@ /obj/machinery/light{ dir = 8 }, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/ruin/powered/golem_ship) "Ox" = ( /obj/structure/frame/machine, @@ -604,7 +604,7 @@ "OL" = ( /obj/item/resonator, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/ruin/powered/golem_ship) "OZ" = ( /turf/open/floor/plating, @@ -618,7 +618,7 @@ /obj/structure/chair/office/dark{ dir = 8 }, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/ruin/powered/golem_ship) "Pt" = ( /obj/machinery/light/broken{ @@ -653,7 +653,7 @@ /area/ruin/powered/golem_ship) "Qd" = ( /obj/item/resonator, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/ruin/powered/golem_ship) "Qu" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ diff --git a/_maps/RandomRuins/StationRuins/BoxStation/dorms_edoor5.dmm b/_maps/RandomRuins/StationRuins/BoxStation/dorms_edoor5.dmm index f5e4913a580d..2b43eb4a8fa5 100644 --- a/_maps/RandomRuins/StationRuins/BoxStation/dorms_edoor5.dmm +++ b/_maps/RandomRuins/StationRuins/BoxStation/dorms_edoor5.dmm @@ -7,7 +7,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 6 }, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/template_noop) "b" = ( /obj/structure/bed, @@ -18,7 +18,7 @@ dir = 8 }, /obj/item/bedsheet/purple, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/template_noop) "n" = ( /obj/machinery/light/small{ @@ -28,13 +28,13 @@ dir = 4 }, /obj/structure/table/glass, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/template_noop) "F" = ( /obj/structure/chair/office/dark{ dir = 1 }, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/template_noop) "U" = ( /obj/effect/landmark/xeno_spawn, @@ -44,7 +44,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 5 }, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/template_noop) "Z" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -53,7 +53,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 }, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/template_noop) (1,1,1) = {" diff --git a/_maps/RandomRuins/StationRuins/BoxStation/dorms_edoor6.dmm b/_maps/RandomRuins/StationRuins/BoxStation/dorms_edoor6.dmm index b3af23e48d92..36c30d02bce2 100644 --- a/_maps/RandomRuins/StationRuins/BoxStation/dorms_edoor6.dmm +++ b/_maps/RandomRuins/StationRuins/BoxStation/dorms_edoor6.dmm @@ -6,13 +6,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/template_noop) "o" = ( /obj/structure/chair/office/dark{ dir = 1 }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/template_noop) "x" = ( /obj/structure/bed, @@ -23,7 +23,7 @@ dir = 8 }, /obj/item/bedsheet/nanotrasen, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/template_noop) "y" = ( /obj/machinery/light/small{ @@ -33,7 +33,7 @@ dir = 4 }, /obj/structure/table, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/template_noop) "D" = ( /obj/effect/landmark/xeno_spawn, @@ -43,7 +43,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 5 }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/template_noop) "H" = ( /obj/structure/closet/secure_closet/personal, @@ -53,7 +53,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 6 }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/template_noop) (1,1,1) = {" diff --git a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_wizard.dmm b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_wizard.dmm index 10cd9ebc78e2..574187dfb868 100644 --- a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_wizard.dmm +++ b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_wizard.dmm @@ -18,12 +18,12 @@ dir = 8; light_color = "#c1caff" }, -/obj/structure/table/wood/fancy/exoticpurple, +/obj/structure/table/wood/fancy/purple, /obj/item/greentext/quiet, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/template_noop) "h" = ( -/obj/structure/table/wood/fancy/exoticpurple, +/obj/structure/table/wood/fancy/purple, /obj/item/chair/wood/wings, /obj/item/bedsheet/wiz{ pixel_x = 7; @@ -33,24 +33,24 @@ pixel_x = 2; pixel_y = 3 }, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/template_noop) "i" = ( /obj/machinery/light{ dir = 4; light_color = "#c1caff" }, -/obj/structure/table/wood/fancy/exoticpurple, +/obj/structure/table/wood/fancy/purple, /obj/item/storage/pill_bottle/dice{ icon_state = "magicdicebag" }, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/template_noop) "k" = ( -/obj/structure/table/wood/fancy/exoticpurple, +/obj/structure/table/wood/fancy/purple, /obj/item/toy/figure/wizard, /obj/item/clothing/gloves/rapid/hug, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/template_noop) "n" = ( /obj/machinery/door/airlock/maintenance_hatch, @@ -62,7 +62,7 @@ }, /area/template_noop) "r" = ( -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/template_noop) "v" = ( /turf/open/floor/plating{ @@ -79,29 +79,29 @@ dir = 4; light_color = "#c1caff" }, -/obj/structure/table/wood/fancy/exoticpurple, +/obj/structure/table/wood/fancy/purple, /obj/item/clothing/suit/wizrobe/red, /obj/item/clothing/head/wizard/red, /obj/item/clothing/shoes/sandal/magic, /obj/item/staff, /obj/item/clothing/mask/gas/tiki_mask/yalp_elor, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/template_noop) "G" = ( /obj/machinery/light{ dir = 8; light_color = "#c1caff" }, -/obj/structure/table/wood/fancy/exoticpurple, +/obj/structure/table/wood/fancy/purple, /obj/machinery/microwave{ name = "box of cooking"; pixel_x = -1; pixel_y = 6 }, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/template_noop) "K" = ( -/obj/structure/table/wood/fancy/exoticpurple, +/obj/structure/table/wood/fancy/purple, /obj/effect/spawner/lootdrop/donkpockets{ pixel_x = -1; pixel_y = -3 @@ -114,7 +114,7 @@ pixel_x = -6; pixel_y = 7 }, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/template_noop) "N" = ( /turf/open/floor/plating, @@ -122,7 +122,7 @@ "R" = ( /obj/machinery/door/airlock/uranium, /obj/structure/barricade/wooden/crude, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/template_noop) "U" = ( /obj/structure/grille, @@ -134,12 +134,12 @@ "V" = ( /obj/machinery/door/airlock/uranium, /obj/structure/barricade/wooden, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/template_noop) "W" = ( -/obj/structure/table/wood/fancy/exoticpurple, +/obj/structure/table/wood/fancy/purple, /obj/item/book/random/triple, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/template_noop) "Y" = ( /turf/closed/wall/mineral/uranium, diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index aadbfa88a035..48b96c8948f7 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/_maps/map_files/AsteroidStation/AsteroidStation.dmm b/_maps/map_files/AsteroidStation/AsteroidStation.dmm index 9ab34cd54dc4..7d0594b58993 100644 --- a/_maps/map_files/AsteroidStation/AsteroidStation.dmm +++ b/_maps/map_files/AsteroidStation/AsteroidStation.dmm @@ -1813,7 +1813,7 @@ "aqq" = ( /obj/structure/table/wood/poker, /obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/hallway/secondary/entry) "aqt" = ( /obj/machinery/power/smes, @@ -2537,7 +2537,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "awH" = ( -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/hallway/secondary/entry) "awN" = ( /obj/machinery/portable_atmospherics/canister/toxins, @@ -5183,7 +5183,7 @@ "aUF" = ( /obj/structure/table/wood/poker, /obj/item/reagent_containers/food/snacks/cheesyfries, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/hallway/secondary/entry) "aUH" = ( /turf/closed/wall, @@ -29231,7 +29231,7 @@ "iwU" = ( /obj/effect/decal/cleanable/dirt, /obj/item/reagent_containers/food/snacks/grown/cannabis, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/maintenance/port/aft) "iwW" = ( /obj/structure/cable{ @@ -29636,7 +29636,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool, /obj/item/reagent_containers/food/snacks/grown/cannabis, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/maintenance/port/aft) "iEJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -35968,7 +35968,7 @@ /area/security/prison) "kBi" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/maintenance/port/aft) "kBm" = ( /obj/structure/rack, @@ -44389,7 +44389,7 @@ flags_1 = 128 }, /obj/item/reagent_containers/food/snacks/grown/cannabis, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/maintenance/port/aft) "njW" = ( /obj/structure/extinguisher_cabinet{ @@ -63132,7 +63132,7 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/hallway/secondary/entry) "sXe" = ( /obj/structure/cable{ @@ -73104,7 +73104,7 @@ "wkf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/maintenance/port/aft) "wkn" = ( /obj/structure/table/optable, diff --git a/_maps/map_files/GaxStation/GaxStation.dmm b/_maps/map_files/GaxStation/GaxStation.dmm index e04f23cdf1d5..5e6088060ed2 100644 --- a/_maps/map_files/GaxStation/GaxStation.dmm +++ b/_maps/map_files/GaxStation/GaxStation.dmm @@ -578,7 +578,7 @@ req_access_txt = "45"; req_one_access_txt = null }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/cmo) "anu" = ( /obj/effect/turf_decal/loading_area{ @@ -1081,7 +1081,7 @@ icon_state = "2-4" }, /obj/effect/landmark/event_spawn, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/cmo) "aCj" = ( /obj/effect/turf_decal/trimline/purple/filled/line/lower{ @@ -1856,7 +1856,7 @@ freerange = 1; name = "Station Intercom (Command)" }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/bridge/meeting_room) "aVt" = ( /obj/effect/turf_decal/delivery, @@ -4545,7 +4545,7 @@ pixel_y = 25; req_access_txt = "57" }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/hop) "coA" = ( /obj/structure/cable{ @@ -10041,7 +10041,7 @@ pixel_x = -6; pixel_y = 4 }, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "eNI" = ( /obj/effect/turf_decal/trimline/brown/filled/corner/lower{ @@ -10326,7 +10326,7 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/bridge/meeting_room) "eVZ" = ( /obj/machinery/light{ @@ -10423,7 +10423,7 @@ "eYS" = ( /obj/structure/chair/comfy/black, /obj/effect/landmark/start/head_of_security, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/bridge/meeting_room) "eZo" = ( /obj/structure/chair/office/light, @@ -10435,7 +10435,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/cmo) "eZx" = ( /obj/effect/turf_decal/trimline/purple/filled/line/lower{ @@ -10785,7 +10785,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/bridge/meeting_room) "fhN" = ( /obj/structure/cable{ @@ -13322,7 +13322,7 @@ name = "Head of Personnel RC"; pixel_y = -32 }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/hop) "gqR" = ( /turf/open/floor/plating, @@ -13780,7 +13780,7 @@ /obj/structure/cable{ icon_state = "2-8" }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/hop) "gCt" = ( /obj/structure/cable{ @@ -15192,7 +15192,7 @@ pixel_y = 28 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/hop) "hnH" = ( /obj/docking_port/stationary{ @@ -15876,7 +15876,7 @@ pixel_x = 8; pixel_y = 4 }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/bridge/meeting_room) "hBV" = ( /obj/effect/turf_decal/siding/wideplating, @@ -19009,7 +19009,7 @@ dir = 8; pixel_x = 28 }, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "jls" = ( /turf/open/floor/plasteel/white, @@ -19487,7 +19487,7 @@ /obj/structure/sign/plaques/ai_password{ pixel_x = 32 }, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "jyN" = ( /obj/effect/turf_decal/trimline/blue/filled/corner/lower{ @@ -20711,7 +20711,7 @@ /obj/item/storage/pencil_holder/crew/fancy{ pixel_y = 12 }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/cmo) "kdW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ @@ -21343,7 +21343,7 @@ dir = 1 }, /obj/effect/landmark/start/chief_engineer, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/bridge/meeting_room) "kwC" = ( /obj/machinery/light{ @@ -21891,7 +21891,7 @@ /area/teleporter) "kJB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/hop) "kJZ" = ( /obj/machinery/light/small, @@ -22150,7 +22150,7 @@ /obj/structure/cable{ icon_state = "2-8" }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/cmo) "kTM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -27882,7 +27882,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 5 }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/hop) "nHs" = ( /obj/machinery/power/apc{ @@ -29752,7 +29752,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/bridge/meeting_room) "oJl" = ( /obj/effect/turf_decal/trimline/brown/filled/corner/lower{ @@ -30446,7 +30446,7 @@ name = "Station Intercom (General)"; pixel_y = -28 }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/hop) "pdz" = ( /turf/closed/wall/r_wall, @@ -32670,7 +32670,7 @@ dir = 1 }, /obj/effect/landmark/start/head_of_personnel, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/bridge/meeting_room) "qdH" = ( /obj/effect/turf_decal/trimline/brown/filled/line/lower{ @@ -33047,7 +33047,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/structure/disposalpipe/segment, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/bridge/meeting_room) "qlG" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, @@ -35962,7 +35962,7 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/landmark/event_spawn, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "rHt" = ( /obj/machinery/light{ @@ -41202,7 +41202,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/hop) "umn" = ( /obj/machinery/door/airlock/engineering{ @@ -42289,7 +42289,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8 }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/bridge/meeting_room) "uQR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -43986,7 +43986,7 @@ }, /obj/effect/landmark/start/chief_medical_officer, /obj/structure/disposalpipe/segment, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/bridge/meeting_room) "vFH" = ( /obj/machinery/rnd/server, @@ -44190,7 +44190,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/crew_quarters/heads/cmo) "vKU" = ( /obj/structure/closet/secure_closet/bar{ @@ -45070,7 +45070,7 @@ icon_state = "1-4" }, /obj/structure/disposalpipe/segment, -/turf/open/floor/carpet/exoticblue, +/turf/open/floor/carpet/blue, /area/bridge/meeting_room) "whZ" = ( /obj/effect/turf_decal/trimline/blue/filled/corner/lower, @@ -46853,7 +46853,7 @@ /obj/structure/cable{ icon_state = "1-8" }, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "xbm" = ( /obj/machinery/door/airlock/atmos{ @@ -47390,7 +47390,7 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, -/turf/open/floor/carpet/exoticpurple, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "xnH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ diff --git a/_maps/shuttles/emergency_mafia.dmm b/_maps/shuttles/emergency_mafia.dmm index da9a3979ea57..2840edc92bd5 100644 --- a/_maps/shuttles/emergency_mafia.dmm +++ b/_maps/shuttles/emergency_mafia.dmm @@ -30,7 +30,7 @@ "fe" = ( /obj/machinery/chem_dispenser/drinks/beer/fullupgrade, /obj/structure/table/wood, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "fs" = ( /obj/structure/chair/comfy/black{ @@ -45,7 +45,7 @@ "ig" = ( /obj/item/reagent_containers/food/drinks/bottle/wine, /obj/structure/table/wood, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "jA" = ( /obj/item/kirbyplants/random, @@ -86,11 +86,11 @@ "tu" = ( /obj/machinery/chem_dispenser/drinks/fullupgrade, /obj/structure/table/wood, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "ud" = ( /obj/structure/table/wood, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "uo" = ( /obj/structure/fans/tiny/invisible, @@ -109,7 +109,7 @@ /turf/open/floor/carpet/red, /area/shuttle/escape) "wA" = ( -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "yS" = ( /obj/structure/shuttle/engine/heater, @@ -141,7 +141,7 @@ /area/shuttle/escape) "DZ" = ( /mob/living/simple_animal/drone/snowflake/bardrone, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "EY" = ( /obj/docking_port/mobile/emergency{ @@ -177,7 +177,7 @@ pixel_y = 10 }, /obj/structure/table/wood, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "Ge" = ( /obj/item/reagent_containers/food/drinks/bottle/champagne{ @@ -189,11 +189,11 @@ pixel_y = 10 }, /obj/structure/table/wood, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "JW" = ( /obj/machinery/vending/boozeomat, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "Kn" = ( /obj/item/reagent_containers/food/drinks/bottle/champagne{ @@ -205,11 +205,11 @@ pixel_y = 10 }, /obj/structure/table/wood, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "KI" = ( /obj/machinery/computer/emergency_shuttle, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "La" = ( /obj/structure/chair/comfy/black{ @@ -229,7 +229,7 @@ }, /obj/item/reagent_containers/food/drinks/bottle/wine, /obj/structure/table/wood, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "Mi" = ( /obj/structure/table/wood/fancy, @@ -280,12 +280,12 @@ /area/shuttle/escape) "Qr" = ( /mob/living/simple_animal/hostile/alien/maid/barmaid, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "Rs" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/pizza/sassysage, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) "Sa" = ( /mob/living/simple_animal/pet/cat/Proc{ @@ -332,7 +332,7 @@ "Yg" = ( /obj/item/flashlight/lamp/green, /obj/structure/table/wood, -/turf/open/floor/carpet/exoticgreen, +/turf/open/floor/carpet/green, /area/shuttle/escape) (1,1,1) = {" diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index 05844512da3d..f0afacdad8b4 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -86,10 +86,12 @@ DEFINE_BITFIELD(smoothing_junction, list( #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/indestructible/carpet/royal/black -#define SMOOTH_GROUP_CARPET_ROYAL_GREEN S_TURF(19) ///turf/open/indestructible/carpet/royal/black -#define SMOOTH_GROUP_CARPET_ROYAL_BLUE S_TURF(20) ///turf/open/indestructible/carpet/royal/blue -#define SMOOTH_GROUP_CARPET_ROYAL_PURPLE S_TURF(21) ///turf/open/indestructible/carpet/royal/purple +#define SMOOTH_GROUP_CARPET_ROYAL_BLACK S_TURF(18) ///turf/open/indestructible/carpet/royalblack +///Unimplemented because we haven't cut the icons yet +#define SMOOTH_GROUP_CARPET_ROYAL_GREEN S_TURF(19) ///turf/open/indestructible/carpet/royalgreen +#define SMOOTH_GROUP_CARPET_ROYAL_BLUE S_TURF(20) ///turf/open/indestructible/carpet/royalblue +///Unimplemented because we haven't cut the icons yet +#define SMOOTH_GROUP_CARPET_ROYAL_PURPLE S_TURF(21) ///turf/open/indestructible/carpet/royalpurple #define SMOOTH_GROUP_CARPET_EXECUTIVE S_TURF(22) ///turf/open/floor/carpet/executive #define SMOOTH_GROUP_CARPET_STELLAR S_TURF(23) ///turf/open/floor/carpet/stellar #define SMOOTH_GROUP_CARPET_DONK S_TURF(24) ///turf/open/floor/carpet/donk diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 635b395df8bc..44dd0676c9f1 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -142,3 +142,6 @@ require only minor tweaks. #define PLACE_ICE_UNDERGROUND_RUIN "iceunderground" ///boolean - does this z disable parallax? #define ZTRAIT_NOPARALLAX "No Parallax" + +/// A map key that corresponds to being one exclusively for Space. +#define SPACE_KEY "space" diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 72912c548c8b..ee485f2c4358 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -120,6 +120,9 @@ /// Successful, but don't print anything. Useful if subsystem was disabled. #define SS_INIT_NO_NEED 3 +/// Succesfully initialized, BUT do not announce it to players (generally to hide game mechanics it would otherwise spoil) +#define SS_INIT_NO_MESSAGE 4 + //! ### SS initialization load orders // Subsystem init_order, from highest priority to lowest priority // Subsystems shutdown in the reverse of the order they initialize in @@ -191,7 +194,7 @@ #define FIRE_PRIORITY_THROWING 25 #define FIRE_PRIORITY_SPACEDRIFT 30 #define FIRE_PRIORITY_FIELDS 30 -#define FIRE_PRIORITY_SMOOTHING 35 +#define FIRE_PRIORITY_SMOOTHING 35 #define FIRE_PRIORITY_NETWORKS 40 #define FIRE_PRIORITY_OBJ 40 #define FIRE_PRIORITY_ACID 40 diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 6a1cfd6191a3..5c5ff5a059a3 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -166,6 +166,8 @@ xxx xxx xxx ///do not use, use QUEUE_SMOOTH(atom) /atom/proc/smooth_icon() + if(QDELETED(src)) + return smoothing_flags &= ~SMOOTH_QUEUED flags_1 |= HTML_USE_INITAL_ICON_1 if (!z) diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index 59b19ad1bdab..97ec54a0d490 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -43,6 +43,10 @@ GLOBAL_LIST_EMPTY(brazil_reception) //teleport receive spots for heretic sacrifi GLOBAL_LIST_EMPTY(ruin_landmarks) GLOBAL_LIST_EMPTY(delta_areas) GLOBAL_LIST_EMPTY(bar_areas) + +/// List of all the maps that have been cached for /proc/load_map +GLOBAL_LIST_EMPTY(cached_maps) + // IF YOU ARE MAKING A NEW BAR TEMPLATE AND WANT IT ROUNDSTART ADD IT TO THIS LIST! GLOBAL_LIST_INIT(potential_box_bars, list("Bar Trek", "Bar Spacious", "Bar Box", "Bar Casino", "Bar Citadel", "Bar Conveyor", "Bar Diner", "Bar Disco", "Bar Purple", "Bar Cheese", "Bar Grassy", "Bar Clock", "Bar Arcade")) GLOBAL_LIST_INIT(potential_box_clerk, list("Clerk Box", "Clerk Pod", "Clerk Meta", "Clerk Gambling Hall")) diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index d221400577f3..c3bc229585a7 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -458,17 +458,17 @@ /datum/config_entry/number/mc_tick_rate/base_mc_tick_rate integer = FALSE - config_entry_value = 1 + default = 1 /datum/config_entry/number/mc_tick_rate/high_pop_mc_tick_rate integer = FALSE - config_entry_value = 1.1 + default = 1.1 /datum/config_entry/number/mc_tick_rate/high_pop_mc_mode_amount - config_entry_value = 65 + default = 65 /datum/config_entry/number/mc_tick_rate/disable_high_pop_mc_mode_amount - config_entry_value = 60 + default = 60 /datum/config_entry/number/mc_tick_rate abstract_type = /datum/config_entry/number/mc_tick_rate @@ -482,7 +482,7 @@ /datum/config_entry/flag/resume_after_initializations/ValidateAndSet(str_val) . = ..() - if(. && Master.current_runlevel) + if(. && MC_RUNNING()) world.sleep_offline = !config_entry_value /datum/config_entry/number/rounds_until_hard_restart @@ -513,6 +513,13 @@ /datum/config_entry/flag/everyone_is_donator +/datum/config_entry/flag/auto_profile +/datum/config_entry/number/drift_dump_threshold + default = 4 SECONDS + +/datum/config_entry/number/drift_profile_delay + default = 15 SECONDS + /datum/config_entry/string/centcom_ban_db // URL for the CentCom Galactic Ban DB API /datum/config_entry/string/vpn_lookup_api // URL for VPN lookup API diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 99074b343c48..93b36ddf2b4d 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -44,6 +44,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/init_timeofday var/init_time var/tickdrift = 0 + /// Tickdrift as of last tick, w no averaging going on + var/olddrift = 0 /// How long is the MC sleeping between runs, read only (set by Loop() based off of anti-tick-contention heuristics) var/sleep_delta = 1 @@ -72,6 +74,10 @@ GLOBAL_REAL(Master, /datum/controller/master) = new /// Outside of initialization, returns null. var/current_initializing_subsystem = null + /// The last decisecond we force dumped profiling information + /// Used to avoid spamming profile reads since they can be expensive (string memes) + var/last_profiled = 0 + var/static/restart_clear = 0 var/static/restart_timeout = 0 var/static/restart_count = 0 @@ -88,11 +94,11 @@ GLOBAL_REAL(Master, /datum/controller/master) = new // Highlander-style: there can only be one! Kill off the old and replace it with the new. if(!random_seed) -#ifdef UNIT_TESTS - random_seed = 29051994 -#else + #ifdef UNIT_TESTS + random_seed = 29051994 // How about 22475? + #else random_seed = rand(1, 1e9) -#endif + #endif rand_seed(random_seed) var/list/_subsystems = list() @@ -136,6 +142,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new reverse_range(subsystems) for(var/datum/controller/subsystem/ss in subsystems) log_world("Shutting down [ss.name] subsystem...") + if (ss.slept_count > 0) + log_world("Warning: Subsystem `[ss.name]` slept [ss.slept_count] times.") ss.Shutdown() log_world("Shutdown complete") @@ -204,10 +212,10 @@ GLOBAL_REAL(Master, /datum/controller/master) = new StartProcessing(10) else to_chat(world, span_boldannounce("The Master Controller is having some issues, we will need to re-initialize EVERYTHING")) - Initialize(20, TRUE) + Initialize(20, TRUE, FALSE) // Please don't stuff random bullshit here, -// Make a subsystem, give it the SS_NO_FIRE flag, and do your work in it's Initialize(mapload) +// Make a subsystem, give it the SS_NO_FIRE flag, and do your work in it's Initialize() /datum/controller/master/Initialize(delay, init_sss, tgs_prime) set waitfor = 0 @@ -254,7 +262,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new if (!mc_started) mc_started = TRUE if (!current_runlevel) - SetRunLevel(1) + SetRunLevel(1) // Intentionally not using the defines here because the MC doesn't care about them // Loop. Master.StartProcessing(0) @@ -303,6 +311,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new SS_INIT_NONE, SS_INIT_SUCCESS, SS_INIT_NO_NEED, + SS_INIT_NO_MESSAGE, ) if (subsystem.flags & SS_NO_INIT || subsystem.initialized) //Don't init SSs with the corresponding flag or if they already are initialized @@ -324,9 +333,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new if(result && !(result in valid_results)) warning("[subsystem.name] subsystem initialized, returning invalid result [result]. This is a bug.") - // just returned ..() or didn't implement Initialize(mapload) at all + // just returned ..() or didn't implement Initialize() at all if(result == SS_INIT_NONE) - warning("[subsystem.name] subsystem does not implement Initialize(mapload) or it returns ..(). If the former is true, the SS_NO_INIT flag should be set for this subsystem.") + warning("[subsystem.name] subsystem does not implement Initialize() or it returns ..(). If the former is true, the SS_NO_INIT flag should be set for this subsystem.") if(result != SS_INIT_FAILURE) // Some form of success, implicit failure, or the SS in unused. @@ -348,7 +357,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new if(SS_INIT_FAILURE) message_prefix = "Failed to initialize [subsystem.name] subsystem after" chat_warning = TRUE - if(SS_INIT_SUCCESS) + if(SS_INIT_SUCCESS, SS_INIT_NO_MESSAGE) message_prefix = "Initialized [subsystem.name] subsystem within" if(SS_INIT_NO_NEED) // This SS is disabled or is otherwise shy. @@ -361,24 +370,17 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/message = "[message_prefix] [seconds] second[seconds == 1 ? "" : "s"]!" var/chat_message = chat_warning ? span_boldwarning(message) : span_boldannounce(message) - to_chat(world, chat_message) + if(result != SS_INIT_NO_MESSAGE) + to_chat(world, chat_message) log_world(message) - //yogs loading points - if(subsystem.loading_points) // We're probably one of those crappy subsystems that take 0 seconds, so return - subsystem.total_loading_points_progress += subsystem.loading_points - var/percent = round(subsystem.total_loading_points_progress / subsystem.total_loading_points * 100) - to_chat(world,span_boldnotice("Subsystem initialization at [percent]%...")) - // Yogs end - /datum/controller/master/proc/SetRunLevel(new_runlevel) var/old_runlevel = current_runlevel - if(isnull(old_runlevel)) - old_runlevel = "NULL" - testing("MC: Runlevel changed from [old_runlevel] to [new_runlevel]") + testing("MC: Runlevel changed from [isnull(old_runlevel) ? "NULL" : old_runlevel] to [new_runlevel]") current_runlevel = log(2, new_runlevel) + 1 if(current_runlevel < 1) + current_runlevel = old_runlevel CRASH("Attempted to set invalid runlevel: [new_runlevel]") // Starts the mc, and sticks around to restart it if the loop ever ends. @@ -469,9 +471,14 @@ GLOBAL_REAL(Master, /datum/controller/master) = new canary.use_variable() //the actual loop. while (1) - tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, (((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag))) + var/newdrift = ((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag + tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, newdrift)) var/starting_tick_usage = TICK_USAGE + if(newdrift - olddrift >= CONFIG_GET(number/drift_dump_threshold)) + AttemptProfileDump(CONFIG_GET(number/drift_profile_delay)) + olddrift = newdrift + if (init_stage != init_stage_completed) return MC_LOOP_RTN_NEWSTAGES if (processing <= 0) @@ -830,3 +837,11 @@ GLOBAL_REAL(Master, /datum/controller/master) = new for (var/thing in subsystems) var/datum/controller/subsystem/SS = thing SS.OnConfigLoad() + +/// Attempts to dump our current profile info into a file, triggered if the MC thinks shit is going down +/// Accepts a delay in deciseconds of how long ago our last dump can be, this saves causing performance problems ourselves +/datum/controller/master/proc/AttemptProfileDump(delay) + if(REALTIMEOFDAY - last_profiled <= delay) + return FALSE + last_profiled = REALTIMEOFDAY + SSprofiler.DumpFile(allow_yield = FALSE) diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index 44af4ee772ae..653aeb67d26f 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -65,6 +65,9 @@ /// Tracks the current execution state of the subsystem. Used to handle subsystems that sleep in fire so the mc doesn't run them again while they are sleeping var/state = SS_IDLE + + /// Tracks how many times a subsystem has ever slept in fire(). + var/slept_count = 0 /// Tracks how many fires the subsystem has consecutively paused on in the current run var/paused_ticks = 0 @@ -126,8 +129,10 @@ fire(resumed) . = state if (state == SS_SLEEPING) + slept_count++ state = SS_IDLE if (state == SS_PAUSING) + slept_count++ var/QT = queued_time enqueue() state = SS_PAUSED diff --git a/code/controllers/subsystem/demo.dm b/code/controllers/subsystem/demo.dm index 0833575471c8..267db6c7764c 100644 --- a/code/controllers/subsystem/demo.dm +++ b/code/controllers/subsystem/demo.dm @@ -456,7 +456,7 @@ SUBSYSTEM_DEF(demo) return if(!isobj(M) && !ismob(M)) return - if(M.gc_destroyed) + if(M.gc_destroyed || QDELETED(M)) return if(!marked_new[M]) marked_dirty[M] = TRUE diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 5725adb82b65..1b9a351fcc4c 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -107,13 +107,27 @@ SUBSYSTEM_DEF(mapping) /datum/controller/subsystem/mapping/Initialize(timeofday) HACK_LoadMapConfig() if(initialized) - return + return SS_INIT_SUCCESS if(config.defaulted) var/old_config = config config = global.config.defaultmap if(!config || config.defaulted) to_chat(world, span_boldannounce("Unable to load next or default map config, defaulting to Box Station")) config = old_config + plane_offset_to_true = list() + true_to_offset_planes = list() + plane_to_offset = list() + // VERY special cases for FLOAT_PLANE, so it will be treated as expected by plane management logic + // Sorry :( + plane_offset_to_true["[FLOAT_PLANE]"] = FLOAT_PLANE + true_to_offset_planes["[FLOAT_PLANE]"] = list(FLOAT_PLANE) + plane_to_offset["[FLOAT_PLANE]"] = 0 + plane_offset_blacklist = list() + // You aren't allowed to offset a floatplane that'll just fuck it all up + plane_offset_blacklist["[FLOAT_PLANE]"] = TRUE + render_offset_blacklist = list() + critical_planes = list() + create_plane_offsets(0, 0) loadWorld() require_area_resort() process_teleport_locs() //Sets up the wizard teleport locations @@ -587,27 +601,40 @@ GLOBAL_LIST_EMPTY(the_station_areas) GLOB.the_gateway.awaygate = new_gate GLOB.the_gateway.wait = world.time -/datum/controller/subsystem/mapping/proc/RequestBlockReservation(width, height, z, type = /datum/turf_reservation, turf_type_override) - UNTIL(initialized && !clearing_reserved_turfs) - var/datum/turf_reservation/reserve = new type - if(turf_type_override) +/// Adds a new reservation z level. A bit of space that can be handed out on request +/// Of note, reservations default to transit turfs, to make their most common use, shuttles, faster +/datum/controller/subsystem/mapping/proc/add_reservation_zlevel(for_shuttles) + num_of_res_levels++ + return add_new_zlevel("Transit/Reserved #[num_of_res_levels]", list(ZTRAIT_RESERVED = TRUE)) + +/// Requests a /datum/turf_reservation based on the given width, height, and z_size. You can specify a z_reservation to use a specific z level, or leave it null to use any z level. +/datum/controller/subsystem/mapping/proc/request_turf_block_reservation( + width, + height, + z_size = 1, + z_reservation = null, + reservation_type = /datum/turf_reservation, + turf_type_override = null, +) + UNTIL((!z_reservation || reservation_ready["[z_reservation]"]) && !clearing_reserved_turfs) + var/datum/turf_reservation/reserve = new reservation_type + if(!isnull(turf_type_override)) reserve.turf_type = turf_type_override - if(!z) + if(!z_reservation) for(var/i in levels_by_trait(ZTRAIT_RESERVED)) - if(reserve.Reserve(width, height, i)) + if(reserve.reserve(width, height, z_size, i)) return reserve //If we didn't return at this point, theres a good chance we ran out of room on the exisiting reserved z levels, so lets try a new one - num_of_res_levels += 1 - var/datum/space_level/newReserved = add_new_zlevel("Transit/Reserved [num_of_res_levels]", list(ZTRAIT_RESERVED = TRUE)) + var/datum/space_level/newReserved = add_reservation_zlevel() initialize_reserved_level(newReserved.z_value) - if(reserve.Reserve(width, height, newReserved.z_value)) + if(reserve.reserve(width, height, z_size, newReserved.z_value)) return reserve else - if(!level_trait(z, ZTRAIT_RESERVED)) + if(!level_trait(z_reservation, ZTRAIT_RESERVED)) qdel(reserve) return else - if(reserve.Reserve(width, height, z)) + if(reserve.reserve(width, height, z_size, z_reservation)) return reserve QDEL_NULL(reserve) @@ -788,6 +815,31 @@ GLOBAL_LIST_EMPTY(the_station_areas) true_to_offset_planes[string_real] |= offset_plane +/datum/controller/subsystem/mapping/proc/lazy_load_template(template_key, force = FALSE) + RETURN_TYPE(/datum/turf_reservation) + + UNTIL(initialized) + var/static/lazy_loading = FALSE + UNTIL(!lazy_loading) + + lazy_loading = TRUE + . = _lazy_load_template(template_key, force) + lazy_loading = FALSE + return . + +/datum/controller/subsystem/mapping/proc/_lazy_load_template(template_key, force = FALSE) + PRIVATE_PROC(TRUE) + + if(LAZYACCESS(loaded_lazy_templates, template_key) && !force) + var/datum/lazy_template/template = GLOB.lazy_templates[template_key] + return template.reservations[1] + LAZYSET(loaded_lazy_templates, template_key, TRUE) + + var/datum/lazy_template/target = GLOB.lazy_templates[template_key] + if(!target) + CRASH("Attempted to lazy load a template key that does not exist: '[template_key]'") + return target.lazy_load() + /proc/generate_lighting_appearance_by_z(z_level) if(length(GLOB.default_lighting_underlays_by_z) < z_level) GLOB.default_lighting_underlays_by_z.len = z_level diff --git a/code/controllers/subsystem/profiler.dm b/code/controllers/subsystem/profiler.dm new file mode 100644 index 000000000000..dc06c2bc6ae7 --- /dev/null +++ b/code/controllers/subsystem/profiler.dm @@ -0,0 +1,74 @@ +#define PROFILER_FILENAME "profiler.json" +#define SENDMAPS_FILENAME "sendmaps.json" + +SUBSYSTEM_DEF(profiler) + name = "Profiler" + init_order = INIT_ORDER_PROFILER + runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY + wait = 3000 + var/fetch_cost = 0 + var/write_cost = 0 + +/datum/controller/subsystem/profiler/stat_entry(msg) + msg += "F:[round(fetch_cost,1)]ms" + msg += "|W:[round(write_cost,1)]ms" + return msg + +/datum/controller/subsystem/profiler/Initialize() + if(CONFIG_GET(flag/auto_profile)) + StartProfiling() + else + StopProfiling() //Stop the early start profiler + return SS_INIT_SUCCESS + +/datum/controller/subsystem/profiler/OnConfigLoad() + if(CONFIG_GET(flag/auto_profile)) + StartProfiling() + can_fire = TRUE + else + StopProfiling() + can_fire = FALSE + +/datum/controller/subsystem/profiler/fire() + DumpFile() + +/datum/controller/subsystem/profiler/Shutdown() + if(CONFIG_GET(flag/auto_profile)) + DumpFile(allow_yield = FALSE) + world.Profile(PROFILE_CLEAR, type = "sendmaps") + return ..() + +/datum/controller/subsystem/profiler/proc/StartProfiling() + world.Profile(PROFILE_START) + world.Profile(PROFILE_START, type = "sendmaps") + +/datum/controller/subsystem/profiler/proc/StopProfiling() + world.Profile(PROFILE_STOP) + world.Profile(PROFILE_STOP, type = "sendmaps") + +/datum/controller/subsystem/profiler/proc/DumpFile(allow_yield = TRUE) + var/timer = TICK_USAGE_REAL + var/current_profile_data = world.Profile(PROFILE_REFRESH, format = "json") + var/current_sendmaps_data = world.Profile(PROFILE_REFRESH, type = "sendmaps", format="json") + fetch_cost = MC_AVERAGE(fetch_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(allow_yield) + CHECK_TICK + + if(!length(current_profile_data)) //Would be nice to have explicit proc to check this + stack_trace("Warning, profiling stopped manually before dump.") + var/prof_file = file("[GLOB.log_directory]/[PROFILER_FILENAME]") + if(fexists(prof_file)) + fdel(prof_file) + if(!length(current_sendmaps_data)) //Would be nice to have explicit proc to check this + stack_trace("Warning, sendmaps profiling stopped manually before dump.") + var/sendmaps_file = file("[GLOB.log_directory]/[SENDMAPS_FILENAME]") + if(fexists(sendmaps_file)) + fdel(sendmaps_file) + + timer = TICK_USAGE_REAL + WRITE_FILE(prof_file, current_profile_data) + WRITE_FILE(sendmaps_file, current_sendmaps_data) + write_cost = MC_AVERAGE(write_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + +#undef PROFILER_FILENAME +#undef SENDMAPS_FILENAME diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 9a7129c90495..50afece2f532 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -63,15 +63,24 @@ SUBSYSTEM_DEF(shuttle) var/lockdown = FALSE //disallow transit after nuke goes off + /// The currently selected shuttle map_template in the shuttle manipulator's template viewer. var/datum/map_template/shuttle/selected - + /// The existing shuttle associated with the selected shuttle map_template. var/obj/docking_port/mobile/existing_shuttle - var/obj/docking_port/mobile/preview_shuttle + /// The shuttle map_template of the shuttle we want to preview. var/datum/map_template/shuttle/preview_template + /// The docking port associated to the preview_template that's currently being previewed. + var/obj/docking_port/mobile/preview_shuttle + /// The turf reservation for the current previewed shuttle. var/datum/turf_reservation/preview_reservation + /// Are we currently in the process of loading a shuttle? Useful to ensure we don't load more than one at once, to avoid weird inconsistencies and possible runtimes. + var/shuttle_loading + /// Did the supermatter start a cascade event? + var/supermatter_cascade = FALSE + /datum/controller/subsystem/shuttle/Initialize(timeofday) ordernum = rand(1, 9000) @@ -497,12 +506,18 @@ SUBSYSTEM_DEF(shuttle) if(WEST) transit_path = /turf/open/space/transit/west - var/datum/turf_reservation/proposal = SSmapping.RequestBlockReservation(transit_width, transit_height, null, /datum/turf_reservation/transit, transit_path) + var/datum/turf_reservation/proposal = SSmapping.request_turf_block_reservation( + transit_width, + transit_height, + 1, + reservation_type = /datum/turf_reservation/transit, + turf_type_override = transit_path, + ) if(!istype(proposal)) return FALSE - var/turf/bottomleft = locate(proposal.bottom_left_coords[1], proposal.bottom_left_coords[2], proposal.bottom_left_coords[3]) + var/turf/bottomleft = proposal.bottom_left_turfs[1] // Then create a transit docking port in the middle var/coords = M.return_coords(0, 0, dock_dir) /* 0------2 @@ -686,8 +701,15 @@ SUBSYSTEM_DEF(shuttle) QDEL_LIST(remove_images) - -/datum/controller/subsystem/shuttle/proc/action_load(datum/map_template/shuttle/loading_template, obj/docking_port/stationary/destination_port) +/** + * Loads a shuttle template and sends it to a given destination port, optionally replacing the existing shuttle + * + * Arguments: + * * loading_template - The shuttle template to load + * * destination_port - The station docking port to send the shuttle to once loaded + * * replace - Whether to replace the shuttle or create a new one +*/ +/datum/controller/subsystem/shuttle/proc/action_load(datum/map_template/shuttle/loading_template, obj/docking_port/stationary/destination_port, replace = FALSE) // Check for an existing preview if(preview_shuttle && (loading_template != preview_template)) preview_shuttle.jumpToNullSpace() @@ -748,16 +770,28 @@ SUBSYSTEM_DEF(shuttle) selected = null QDEL_NULL(preview_reservation) -/datum/controller/subsystem/shuttle/proc/load_template(datum/map_template/shuttle/S) +/** + * Loads a shuttle template into the transit Z level, usually referred to elsewhere in the code as a shuttle preview. + * Does not register the shuttle so it can't be used yet, that's handled in action_load() + * + * Arguments: + * * loading_template - The shuttle template to load + */ +/datum/controller/subsystem/shuttle/proc/load_template(datum/map_template/shuttle/loading_template) . = FALSE - // load shuttle template, centred at shuttle import landmark, - preview_reservation = SSmapping.RequestBlockReservation(S.width, S.height, SSmapping.transit.z_value, /datum/turf_reservation/transit) + // Load shuttle template to a fresh block reservation. + preview_reservation = SSmapping.request_turf_block_reservation( + loading_template.width, + loading_template.height, + 1, + reservation_type = /datum/turf_reservation/transit, + ) if(!preview_reservation) CRASH("failed to reserve an area for shuttle template loading") - var/turf/BL = TURF_FROM_COORDS_LIST(preview_reservation.bottom_left_coords) - S.load(BL, centered = FALSE, register = FALSE) + var/turf/bottom_left = preview_reservation.bottom_left_turfs[1] + loading_template.load(bottom_left, centered = FALSE, register = FALSE) - var/affected = S.get_affected_turfs(BL, centered=FALSE) + var/affected = loading_template.get_affected_turfs(bottom_left, centered=FALSE) var/found = 0 // Search the turfs for docking ports @@ -765,34 +799,39 @@ SUBSYSTEM_DEF(shuttle) // the shuttle. // - We need to check that no additional ports have slipped in from the // template, because that causes unintended behaviour. - for(var/T in affected) - for(var/obj/docking_port/P in T) - if(istype(P, /obj/docking_port/mobile)) + for(var/affected_turfs in affected) + for(var/obj/docking_port/port in affected_turfs) + if(istype(port, /obj/docking_port/mobile)) found++ if(found > 1) - qdel(P, force=TRUE) - log_world("Map warning: Shuttle Template [S.mappath] has multiple mobile docking ports.") + qdel(port, force=TRUE) + log_mapping("Shuttle Template [loading_template.mappath] has multiple mobile docking ports.") else - preview_shuttle = P - if(istype(P, /obj/docking_port/stationary)) - log_world("Map warning: Shuttle Template [S.mappath] has a stationary docking port.") + preview_shuttle = port + if(istype(port, /obj/docking_port/stationary)) + log_mapping("Shuttle Template [loading_template.mappath] has a stationary docking port.") if(!found) - var/msg = "load_template(): Shuttle Template [S.mappath] has no mobile docking port. Aborting import." - for(var/T in affected) - var/turf/T0 = T + var/msg = "load_template(): Shuttle Template [loading_template.mappath] has no mobile docking port. Aborting import." + for(var/affected_turfs in affected) + var/turf/T0 = affected_turfs T0.empty() message_admins(msg) WARNING(msg) return //Everything fine - S.post_load(preview_shuttle) + loading_template.post_load(preview_shuttle) return TRUE +/** + * Removes the preview_shuttle from the transit Z-level + */ /datum/controller/subsystem/shuttle/proc/unload_preview() if(preview_shuttle) preview_shuttle.jumpToNullSpace() preview_shuttle = null + if(preview_reservation) + QDEL_NULL(preview_reservation) /datum/controller/subsystem/shuttle/ui_state(mob/user) return GLOB.admin_state diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index a056a6c07512..95d590a0fded 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -1,7 +1,7 @@ /// Controls how many buckets should be kept, each representing a tick. (1 minutes worth) #define BUCKET_LEN (world.fps*1*60) /// Helper for getting the correct bucket for a given timer -#define BUCKET_POS(timer) (((round((timer.timeToRun - timer.timer_subsystem.head_offset) / world.tick_lag)+1) % BUCKET_LEN)||BUCKET_LEN) +#define BUCKET_POS(timer) (((ROUND_UP((timer.timeToRun - timer.timer_subsystem.head_offset) / world.tick_lag)+1) % BUCKET_LEN) || BUCKET_LEN) /// Gets the maximum time at which timers will be invoked from buckets, used for deferring to secondary queue #define TIMER_MAX(timer_ss) (timer_ss.head_offset + TICKS2DS(BUCKET_LEN + timer_ss.practical_offset - 1)) /// Max float with integer precision @@ -386,8 +386,9 @@ SUBSYSTEM_DEF(timer) var/list/flags /// Time at which the timer was invoked or destroyed var/spent = 0 - /// An informative name generated for the timer as its representation in strings, useful for debugging - var/name + /// Holds info about this timer, stored from the moment it was created + /// Used to create a visible "name" whenever the timer is stringified + var/list/timer_info /// Next timed event in the bucket var/datum/timedevent/next /// Previous timed event in the bucket @@ -503,6 +504,21 @@ SUBSYSTEM_DEF(timer) bucket_pos = -1 bucket_joined = FALSE +/datum/timedevent/proc/operator""() + if(!length(timer_info)) + return "Event not filled" + var/static/list/bitfield_flags = list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT", "TIMER_LOOP") +#if defined(TIMER_DEBUG) + var/list/callback_args = timer_info[10] + return "Timer: [timer_info[1]] ([text_ref(src)]), TTR: [timer_info[2]], wait:[timer_info[3]] Flags: [jointext(bitfield_to_list(timer_info[4], bitfield_flags), ", ")], \ + callBack: [text_ref(timer_info[5])], callBack.object: [timer_info[6]][timer_info[7]]([timer_info[8]]), \ + callBack.delegate:[timer_info[9]]([callback_args ? callback_args.Join(", ") : ""]), source: [timer_info[11]]" +#else + return "Timer: [timer_info[1]] ([text_ref(src)]), TTR: [timer_info[2]], wait:[timer_info[3]] Flags: [jointext(bitfield_to_list(timer_info[4], bitfield_flags), ", ")], \ + callBack: [text_ref(timer_info[5])], callBack.object: [timer_info[6]]([timer_info[7]]), \ + callBack.delegate:[timer_info[8]], source: [timer_info[9]]" +#endif + /** * Attempts to add this timed event to a bucket, will enter the secondary queue * if there are no appropriate buckets at this time. @@ -512,14 +528,38 @@ SUBSYSTEM_DEF(timer) * If the timed event is tracking client time, it will be added to a special bucket. */ /datum/timedevent/proc/bucketJoin() - // Generate debug-friendly name for timer - var/static/list/bitfield_flags = list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT", "TIMER_LOOP") - name = "Timer: [id] ([text_ref(src)]), TTR: [timeToRun], wait:[wait] Flags: [jointext(bitfield_to_list(flags, bitfield_flags), ", ")], \ - callBack: [text_ref(callBack)], callBack.object: [callBack.object][text_ref(callBack.object)]([getcallingtype()]), \ - callBack.delegate:[callBack.delegate]([callBack.arguments ? callBack.arguments.Join(", ") : ""]), source: [source]" +#if defined(TIMER_DEBUG) + // Generate debug-friendly list for timer, more complex but also more expensive + timer_info = list( + 1 = id, + 2 = timeToRun, + 3 = wait, + 4 = flags, + 5 = callBack, /* Safe to hold this directly becasue it's never del'd */ + 6 = "[callBack.object]", + 7 = text_ref(callBack.object), + 8 = getcallingtype(), + 9 = callBack.delegate, + 10 = callBack.arguments ? callBack.arguments.Copy() : null, + 11 = "[source]" + ) +#else + // Generate a debuggable list for the timer, simpler but wayyyy cheaper, string generation (and ref/copy memes) is a bitch and this saves a LOT of time + timer_info = list( + 1 = id, + 2 = timeToRun, + 3 = wait, + 4 = flags, + 5 = callBack, /* Safe to hold this directly becasue it's never del'd */ + 6 = "[callBack.object]", + 7 = getcallingtype(), + 8 = callBack.delegate, + 9 = "[source]" + ) +#endif if (bucket_joined) - stack_trace("Bucket already joined! [name]") + stack_trace("Bucket already joined! [src]") // Check if this timed event should be diverted to the client time bucket, or the secondary queue var/list/L @@ -539,7 +579,7 @@ SUBSYSTEM_DEF(timer) if (bucket_pos < timer_subsystem.practical_offset && timeToRun < (timer_subsystem.head_offset + TICKS2DS(BUCKET_LEN))) WARNING("Bucket pos in past: bucket_pos = [bucket_pos] < practical_offset = [timer_subsystem.practical_offset] \ - && timeToRun = [timeToRun] < [timer_subsystem.head_offset + TICKS2DS(BUCKET_LEN)], Timer: [name]") + && timeToRun = [timeToRun] < [timer_subsystem.head_offset + TICKS2DS(BUCKET_LEN)], Timer: [src]") bucket_pos = timer_subsystem.practical_offset // Recover bucket_pos to avoid timer blocking queue var/datum/timedevent/bucket_head = bucket_list[bucket_pos] @@ -568,7 +608,7 @@ SUBSYSTEM_DEF(timer) if (callBack.object == GLOBAL_PROC) . = "GLOBAL_PROC" else - . = "[callBack?.object?.type]" + . = "[callBack.object.type]" /** * Create a new timer and insert it in the queue. @@ -581,8 +621,8 @@ SUBSYSTEM_DEF(timer) * * timer_subsystem the subsystem to insert this timer into */ /proc/_addtimer(datum/callback/callback, wait = 0, flags = 0, datum/controller/subsystem/timer/timer_subsystem, file, line) - if (!callback) - CRASH("addtimer called without a callback") + ASSERT(istype(callback), "addtimer called [callback ? "with an invalid callback ([callback])" : "without a callback"]") + ASSERT(isnum(wait), "addtimer called with a non-numeric wait ([wait])") if (wait < 0) stack_trace("addtimer called with a negative wait. Converting to [world.tick_lag]") diff --git a/code/datums/profiling.dm b/code/datums/profiling.dm index aa452de33a73..dcf966750a62 100644 --- a/code/datums/profiling.dm +++ b/code/datums/profiling.dm @@ -1,5 +1,5 @@ //these are real globals so you can use profiling to profile early world init stuff. -GLOBAL_REAL_VAR(list/PROFILE_STORE) +GLOBAL_REAL(PROFILE_STORE, /list) GLOBAL_REAL_VAR(PROFILE_LINE) GLOBAL_REAL_VAR(PROFILE_FILE) GLOBAL_REAL_VAR(PROFILE_SLEEPCHECK) diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index ca3186d59540..dd1e0a52e6ca 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -115,15 +115,19 @@ /area/shuttle/pod_1 name = "Escape Pod One" + area_flags = NONE /area/shuttle/pod_2 name = "Escape Pod Two" + area_flags = NONE /area/shuttle/pod_3 name = "Escape Pod Three" + area_flags = NONE /area/shuttle/pod_4 name = "Escape Pod Four" + area_flags = NONE /area/shuttle/mining name = "Mining Shuttle" diff --git a/code/game/atom/atom_initializing_EXPENSIVE.dm b/code/game/atom/atom_initializing_EXPENSIVE.dm index 84c9a322ec99..ac7cb6e98e35 100644 --- a/code/game/atom/atom_initializing_EXPENSIVE.dm +++ b/code/game/atom/atom_initializing_EXPENSIVE.dm @@ -117,11 +117,13 @@ stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 + SET_PLANE_IMPLICIT(src, plane) + //atom color stuff if(color) add_atom_colour(color, FIXED_COLOUR_PRIORITY) - if (light_power && light_range) + if (light_system == STATIC_LIGHT && light_power && light_range) update_light() SETUP_SMOOTHING() diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index a4661b57163d..a530eb86b0aa 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -232,7 +232,7 @@ SSshuttle.unload_preview() SSshuttle.existing_shuttle = SSshuttle.emergency SSshuttle.emergency.name = shuttle.name - SSshuttle.action_load(shuttle) + SSshuttle.action_load(shuttle, replace = TRUE) bank_account.adjust_money(-shuttle.credit_cost) minor_announce("[authorize_name] has purchased [shuttle.name] for [shuttle.credit_cost] credits.[shuttle.extra_desc ? " [shuttle.extra_desc]" : ""]" , "Shuttle Purchase") message_admins("[ADMIN_LOOKUPFLW(usr)] purchased [shuttle.name].") diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index b7cfce40b749..143652cb56a1 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -747,7 +747,7 @@ for(var/heading in list(NORTH,SOUTH,EAST,WEST)) if(!(unres_sides & heading)) continue - var/mutable_appearance/floorlight = mutable_appearance('icons/obj/doors/airlocks/station/overlays.dmi', "unres_[heading]", FLOAT_LAYER, ABOVE_LIGHTING_PLANE) + var/mutable_appearance/floorlight = mutable_appearance('icons/obj/doors/airlocks/station/overlays.dmi', "unres_[heading]", FLOAT_LAYER, src, ABOVE_LIGHTING_PLANE) switch (heading) if (NORTH) floorlight.pixel_x = 0 diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index fbb5417be5b5..666a714f5fbf 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -24,9 +24,6 @@ anchored = FALSE base_state = "pflash" density = TRUE - light_system = MOVABLE_LIGHT //Used as a flash here. - light_range = FLASH_LIGHT_RANGE - light_on = FALSE /obj/machinery/flasher/Initialize(mapload, ndir = 0, built = 0) . = ..() // ..() is EXTREMELY IMPORTANT, never forget to add it diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 86c543b3a69d..b1a080d6eb71 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -39,7 +39,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) var/used = FALSE /obj/effect/landmark/start/proc/after_round_start() -#ifndef UNIT_TESTS // We'd like to keep these around for unit tests, so we can check that they exist. + // We'd like to keep these around for unit tests, so we can check that they exist. +#ifndef UNIT_TESTS if(delete_after_roundstart) qdel(src) #endif @@ -199,8 +200,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) name = "department_sec" icon_state = "Security Officer" -/obj/effect/landmark/start/depsec/New() - ..() +/obj/effect/landmark/start/depsec/Initialize(mapload) + . = ..() GLOB.department_security_spawns += src /obj/effect/landmark/start/depsec/Destroy() @@ -412,14 +413,20 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) GLOB.city_of_cogs_spawns += loc return INITIALIZE_HINT_QDEL -//handles clockwork portal+eminence teleport destinations +/** + * Generic event spawn points + * + * These are placed in locales where there are likely to be players, and places which are identifiable at a glance - + * Such as public hallways, department rooms, head of staff offices, and non-generic maintenance locations + * + * Used in events to cause effects in locations where it is likely to effect players + */ /obj/effect/landmark/event_spawn name = "generic event spawn" icon_state = "generic_event" - layer = OBJ_LAYER -/obj/effect/landmark/event_spawn/New() - ..() +/obj/effect/landmark/event_spawn/Initialize(mapload) + . = ..() GLOB.generic_event_spawns += src /obj/effect/landmark/event_spawn/Destroy() @@ -431,8 +438,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) icon_state = "x" layer = OBJ_LAYER -/obj/effect/landmark/brazil/New() - ..() +/obj/effect/landmark/brazil/Initialize(mapload) + . = ..() GLOB.brazil_reception += src /obj/effect/landmark/brazil/Destroy() @@ -442,9 +449,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/ruin var/datum/map_template/ruin/ruin_template -/obj/effect/landmark/ruin/New(loc, my_ruin_template) +/obj/effect/landmark/ruin/Initialize(mapload, my_ruin_template) + . = ..() name = "ruin_[GLOB.ruin_landmarks.len + 1]" - ..(loc) ruin_template = my_ruin_template GLOB.ruin_landmarks |= src diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 0086228f3d94..58f9a8c51c59 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -20,6 +20,23 @@ /obj/effect/spawner name = "object spawner" +// Brief explanation: +// Rather then setting up and then deleting spawners, we block all atomlike setup +// and do the absolute bare minimum +// This is with the intent of optimizing mapload +/obj/effect/spawner/Initialize(mapload) + SHOULD_CALL_PARENT(FALSE) + if(flags_1 & INITIALIZED_1) + stack_trace("Warning: [src]([type]) initialized multiple times!") + flags_1 |= INITIALIZED_1 + + return INITIALIZE_HINT_QDEL + +/obj/effect/spawner/Destroy(force) + SHOULD_CALL_PARENT(FALSE) + moveToNullspace() + return QDEL_HINT_QUEUE + /obj/effect/list_container name = "list container" diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index 5fb9ed06157e..52015dc4a49a 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -10,11 +10,8 @@ again. /obj/effect/spawner/structure/Initialize(mapload) . = ..() - if(spawn_list && spawn_list.len) - for(var/I in spawn_list) - new I(get_turf(src)) - return INITIALIZE_HINT_QDEL - + for(var/spawn_type in spawn_list) + new spawn_type(loc) //normal windows @@ -28,6 +25,12 @@ again. pipe_astar_cost = 1\ ) +// /obj/effect/spawner/structure/window/Initialize(mapload) +// . = ..() + +// var/turf/current_turf = loc +// current_turf.rcd_memory = RCD_MEMORY_WINDOWGRILLE + /obj/effect/spawner/structure/window/hollow name = "hollow window spawner" icon_state = "hwindow_spawner_full" diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 6d9365afbb8f..0eb26edb2a64 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -208,12 +208,12 @@ turf_type = /turf/open/floor/carpet/black tableVariant = /obj/structure/table/wood/fancy/black -/obj/item/stack/tile/carpet/exoticblue +/obj/item/stack/tile/carpet/blue name = "exotic blue carpet" - icon_state = "tile-carpet-exoticblue" - item_state = "tile-carpet-exoticblue" - turf_type = /turf/open/floor/carpet/exoticblue - tableVariant = /obj/structure/table/wood/fancy/exoticblue + icon_state = "tile-carpet-blue" + item_state = "tile-carpet-blue" + turf_type = /turf/open/floor/carpet/blue + tableVariant = /obj/structure/table/wood/fancy/blue /obj/item/stack/tile/carpet/cyan name = "cyan carpet" @@ -222,12 +222,12 @@ turf_type = /turf/open/floor/carpet/cyan tableVariant = /obj/structure/table/wood/fancy/cyan -/obj/item/stack/tile/carpet/exoticgreen +/obj/item/stack/tile/carpet/green name = "exotic green carpet" - icon_state = "tile-carpet-exoticgreen" - item_state = "tile-carpet-exoticgreen" - turf_type = /turf/open/floor/carpet/exoticgreen - tableVariant = /obj/structure/table/wood/fancy/exoticgreen + icon_state = "tile-carpet-green" + item_state = "tile-carpet-green" + turf_type = /turf/open/floor/carpet/green + tableVariant = /obj/structure/table/wood/fancy/green /obj/item/stack/tile/carpet/orange name = "orange carpet" @@ -236,12 +236,12 @@ turf_type = /turf/open/floor/carpet/orange tableVariant = /obj/structure/table/wood/fancy/orange -/obj/item/stack/tile/carpet/exoticpurple +/obj/item/stack/tile/carpet/purple name = "exotic purple carpet" - icon_state = "tile-carpet-exoticpurple" - item_state = "tile-carpet-exoticpurple" - turf_type = /turf/open/floor/carpet/exoticpurple - tableVariant = /obj/structure/table/wood/fancy/exoticpurple + icon_state = "tile-carpet-purple" + item_state = "tile-carpet-purple" + turf_type = /turf/open/floor/carpet/purple + tableVariant = /obj/structure/table/wood/fancy/purple /obj/item/stack/tile/carpet/red name = "red carpet" @@ -264,6 +264,27 @@ turf_type = /turf/open/floor/carpet/royalblue tableVariant = /obj/structure/table/wood/fancy/royalblue +/obj/item/stack/tile/carpet/executive + name = "executive carpet" + icon_state = "tile_carpet_executive" + item_state = "tile-carpet-royalblue" + turf_type = /turf/open/floor/carpet/executive + merge_type = /obj/item/stack/tile/carpet/executive + +/obj/item/stack/tile/carpet/stellar + name = "stellar carpet" + icon_state = "tile_carpet_stellar" + item_state = "tile-carpet-royalblue" + turf_type = /turf/open/floor/carpet/stellar + merge_type = /obj/item/stack/tile/carpet/stellar + +/obj/item/stack/tile/carpet/donk + name = "\improper Donk Co. promotional carpet" + icon_state = "tile_carpet_donk" + item_state = "tile-carpet-orange" + turf_type = /turf/open/floor/carpet/donk + merge_type = /obj/item/stack/tile/carpet/donk + /obj/item/stack/tile/carpet/fifty amount = 50 @@ -271,19 +292,19 @@ /obj/item/stack/tile/carpet/black/fifty amount = 50 -/obj/item/stack/tile/carpet/exoticblue/fifty +/obj/item/stack/tile/carpet/blue/fifty amount = 50 /obj/item/stack/tile/carpet/cyan/fifty amount = 50 -/obj/item/stack/tile/carpet/exoticgreen/fifty +/obj/item/stack/tile/carpet/green/fifty amount = 50 /obj/item/stack/tile/carpet/orange/fifty amount = 50 -/obj/item/stack/tile/carpet/exoticpurple/fifty +/obj/item/stack/tile/carpet/purple/fifty amount = 50 /obj/item/stack/tile/carpet/red/fifty diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 494ece9155b0..60e00827b950 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -1,7 +1,7 @@ /obj/structure/grille desc = "A flimsy framework of metal rods." name = "grille" - icon = 'icons/obj/smooth_structures/grille.dmi' + icon = 'icons/obj/structures.dmi' icon_state = "grille" density = TRUE anchored = TRUE @@ -32,12 +32,12 @@ if(broken) holes = (holes | 16) //16 is the biggest hole - update_appearance(UPDATE_ICON) + update_appearance() return holes = (holes | (1 << rand(0,3))) //add random holes between 1 and 8 - update_appearance(UPDATE_ICON) + update_appearance() /obj/structure/grille/update_appearance(updates) if(QDELETED(src) || broken) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 3349cf16ee1e..12d80950015d 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -378,11 +378,11 @@ buildstack = /obj/item/stack/tile/carpet/black icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_black.dmi', 'icons/obj/structures.dmi') -/obj/structure/table/wood/fancy/exoticblue - icon_state = "fancy_table_exoticblue" - base_icon_state = "fancy_table_exoticblue" - buildstack = /obj/item/stack/tile/carpet/exoticblue - icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_exoticblue.dmi', 'icons/obj/structures.dmi') +/obj/structure/table/wood/fancy/blue + icon_state = "fancy_table_blue" + base_icon_state = "fancy_table_blue" + buildstack = /obj/item/stack/tile/carpet/blue + icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_blue.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/cyan icon_state = "fancy_table_cyan" @@ -390,11 +390,11 @@ buildstack = /obj/item/stack/tile/carpet/cyan icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_cyan.dmi', 'icons/obj/structures.dmi') -/obj/structure/table/wood/fancy/exoticgreen - icon_state = "fancy_table_exoticgreen" - base_icon_state = "fancy_table_exoticgreen" - buildstack = /obj/item/stack/tile/carpet/exoticgreen - icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_exoticgreen.dmi', 'icons/obj/structures.dmi') +/obj/structure/table/wood/fancy/green + icon_state = "fancy_table_green" + base_icon_state = "fancy_table_green" + buildstack = /obj/item/stack/tile/carpet/green + icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_green.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/orange icon_state = "fancy_table_orange" @@ -402,11 +402,11 @@ buildstack = /obj/item/stack/tile/carpet/orange icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_orange.dmi', 'icons/obj/structures.dmi') -/obj/structure/table/wood/fancy/exoticpurple - icon_state = "fancy_table_exoticpurple" - base_icon_state = "fancy_table_exoticpurple" - buildstack = /obj/item/stack/tile/carpet/exoticpurple - icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_exoticpurple.dmi', 'icons/obj/structures.dmi') +/obj/structure/table/wood/fancy/purple + icon_state = "fancy_table_purple" + base_icon_state = "fancy_table_purple" + buildstack = /obj/item/stack/tile/carpet/purple + icon = MAP_SWITCH('icons/obj/smooth_structures/fancy_table_purple.dmi', 'icons/obj/structures.dmi') /obj/structure/table/wood/fancy/red icon_state = "fancy_table_red" diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 0044f7796b5a..405032dbe4d6 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -47,7 +47,6 @@ /obj/structure/window/Initialize(mapload, direct) . = ..() - AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, PROC_REF(can_be_rotated)), CALLBACK(src, PROC_REF(after_rotation))) if(direct) setDir(direct) if(reinf && anchored) @@ -62,6 +61,8 @@ //windows only block while reinforced and fulltile, so we'll use the proc real_explosion_block = explosion_block explosion_block = EXPLOSION_BLOCK_PROC + AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, PROC_REF(can_be_rotated)), CALLBACK(src, PROC_REF(after_rotation))) + /obj/structure/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index dc0c3cfa0b5e..1dc951fc6d42 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -15,11 +15,54 @@ var/barefootstep = null var/clawfootstep = null var/heavyfootstep = null + + /// Determines the type of damage overlay that will be used for the tile + var/damaged_dmi = null + var/broken = FALSE + var/burnt = FALSE + /// How much fuel this open turf provides to turf fires, and how easily they can be ignited in the first place. Can be negative to make fires die out faster. var/flammability = 0.3 var/obj/effect/abstract/turf_fire/turf_fire var/obj/effect/hotspot/hotspot +/// Returns a list of every turf state considered "broken". +/// Will be randomly chosen if a turf breaks at runtime. +/turf/open/proc/broken_states() + return list() + +/// Returns a list of every turf state considered "burnt". +/// Will be randomly chosen if a turf is burnt at runtime. +/turf/open/proc/burnt_states() + return list() + +/turf/open/break_tile() + if(isnull(damaged_dmi) || broken) + return FALSE + broken = TRUE + update_appearance() + return TRUE + +/turf/open/burn_tile() + if(isnull(damaged_dmi) || burnt) + return FALSE + burnt = TRUE + update_appearance() + return TRUE + +/turf/open/update_overlays() + if(isnull(damaged_dmi)) + return ..() + . = ..() + if(broken) + . += mutable_appearance(damaged_dmi, pick(broken_states())) + else if(burnt) + var/list/burnt_states = burnt_states() + if(burnt_states.len) + . += mutable_appearance(damaged_dmi, pick(burnt_states)) + else + . += mutable_appearance(damaged_dmi, pick(broken_states())) + //direction is direction of travel of A /turf/open/zPassIn(atom/movable/A, direction, turf/source) return (direction == DOWN) @@ -36,6 +79,10 @@ /turf/open/zAirOut(direction, turf/source) return (direction == UP) +/turf/open/update_icon() + . = ..() + update_visuals() + /** * Replace an open turf with another open turf while avoiding the pitfall of replacing plating with a floor tile, leaving a hole underneath. * This replaces the current turf if it is plating and is passed plating, is tile and is passed tile. @@ -117,7 +164,7 @@ name = "carpet" desc = "Soft velvet carpeting. Feels good between your toes." icon = 'icons/turf/floors/carpet.dmi' - icon_state = "carpet" + icon_state = "carpet-255" flags_1 = NONE bullet_bounce_sound = null footstep = FOOTSTEP_CARPET @@ -131,66 +178,69 @@ /turf/open/indestructible/carpet/black icon = 'icons/turf/floors/carpet_black.dmi' - icon_state = "carpet" + icon_state = "carpet_black-255" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLACK + canSmoothWith = SMOOTH_GROUP_CARPET_BLACK /turf/open/indestructible/carpet/blue - icon = 'goon/icons/turfs/carpet_blue.dmi' - icon_state = "carpet" - -/turf/open/indestructible/carpet/green - icon = 'goon/icons/turfs/carpet_green.dmi' - icon_state = "carpet" + icon = 'icons/turf/floors/carpet_blue.dmi' + icon_state = "carpet_blue-255" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLUE + canSmoothWith = SMOOTH_GROUP_CARPET_BLUE /turf/open/indestructible/carpet/cyan icon = 'icons/turf/floors/carpet_cyan.dmi' - icon_state = "carpet" + icon_state = "carpet_cyan-255" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_CYAN + canSmoothWith = SMOOTH_GROUP_CARPET_CYAN + +/turf/open/indestructible/carpet/green + icon = 'icons/turf/floors/carpet_green.dmi' + icon_state = "carpet_green-255" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_GREEN + canSmoothWith = SMOOTH_GROUP_CARPET_GREEN /turf/open/indestructible/carpet/orange icon = 'icons/turf/floors/carpet_orange.dmi' - icon_state = "carpet" + icon_state = "carpet_orange-255" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ORANGE + canSmoothWith = SMOOTH_GROUP_CARPET_ORANGE /turf/open/indestructible/carpet/purple - icon = 'goon/icons/turfs/carpet_purple.dmi' - icon_state = "carpet" + icon = 'icons/turf/floors/carpet_purple.dmi' + icon_state = "carpet_purple-255" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_PURPLE + canSmoothWith = SMOOTH_GROUP_CARPET_PURPLE /turf/open/indestructible/carpet/red icon = 'icons/turf/floors/carpet_red.dmi' - icon_state = "carpet" + icon_state = "carpet_red-255" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_RED + canSmoothWith = SMOOTH_GROUP_CARPET_RED -/turf/open/indestructible/carpet/royal - name = "carpet" - desc = "Soft velvet carpeting. Feels good between your toes." - icon = 'icons/turf/floors/carpet_royalblue.dmi' - icon_state = "carpet-255" - base_icon_state = "carpet" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET - canSmoothWith = SMOOTH_GROUP_CARPET - flags_1 = NONE - bullet_bounce_sound = null - footstep = FOOTSTEP_CARPET - barefootstep = FOOTSTEP_CARPET_BAREFOOT - clawfootstep = FOOTSTEP_CARPET_BAREFOOT - heavyfootstep = FOOTSTEP_GENERIC_HEAVY - tiled_dirt = FALSE - -/turf/open/indestructible/carpet/royal/black +/turf/open/indestructible/carpet/royalblack icon = 'icons/turf/floors/carpet_royalblack.dmi' - icon_state = "carpet" + icon_state = "carpet_royalblack-255" smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLACK canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLACK -/turf/open/indestructible/carpet/royal/green - icon = 'icons/turf/floors/carpet_exoticgreen.dmi' - icon_state = "carpet" - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_GREEN - canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_GREEN - -/turf/open/indestructible/carpet/royal/purple - icon = 'icons/turf/floors/carpet_exoticpurple.dmi' - icon_state = "carpet" - smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_PURPLE - canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_PURPLE +/turf/open/indestructible/carpet/royalblue + icon = 'icons/turf/floors/carpet_royalblue.dmi' + icon_state = "carpet_royalblue-255" + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLUE + canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLUE + +// /turf/open/indestructible/carpet/royal/green +// icon = 'icons/turf/floors/carpet_green.dmi' +// icon_state = "carpet" +// smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_GREEN +// canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_GREEN + +// /turf/open/indestructible/carpet/royal/purple +// icon = 'icons/turf/floors/carpet_purple.dmi' +// icon_state = "carpet" +// smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_PURPLE +// canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_PURPLE /turf/open/indestructible/grass name = "grass patch" diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index d5a97ccf059b..c0cebd1f3fe9 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -1,9 +1,8 @@ +/// Anything above a lattice should go here. /turf/open/floor - //NOTE: Floor code has been refactored, many procs were removed and refactored - //- you should use istype() if you want to find out whether a floor has a certain type - //- floor_tile is now a path, and not a tile obj name = "floor" icon = 'icons/turf/floors.dmi' + base_icon_state = "floor" baseturfs = /turf/open/floor/plating footstep = FOOTSTEP_FLOOR @@ -20,55 +19,56 @@ heat_capacity = 10000 tiled_dirt = TRUE - + damaged_dmi = 'icons/turf/damaged.dmi' var/icon_state_regular_floor = "floor" //used to remember what icon state the tile should have by default var/icon_regular_floor = 'icons/turf/floors.dmi' //used to remember what icon the tile should have by default var/icon_plating = "plating" - var/broken = 0 - var/burnt = 0 var/floor_tile = null //tile that this floor drops - var/list/broken_states - var/list/burnt_states /turf/open/floor/Initialize(mapload) - if (!broken_states) - broken_states = typelist("broken_states", list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")) - else - broken_states = typelist("broken_states", broken_states) - burnt_states = typelist("burnt_states", burnt_states) - if(!broken && broken_states && (icon_state in broken_states)) - broken = TRUE - if(!burnt && burnt_states && (icon_state in burnt_states)) - burnt = TRUE + // if (!broken_states) + // broken_states = typelist("broken_states", list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")) + // else + // broken_states = typelist("broken_states", broken_states) + // burnt_states = typelist("burnt_states", burnt_states) + // if(!broken && broken_states && (icon_state in broken_states)) + // broken = TRUE + // if(!burnt && burnt_states && (icon_state in burnt_states)) + // burnt = TRUE . = ..() //This is so damaged or burnt tiles or platings don't get remembered as the default tile - var/static/list/icons_to_ignore_at_floor_init = list("foam_plating", "plating","light_on","light_on_flicker1","light_on_flicker2", - "light_on_clicker3","light_on_clicker4","light_on_clicker5", - "light_on_broken","light_off","wall_thermite","grass", "sand", - "asteroid","asteroid_dug", - "asteroid0","asteroid1","asteroid2","asteroid3","asteroid4", - "asteroid5","asteroid6","asteroid7","asteroid8","asteroid9","asteroid10","asteroid11","asteroid12", - "basalt","basalt_dug", - "basalt0","basalt1","basalt2","basalt3","basalt4", - "basalt5","basalt6","basalt7","basalt8","basalt9","basalt10","basalt11","basalt12", - "oldburning","light-on-r","light-on-y","light-on-g","light-on-b", "wood", "carpetsymbol", "carpetstar", - "carpetcorner", "carpetside", "carpet", "ironsand1", "ironsand2", "ironsand3", "ironsand4", "ironsand5", - "ironsand6", "ironsand7", "ironsand8", "ironsand9", "ironsand10", "ironsand11", - "ironsand12", "ironsand13", "ironsand14", "ironsand15", "bamboo", "bamboosymbol", "bamboostar") - if(broken || burnt || (icon_state in icons_to_ignore_at_floor_init)) //so damaged/burned tiles or plating icons aren't saved as the default - icon_state_regular_floor = "floor" - icon_regular_floor = 'icons/turf/floors.dmi' - else - icon_state_regular_floor = icon_state - icon_regular_floor = icon + // var/static/list/icons_to_ignore_at_floor_init = list("foam_plating", "plating","light_on","light_on_flicker1","light_on_flicker2", + // "light_on_clicker3","light_on_clicker4","light_on_clicker5", + // "light_on_broken","light_off","wall_thermite","grass", "sand", + // "asteroid","asteroid_dug", + // "asteroid0","asteroid1","asteroid2","asteroid3","asteroid4", + // "asteroid5","asteroid6","asteroid7","asteroid8","asteroid9","asteroid10","asteroid11","asteroid12", + // "basalt","basalt_dug", + // "basalt0","basalt1","basalt2","basalt3","basalt4", + // "basalt5","basalt6","basalt7","basalt8","basalt9","basalt10","basalt11","basalt12", + // "oldburning","light-on-r","light-on-y","light-on-g","light-on-b", "wood", "carpetsymbol", "carpetstar", + // "carpetcorner", "carpetside", "carpet", "ironsand1", "ironsand2", "ironsand3", "ironsand4", "ironsand5", + // "ironsand6", "ironsand7", "ironsand8", "ironsand9", "ironsand10", "ironsand11", + // "ironsand12", "ironsand13", "ironsand14", "ironsand15", "bamboo", "bamboosymbol", "bamboostar") + // if(broken || burnt || (icon_state in icons_to_ignore_at_floor_init)) //so damaged/burned tiles or plating icons aren't saved as the default + // icon_state_regular_floor = "floor" + // icon_regular_floor = 'icons/turf/floors.dmi' + // else + // icon_state_regular_floor = icon_state + // icon_regular_floor = icon if(mapload && prob(33)) MakeDirty() if(is_station_level(z)) GLOB.station_turfs += src +/turf/open/floor/broken_states() + return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5") + +/turf/open/floor/burnt_states() + return list() /turf/open/floor/Destroy() if(is_station_level(z)) @@ -121,10 +121,6 @@ /turf/open/floor/blob_act(obj/structure/blob/B) return -/turf/open/floor/update_icon(updates=ALL) - . = ..() - update_visuals() - /turf/open/floor/attack_paw(mob/user) return attack_hand(user) @@ -140,21 +136,6 @@ return T.break_tile() -/turf/open/floor/proc/break_tile() - if(broken) - return - icon_state = pick(broken_states) - broken = 1 - -/turf/open/floor/burn_tile() - if(broken || burnt) - return - if(burnt_states.len) - icon_state = pick(burnt_states) - else - icon_state = pick(broken_states) - burnt = 1 - /turf/open/floor/proc/make_plating() return ScrapeAway(flags = CHANGETURF_INHERIT_AIR) @@ -163,14 +144,10 @@ return ..() //fucking turfs switch the fucking src of the fucking running procs if(!ispath(path, /turf/open/floor)) return ..() - var/old_icon = icon_regular_floor - var/old_icon_state = icon_state_regular_floor var/old_dir = dir var/turf/open/floor/W = ..() - W.icon_regular_floor = old_icon - W.icon_state_regular_floor = old_icon_state W.setDir(old_dir) - W.update_appearance(UPDATE_ICON) + W.update_appearance() return W /turf/open/floor/attackby(obj/item/object, mob/living/user, params) diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index 96b94613a3f8..2396f5a3c5c7 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -11,7 +11,6 @@ desc = "Stylish dark wood." icon_state = "wood" floor_tile = /obj/item/stack/tile/wood - broken_states = list("wood-broken", "wood-broken2", "wood-broken3", "wood-broken4", "wood-broken5", "wood-broken6", "wood-broken7") footstep = FOOTSTEP_WOOD barefootstep = FOOTSTEP_WOOD_BAREFOOT clawfootstep = FOOTSTEP_WOOD_CLAW @@ -20,6 +19,9 @@ flags_1 = NO_RUST | CAN_BE_DIRTY_1 flammability = 3 // yikes, better put that out quick +/turf/open/floor/wood/broken_states() + return list("wood-broken", "wood-broken2", "wood-broken3", "wood-broken4", "wood-broken5", "wood-broken6", "wood-broken7") + /turf/open/floor/wood/examine(mob/user) . = ..() . += span_notice("There's a few screws and a small crack visible.") @@ -66,17 +68,23 @@ /turf/open/floor/wood/parquet icon_state = "wood-parquet" floor_tile = /obj/item/stack/tile/wood/parquet - broken_states = list("wood-parquet-broken", "wood-parquet-broken2", "wood-parquet-broken3", "wood-parquet-broken4", "wood-parquet-broken5", "wood-parquet-broken6", "wood-parquet-broken7") + +/turf/open/floor/wood/parquet/broken_states() + return list("wood-parquet-broken", "wood-parquet-broken2", "wood-parquet-broken3", "wood-parquet-broken4", "wood-parquet-broken5", "wood-parquet-broken6", "wood-parquet-broken7") /turf/open/floor/wood/tile icon_state = "wood-tile" floor_tile = /obj/item/stack/tile/wood/tile - broken_states = list("wood-tile-broken", "wood-tile-broken2", "wood-tile-broken3") + +/turf/open/floor/wood/tile/broken_states() + return list("wood-tile-broken", "wood-tile-broken2", "wood-tile-broken3") /turf/open/floor/wood/large icon_state = "wood-large" floor_tile = /obj/item/stack/tile/wood/large - broken_states = list("wood-large-broken", "wood-large-broken2", "wood-large-broken3") + +/turf/open/floor/wood/large/broken_states() + return list("wood-tile-broken", "wood-tile-broken2", "wood-tile-broken3") /turf/open/floor/wood/cold initial_gas_mix = KITCHEN_COLDROOM_ATMOS @@ -222,7 +230,6 @@ icon = 'icons/turf/floors/bamboo_mat.dmi' icon_state = "bamboo" floor_tile = /obj/item/stack/tile/bamboo - broken_states = list("damaged") smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_BAMBOO_FLOOR canSmoothWith = SMOOTH_GROUP_BAMBOO_FLOOR @@ -233,6 +240,9 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = FALSE +/turf/open/floor/bamboo/broken_states() + return list("bamboodamaged") + /turf/open/floor/bamboo/broken icon_state = "damaged" broken = TRUE @@ -242,7 +252,6 @@ desc = "You can't tell if this is real grass or just cheap plastic imitation." icon_state = "grass1" floor_tile = /obj/item/stack/tile/grass - broken_states = list("sand") flags_1 = NONE bullet_bounce_sound = null footstep = FOOTSTEP_GRASS @@ -254,11 +263,14 @@ tiled_dirt = FALSE flammability = 2 // california simulator +/turf/open/floor/grass/broken_states() + return list("sand") + /turf/open/floor/grass/Initialize(mapload) . = ..() if(src.type == /turf/open/floor/grass) //don't want grass subtypes getting the icon state, icon_state = "grass[rand(1,4)]" - update_appearance(UPDATE_ICON) + update_appearance() /turf/open/floor/grass/attackby(obj/item/C, mob/user, params) if((C.tool_behaviour == TOOL_SHOVEL) && params) @@ -337,8 +349,8 @@ desc = "Soft velvet carpeting. Feels good between your toes." icon = 'icons/turf/floors/carpet.dmi' icon_state = "carpet-255" + base_icon_state = "carpet" floor_tile = /obj/item/stack/tile/carpet - broken_states = list("damaged") smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET canSmoothWith = SMOOTH_GROUP_CARPET @@ -357,7 +369,7 @@ /turf/open/floor/carpet/Initialize(mapload) . = ..() - update_appearance(UPDATE_ICON) + update_appearance() /turf/open/floor/carpet/update_icon(updates=ALL) . = ..() @@ -371,9 +383,6 @@ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) QUEUE_SMOOTH_NEIGHBORS(src) -/turf/open/floor/carpet/broken - icon_state = "damaged" - broken = TRUE /turf/open/floor/carpet/black icon = 'icons/turf/floors/carpet_black.dmi' @@ -383,22 +392,14 @@ smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLACK canSmoothWith = SMOOTH_GROUP_CARPET_BLACK -/turf/open/floor/carpet/black/broken - icon_state = "damaged" - broken = TRUE - -/turf/open/floor/carpet/exoticblue - icon = 'icons/turf/floors/carpet_exoticblue.dmi' +/turf/open/floor/carpet/blue + icon = 'icons/turf/floors/carpet_blue.dmi' icon_state = "carpet_blue-255" base_icon_state = "carpet_blue" - floor_tile = /obj/item/stack/tile/carpet/exoticblue + floor_tile = /obj/item/stack/tile/carpet/blue smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLUE canSmoothWith = SMOOTH_GROUP_CARPET_BLUE -/turf/open/floor/carpet/exoticblue/broken - icon_state = "damaged" - broken = TRUE - /turf/open/floor/carpet/cyan icon = 'icons/turf/floors/carpet_cyan.dmi' icon_state = "carpet_cyan-255" @@ -407,22 +408,14 @@ smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_CYAN canSmoothWith = SMOOTH_GROUP_CARPET_CYAN -/turf/open/floor/carpet/cyan/broken - icon_state = "damaged" - broken = TRUE - -/turf/open/floor/carpet/exoticgreen - icon = 'icons/turf/floors/carpet_exoticgreen.dmi' +/turf/open/floor/carpet/green + icon = 'icons/turf/floors/carpet_green.dmi' icon_state = "carpet_green-255" base_icon_state = "carpet_green" - floor_tile = /obj/item/stack/tile/carpet/exoticgreen + floor_tile = /obj/item/stack/tile/carpet/green smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_GREEN canSmoothWith = SMOOTH_GROUP_CARPET_GREEN -/turf/open/floor/carpet/exoticgreen/broken - icon_state = "damaged" - broken = TRUE - /turf/open/floor/carpet/orange icon = 'icons/turf/floors/carpet_orange.dmi' icon_state = "carpet_orange-255" @@ -431,22 +424,14 @@ smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ORANGE canSmoothWith = SMOOTH_GROUP_CARPET_ORANGE -/turf/open/floor/carpet/orange/broken - icon_state = "damaged" - broken = TRUE - -/turf/open/floor/carpet/exoticpurple - icon = 'icons/turf/floors/carpet_exoticpurple.dmi' +/turf/open/floor/carpet/purple + icon = 'icons/turf/floors/carpet_purple.dmi' icon_state = "carpet_purple-255" base_icon_state = "carpet_purple" - floor_tile = /obj/item/stack/tile/carpet/exoticpurple + floor_tile = /obj/item/stack/tile/carpet/purple smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_PURPLE canSmoothWith = SMOOTH_GROUP_CARPET_PURPLE -/turf/open/floor/carpet/exoticpurple/broken - icon_state = "damaged" - broken = TRUE - /turf/open/floor/carpet/red icon = 'icons/turf/floors/carpet_red.dmi' icon_state = "carpet_red-255" @@ -455,10 +440,6 @@ smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_RED canSmoothWith = SMOOTH_GROUP_CARPET_RED -/turf/open/floor/carpet/red/broken - icon_state = "damaged" - broken = TRUE - /turf/open/floor/carpet/royalblack icon = 'icons/turf/floors/carpet_royalblack.dmi' icon_state = "carpet_royalblack-255" @@ -467,10 +448,6 @@ smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLACK canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLACK -/turf/open/floor/carpet/royalblack/broken - icon_state = "damaged" - broken = TRUE - /turf/open/floor/carpet/royalblue icon = 'icons/turf/floors/carpet_royalblue.dmi' icon_state = "carpet_royalblue-255" @@ -479,9 +456,32 @@ smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLUE canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLUE -/turf/open/floor/carpet/royalblue/broken - icon_state = "damaged" - broken = TRUE +/turf/open/floor/carpet/executive + name = "executive carpet" + icon = 'icons/turf/floors/carpet_executive.dmi' + icon_state = "executive_carpet-255" + base_icon_state = "executive_carpet" + floor_tile = /obj/item/stack/tile/carpet/executive + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_EXECUTIVE + canSmoothWith = SMOOTH_GROUP_CARPET_EXECUTIVE + +/turf/open/floor/carpet/stellar + name = "stellar carpet" + icon = 'icons/turf/floors/carpet_stellar.dmi' + icon_state = "stellar_carpet-255" + base_icon_state = "stellar_carpet" + floor_tile = /obj/item/stack/tile/carpet/stellar + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_STELLAR + canSmoothWith = SMOOTH_GROUP_CARPET_STELLAR + +/turf/open/floor/carpet/donk + name = "Donk Co. carpet" + icon = 'icons/turf/floors/carpet_donk.dmi' + icon_state = "donk_carpet-255" + base_icon_state = "donk_carpet" + floor_tile = /obj/item/stack/tile/carpet/donk + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_DONK + canSmoothWith = SMOOTH_GROUP_CARPET_DONK /turf/open/floor/carpet/narsie_act(force, ignore_mobs, probability = 20) . = (prob(probability) || force) @@ -494,11 +494,11 @@ /turf/open/floor/carpet/break_tile() broken = TRUE - update_appearance(UPDATE_ICON) + update_appearance() /turf/open/floor/carpet/burn_tile() burnt = TRUE - update_appearance(UPDATE_ICON) + update_appearance() /turf/open/floor/carpet/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) return FALSE @@ -523,16 +523,13 @@ icon = 'icons/turf/space.dmi' icon_state = "0" floor_tile = /obj/item/stack/tile/fakespace - broken_states = list("damaged") plane = PLANE_SPACE tiled_dirt = FALSE + damaged_dmi = 'icons/turf/space.dmi' -/turf/open/floor/fakespace/Initialize(mapload) - . = ..() - icon_state = SPACE_ICON_STATE +/turf/open/floor/fakespace/broken_states() + return list("damaged") /turf/open/floor/fakespace/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - underlay_appearance.icon = 'icons/turf/space.dmi' - underlay_appearance.icon_state = SPACE_ICON_STATE - underlay_appearance.plane = PLANE_SPACE + generate_space_underlay(underlay_appearance, asking_turf) return TRUE diff --git a/code/game/turfs/open/floor/light_floor.dm b/code/game/turfs/open/floor/light_floor.dm index 12e4fcbc5d57..ef74f2a51bb9 100644 --- a/code/game/turfs/open/floor/light_floor.dm +++ b/code/game/turfs/open/floor/light_floor.dm @@ -4,7 +4,6 @@ light_range = 5 icon_state = "light_on" floor_tile = /obj/item/stack/tile/light - broken_states = list("light_broken") var/on = TRUE var/state = 0//0 = fine, 1 = flickering, 2 = breaking, 3 = broken var/list/coloredlights = list("r", "o", "y", "g", "b", "i", "v", "w", "s", "z") @@ -13,6 +12,9 @@ tiled_dirt = FALSE var/static/list/lighttile_designs +/turf/open/floor/light/broken_states() + return list("light_broken") + /turf/open/floor/light/examine(mob/user) . = ..() . += span_notice("There's a small crack on the edge of it.") @@ -34,7 +36,7 @@ /turf/open/floor/light/Initialize(mapload) . = ..() - update_appearance(UPDATE_ICON) + update_appearance() if(!length(lighttile_designs)) populate_lighttile_designs() diff --git a/code/game/turfs/open/floor/mineral_floor.dm b/code/game/turfs/open/floor/mineral_floor.dm index a53f6eb2e7f8..908f3b7bf700 100644 --- a/code/game/turfs/open/floor/mineral_floor.dm +++ b/code/game/turfs/open/floor/mineral_floor.dm @@ -17,19 +17,16 @@ /turf/open/floor/mineral/Initialize(mapload) - if(!broken_states) - broken_states = list("[initial(icon_state)]_dam") . = ..() icons = typelist("icons", icons) +/turf/open/floor/mineral/broken_states() + return isnull(icon_state) ? list() : list("[initial(icon_state)]_dam") /turf/open/floor/mineral/update_icon_state() - . = ..() - if(!.) - return - if(!broken && !burnt) - if(!(icon_state in icons)) - icon_state = initial(icon_state) + if(!broken && !burnt && !(icon_state in icons)) + icon_state = initial(icon_state) + return ..() //PLASMA @@ -95,7 +92,12 @@ icon_state = "titanium" flags_1 = NO_RUST | CAN_BE_DIRTY_1 floor_tile = /obj/item/stack/tile/mineral/titanium - broken_states = list("titanium_dam1","titanium_dam2","titanium_dam3","titanium_dam4","titanium_dam5") + +/turf/open/floor/mineral/titanium/broken_states() + return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5") + +/turf/open/floor/mineral/titanium/rust_heretic_act() + return // titanium does not rust /turf/open/floor/mineral/titanium/broken icon_state = "titanium_dam1" @@ -161,7 +163,9 @@ name = "shuttle floor" icon_state = "plastitanium" floor_tile = /obj/item/stack/tile/mineral/plastitanium - broken_states = list("plastitanium_dam1","plastitanium_dam2","plastitanium_dam3","plastitanium_dam4","plastitanium_dam5") + +/turf/open/floor/mineral/plastitanium/broken_states() + return list("plastitanium_dam1","plastitanium_dam2","plastitanium_dam3","plastitanium_dam4","plastitanium_dam5") /turf/open/floor/mineral/plastitanium/broken icon_state = "plastitanium_dam1" diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index 5003791ed8eb..7b7f150458f7 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -123,10 +123,14 @@ name = "high-traction floor" icon_state = "noslip" floor_tile = /obj/item/stack/tile/noslip - broken_states = list("noslip-damaged1","noslip-damaged2","noslip-damaged3") - burnt_states = list("noslip-scorched1","noslip-scorched2") slowdown = -0.3 +/turf/open/floor/noslip/broken_states() + return list("noslip-damaged1","noslip-damaged2","noslip-damaged3") + +/turf/open/floor/noslip/burnt_states() + return list("noslip-scorched1","noslip-scorched2") + /turf/open/floor/noslip/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent) return @@ -313,7 +317,9 @@ desc = "This one takes you back." icon_state = "eighties" floor_tile = /obj/item/stack/tile/eighties - broken_states = list("eighties_damaged") + +/turf/open/floor/eighties/broken_states() + return list("eighties_damaged") /turf/open/floor/eighties/broken icon_state = "eighties_damaged" @@ -323,4 +329,4 @@ name = "stone brick floor" desc = "Some stone brick tiles, how rustic." icon_state = "stone_floor" - floor_tile = /obj/item/stack/tile/plasteel \ No newline at end of file + floor_tile = /obj/item/stack/tile/plasteel diff --git a/code/game/turfs/open/floor/plasteel_floor.dm b/code/game/turfs/open/floor/plasteel_floor.dm index 6f0f9dbe29fd..878200516f79 100644 --- a/code/game/turfs/open/floor/plasteel_floor.dm +++ b/code/game/turfs/open/floor/plasteel_floor.dm @@ -1,8 +1,12 @@ /turf/open/floor/plasteel icon_state = "floor" floor_tile = /obj/item/stack/tile/plasteel - broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5") - burnt_states = list("floorscorched1", "floorscorched2") + +/turf/open/floor/plasteel/broken_states() + return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5") + +/turf/open/floor/plasteel/broken_states() + return list("floorscorched1", "floorscorched2") /turf/open/floor/plasteel/examine(mob/user) . = ..() @@ -13,13 +17,11 @@ new /obj/effect/glowing_rune(src) ChangeTurf(/turf/open/floor/plating/rust) -/turf/open/floor/plasteel/update_icon(updates=ALL) - . = ..() - if(!.) - return 0 - if(!broken && !burnt) - icon = icon_regular_floor - icon_state = icon_state_regular_floor +/turf/open/floor/plasteel/update_icon_state() + if(broken || burnt) + return ..() + icon_state = base_icon_state + return ..() /turf/open/floor/plasteel/broken icon_state = "damaged1" @@ -192,9 +194,11 @@ turf/open/floor/plasteel/airless/solarpanel /turf/open/floor/plasteel/cult icon_state = "cult" - broken_states = list("damage1", "damage2", "damage3", "damage4", "damage5") name = "engraved floor" +/turf/open/floor/plasteel/cult/broken_states() + return list("damage1", "damage2", "damage3", "damage4", "damage5") + /turf/open/floor/plasteel/cult/broken icon_state = "damage1" broken = TRUE diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 7de6dedc232a..865d3b6e9fb5 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -24,6 +24,12 @@ var/attachment_holes = TRUE +/turf/open/floor/plating/broken_states() + return list("damaged1", "damaged2", "damaged4") + +/turf/open/floor/plating/burnt_states() + return list("floorscorched1", "floorscorched2") + /turf/open/floor/plating/examine(mob/user) . = ..() if(broken || burnt) @@ -34,24 +40,6 @@ else . += span_notice("You might be able to build ontop of it with some tiles...") -/turf/open/floor/plating/Initialize(mapload) - if (!broken_states) - broken_states = list("platingdmg1", "platingdmg2", "platingdmg3") - if (!burnt_states) - burnt_states = list("panelscorched") - . = ..() - if(!attachment_holes || (!broken && !burnt)) - icon_plating = icon_state - else - icon_plating = initial(icon_state) - -/turf/open/floor/plating/update_icon_state() - . = ..() - if(!.) - return - if(!broken && !burnt) - icon_state = icon_plating //Because asteroids are 'platings' too. - /turf/open/floor/plating/attackby(obj/item/C, mob/user, params) if(..()) return diff --git a/code/game/turfs/open/floor/plating/asteroid.dm b/code/game/turfs/open/floor/plating/asteroid.dm index eab099daa196..97a747d723aa 100644 --- a/code/game/turfs/open/floor/plating/asteroid.dm +++ b/code/game/turfs/open/floor/plating/asteroid.dm @@ -19,7 +19,12 @@ var/floor_variance = 20 //probability floor has a different icon state attachment_holes = FALSE var/obj/item/stack/digResult = /obj/item/stack/ore/glass/basalt - var/dug + var/dug = FALSE + +/turf/open/floor/plating/asteroid/broken_states() + if(initial(dug)) + return list(icon_state) + return list("[base_icon_state]_dug") /turf/open/floor/plating/asteroid/Initialize(mapload) var/proper_name = name @@ -35,6 +40,8 @@ icon_plating = "[environment_type]_dug" icon_state = "[environment_type]_dug" dug = TRUE + broken = TRUE + update_appearance() /turf/open/floor/plating/asteroid/proc/can_dig(mob/user) if(!dug) @@ -154,12 +161,14 @@ environment_type = "snow" flags_1 = NONE planetary_atmos = TRUE - burnt_states = list("snow_dug") bullet_sizzle = TRUE bullet_bounce_sound = null digResult = /obj/item/stack/sheet/mineral/snow flammability = -5 +/turf/open/floor/plating/asteroid/snow/burnt_states() + return list("snow_dug") + /turf/open/floor/plating/asteroid/snow/singularity_act() . = ..() //take the wires n shit out return 0 @@ -173,7 +182,7 @@ visible_message(span_danger("[src] melts away!.")) slowdown = 0 burnt = TRUE - icon_state = "snow_dug" + update_appearance() return TRUE return FALSE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index b24a289f3845..753c4c228e7f 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -225,6 +225,23 @@ GLOBAL_LIST_EMPTY(station_turfs) return user.Move_Pulled(src) +/turf/proc/change_area(area/old_area, area/new_area) + //dont waste our time + if(old_area == new_area) + return + + //move the turf + old_area.turfs_to_uncontain += src + new_area.contents += src + new_area.contained_turfs += src + + //changes to make after turf has moved + on_change_area(old_area, new_area) + +/// Allows for reactions to an area change without inherently requiring change_area() be called (I hate maploading) +/turf/proc/on_change_area(area/old_area, area/new_area) + transfer_area_lighting(old_area, new_area) + /turf/proc/multiz_turf_del(turf/T, dir) SEND_SIGNAL(src, COMSIG_TURF_MULTIZ_DEL, T, dir) @@ -546,6 +563,9 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/proc/burn_tile() return +/turf/proc/break_tile() + return + /turf/proc/is_shielded() return diff --git a/code/game/world.dm b/code/game/world.dm index 65b4cbdc23a3..9a3724d6472a 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -344,6 +344,37 @@ GLOBAL_VAR(restart_counter) else hub_password = "SORRYNOPASSWORD" +/** + * Handles incresing the world's maxx var and intializing the new turfs and assigning them to the global area. + * If map_load_z_cutoff is passed in, it will only load turfs up to that z level, inclusive. + * This is because maploading will handle the turfs it loads itself. + */ +/world/proc/increase_max_x(new_maxx, map_load_z_cutoff = maxz) + if(new_maxx <= maxx) + return + var/old_max = world.maxx + maxx = new_maxx + if(!map_load_z_cutoff) + return + var/area/global_area = GLOB.areas_by_type[world.area] // We're guaranteed to be touching the global area, so we'll just do this + var/list/to_add = block( + locate(old_max + 1, 1, 1), + locate(maxx, maxy, map_load_z_cutoff)) + global_area.contained_turfs += to_add + +/world/proc/increase_max_y(new_maxy, map_load_z_cutoff = maxz) + if(new_maxy <= maxy) + return + var/old_maxy = maxy + maxy = new_maxy + if(!map_load_z_cutoff) + return + var/area/global_area = GLOB.areas_by_type[world.area] // We're guarenteed to be touching the global area, so we'll just do this + var/list/to_add = block( + locate(1, old_maxy + 1, 1), + locate(maxx, maxy, map_load_z_cutoff)) + global_area.contained_turfs += to_add + /world/proc/incrementMaxZ() maxz++ SSmobs.MaxZChanged() diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index b3daa433db9e..2ac8f3b83d8d 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -9,9 +9,9 @@ throwforce = 0 w_class = WEIGHT_CLASS_TINY materials = list(/datum/material/iron = 300, /datum/material/glass = 300) - light_color = LIGHT_COLOR_WHITE light_system = MOVABLE_LIGHT //Used as a flash here. light_range = FLASH_LIGHT_RANGE + light_color = COLOR_WHITE light_power = FLASH_LIGHT_POWER light_on = FALSE fryable = TRUE diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 1e7c2c6b3148..42abcc19fd6f 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -6,9 +6,6 @@ icon = 'icons/obj/atmospherics/canister.dmi' icon_state = "hazard" density = TRUE - light_system = MOVABLE_LIGHT - light_range = 1.4 - light_on = FALSE var/valve_open = FALSE var/obj/machinery/atmospherics/components/binary/passive_gate/pump var/release_log = "" diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index e7b753fc64c1..e0d779501c3c 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1947,16 +1947,16 @@ name = "Exotic Carpet Crate" desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 8 different flooring patterns." cost = 4000 - contains = list(/obj/item/stack/tile/carpet/exoticblue/fifty, - /obj/item/stack/tile/carpet/exoticblue/fifty, + contains = list(/obj/item/stack/tile/carpet/blue/fifty, + /obj/item/stack/tile/carpet/blue/fifty, /obj/item/stack/tile/carpet/cyan/fifty, /obj/item/stack/tile/carpet/cyan/fifty, - /obj/item/stack/tile/carpet/exoticgreen/fifty, - /obj/item/stack/tile/carpet/exoticgreen/fifty, + /obj/item/stack/tile/carpet/green/fifty, + /obj/item/stack/tile/carpet/green/fifty, /obj/item/stack/tile/carpet/orange/fifty, /obj/item/stack/tile/carpet/orange/fifty, - /obj/item/stack/tile/carpet/exoticpurple/fifty, - /obj/item/stack/tile/carpet/exoticpurple/fifty, + /obj/item/stack/tile/carpet/purple/fifty, + /obj/item/stack/tile/carpet/purple/fifty, /obj/item/stack/tile/carpet/red/fifty, /obj/item/stack/tile/carpet/red/fifty, /obj/item/stack/tile/carpet/royalblue/fifty, diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index e6f2292f7db5..69fd5d64203e 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -105,14 +105,32 @@ if(. != directional_opacity && (. == ALL_CARDINALS || directional_opacity == ALL_CARDINALS)) reconsider_lights() //The lighting system only cares whether the tile is fully concealed from all directions or not. -/turf/proc/change_area(area/old_area, area/new_area) - if(SSlighting.initialized) - if (new_area.dynamic_lighting != old_area.dynamic_lighting) - if (new_area.dynamic_lighting) +///Transfer the lighting of one area to another +/turf/proc/transfer_area_lighting(area/old_area, area/new_area) + if(SSlighting.initialized && !space_lit) + if (new_area.static_lighting != old_area.static_lighting) + if (new_area.static_lighting) lighting_build_overlay() else lighting_clear_overlay() + // We will only run this logic on turfs off the prime z layer + // Since on the prime z layer, we use an overlay on the area instead, to save time + if(SSmapping.z_level_to_plane_offset[z]) + var/index = SSmapping.z_level_to_plane_offset[z] + 1 + //Inherit overlay of new area + if(old_area.lighting_effects) + cut_overlay(old_area.lighting_effects[index]) + if(new_area.lighting_effects) + add_overlay(new_area.lighting_effects[index]) + + // Manage removing/adding starlight overlays, we'll inherit from the area so we can drop it if the area has it already + if(space_lit) + if(!new_area.lighting_effects && old_area.lighting_effects) + overlays += GLOB.starlight_overlays[GET_TURF_PLANE_OFFSET(src) + 1] + else if (new_area.lighting_effects && !old_area.lighting_effects) + overlays -= GLOB.starlight_overlays[GET_TURF_PLANE_OFFSET(src) + 1] + /turf/proc/generate_missing_corners() if (!lighting_corner_NE) lighting_corner_NE = new/datum/lighting_corner(src, NORTH|EAST) diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 7a5695b82748..4e0b926d7090 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -8,6 +8,8 @@ var/keep_cached_map = FALSE /datum/map_template/New(path = null, rename = null, cache = FALSE) + SHOULD_CALL_PARENT(TRUE) + . = ..() if(path) mappath = path if(mappath) @@ -77,8 +79,10 @@ SSatoms.InitializeAtoms(areas + turfs + movables) for(var/turf/unlit as anything in turfs) + if(unlit.space_lit) + continue var/area/loc_area = unlit.loc - if(!IS_DYNAMIC_LIGHTING(loc_area)) + if(!loc_area.static_lighting) continue unlit.lighting_build_overlay() @@ -110,7 +114,7 @@ var/y = round((world.maxy - height)/2) var/datum/space_level/level = SSmapping.add_new_zlevel(name, secret ? ZTRAITS_AWAY_SECRET : ZTRAITS_AWAY, contain_turfs = FALSE) - var/datum/parsed_map/parsed = load_map(file(mappath), x, y, level.z_value, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=TRUE, new_z = TRUE) + var/datum/parsed_map/parsed = load_map(file(mappath), x, y, level.z_value, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), place_on_top=TRUE, new_z = TRUE) var/list/bounds = parsed.bounds if(!bounds) return FALSE @@ -137,7 +141,7 @@ // ruins clogging up memory for the whole round. var/datum/parsed_map/parsed = cached_map || new(file(mappath)) cached_map = keep_cached_map ? parsed : null - if(!parsed.load(T.x, T.y, T.z, cropMap=TRUE, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=TRUE)) + if(!parsed.load(T.x, T.y, T.z, crop_map = TRUE, no_changeturf = (SSatoms.initialized == INITIALIZATION_INSSATOMS), place_on_top = TRUE)) return var/list/bounds = parsed.bounds if(!bounds) diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 50dc28ac4194..ab6743ff17a0 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -1,7 +1,6 @@ /////////////////////////////////////////////////////////////// //SS13 Optimized Map loader ////////////////////////////////////////////////////////////// -#define SPACE_KEY "space" // We support two different map formats // It is kinda possible to process them together, but if we split them up // I can make optimization decisions more easily @@ -47,7 +46,6 @@ * Files are kinda susy, and may not actually work. buyer beware * Lists support assoc values as expected * These constants can be further embedded into lists - * One var edited list will be shared among all the things it is applied to * * There can be no padding in front of, or behind a path * @@ -108,30 +106,79 @@ /// Pulls out model paths for DMM var/static/regex/model_path = new(@'(\/[^\{]*?(?:\{.*?\})?)(?:,|$)', "g") + /// If we are currently loading this map + var/loading = FALSE + #ifdef TESTING var/turfsSkipped = 0 #endif +/datum/parsed_map/proc/copy() + // Avoids duped work just in case + build_cache() + var/datum/parsed_map/newfriend = new() + newfriend.original_path = original_path + newfriend.map_format = map_format + newfriend.key_len = key_len + newfriend.line_len = line_len + newfriend.grid_models = grid_models.Copy() + newfriend.gridSets = gridSets.Copy() + newfriend.modelCache = modelCache.Copy() + newfriend.parsed_bounds = parsed_bounds.Copy() + // Copy parsed bounds to reset to initial values + newfriend.bounds = parsed_bounds.Copy() + newfriend.turf_blacklist = turf_blacklist?.Copy() + return newfriend + //text trimming (both directions) helper macro #define TRIM_TEXT(text) (trim_reduced(text)) -/// Shortcut function to parse a map and apply it to the world. -/// -/// - `dmm_file`: A .dmm file to load (Required). -/// - `x_offset`, `y_offset`, `z_offset`: Positions representign where to load the map (Optional). -/// - `cropMap`: When true, the map will be cropped to fit the existing world dimensions (Optional). -/// - `measureOnly`: When true, no changes will be made to the world (Optional). -/// - `no_changeturf`: When true, [/turf/proc/AfterChange] won't be called on loaded turfs -/// - `x_lower`, `x_upper`, `y_lower`, `y_upper`: Coordinates (relative to the map) to crop to (Optional). -/// - `placeOnTop`: Whether to use [/turf/proc/PlaceOnTop] rather than [/turf/proc/ChangeTurf] (Optional). -/proc/load_map(dmm_file as file, x_offset as num, y_offset as num, z_offset as num, cropMap as num, measureOnly as num, no_changeturf as num, x_lower = -INFINITY as num, x_upper = INFINITY as num, y_lower = -INFINITY as num, y_upper = INFINITY as num, placeOnTop = FALSE as num, new_z) - var/datum/parsed_map/parsed = new(dmm_file, x_lower, x_upper, y_lower, y_upper, measureOnly) - if(parsed.bounds && !measureOnly) - parsed.load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z = new_z) - return parsed +/** + * Helper and recommened way to load a map file + * - dmm_file: The path to the map file + * - x_offset: The x offset to load the map at + * - y_offset: The y offset to load the map at + * - z_offset: The z offset to load the map at + * - crop_map: If true, the map will be cropped to the world bounds + * - measure_only: If true, the map will not be loaded, but the bounds will be calculated + * - no_changeturf: If true, the map will not call /turf/AfterChange + * - x_lower: The minimum x coordinate to load + * - x_upper: The maximum x coordinate to load + * - y_lower: The minimum y coordinate to load + * - y_upper: The maximum y coordinate to load + * - z_lower: The minimum z coordinate to load + * - z_upper: The maximum z coordinate to load + * - place_on_top: Whether to use /turf/proc/PlaceOnTop rather than /turf/proc/ChangeTurf + * - new_z: If true, a new z level will be created for the map + */ +/proc/load_map( + dmm_file, + x_offset = 0, + y_offset = 0, + z_offset = 0, + crop_map = FALSE, + measure_only = FALSE, + no_changeturf = FALSE, + x_lower = -INFINITY, + x_upper = INFINITY, + y_lower = -INFINITY, + y_upper = INFINITY, + z_lower = -INFINITY, + z_upper = INFINITY, + place_on_top = FALSE, + new_z = FALSE, +) + if(!(dmm_file in GLOB.cached_maps)) + GLOB.cached_maps[dmm_file] = new /datum/parsed_map(dmm_file) + + var/datum/parsed_map/parsed_map = GLOB.cached_maps[dmm_file] + parsed_map = parsed_map.copy() + if(!measure_only && !isnull(parsed_map.bounds)) + parsed_map.load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z) + return parsed_map /// Parse a map, possibly cropping it. -/datum/parsed_map/New(tfile, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper=INFINITY, measureOnly=FALSE) +/datum/parsed_map/New(tfile, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper=INFINITY, z_lower = -INFINITY, z_upper=INFINITY, measureOnly=FALSE) // This proc sleeps for like 6 seconds. why? // Is it file accesses? if so, can those be done ahead of time, async to save on time here? I wonder. // Love ya :) @@ -182,20 +229,26 @@ CRASH("Coords before model definition in DMM") var/curr_x = text2num(regexOutput[3]) - if(curr_x < x_lower || curr_x > x_upper) continue + var/curr_y = text2num(regexOutput[4]) + if(curr_y < y_lower || curr_y > y_upper) + continue + + var/curr_z = text2num(regexOutput[5]) + if(curr_z < z_lower || curr_z > z_upper) + continue + var/datum/grid_set/gridSet = new gridSet.xcrd = curr_x - //position of the currently processed square - gridSet.ycrd = text2num(regexOutput[4]) - gridSet.zcrd = text2num(regexOutput[5]) + gridSet.ycrd = curr_y + gridSet.zcrd = curr_z bounds[MAP_MINX] = min(bounds[MAP_MINX], curr_x) - bounds[MAP_MINZ] = min(bounds[MAP_MINZ], gridSet.zcrd) - bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], gridSet.zcrd) + bounds[MAP_MINZ] = min(bounds[MAP_MINZ], curr_y) + bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], curr_z) var/list/gridLines = splittext(regexOutput[6], "\n") gridSet.gridLines = gridLines @@ -236,30 +289,48 @@ bounds[MAP_MAXX] = clamp(bounds[MAP_MAXX], x_lower, x_upper) bounds[MAP_MINY] = clamp(bounds[MAP_MINY], y_lower, y_upper) bounds[MAP_MAXY] = clamp(bounds[MAP_MAXY], y_lower, y_upper) + bounds[MAP_MINZ] = clamp(bounds[MAP_MINZ], z_lower, z_upper) + bounds[MAP_MAXZ] = clamp(bounds[MAP_MAXZ], z_lower, z_upper) parsed_bounds = src.bounds src.key_len = key_len src.line_len = line_len -/// Load the parsed map into the world. See [/proc/load_map] for arguments. -/datum/parsed_map/proc/load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, whitelist = FALSE, new_z) +/// Iterates over all grid sets and returns ones with z values within the given bounds. Inclusive +/datum/parsed_map/proc/filter_grid_sets_based_on_z_bounds(lower_z, upper_z) + var/list/filtered_sets = list() + for(var/datum/grid_set/grid_set as anything in gridSets) + if(grid_set.zcrd < lower_z) + continue + if(grid_set.zcrd > upper_z) + continue + filtered_sets += grid_set + return filtered_sets + +/// Load the parsed map into the world. You probably want [/proc/load_map]. Keep the signature the same. +/datum/parsed_map/proc/load(x_offset = 0, y_offset = 0, z_offset = 0, crop_map = FALSE, no_changeturf = FALSE, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY, z_lower = -INFINITY, z_upper = INFINITY, place_on_top = FALSE, new_z = FALSE) //How I wish for RAII Master.StartLoadingMap() - . = _load_impl(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z) + . = _load_impl(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z) Master.StopLoadingMap() #define MAPLOADING_CHECK_TICK \ if(TICK_CHECK) { \ - SSatoms.map_loader_stop(REF(src)); \ - stoplag(); \ - SSatoms.map_loader_begin(REF(src)); \ + if(loading) { \ + SSatoms.map_loader_stop(REF(src)); \ + stoplag(); \ + SSatoms.map_loader_begin(REF(src)); \ + } else { \ + stoplag(); \ + } \ } // Do not call except via load() above. -/datum/parsed_map/proc/_load_impl(x_offset = 1, y_offset = 1, z_offset = world.maxz + 1, cropMap = FALSE, no_changeturf = FALSE, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY, placeOnTop = FALSE, new_z = FALSE) +/datum/parsed_map/proc/_load_impl(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z) PRIVATE_PROC(TRUE) // Tell ss atoms that we're doing maploading // We'll have to account for this in the following tick_checks so it doesn't overflow + loading = TRUE SSatoms.map_loader_begin(REF(src)) // Loading used to be done in this proc @@ -268,12 +339,13 @@ var/sucessful = FALSE switch(map_format) if(MAP_TGM) - sucessful = _tgm_load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z) + sucessful = _tgm_load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z) else - sucessful = _dmm_load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z) + sucessful = _dmm_load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z) // And we are done lads, call it off SSatoms.map_loader_stop(REF(src)) + loading = FALSE if(new_z) for(var/z_index in bounds[MAP_MINZ] to bounds[MAP_MAXZ]) @@ -301,7 +373,7 @@ // In the tgm format, each gridset contains 255 lines, each line representing one tile, with 255 total gridsets // In the dmm format, each gridset contains 255 lines, each line representing one row of tiles, containing 255 * line length characters, with one gridset per z // You can think of dmm as storing maps in rows, whereas tgm stores them in columns -/datum/parsed_map/proc/_tgm_load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z) +/datum/parsed_map/proc/_tgm_load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z) // setup var/list/modelCache = build_cache(no_changeturf) var/space_key = modelCache[SPACE_KEY] @@ -322,8 +394,12 @@ var/relative_y = first_column.ycrd var/highest_y = relative_y + y_relative_to_absolute - if(!cropMap && highest_y > world.maxy) - world.maxy = highest_y // Expand Y here. X is expanded later on + if(!crop_map && highest_y > world.maxy) + if(new_z) + // Need to avoid improperly loaded area/turf_contents + world.increase_max_y(highest_y, map_load_z_cutoff = z_offset - 1) + else + world.increase_max_y(highest_y) expanded_y = TRUE // Skip Y coords that are above the smallest of the three params @@ -331,10 +407,7 @@ var/y_skip_above = min(world.maxy - y_relative_to_absolute, y_upper, relative_y) // How many lines to skip because they'd be above the y cuttoff line var/y_starting_skip = relative_y - y_skip_above - if (y_skip_above == y_upper) - highest_y = y_upper - else - highest_y += y_starting_skip + highest_y -= y_starting_skip // Y is the LOWEST it will ever be here, so we can easily set a threshold for how low to go var/line_count = length(first_column.gridLines) @@ -343,7 +416,7 @@ // X setup var/x_delta_with = x_upper - if(cropMap) + if(crop_map) // Take our smaller crop threshold yes? x_delta_with = min(x_delta_with, world.maxx) @@ -357,29 +430,51 @@ // If our relative x is greater then X upper, well then we've gotta limit our expansion var/delta = max(final_x - x_delta_with, 0) final_x -= delta - if(final_x > world.maxx && !cropMap) - world.maxx = final_x + if(final_x > world.maxx && !crop_map) + if(new_z) + // Need to avoid improperly loaded area/turf_contents + world.increase_max_x(final_x, map_load_z_cutoff = z_offset - 1) + else + world.increase_max_x(final_x) expanded_x = TRUE var/lowest_x = max(x_lower, 1 - x_relative_to_absolute) + // Amount we offset the grid zcrd to get the true zcrd + var/grid_z_offset = z_offset - 1 + var/z_upper_set = z_upper < INFINITY + var/z_lower_set = z_lower > -INFINITY + // We make the assumption that the last block of turfs will have the highest embedded z in it - var/highest_z = last_column.zcrd + z_offset - 1 // Lets not just make a new z level each time we increment maxz + // true max zcrd + var/map_bounds_z_max = last_column.zcrd + var/z_upper_parsed = map_bounds_z_max + z_offset - 1 + if(z_upper_set) + z_upper_parsed -= map_bounds_z_max - z_upper + if(z_lower_set) + var/offset_amount = z_lower - 1 + z_upper_parsed -= offset_amount + grid_z_offset -= offset_amount + + var/list/target_grid_sets = gridSets + if(z_lower_set || z_upper_set) // bounds are set, filter out gridsets for z levels we don't want + target_grid_sets = filter_grid_sets_based_on_z_bounds(z_lower, z_upper) + var/z_threshold = world.maxz - if(highest_z > z_threshold && cropMap) - for(var/i in z_threshold + 1 to highest_z) //create a new z_level if needed + if(z_upper_parsed > z_threshold && crop_map) + for(var/i in z_threshold + 1 to z_upper_parsed) //create a new z_level if needed world.incrementMaxZ() if(!no_changeturf) WARNING("Z-level expansion occurred without no_changeturf set, this may cause problems when /turf/AfterChange is called") - for(var/datum/grid_set/gset as anything in gridSets) + for(var/datum/grid_set/gset as anything in target_grid_sets) var/true_xcrd = gset.xcrd + x_relative_to_absolute // any cutoff of x means we just shouldn't iterate this gridset if(final_x < true_xcrd || lowest_x > gset.xcrd) continue - var/zcrd = gset.zcrd + z_offset - 1 + var/zcrd = gset.zcrd + grid_z_offset // If we're using changeturf, we disable it if we load into a z level we JUST created var/no_afterchange = no_changeturf || zcrd > z_threshold @@ -406,7 +501,7 @@ if(!cache) SSatoms.map_loader_stop(REF(src)) CRASH("Undefined model key in DMM: [gset.gridLines[i]]") - build_coordinate(cache, locate(true_xcrd, ycrd, zcrd), no_afterchange, placeOnTop, new_z) + build_coordinate(cache, locate(true_xcrd, ycrd, zcrd), no_afterchange, place_on_top, new_z) // only bother with bounds that actually exist if(!first_found) @@ -430,7 +525,7 @@ /// Stanrdard loading, not used in production /// Doesn't take advantage of any tgm optimizations, which makes it slower but also more general /// Use this if for some reason your map format is messy -/datum/parsed_map/proc/_dmm_load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z) +/datum/parsed_map/proc/_dmm_load(x_offset, y_offset, z_offset, crop_map, no_changeturf, x_lower, x_upper, y_lower, y_upper, z_lower, z_upper, place_on_top, new_z) // setup var/list/modelCache = build_cache(no_changeturf) var/space_key = modelCache[SPACE_KEY] @@ -441,19 +536,46 @@ var/y_relative_to_absolute = y_offset - 1 var/x_relative_to_absolute = x_offset - 1 var/line_len = src.line_len - for(var/datum/grid_set/gset as anything in gridSets) + + // Amount we offset the grid zcrd to get the true zcrd + var/grid_z_offset = z_offset - 1 + var/z_upper_set = z_upper < INFINITY + var/z_lower_set = z_lower > -INFINITY + + // we now need to find the maximum z, fun! + var/map_bounds_z_max = 1 + for(var/datum/grid_set/grid_set as anything in gridSets) + map_bounds_z_max = max(map_bounds_z_max, grid_set.zcrd) + + var/z_upper_parsed = map_bounds_z_max + z_offset - 1 + if(z_upper_set) + z_upper_parsed -= map_bounds_z_max - z_upper + if(z_lower_set) + var/offset_amount = z_lower - 1 + z_upper_parsed -= offset_amount + grid_z_offset -= offset_amount + + var/list/target_grid_sets = gridSets + if(z_lower_set || z_upper_set) // bounds are set, filter out gridsets for z levels we don't want + target_grid_sets = filter_grid_sets_based_on_z_bounds(z_lower, z_upper) + + for(var/datum/grid_set/gset as anything in target_grid_sets) var/relative_x = gset.xcrd var/relative_y = gset.ycrd var/true_xcrd = relative_x + x_relative_to_absolute var/ycrd = relative_y + y_relative_to_absolute - var/zcrd = gset.zcrd + z_offset - 1 - if(!cropMap && ycrd > world.maxy) - world.maxy = ycrd // Expand Y here. X is expanded in the loop below + var/zcrd = gset.zcrd + grid_z_offset + if(!crop_map && ycrd > world.maxy) + if(new_z) + // Need to avoid improperly loaded area/turf_contents + world.increase_max_y(ycrd, map_load_z_cutoff = z_offset - 1) + else + world.increase_max_y(ycrd) expanded_y = TRUE var/zexpansion = zcrd > world.maxz var/no_afterchange = no_changeturf if(zexpansion) - if(cropMap) + if(crop_map) continue else while (zcrd > world.maxz) //create a new z_level if needed @@ -471,10 +593,7 @@ var/y_skip_above = min(world.maxy - y_relative_to_absolute, y_upper, relative_y) // How many lines to skip because they'd be above the y cuttoff line var/y_starting_skip = relative_y - y_skip_above - if (y_skip_above == y_upper) - ycrd = y_upper - else - ycrd += y_starting_skip + ycrd += y_starting_skip // Y is the LOWEST it will ever be here, so we can easily set a threshold for how low to go var/line_count = length(gset.gridLines) @@ -493,7 +612,7 @@ var/x_step_count = ROUND_UP(x_target / key_len) var/final_x = relative_x + (x_step_count - 1) var/x_delta_with = x_upper - if(cropMap) + if(crop_map) // Take our smaller crop threshold yes? x_delta_with = min(x_delta_with, world.maxx) if(final_x > x_delta_with) @@ -502,8 +621,12 @@ x_step_count -= delta final_x -= delta x_target = x_step_count * key_len - if(final_x > world.maxx && !cropMap) - world.maxx = final_x + if(final_x > world.maxx && !crop_map) + if(new_z) + // Need to avoid improperly loaded area/turf_contents + world.increase_max_x(final_x, map_load_z_cutoff = z_offset - 1) + else + world.increase_max_x(final_x) expanded_x = TRUE // We're gonna track the first and last pairs of coords we find @@ -532,9 +655,9 @@ continue var/list/cache = modelCache[model_key] if(!cache) - SSatoms.map_loader_stop() + SSatoms.map_loader_stop(REF(src)) CRASH("Undefined model key in DMM: [model_key]") - build_coordinate(cache, locate(xcrd, ycrd, zcrd), no_afterchange, placeOnTop, new_z) + build_coordinate(cache, locate(xcrd, ycrd, zcrd), no_afterchange, place_on_top, new_z) // only bother with bounds that actually exist if(!first_found) @@ -826,7 +949,7 @@ GLOBAL_LIST_EMPTY(map_model_default) // Note: we make the assertion that the last path WILL be a turf. if it isn't, this will fail. if(placeOnTop) - instance = crds.PlaceOnTop(null, members[index], CHANGETURF_DEFER_CHANGE | (no_changeturf ? CHANGETURF_SKIP : NONE)) + instance = crds.load_on_top(members[index], CHANGETURF_DEFER_CHANGE | (no_changeturf ? CHANGETURF_SKIP : NONE)) else if(no_changeturf) instance = create_atom(members[index], crds)//first preloader pass else @@ -836,7 +959,8 @@ GLOBAL_LIST_EMPTY(map_model_default) world.preloader_load(instance) // If this isn't template work, we didn't change our turf and we changed area, then we've gotta handle area lighting transfer else if(!no_changeturf && old_area) - crds.change_area(old_area, crds.loc) + // Don't do contain/uncontain stuff, this happens a few lines up when the area actally changes + crds.on_change_area(old_area, crds.loc) MAPLOADING_CHECK_TICK //finally instance all remainings objects/mobs @@ -953,3 +1077,9 @@ GLOBAL_LIST_EMPTY(map_model_default) grid_models.Cut() gridSets.Cut() return QDEL_HINT_HARDDEL_NOW + +#undef MAP_DMM +#undef MAP_TGM +#undef MAP_UNKNOWN +#undef TRIM_TEXT +#undef MAPLOADING_CHECK_TICK diff --git a/code/modules/mapping/space_management/space_level.dm b/code/modules/mapping/space_management/space_level.dm index cc9c6e11f173..1747806cb216 100644 --- a/code/modules/mapping/space_management/space_level.dm +++ b/code/modules/mapping/space_management/space_level.dm @@ -11,4 +11,12 @@ z_value = new_z name = new_name traits = new_traits + + if (islist(new_traits)) + for (var/trait in new_traits) + SSmapping.z_trait_levels[trait] += list(new_z) + else // in case a single trait is passed in + SSmapping.z_trait_levels[new_traits] += list(new_z) + + set_linkage(new_traits[ZTRAIT_LINKAGE]) diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index cfe9b5043b89..7ffe67406d0e 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -1,26 +1,36 @@ //Yes, they can only be rectangular. //Yes, I'm sorry. /datum/turf_reservation + /// All turfs that we've reserved var/list/reserved_turfs = list() - ///Turfs around the reservation for cordoning + + /// Turfs around the reservation for cordoning var/list/cordon_turfs = list() - ///Area of turfs next to the cordon to fill with pre_cordon_area's + + /// Area of turfs next to the cordon to fill with pre_cordon_area's var/list/pre_cordon_turfs = list() + + /// The width of the reservation var/width = 0 + + /// The height of the reservation var/height = 0 - var/bottom_left_coords[3] - var/top_right_coords[3] - var/turf_type = /turf/open/space - ///Distance away from the cordon where we can put a "sort-cordon" and run some extra code (see make_repel). 0 makes nothing happen - var/pre_cordon_distance = 0 + /// The z stack size of the reservation. Note that reservations are ALWAYS reserved from the bottom up var/z_size = 0 + /// List of the bottom left turfs. Indexed by what their z index for this reservation is var/list/bottom_left_turfs = list() /// List of the top right turfs. Indexed by what their z index for this reservation is var/list/top_right_turfs = list() + /// The turf type the reservation is initially made with + var/turf_type = /turf/open/space + + ///Distance away from the cordon where we can put a "sort-cordon" and run some extra code (see make_repel). 0 makes nothing happen + var/pre_cordon_distance = 0 + /datum/turf_reservation/transit turf_type = /turf/open/space/transit pre_cordon_distance = 7 @@ -113,7 +123,8 @@ INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(throw_atom), enterer) -/datum/turf_reservation/proc/Reserve(width, height, zlevel) +/// Internal proc which handles reserving the area for the reservation. +/datum/turf_reservation/proc/_reserve_area(width, height, zlevel) src.width = width src.height = height if(width > world.maxx || height > world.maxy || width < 1 || height < 1) @@ -149,8 +160,6 @@ break if(!passing || !istype(BL) || !istype(TR)) return FALSE - bottom_left_coords = list(BL.x, BL.y, BL.z) - top_right_coords = list(TR.x, TR.y, TR.z) for(var/i in final) var/turf/T = i reserved_turfs |= T @@ -158,9 +167,55 @@ SSmapping.unused_turfs["[T.z]"] -= T SSmapping.used_turfs[T] = src T.ChangeTurf(turf_type, turf_type) + + bottom_left_turfs += BL + top_right_turfs += TR + return TRUE + +/datum/turf_reservation/proc/reserve(width, height, z_size, z_reservation) + src.z_size = z_size + var/failed_reservation = FALSE + for(var/_ in 1 to z_size) + if(!_reserve_area(width, height, z_reservation)) + failed_reservation = TRUE + break + + if(failed_reservation) + Release() + return FALSE + generate_cordon() return TRUE +/// Calculates the effective bounds information for the given turf. Returns a list of the information, or null if not applicable. +/datum/turf_reservation/proc/calculate_turf_bounds_information(turf/target) + for(var/z_idx in 1 to z_size) + var/turf/bottom_left = bottom_left_turfs[z_idx] + var/turf/top_right = top_right_turfs[z_idx] + var/bl_x = bottom_left.x + var/bl_y = bottom_left.y + var/tr_x = top_right.x + var/tr_y = top_right.y + + if(target.x < bl_x) + continue + + if(target.y < bl_y) + continue + + if(target.x > tr_x) + continue + + if(target.y > tr_y) + continue + + var/list/return_information = list() + return_information["z_idx"] = z_idx + return_information["offset_x"] = target.x - bl_x + return_information["offset_y"] = target.y - bl_y + return return_information + return null + /datum/turf_reservation/New() LAZYADD(SSmapping.turf_reservations, src) diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index 7545b2508a95..b1915d4b580f 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -49,35 +49,6 @@ . += S.z_value break -/// Calculates the effective bounds information for the given turf. Returns a list of the information, or null if not applicable. -/datum/turf_reservation/proc/calculate_turf_bounds_information(turf/target) - for(var/z_idx in 1 to z_size) - var/turf/bottom_left = bottom_left_turfs[z_idx] - var/turf/top_right = top_right_turfs[z_idx] - var/bl_x = bottom_left.x - var/bl_y = bottom_left.y - var/tr_x = top_right.x - var/tr_y = top_right.y - - if(target.x < bl_x) - continue - - if(target.y < bl_y) - continue - - if(target.x > tr_x) - continue - - if(target.y > tr_y) - continue - - var/list/return_information = list() - return_information["z_idx"] = z_idx - return_information["offset_x"] = target.x - bl_x - return_information["offset_y"] = target.y - bl_y - return return_information - return null - /// Gets the turf below the given target. Returns null if there is no turf below the target /datum/turf_reservation/proc/get_turf_below(turf/target) var/list/bounds_info = calculate_turf_bounds_information(target) diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 5b25b248cab8..22d1d8de30a3 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -224,7 +224,7 @@ var/list/turfs = list() var/list/mobs = list() var/blueprints = FALSE - var/clone_area = SSmapping.RequestBlockReservation(size_x * 2 + 1, size_y * 2 + 1) + var/clone_area = SSmapping.request_turf_block_reservation(size_x * 2 + 1, size_y * 2 + 1) for(var/turf/T in block(locate(target_turf.x - size_x, target_turf.y - size_y, target_turf.z), locate(target_turf.x + size_x, target_turf.y + size_y, target_turf.z))) if((ai_user && GLOB.cameranet.checkTurfVis(T)) || (T in seen)) turfs += T diff --git a/code/modules/photography/camera/camera_image_capturing.dm b/code/modules/photography/camera/camera_image_capturing.dm index 16b2da44c36f..aa5443394333 100644 --- a/code/modules/photography/camera/camera_image_capturing.dm +++ b/code/modules/photography/camera/camera_image_capturing.dm @@ -16,13 +16,13 @@ var/wipe_atoms = FALSE if(istype(clone_area) && total_x == clone_area.width && total_y == clone_area.height && size_x >= 0 && size_y > 0) - var/cloned_center_x = round(clone_area.bottom_left_coords[1] + ((total_x - 1) / 2)) - var/cloned_center_y = round(clone_area.bottom_left_coords[2] + ((total_y - 1) / 2)) + var/cloned_center_x = round(clone_area.bottom_left_turfs[1] + ((total_x - 1) / 2)) + var/cloned_center_y = round(clone_area.bottom_left_turfs[2] + ((total_y - 1) / 2)) for(var/t in turfs) var/turf/T = t var/offset_x = T.x - center.x var/offset_y = T.y - center.y - var/turf/newT = locate(cloned_center_x + offset_x, cloned_center_y + offset_y, clone_area.bottom_left_coords[3]) + var/turf/newT = locate(cloned_center_x + offset_x, cloned_center_y + offset_y, clone_area.bottom_left_turfs[3]) if(!(newT in clone_area.reserved_turfs)) //sanity check so we don't overwrite other areas somehow continue atoms += new /obj/effect/appearance_clone(newT, T) @@ -34,7 +34,7 @@ atoms += new /obj/effect/appearance_clone(newT, A) skip_normal = TRUE wipe_atoms = TRUE - center = locate(cloned_center_x, cloned_center_y, clone_area.bottom_left_coords[3]) + center = locate(cloned_center_x, cloned_center_y, clone_area.bottom_left_turfs[3]) if(!skip_normal) for(var/i in turfs) diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm index 117ae0e176fd..aeac6fc712e9 100644 --- a/code/modules/procedural_mapping/mapGenerators/repair.dm +++ b/code/modules/procedural_mapping/mapGenerators/repair.dm @@ -28,7 +28,7 @@ var/z_offset = SSmapping.station_start var/list/bounds for (var/path in SSmapping.config.GetFullMapPaths()) - var/datum/parsed_map/parsed = load_map(file(path), 1, 1, z_offset, measureOnly = FALSE, no_changeturf = FALSE, cropMap=TRUE, x_lower = mother1.x_low, y_lower = mother1.y_low, x_upper = mother1.x_high, y_upper = mother1.y_high) + var/datum/parsed_map/parsed = load_map(file(path), 1, 1, z_offset, measure_only = FALSE, no_changeturf = FALSE, crop_map = TRUE, x_lower = mother1.x_low, y_lower = mother1.y_low, x_upper = mother1.x_high, y_upper = mother1.y_high) bounds = parsed?.bounds z_offset += bounds[MAP_MAXZ] - bounds[MAP_MINZ] + 1 diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index f608f35c61c6..67cbdbe25e74 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -61,9 +61,9 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) if(!storageTurf) //Blame subsystems for not allowing this to be in Initialize if(!GLOB.hhStorageTurf) var/datum/map_template/hilbertshotelstorage/storageTemp = new() - var/datum/turf_reservation/storageReservation = SSmapping.RequestBlockReservation(3, 3) - storageTemp.load(locate(storageReservation.bottom_left_coords[1], storageReservation.bottom_left_coords[2], storageReservation.bottom_left_coords[3])) - GLOB.hhStorageTurf = locate(storageReservation.bottom_left_coords[1]+1, storageReservation.bottom_left_coords[2]+1, storageReservation.bottom_left_coords[3]) + var/datum/turf_reservation/storageReservation = SSmapping.request_turf_block_reservation(3, 3) + storageTemp.load(locate(storageReservation.bottom_left_turfs[1], storageReservation.bottom_left_turfs[2], storageReservation.bottom_left_turfs[3])) + GLOB.hhStorageTurf = locate(storageReservation.bottom_left_turfs[1]+1, storageReservation.bottom_left_turfs[2]+1, storageReservation.bottom_left_turfs[3]) else storageTurf = GLOB.hhStorageTurf if(tryActiveRoom(chosenRoomNumber, user)) @@ -77,20 +77,20 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) if(activeRooms["[roomNumber]"]) var/datum/turf_reservation/roomReservation = activeRooms["[roomNumber]"] do_sparks(3, FALSE, get_turf(user)) - user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3])) + user.forceMove(locate(roomReservation.bottom_left_turfs[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_turfs[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_turfs[3])) return TRUE return FALSE /obj/item/hilbertshotel/proc/tryStoredRoom(roomNumber, mob/user) if(storedRooms["[roomNumber]"]) - var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height) - hotelRoomTempEmpty.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3])) + var/datum/turf_reservation/roomReservation = SSmapping.request_turf_block_reservation(hotelRoomTemp.width, hotelRoomTemp.height) + hotelRoomTempEmpty.load(locate(roomReservation.bottom_left_turfs[1], roomReservation.bottom_left_turfs[2], roomReservation.bottom_left_turfs[3])) var/turfNumber = 1 for(var/i=0, i S.dwidth) + if(dwidth > stationary_dock.dwidth) return SHUTTLE_DWIDTH_TOO_LARGE - if(width-dwidth > S.width-S.dwidth) + if(width-dwidth > stationary_dock.width-stationary_dock.dwidth) return SHUTTLE_WIDTH_TOO_LARGE - if(dheight > S.dheight) + if(dheight > stationary_dock.dheight) return SHUTTLE_DHEIGHT_TOO_LARGE - if(height-dheight > S.height-S.dheight) + if(height-dheight > stationary_dock.height-stationary_dock.dheight) return SHUTTLE_HEIGHT_TOO_LARGE //check the dock isn't occupied - var/currently_docked = S.get_docked() + var/currently_docked = stationary_dock.get_docked() if(currently_docked) // by someone other than us if(currently_docked != src) diff --git a/icons/obj/smooth_structures/alien/nest.dmi b/icons/obj/smooth_structures/alien/nest.dmi index 4a1c757bc6427abafad5d65775db9bffce4c0afc..5f2c2503ba20980affec386f93803ef2ddafd58b 100644 GIT binary patch literal 11467 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 diff --git a/icons/obj/smooth_structures/alien/nest.png b/icons/obj/smooth_structures/alien/nest.png new file mode 100644 index 0000000000000000000000000000000000000000..65d06047e34ec51dfe89c98b8d557cb8bc59571a GIT binary patch literal 13955 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 literal 9121 zcmZ{KWn5HW)GjHb)DVJnDB(ym0@B@Gf~3R%k^=}*LwAcbN+~fYC?z37NjD?iE!|!B z;QPPtr+YuloZrkjd+ojUUimyHQd3=l@B#G$3=9lHB}G|n;F@#y0o?<>qX%p_fy*~< zT?2PnYd1?*I~R95XD1AdcUiIhKOO}0kcTe3@QRA=e;V7B@r9iw7!_>p!1t(`=IB@i zG^5<_!RtsFGF6k+n2eQ~?!68Z0%?dT95pfl))h z+0{z+^`#QZUthFy*_Bo>4jhdc0Z)__m8(bpu6F$N=_4GDFh!Nx{ZK+(8oO*yW@6}W z#(Q~tv`fP<)uLZ#_%*%23y>AXm8?h0qAmWEj8K|tq9YKe_j#A{*2ag2>ke;eo?#fQ zg3()83CdQH$c-;_v@*(!bP}tLzTj)w+TPu%H8r*>@ z{nlCLD?{%?VBi$!YaU|pCay6DX@j7mn?5&9?X!{<{ zip=9-7*S#=FM5R&;88*($()XvbMSY58s#&3{kzFog_B7=Or*E z#Ze?ET{(M78pWy4WtI!yx{|Ej;v0EoSW1>Nwb^+H9>A3*{2Mxci!S+wy#`-3OPfD*NZ^;Mj6npPR%tm((AdR^A?JnLJ=%3@w{MlA)IjQgB_k zVDBih)I!9==sT(%)$zn;Z)X@NGPbEPu1&-H`b4+&>D2hgx&1<|4L|eOMpE)TRc>Q0 z45kO><2|k!VgS6PqPSj>M9!{|RIv%Z7=?Q0jWcus2SeD|)ZIyR2Af#aZs^Hob zuc!P`3=W*MmnfW-*D?^WfGYiz{yIAkLvPDaj}moVJ-eS9R+OphZ?n{@2UMw#H-6)% zkvCq8NU$5MCcx_D8^@RgNK1>5c^z+$YSg!jdPhfNTl)L2f4MM83+?&be!1^~2Q2L4 zaI<&-+ZAGOh4N7tliprm=C0bW0HqRr zBDM3jf(eC4+bkmQqJi<#R}E3mp(`z=CNmaJ%j1`^9wj@nj!4M!c|h8adZUEIEXk^y zM_?FR$lRsGWBLffrw^kY9B0_SeluNbZlzPLh(^i*=C7_ApVYsssh9i;qnBH#IMC^* zN`*;MOX?f~uZPyckRs)UESi8w<;&H^g|Nmz|FTUhqZL8pi9ajp5Ko_YZSUrCdC%9< zGB*RrinITL*6bh|0Y|h)NgPt{Gj;|YE<+2$9@%A^n7XjzMFWwR9!qlP@a9pGJ~5_k zwf$ds$I+xr(zBNWUasB{G#{F%@pR5IXy!%vPv-`sh+5YmwRHS5F^3FDS^|MX!B!_6gkFwU zs}&n8ulAijNU?@ro`fI7X25s~*|Xdyw{|Exxww2>9S~A!L4np?!sW2RyzW|irK<$&@^!Ezn!EZo_-d8#k$0B`#0OSro5b4#4e+Qv%1=eTsxBEbjQE@ zboNqV_(Sxc;G!fLW$Jm7#C0LrajROC#7(~czLaWw&y8rno8yEe^-OnG1;CaYuZbGe z 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%0A>an znsH)1fPE_QgdMOfG$h7pAQu8kOq?8QGZvz6Gt{Vf$?=K+Any7Y8FXG~>4fuvw6 z=l}>6ZN?b@VJMhLb;v>!2!{7wOosjOn3{6#@h%&rb#sgQN{p9FMVZBj9B}~LRGWbW zzbFIpOjw$62E2ye_5h3q01$OJPST$`FHS$YF4}R;G`b9IRim_+HXU(zZl$d9VJ;*| z;?dDl3I=7TEboSm_2)fDiVojWMhM-wM0FZZfNF?E?jI~PyE9rE=Fw_76s{t@p_kCiJm*ddIcDkm?Pgsc@#!EPKk<%9DB~pjel9Ex3$U7eDW6fksZ19_ z&GY-~lmuB2AFZghkgeOW1GbCsUtU_#o*8giIMBq@)=~3vXvO8zMwOzW5;Qs zw)zsl6d8LF5q9BULqLJ-|38XHL=fVU98cO6(;7cksv26h%FX$~M>NtPx7wZ} zWcMm;c8OaV@k=%ZXtK~!8U=3v18Yo5!YA?V4FWxAw|<_e9vRo!;ymlCQ9au##6z;4 z2KaWm4!K6tzC%YTNOCJzNi{zFBM(zRB5_&|R}XexP@*CXU`&A4FwB~$SX5XN9W%5o zk|>_N+(E<36o3xMP=qZDu{Hrz4kPIwyl^vYZYL)YuSr^@EcB^6uUH)EP+I&3K)VF| zsE$TLkQA>QYr>Io5kLvkfFRMrugOj zVsmD9k6Z?aijTx`LSX-0)OnFQB#|z4+$BT{O%T;4#@1#*WbFhtjbqSEJ1n%Z;mfe2 zBg4SJ%D;OTV4I9NWD8ICVQ3ot+UNDOe&7(bGZlY;b|^_E^y%q3)v562dWk`r^!pQ3 z-dRiSL!RzYOhGZ}in5PWO;}gow2`t?oQlR2FyAM%Y!6Od!6R4NMwA7MLB+mZGZj$s z1025?^oJvjoR(F~qXgB0fUoz1$w=_amEL(FB=>*HiRh={5%4<6Kg!^f+M@Uc@?o)DtTqbs0|-U;+~V;x_R%N4|rowuZRid^djDg^+w5G~@odDxc4D zceZ(uj2s|Rn|Dt)_pn#Xd)P?`<+RveD(BuKSioVTTwN7SwEH|vaRu<#qZ%%< zK7c2#KSrWczQ_$Oad!~2<6Ht*@ir_NAW+6fbr{rN$R_Y$=deErqi1VK*#E_@3g0f; za<2j*>h1^-nR-2cJ4DmBZ#1FYs2a9Q%!hLK)m%Ud*l%9N1h1WzNbTF4B!DB*TOvXn*X>CP!(y$Eco#+iu!l!t*Tt% zxgFLLIX=ClSs2#43)mVVzv@tNV#vJzY5NB* zNwJT&Esd`3US~6jcu)1pU~NPZ(b;MLvD$HpF1QzKgt zdEVrRFzYGftn9TK`Z#NK5ty6`3QYd5ZCBRE{@=EpWrgSQxWKikLL3}x;MV|&E-xlt zh;IPXr{H|d?Ao;%_)YPdje0HL7gA--)NM0`J^lD9NeI JmP(rk{U0!o0^R@s diff --git a/icons/obj/smooth_structures/alien/resin_membrane.png b/icons/obj/smooth_structures/alien/resin_membrane.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea4dc33eccef5bedcec682aa383854d13a064f4 GIT binary patch literal 15317 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%0D3_r=4K-ex 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 k(;0osa5OWLKW0$HwDk3Ta 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 rK(v;zBy=SSmCz=$iPoRBG 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 NzYUy!@{Of`{U6~vnMD8q literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/alien/weednode.png.toml b/icons/obj/smooth_structures/alien/weednode.png.toml new file mode 100644 index 000000000000..591ca723785b --- /dev/null +++ b/icons/obj/smooth_structures/alien/weednode.png.toml @@ -0,0 +1,14 @@ +output_name = "weednode" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 40 +y = 40 + +[output_icon_size] +x = 40 +y = 40 + +[cut_pos] +x = 20 +y = 20 \ No newline at end of file diff --git a/icons/obj/smooth_structures/alien/weeds1.dmi b/icons/obj/smooth_structures/alien/weeds1.dmi index b794b6853fc067b91a0d438e4d359df136eef0e5..4ba1bafcfe5255899d0c1043536c5dce81124c1b 100644 GIT binary patch literal 13568 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 diff --git a/icons/obj/smooth_structures/alien/weeds1.png b/icons/obj/smooth_structures/alien/weeds1.png new file mode 100644 index 0000000000000000000000000000000000000000..1275858dba88958b86e0f373817ab09af3d818c5 GIT binary patch literal 16137 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 ZQ@EY|Uganc{7)3ogZt|DiWE!({|A>IL!|%! literal 1657 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5m8A!&LZC(qcBm#UwTn`*LU}0vXuV>=y=;`Gd zsHCVG;2#bYj5)57160FU666=m;PC858j!QLDkP%BCAB!YD6^m>Ge3`kp<+(&WJj(; z1_G|vPii{t?vt3jRyuQ{-Wyr2nX`0yE^t2k<;ML^rT)9UP1|vv%d1aU%uO@BqxN%A z?_=YYn~T~Pi>UsRv0M7g;iKHAI1BxmS#Ns!=8D+m#mt_Vbaxv2+n>khFdSp*VU}1d z{NQrhnzRGU&q~BH$TQX4DwZ)={*GPHt3y!PtH)w(L(uGv438O>3H;nY{q0o?{`=vT z%$%M#T8SiblEgRTD6>R-SAcnoG(2`zDLMCdrM%MqqgWnUWsbi8he9htj|gl_ubt0*?5;z z+l#!c-uo{?6Xv~M{##{h)J4%_RrRk^dcG)Wte;vI7^qk05`IJ=`PH{Co{g1jXV-)j zb{0H(F2VNr@|Vlq3v8A?O-VB@XN+C+S10^-efX1yO_jO#xt|{UX4X8jzMKlMXV%)_(Ce!lyC^K@ej%d^-^vlXn${a1@? zUE*C|U&9|Y`8msT-h_?=k3n4*~bKUE9= zu8%LTo?`X;Bb6?zeqKUv#_~lIo>g9A6yx;&R9D>m=A>yt-0Rx^LUCJb-KIxmKRw$Q zR=-f}VCALb7xgceZ8%Z<=CIP@6rSsG_uMU}i*0;xRJL?kZTg2-yLi4V7g!YbbjeKh z9mhCx|E#IX=YMzQ?cMvA=ZSy3vvm5MY|G2nElxDg`eRj*DEg|js;cu=)j2y}ftSA9 z>~iDTzDez#wLoIE>61rd$-7N9f0$YsTvp>_tyG)Zu;OIjMXl`pi|!@NmB`nU`=dI4 z+3R0vz1{vR%zqt^tGX}y$6@yi&Dvca$`74>eN%gX`sykD<6T=~d%QSy?^|$hi>!uW zRbjynDeeDzcD>yGJN?Se8wFGKukCEk-?Jr4s}DVY&bq$JuL#e2>Rhx> zYu+5LJ?09bJeAwORkAs(J!s3UQShy;h;2ir4jTQ$x;p9+XF9`dw|$$JtIjI`Dgg>f zl^>Ek@NM0VbMv0HK!tX-K^e0ufO6X=zJ2pj3dmTt@xV>#Q$Tv+`!|{$ASEyxo>>3x z5B>4jxWQNX{>|AS%X5JyJ6keWyuWq%rsbS-=N^@mi7ns!*<$Y8qx&DfQCC+_-7t4A z%eKwa50rfqx^XU!>GnSbg$V{BOch-DmJc`?0>#X2FuHlv+h(3m*+-#%^~n?qU*27>`j3gZvS2S$j@egW)xhBC>gTe~DWM4fs8Bto diff --git a/icons/obj/smooth_structures/alien/weeds2.png b/icons/obj/smooth_structures/alien/weeds2.png new file mode 100644 index 0000000000000000000000000000000000000000..a3e0002774b2bdda6c26e74a5334c95101feb8b4 GIT binary patch literal 16107 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 bY{LQp1<2RI_kq7q!&6h%QYw025%zxoAs5?; literal 1658 zcmb`IYgE!_7{LGDx@gWYH_^P5W}BT*TbZ{KG0;#GZI)dGo0=R6k(CI6yg$A+X%Pdht(*g4zI*@yRe&ii|R&-*;zo{K?& zzJ~hd`TzhJqW2>YF6WMwqpPzV!;`t}VQg1^AsXC}LAe-V3NjnNVCwdlF zV%@;mxc}uMn0MuV;|u=wGl~Fl-%mH_$^#Q3ySi2EfD7CFng&i)^*F=H=Jh_7?4J2< zmOvrfyq{L+hjW6B>SY+y&Qtc;D9MvH1vSwB9`2Bl zqxXq7c1ej;NW>8lELfdE=QV=PZIpd1WS3}f4tPyj+3dya{SbW&&KZwqa9IHu+ zRS3=UrmHStq5V)fFj(OKgmp&FV*?^_ot>qYkN6j;f=hnYqa5|m$&6KAJ>3d@u&8u z0(#wV;;FzA)Wjq8kwPnWl>v)4@*cR~>IZ^CGIa0RuIsNPVzZncoq=^v%N8`0iT*#? z6(=fCiui?Fa{>Pz*nK_$k3rC__|ZX15dC4L?!-B+3+oe5K%!TaPpwvJTnuYg-!Z%5 zkxIpUreZRO6`*z?-jw9tL=#I+vbr6lL!>zdgYoU-Zd?fR9cV`@^(V~nnq#_Kn4w*g52{;k8XV3UKlH3l4yICiS?P|P67JO7Ly7+=S$BB2 zsoBDAT-WpO3tP*0B^9>!xS_L&$mF@0jDn684v|Re)NVE&sm^fUC_G0#Mgzg#j~0dh zLWYlywc0e1FABIq2b^>!_Fg`dyr&eD+F3o{`rolZ-pBYE;~(%0Z1ZE8B+3-d)1*i- Xk+FEVZSVqRc{c!PR3Nh6`$X0s&CE*k diff --git a/icons/obj/smooth_structures/alien/weeds3.png b/icons/obj/smooth_structures/alien/weeds3.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c0d4440156bd83f299133fece632c929eb17aa GIT binary patch literal 16605 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 LxnuQhlfL(#&b_qY literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/alien/weeds3.png.toml b/icons/obj/smooth_structures/alien/weeds3.png.toml new file mode 100644 index 000000000000..19eb01420b4e --- /dev/null +++ b/icons/obj/smooth_structures/alien/weeds3.png.toml @@ -0,0 +1,14 @@ +output_name = "weeds3" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 40 +y = 40 + +[output_icon_size] +x = 40 +y = 40 + +[cut_pos] +x = 20 +y = 20 \ No newline at end of file diff --git a/icons/obj/smooth_structures/alien_table.dmi b/icons/obj/smooth_structures/alien_table.dmi index 1d60bcc82f66dffbe50b5a0db86416aa6c8a8a4d..865b7d3572f16f12d25425852589d62d568d96ac 100644 GIT binary patch literal 6440 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 diff --git a/icons/obj/smooth_structures/alien_table.png b/icons/obj/smooth_structures/alien_table.png new file mode 100644 index 0000000000000000000000000000000000000000..d9a5c3b73e41e60d28c4d98d3a484ccd65a93e8b GIT binary patch literal 4871 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 X=bFa7Z6)vzE+S%K5O*>`3n%S56Q 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 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/brass_table.png.toml b/icons/obj/smooth_structures/brass_table.png.toml new file mode 100644 index 000000000000..d633747042d5 --- /dev/null +++ b/icons/obj/smooth_structures/brass_table.png.toml @@ -0,0 +1,2 @@ +output_name = "brass_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/catwalk.dmi b/icons/obj/smooth_structures/catwalk.dmi index 0920cc571f1e59d36ac1cb734d755280df6b0163..568afb15fea9debfc83bfb8b08d4f261bcfffb3a 100644 GIT binary patch literal 3565 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 literal 3692 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 Thj#GaM+DBn$-eZE&-H%;AO4vW diff --git a/icons/obj/smooth_structures/catwalk.png b/icons/obj/smooth_structures/catwalk.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9cc940562555a5a05cded7e4171d304d0a8e7d GIT binary patch literal 6394 zcmeHMdrXs86#rTtMTpd`zTy}(%F;MDO{UpEOM$Ig$p|$*)@2}Uy1<;WIf2k>TS_(Y zv1K5HENobqF3fEiBwL0~2o!ZHb5fjch+5soHuNUz7nVFeyY(k%W_*j3Nicc;~EfT>hnVDw1E zuw?QUS?MbhR&D$C2di>73;4!cQL<;E9EVv61lNAKsFlOLHG`lT4TAWUmBxJ>B2axS zYS%~BDwh$6Y=n0ba!OdoHssHeG^#@uu5%$qOF{iORs!TydN!Rq}5mTc+Yf|N&} zmb8bo!wd$aq389+XyKmgSGq12$#Z$PW(bK8g&^L3*|v|vrLl>~VS_-=QW*mkgxGQ{ z>WEN$nnloc6BvB7rhPlFzqCI{7og4mjA8$CfZG}%(>eN030nJ+^O7p2RJ%FSklJL9 zVOk0Y>MsVw84{UWc$GO#u#cAIaVVI8VkDl1#Ah9 zCgmyC*E&ws_7yq4+GD#`R54U*Da%N;DK)X@q&$5$?@l`J{vu9#F|3P_B-8~-(C#k5 zAxXx0|2u;mFFH4K^&0=PVA7DPr;O#nVt zXl5ti$;!J93Z-4Q@e+#_a2J;zj#TPR?ykzLFgC=}oJM(~i>gWt;E6f)TY)ezqN%ax$Lds&ef(}$`x^WE><9=8 zQ&Uqr2OuWE4&p?7*N8p}=k>UZ?}Ueki`(`_o<-Q6sEf_4mwbR>h`3W7W&#kv18iVF zAtR#h6LS4Ws>KRF0MrXih8~J<*y(3G-xehR@dFusT8|Ui9use@IrUc)vy6&Sy-*k( zQ<4oR$$#D(agxKSN1l!UuHJ~>%Qh$H_JfJQh?e6_fVh-fsMiCe$Cw>B(S-5#>%EO4 zIiJ)5q8fEMI$&#v2o1d*mD+4Z=w5*H3pf7Bo9EGSmVQXF9)wN8V{?uT@@KgpjB2d- zUlHz13Wt70RBrv!N!xzoopcwa6LZ3xm`jI@>5qPyG8j{;CAZbSX_wt>zsIT^;@8#H zoz!}l4yPj`B8*jxxC1t6>qK45dX2f0DnC#rjVUl9b&GZ22EvyBKs0&Lf7V}2EpSNh zWmLONTA6t8H%amwPs{tGAnN%ErvJc)#Iw>}=6cZ#BTmC`Y7T~y|E}JIwU-qq=k{(d z4U6G_@N2}RtI+_?2~V@t0Ts$TX}AW7ZZUnFQ6%%uCP0+5S&v1Z&s0H50%G5Z<)LVKJzgg+`>w`5us7YBm(h-TORSFT*Sng27s<1G!+84nW?Kb^H+XPIb~ct#jyPzD zK_#~A0yM<1_)_AM6pR`T7~MK!8*txBj>|b{SB06NnuGpK1KVXZo5AS7O*ESX$}z|a z>BZ1&!2UrL#%fb?hV7>^w{Bw8P-8u}4b)?#!L#dG#dx;65JU$7jYY4eUIQCXWJo+8 z6B9$|NG(!7`kF||gRmp;8OEp_l72BNk)S6=>elmmId(On$UxqHKV(ffN$W81qo1vwfp35ltI_~Z^z?-vwFNzkCd-!RG s)1D&r@prD?wVKrUZ=TaKXRv5+h$VdOr5h{I|1^lC)hYa%SKn6t2X6CiyZ`_I literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/catwalk.png.toml b/icons/obj/smooth_structures/catwalk.png.toml new file mode 100644 index 000000000000..42610e2043b1 --- /dev/null +++ b/icons/obj/smooth_structures/catwalk.png.toml @@ -0,0 +1,2 @@ +output_name = "catwalk" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/clockwork_window.dmi b/icons/obj/smooth_structures/clockwork_window.dmi index 10d5bcf631c7ec6b238576ecd67735f4c5ba716c..6676095e9fbf3dbb78b502a626865a7881b6be70 100644 GIT binary patch literal 4356 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 a>5}bto2)x382S-8gPyj5R+Z+{u>S(*s`F_8 literal 3437 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 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/fancy_table.png.toml b/icons/obj/smooth_structures/fancy_table.png.toml new file mode 100644 index 000000000000..df9ca0016d76 --- /dev/null +++ b/icons/obj/smooth_structures/fancy_table.png.toml @@ -0,0 +1,14 @@ +output_name = "fancy_table" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 32 +y = 34 + +[output_icon_size] +x = 32 +y = 34 + +[cut_pos] +x = 16 +y = 17 \ No newline at end of file diff --git a/icons/obj/smooth_structures/fancy_table_black.dmi b/icons/obj/smooth_structures/fancy_table_black.dmi index d4570e8a7c1a09329d0baaa94c0d6ad633d3cced..3be7232af5ee74959c316c4bfca3376f0b668a1a 100644 GIT binary patch literal 5680 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 literal 3295 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 Q@Q($+>6>B7bzP$V4GOC|KmY&$ diff --git a/icons/obj/smooth_structures/fancy_table_black.png b/icons/obj/smooth_structures/fancy_table_black.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e2bfa810bce01c42625d3a77eb33045738a023 GIT binary patch literal 2852 zcmcImeNa&1f@(xR|gcVRFP%e)Ilj$AgpCgQ4!a*umes)wFOyF1hk;RBz~gH zC|xb0V2Lv<=*U9+AciRMfr_XRVv7bWf$(8~F+vgoBqT5I?Y%dZYWMHWOzwI2>-^67 z-QT(Io!q>M!P?U4OU0pPBWj{5V~T*hz@)hT!L*QaXv4jFzNR#dZ2-ZYRmSgN^D)-RrA##MUz9a+zj3<<<3F=dQlVI^DU% zZE3m(C%y7s>T~k$NeW4h?MA!7dX(oU&owP>TbbFpOXk*dE^+q?`pCuA*~i89SG&6V z3M`X_W7*>Rmc%?$M2f0Rcc}H^>ia_fKYH$g{;f|h1d{>gU9zsFRDNjoz%2SKa!;mA zI$g8x(~Gv26(Uz7mZNN*X{cCiMpiQQ1V^$7nYHgAbs29mOuSu#Y$R{Owoq);`_sN} zpFp8tay8pBnq6ib4Dxk2ZA5Q7hw}OB{>sGN@}{r`FDkDofV9m3M8v3MLhoPfusteP z2%5`zf)69Bi_juj*LS5>zaB5a!B<3=q!2(1&oMW+-Y^bZ7vmpz^{Q;^_`hhz4Bt!Y zCk})F?!FmcGh+ExqBXHluytDKl-U509(~2S&Eh*w+Yh4j6H%)%D7i$xaFGk(cE5IT$aa2`q@pzKlN$kGY#_5h~G^`o%J>bW8g zK`s!*!mtC#$$ug%tbV8W5t_ePMeRd~2m{k5eXqwXAI(F7Y7B@P?Q7HuVy))6@ech# zB%4IsdUA|w@lo?puG{v#m>CH)SZPR6lNK9n_X~F484k&OLFa6(x&4~(EUK!p8NSe6 zt)lFkVg*sm#krz{Ad4MJ2;c(LA_)<%FxOMZZK;xG zy_ji%YRn?=QC6YW?xa6T$EZy0!xa3!7N}Kks{&cyoh3`Dfd4HmXVIZ>u?WK7J_$z7 z%H&#-H=hEBBGpZb^GS8@Az!zrxHm+(P&!_)q911WSYys2(@>`9PamOZ%a_cGq~C%GVPSTXiM%TwYM}bu4=9{4woBM z9*)ZMdBTOtlPxVV6mto28{v4x9B@k} zV{~+PCp(>>-m(gSrX9$~1J`hrHYPJrB@FZ})?>TfP|y~dRU!qgOs@VmXs z3mKc&GkScwN9O|$hXWQYT$o9q%Lv2Os)ufWD5}xdY4PiTdA=nX5eMP5#&gZ*D^J2G zalG*MP_|KZ*i|)^(Suqmw_LM%FF#xiZE8lEc6p5L$?gQ6WtD~ zYUx8^@L}fsA?!b=FTMdN9rzlod09aQzSB%#nx zB%^NlQ)}`%Pz3^)q>xh6W1@&03rGh>A2ENq-EIdcd=Sh3rH#8=!MzFNJ)js!g?(lC zFf{VZ(6B7E(CFZCz~hFxG2t%2f&N|6o@dfe1B6N5KKc`}_W?a;u=U4&?12H-UWXpr z$|h=yAwt4Tnt9eOO&*eo+99DKHr?n=a*&=wlenE#!_2U-cu^|7e6EK3$E zg>rQ?@yKJ`5goU69*g@;$x{3pYf_G~8(^D>lZ}-Wm8nm I+N8t(1vc4p0ssI2 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/fancy_table_black.png.toml b/icons/obj/smooth_structures/fancy_table_black.png.toml new file mode 100644 index 000000000000..acf7a6b82137 --- /dev/null +++ b/icons/obj/smooth_structures/fancy_table_black.png.toml @@ -0,0 +1,14 @@ +output_name = "fancy_table_black" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 32 +y = 34 + +[output_icon_size] +x = 32 +y = 34 + +[cut_pos] +x = 16 +y = 17 \ No newline at end of file diff --git a/icons/obj/smooth_structures/fancy_table_blue.dmi b/icons/obj/smooth_structures/fancy_table_blue.dmi new file mode 100644 index 0000000000000000000000000000000000000000..26263e514911fbe887ab4203a4e9c57f231f0b93 GIT binary patch literal 5698 zcmZu#c|6qLyB|A4kqD)xk)0vYLS-0a5GMPQC6b*Ig&HH7h%mBc9ec)3gRi}`*s^ai z7=7()*0IcX$M@d*`rY5X_m9u#e9rTn^PKbfJkNPQ@8|OtVWfKkcoql%08Z$^wM`i9 z4CC71WM|wjN^!>n08AXgW>)^%E>E5P+#mb9`}zO?ff<>}J;iO8`OsrMrmS{E11Y^2 zyT4B9++UJ|kGOHuG|mYUr;9y>4xfp%aVV?0o)lSGepz*Yb=(8Dk+Yt*s$+~N_nDL2 zNL3r$o@N#i3s&vVf13%F2p`SPAncy?8J5<5tQ^ns`K<^l@*?8xP%^SN@gu4)`&v)w z>E2ay8akB{E3n)leST}X4@6a!;hnv;9rOz(%b9IUnL4qD0Du5VPg~P0Fk?N_xXAAN`F5!|IYTnf zm!ogcNHKTqsvNgmNLYTP)hVvOmS8_&kAL@iF>g$A`>gb$8)0X3fH{f6;wqeA4+s59 zr!5g!6kMVrna}ysnL+Z+>#gbai<$NNlP?}E++3u!fCB$eutdtj&p$s^7kg9xM9E=J zS5Q~dqVGnjm}=5z7xzk_lmXmkpth`N0hqyQeJR^%PR*Xb`5QA;5^y^2#QDEiYpq(mM4b;DL8 zidJgyv!=gOSBw7X0Q#j;{=P!-=VyKF>z61Xm9oSV^mbgUeE{zo!QOCDGcFz{W|^(7 zL2o1zlcnP7^AE~!2V2uEyizYcsvXr9!N`RyA`B+MEu3Pvi@E;!!2qtJEXL5JmO3! z?fE{aM=VJ9fOx?F12wbeGzq;nqU8l#LW$A`H{ahilCW7cdEJ8!_9%*Ce}2-k--1FRD*0Zxf1?0S2?_w;Kb%Qa+} zQs3eYT9fa~i7|j1dGzf)8nPCYek}+a$TeGc(h&Qn@9P|fhj7k&Sd&m^^mE%c8Y<2@ z5d!pwzw5s&WIG*Z-(0;+YOV3~o0qu`{pc|i)sq^Lvu-P8b6B_Fe~;vBN*7;GGUbgq zQ%=T90Iv6;%nY50#WmhRj5kOqrjVVW68!Jd7kzo6rPYmC9c!G(C-?KxQ7bKUQu;;2EW>lK@?Agqv$2^PiF#3cy+Kzi>_OS^qhvXp&Wp=_qd(TG8|x?Pa#eshi`ATJ*)e(chCH2h`U{C!G)L- zOSFa<^t&0%U_Y9yEo$$mp8WjW;eJ5G^=B5Au_M2C-iuY-#iqhl6hMTIABT~|NDSmAs($}V=Jkr1cV)<0FdE$FzH}WI`vOB(P9M5H6qnx*+*$w^#6SHfZLK96K_qcrjsu1bQ@Hi=?o zPCaz%{B5Wi{nN>=;d}(p5td$29;tT3BS{?FsTZ_9PsQr%)6-W_+klJ$L|RlWu;ysq zZ|I|e%m!=P+Q-ig^c~C~-Fgoi1n9MpHq5dRgtGF7O{gOK25; zgS4>Ji2Am`V87Cnqgq?^PnD<$>8(f%J1R==mxIK->r|b5$XJ^ zw3L%0@tpqv6X(An6&9R4sV;Nw69cTOjJqUlUAS9s(y zN$acb+*y8RZ{n5lH~D;N0ER=vP|9f#AHG=<8(^e0^SI~7+7;_y4_N7PtYhm*|luUTOSS{6I#v6k zxpgpMe1aArJkpSbZ6aiBJH=Vs7%|qZhO!^*x7AR+Gl+qnxPnJoIUvkAM{s5~0|k6F zrsgVwPk!{wZoj+X*I@}wg4qxP@irT|$9oqj_~n47%!iHY9Pi^yXmGTosX4THcW-e- z&EdCMIX|tsm$`Af)KzQ8Fw6p zppRFoL2>~wFrQPTvcUr$X{RWKE6RhnhALl5R^IX^Xb0zFN-RO<9Z9VXw*uTr1M|dB zJH$uWekIzoMF1&UG)>_n%>A_6RZBb)pY{YhoY?5prU%n^akR@Bw)8N>@rlB+VlbrD z`S@arK~2Sc#awK}s{r)i1Atn0Vj(7-&=SY$un{P1Whsr^{-A8g1+0gY4d*ESKF1d7 zhkCE*NY62^%kA0ry^RO(7pn@X%0Dndn^X(>*XOK}vF%r59$~~3b=Vz`g-OEmL@Dyb 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%0DlzF%r9_N%34N)S8?p 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 EKeuroV*mgE diff --git a/icons/obj/smooth_structures/fancy_table_exoticpurple.dmi b/icons/obj/smooth_structures/fancy_table_exoticpurple.dmi deleted file mode 100644 index a2a060bc762600454a8544d5ac0776711526133e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3190 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 S>oe^m0l*B*^k3^bMg0f#&G;Aq diff --git a/icons/obj/smooth_structures/fancy_table_green.dmi b/icons/obj/smooth_structures/fancy_table_green.dmi new file mode 100644 index 0000000000000000000000000000000000000000..dc6c7e4703c833950ae6f0a8e95553a5a6a2573a GIT binary patch literal 5754 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 AY5)KL literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/fancy_table_green.png b/icons/obj/smooth_structures/fancy_table_green.png new file mode 100644 index 0000000000000000000000000000000000000000..616eeeaa6eca01739670d48e05366cf70f62ecc6 GIT binary patch literal 2887 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 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/fancy_table_orange.png.toml b/icons/obj/smooth_structures/fancy_table_orange.png.toml new file mode 100644 index 000000000000..fcca03afb5aa --- /dev/null +++ b/icons/obj/smooth_structures/fancy_table_orange.png.toml @@ -0,0 +1,14 @@ +output_name = "fancy_table_orange" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 32 +y = 34 + +[output_icon_size] +x = 32 +y = 34 + +[cut_pos] +x = 16 +y = 17 \ No newline at end of file diff --git a/icons/obj/smooth_structures/fancy_table_purple.dmi b/icons/obj/smooth_structures/fancy_table_purple.dmi new file mode 100644 index 0000000000000000000000000000000000000000..930b0556520f8981025e7184881f6079bc1e3166 GIT binary patch literal 5871 zcmZu#c{r3``yY{*lqE}KX)4*5Y-PzX*2p$?vM0MKk)kmup~8@Cr9opi)ZoTjok*7UtO^F>8UbP)usf7ocVpCg{(?FAzR#)jzf7l0{ zg`gp5arAjh!#wU7t(Y$?-Nf73JYU&$;cT@qG=FT1VxXR-8>`u90a)%we*sv;Nj|DAim;j`nopvU$5qxB?x!&bp{xnLPk3t^$;sC z;2u%`oOq-r{gHeOT2H;19khHHjy68ixby8ZnDm(Ws4W?D?5_nF`Tt)$;5hepdv{%%cR|0D8H^Vl8JiJMBFEuo2Wwc!k+%2Eq zm)UO91cQXVk5mvW1UFWyEe26+qYwjd*ef9C^-W|0Ee z-)(H|md|bo5XCeM&2iD&&^G`Qv`Wg)7g*Ss(OhRabYRgp4~0JN2Y^%- zTIz1E6_KJZz5403K0bS?BDPoa_vpqQnC+wQ1ANDW$QmxQD7V#cgBSQ=R`(L+ zrIs(nVTNy5$6CV(Ujgm$_1Gdm44cmC3DKqJ8h!Iu@_WDfzdeaZE{CQ9$Of{w*?{PQ zX!Y8u=MS_yH;R$dtx3|pG}7WZfEL&mkb^}Qa2LHhGU*84rP8&opX|DQ`-dUuPjoh5 zwh{kWXFMh5WFoiFTtNe$$^n%wTwzb|V`Aji=mNe3-t=iREyG}K-#VnLEdiRU!>S?nn(8gCU57UjuM5BIvodi9cBSso>CKe9RanV=yX5vDeUb~6} zofouyAF-g}5qY~y8Gftc<^m;Y)zc~PDt%%o@sLQt)%nta9V%@iKTK+H_TgykqD9Yg zT%!a&Bhkapq7(VLbAK{k%GAG47?2 z=$>D3UqZw;v?~(F(Br#NKXkK~cuih#9=EkBk(=Ul1YQfi zOE^1d+iY24fNhqkpplQdP{}h_h)1{zE63tsK?|pm?F7K3KMpYKLE%9aCrw`D^ygg< zN+wGD?JRvEK4FaQ#Xx)IGqpY0XRrzbp!qDN{f8BX>2CWk<>x73z+Iok4#)jG%QL5z z>GLOtQrZ3+p8m$GVJ_2P%uLegFqhrRij|7oD5sQO{=$WHsP$hkhqVdgckKuohDxaed)x)&*lQ*5s6Zs<)GG*!!yIV|EaMAfQuX zYE0Q7pgTOnmlm|uhJ(qEMb&~hq#o}lS{Yb#!)@Zdv#&3|ge&WT>nj4v(a#!y%??EK z#Rq)H@rMmm@}Ew`NPK2|Ft>;M%DbQ3GR-yZrL(jT^s^mo-@n}X)n13923ABlmF2D_ zH%w-a*ku_(c1NLJtK|uj;6Ghd;ToSw&t!Cd9<@+YM1;AMI?Zp$>4OWM>}o#Oe;~rT z?8Ls!suK|x&<|XS{dU4;Y@jzX-|ubvbDt%c57~>K*N50Y@#YHBz#`q0<-O@N=IL{* zjo(q+o9Q`U$ekGeP}dZN660c7y|MVA=rXPdBgw77g(H>;eovp{p9+XxX+;ePD5pQj z)kYr76x~c-0=in72O4TNK9Hoc72-X~QvPq0p`%jRWCNtFzvN2^!|`FS1mrPLP+Jha zXTScHQRjGth$dkXp#X$U;hHwof8^24hv{XN&L3koZi9jnNEH+t_lWo1Q4S>HvTJNH$*lda0!eCARl+ zIo>_){^OIicO`$orVEADE;UW zN}X8N+&d1{D};lNTmGPX zqk<9KmK43*J2ZXFKxJN!8`z(@`gq)+8n{W4Hg-mPP_WS=uBp$@D6=j7_oIm%PEYG7 zbQfnxP2Lvjv@@hW5hnkm6?(zIih0T}qwGxUIo6u^&%SAZZ-_d;_N0anenx5rwu)F8 z_32BvVKwyd@{Q|4v(TJxy(p6>Qhe}b-jJhsB*xn=&_IgU;%yG=Hr3+0;!BvnF{JVO z(cV_5Y<`7xzMK&dmXr!ahk(Y*;^) zmPcX6355pn!L7MX^WWhB^;{IoBO7ojB<=|r)gmGKBXSp%cDGxK<*x)dH5=$9>S(`QrqluT-b?VKe?+w83li!TEN!HI+ zY49!qUOwG9X1tNdj}BYyS58U}xJiz=zKe`ppk36B0DO`8T;m^s8@M^jI?wcgzCMzY13*}#&hZ9-ac@D+sm|w`czUW@u1aHj z%pZKXT>hSr1PhqP%bQ?${h8$i=zMYe z+_`o_6khT@UnV_8HO>_e3tFl~4e8$B5vk_sL0v7LQua+v#_GWbr3UBJB%l1_5)wD3 z8a~bm!vn-;fNb2DaCJrht4FY44jAUj(5TTqw3X-gBTJ5hvzN7nZtk=FMLtp#G08xzUM~5K>jGTfL{_Nu49}0)2?R!6<*K7UOx3}d@3QJ2 zdj3Cr{oe{>io!3V0-Qz?YznBLiM^^|=9(0Imy(;>{FwkqeN_TATNunOe>ES2%LfE^| zKUGqn^5*gRm&-Q80{NDyn5TKL;E=c^r}-1x0hK2INaIe^G zn%97@9bD=$kEdV)Y^{J1-CRqy&jJ=lc5&y)2k(2H<4|Jq^ySWcx5G`~OHU4bGW^Y9 zb2Zr~3z)pSc}6pi6Em^@d9o#J;BdYUpzCJ%2u44>;Gl#`osU+d-Fxs{`_sXCvL$F! z5RGPGanrj3W8?UPnEwNze-vG=VraCsa=DC1fDY`OQn`S|pin=7fa^$}n31PbIg`{x znOC`ii*WH)4MEugk4A2ufCE@22xO#Lg zfNM{W2YY(+LoHG%*CG63zK5E-Y96o7&6qj{Uy4bNJw_G22F5@+FdT^zpZbZ~x~ZNH z#_D}TITqLWqsPG5#A{cDF<~^UDC)*wBw|wY&6H@MMXr4-emy$iX zaRmQK?NXyylOr(t@X;5t19`+9C53@aP5gQuZGplUemGa3h)Ma@qwU`(;RqtVKSo^} zp1NIH9gG>AK9?w$57rEF3T{E=0x32AjDiZFkr7A1L_Pb5{8Bw!;XPN(;B z$A2Us;hQTMs0`h--}u?WpJRZ8LV9CD+x}?hG%0{xW7G~I<{jx+tokZYhSt5lLLKs? zF3~?t1MsayJZFW%!r$kJU*J5(v}S6Qy}wiT?%Gd|{Z-=Z0@VW7DwRCdO_!e-s+HW4 z?hfO@?h43_X?C=*b-xPvdtVB7qA=C4$c=E|f2m60*9-R0C%iE07(18xO2V^?!v{VwXIZ`~4k^3) z`mUuTt(JM6tiz7#jW?QCQW5^fPcMRTJ%MBm^*P|jvA<;FNH&=B`76#6y9aJHA;(RO zlVx|RANv;CE}Jy_?xO+IGtoo3ci?1y1{W??ptj+e97K3KbCAp1;y@;Wn>Clpp)HI2 zib{TN_76Y!e^>jz83a1pg;)`OE_fPHnh_ZTyzSLRzbOSf&ekUZJ?L;>K(0iX6ZYh2 zxyaMz-)(*1CSQO!t5ArHLYuOo^X=-whqO#@g3bVU=?*iN%AdDU8L;4!d51=sQ0(DV z)x0X7NpWN;lNXgNz^KPS&B|r*`onzI$05OoA3XocvB6qO<{H|*S1AI*z)g_ZL7Tio z0rV`V3q8K$UBV|NE)_lalu*5`v`m@!TcO)_%iecrD0ft(@;f zWB5bTfiiT!Br24uH!hZeyQ+E8z&Y+mA0q1KNt~Fl!fqomqaxsP_c4@P2Y!&!x@1W& zhgJS-3?@e07pvD$YnG7k z#C#Zn&XCs_5}F5FOM}HtMd`#%h(Gy|2^AK6_0JX7zf0nO?zH|(aZAI?8E>)KdEF;4 zfN~A0I3TDQc6Qqll8ODqQ0aHx#3R$7x1M0xr0_+S?gnEL54>&}gFOn`C4|zLf*8ln z(qXPJFit9dR&QK_>TwZNER7ecw%EK`N@m{2+Fbok)b2W^%yb&=TknaPNz4XS6o7Gd zt1q+^&qNo(%3Wv|IKSQdVmPc_ahQOvVAc0$CXEU>dQzM8^B7JH90mR?=CgRU8v>sP|uWB(5n%$-00 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/fancy_table_purple.png b/icons/obj/smooth_structures/fancy_table_purple.png new file mode 100644 index 0000000000000000000000000000000000000000..fad1b80c9229af68951b12e31425420578c7ede8 GIT binary patch literal 2937 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 F`48dnRXhLy literal 3195 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 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/fancy_table_red.png.toml b/icons/obj/smooth_structures/fancy_table_red.png.toml new file mode 100644 index 000000000000..d3b99e80746e --- /dev/null +++ b/icons/obj/smooth_structures/fancy_table_red.png.toml @@ -0,0 +1,14 @@ +output_name = "fancy_table_red" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 32 +y = 34 + +[output_icon_size] +x = 32 +y = 34 + +[cut_pos] +x = 16 +y = 17 \ No newline at end of file diff --git a/icons/obj/smooth_structures/fancy_table_royalblack.dmi b/icons/obj/smooth_structures/fancy_table_royalblack.dmi index 064b7c1945efaa0afee73faa0e29096df1956358..b7f6f6e284db7bb52a3c063e6493bcb392adafc2 100644 GIT binary patch literal 5661 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 literal 3252 zcmai1c{tSV8va>E3}u_oDAQ2p(cJ@4~8_kF)_tofx2`@x66008VqnHXX? zZ9b=z@bhu%<5q?jISo0;%Es65=3N&bcW+KC>h@{mOoj1S*K`kts;jADiUxY&4llSHle{OWbyx8XwKoDayqR|#_ zJlxYD5u~v8{k^L^b=%^%0Db9&^GcvC+MN2H`595^wJuU*; z+lP$?L`N*|YY~wc!cn685yWI7LefYnewD6?P{sQ5v)xHJRr(t1YAo8(Wwd&QOT?GO zckS)R-vB_c5@o1w6_B%-`^j^}M1o2tK|FgCjznyY(L}Vyh>G$0W15Ju%81Bod@b-P zk(u+{@b40tWM>IJA64=8-)mreo$tlkL}v6(Df`aQj*=)xzY)$0@p&o~sdzN*BYyt! zrrsraBw4p|y_0@~{SfR_(s$UCrElS$UE&yT?Se$;tsLt80 z19>{3cC;*&q@qF36N~=rc0c=Tbv~e)jD~@weaCi2FYE4F%?2d#SB_$(Pbw%_4LUC7 z^fUb%LJdWST9k$P0V&VXAMD}H=IYkl96xVAq1gJFRIoWc(zEFk4&LFNmj!BL<#@f>q$ix<38wff_40_Rcp>$UfpBoxrx1R?nm2Ze1V?%!f>K+Lff zf#aDs-*PpSingsEU`RwHwl38jA^-!^T=LD_D8g9pTK~*@=GG!H8gYBWZt_IXLwP_Z z>&@xnXl@1XfB^pHrXmlR=}U1h*C*3-wFx96a=zZ%9-1`aq$K%`c9<$Z${aBUd)+x$ z6q+}ET}e^~ZTad$`=ywO`TCVmY2c5S6B;X8iY#NreG4nci}n|JW7O+qrB{bm(D-ro3)G?C^WskuNYWYyx>n2h7H#wDiJyvm%)MHj}bOeZy2 zdM(Zew$DBL{bneVxU#Sz*2I?U49+0?W^lC!>&aA2N>h4Bt`!-;4TlxZ0njN_1#~_V zz9PO^PHq_)fu&+((MzNKl~Q$IJimT?b%k?lYc+DV8v4R*PAr4-_7NddQ&Zl{JLd#c zFBSkPSGwazuV~f2<^ci%&KSa|03O=#3cw@dxQUQ)jVKJ*0s^vt#Imyb{UKgFQ6wrZ zA^Kj`tsP3@;l=^`!iQj=6X~ic#^HCC?xm|@AMN9|U%XkJo zZL|YbMoZVEdvBD)#1eaWxCcf?a(WHo3z0oc#kfKlp%wr*o7*jAA$vK3bXuro zOpladpscE&azlzd9=-C_u(`qxl!}Tm;1aX=uLR{r6q@4=A>c>9(?C*GD*z14wohC>lVlfO~v%FZ=h*E3y2d}6OI7B>l zyTAAgyMJBkZ+^=XxSx-CjaXEjb|2T!7H1@ zrVL7Db7)sg(Yu$6Q1rzNWBG?_=(TN*nTf4CcE2(Fq9+J2>PNCL--FmS(pVrI->H*0 zp&|QSf{}8heEz+k{g0pQo4YPjTTRInCp_n@jRzEr46#>tGSDgk`pkqrhE?JI}^oL2D)=_BZAS z91MXX3=`k6e*O%@Iua1u`s%H&L2dDIwtLxj+GDzVdG-$ivvLNfD5 zw144>V+e=V8;>&n@jfIMQPaevv@~4DG9E~slV#meymz;ttRiy2X5QJQ?8(y`(8Kn7 znA*z@W!wWTRg8Tp zoqbW_;Jt5?z3M!AFkzZsigI!W?-G*ka6A?% zWGqt{Q|$WqfIx*QC$v$2rq2I|#?l4Hi`#22K(l2CHWf(c~J5Q*Gq9NS4T69|D^i2S#z|BD$??e4VvSfxs* zZC>bxii0$|hLs`#7hX3V^;hGdF4i9wFnO2pXSK&|FX=)P^!Uw1@{^(tLKD2Ry-RTv z{>~^pv$i&#^oLHlaxmHtEI31cFy>>-A+u#)FVO*;g*FvyG^}h1Z(G15h&0NAG zV--PQbD5>fji+TO^0Z@$v+_7P4a}c7f-gApc@0HKFpDTHz7Y0Cn$q&BP7u=|yCg(Zj*hX05+wS0mUbW$tq;Mgin20F=M4FIo^q^zs^G@N{IcXZv< z@KCG5BR`14LiyDFz`sfOn@EDG{0E#6(JIdg6P}7OA@HIIddKoY{y5Gq!+>j=;7e@X zz1^!_tq77zAMajmHLr|#5+)c>NhX3$%Rh6++5f5E+p>?$+Jghu8y{|OlXGmjOsY75 z@9OG0c=9dhk+8VSVU_nvLO?!!wo!gqznC6qd98T5MX8g%GPfIjUGf92(*nl}tc0sx XctO88OIGK6LjaV~CBt$9r~Cf|SaKa$ diff --git a/icons/obj/smooth_structures/fancy_table_royalblack.png b/icons/obj/smooth_structures/fancy_table_royalblack.png new file mode 100644 index 0000000000000000000000000000000000000000..82913622d1ee64de196708ad3e39c13a725763ea GIT binary patch literal 2861 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 literal 3296 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 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/fancy_table_royalblue.png.toml b/icons/obj/smooth_structures/fancy_table_royalblue.png.toml new file mode 100644 index 000000000000..59987f0feb8b --- /dev/null +++ b/icons/obj/smooth_structures/fancy_table_royalblue.png.toml @@ -0,0 +1,14 @@ +output_name = "fancy_table_royalblue" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 32 +y = 34 + +[output_icon_size] +x = 32 +y = 34 + +[cut_pos] +x = 16 +y = 17 \ No newline at end of file diff --git a/icons/obj/smooth_structures/glass_table.dmi b/icons/obj/smooth_structures/glass_table.dmi index 112499f3801c278984d96772135e84865553c51f..56c43801832b4484a4dfa7fcbdf8bf3e21cd9eea 100644 GIT binary patch literal 5347 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 E3!s(ov;Y7A literal 2311 zcmZuzc{tQ<7oHhI^COHY%~)b4#!|{ima@#4M$O1lW3m%j3R#nom@G9&Mp6=?D7)<0 zYV5L8ZekA9sj=rwmey(1gAW%R`Y>V3=z6uRQY`@?t@U>W<=^2t$3LmRR%syibYdx$Ef+3 zBksD=-MYJcX|AG&6kohnJ>F04tO<===Bf$yqSA{A&(A}&*)0lu+U!$#JPS~k=~yxA zo*4kflA2&qBJX!I+hf7v0>?VOK9(NBSH4|Mt}f2e@Eo17V7pveA&F!Fm z?%7eP<7kXhJ<^++g+{_+u1weiP+#F!4jkK0HBW~Ez5Ka&MXGw#^)#KgopYVFkGn>z zuHFF+4u9f=F0;*7yeh3tma4rDrQIy>9W|lZ?WP}$9IyX4=82yLDm2uu{%oM!i&Y7a zOM%Up*H@?*bz0x3xk*+CZ&(l><`|c#K4`DL_&7RqvAZYDSP_8}#DHU(4mToP74*A_nEKj7i=@Zb-ZQb5FU{86PM&b)LF%=_+^FwNVV2w%rvcrY{tBx{I-p~8I- z26|T7J^(hey4$y^R_e#qqW411fNhakR8UcDlUj5Yk(;~q`-hvFuY&$jIF6OM!u78? znRjNIFQg)A`Zug*)SRdFQgmtA)(T*H>|MR4JxIcQa0qo34%2K}T=WUO<{Y^yEOgn^ z)7Vfi2fd+_u?J#ti%u7X!Ttu#u+-H3-{EDLjk@m-52T!PtX{n{6(W|Y9=9^SDC1>OeP~))DInF~>QUK!SC^w<-j%Ysi!V>a zi(xSpzfnysI%465(fHijaBEhkZh{mRvreA;jk+W92Jc9N+)2ard0y{yY9uuDZA;dyn1bhOO_IE24Z4ZxsP3+GuNFz=YxI#$)-rbvH`N@e)w4#bwde*lZLuz zjr!mw*`kD`xXbUkceBB&j49U+hm=s-qifvH&C>9~n^%QkC|3R-z6>CjYdZ|8ca+WjGVa*8*>=M-jE%>K2F-mw zRiJV%%X^JmM^b*RSkqy6!aB&CJa#>joKkG z48#uMtDz^UcuV}Byuvik@Y9~wSk6X7E?YU54?6FYgQe4nKKevwaOnbu+U2J?$c*YF&% zuhSjpowcAR-kQGR!Qr%oc&6~9=zO~Jke?>)Dm(i^8UcBhArc@!(H7;3v!&(XqeZtF!$SpkHBs z(AzHZ$wf)tz7@gRE7J~7HBh14@p1wCq+ZJr?Rc@BY4yg_- i-I};z`;u2|Jk+8*QD8_5W4isb0a5ggNrgoFuzvx}B^ssx diff --git a/icons/obj/smooth_structures/glass_table.png b/icons/obj/smooth_structures/glass_table.png new file mode 100644 index 0000000000000000000000000000000000000000..f61de10c5077d52df3668d50fd1111db4410113e GIT binary patch literal 4578 zcmc&&4Ny~87EVfQSgA(4<1)$^$`;q%wQF`)U9<$Fl^PK>wzSK3af#F2!m=n##R>t< zLu@N8ZLvSw46qWq)}?mGrY+r4Oz`0kA_j~Yt0HJ1kOazKe#jqrd2io6k0G>4TAZoV z%mn7$x%Zs&edpZooR?R(ZxhX#y=XRz#hR0}De)=#e+~V8ID8iU_n%mvgT zmF{eoEGkBOXFco|4)7^bDb0ZmR3zqcVeNTEosn1;`CkHg)s8$bA&#@%{-Z1_OX=wp z=8_S_XeQoJupB*&-H^6s%POgL(>%$Ba>t5>^uFP^$fj(WQ(HyF@K&g*hIo#rXlO?! zp&7*cwP`}xfdp3(gGOxgqnXtM-ai!RkOA-S>Qo-SmG%ZksaDc9Mpc5Hg9ufnexgfa zl;t{0*N9akgG8ou;1KU@UeT@HVouNd^@95!WR?L89N-iV{Dyn5tNOB!e$*cU0)^)! zq)%dpAg*XmyOZs5jJg42AaGla4ZC*bys)>R>BaKG6AF{?N`jcEs=sry+c01$rZxkG zaI8cyu^`=E8||B|Yz32w-tYoMEpMQMPgR0NQ4`u4rgkKlwR>or*yj)fLM^R{#M+WA zu5v2=e*^jNJt`nU2eZ*?fVGfZB$p_G8 zvyybj-I<^ndFk-c?%u5Wgrn4hn4<+hvmsX+&K>{cop`~>7q#|OjEH)4bBjjZud#5j z@gicHTkqm{*}o3ovCVsrW7bcgBElvh>ZxdGlc<`23Z^U&2`SQIIJNt4f6XgXjj0b& zo1&`Hh-8Q?fd6{51AWn%pB?XmP`4XCQ;nU1CEnkkjIVaSUR(ERL$f39&UqBSh%o!v z@$TN0bEcOqYMRQadbkW<36Wv1Oye3=5zQU1P_w~(C>|@HtkRmIYIj`jfnoOxGQlDX5NvS2#XaomeO`3EA4~tbwtOzvEuZfHcnBNXky9y|UyeS>cj%@^)q6_Rcuh?C`lvU}PIUWN(~U7; zD#Cd^4ByOVq)?M+KY)xKfKa4tl!!@@0}1gc$3vKumCIhfK@0-(<8T=*hYgSzR1M)_XK+wiW&{hOF88z`qvor_e?;(XLq)ptFZiWg?>6Oy znp5VwF%F(`jp|`y`Ol``f)DrU&r6-G#gvn_bRG*>C&iD8yW0uh6-eA`c z=T?t%x177Udh4}LLoL$}D$P#6vO_~`k63Y1o_qVN%_H&YU%$n_pb(PLvdYK~XwKb! zd1V@*Cv}}br)lh7cB{NFl3X_Ms_?voXjZ(&DQMS{Qv7mqx?M*^zz7h;lRXV9(x*{q zWTr=O8Z^QE#Bot%`G~9E`NgLWoq8UUi@+h>^uV*xi`9Ocp$r2mE;M|QH9veb z1Hcmh;s)NtCK(|*Ey@Ge0xLBGW{~hXT2Le}%knP%M2&;cb>YPloy0 z%6;?rp5OCZbP8K6`3U0yWit$VKKP$<0MWrxguOvRJY&L&B@(L=WPS#bYqiOz+ceg< z`Sv|I799~aV`uA)o`Q?#qFc4ZO|CV1Foui8QXPIyzdOqhcq$a`7;@>&{dL+8-aU(7 zn1b`&e03||y{}12oaeGFCWY-EL>j!xLZyEXH|ywd{RQ$TS*u*ShCDXY<92%_=Bzc~ zon5$2>!Wl~@0RMrVCoI92B{m2z1)m9|Yw2+TO3lD0pC&loGTfb#fG$qR7O&Wa zG=_)*{sP;4=Y{KHyCOs*5=7Fo5pn^#;uhN?F>CDvTCghmfm8VT;2XV5%d5wSh9Pu zPsob=?Y8hEXY>S)wlC9|YyINxQ#vQ8dWLE_$oFhleO_G~4f|TF_*|a;mc1(VP17r$ z!7<74^R_$k5hurJ7#TJm9xZ_8Bw)G9tZW zZ{DGI`(2xhW{^hWvmjT>uj;-Awusz!xNI_%Pa;OEkI@gIZ<=>D*7it+!UT&+(j=r- zzujbF#J{!OW-@r;cVOnP0Md6S@S;Cy0q)*$KQ3=1oLL;rvd*A%^Pa04E7h&BD>-jM zkaz!X98Uc77Eh-y0woj>U=ZHo;a7KTgZFRdF)_{A0qfj zZBPw6D^TD)-gR5Ha(lE>7Y&}9ok;D3`R$Q$0<@p`pDS1S7VEtQp*(;3h156s*gv8=$sS*S zoTom4qgSBPY_clKdJ2Nf1aD=9S!8ESTW|XY+s~lb2^@qt$?NQGE#XIPnR$5$<|Bcx z!Hxb+%A}wEm}ATGArH1rVwvq=O4TXl zXgCpG?j*C($b@(g2P686%$M>jgbU`>Md36VTri7gp)>MLgyWs_(q~nMTQ^8pXp)OCC z?Q%xlsJ6bGC=7!_U1t26+fqbBJ6MdIe(ahXrSnJZGq2S$z~JpbtZLlE zO^b6(7=3wQ5Ph%W`x??6o0ttBh5#jnmyd@0Pd>7aJgGx1v2kRcD`YWmX}|F8XyA9~4f z&I-CfzT$QEKmM_T{WvDo*|p9D{OH5x=Z?+0orisE7C&1oCODK{_Ap@rd`XZQTGwdu z`g6T!boF;lUes$V)T#kbUBg|UHH3fM{2U%|by{AH^7`A}xd2MKgxhfG9w$CLR z>fs6l)9CyLq|8MHjwT}WV%6V44SF-BAhmWvrXTCrI5``&c&JH2;6pNVwaWRi085lS zVhN?|M$|h+^xMC`r=OdKP~VN#!9SyUmFbtr_q~?w-QD>79LAwgEZEJ$q+3Kf=!et~f*QueI8*<8Nky5K}u9xU5$3D~s2!upA``=0sGKtc? z4>eFr3)=pzI1p=6E~j7Q(`(}?Cz(YceseGdn@*xA#Q=Nyr#QtHt9^RwUJnv9B`r3m z)pUzq{)PKL8`z+$@1BKmgsYBl^&RUWm~Hsx6O>mswH56)w~I<2ESTy-O$I#gJu^qs z06(TM$3rGTV^d4=Bcljftv)a32N?7K^t(ZVv-?kIs};$1gt|vlS;SJew=NM)%msP6 zou5Q^lnPFH)J~u&FB_BC+4Pi#5^a`;u4-+xgFe1eR~$y{#wRG0+zB}zmNPX#gKNFZ zVVKPwLM_VUta1~rg7ftWiM^9t23uJ9P`;|pr~M(z1t5-8%=^iUN3^ZtbDuFctUo%P zir2+unJoW{c9rwhRYdgiP^U#>v$?kq90?y{lFt38sGs8azQ%|pZflQ%g*!|7Pz0dI&dUg%CVZ5RoP^^*BQpjU^5y%SxoPW@<1*=MHTjZU zjT#I-3ScU}2Kz6Kp@P0HdXPxqrN?#j$V(!tY-N{FoGJ-)ssI9lem;qOr>LPqa#`ex zi@S8(VeJL{C*Q;=HEv^m3FmL`zm|@7)fjsZnF{OnzsFXdWoc5@`{w;B+ki--40SSh zRHaRmK%v*qh_?&WA61pFb7Q6x$!@AtaA^|6GV%gmBG2?6%$;UV$!*BZSsB{`+r0|=DDW5z;IYMF!c}rx%~g*y?*|UpVut+##yRtj2)V4>bqfsh$p<~V zl2F#DYO7p_7e=3$6ql*BH{%hY6}AGda{9Wg_}tq7!HNh+YVk??6-(ORDG>^YR}MtT z<$PQCSkY-Fu0m)uS%+71_0-o^JD0-AN9wJ!sNdfS7T^*a>9RChq6!6Hn@7UGQ5kRt z+dk04T(NxQg>of+1EnG$AGw~V9&WeXS8>IsMO+_9tLt7Zn0agOY5&O?R%BR55~kJ{m#yn;76X?A zMCOE+xJd#j`tZBQ4y7as8q+xENe|P>b5RM5pb?i@OAGRq4sma>#ev#Ap+CzX-$jDL zusniH2Q{xByVJr%?$?_57u%wQK$As8S-}3<6D!JzVd&%FVAqVt0Gcqu^zjw;F!;%)bBNC`>FOzLQ!S7d@8v@1|kCMSG*! z0W}?T?TJ$T#j>P3^H7WnpkG9n>Q*0GdSc?{=Yg8I$e0dchzSPTia5N|^KS^tQ)dL7 zMkAm!XY%#doa7LIdq_@~>zK~zV5iU3>0#5Rv(q8jmGTb1&l5B3e8cVefh~dcNmYPz zNEt;M35d&#U+t8^;qaqScU3k0K)%W-tgH@q8KrZ-ZLxPtbhna!ZWDK29iv`isj7~F zUEt1L<|eY2_X~rEapw?ol?wbb$=NoZr0i&2g$(Ym{;h2nBgz6KsIpJ;CadP>lQxyVGUBYGIC`Rz|f&4*Fr{|s$T zW5)Ht5SbLvF?p?-vQ88MI9q}*rGqU+Jum-c5!(J4dk=5vKdb-udj{iiv)TzWB0xkG zA4d#IvN|5MWesYqf*|Ov$taCLpo5E)?&toHvP2Hw(Q&?-qjUwS_}|01sANV68FuH> zEgsY6Dbw0-NG0JN1*#o__U01C&|}IM%Q^^3@P7ro+q_#CzkNO0f@9hyW0eFAR~%_c zjqu@9zxYMA@!m@pUe3oJjxdc_h&GzT5VN9g0l$CVTaa3{!1S+`9jsSbdVL1f&qnvx zn~l&pV~3#%nxnLyvp7g&Z&J^{2#K7Pr=DHZC=aTMehE?iQndolnEb2{c4r#GA8}Yu z6tde}ZFo%EwGt^ykvaHS`K*nG^>_rd>%iD#b2-*K;`ed(D$=IhG(<=L-vw7{-#?={J-Dj?FIN%9;7o1%)^17Xk< zbEU`tmb;7HYLW&2bn|3L@4HF!<~zdUg1zVZ3X~bd>FntvD12_f8Pi>Ts7Ug=0N$4E zN}94bZAV7lk>mh~v_OsxgU5WcO(o-XBeTQn@3FYI8r|^wWDCoQ5aH)NE7+}`!H`l3 zB}1AB-h9(k!mpvRPS@Gu42}IBER$sfA9%hP+N`GG@7Z^}3wlHK-DltL!_8oSsgEy> zjtbUs*#Cj6fOEe+_sZ+Q*ch_)lJc%q%5mXG3m-jaI)Zf{gZoeVEv0jF_0yS;LSg6u!vvBpYo9%@uNK1=hMhvu3CTq>Gu36m< z3%pGrF>nC{?9J_eGNUAQS|~)>9Hssru1I2m%!ADTn>0N1v!Pyg?fGC67B^qUbE+g- zv%KFbY#HZpEu2=-#y+YokDz=T6h$OZwpb`LGHV#TtE}(`7U!>538^$JiuNM7m=GnV zsyR9j?^U9~a{|Jy>9m3j0bC)0)gS6x`8te93#8Twt77@wE|sDp+py z@>oH$?iz_=TAxqweBcZE`(vVfgCM(D%jVZqH}-*_54Pv~?$6{=D8Nf?4bP zmL{eOYfUu}z&d=44ARx9-Ywvwi((c?rmf9}0ew5h@B3M%dk4Z9a`QoPm@=2Y&JyOF zP{SMR6>P(*l4bFX*~EB6ak9_S8+lT_qieEedo6E9IPy}ePO)Im{=<#NE(!Sr;6awNK_IOrHdXFpI%h2Y7|5=Us zj;#71hdc7w_|0H3B*~?Gp~m|@!|rH1f>>ep42QmZs-8`01&0D&g2NE=&MM!xMav-4 zQh0XU{Cyo|E{z=`_f9JHaBd1DeOJ&K#jo_zO?Qf39>NLNT821(-t4Iit&isZ_b0~h z>v7)7t=*VYmv4_mKI9&Dc}Z(LK{AbRAwvZHg6Md+`EOjr@@yps`bBN@ls4+R`PoJs9JFdLz#87eGqZ9J9asJ;$&tRg{d~Xm#K(1po@EboYIJpk zqWC|wG)&(EQjDcP!WpFXQKRV{&gPj>DrWH#bgo(EW)n*xSYx~05H6Tazyy!VCCQJ# zG0vvP`kznh+HOxJ=-Fm%6;9oq&C%dW+>9XUrK=!a`JWcFb^)O#B@Wnrp=}04Z=GPo z>45VBMKf^L46ICDb~;fsq{pQD2-j2w-=#b_gy%wuM?~73LN_P{vZqP?z!1CJ_Oi`Z z^3N`#Wo^*7_BFe2Wi`dgxt+A0%=bAb89X=*oWXn} z)Wy0-rM+!em90-O;LEby-Ie*tfDa{1l-l|C2J3EM&X@Lg6hj_4qcRy~=x%d@d}i7R z9(o+IDUpttL$)3_PuroJ7XU77OEY(#YXR_)ed>)6f%(ti)!etap3)tVUeg2b=j$)X zo8*%yJku(0FBSMiMoryK=Y>VClZy+NvsiW<=PkNk+ngCo36k~(s^yKzzd8G?%Bo}r zS`%-S;2fh=jSpiivn5+*GKd#5vg#H6a+qRD+BXa08=a_*N-!OFyndFKH8j&G;=RdU zgxSlX^zk(~l*qLl@+S_$<7agM>7o6*u{`S*!5_~S6lT~i&+&{zcK){|B zt$DE#Y5{uu6R*Sj;#5TiT|Z;1Z-oM6*R!Hn#1=m-b;T>Yv4(1K=`jmlLzCwPg_+m?s_ zfe&+Ii8uir6M{&vMj(U{t9_$Xk3^|$IgCA>?MXJ0oV!11yJu0YRo49ohO%JF9ARFV zT&&z#JqGuGN#8RxUQyq%!lavMiazI8E8}w(9y(sJxhJo#^rK!bTqt}``$iwdPwkvW zw}HrN;aqmf3A+s!KmB?{Q2P~=wLp>p@YB&*!fYoVv0QC{v4-<>SfmfUXm|qL@PiR_ zt#1n?gF7*_(kW0yl83=Bn?2FFD{ea6hT;VSKo}(A#M{^A-5Tx7e|e7G69Tj3(_igF z8iqulV{r3De;N#~BqBt^V*RL^AoTswyy)@0JbA z!+e<7h41lDc}cZp-sxu_UbWH_y3aC_K5QnUE4b`xC18VRdKu5V1sF0BLh+Uh+Ib|~ z65_Zr9}=%$e_Y|9raI5gG$!6;d`1KQ5)$6mG`UVg((Lib;hE=Z+}Axte=c+_+Mu%j z!@}n-y)3?_yZ()wsEc@8Zoan`oUxdBwBUZ{h2-qn%cfW zUvdCc39iRZ&F|hf5$(hAf(tEBt}qLn2OSc%8n?(!fS6_P>18k`Tx#bI&o}jB{mQ?Y zEL#dk9yHz;XNjF0fWLl6u08v6FzCH$7I$VT&ZpJfZ6nd0-=K+|=c1FS_r?Z-g04E5 zD!HU1wt(pk$T3?O_8br)Pyp}qDDtbSkt9c*uL)kwU%DrRVQ}}pKYtDeW=w-J7AkB) zi-Dq#obOt3HFphsnF>z~u>qw>m{I`z{jhfkjBK4;LA3f+(o&&{&O7n6Pt5=QI(Q1C z+yn{;W9+c*wV0{hnRv|I`mtK)hQRoaAKhwsy~%T|OWt{i)*T*ZD+hAR_8bGf*()c6 ze*4Rr_e20tNcu0J~20)O(Tfz5JpzVAuEh<@- z-#2Ec1n4CKRtBxZH}rC60OQRuw;q|CWAkS zRbB_J)YwD7A_L6&Ujf_S=zq^fUQuJw>#fsPD;%2~)qzHzZS%yf<(oYsyxPjQzjf#Y zLklV0jpklp9s4R<6jybdo?^vNdQ=IF5E4v|2wIQwD^`S$>@#)>bDi-oXDr21mr9Zr zWdAGmR}xC+1S^E_dbqeZJMpWDMyg}OsZy~4JAZ3yO_13Dd0V6rn={@0?hM&wGh_CMXzO< zUV%YhZLkrf|DHS3^>LHd9oPRIJd&*^$N<<|7s?8?YG>9;H5BUn8e~}`R}F;-{=ljY z0*E}M<&b`z{-1o7E+jTL+Fg&J1=co&%ikor4$jN09Q0bk^tRHMK|hN{dqGdmbUR9( z4c)l^$&;*!<@hhCh_XO6a=fHX_`W^Kx-tAq%$8F4<<_|qBH|!#jehFDyd^s)uI5wl zxtkj0#4?9~BqB`=R{M%s>V^lc?7oS9xjjBIgSG?#1$f>@cQ>4tHwV4@-u&t4MikMB z$T%QHoD6D^;HgUF_#-wEtI-udfX+i_^8#O}&QgTCo-z;kyOd`(@5|yia~wmi8=Jdg zR(3jC$*k-pmB|T^O@d#F-Le`Ro4}+feyDf9N#y0z+CP*WXKA9&K8c{bpBs$f%`npU z8%q)=!9Y~je+bQQAtN>i9iHsc06Fo+CJJ9!xR$k$$Gfceh&JXPjp)wtD>`C3x9a(; zCL6>m-1B7dmb8kVO^R67wUm2s z3f)8XKpaIa7y{ITQOXl>QSigv64Fa59MwC6i)gJC$nnps6ocH&*>dE< z+(NNeCN*lo9&CrG67sa`<3A@X`=j+QL6dj_Ouuq0^c4venBwfQQeuN_Q~8UbJVlqx z^x*3WvvM1{q$VYM%HoEHKaA3nWsoo!ex@55kpq_S@Pzn={w(F%t_`%4$C1{jWc%9? z9BlCTq+VxX3py^K))!BK>YZ*(K0AgYY{iv>_bncx6~mvh;v9DUdTRA6$_Wcbtw$L1 zXv0TnGe5UKkEPOU!Yf0Rx#SZ+StonRYjtqsR~<)7fTtEA2#_*}a5rP}DDv+lMhKDg zzvih?)vp|Li?kTNjt=$lC@YVqG8(RFmG)MVSDWSL4@Z~}`HWm8q3E6+i=&&3`->2S z-5MJ`NA-j|e{>O*smr!F&C8swJ|9=N7V?x1z zMu*3BH9R8%&RVL=TR(0p65|(CdjwtZ#5(4DJ1H-v$3__Qt*>8MqFTFT8SbgmEyxT~ z9zQg3IbAUQ(bsKN_Mn@~pUu{Mu)-nFH zrVT@dY{>eV>wVONGo8bDAA{i^(S}&dhi`YR894}9O|#e9Y1X9{9OW^tv`T7p^G?`) zC!!})RNW$`PoCg;cRr!6%DrXFLu+pgGRjoz?)mm*%V{ar|Jl!pQ*Hb#NM6r@aeb6O z49ZVdCGs3&9f9?|m6dwCgSK4D3*Qm_DzS-KK48p7sy#=}=GBVqGPXvmuyq*!M#UK=ko1f??zkL^)^OVgQB*=SWuyk!}RPGX{ z=ur4xR$<+>nceY?oXu1XPy zhYD)E&PpB;G9F4oeZ#bl2&myrx(hYOJuHqT%u34t)n9tRHC|#S^qV`d=+5qmR3DRm z$MnY$;0VOuI=>E%Qoj+9shx8Ao6${wqalA+{1@AI2fI%lG?n_PQ7?lms0)nKX)~AB zasEte#!Cwg391$}3E7MFmZ@9C3`ZN@&?qV6*E4p7HaaM1vfMazXxU}E|2NB9G%U2Y z@>8s9vMbIQ2LX5mx1`tXreEWs?(+N?JwvRw#~sX-dJ6wBvzWexh+3IcSMf; z{|UQx%=8Z=EQSpfKMKtT?5+WOmQY1-l}Ck#$Yqv(@uukedPFiFnYzvG!EkW){e1 z%Oi1i3JpPK8LW$o76I1fk4b^VYnG;Dd3Thi90L`lNG|pN zCGrYmxV+tvkt;r#w{9y3;dy8FVq;}=7{ni)t5Q@r%q#3b0tbWGrS88~@#3e$%Zn1} z`jI+(@S2Gu4D8wU3%voX<~#<2Snf7uU!+mr73X2%gR%PWtT&NdX7`@Q-M-RaOBtCfReQ9LyZqQt3ECRs~zWRzd?WgtqC4$P-rfIm`_BPK-LwIju}nt zU=MckCecQJCR``+1W+7G%B$YU)|M6uk9)hC$4^spaJl3AKGd z*TRsnvT>h)gGo(S9Bn_--Gr~Ku5kBHd0{B}1A$_H@rbU&@nop-$BkrG3<6bnxt3!( zUY#cne1~)-<^m^XFYd8gRF(sU0^x%&H~kB-wS%2VbumF=tjlBMy-PzVCZlA@q~1Y2 zoRAY@)Q{%xLvghC(%P$$kFfNs8)xuQ3NkM4IusRA{iBeZRN(Kk=qM`x=4j(i;xBn; z8jI4{fF?ex17H-5q|(KaK`OZLbLN;|NZ`On46*{!H4d`$yThx?-k*gG1s2_0z_MRl ziiCUgy_>AoENs!LPyR>SvcxVQ=6tVrRlx=@R;%C5 zq{?%~riA+Ic*RxwROmHXv{&Yn?_Kc{2ebG5 zZPBHMH}iRXaE{piJSea1sloM4y}FUrZu3R&xN&keN`Tb&gG&rV+%u>RbDeap5&&td zBbvPCVEzj_v#*16rQH}zF4d$doEa7Wz2YY=-W89$F~FPYGoe@Q`q0%)x)sZKej&b1 zk9EKN8As-6{KAcDA&zmJd<`pS_6KgMKvf;}QV+qXpKQBw_c;3@)}H|AFbh4RrdB{2 zY^}r}?}jAiniJBV2HLPWx8y{Cl;7y~CeH_WFB25S$>>Mtk2WKdDYwh(8W;&wUOsqa zFn7}z#h1as9)_945c9_GPXdE;kkC#mjxB-s|=7VTqrLQ)>N&kMIQx{l<$;4d%Ka3|?uMGBYiu0pO?+v55{{Ne3U>;=q_~uOB))3_k zKQ=$?oQIyP@DCe)-elr4$;pA%1ifD*JnpD_BoDIZoZs{rEOaKmKt*#9c2q;)Q2fc6 zpX&jxcQZcQN@B$_VsHs;$k91~UI$yV8TGZE;-u==s}H8uo+0T}{=p5nG8_f7TB+a^ z;#|J^bUH$IPt$o|=98WmrN^N)u~1jH+F9>o{StoF(wO~iF%u1)GSTR`C%&_ z$^DPDhrjcY&wTy*H?|O{l17gK=zw(*&2a189BNG41#lVPb}89lG#DxhYT3M#n-x}3 zyt)3#;aoB2?&QZzPY>`o<^~ObvUt6fB?_(=L!q&PBwubT%h*{9w`L@r6qda6?OOIH z;hxxl+KXy$VUWnzBY`r`d|KU!fPq=inSsqC8a`i@aCe>Sd6<>Z0EmUS>>wxpiRMmD zO%?{%`XEQ~$B>49{;j}9?rA?$!f@|NoO*2wsQm#_C=9Ik1b4PmI2(1j?ggY9X0JNS z^Or~Gh5uM;IgGHF7+s?J9d|lTo-I`Kq@xea&d>f&2GEHD~Ry8#@5^qmwE_%m^%?JKGv;yb;+x=S$EX;sf2xMPT; z(QzA)nLE7K(6)YaE^!Xfxvy zcKK!@{x175(oKk~A;ibHtY9xN{8qXTfW$f3z!*W5^0_`<{E$cM3I``>ejA*uUh~;M zF&B>1y*OCQ+xaX)&k2rdOw7$eS4W#arzyXfz4=Igkb@9RH}uhXYxzaTj=2C2+`ub& zcSToSA!!QrI@rQqV@R5$D8pB@`wFwu(g1t5QW`cst0S9st1mIVPqoeXmVXdn0`u)S zj(}rPHXdl0FayK^>t4DCh_vS+McOgi@z?fEZUt{Y-iXXr*Sf-6Bm#Vhlz4|OWDp32 z+!NWGz^dOUo!jE~YM`riIi}0D-xKLNSAKeolQXjYnC;M>nU|UUtyIzy-#*<_Lh(H& zc3@7>OEngu=SJj>ES)WPe49> zrUiF&3;i+@+NP?6XtudW`@9+#B635*uy-3d1M#z%Jsw>2z|`{s*NZS;wmW{nzMdN)&81W&=s9b8iEarV)Ee!A~V z&iIa1;e90Zgo3oBjk1i4EcTJHt7m~`&1;Vc3*pCAu30c0Auw~bqg3v*=xyQ1zT{cdcMspU zS0su@>C-{sVaj{JqxK1r_^@z5jmATZXAB@`4w z=wmPGz^*4g3D1nwz5ekCQcEtosX|X45s+NP$P!0FRE(~OK-(phTN68qsfOq4s}hRp zxzH5;O4VO<&xipYKt;}SHgZ_MHX((`klBZh z$)j9cRhHb~wD&XRgqq$uO{20+73rW#A)6+girs@ygkZT`n`7Uv#xU z9q(#v#`cTbrRjZZj59dD+gFgmAR4DdUk*=HZ2*vO=(G*0l2hAKs<$BSp184^*NT<) zLGnch3-K5XeKp!^>bxEo5{eSK%{t(Ii6s0W(l`b(Cqa*%wV*eb&}A<6nIfk-*I`|; zLFQ*HJ16+PDj3|A!<_2h7^FC65DAZ3^gwdQJPo2P?%~Bd{FT)0GUk$WLiyORI|*|w z#(1B8u5lt*u;tgzXVn=j@x2=UBCNU7pxn6cFW=&nE3=WoN_`f3N`1lXuh9 zp13%yJqoy=l!p#SEKrbY+RO{o&aH$5+J8|{_2Y8zWQDh^E1EXOo71R2)8)gdT?_e? z-L_a56nJf159x3kgA>TxJrQVb?eQMA;LGrNnjTY666}f;1Wqf~dkZKKGI6i*tj4yg zoOu>1_zq$p??AWn=hx<%qKyeS5!c}op>pq>$OFxU+uw!8EYHiDroG5a883nbZ&!HM)cn}_@E46QfI@o|jmnkL^ zpdLPZ71uTMHFGhf>)rZ7XxpjG=3X0H!@mPmPBu2LZeN@~$$-;5dSzbkH;64+!0BRw zE*dL@8azOm=U_8{Gsfa_h|!U4sU}GGe~eed63Be!ZqoxDe-&SHsefb~`&qgQ&tq(; zBOi?iK3h9g`FVGSY*6}e9|-;%wFyEVu=T`&E~YZ7qkAdqCQAnr?niDYlSO{XhjbO) z-U|XwKuo}=knTe^!A!?)>@__H($u~(j=Lds~}S6pQ}HJD_bD(}g|%Ol3|fRYdkKgrtr^2yTOmJ-x!g0j9dTGBhN_gP zp6RkIlb9vfVles?V7Q=AeSZ=cUGGHqJNrCZUU_QfS7UIti^_?^dOmDI@f-_Pr8M3b zlpaca#p^DfCiCR3z1>6U7_EFsqaBKDrTk0`3h?au%${y%Bo&`y)mGI{t*B$xSzE0%x)-{GF8H%}gWWIDDnTK)ds&fH(;-A)TN zA%9(A@#m;Zklg0k$uTZgYA5I4{z$m}U&DoGC#kz$;rdO6jO+YIFe>OYum?Ll9-#Om z6t++QA)87!lJY(F*9ngPbkqqCmf+1lk=rk3B2o%L4naE=Qi`-gsdBc|HiiDi}SM8TIHuI@K}9^STrAg3_Zg)<@I}(b+fL1 zSqV?~?=h9W!<;UB*;E|QE$2^VRJAKWlr%3Q;$iV&?7>rY<1u6t8xR`$^fz`53|IkI zQ;8z5iHKnC!b97vNv{U~^`-U|2q<;s3RhDL=I=t*aL?e7kM>AtgmNe3AIkUNgddy~ zUrby{uJeDIejYV0Lb~I=)Xx+%@Z*=;jV$OtNA;L?1u1}_WKIya1FT*j*ZI``4-VF&o4#pR$0YUwM#=(#rvAb5~d~= z32Yb@aL6f2ei8xfb8b$wb6>35Lg||Jr@Wsh#&utOb5R32=m`?B zm2m*o5)yg2_mf2k=f=t4u*Qmy=PRR%pc3fB{_3Y44i7Kr>0KKbK)qA%ax42{!Wc+D z3!9SXztERp+OVQMCrKK-6VF~=y~>*K>TuK_0QQdmlYn#{uAA)K&Al)Mz*xrkF`H+- zJb&M!^Fw=iODaZNoWEt1euZNb4o);!p>v}z4S7HOL<(X~FY&JS7ADY#_^*%`&T4eX zaCn?rR zOpz#tt0Q1Y@wfaS{CYoIA}5yGyyCcp0{a&!2w1(E_MZJ?*<>#W_E*}G|In?9O@%C9 zW)U6>EXD5(^khQ&8HJ9if_lrpsI;v<_>cItM~AJ}TJ_6}YW+1VP4>#@9z zJxhN@OeF_7wSZLzcG>5c@c?UP>cWEgy$PrUr7O*KHi~ROu;rNA-}ha7U#x8>#>Uid zeQ~?psKHOsXPwdi=9YMY00a(r<{W>(+6>U-xvKu64s$kWo+7?3q*sQcKElJpG+wv# zM;B{HcBSN=LJ^O0@hv7X*xaNh`e5aO+C2Fje&wfYpmE>lG=t2C)z+^wJP7%`BVTMa zXyrRF<28WWP31sDBCDrF)Rjmn!bfX-mv5gx^NlK`oNPi8$&$e)7W!9t8c`i@KJy?- ztXX3mWS)quPh2b>H(P!~Rdk^^X+#CR9^bj#>=6oB`*#t|Ewqn!6zh;8iTm|Qch1u7 zdfd+&d3Y{BgMLzkaN->Knp1;dQt_d%igNq8%gD%pm+ypWI8+)l$(pvxBp*H)s<}-n zFF!eyN44Sg6Ujfy+R}Mv`^EO^=k(d{wJyJot640#4YHo?UvG}ylYp$$Y)DPmavTSk zOM1J%m&i58`wGN+8lCme$WDYa?gc@xDa0AifX9xbZdkEkcxMvlfwcc!+rh~of{?jU zR1t0G&dI%IpHn}Es%$zH>#4%xOpP14BODp1#mn-2jJ-@fPCjQdQfSsHjzq$R$k+7I z`bM)N=;BbUU{q!|yu)JnYV4xNq)*zdc^~@brNBS8(!&pJL_W8ZAY&e|KWQjDSzuhQ zMPuOfgU`V&p;+vsK3d$QfeLGnfV>mlq-!$RQ6V+;WOc|~jEo40-kct7rag%dBaPxo zJCI0e@Ox5=IvUEi{P=g(Ki7~3>+aNd`~{GqZ}%88(~H$+FZ*j3`aPy<13zHnlWf4d zi7DLr^=BvHz2R!Nc!DUmF!%t2&9`$&#E#!%6sQu{^Q|0yR)0f2d*+uy-PvcgZ5lAG z-sqxc5cgPGVt2gD-+VvUlxt)4vFg41KSF3el%0#S)!%IpVd(btsfjgGG!qLZAM#*G<{0OBQ7UE`DDs66 zo!@z9tl2T?Pwh@l9}G9yFa~v~zFW$8BEV}-lbpmKGRLW%k8H2WV=Fhc$WWkLJO9Fi z2|I%W2eyZDzXUFoN4~8Nqs~{AzVQxe#bstT+)Acsi`R~S9T6TK+49TvzTiX zFo!K;Fj)O?J(9UZR-u@X5d-?jU;4BnV2@te%Q*s%4L_TkLsMez#7Vli@G*u&csui|N=A+^1R z0AgT2r)J_kJXYTV@(W{%&L9~X?~ZB@r`+9`#ZhG%p3)vhj$0oclEi*ZQY-R+nW|b) zerNkG`7&yQ)yBdb_Kz_y&LCk#PI*F^KNEQ9D`nj_e}E^VBp>)e4AHO6;BqIXk?YH- zP)nlX)oP4h%?WNL|=WrPp_w}kclU9tiUPG9}b-vG3Kzq&4Rnl z!U4EDX2RR(YE>3%=jmVr_>}p}mY*ez@Gifnee87P4h0pPm6ZB1^^63HE79i506#o( zDd75e_i$5*{_Fwju`-cYc)rw`j&K?9p@w(vK-b%`7Nol^(~jsd&E|2e(TaS7J*2kAkBeS|WQba$}m@kzDV{ z?hH=`Q5-RaP|>45=zU9hZR6u?oIBFiURYQnQ!XS8@-|c)RlB2qQWpm4HAIgvV7{l! zQased5R)D&tG|8@JA5$fkWH^2@$&$o<{hW_?ZNFOO)YDmqU0C(khsf5Ye!gDEi+nu zQc-C#5oyXZI62|M+*Nt{uT0X?nw_=sP-NPfhQs58yNj#vH)m7|HLBB@h_$}w7gdu; z36G`Nnp+K+5QQ{>#Dvz4l^MPNveq#`tLJqd@n+e!JuO(7Lz=&G|`@uI1-* z?n=o$0}IEnPYyJ94SziLfY1M&$|7~AW?tN^#6U740%K@)=E?&1=t4I#Lf}IG-#-<+ z=lmzEhTyL~?(5J4aWE;B@(vwST~nQ^Wm=q~_g5B1d5B(1;rnX^#!AJ?%JXIhY{QF> z#|_D>#vkjf7!(N}km}A+r9TuwO%cBnnh7VG?5Ko@RJ?rC{u-RO+GZ?G68>;UAvlv* zS%UaR9?`^eXgVx7z36$b5!C(Bz$ZyZ*~+0Kxppo9`HmA2O`ylC3h1?(0^ZRi>@7*O z0W6-&n&rladN{=(eO%pkWJ>YIsokCl(<`Ap=crdWM{NJ2B5Gwj|KL%Cx*_3La^;|b ziwQ-mv^d5Eu204f!{#eCr-3BR8ERX}K}Tdx`Pi0|@O7aL{wCZ-S;GXJ_JD;4%MWv7 zVSM68R{Bg#%^VF=yPgEZo6g{wugh>lYq^nui-fimE90nyWjJkR_yrfvC&HX@LfEAkvm3o* zT)u@1I~=s$(~4@a4xW;a-7Ph7v2_hun9XkB{w^c`Gp&Md`0e#|dh*(5XX>Vl@FOYY zBX*KrSVc@YnU6OOVO^`}gO42{5kW5I`{j_EEMS;?=W5gT=f8hF3|GNpgnTLB>ec1a9pK57=R{*VhRI}QFet}|c?)>bvJ0fa&YIty z&*8NV*X1W&It0*&zFFDxcsfv9Ck)fY?>Cx+qR*VKzRlh*rU;s@2;G|j@A#43u}_8M zJ_-oBA#A{GEh}PO5&xw~iubKg@!^0U8#y;WbD*v`FVJ_SsSp1yTmBsI#50p6*81o^ zAlr_{A;W<&l0x#SjEloX)OT0I3=oldKnofz5>GW%4B8QVJoHuS_@Uj2_9zZqi%p^#Y<$Ztfjs%!H z{|NKwte`C8o{mt*K3mS2d;5q3<|Lu_Utvn)t{;%{O$lY^o7bQx^Nc+<*&!;e)>Awy ztkHt&$BClk$(8TS7YH`JUIPa_h;wFXrsuss4K&USr#(*50GV})YPT-SK*+#jI%8Uk zE)>v<~RorZEKQf| z8HXF|6TFJBWDDURdiM=jh+{Nf(<}&XpO^DP^S)G(uF>s03`Gwd>m!21hJsI}HtqU% zZvuQ+w}39XXg!4SZ{|?pe+SOrux!u4+e`OOMUe%Op`ufN1la)|*H__*FI*GqGC=MR ziA=3|!o)uKvl|osATIgCh_@bfU5_c(t_jiB0v%`ZqT+W>;o~5SnY%OLOz?8J6Sw<4 zGmdPZQk{FHwgaqI#j;#6EqvNV<9T9`Kc=CLO>6rMHD`bp5pRq$Gg@`Rb_eJzd2?av z!jyLgSiBy5uY$dUWBtl)yT?K6#ydd%=l?I@8D<=0#{9p}xlA21A{1aJI)_rh=&#IfEl_nal}^{Kv>tv!t$YGf+XGa*=4Rtzhhf3GAS zXYo@pc%VZrpBa|-Ecd?1gPyH=nHvmi0KPRtztChVMp+?s>WlYWC?2&$nkO@$s%+x= zCmJ$XA%vyq(C6PK|N9nFov4@R6R{P$e2xEHU{jKjGKMN!V z(l(1)0aI6|;gTxKN)E$R!b?B+;OQ^m2gt2W0B((65kBRz9d%2u8yLoTAPvH*0cIo@ zTVunr6AfjYc8|eP0d0!+9OKctnl|SdXL)(WgtIB^{{krk*8C}xy%_U$egA;5_^ZO1 z2B7O1ZFFn|9sYFq+YZxYM(8qTai!(B#vMRxf7s~@fM3f5j$--!yI=i_TYmpX?s>%Tl_~41199wrZEXF= z;%__5fVte4!e%l~si+2wjIy>o?9n2|^Kp!6a^1{jXI#y1LQevJDEz3SSa0P%`R+ca z_(Mt#jmIqz3=S#rxBV#E3{P%&ro5MJjIWhV(dj;qYBV{MVYb5=P{v~=*ip|K2U?J` zpfUKX!qs_*lg7dhzm)r@+r0RE;s+G7n=3bde{nh+9EuqzHU1XEG`9@^rCH1!s-Nvv z!s4Bc{;Buu52L)Qm^s5SEtDo2Pfz2mPawX&W~eOCksx9GS23{Zak_WASUF*R`f@ z4BL%h^-tGy{F)X}#JN41f4b9xzpc>Qy?)W3#pJ$@YPLKB^Zg&1yxaWXj+^?!eYgGQ zrNY1~_x*T*Q#F9pfb||fEzS%g9cRE;{Qg{_oI7Pa02%>)d((Tl`8|{qX_p>ud7tTb zde2;w@rU-{?A{zYyf*`w=L1dmj+95kv|AMm8&M0CXhhXjW8^ za{~$%ez*IA`W<2Dgpw(@e$YoGDvnqJs$xKWI&()6!x*oxCK9VL*)+ZYDpHfHmbP zsnbooB6B>&oV+5LAcIhfR0>#5B8s3OXvsAcR0PiR?C*X5|Hqs&>#VbmYYG45yX<%G zXFvPd`~6t;`{yRR_kEzRVHobu{O;+0!|!zbfAB6>{QNK}_L^ZlarBv|pZs^5rQy8g z&%b=;yG1II=`Y}49RIZ+|Nr>6gqNN%gLerJpET*|Kjv=U*tc|Q z_>8#M;^KlzdCRGxwIR)W2PZ^NxHh6|?ybiH>I>&q7(tyY^9OgoF?8^*YzZ6A}jdx9{{-=SDXl zOZr8!TF@4~o{sX|(>W1+3a};vi?ZyEJGaH{;Em(%YBlB?qav|ww5;R6w!DA$+0+p8^dY**Nb zFPc+>E`7T^!f$Eu5IJ)0pLY2q`c*kBKb^a{q_c-nVu$A|aH5e=R-98+67X2t?#;2v z2Q|C%yWCm~pTAvAxxts`n!oj`gSX(UYWZqvMrrVsuA?U_n)ueTB`|hZ$IzhI{M@da zBaXOKI1UfZZXMRSCL`y{p6(~D1*eAQZ;3<<4K99jX+=Tj=+1K|>DNBz&7iDiOz3k% zIUT0=FDQ;!eEau}aRgB4K*Fnx*NroQ)VBags;=|)iOQdn)IM%)-jUx}7)Y2NipUy1 z+j1<)XG<#!%@w;uamhWuU(qoK03<5=CfkyW{#G>me%{@p54D>om@)3}`tkd#ULE(+ zU|xPj$2r8fF|MIu!Ohg=cdhF_v~56X?c1q|W1HsqxSc<9wv0zN#+iUA%uKaC0(bP& ziP0-cWrj1_FUf)~cx@}m^C>lev%;uLekEJ;X3UPf72}!>lu1CDA95}F)`eyeib$m` z_`slNB*z$WeM(~-9Z>aAe!>Iz*y4M=Hvh!@%9_Vt|L6H>zo@ud9ZwS^ydCElMIB$} zoFxj0^B4N_x(fDuua@8Q2;vj*XgmN*bxz!VJuXRE+0%G~SzB{@iuD78wNC-A!=V4H zbji)*`vZ{@48q}%z^w_9Y0+3K!(}i6#@qR?|Jvw07WhZEgF4d%b&R2MH9gA&G#rs! zLP{CDedf||Kzm1O?kX5OYSK6P^}o^V0jjX2D{iS?L1S`Yp^JlMOt?uVIcJty0+DGT z8C~`&j0svnU&7x${ih$Za=GN$@4N$WJCdXwsbol&J$TZp-5UX zK(Ut+=?Q12N+ww+*mKB5Voc!ckL>=JLn|UdFqWu01R|f&Xe##RxjHy_D>0F@k}zrV zZLhSt%)5RpBNm4==EWanijyDfHV$GSkk{lG#EONXd`L2JrGU?u;*cshks%=8`DrF+ zKAdtNr--B);qvBNn7 zb$-X#s~wC{_vJciWVt509)aRD=_i_H=N{*J1XMGFTp9ob+&Vg+ixzTc06X}xgz`p6 zg@qTBoTr1gbkC} zNJf@C*S*i<0&fZo2@h#1B*p*a1UPOYPhjv|vzJuO0?xAta|a{G@+xvs6r|N zF?yaf#suIk?KPQR#gVw4cSZc#H$%GmwFHw|gdJR@dVpM55}YVe7ZwXrjg?36ra9E< zJv}c3%Nhw{axK_@V9&!%`JU+K-Pg)p4 z>k09s#+v3jCKydYzPX$Lt=ZB^hR=6jXe#t3U4@Ho5+G`J@1xm?a;iE})fdxdc$RP! z2Y8I@PVqN<>-)jvKA=%L-T*>LW@rE`z zhP3a0=F+B>6<<_-6G)@7GGAUgMx=M%_T^yE=v$#R%`6b9MgK-H>Y`EK4 zyJ)fZt;(8>i%-7QWa@#_t)m*5e&mmGZ$ zZowL2@lErmS;zMTe17v#3YJc;FNmq9^<$ihV z%mCegz;t30p5ofzb~1%pE$p9VZ5akfmRT|JV5926e_a%d7+PvL1x58 zG<{c`_58NH{bkwhbwg4{rfol$HwE_NSfu}jS0gqKpL)Fi!v=f?G|+}`+SZ-^lV@^P z=0$*zSo*Z{U(a;?Y*F`J$;>mPG1&F+$&z3BZ`d$=YDFZqjtrInQ!iQ9jsHhIkWm?-C zny;0Dj!##-dp@=MDT7T!r4l&|%sp{w^RLDDfMOk&k(r_Nmnd_ge*+}-pO2kE|gxS3)F22)u~xhvcq~pt&CN9 z=iJ7Jd(iNY69o?xLaI9S(WPH6Qo1)-FU{zKM)=UPES3yKS>+*DQ*Tpa?DIBT$ihc> z2kL+5qh8XP@E)oi&qyj?DfvRHpk8a(p0^&|^CesLL^jV%AoOrIhX#qHGMxk&NPjqW zL82*{?Yd<)3gi+D6YD06H^mF1A&0SNA3_majZPAJur_mf%(tS9FYK6MLJ(s-6SAd{} z@|Ok^`h1D8i#V0W%T*z8sgKwPic`oooe~v^9c2MMPHn*|`cE$VVA}WWxV@&`fp2YZ>hNPPR3p5kGcg^qT{2ohC{uw9c>>cRIR1xsEx>=%ioTb9-tF zm8TAF;QWV~s^S3EKg!>Q5HLT8=o%b%0&0?4O|8g2moXiT-ANG2JavAryW@>Z88 z5D9wD@hX~tEYa3?yedPlzo_1*XiZumlVikoVH2qB98?+MAi9+#$5|B_vm&AO9mksR z?j8}-%o6IKgDp>b90)otve}fWyroQE2mynYNd}OLKXR(n&5-sVBa5Y9&Teaa!cOR< zHkl~e$64ZgnLyk@TT%fQ5>G_F{oXzBXYU9BYWmG#l*&{wLQ>aG1)4+$O6$bn%D~Eb zL?Z5I)?WI|X_(r}8C2$^Mu(Ef)HTa)u5MzughZ7_sstN-Bop>;&iw1}*$Hb=fd^!;t=Tgx*`!>7%vihK9Ms`kC@e|~&WkhSRZ97->pYS0PLjO8;a2`HL&yoY7B)OF`d0D#l%Ih6@0X5et~Y;>JHhSz)l*-U&c*d_>>sJSPn-a4QOCGl zoBmeD)-Xs3R{MpcC>;!F2dFEGtn!&L3uA{GX-n60{iy+Wlt89Ry>0)jS+HOz|A|@89my&(nDbrX-OS*pCMiuk3WTvlk zyCxi>a%~JdQ`-*{ZspmM^#oh`MlC+<(lx{v`ex{|IRew&VaGl z_Wj^iu+~pT;M7hm2P{w=7b&{SEDHHzWVo Kh;K>?d@i*`o)gNcj?9*jFuzM(=Yt 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 E1Iz4Xga7~l literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/hedge.png.toml b/icons/obj/smooth_structures/hedge.png.toml new file mode 100644 index 000000000000..a03553bb3260 --- /dev/null +++ b/icons/obj/smooth_structures/hedge.png.toml @@ -0,0 +1,2 @@ +output_name = "hedge" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/lattice.dmi b/icons/obj/smooth_structures/lattice.dmi index d9223ded775fb68f515c9e3a009ed4a113d51556..3ae4964a11f7a682c1982cb1d647a1a6c06781f9 100644 GIT binary patch literal 3827 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 foag<%OR_XKWT3rCOF}}zU~Hs+k9b`E_o1dF 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ⅇr-@BEt_N6c?B9@PA0c_st{?pID|E=>xpqg{uc_!-Iv8xwvdTsoWO> zK|||ToP{b!H>@nHJD{QGrj7j@0##377mLh(*rZkwbiOfu+e&_Rl|O+}n6lSJWxsOr`{JW}wwLm$ zm7xaTOS*($-QVW?w$R5_D^wrmuRVfC@t^jNclHZgQu6%z0hoJ_RX&5q7m2Evk64|E zr_~|T;t~T@hWk&F+>c$#d_4mf0vYrnd`7`$G3c44ZCQ za*hpegIphH*&Xjgz7R>6#{%92N~^=c$pQ@HBOgogV49ap8Pvk>l{TI{EQow;{MXF8 zMRp6`@^t7+@yH*+a`%UwpmJ;Zl^8hF&IcqV7D^r#EC#~y;cs9N9Lp#UegH_Dh3!~|0*9%{TpD>rXlDKG^6~SvaBwCgKA`8i$c4wxq z9)UZv7_XNZ(rr!lscd?U5}Y4X3Xj+pJF*L^lRu~^KX<)6ALXjGtDfyduI7^qUroQM z<45o1PtTun933yeN)!9B>9O~F4p6pJcNJY+MuRti^dsX|(CUX2Av(tCC-d1Bj6NdE6vutOkGfkm`%FT7m{xm^DZsX z@!nrNZ}zrTLT|LHu?^jD3~JLr6(Rt~w-93XVLqw4IJ4*=RK(igZD#`erN{^Wu?ec% zs*8Deu}>RdsO|7XlYWt(%4;7}tnUSb%D1WW-of*0s{DgejA+2X`7(e0qIZb?16#F} zwFW+pPpV!|haW(xyuHt|ZMEue%m3`D8&o5@e~fIC;y7pBEag*JKqZXQ5s>nx zYZrBokh#8)UFcKnl?5|kTn;5c00KSi^By@6KA`KuwY{*u_tzS>Y`J}3>M=~n8BKJ6 zwA7?c5TMjb@y0iY$C?-OI}G%6fzOykhTyLZ%k{gNYBKR^rdSB-YUjwLj<9(t;X5)x zg?Tmq1Ni}4O}m|f@OuhsiM=|=Lq2M8x?8dK``hx4OfBQc_h;QiKpkH5z!ipl)t&+P za?$h=^4Hf{1DIxa-vrg=()nfcERq7WGE{-L-2lChV#Lh5^e257uhZCC>mFvPHOejD zMP%RSAHTqK{TL;=D;^O3cHvLm*7(2Pa{p}ELh3D3*GhwcwJ+xWV^5Ln#)7F`RU_@s z9E4x){7bGk-#KLN47}*&LK97S^bDQn=8p5kGhiY0zceJKE#R}r-!EDZOfVQ(KdwuT zVV7FW{I7RXAn>!_d+6iLJkB<}lgqygqU%(PydVcw>DJTZLz@7}AxbRd+3`;U0yza1 z(zlCj#TRUH<-MOd_`3u4b#LMWE!d{|-0N<;wu^l{v-Paj%w=_J)VaQs-WmM1kMh!f z`1~>-F*^gBmbbNktG~5@Xx;SMrG0}wwsju|*w_=4e1(y`3AIQ~-x}CQG_c@e>XU!s z7Y-J#gn{Yvfg2OY$gk#}Rl~mCZBI_Ep<441l~_orJhapELDd+rx)EKjxAti0oo=TU za#5-szq^BhWM_T;gr3dCV+)9hkcm}ivZV@@c*emg7*{(U~xv1P|yT$K!FpTrfuU zaW=Lf$oSj@T37!hp8Kfu%N;Lllx8kCY7-lEC4{_9oW!X%Z7yh6WCkMEI|*upj);!~ zcJYB84qMf2$M5hQlC|Z5Jvdk=oOp5=N$F}|h=FkxqB6ESei+iCk=y2RK7Ds;$edhw zpvp@@VP-!)b1PnS0f<>}c%`~M#RiN7Gq!wQtF{-8799Hc$9Q^C#H;6>(#>*oyV!1leOB@6N7Ij7~2c z6AeNb{x%;Cp6*rDS?I`2rE7bGUYJK-Je*cq%15sH><$B*j!R!F6o6#RfrtjG_cdl1 z8lKUKPPvXxW_YJhLdu_Da-d=#j0D$p#0%U1Y=)XwsD30!Ja83;Dt>1vIwVuesaxpg zrY%vwdV>wD-2m`Zt0DxTib47VG)RnZ)zYX&1s_|f|9r8)4U{8vO*j|O!Wtz7B@A%rH&%0k$7P9jLvys8wTKSylanw)z z_L+At5wJ5D`nhy8+u>J$S#{PR+s@M-q!?&fBpn2uEr)z2{j|R9LE;y?GGaCK;jpMr~l`PkLSrvLQX1FgxNGG+~3- z#MHwhFCdO19}PR*MZ)G9a1lblzu=rawBiReqK@h*1*L>@L7No@0RJ{|_K#yM7hXCN z@W1ATmO3OmyQ{SdM_o;^a;6sVF>BFsGx0y;tohk%uQ*V8f77%Un%4DZbTa?i9plep z1mA6}uY8FEv~M#|6cs}p2fVpLGSWlJB~Zz)9+##1PUV0uE6pJ8dnOa@MRv+>)>qS1 zf-9cBPWaxE!`3W}`5b5NOlMZ71~qGa7oWRZ0wUSXp_rh76BSea5tGVx9b1BqyCrY)ST$ zEJXn6ohDaWwj90I{MWxfW8r#RUIG?@By(aQw_uf=fM{U7J-Xa6(-&zP(J5zBYqF?j zWOz-Sie7EQIX8D!_;hQPlJ0xcfBUuY)DdraAW#hS^*}+#eAsOKNm)HMK99nbxkASXycYbOU}REu3T?sq3eKbEgg|cAA>$KsOrA~i zLwL>XfF{sM=zW@r*y%%rhcsFE{llyC+2e;utitz1laJel8R4_9_aEdvLLkPkf!qXI z@{qb-X9u}h-7C66vYs)3_}d0_w7L%d#=kxXeN3OZeW1l^$5F`zv&<&g#4jrkp-RNS z60n}XfG7aZeY0tQ-o;l{%OtKM3RQkgYGHg%Y~-4RXrK{)J7I8kkc#EM;=p$~Vw9x` zDIT$Zm-Ay+y|TC80vm2Pj)Iq(C9a53o9C*ILA6|67x4a*6=pV~tI5y->svN(P_XFp zS8E2FIO<%rOA%F+QCC8AuK~22YiM#;?2(%??ZaHyLU32nmRIn%^toW@z;6K`!j;dC zP;LOeMn2ADqw&M>wS9cA63A@=b0Y!}i&HIUZB z-Kvclca8yz7f&Dh?p#Nbt|7_?1}DB>h=IWN=%g%gU~63{kAN3!Q4vS-7t|_b$V=KH z%KK!8L)KAfZJ`9adrdP?&zH2ir3&?-rK)AaNPkYAWie4&0!XjA8NOjX_L*lyBy!zr zPm}u>3ZTPAyY`Od8ruQA_%inZuI0~+-$r!~(#p|1y&}+q(0v{iA7nM1NK7;V(vQld z&Y}?w6M=q&cAzB)l>_`1Cl6JgMUP_>bBuu&ooKOJGVRX;?qwcqqV2Oz_$I#{DP)~p z9&8?i-?3hC@LMpKt25r-fD5!n{E0Y6eeapp;#_d=yOr< z)6+Y~8V^(A{zEBjQh>YHvHwFUklkV7Oq-mMKh^Ejm9na2s)g;VgWNG+o@wodE#Qxv zJqW*C7S`bkN5sTx5!fo!r&8i*&`V?jn1v-fhR(YaU-iCIw1uVccaY)=?_E+)i!#TA zMDrdiH1#uTz?z|5euureM`W8T+IX6D(E)1PgQyjgk?ceE?))&MID2MUKYydO8yQrs z|HFa>bU>rv4*(NZ4tsuxP2V7-VWU=*FIMhiNUd9P0C(twQw$Q;T?qf4Wu1;qp zb}pHIw02M2fB2HJ(F$K?6>&W2+nUhQY$%4U9K%~rK9NR+ecrpya;I&ha@3L4{_r>q zs{8#5j;mV<1m4|39G=i*)t{EY^`LM^7>i?DYJJBY1A(eu-nw>s;56CX^@LOHi!CfWkn%R zfTmu^P9M@HNWEgu%%SLUv;6ss4J^M{uERn7bwdm#Swu z#`XNg)3s~xK_0=K#4KujtzUf#%`q--qBGKIQbSEhC zg&B=96z?ND43IjS-nr2s3$ZVwh8|#O;KP8bb>(pUhuPS$CH_uxxAU&|>wbyGIXBE+ zEs~T);4FsJo`Fjsd3cl(sA#`_%);n6o}h8wLG*fOGegLG80+V7{C$jzf4t`Mr%&BI zqYpP6UXYPvTp!zC`Y^12IG4;Ks?JIvC*f?7GG1x%v}bkI5uf`l?r*(#c2Ew?ulFFB zO_t;RJbr4qZN$C}2vgt=|C4KRI0KIzs|qUG5?Ktc z8iAJx9OnYaM5Zm@kUhy|zN~}!0|jnVX0kLTyiMJxdq_$gmi;&0 zNjI6U;O+3apk0Zm>lCJ7PR|cB_TO=~WLvB90`4tG#3&ZqKL1?+*&{7NmuA)=3_%B3 zK>z#=z!Ki6G=$n{uQU^Dw#NUQA-lIx3gn1b_mb7VdO=ePlum*e3EX(hX~4Z)W8pTX zl2`Y<$EYPS`BiV&Fh+S(%YQwB*v?B!s-(PJZsySR7er}$$5j5zDJiz)gCe`A2P z0q73g*Vv{A&vLln>j#1|1WLG~n}E-8mjQbIB~a=m8|dK~biiI-O&{Im&S!2*&xX5- z%s==WK;fgO?GegC7sP>)+MHNZhe&rCKG}!Xi=kS9lh;6wb?YYdb9nYi3DEMBZ!1Fp z&m=_sZFD|o6;6t;7a%$z8#UVo{PuI;>=(M|id4=~9na^*1a!}#*emWMl-!ACMgg-{T5 zOM`>GY11qF*J(aN#`c2=CUyC*3|r767@g=36z8iK+gM1)*5L6OO6mI6R3Bh24`EhP zhlN~3A}~kS+i@>w2b_teq!A2*1Q7^f_%G{!;$RFM6eHhf^{qJ<(v03B4(dhCpyL_( z_l=;+H(oV`-ZpURtsL>eLUuGfOwc~DJTHNvS6>^ELXxNU;9G`RthWXz{Kd)kX8)J+xSwjQGS^DvnWJ*h$ND^9k=ugb*g~6)%Z4XI-|Er<-Y;u3r3wjoG1SRo(G#^k$t&+x$RP8tp?4PwjX>T*DW+x&jQjNQ=2&rj!gn) z>}e1Qv#z9DBeL&cY@Hz?e@^el>kfD%(HGG_@7FBKdI$#^?u+>9qu{xd{YWj` zAlX8&HsNroX930VGh90^30O~+EX&K=5yP%3{gw75HY(Kgg4DPNV5Fg;p*&D6Q%P!5 zCd)$CssJ?=xp?;xGM~r7o;uOfELsEmDIs;QxI z)BUaghLUY(RKxqr+6-VuXlUqX-A;6Lwrh#Kmi`UUvT`w85j0U0f#IzU@>h8~Ykd0@ zlJkTVq5quv?$i1Qq^D!f-dh+aF6YicX>F8BpxMtNLix@IwCe$tQefw$iMWfEqoqT2 zF~*6h;%A?5f;6gB%XDHhqvk+gz9QYARQ6$?yc?;V*38vZ#$uOc@UR{toowtwiGgG+z}1ksUFOB}_u>enh_0-bV)kNHe*4#Uj%4$<-+uf| zs+WH-Mg7LU=jcX6MxjDO;X!$?d3YD&kZBny^_)P8GsoL{67hFYwBj6|z8aB!Z?pZ5 zPN^TL$rKU$*-xGTxf*E3j(DxbuLZWJ9|FWt9FwHdsD1cd!(Mmxm((wHwGBB#=IsEl zRt!fC2Syyj9NB34N6(3`1JGygeF=}M-czOLG5Ox>AZeCAs~LCqR8%55GM5{(AnC&K z-jwsBa2@%tswkhjv~@b*)2XB|HA*dEC--f%=FMB36&$|$!bgR{e9ez4Oy6^pky}$n z&Nre%x*r(5qt?5GPf4zxJP(X&$Xov)$}qtR?+oI#$hKl02#v>pNjh9u*iu6PeiVT- zm+sdF;<%S+5Iy%KUuzY(Q}$jw+oHGn=NXb0_+=(CLE}nQbn}{(KSyk|pxSu(Lb0IJ z($+tP%e=k-Z+>kn@(%>c3~Zoz-M?d?G^%;)jSzV{jqELnr<0mE%uGj_(LLo>ATh$Y z{WE;|&)NfSaB{}P8k3#uMxj$5f2xKwCn9Ofb7yk4sC(zXs?{2Q0>+6x_xcXW+n&(V zCXe%5Cqk5K6w9Yiv0=ktSqDuQ%F%vG9Xad;b?dgalEL0#E~8VYA(^D}z%@IeBjW2L zpK@-R8~n{HQ?lKOd3oTX1@92GF=f%&c;mj;=%On}&j+}67PErUU4A(#Mz87mAmMm9 zF_ox?`BzivOX6HcRhd%WWdfG}sW&pdw=`!CPy{_L&B=_72*s{{oR$5R5ko$=ec32Q za}J}l9r#a9V9PRpR$|<1VGd;TB3UigMP62{)T<5zZjX}2F&a35T)mWqwSCYt*QlSO z_^5ctzUnqgo$KN!Gr6L3j#=^ebo?Q65H*o!>)E!g=qg*tLGW)>vO@YTn(fi>H0OC# zp1^NDV9(6{l}oWd!64DijSvx+S#1{qhmCX5p~6+H|hYsmwJoDAR{g7j{^yqNMGt?Ra!Jtg~J zWO|*M(U*e2JSn5z41Ul}-b^5I&6GlBSU!MW0~M&8P(%u~;}bHKb}o^4C4B%J5+VE_ zo0>1xzUM76QDSVlLn4UWH_^3Go7 zr}yxaQ(RXI+oW7ar4M41>G_^vcFv6d|C2q!*pMqhB3vrY?=OW?TKBPkqBq1dSTx)! z=rhB=dv%^ep}Fe|fT^LO^qk7#E<|>Bbw$o)?rGnfXzXK7Ljjj*-!TXv-PNr+EtC~R ze8DQi)rYaFzu%Eo9$gw1N`IrtPG=SybqD*HmsgL{PP?ev5Cod4RTnw6QX`kbFo+GA z*oJE%Dj@ks$Im_@X^2&&-cJ}8dUV-FYm{b^C*S^Ig(>4WKPT=V#;=1ARkMqE#^4=z z!fy2irtJp^Hlc<-#_$y2mDg`aD_|}Ru!QO`KPRe3(xt{SiFMJFiI5k&NM2Jg{+J=v zd2oID0KfJT(SF{Yb3$gu-LfF6xRBt3^HZIC6CzpED@!$YJSR1A+*{25n9J4vTx`|Q zXLQ02@^Pm?4GZ~rYAC5U&4IEfbnZb=r_KCGiY5urj|fpVb%C%4R#K@LWo-lQhkWIbDJLsYnsO**$ixGbN^4({@ zZSVkqTD+b6GhU3yLQ}J!1jI49Z}c)Rk?~PVIccQtzpt=Oo&RE2Y))7FG0OIeSZX#3 z={*!bNWt~3Uk%OY^%cEY1Z)g%ASWvBcsB-=P7+l*Vjk7NIdUY+$Htf;3&)!rykgdG^vhd=Smmt&0gD z=UQYMD3TpwV79=l?#0H+AP9dhc`n4EC#$pBsK^5xD#O1)7?zJ&ku0{qBpjhMupp1F zL!x2@FWE&&ghIP;y_2U0Y#N|tsN44CIc1*Sv==VQfp+XoCUP-8`iG4yKoA-D*#2|x>i zsJnGUZ&58;&^r-+cO8@M%Mf8?h%lNO+&#x+;h`#VTT~~9fz%U#?Ufa#x4_BXUOtU~ zJ0m^cNb0+b#V-*7sEvp{(WXtRnr^_HQo-T$-%?0AuZxeID>_IgsRL6v65C0)u95$U zt9B#eguE%dixL}U=R%zd&PVvmtP@WuE4vHaBoa&c>9WVu4|WorM$flt&ZYp{1&E0+ zM67N*!2LJCj5(c1Xq&r)%;wj;gDKX%QedE2XA*+3_p^k5OWMlAPQ!E;3CR*y=4%aX zAY#x{t0FIRZy`1n@RbraWd_~a;Z42R5k6N3nC|{-T%Qi@dWa2S=K%g2kC`}Li!hjh plnumVb`?p?H(qGX@Hhgw<+lmbqjytR#6J#@7~e71uhn&l`9C|;1{nYV literal 6337 zcmZ{pS6CC#xArFiB=jatI!KWYN|h!AK@<=q5Tu1JAXTcN1dv`61p%ds2tkT8sTxEe z)QC!xDqTYF0fB@6?>px?H|JvZy4kazy=UH8YrVfoxNoFKM}37F006o>`cTu0Sn%(H zT)G&O2(D5Wq4ud6+#l-v#L>^q$KTD{3jl&&rw~3+N6RvHZL5SN>MXzLavCswF;}q3 zC_AE+G8c1v%=64kcqWiCB6VhXZzb~8Rj1_4vCb{g`_$|j})wTtK3jsKnlf`3g+2sO1I@MhKIQ*Q6O)Jhh}m}T%h1t zJcodsLk`HaNlwc#(j@|Ed&>Ev?)0>}#OrYx&r=eGJbZ%B@tK$a0I>Jmf!;C;e!ZSc zNE7M~=>EJ33wVP6{k?oDH^bc0Y70M&)8}6(;IF1TVP0_HP@J3eQw*hNTp&PZYk${z zH-K-&S^HI!f#e+QUVrs7A0hXX^iZhPba7Q#@DCbBs`x97uete|w=DR3!}$=g1K0fE zQ>Tl_s_?cVzE1~(X&=ZVA%J+EX+;)C@@Dwaz@{Yf+<7Z{boz`cy06)78(t;hzIgpt zWyHkat@@zw)`s0$0whUWlkc_)$+YTv-?~@ z8Ulip{MzBq1+OE}W`Lkfnby>rIuj~h$N_l9kiR^ipMMi+mjfUG-lQ*%8!Tu6#^|3Q zj2ksfzl0hTwzaiUo%=9|9!B{(Y>rv}Cs{QEe_Jv`1AqvGA|o?1Ltulc^?`ht{HlJB*iWL0M`Jw%4r>Z#8#X{@ zS+%R*fVVHVgHcy|U9_lipLS9trgIa?03|jCAY8KYxMbm*a}Sy@Vu^N*T_KYv*?SY9 zKsq<+{YTfLX+tg$inFF(M-fP$e6oGyr3wVi)BI$5uL{>>>t+HajlSK88Wq>JQey^? zL@SHG-QJoBAdVlRxt7{6GTeP=Y&;?`;a)yIMRx>-cD=p7zay*SuVqj5TqkY;A1%~d zQ5=nl`FxPk-myL9Z&C6qe5ys~9-D}Ye|B+Em*4PBGb#RRDw{;mP?{jT{-TS)O>}m@b9-+;~h9K8o6cPLoN;#7&6|AD7N(ZIhH7R?z>AC#pt5vwk`qY!G3R?wyFnfH z5I>hJ$tJp*vgDb<0l1aCo_vzv)Eh3Sx?u9|(>+gqMwx64k))mt;&vr<34Sx; zPSruC`g^9Nxmbl89Sp!)w!k?vFm^v8m#Nk0K<7*15muU1gvM0N zN1ZT8Hblk2pK#+@IIp`8_`I)S9+qnL z^}*yhmS)3oK#rgNv+IBlFz~@7x-SDdA7H*@nQkVi32PJ$7g2`YIPDs_L*i*E zK$&U-r}?$EG!Ql2>#gmp8QUYO61$RSQ_|@z)7YclPnv-2O_JL$i7o&K?P_P8|8ipI zN%4{{eLqamFG9xYmh0iReKpYtP_(HkKnnK!-PGD82J! z#w_n=UR4DM+#ffW)9=MVqJ2(rb!aU2X``q{$12;8x4#vFKEFM3SRF4JEwd2N*<$fU z1V@r9z22>}G4Ud;OZV~MM5;keRst#~hA1w-1C+Qu)1Wj+wjpgF~mtiL@wa5+U{oc)) z^MNfSUpUeGS9#btgi01zYjt2iTZQRPt9Ssf3mGqt_7=9Ck@?XxGoecPeJrPGzr*Ui zm7x`E1GC^YUP4IBULn_=qOxM%1lJl5`O*x;8Rd5X{yv4fYGC zBF{>}yeP)GZ)Yfd_FSEFEP5}ZQLr*WT+fcDt)C8-9DfQb%A%oyO|-ZP^~V)E0HsM) zQ2yL4Uc=0^N4F3)3ymz~AVnQOANHpCsP$N%KePR=)r9B$#Iyu?#<#WkO)K#nUe$bu zh2q$!vGmE8C_v!aazv~(tC>ot$5LSV9Ff}O@;LU$fT+jjI{8K~F!_E~%(AfM!KL;*#0dmsaZOg>KuJ@8A;5;;r&O z&*w|Id=W(UYBDiS(;z`|VBAsjcYG`m&VZP)m9wkf4Sy(}dUtgA*f3e|z}&YqE6EVR zt!<@Vtqn<|bYdD8;Oa4Jk!RzT>DPDPlR z;vw8m(&9Bl1a+WHOuCqrxYGBV!a7bt6Ay zX-C-jTYEj)%S796@BBoN88vwy$GPNotV?#yoP337b z*)0^1Ud5vbWe8Vn3Opr7$Km7VHN@GMjOo9-v1b-24ozJDOo{rPtBegSW;mE1mrwLF z(Ey6|!g1;btsd%60Y-8Nkbckp63M^fL{q)3GCPVEeH^NrtLh&p65zM;2{OB|me=Q~ z9w|zb&mFQ9&x`V{&vH3$gcH=Y<){{+saEIa7q9w?UA=~SU>>cUT>QM+K=RX=t2tOL z0CJ5PVCts5L-8o9GH_hK99N6ohm@C4zE7Ts$ui#~hbS9kiVwgsKqwerG}g&bh807Q)s^r{mmVAk3BRU(M1 z0@3khtAhP^O4X)@#>rP{j54>1DjUdraPg!$QGEpW$*1&J~%Er zPux7^SGP8AaAR*xA1i5=wYKus42-7SH1aAroEl$afMU2qE>~RIot^3##QtXkf5L*w zgC)-wY8?f7E(7xW;$Iu<->=Er_=MR96Kwz+obfXW6?%z^)xRyPqEWELmnPk?ERd3L zg`i`fub(R5<7qiALawa)DbSyRRB+Z$ox>Ar@JUt;xhA}@Ocr0twR@b;Bwi9xF{_v< zs`j}pfxqFh9gk_%jpOIj{Kz$RRC>NlHQL-vAz@#emZRA|6NAW$EC~O5W6`q)>&2e; zLxdde`ApKbAU(e-VIgWhski0JkDt4fDxO%rGPwX9Jb}HmHsLm&F@(42$uqC4+gQ61 z^@Ws1jinTo(8QevF+$;9=y2?#`nAbz5lIB!fE)r(811)R+=lEDMl)DZ++e`7fKuEk=+(9|QavP%9Y`4DqU6zj-o{a1zrRVk&MincJm#>NK?t*szh6=-! zZ0jp+oZa-)RI~D{Jevh^FcN8Xg4|#D$W}KysOsTi$=^^bV1DDw;F$w&XNp zP|@ApdP588FWA4KTvJtnWZZ@06hZ%gsYo$$%LDw$g*J@XM>H3HzT*j)0)q#nl}GMX z8D3l$8PTUzji?f}tyvlkUy@I1z2l+01Wr zpxAI+#ajt>fju&>YgRK1`=^Anl?tWGPb5a*Qhr+3^YflqmzNILXYD_%p6k9!3zpV= zgY60zbd12dg`@&o<@0vdCoSiv6Q4i5&QbiqN;7uF+ZwqWjxIM!U!Fz|HHkre@w@cB zT%*&i5uB_KJ4a}~?cGrpEac!=>&~1bbv?sgaU4nsoH`||S7lqi@KPKmzNxeEU-u@A z8SD4Kt^4ak)ig^GG^B@*o>!m4+%JTu1! zr5bA?e;$Wnb~IZ9%~h0;nGvgNRPijvXhhV#&`-LRU0v{R6X zTMl)hL^EQ<5UJjv8ucV|vBt`L#JTs__Ma3lMCAmNZW)}cdsj>hp#YK7a6HQ9$7z*+ z!~6|2Hl$qc2owKjmg>SzqbO+W3>Xmwuqc46!j#&l>i36V5&kA2ugtog53l6Cta8I5 zEd~n>Gi_d$5E}!rY}LPfRXRyV{YkwOMa_kG!=hgvk9q!p=oK_|w7rJazSluY!EabK zYYcAwtbN}~bHj3_r2E(xfp#8sb9^J3+}VCm^6%5vdSF8&An6t(cYjtr2x&!EzvWIu zqIKa_^Wsd3>NA0CF83^43@nzJ%`MA?X)9)>^kDOTnR^(wW3B+N#{~&9>2NqvE6gg2i$Ajrx(j%@wM8q;WU6a(49QZH$eP((RKmKq$;PH z_q6AMJ**oX(F8q5;G(0NxDe(Vyz-?p9kFQC8`QliJZ(H|AkGF2(OOjiqiT_JFp*j{R+bF{~@g*?GbUU8-Ng=iGQ!KSh}qu8~{8 zWsBx?2xF5)uEFFfP%j|P?sfNICxDMh$V938YF=;^CXOuU&ljwR{6cNFZDxi|VAxG6 zGU(Ok(Ko<5Y9lY}6@Q%_c5k+shfF)M2Fi$eXB=*xyWkL4`luL!$9~EtcKK-weR?P* zk@hkC_EA-8gztKahxfE7jrGY6Zt0I|X|q>j+|t`JkHUak_3C`MO9@=(yM8GCy3SfxEzsfj#WF5|Ok5o){1z50-xO)Fu>D=AI+kPW4#n z6(gdaVzRso$$eedg4B-C>{{Rt03^>G$rK>1vX6g(Ma=GKi)TAj^BME~CH~o0lX2xp z7!On&hFBJSAH$1Kx{ePnlIrcQ^qWhy;qcgbWJ_c}(W zN!vBrk&vY)mxxa&6WSRe9M+jOFH+8|!9D+BAE7zalxGq4|BGHoWAL=_tE?#e-5l2} znRo!o%_PKrMc`xcKV~s_{bw{sF@5^I2c_EbFvv=DTu?dJ97O{o4d4% zi)UY9ytZRQci9|-OE2^zFoLzd^0SIj2N@;HcLbbKfql|ub1{FOo9G$bF0{S*fuLVt zBMImiJ-$>7tVzr?&P|mm13r%1z-;#%*4u#ICX<_FsmYuD_rqj^fXa^L1(aAchq&NJ z=*IyqKSJkx%O61P!kQ&rYq5u*+V(3X&gMVne+82NJRg)S#DWlF7ah863$(;|p-b?3 z5+(ot#tvZ1YE?1IBM&=HHSQV1AZM)KxG2{OFB@RCyG}#h$Nowq7ictOLzM7p6&N5b zF_Xw&zngB?3C{eY5no{<)RgNvxmI2Y7mO|X?schwlLiPJ^%++H!+^R?qXht`v2^XY zucB%7gVhwq5~$qy^xr&zQ&!ZE+j=Y0kz%g4`>cPj%r$77&3qNWc`nQu;G@vqh?;w{ z#a;~wbm>Vi4EhXSC|TclV6@Q$m3MYpjZ>qhLrZlRjgd@wd=3)s;_ovwE#3sGU1R^= z1rRy|H-)yNw)hjeFa|F)`X{6UM?>kGYS&4BS{KW0qiN`IMoy0f5HKmSW4`bIoKeY+(byY(aVq~6Ts z_w-|Ldl=ox!6mlYgk(;w|E4wYdd`68z5wIDl}m3X=Ttm&rNs6!2tX<v^{hPYX4RO^ zg1Ip|$cPJY#dj(h@HN*-YXCkuDu}WptoCyUHbX``Kr6t68GSiz`Td1&Pq{i|W}0Ba zG9%vSnkAYMp)*S|y(gIC@F`rm`mOA8moaKwO!p48+N+~1vGN24u`7aY>MZEOY7u3C zKd6lyr#*b&^$W5q(8K|(&Pg!EQ{+hT4MpLcdVKk-{bAe!`2)(q}j}lSEX}OWO6;$H;9uWaWHQGKn@jxB19=iGWHxN>so(J$l&sz7AF9 z6!PuS@q#k7FM{8jLgN4M-tParcXnr(6|cmS1Iq=+X%*^uJUs)lga+bo%MZ)4aRZ6B zA$nI4!9n8E;XSf`hsam)rVpVBD`bMIV!bcowV<}&uSpeUQ!7q*A^H&R1p@Cnk@Medd67i91=%7U>aH{_OM(aee`S{oQ5WJvCJFK=N zInWOxIYETXCLz5=iu#57}m5Gp+ zZDr9LPF-scS9_IYCv8B9+QTz6>LmmTkkj_t$oBK+O9!04dpD}^AYH(;3Scbn(7m2* zJh;)MHo_8Iv(zw@yQ8>-8q!ZNi8v#mok*_rRZhngQbSR2d2xr>UcB}FGUO-MDk;Ln|7zA;k$<%_|A W)QyE;tQY?zfIGTI&`NDY)PDhmhy0%a diff --git a/icons/obj/smooth_structures/plasma_window.png b/icons/obj/smooth_structures/plasma_window.png new file mode 100644 index 0000000000000000000000000000000000000000..d38c888be9af918b2ce0a169cef2b2aed97ed1e2 GIT binary patch literal 5057 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 AVE_OC literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/plasma_window.png.toml b/icons/obj/smooth_structures/plasma_window.png.toml new file mode 100644 index 000000000000..2ed25c1b89cc --- /dev/null +++ b/icons/obj/smooth_structures/plasma_window.png.toml @@ -0,0 +1,2 @@ +output_name = "plasma_window" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/plasmaglass_table.dmi b/icons/obj/smooth_structures/plasmaglass_table.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7c90a489e82de3cfb3ebcb70b32f746076e99d13 GIT binary patch literal 5431 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 j*|k1~yN`muBLkvOn`uP2@QnXE^`gd% literal 2401 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 literal 3723 zcmY*ccRbtc_fJBU(Dt@QsfxWviPnrZR*h>D)UH{*)ubwl7O5JwRqTDK-5O1mrYiP` zRYhroh}Gh@)ne zyD!6i!^RCv3>MWutf%;05pkmLb`~)_P@_!;Mb|D2n3W+GPF<&1M7R{rl z7OM|C6D7~Zn(!JC#*&^F;KIMTvL|efJE(az{!92B`E;6?xlO;;-3P-$X`4v^r6~PN z=^S@i*;YwA= zK-XzL_VGxEz?LzCcZ!IQL$qqdej+HFAQaD5E%j=7*qS%+gtRfWr@GfYj99f&4`Z%mwb`m>IETZ zJEYFVR`PSPG0o5HJWWj8ptxU~BR>*#-|5SDC}di+He$&0DyMjb%vn&~FZF$SCo(NL zMk~4?!XC`IUG43cwYd1@rY^^mFzB(Gvi7xvMgA`8Z;M+k=q5S_y2+h@c?&6E`Zq{$VvumR$ATfc#G z;h{9|Zq)fjA%&dB+tULnx=<`491StC5*Nr!QI}R>L1mCqb}^p*`ZywX4j?;{Bk>rNG~in;%WH8c=d2&ZgN|<&Qlv&x4NCJWS|b# zgetMy6mJn0sB7)}bQ{g_>EQ`ssNpwtzxNU@)i1F!sd2W7f$tYM&Idv)t#}G?iBGR2 zoSHFMx~h+?1lSY5&(FN&&Z;h%((OEx`f1rnUQZ*R zBNF5p?cO_N7|6_8hgFO6fs5BcLf(U8eUmk(bcZz@uKnm;`2NpC=GDBFbmk4=bLrHA z11pBMScL|QL=qZ6S!sl-I-~I=Zh$ww->sfAMBBR;yE^?d?C)FKeC+|Ioo5xXueX6O zu>fCOpn*oZQX@x>?>lKbg_02Er5BBGJKSqWpo+H0emGG=Rvt-mt4|b}M#`-cOw!p$ ziy2WeTE+PpnT$dnsE9oR?Ej5Nhpm*QM-w9SJydsv+CM0*@AEl7&aZ>bN`QsHB`@N; zNCoWvGR7q7eXE5=$!*)3AeSAKCph-xmP<>}q0B1aZDVequr1ifLV%|F3QnyH=8@bJ z!9kkPWRUr*QU2J<6-bM*4=7>l_S>6p+e8tInRn!fTM{o!eLy58O~qPl%8y!fVZsZz zQ&nbkQDaW6csA4Xq|` zO^DiGknveol#f)zd-#TS%SF|kDT9P!o^*Dh?J*@B|WoJKZ}@!X|LI(MKI{XF2$FPGWW*mmOxwDtEp2# zIz=Bbv;ciEv9Bu;O_=trv_XA6V8Bm@KOlYjdAdrn{O7O3P+ z)B9!{!tN3q4f;A$|CuKx?#k2ux8%D?iD;@o!(Rw2@u2_5<|df@zuam*M9-8s1y3F5 zN42`Xop(ytIXG|UcX(hmjstfbF5C(sJl}d&)ABp{iW^YpGU8I?z{1~4Ti+{s#6kGR zY@XhaOTHcJ6)(BfB%#(1FN0}<_1IEwILgRbGeULYT+ePZ5f^oo90^VoXdd!NOG!1j zD&77g#DE$X6ayk{-ws2{N>*N8e29d;TtP^XTYHq*_ z)u`+~UQU@3NB4#;<}(g|f1*ju)S$7=W0ALEb(eN`JOq3}s6kdZikcd^-j&a?qAN2*LnvdZIr+yP`BM)rld1=I5%|wO zFkEPW8GWz!^tao>FjTE14F%!rW>WCRhs)Kope(~rAVYUqFy{i{=AcmLS zu3vz`qws8fo9sKbhpR55fAy4fMLt2q_5Z5$&~?eCsQLU*M|s*99X8=42pp4b(D0mA za0w;QHDl=eE&)9qcnAAF5H7*7m1agkYl=n;`CIdV@- zuIg3~gAz!9(%Yr?)QgWo|HUPqVT=^eYaksY#bDYEOO#^+T_eaDO%$y))wf9D^L_XK zjDESs|1aLHR)ljiT4+~*Y;yhK%lO45sRcAJT`RMf008X+H>~r z(h?fLSG>n=%pW|)Uzr7chH(}d&6)S?((d^az*p?sLz5dK(Lq3IfnNFM|M)&kiG7mT<~aO9B0@5W-9-soddD^vsgeHh*!^Px7QWw%u*nkt(v;dBrY0akTJG}b(J3k~WE zs*jS}Uzhu$I^21iPa)1;bqFRSEqecwy!xZ(%>+o)>|L94tnXuXY91l8p8Knvw79#i zBDN_SDJqxFWWHxV9k*)l=vgc8v3Iqg2<89N{JQONkwkpR`A=x4LJPmI>+~F<-*Abc ze7_-lfjyKR1&{ivLV?2=>LdI1SX;uG90|(nXl}rl6^y5-T@n!2-B);cHnn&!l62XC z;^HuK9DfU|38|`eyX<#0)5kFW&Srbl?q7&RWPWy++{uT_8TO`&LK-7410P?O1NbJUVJx^*iHx4VUfBk2r+Xtw1Z5 zc>HEwlweO9(EArZyiD9lUmPPXbaZ33{a{IEf;qF2+RWT^@G&WH=Sx+ShN7KQPVqpw zW6yb09i=4Sn*ID1^W7H@p0>Rf>yObY^e0kA&#-nVF_U^l4W}at+PcGgJma>}_h~)) z5lZ8dSi%T?hZ!|Rk1l_fgK2nSTv?5@fr~U;)H-P7K6Z#J=4L~yZ)NSFeGj*od!^GU zZ~k^=5lkZn5it%kgw$!w<`t57EA!2&RDYxeWB3|KBj5f?@WN`= zd${&S@LC#YlGwRyFP^O$oOW;Lwy8>LSB8~CatPo5X`8Sv{dDtiVvtY+=ln^}w6_Pp zw+?_MrGRniv4D!3HZ~DlRi;kq8_O>wq%1{cIjV}XG@+@_CC(LHXMnAP+R#o?(vm79 zhlY(q)6^I%k#}vy%&t97JkkwwxvL-T!`dsSKBkQ422YALuI1blY9P@IY6buE< z)1IE5a*iX1_ul{A|NYVhWqC9h|vZGc^kNYM7rtw=RoE(8ng@_19JUh3D5k38kA zQ+Q=1x#t#uQ|J4>xmvr$F|zwPrKQdEdBe7uuKaG3#)1BZTVB1An(jKBSYch$DI04n zOZxGeBaQ{BWeIh&4DMf~`l*1fi(ZhjBeC6)?*x^r7lD2{$&KRou-_WiynCio>l_loAc_iDKQVuV{b>Wt6{_f2gM>XRo z7sk9YV7vJ0v3K%RL&BmjmgI)J5(~!X`0a9k(G5?ehvzvOV;){?8{UQXfCH-# zT8@^FxD+0@S?Qh;WB;hlxoB};-Gy>}XIC=VxP)#gJDa)K_l?nSn<~$K^Np(uvUJ@$ z^^5*B`F{Jgi+S;IT=Gp2ef;w4@qA5Xd@?z0H=3ex^usoGa$wfhiP8U}1s`N4!0TO! zd>)cp+D3nG4xDHRT&hz$=j%RxI)CSLdCtQQgWFxAguD_XOFvYZTvfNz-hBRiN}KaU zbf9H8HQ$>uHEb^p`5N$xsDLzovm@^xd+l2V2j z7vl>qpD}oQt#3Iwd7iU4x&KUEo%$LaQ_qgn{J${zdyQXXgqF7g@_4EeSeCc=Hq+NLx4JAXdq!!d%)N3Fx8A#n&)ulz=Ym{vB5&g<7*ETaClqfkKmfw zs>vHw>o*q$TzZ4BhyZAjmi;lK(+ECNl6s?*r+7;jvoKax@m6q%t!`X5X7rO3pt%(s z_$k7Iu^9Tc;o;YfW3O`r$*K9B9||<-(g$2J9a!?zGOvFipt4#qJ7mrXy)%L!l0|Z? zYL~-_OYopx*z~(2?KiOsm(Mw@&U=bB5FsSR+vT}e4`$TuydvaA6aRb>B*F_aL=_)y z!#M%oK}58hd|;4_Hp#hj&s4aW8?f@x`=3NC96N0sPbk&Ri}8K>wCpo& z|FuIMUnMDW*sY%7iXP8=+(3|Mb5DW8QwS6`gVC^g&b|~0y{#A%P&bKbxh!yOcOV%94GaSd|}ZlVfH)Mogr@%W(D!b@LF*H}%-TcA+Wt)=|sAJ8pk!LF<#yIkkevV1er zwJ&7glO@Wml3_%fVLXDY9OZvd4ssY~<=#IU7-JlV` z)I=PyG{#QF!Px73ae%e(YaH$|j7W29w4EnN3+p%JBfR^H7_190&tN}_k^IoUT=d`+ zxtR4$Y=OYb@W?z}?a7^;jKc%E%Wq3bE_hz_4vM{{=}3_s8`EQ;ASuztRVRp@)V#gy+~AS7M)yt|YD zAGk=47)u54dvCo}z!)^i4u#G-C+d6Hrz-X zv>RmA_UO}OWFK0@a124K=FG#j$D`u*-QqRr%Y&vfj2weDW$drA+z+HwZ@<;1qiFfl zXa&Q=i$QnI&&6HrM=Rizr@r;(o9>sO7c;f*UUFebWI`ye#j1TUND&Z&T^M>$pZ`Ii zksT3q7}*`=SR026fxNk~yry)**P-yw|Z^2Fp9eauJ!sBUL_cO#DcZ`L{P=74@C`+vt}-i_ln{$Go1uBExzNy3vE z8(M6ea*(P#!_h$?3rbg3=vSeT!dspZ3u(ECb5M*=C%LH?B!oRld2y}@Y;d@Al;I}I zR0WY@U(skVKRek9*c1b~K|l0h5GkdFJTHW)^`mMBXga2L>|5@^b|xrZNs#k4q^KLE zx*%}pOlnRLxF^-l?(Frv66O)TJ&qzsPJfu2$q|URjIV ziUq}yFCsGX{5whl*jt?vWJO-_sh&oK!_^+)!V7TeHEoP#-X%Fz736{6TOKtIG;RoGdYew zX`u(KGYd0{xH*GaqgeMd@lhiP6nqoGgr>Rm!K#FS5={^mi=hjJVL5u#=A8jhslK^1Uo1Xb;zmkf}8j)MDrBz!L;J@CC~J5xWI zXO*Y;c9nI3%3veJn7yw^Pxdk%(g?D?izL5GO8AD~FDo$4*yR z=Q1h2Zl^#yMB=(A@X&>;CHY?|{11@EsVhWi3qyv!ha_(D0QSk2@dXCwyXGlOutX^3 z@Fhj0;?uMf<;&0f&l=2OMR=Lg8MmVv-~mjiV{_ILxCP zS~8=$0Hn*$%s7JErVL*bNz3J}mFDrvu*=x8i^4fF1&1?{sid7cZ9!2SbXgANa&Z=C z6t&Rff-7`|zRzFiCXs_L(IHLe9+qq1TZ7CV?6?EK>@p2LLskC2SO#t0lub|W3 z6R%lBDn7h2r?M*dVeGFFW_cyq+J^;VJRl4X0-uCeOhIYdHbCzN4>b~4g7&&&LONF< zJi-u?%4+5OtO?~Lv>1D14&`#(Eht=Bp5J7BXVSO^QE{fYuzPs=L8d`5oiR;) z>{sX-5A4MW8=5VmzqL8VmO)ooIf|FEUtuvn(*0A5E34w*P*l-*^ zU4K4MP*U7k`$*T5(224X7Q6?iZj5%0v`btzIZqI{Qcgj!AVBUe3P8*ROl_JuqvX}k zgv49OTJjKZC*e&P%}ivtW=$f?XS^Tsi@4 zNaqUj8efLqM8``HzmZgC)0}Uz3BK}_=<-Rwh(O;)D9mhJ^DXMVTnKyI5fMSE)xxkH zK(V|Pzpnu4EZ+o`6-H~AAVAx&U;?bj*(-j10-_uxptBXm4$niO)FV!L82H?avzH`y z3pEV%m4k`HNRA(@jy(dpQY;oabA&n46G&<_u zwALTNCd;?=Eg5#;ck_J|Zz_^Ei+y2s!#pEo9na2^i+A%Smj5x0LLvL+vDQC-Co29d Sd_Rg?xnkAwKmO#Et^Wyy>=n`g literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/pod_window.png.toml b/icons/obj/smooth_structures/pod_window.png.toml new file mode 100644 index 000000000000..f23c6e7a3ae2 --- /dev/null +++ b/icons/obj/smooth_structures/pod_window.png.toml @@ -0,0 +1,2 @@ +output_name = "pod_window" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/poker_table.dmi b/icons/obj/smooth_structures/poker_table.dmi index d0b70822771fb5edc117137dfe59ea4b2ad44160..3dbc230ad0b231f43dcfeae645da025a1b87c54d 100644 GIT binary patch literal 3282 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 U%BysU^pgUzw{f&CvGTq84}oWzu>b%7 literal 4825 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 diff --git a/icons/obj/smooth_structures/poker_table.png b/icons/obj/smooth_structures/poker_table.png new file mode 100644 index 0000000000000000000000000000000000000000..1be2da6519631c6d11bf3460442a414e0b8ef1bb GIT binary patch literal 1406 zcmcIke@q)?7{0PW5Q7M2!wf0nFvLYhu!&o+qv{H!bJ8(~xBx=tEHQI*qw88$+Jj~e zw2>bp8>@_V(Erv=p)kg#`uN)5b1MoOQ3TR4S251y)G8_mB&1 z#_PZRlbkPWVa!{~s}|Z?=)#Gf*7{d68M5)Coy45kz#|hDwb_#HH04ANV!H6;%go;w z(mo13Y8SXO5P`v$goStDvG%*Xxhg9BbomnI-&OfAmqVWa0IAPOevf^{$+_=HPpzDc zMwkF%F8H;cMX&S@BZ1KVX$}24{JfcNT#es?DeEk{4}qR+<=@eHnhrL=8_pz>2~oZ) zB(ru7-A*vOo~7I8o*_q2aVwGLelYNy6IErqqts0&$m%k{tJWzSfk>Em&5CYSdH$_~ z`f3-%^So72tv|&C(l#e}iT)pCg*TJMjWnZ|Jt{Zdl_-gtv#^PB_E>^C=ij{banPbOpa$J5@p}ddnqKXxg^YiY2V+KZaSeC$V&B0Rn1( zNW8`b!lo0!VZiK z8fCMcW<~?>R2S^Q8P_JxqOI0kaXcQr#WAbP^!H91@sQ5$+%pJ8ZGxii zpnkSa;@)C9qo7iX>%PHE^2+{rlk1DOBLI?0D&~guqMh>#bx%#Yb(ke<`r}%gqKRCd z4Li_gA1jjx{DdyQ05S4B9=|hPbo?_l&Ro!WLHXwQGN$! zd>u*w9I}<-pI?Y}^$211m zVj9+)+}Ja7@(E@Vx#P>lsQLglvz6K~vbWFmfYM=IVbYoTK&J?=kLJs(^BK-U!uKvv`)jv7wH6Z{1 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/poker_table.png.toml b/icons/obj/smooth_structures/poker_table.png.toml new file mode 100644 index 000000000000..b12426f9236e --- /dev/null +++ b/icons/obj/smooth_structures/poker_table.png.toml @@ -0,0 +1,2 @@ +output_name = "poker_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/reinforced_table.dmi b/icons/obj/smooth_structures/reinforced_table.dmi index b2867b579945ed560ba60d82157a76e4d4ed5bd4..5053deff017c1e6546d2d626ef4cffd0588cbd5a 100644 GIT binary patch literal 3125 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 U4v(or%72tFw|1H?9emyUH&(MUR{#J2 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/reinforced_table.png.toml b/icons/obj/smooth_structures/reinforced_table.png.toml new file mode 100644 index 000000000000..f7143356b4c9 --- /dev/null +++ b/icons/obj/smooth_structures/reinforced_table.png.toml @@ -0,0 +1,2 @@ +output_name = "reinforced_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/reinforced_window.dmi b/icons/obj/smooth_structures/reinforced_window.dmi index a66b648786da4aa2b85d018182c2ff0348fe5ad0..5506e82741676754947f6c8272320026fb0ed69e 100644 GIT binary patch literal 10760 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 literal 13410 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 diff --git a/icons/obj/smooth_structures/reinforced_window.png b/icons/obj/smooth_structures/reinforced_window.png new file mode 100644 index 0000000000000000000000000000000000000000..d7a4f76654d03ec0db4815f7db6e2ee7a271fdac GIT binary patch literal 5981 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 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/reinforced_window.png.toml b/icons/obj/smooth_structures/reinforced_window.png.toml new file mode 100644 index 000000000000..686fd268e3b0 --- /dev/null +++ b/icons/obj/smooth_structures/reinforced_window.png.toml @@ -0,0 +1,2 @@ +output_name = "reinforced_window" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/rglass_table.dmi b/icons/obj/smooth_structures/rglass_table.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fd0bb83c2eee40c995c57664cc75629805a4b8c5 GIT binary patch literal 5939 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 VdkudVe$OLvH*L#4x8e25{{Xebur&Yx literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/rglass_table.png.toml b/icons/obj/smooth_structures/rglass_table.png.toml new file mode 100644 index 000000000000..c4cca008bbdd --- /dev/null +++ b/icons/obj/smooth_structures/rglass_table.png.toml @@ -0,0 +1,2 @@ +output_name = "rglass_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/rice_window.dmi b/icons/obj/smooth_structures/rice_window.dmi index f5e7a6dd57ae25761550c1f32b60e2d23b880362..b418cd87cfd81919bbd070f088f3c22e3dde477f 100644 GIT binary patch literal 25764 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 LDN0sL7zh0?Gni{+ diff --git a/icons/obj/smooth_structures/rplasma_window.png b/icons/obj/smooth_structures/rplasma_window.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea53c9b540a195da7aaa79cd09c95d158bfbb0d GIT binary patch literal 13568 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 U`-hX@7rBt_8T->!R+sPmAFdl(tpET3 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/rplasmaglass_table.png b/icons/obj/smooth_structures/rplasmaglass_table.png new file mode 100644 index 0000000000000000000000000000000000000000..4752df63b82fcbd81b66848e5ac699c1c96525bb GIT binary patch literal 4520 zcmcIo4N#Nk9e?>+{HP7qwYg54XlthyYwpHQ=X^0^BFfE4J6%~%O6qpPZk`K@n!NJy zMyP|zTC7g22PS%3$DC{F)pLlXNf4Ppq`}!vE0_dKh^UZH^FiL^-SdCKi$g)^^_Dvx zUY_@P{vW^p@Bb0reQo2qSu?&jgCK}m8SB%2fqtJvKl7)32dzixf(HaKTb7ZQx>*r3 zXo)$rFyrvTjAttUe!OX2T3T*y?i;^EA31#dSNzHYNHQ0 zm};3#cagh)QRCnh&u6pVLiPbV#=&CAow!DGd!1|-GCpX`N9#)D0ojGbSdrnd4I7(P z1~oe%b*cw!QkN}IzZ>mSTO&*+TgnLrvAiE4Fs97Ky%weD6j2dHQhsX7_&K*NA z&DTn5vI_5P_wX`9C|)^(r|LUJ$2rf!+%Q}<0q z{$qqnezkq)tuo8$!G=cr^VxfEl_{Ri+@b5-!|yX&VRI-o+xMlfyT|jC>hd0bDTq+z z<$sOdOInej0%Nj5i0ucY5!nD~;7%kNR?OesX!|rN0YWvR6w_mm#1hw2rm2Qg@{P&o?_c1#)P1MTaelHaiV1!+ zAOzV{s+%Qqm31Y2z`^$FYELI533v!*jvt5(n{$+fsu&E8GrfDDrdh+_Oo?Y9x8u>f<>fx!mznJgec zG}FNr_Dzs(9K=Uaa^OP1U32VV(+wvx}*d6z!VH}_kbw`(wC@& z#GtE@q_%=pW4+9n261WL_VCz8WB(lY);GXLX*uw)gko@xPQ|XNYY_d>A{|YcD4yRE zbn5qr!*i4vcqp5a#O6u}bSzZUC=b3RSssf`Vw9AR?N>wO9*x=5vBAuIOelerL4iW$ zO*q!mwR@07CB{@ z)T!;ohOg`UrQUS1{%p1@J$q-h-3zN==)LoOOP%TZHv=b=MV%u}6IV-sl@DDFN+Z|i zIFCIZ)GlkSoq_7J(pj?j+5}UD!PJ|zT1n$Z4b^i(fRkRQmN~rd%i8I`)|vJ#VxI%3 zfhl8#57>YtMKN^OyEZxk)l8=I%Po$0i;?w;aZ7C&!QQ$bYy~OY2GS2zmMQ^kHM2EL zl6D@!FLb^~SnHiHavfE8XXG5W!HJ<0UNL&Tb>zEv)&zY4qYwTT^n*DJhsK2P6hNbM zrju2o;8nGaF4cw4=qxb8;VMHuC{ze1bsCrXTH9xMG<;dwZzB}E)k?uvlf_z7@i$U$ zWNz?Xl4bz#w7JCt>HkDtVo!RP8gJ*7+%FHPEerVcLfox2^Cva*B6FoGoJcr6^~5mS zCxxa`*%3!td#kJ^nRLeyMO%w#y8fEly-?_Ou8Va7$mJyS0V#RX+aAY2CiM(EIfh~i z$!`yY`4QjJ{5S0dYud}$?O9^jYdwt+W|G@i9lgcP-G2jgpu{jnyTn? z9Oot?VNj4r9;=hsGBj3$W*#99{y=P{g^F64n(a{!-+jbXJ0(i@;8*envo+h+_UQSoM9-zA`j`U@= z>aLDHC*XoIszibtWposQTF=e_+)oGixLHJ}L+CpNApp}Qf&t>u*(lCg^@op%)W)D= SJNgd{k+F7T+9yAKyY#=B2xM;n literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/rplasmaglass_table.png.toml b/icons/obj/smooth_structures/rplasmaglass_table.png.toml new file mode 100644 index 000000000000..29f4f3408cbe --- /dev/null +++ b/icons/obj/smooth_structures/rplasmaglass_table.png.toml @@ -0,0 +1,2 @@ +output_name = "rplasmaglass_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/sandbags.dmi b/icons/obj/smooth_structures/sandbags.dmi index 8ac099555a81b56e9f33d225565f454487bc523f..d5e1d1877da254ecb40e0da2b96e68316ff1da48 100644 GIT binary patch literal 4328 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 SxQ+h0z}VS3*;H8h-1t9CibmG} literal 993 zcmV<710MW|P)005u_0{{R3dEt5<0000IP)t-sz`($p zdrQ=+bifFDZ*Bkp zc$|%sK?=hl5JlH|3Q5+M8r^nN5=s`$9W0vYq81!!u3u@OyW-!?hsWnJ!}Q`h-R4D% z_nE(arua(YBFyQ`*&ba9HRyq};Nup`5vbVW>)0t7JI-9pRFmRt&GzY!`Ns?ZqXEVM zjFJiPX){_9;L~Q5+yNgC__TWr&{Ow=2qnab5G6vKRzRuEXn-*QLpHgG-Tof87t=C+ zzvTm|z1d6_me7y@00O~DL_t(&f$f@MZo?o9g_|3Ubr)!T0^}1k&Hc|bAko@{$1vFH zDh*5fV})-Cyx5P1(@7r_EjKdYJb?b{*%nA|4m{n67farBVSlv-?pN8l$sMmkIVo^r zp0isfp7}!vJnC>_=d!!;&WV9X9fkyF%RXQEEC$jMNC3$Fz^J1PcxV2S@p2u8RpNY= z8}9I^Lnur>Hv#F_gcevG5OkK!F@G&mS>-@f@Ay;v1OP~2(MSi>=roTT>vVdIs8a;& ze`Es1<03B}0Lb@zl|!z34wVIX#0YU{>Kg_s>Kg{iOa31L7wWHXFy8->rNCIWO66>q zm+CP1#w%ezxz9^=7<{Ai*iY{B(nntJgMgnr<8DGz(4e$eDykWpmP@&|Be@y@`dXjK=Hn#5SdQJ z`;J0nI<)~l=~TQKEQC)p_*C93R@pxT#T)8E#A{H!)WrC%r;o{7f7kPkpFh;V;Rp4= z;RheU;Rl7l;RkueOJ`Co9!C1LOI_hVzC3Af=va_b%Sno@#c^A)P;LIBzHchFP@yyb&9>_4g9C zJa3cwtmS!|biPn?o)7_zb;$NQWX*ZP3`ofx8x{xJ9K6{aS{K+6BO2oy(k&BM2>_sm P00000NkvXXu0mjfAehzM diff --git a/icons/obj/smooth_structures/sandbags.png b/icons/obj/smooth_structures/sandbags.png new file mode 100644 index 0000000000000000000000000000000000000000..ed0308c854ff8287a49cb4a8d8dfba1363bb1ace GIT binary patch literal 4747 zcmcIoe^8U>9e+a_;z(_(-Y&hZ3*M~jox7QNy(?}80y{M0;G{Yoce5ti-i7NQ1vJ(q zfQh2*^qiyDJ4QKMfm?R9pyPK=;0C@VdGEI6%Y5+zcBXbU8S9|1zL=ktAe-vkS% zxGi_U%kw_Z_xV2G@8|pZex4k9X}xh_$`4XFj$4@X>+Fr}Zyoztx*(bTu5wvNIBxOA zob0Skc3Hnq_V#l*?>v{Y`0z(HjmGS3i^cNW&Fo{tXYBI-YM-TBY0-A<#@*mN;B{jI~*yWL$& ziq0NA^2x#h+ogN2a{4S4V`s~u{eJgkH_4}8ZdX8%^ z{3Ex~JNUhZ+gConkv!JeGrWqcE&1kFd9x-`5l#!A$}f9?7tQy3mk-!>m9&ccPo}dS z{@roY=WKW{Be@xytHTxMr#-1vu{$eGH+x_flR0?%{Ik#Q2>xrOr~kNibSZnQ@ZoiR zYI%CBb1U--%L^PIws9qFR{rYM-QCBx)^_Hmf1Aa8R*`k1AzT_gJ0HtQD`JOnWR;Z} zja6eG;jso*-gGm+T+3G!Y#r%R1`S?y`PDUHzwaR2fEQzp?8sXGw8K5l{L>>vFP?hQ z-jF}OD#&-tYx-b7ZXSLrPH7+bH=^$!hZ_m~5) z)ho;Jshn9|qpuZPOnZR}f?!SI1Od{}0YKI$!}yPm>6l}I#wS1L(~y6?ium+#wJ=mO z`!=ym+PU^#d~r&vDoCds-hZ-hA3{%2siPpViU@90mp#qSkQ6|ev96VGd91Rr%c4=E z;Wo3ilShdnWm-QnXzO(6HeJ7b?rQ123u*JD3Q~vh$zV{`S|u zw@lF_sul4R|Fr>6cF)>jgu&?=POI#5RyqSCU=v53Vd7|8$gebeTnAX-9L$H%3f;&v z9Mz=Kh*GnbO(R-n$7@XH@4`PuEBf}-sViT*yHNEgCau3R+8gu^UR9r~ecoG|rXDuB zLiT|%ECL@WCxFzkGUNcw%sWf6ev6{E_bz|_q%9o8?Y(zMLrEA=j<7DPG8Qk%e5%i@&t zyN350i979a&>?sU*nk1$8FrA#Te}AqpB&m)d1oI&>zrdL-kEm-E(np*cgk9Auc|J6 zG64bL_&D4|W{bT;xW}=$8MYliSrJP?1S$~Lm<5mLB?i@9X6>Ts=NLS8kLA?#E;BRk z0bo7K7FAGY4yevB&WtX{l!%udA~m4kmqw3Jonj{|C6hUNn$1HQqC}8KeFL6^!UNxt zZO3+rr!~FOU>))%uAMeT%}j+@BsiG~%IiqS&{sZL6#96X(z^wU;`Nnqqd}^H58JF4m=2qxK7T4kvGTcH;flB)0({^y7ld1 za$|W2kZ|@JM8l<0fhZi0^(fVqJOIig)uI}D$RqHsMjuM{A;S@Hzviy=2)GWjI#D-^ zjSp_~SDBF2jeM$v*yJ#RQj&Tt9T|Z_(Gaal3KRK6a;2uts7HZ-qg35p37aHA91^t* zf^o%uhfE3n0bB5%1f2TtX3l*o*DLQ zk0IK!1*U^^cR{oxTW;-~c!m^O^a#mT1VcuO8?uJ5P4QvZ7%!Vj)a;Hgs-&Kd3i!?} z{vrT7tKf|#Z!$e0Nf{@d0dmAqguzH5WUT8XBr>GNLn!!dv22=_QY4{ch{(OjvH}ju z1GAAhij4F(dD4L3WTAU-v>L^%s2lpR#DmcI1GYrCk?K#2VX>sWf{LC%pv*bx*-%I zR(&Eg%{v)43xblar|zyfJfiSVb9p2eVuEC)m4^-;o0Kjl?xdh_TN%d|c$q-NOwlqE zp-gC5u_mY~OP!obF!m;)oVJ9F289weiQFwn4$vWSj(9PKSrSf>AC}`Tm@3Ly%oH^D z^c9+DlH@R>o_N~^ut>GoqbDLdNgPGYyFnBXbCE*GO)C0m)rpti_|lcy8Y?jb)(-k+ zd_w@9t3z3V2h@no literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/sandbags.png.toml b/icons/obj/smooth_structures/sandbags.png.toml new file mode 100644 index 000000000000..146b6d42589d --- /dev/null +++ b/icons/obj/smooth_structures/sandbags.png.toml @@ -0,0 +1,2 @@ +output_name = "sandbags" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/shuttle_window.dmi b/icons/obj/smooth_structures/shuttle_window.dmi index 9b9891e9d2c8e13a9387dc9257ea4289a534cf91..68ca36d377881bab6c0f288d13feb39f20fe8fcf 100644 GIT binary patch literal 6064 zcmYjVc|4R|`{$9R(4@Q(Wk^Dc<;hY#a+5?!NJUwOJUzA;MV6XzPY9K*Qe+!iES0V7 zWDrKg*eS~x%ZyBnnK8_aS$;R~`+nZvA2avoobx^3>wE6|I_J8s^T__9mFza9Z6YEf zvgfSNT!Nlc8$T%t=wIom9|?N!?_G8dIde1E>yB?wh%YiwL?k>b`=#x+7QG#3N4mA6 zN?u%irc@uK{t+o2(To6?IRwMnXh>(3C|JfP<%_j$j%YaRRj?3quJ$0t+MQVX>Jh!$=_cLzn(K?NU8Lnu zd6ZWF4#T%NcCW`xLZS>JY;kx3qhlIDOCcp3Ggq{c_ zUg)?SNKEkVa-|XKg_=}J{exp$fVPwOL_~H6o;zcHIXr98&9=~O=wGH0uIJ00eH?D( zsIJ9}<)xh4@%wH2+pqmbs&8MO+$DWo_-yynewibdt!EvNoc^oWqN z-h5#Vlk15>cP7^#T#6KP4;O?4vzOhlUwHkm05(y`L%@wj(5&_$nmj19NHz%)@E%g( zk-YLG3t2XQ>79-3)-pC{S~ypVHD&k15vGIkkHvYx><$vS=sDgAG~o;ech}Pz6+EjSI>@tuj{^7od$^5CmY;|2ZlYoFjTaudcUwM!@+pCg1?Ny);5uoUC%VZa1 zX%a^NLLx|ir(24?IEPS&R>!3@gtH%tJ09+n)Y={}eOAhPaStlt1O@)b6D%Om?vTTQ z6{mj9LT^I6WN&6|zCjJ@oE+Rqb6r>_%=+AQk&ETK!l*0jTFlA5dm#quxu{q53hWoMx zXNc1@1!1BwDu8gRJKDcQ4a?V#8mE7y5KV>ClaDl$VEt*2fpFRQed0Gxkn_fk*0ZAP zxfTQtTIIRnRpK;uH_%pH4L?4p*Pd*$cPoBA7>~QXCFE(a%0Ds}z#J}mq*Q{Reei)P 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 diff --git a/icons/obj/smooth_structures/shuttle_window.png b/icons/obj/smooth_structures/shuttle_window.png new file mode 100644 index 0000000000000000000000000000000000000000..a5312cb8ae7c8b9c0b1b576712bc9e92e82a211d GIT binary patch literal 8348 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 delta 1105 zcmV-X1g`t|68H#^7&in10002!19#E@000$GOjJbx002~1T(-W#+1}lPh>tTfHZwIg z%wOV100001bW%=J06^y0W|1Kxe}s0ebduEAg&S!R7y1tsqYe0gHt6qLbSDVMT~ZFr z^xnCXLa*D+cCVY=Rz1Qn#`{gLw40YId&Xnxr;9Zz>q9*E>2n!Vm%?<+Q+K$8S(&Ts z7>9BCA}Tu#-8Fp9Uz|YBK+ZzWL9T+_0&*U5OUTt!XKV;{M5rY~JrQb(e^6Hp9xvLX zp@Lgl+ES}6E$!$qIy#LNjsextQ?ETO?WvBQ>R8j#@<+OOyr?;1If>VW!+km&?+W)> z;Xd(rNR4+viI+i1|H$wKgFQ08Q(5SC-@IS%7rntCeE3eE000035J^NqRCt{2n@w)p zP!NNaMY6Vv^Z@=jL4AS*fAU@d+^)T;?tg^JXaZ|U!R+8kwhNIv;?2_sjQ~URJXICy z+h(9OEf=rf9#{wQhTM7$>ou*@1&aJ;BfWtJ8fc(_1{$~w;C`U>h*!XU5c^^MZd+By zW}pLm1q}5~Lq66wRrUMlK)={4;AegJDe|$ttE%VkmsiG*mc0TFf9uaeAM00r!QpcM z$CkYW9%2j8Q%j%UE**Sr*-PMCY$1AX>EUwwfA27QeTUFe@Z8dyKEqRA&<=`Q_7d1e z0D1x{DPVTLyujq^cLvrN=W5uHT(4mr^C4xtB`SuyJ|B{Yf0rimLJ0iIAl+9!Bo6@cLL*^gpbvO$@BI@1&}&_5X`i0R&)U*H zACjN7rAKJ#ar%~?)H8em0QxfENcNi=n6FO*Qy2V)zqaVFu6qMzo)Z_Wg{MHd5mLbP zegh3O&_DwXG;j&PnD2I5^lBc6`H%Ml5W+}x>+&oYM(|IquE`iw#sCY)#zcY~H zqRNYu55;^@{F}(i)$_lN1{!Fffd(3A;39!B-?3NqX<#F~s!szu;Z=Pa_$0ilPXpc3 z$y@p&ysCeEe_*NCz;vL@)!!ee@}S6nvYvp~mZz721{!Fffd(45NZ@Xp^ICX572g}1 zoY#tzumb_RoY%thsR&%>0ZRyAzo^n139C?QG0-qUJ zd{X@?@T_@(T>o&u`ns1usxN*?#GOhh3$>^svhl00000NkvXXu0mjf)cF@d diff --git a/icons/obj/smooth_structures/table.png b/icons/obj/smooth_structures/table.png new file mode 100644 index 0000000000000000000000000000000000000000..b5acd10b4b8ddeca1f90c9dfda726cc686700ae2 GIT binary patch literal 930 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 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/table_greyscale.png.toml b/icons/obj/smooth_structures/table_greyscale.png.toml new file mode 100644 index 000000000000..6a68ba8bc4d7 --- /dev/null +++ b/icons/obj/smooth_structures/table_greyscale.png.toml @@ -0,0 +1,2 @@ +output_name = "table_greyscale" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/tinted_window.dmi b/icons/obj/smooth_structures/tinted_window.dmi index 85e27e09a67b87e80d9a1dfd84abff4b8295db90..53f803c39422976d4fcfb47f1315ce40dd6352b5 100644 GIT binary patch literal 12130 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 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/tinted_window.png.toml b/icons/obj/smooth_structures/tinted_window.png.toml new file mode 100644 index 000000000000..9d8250aa81d0 --- /dev/null +++ b/icons/obj/smooth_structures/tinted_window.png.toml @@ -0,0 +1,2 @@ +output_name = "tinted_window" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/titaniumglass_table.dmi b/icons/obj/smooth_structures/titaniumglass_table.dmi new file mode 100644 index 0000000000000000000000000000000000000000..43bf24b5afec4109bfcf3d8186ab17cad3e6edf5 GIT binary patch literal 6403 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 HxIg|EdfDza#TAQpd>k+$(= zNrY)Iq9QS)GBIOO`6o3k>1k=Xxw(6G`+mjnvtRpv{0@QXtSp!%H}|EN(th7kTQiT^ zlABfhMscy2f+@HB%0Rv=c6~%F|PLtT)Ej3hMf14N;(?#hMb{$va3efi#gV4)e42!{juN$<|007oJ=Pt ztBKa`wXM$)lW4c zepMbFSK7suz2gv%gF&>%R6?-pnHcXED(^FD>pVeEoHau=DV@7-NOT3~Sfe)oO?acB z^-_-&Uh@PVgrS{M1?B#$(x|zVC%ay4%ekkdzY$2mf$WobgZV_{IX+9$2 zl~3f6wKyueJmU9*jB0Wz&?*qfB7m`H{$-Nv{t& zIOhUDhM>TkJEf`ed+Fpdg~($Q8FuH;OP!ZR%r0L-APa%P2+8?kStgyVJ!G0_O;Al9 zQ(bRp^Q?_DmyvY6uraIDnWg729wh(y zChs=iA83ha@?AKogLh4hMI9H4ZCVzNK-M6cEWhTX%gBTcK$T2`vk8nC9@ILOhkWnb zL|-IdFzvMfPqc-$-XLYW*z&;$n~`e}0vL&FS9SgHiFW}O}|Vhz=? zE=hL{!XiJ0^5ot`ittT<;)hltlpaW5Zc$>nS_pv@ObA$v5aURQzExZT^1VCV14Az@Zp(25W ze!I)_|2cWsfB)xf(jiZgIJYMcF|E4`!A2sK{?}OA87I+0oR2_-B2NHBiIP-SKXDb9lo54y!-d-c%-)bZ+&#h{7GCaBles1RcPonXS-(r-%*~t@;h? ziX@9bdcI8id7L$u(|pWmM9c35Z4%r%dCXLsftuNc$jxlo6Ikq4@e3ChOjgwTJTKEm zwF^AMl$Avtmxve?6l^JQsl#dvbQ$C`YpC%(1@2p|o=o8>5z|s{whAl)711O9wpQLlTQ%fyF` z_69?Z{J|P>xdqM5YF z7FgNlKflHMW}PZrjM)spMoOB`pZF!ei-}UZ5375;h&@*yX2oQmR65%2a|Vy+Fy|b% zu_p;9mWZmn!~M5QULAP&n(hO4=~rc?i5%(hrU;3vukPw5o@+Z%M}Jmt`LWLYccBQ~ z3l3J4r7ls_i%k1vy-Bilc6W`+v!DJ(NtTlhVFvH477lMrD%8}A3>mWiMtKZHrOO80 zmWnb_CHG37%9_|Vx>xg-(YP|z?3Hw0=67j2u#iD#rrnld*QOmq;GojIJgYg~S}+k1 zgl{RB$fHKGQBP zOGm;Y)y^vri>o%TyuGxHud^)5xqqO^i0#^Rp{7-UiL! zk<|M|ZKt^U0_LGWvcqpfN8ijbYk8CAbW6d^f?0^WKYCJ4M=H`&96$7wgeyz7jfM!n zzKz<)>vi2;`FMO%% z(1XhyE)ZPbDpaen)C%<69m?6E>dBDc)zrk%K!p^7+hDPkbtn^dJu+VtIoj;*xkV`E?&C z*4%c$e1xJMjh}0LZHWIo$_xbsN`>|GpQVW0BL4)?E@d`8TGqI@QYHaCB)&qPLE?q( fqzKQ-#Fc#Bub=zfM&D;XB4hKmv`>G!@94h)iVfC5 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/titaniumglass_table.png.toml b/icons/obj/smooth_structures/titaniumglass_table.png.toml new file mode 100644 index 000000000000..d77b867616c6 --- /dev/null +++ b/icons/obj/smooth_structures/titaniumglass_table.png.toml @@ -0,0 +1,2 @@ +output_name = "titaniumglass_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/window.dmi b/icons/obj/smooth_structures/window.dmi index 4b78390251e04e9bb82cf19b877744d2ccf627e3..6dab5136d41f2203010afae07390a7ccd7143b2c 100644 GIT binary patch literal 8026 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 aU-!S(l+J$CNBmh%qN{17QGMSr;(q{eM^{(? literal 7919 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 diff --git a/icons/obj/smooth_structures/window.png b/icons/obj/smooth_structures/window.png new file mode 100644 index 0000000000000000000000000000000000000000..e06498a9e3a82af4834de7ae9e685c53b5dffb81 GIT binary patch literal 3380 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 E0RF?Z2mk;8 literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/window.png.toml b/icons/obj/smooth_structures/window.png.toml new file mode 100644 index 000000000000..7ae19716bb6a --- /dev/null +++ b/icons/obj/smooth_structures/window.png.toml @@ -0,0 +1,2 @@ +output_name = "window" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/wood_table.dmi b/icons/obj/smooth_structures/wood_table.dmi index 3c72c11c59172ae49f9867c3dcd26c8d468b392e..ddc65b0c739d5215f04c509fb27d49fcdbd78ea2 100644 GIT binary patch literal 2405 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 diff --git a/icons/obj/smooth_structures/wood_table.png b/icons/obj/smooth_structures/wood_table.png new file mode 100644 index 0000000000000000000000000000000000000000..72dc68ce7c35cd341eb0113650c355ee3a16e02b GIT binary patch literal 966 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

    !n8e{F2~b$m3QC|nDiS&nlIuuDZ6 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 literal 3817 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 PA;S4H4|XLhFzLSmfKa+S literal 0 HcmV?d00001 diff --git a/icons/turf/floors/ash.png.toml b/icons/turf/floors/ash.png.toml new file mode 100644 index 000000000000..9bbdc460b4d4 --- /dev/null +++ b/icons/turf/floors/ash.png.toml @@ -0,0 +1,14 @@ +output_name = "ash" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 40 +y = 40 + +[output_icon_size] +x = 40 +y = 40 + +[cut_pos] +x = 20 +y = 20 \ No newline at end of file diff --git a/icons/turf/floors/bamboo_mat.dmi b/icons/turf/floors/bamboo_mat.dmi index 1e0b04bc3aa4c043399487eb5f741481ceca69d3..c2380c5b874f23639d852024f33f2d23929f286f 100644 GIT binary patch literal 4607 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 literal 3843 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 X;o%o@uW`~U>2#0PbX2R9t-}5f-++PX literal 3481 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 JwVi+Re*iZ%>J9(^ diff --git a/icons/turf/floors/carpet.png b/icons/turf/floors/carpet.png new file mode 100644 index 0000000000000000000000000000000000000000..b69bf87a4d052df2df25bda6f5a11bc1188393b3 GIT binary patch literal 14564 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 X>rv$N=u7x|ky^9DV|m&iefIr7W<2>% literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet.png.toml b/icons/turf/floors/carpet.png.toml new file mode 100644 index 000000000000..13916473257f --- /dev/null +++ b/icons/turf/floors/carpet.png.toml @@ -0,0 +1,2 @@ +output_name = "carpet" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_black.dmi b/icons/turf/floors/carpet_black.dmi index e2fea9085b2303c8e0128ede042e5bd08fb56ac8..7df942035adc44afaa3dc27bc1cc0ec77f5f309a 100644 GIT binary patch literal 3806 zcmXX|3p`Y58#l)(qnojsw3QjY5k>8`7hQxw7?GrgaS64x5rvgY5ofeoZ5P+5+(x-y zM@fpzsMey3F|Lsen=mtJFgG*K%=wP}zVrK?_j!NMdEfVW-sk=Q|L^(p$YILbRhw36 zXlSfG=bHz}3^`JoRUu8xwh@A6w2;%h=m5 zWH8`^A_9RhhIG{A`U-`|@~nx9Q`68&jFE=I=)`;7bT~#qj-PMfi|yLFvSHkjDjXfI zWv0+?(kJz&5LqmltWvro_biE^F?$54f3e`4RW}aDUNY{Q5Myr#v{<59bca_`#O0q{I;;eXHR3&b5g%TYa)N+# zsO8VG>yNA80dO=;;&&2!jm-Y3G0A+xG&wQo(ZCo~+yLK_dNMM$rL8A9twHw#S+Pw4 z-)Uy<3b(k){o#b|&)))>NR0e4Nt`BWdL8K2=87b`S?g*bwZeosk@0wjsQ=Q2h)HaX zjHc&2%k=g5@dkTf>3}W#4yGBVXG62X>);`F!X(mt`k73=lo9e*NK_*f1rTNtZj~&2 z78!~E`#?icDSoA*@zxE1>QxM-eVUazF0EMf^_R1}4+9lo!-ShG-{@Lq^+*dZe7U_P*Cb zR-jAU3~865EBqc22t%=XSo^7cbZ+KXd9i_~4rmC)t8>vAqlPG)4M9V83mgg59bwd# zESZx0Pz=lSpiY;&V?IU0!Uq4opBEhpR~RD~#2ofMjQrgL)(ESyfBH?qWxll1=bIBE z_r&v?3)oX)@=bcJbl54xHG$>I2OH@Bb&fPMAbJK5=c9svA|(c7Kkc1Z%osy|B42w(?Pwqbp?i# zV9F{@t>fJ3>Rqs0fq5|9)RP0hDqP*X33Fl5!~Ji>@% z8y1@+Ogsj!4v-GF*a_x+KQ@g1c}K0vReKX>7h-N^%#OxnK2|=z9lil^{cy6^akLj< z27c5R^4?7nAKnvbJ&$$^ch6;aSI3l8t4I}!)Qbb>Dzw~)V`J*TVe*xQLwCD8RflqB zILQyajsdB@w}?K+h)-CFAesmc2iV(UgUe8Rcvc5f>2B&N(6etVGtbkFxLLKt5Pxq{ z@I?LDkqYe-jO*%n^y4mNE18uK$=W-gq>sC-^5ua{UUTC`YzsiCpJMT*Z zv+0GMd;1udvh-}xs7?!+U70;}K`&_UCn>tCP`e>xu zGg@7%y~vFz;Yue`2eqh+cLYPTO+Wjbqf}Nhnp_h89^3s%A>t#OT3y=4lo72`RL>f2 z!Q2H-gt}BtCkb9j-#S&Qf_gd?L3xO(pjH181|6yrfA0KTGTNu67WyvYvyuclW%`v`9lb2NF?gA-! zIkvd^qs3ou6eC9Cl~JXB!an@E444o30d{RJo@6ubP6JGMPF{H^beFPH3FQ0Ms5=DdrT%~JLRfoQ5By*CJ z=;giHVU^YczgaC(L{KOiVlB{%;L>$B0*CMMa&2)Dd3hR(%$CiXz`7%FWom!bci4)- znZ|EtARfqyzu0pNXEE{&{M(>D!!8L)c1gb{G!WmhOZroN$ z1Z0)XHbm+C3{nqLho*(nKz}~688;`bUh3#GcJp9xdf85t!4Bbh-6h`9YV5{V8%DYE zq6E1D=Bo(1Vp&x-JP#<%1=;*f#MKN3ABL!cO({iw*TXr|sCz)_;B=@|ULqlb4j$NR z54M30+^y?@2Nkwr>+0KdE7z;9pWu!-w`H(3C(`O3EDiH=KN^~VH;;2;RzlR+F}Zn+ zG5A*NhlN-}n0wEHC${!~c;Oh}RLk3QgKT+c%Hmd--;>9^tdAf7?WjY@^J?9sT$ND9)ZT+_!lDI0aVj!R1$^l;xuhMVjvJ$sb z?#`%}uU8!ID*Xo)cN{$JxQ4Cuz#bTc*IglR@-Zqph0HYDBL{3d)ZFN+>J)ma3MIhp z)Lo=1am^Q^KWzrW&b%isy15YO9lKn-N?6~&prI6J6 z#G7kVe8QY_Vw#*KfCJ14G~Hd_i}v}x>sXCRo0NMKj})+_;-)K*9wwBsmkCIAfX(+IO?Zh0@EW2Ua=!yjN_U~Zl z`3bMV=A1vO#Byb|cqn+Duq*q+EmRF*LZNnXH}4a(o9EV6!Z&viqAOwI#qkxXCI7ku zi~l7C7iBv3JsgK#b1mBM8-O-VOc(Q=D0;=A!T(@LoGY1ujKF=X<5oi<2lfu)7uc7? zQ^VUMifxKc`5Qr!l^6qaFrV#V(Dkq`ogDW&Jrxgh^9<2L4v{z|*mgAACt_#r(kmSk z?WL;}#d`#rmMqF~BQp3iAt~G<(}~Gx3Q^D8QqsGl8ev?IHl|_O<%_yTaNEH3yV3Cj zo(q)lWr)3WiZ-TJaW{hwMn&~@wrDrc4~T(s6U%7Y^FWjO^Py zbN2&PLh+>{qcc)Z~m zPp4uOUmur%{v7Z|Mb~KEPE{&e&&;i$mwRO?bn%`ckV-RMIAWj;jO_jwy69$6l;eMn n`_%OwMfW&-OW>TkJY^OcIQ(`L+w!SF1APuU9(Jg+KXK*1x#Q)Z delta 1873 zcmV-X2d?u4Q|je*qh6uyn#WzwwVPxrc{j&c_ZMqaQitYT$Kle&Du(`;9;)^k;%ZT{!QNUzG}_c!PRgt?_T;3P7mtfYxAeyMELe1+?w#?#|bYM;oq+N^XGj2YY~Lchm%6zEh9$F2+t`~rbYQo_<80_2ooJ3OlA%B zB&O5NNZ3sSIe*V1Ld^&}m^0L4eIp3xAqeJ| zGmYoxhLID3XnuVEgitP=vmYEDB|$hZ>aODb7s5+6z<+N)_?5!~mVZz3U+*sn(@QPs z2m3CcBbHBUyXF1G9KryFA5;riJ|SGvat7x>P6Z zam0ODo)a1atJZ2bgxQEobtz$sAKT3d5!58;iLNBPy!m=HA$|zE-qd)2`UaFRy`9to zk<@LM5`UqN5jNQX&!(PgdsD{Jm{XlJb!{d=~_II;CM6FMeozITX<`A!8P-6t|k*n84({7Wm5zV7OZ4p{| z@0uvI7sDV7=bw@d??2N9#)o+s@alzJd@pC8V0xmkYMzH>w35`2bW(4a^LiB@C z|HtYlLgoie{}-$e%^~_h*E`1R?Kwn0sQJH&dXMmXKtg+jp?aHer?3gp53+3}!TJLc z?i9bCu+0c7FI^5xc)@RWZL$T};eYFp5c`2lmqnWq5>M#%3uAEx!lmCA)S-~eSW1}p z1DURhgb)VDbX6pTFc_v+6K=9o{Y5AVcRtnpLPE8EPeQf+P=ssGH1w~xJRjlOGY$Rw zG#TN=*OXAJcM0cyp`j_ER&NuMJ)<;?dWR7EiFSWc553-*!(C1^?i}tC-hZdGbjt;X zT7M|QUE)ay+4l!=zbMOl%glr3kZl-k{ItG574w3SeSZ-5i?Y1ee_ZyLx`e&&54HWN zn4byh_XlzRDa(`oqugI=A+Y_X*8Wt?PlUrym4sTb{if`mHxd^8O@v6^>(1@+mp{B^ z=1B$_v3=$O~K8Y%<00000 LNkvXXu0mjf;t#1^ diff --git a/icons/turf/floors/carpet_black.png b/icons/turf/floors/carpet_black.png new file mode 100644 index 0000000000000000000000000000000000000000..57f7eaf8dd9a5ac0edcbb84068600f332150bdff GIT binary patch literal 18591 zcmeHPeN0nV6o0tI2ni#KWXp)UY!b4Ng}5b}ZH{IOicCY7vDsuKbYrvrF{s6^ zjl0_&_to;;s^z(h_Wx9KDknQzrBZEt8+}UPw{5$=o&tB!C9|2oEsZk>2|xfsMU=| zqlxoD>3Qi)`uN5MzI>R~O?x)Y*@C4v&uYgO;R{q_9e7mlDYzJ`S(xZ)vhMyd-6bS@ zv8EL2r{|8|_pH#A66=U?`!#zoh+XgBu1{^FduF=sFh? zq91-soQ|)Y$nRlx-zcOM8tBL|w1o>zDY1`?vwxr@REODYk&oNuodVN1XK#D_uT4#^ zYcg-X2-B+>Exj4rbvpgsyIaQ`4m3Pf;K6mkWH{u0rN^XLeZQ}NHKZ~?R=IN|1yV=( zK<3Luf$Sk=!#}uoH?2Ou$2*vYq|w>cwYj{!*6Xd{d~hKdX1SWG*z@(Lnr%;v=Lh-- zef^sN0Uik+>5ZXpbQzf4i!56&&$61|9j|NY-Cg3`3L;1~_cXa~b-iBbSnvBz?mK>K zoAFj<;6;e9CNC&LDCd<+iLTPrAipaPhak4pD+SR9Tv75f#1R&hpQV6_9((fEH2f< zW0Gy+2Z1i#G;3S^t}&ka-n1|M14gZnq-E< z#UTd>71-Re1~+G(;0(M!Zp<6LXgo+78y-nimwl1s?p%-0K#a83C2MTzwAfM|GeSb+ z3xSh{A?X`0bwg7pzbkDQaH$iRBUo?=r}e%&`UbR$2-C#Vgenzr%cMP)%HhrUfkJDF z@@g1G#>1bG!zg|*5_~`?fO+^qZn2;5i6NAbz>mMoIUb0hp+Lwc%XnxJJ4tigJ&V+u z5^;G>?<|-K!gRGVwLf%|Ft4+hFv4{n351O~CqlFFvPD1<0b2w<96fP-K_z6gGKLcn zW0QGTq0e(Pki}5ba151atC(Vg4QMYegG0nZ%SAaqmQ7>@w<*Wy`5ydyHunjfqyPbn z3~^F(<)J;H$9r5H&*meQ+f0~Wye=9{IDiazX%OpdzE|y8fmDVyr~{!mSUn7>U4~fw zNJG4F3}1yPESwA9INu?%K$`RyWi(+ea zx7oMR{#99ycOZNcKENFk<)JBPh`y`6n{p&yEpVSC*x{Yx$p*ufm_VtLGNRzd(=@XP z2Qh452sMYkg2PE(SRi0EL3&uv>|Kz${~dnJcqLq6mio9}`DMe_4X$FL{r6bX4bRuP z({z`4dj;){FAhFal4So!`5EoV+8`oLTXvv5e}W-__v(}OO2f(|`!1Q%3UGqbkBt!P zvZN@jDKwM;aq=}lOka#&E#!)AMJoVA;5d+aY2gF@)A$XuH~3F1V8*}cm>`_A5q7Oh zFajfsg0qZtLra`@)6jLqdG&-2(7a(G)Ia0tMln6A(6lP-A#8BeA7*1PORc&0OS5^i zxecEhmwDq;n@6jcoQUn+S3WK|)9bC_;z|;l4W`;Fj`Nx+qUb=GV!bR*weQRgFTKZf*HytnMC3=iI6VARRFY} zgc9&{ekeqbHeem^&)8OZYfnf3i6V=4Taj*rnA6jBuf+EpE(d@k`JHEh@ Z^umAl@@tCGKOUlT*W_jY{Mx%a{|8MtYG(id literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_black.png.toml b/icons/turf/floors/carpet_black.png.toml new file mode 100644 index 000000000000..a98d0e0bc605 --- /dev/null +++ b/icons/turf/floors/carpet_black.png.toml @@ -0,0 +1,2 @@ +output_name = "carpet_black" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_blue.dmi b/icons/turf/floors/carpet_blue.dmi index b909b11f359d9829cf7ed5ef3ee73fcb0c03c8db..6eea31902c8d2a4445ecc2fb62ee30fd41a3f3b8 100644 GIT binary patch literal 8306 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 Kx+PcbLjNCE7hdTA literal 3273 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 Iw;WFR52v)#{{R30 diff --git a/icons/turf/floors/carpet_blue.png b/icons/turf/floors/carpet_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..e81e56cf7c287ed7071e3375f1b44bc200bb2852 GIT binary patch literal 16491 zcmd^H4OmoV+8*T7b~RJv=L1@3P^}0+r zzwbHceV*sO@8^Eo^2fOmV@LmbG>5|(JNt!MFXP`&@%N!$jKY6E5+>f{aDM;f>{-vw z=ef1ixxN4J><=HFeQ)MJb`(X-niUrpx8Q&9Cz<{jP7cSP^>pcl3+XO#anC(50w zJ4RQ(7`HGvDLFZ+nr`{xN@@MHLe1rN>0{p(t~xCA&um$<=(_U6O7r6FX2bq-#oLE` zS5``g_;Qi3%#cI#??Oj{hLljraLj;#K5eoBIpR(kR3s3QmXP<94w=Z7Mf}^80 z7S=S34>L!a{^lVRI=_HwmH6EG^YtNudai4C?(f9KjkW)}@oBdDab?3~-V4*F%-yL{ zmFsr~CA^#IS)HgV`<-8OX!Vxy1&4UL&^y~1m}hyl-5BL@xKSsYoy$#ZJ{NGYVp?9X zXy>0+V!n)@GIyFXv@)yx>Tfib3m$llZ=E>uUMxp)=8OFL2tmhV9L;Ae0lYs_+QOdL)+Nwh96M}l*LtoYg zjVcL|-g;1Q$xwYd{yt`6`CHtxlP1bJyn=<{rCFBtMR);TA>YmsCv2_ZpR1&=qO6r< zaxLYxrv26Jvx;?|+{WA(^9swc@HZEU6Yfq=-gxsV%Xgam-L=1!=+}gAjWOQk*AyUf z)6Ojv{KeN~J+OY_=43%jhHgwp$tt`=j^gT%)!Ioi;r6w=oR970f*-^DO;6T_{_SH5 z^|-Fk?ha+gpm%MLL9pqrqf^(m&J=F+A5(XFcUr}+$j~oCs`jl!WYM(yqBN0X(Q@D%-o2%Q?Yo03zRv5-cKahKkrwrsRTK^AqnzC-ysXZb?+NSJ3 z3~FbQW=wnQ7DH<>SG(VG!PnxAxSlAjh}36`zdA1|{`!-6?GFV$+D8i8CI~t-Rj1>< zCe7zvyS~%F%gy2M&F23q{6>-Cd)oTBbrj{B^^N!Vwg>oE#jaJ<7j$fVc>a|D(LIk! zj(;)ZFUpRh153@HuQ}YLO~-ws)sw5VDZ-mi7aL<0L-|auybWnY=-aZOlJ zW_lq1pj>MfCT~X){Os7g0c+;NKbAuex{UCYW(auWQ#x6?mo})MTb6B0C>m|5`qk9Bic|jXXe=XLqETay3A~VPt}Azm`O#Y`ogtz82Tm9+GxOW{aNkS*D6CZrqc4Iz<}L{Zdzl zUceLfb2>5~r>*VRoUUurOH)MKZj7C;_blxypd2bwxOSs1N|LMlQ@%W0x1nNJnombr z?Solue9QO&?-Zw*=1Hnb>rlZhiiTxW56jyQ{$L7_i{j73d#U%RzuWQ%QZZF}edQTU zLiR(6%{+u+1Z<&8L} z!yEK-xqhN)Z$a25ne~e_%4xh^o*IDV@Dqd&!Y#Fp%r~VU`r2hY7{hy1(#7)FS4=}; zI1#}tf~9l=W4$s=&O{V`xT|D{cSY>g<6GAL9R+Ki{Dbjx@G0JHCm+%SldYnTUsdIHqHs5WnA@PQxZXBH*@th&=jXVaFa>0XWI; zX(w0%PZpRm8@%OsO~(&Py&N=41#E;+S)4%mF&=&o8UDL=7x-+=?ilP$;QxiP4N%B`4p z{_zbP0-&D^=wW_4QeYILrn6v$laex)#FZZ7?Al3Hy1C_PXk5dXdp>JvlI z{Qv?ER*5M~V=hH`N6dYi_&WlN)DWtyuJKGDcQtZ6mFB9_wG9I-@s=z3KCMnU^$3>o zrqO)DWK-{rsh<#js~`iZgpF?g#_^u=4={R^k$H`^yP>pP%kcU};ybP)y{!w7cG-B7GN6PF91JbpwRA!y8Xf8*1 zijc6mH&osPEr@*MSQ|b!QXNzBTDM^yuM5`jChL5JjtaLE5>j&uT$ zF7m3%P8+}$9cddh;c+(%Q*u7@D9LxgA>E)^{hRX8FPkvB1dtB|E)GSZjJjMIeK&%i zM*Y0Mg1OKgKOxnSbc9}^{_7lq{W3A%ldA8&w8xs8r?O1ApjL8_15{1G?eaelhVmJRM*}F)j459oZ-?4xs z0!KxF!5FvI(Sel6E_A|FTRWcI|5M-bAVhsfnv1+{D>xUi&|r_E9l&e4l$_)QpyUT? zYhLa%pq<|fYr*QxGGf;iwUl!62urtaUDEC?OEVl zR>_C5d=LI1IPXA^>J+(Zbnn|K=%jnuQNljUCXNNW6FkaoTZvgK2l!^0`;w@%Q8L}7 zDa4COZ$e|PFC@@=d7}_Ub!93yE|1`(Hb^VVEGl>pn$3TuhKf4S#@~Nr^r@0PFFp?3DSR^G$n)^QFp$a{Hp&f9`Lk&Kz5Q z|80bu>bTw+ue`%r)(e36|5lRiA7hV$KF4BjTa_Hy#esW~hbLr>bG1f0WuT}9cDG^= zVWn-L^qtMY0?n0sAqTEr+@e>uK%>V1?}Q2uNeTY}3bBp4h9-GUKULPy)>9FwrrcO=k3dNZi>f7Hp0sru$?!S?`HynSimAJQ*;>G~2ypS}_T6 z#D=B{g_O1l#V{RLNE%AIq+KVLS`G~Bh9Dz6ftNyTPu6O%p(_wT8cM3%-|~3vYM%BVPNBGwthS)3qCDU z31e`9o8Sp$C>a)5^@n5Y!+=)#^2ya;JGL_>*b6Oe7hEEkXgjvE`+y5o{>PMfCxSPt zQju8NsfP}@Zm|U0-ZcWuz7O88UUL;eY$u9vg%!-yg6@ZkKmfY1BUllQ;l4KFuD|h! zpJ)>107>>$Vpd$C&Pli6$z%t>DI!F0C6q3aG(Qj$lEcJ5zB`-8nRbgSC+$mXSn+e< z&DZRJw1fABc{TPOT*|w4(NR62^jKiLcvQ-sW~jqMZ0v?csvMonFrZ&B_A4IN_69jKni97SMNvk7Di1_ zT9a=h`@+gEkx(iD39M5MZEES_Yzi+Zg2WU14Jdk;kNf4ru1`V_Z&r?mab z#Df#Jd#9dMqQQJgG+qVm9I2I*bUsMFEta}ra}RMFX`b!kyP?5JLd;ZQcq`chZIisy zHV9dky0386eMdG$_E@%evE0`91elvdEf4ls7Q&_5E`*wqMdr;FI2Jj`LF)gx3gNv< zZu+j~Fd}(iYOe_`=1Z>k#8Qp5k|3vzUJeWVJ2N(cabs7D8`+#Xcn;PV@0f&bWYZ>p zAq)7)gxlS;>@+rYgP)uAnJ~sPrY-{!g?@w(B0CA-uX5w->zdCI11B%+32VwC4jfzL;97Ap zL3Dqo6vx2!+u1POO?Ed#MW;hp-9Iw?=k)uE-=oZ+waD*fh2o#rDb^Ah+rJKG>Ma%9@=q38k11Odg})qtE9^EVj%lxGjgNjCCd-~n50u7C zv3{5v=Z+E>V@*?9*HqV$R}xf}VhxiXSlP8-)=1jMGW30b&8xn=+Q_dY<5QOs6`yMz zEoY>98-wa4uv69k3Q8r2M~K;=b0GCYZbBN7M`F2c98^YV{Y)K}_{5ku%SMvA;KjfW z`hjDI1>F1EH900OC*wYH_|-bTaeb*QO~hyn_`zmrVdZ-_?GW#Bhf4P0l^6}od+4F5U;HAC2q^Lp%@et38Cj{lLN>fb#SbWB zn0As^=lEA@RnR(E=c!U*B~ih;UflPN;)FZa1gVj+m^E{>Hmx}rViP*{AQec(x7*uX z(ex>{;X=u`x)qkM7S?LCc1}mu@HjO8L`bcfsM$YFx4gRjTjdI%aat?}tVFs4iM|Lm zl6R4MNEsO7okad=SpY1tX%Q+`W_0`GyZdi$T08d{hrFLQ2O*h2 zwTy`ZJ#cEhAPGPLV2)Gs*XHyM@Gd9_EP=*{1^t>SBvB^sr72Yw)^Wz0(tVKa1HCP$9xCM?< zq+1Am=$+(pA)KNP!@~eq+BX*ps>CoF^>c7vxuSP9VT6`?f!*A!OS)(J_s-olS;iZM zul^(p$uZC0$ma*;n^tg7kR9H!Vd^2w@oXHpMclSf*o|E&&=lGnM-QlpS0I^}tkK<* v-~LhR*$A1ZQ#GVt+xx&hbHe{xew_cAdF&Do{7(cpv;Q!6)>qFhfBSy{s+Z!y literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_blue.png.toml b/icons/turf/floors/carpet_blue.png.toml new file mode 100644 index 000000000000..1e1ebdb22015 --- /dev/null +++ b/icons/turf/floors/carpet_blue.png.toml @@ -0,0 +1,2 @@ +output_name = "carpet_blue" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_cyan.dmi b/icons/turf/floors/carpet_cyan.dmi index 85e053a5a6de40cefec4a6d7f08ecf812fcc809c..fa38993c5ceeb21ca97d91fe141287f2ef91f45f 100644 GIT binary patch literal 7716 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 Hqr?9X=Bs)P literal 2883 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 diff --git a/icons/turf/floors/carpet_cyan.png b/icons/turf/floors/carpet_cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..f1dc7da076aa2edd8c3f82f77aa696227294015c GIT binary patch literal 14856 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 Wxaz8t%lloyXK7|_T6*3q`o927-wJL3 delta 2805 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 diff --git a/icons/turf/floors/carpet_donk.png b/icons/turf/floors/carpet_donk.png new file mode 100644 index 0000000000000000000000000000000000000000..eb0243c4926e1046d4c08f012e50b52533590047 GIT binary patch literal 17068 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 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_donk.png.toml b/icons/turf/floors/carpet_donk.png.toml new file mode 100644 index 000000000000..7e60d4272b8d --- /dev/null +++ b/icons/turf/floors/carpet_donk.png.toml @@ -0,0 +1,5 @@ +output_name = "donk_carpet" +template = "bitmask/diagonal_32x32.toml" + +[prefabs] +255 = 5 diff --git a/icons/turf/floors/carpet_executive.dmi b/icons/turf/floors/carpet_executive.dmi index 2c17e542fcd1981558207b7ef7c3fbbb0ebb429c..8c0528d8f28b3846b403470b130f4110c7c495cf 100644 GIT binary patch literal 5941 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 H^-K64^fe)u literal 2535 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 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_executive.png.toml b/icons/turf/floors/carpet_executive.png.toml new file mode 100644 index 000000000000..1322b9bd6d90 --- /dev/null +++ b/icons/turf/floors/carpet_executive.png.toml @@ -0,0 +1,6 @@ +output_name = "executive_carpet" +template = "bitmask/diagonal_32x32.toml" + +[prefabs] +255 = 5 + diff --git a/icons/turf/floors/carpet_exoticblue.dmi b/icons/turf/floors/carpet_exoticblue.dmi deleted file mode 100644 index f797be9745a628dd7b8ae9d58da66df63465187b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7368 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 diff --git a/icons/turf/floors/carpet_exoticgreen.dmi b/icons/turf/floors/carpet_exoticgreen.dmi deleted file mode 100644 index fdd1f071f70fb1f77a6744a8ad5ae34252d6ae46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8705 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 diff --git a/icons/turf/floors/carpet_exoticpurple.dmi b/icons/turf/floors/carpet_exoticpurple.dmi deleted file mode 100644 index c1f40ec7fa82be8d8ec33ee9b953d976514e8a03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6957 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 literal 4382 zcmYkAc|276|Hr50-f5AO5<-sB;>r?bjhQB-x6Wn>&^BXYBqr3es{suc?>FTi82C+j;Ywd}|Mm8a`EvTlyw!)d$tCK@N&h+| z6mGe2d+C!&`dfSieTT*)! z-?FAV8|{ua{VvBaF}SKT6=h}*+W3t1T&&}ZJ@iinrS=p$gyW*0M0y1R{qYEZvrGxAd76 zPmFG0!Ve9r&yd?ybo_xmGxsbUbW|_=(ptFM|%IfC+J~|TpY@+<-Qn^e`E5}_>-^5 zkyo2NC1OLvL!pzkqmnQ%e4kR z$tp)^mZZuzlF|}*V>jzwc8{&Fc)eug{bf~R4&G4GMnH0ARFKXQVA0*Xw`DOJu8~?Jl5`xjYL#Ulg`J}!R3)Ql2I45^~6=|c?XfQZn*&v2@xMc?*RoYv^`kt5TqnASMq zJmJ{kqxhG0DUJ^&Oqb#uj_n1cd4e-~TS90F%3EgENxF#ptz6sf!0ES5SsiQU6M@iR zD$$ZVW@p%ok_^{z4hyr|Fmu~8<$LE}87V!`2<`wsOJ;QtJ^R39D_1I}{-AXH8ltoD zmFeT!>#am}E-PDUCJVQ~cnvpQe3A0oA8N?fg)7K<&D!9!Sq1f(CjNMUoSi6aO&UGH z@Re$2j-aM#a9f=j*`H(=T$));X);uwVQG1Cht@J}z6Ez_yOG;*yur%=Ex0s+aAumE z_xqS=*U{hZgJ1c);8Kvz%5H=r)Z-HbbRAGTmt8!n^q9wrnBE+fjg?!w0ZdN|t6x_b zXFQ@M54qC~wm;@k$Nsc3LsHGw9q`;50C7Qj#024-`V9I2i8o~R&A~f$U%3t~f5=aE z@yg+MKoHXpq~^5|WR9_!Ok0p}!j zcyBZ24r#CzzE;f~iprLFKLe3yjz~9o8!{F?#N)LDpC+BJYhPwdcI{9D*`q#HtIRzd z4{WFKk{HdA4nuyRT3tKN+@TEI^!{{F?J0SaHg3+y9FxzSss*SqU56#5-RemS8*J3LQXx5&4*pT-AtKGD0mG}*D~mLMtj1$0@oiJoxbAI;L15E$$Ldg9p5hdv~^GGyQ>_O z(|b_SkXCgT|0e$+cKhE7((77{7X&qetPnYQ!>7^4MI8yJ$I6}E z^{!M8(5EwHVhe-*1Y<2V=zouUX-6jNcX;`9Dz7(S(PI|xy}#J+v%fpQuYzH%JW*sc z*|KNj=bD{#B{~|=ZNHvo_Yg3j%8nB*3HF$-Y6%KZ?NEMqCjfX**I~HC=l}_d1jV!u%x7{)%7`_z=7i5$nnsW^%4t_4$2@(mgy1H|FaKM5Uv>gg` z7f{pQ!>nKx-z6i{-MFG?UXxmFaA{FegLaI4Or*Mfy&NS%Tiq${DfEQ6yA2b}zU=~u zuN3Rhfz=vtfks_B$wjGH+y2>?CII4dEde?t~3Xd=VbWu9e+trhkt^tYK{59s#} z=>Q7^;#_$9UqG?@1ezFZ{Z4SHcsgq8))zp7+$ZqZLhh?=dOVc8ch_@o#mK>o@{Sns zkbZ6TEM35;v@k#GLhG-Tv%*HZdAj@l$8y7No(TwXN4gI4_br*e175EnIqUeM zwX&;=s1>B9eY*BRY3n4x&nuQHMD3Sdjla^ig7bF$HJtayj%C4-Hve|C$+0!BAzXNf zuk!<6rZaxl80r$#*+Y9}QG(s_)PHBD58N$41XsYKJf=h{HBH|s3$0hf+X5Ev#fJQk z>ot6zkGhRYP{Ax(tZ^8r_U48Bl6m^C|2bMre+Sj?8YUj>cc(WkS>3@YO(`K%z^{5> zK7%GiG|m=tKDd^x=U1NvQ`Pz#3l_0)bo7{SanKyOo^siuJ~#jiviLm$xBR}UHOTV} zcxcGKo;=`AE#;hmyaOWJxtt>P2=ahkNaf7=`(QsA;t*X)FF8)24X&^eU_-q~TI%${ zm7J7gdG-I}^50Dmd#Yz_MV2Q(Q#GqA!{d@MCSNGqLj9QV_0Y_+}i>cc1Sj=H( z_JcD`@r&4J46QL=!P^K)Ryj-ynQMi2jvp)Q0xaf;ak4%u(LJHHha_ta{>u{5NZR(F zQ6mu$y1}$bxYd$%qip7-=(yxn9u7LluZZb`6$zbSMj^;$0^4O}w+FKqiIYMUM*3tP zABMOtVf+xHOqUIsuE&f z*}ts7lCG+$o{x0y2JUi*xe4VTrE{kwmv$PM_k>F~FDewJ%M7_qQvjtCs9b>JVI$&! zWFX4$uSo)N3hpQ$I(G=ddaK^&H1Hu&yTJNLUDpc&bG@LC2}Yw4a>@eD?{=}-yK(lh z9y8}38;qJqwFprv4GV`YIX6%CU#qzj$wn_{jiL=d#f#IG%6je0TR;2`7<$&f9`AgZ z5O*3XjAa$W{v6t+w2gXXRLhCVbP??`DG&|q)%SKxcdg5=UbyMre+~4BGu{q)6gI9# z<}?)WZ2i_1@2y+D@5`0}A2mEyTHYlcK}4^#sp*F&W-g;h2-io4o~&G6O#F706!ou) zw6EA;08&<^@rB|a@(%lqg(SmGLlOaR#LpCE!Or0bxzKlDTzL|m+M6TDN|GI%kC5m2 zBm72Wr^FcqtVN8w0J*hh>{8|^^xHuBJR9DVQ=FS5`!E-w!SmO>HX{4J5OMM6RjD|m z467RJE~xoaobduXNzgsyZhhFWS&y}i`FWrICkpn-FJ&C~k5SoXWkgspln}_gBF;>v zb3Wl~;g62u;QPfOGi=rQzMMq4sf9hnJ}9%vZtj}s5O~G@1)W@&0>#auJ+Ff!xGoB| ztyZ@4`;rv~3fD(&a2Se@Xh}TZ-%CG)cs(U9L0$fbF?eHmTlVaN|LXMq9ihouMddft z%-Ye2a}w1@T5P=!lG6>E2WxGnpu&XL)+5rl-f7YBAZ&bnOhk(<5!V96ZIHV`;bX+` zqllJvJ~JR!cuC3PawQY02*f)v2&ut$S%XHSRK018PUPkkxvG#*@PYA@@)8BU=>V5p zKF)$N%VW+xI~TZgsW@5q~%M4aa`Cc7@*KDf{t${9ZF|a;*Q6SP!29tU_$b?0tq!VM9R)jTCKb zIAUixNLGn~c1Zq518+y+g#*L0&sH$S+9G|Gx7P0cIsr48^W>*BPE2`3ZVA2@j((EY zP#rm!i~R_^4Zq>$+`)8l3-FpD_-9Q2O`pB8T-|MFR9>9E<)^r~owYQ+VTk|56$Oa^ z?>6Wevitl`wE|5MVs8g}rA@5F))2IjZu05m4*0Vo2c&w z%<=^ceSMyCgQKFr^qC_FU-gbu8{)jDyvOTM>%k_R3|Oq@1Gb(Xcx|3?msAQ)vTOpo z?9|bxqn7zfw#$5ngs=rvEP|QTb4yuS6zi=UBUWq9&HOcQp+E*@Pf*rVITIoYT|V3>dk!&brB}1gKCPB^z!fAg@8>viSLU zU+kQ&ET=1U0u>M4(FGNxZHgb~e7AP|%N@K2Vr+;qIBOv2Rh@+@vl4MpD_H7m(u}1l9kCVmGI# zmoCZT0qHqOmSDBR(oiN1sN`ntefrzc3S=&L$ScbPoW4A9AvVA#MdKT%h{PuBzsPL^ rJApKVGcN$26%7#06cB`A8#I&wM>Y}sKks+W36bFoTe5TlM?>wP}g` z!MLeD$!t$(gjwJsvyo}7)17Pntvk2whm(m_r=pzRJyv}CzOk|P70aL*aS0`EuEqmm z*}t!%M||q=d3?3R^>ypo^>w#WA1$bR(tN`*wJz_@6|KlY0q1>&{}3Rb*;Z~Ay+vo= z#Q)|u^g`WK^CyoVXjZ*ZS17rzxm(s5Jl^}B_-cE7RJ0fUPb)RDHxSqEZB1_fQg+^7 zYm~cHjKHq<5w8Q`n#v~Bv@rDip~kmmWd zhfbMm=d#o*`wQ(l#@yeSQLfhSpU~CC;zOmb_PXZIS-bs>Q-+OhsjM-y=|0F$ZqgkO z_26M{o5wr)=YFF*)J%R@JkxgH#%Vs%;Gp^+PBaxHogCB}JFZO<-r6oLwFvaJ8YYkk zEeGoQ$>&x0b*y*QJhMYH&HLnejq%~Zk?jsuPLU5?%YUo1s0^~WhsUl~*KIkj)%)Rn z_UO+X^lEHwd=T(>LLa>@cuzBUPQI_eaP&kyslLqnsJCXi)L~bSwp1ht4?fuL;NX6J zrtQ)v`OAe@twm3!m^Mw(xwx$(uq{8yXHdXa=SxNv+s2h;ZIA@Il-Gs3mY zB$Gcg73I~p&zIOd@{>P^$`G9$G_OtSpVr=Tqp#_4N$Z@ITqlaT5I#4g@hiDgtpCeo zBkR)sbM~l~{Jl>TBEqKs<4kR~-$yIonk)_edBYq7+m9{tg4X7aIx9Z7vLa5n5JUAD zbF5jX-hSOJPnCl-hBB{vWBqdP9C6$AQb(+CVPxYhuQOsZw!r7uXy6gzJhh`!1y(U_ z($XaRlmXjo_d2cQcdCA@-J4aLzG04AvbNP*lgpdp3ME4<0-NWt()0rjux2 z{^O8l{TcNpx3Vsum04*{j89wp-yAH{z*tS@wTv~bT;FJ^88Eb>W3~hl6dx2h$nz`0kw=P+m zUlioMibZP3Zpa@>-?0$$Ah1iR3U{gaqIRg@=v2J4O{#~s58VH247o8He4WU)Vak2m zoe$Q=1`J6&kkR!<@w`DDp=5x{gKj0TrUTpFq|w|JXZF9-+Lg1PxwcuybH0Fe#HUrm z51sV>IqTT;g@&U=nxajYPBjXRbRYVwo7fo2QZ|;$_2fbUmTtapdG#Z2oV|8qCa#p{ zWEYy&R;J#}I+>|;@)sEJISpoZcy;JGt$;@hD*vXP&|s+-`J*Q?4k-V|oy(G2nNAJQ<<&k+9I{6yU3hS}rOy4rU%dI;1T~$wq7WfLt^cvEVMpO?T z-C{4=hxec`u#PcoakLn;m0wIg_+TxZv)jbdT#4_~s)cx)^g@^?;C-K*ACc+fQ;jn% zyp8cvd!O!l1Ey+X{h^6L2;3_S0y(){_YUC21tZs=#3ZIH_bMNt`8&{(_8>O4jiuM_k602D~m`&0jcZcTx zcY6ERPWPN3IGdZBt6b-BBeaU~IuL!{J3L2(;g&nPY4W2IC#@{Y^4)l+pj5A+(sfRw zVX!Y{`=KU0wx#{yl4^ne)-RU*U zXW;0_pieKon{gnfE4C=2?O2p)M3PV2a<=h%Zfr2TAm?}6Pye{eJb(0&o0}cFT{H{y zENP&KKmBQKro#fi;?K>Mp@ePtjPXtpJ2#HDFsZ5)p35+*NE;^a4w#0pi?wx$pEtgL7v8&MidMdSG+GoxJA^%pDp>~r5?rT3+|A#bTT zb#cTD3$y9wTdy=1U1b5ITp0~3zVOyOqXvJZ40oHt`1By9qkMKUhvG715lQyta+pMX%H8fAxxac*)`sogg|vdCrxAGBqgZa?lIA~NDxzfuFVnqK z;pvKQgtgKl__dG7r)E6rN^?|x#;KCqv(&|opWo2dJ|4Zy-Sx8=(S<9BB<|PUleOWH zu#DkQ#d$m2-ZX7CMWpleyFat|;tL4NPA_ekeCd^G_p|U)GjB+ugmcDT#NI@H6xE)+;;nT=(f8NfeYdj)@x`K z-1-)tD%M6Vog(q}+Mx)Ph}3GXU%x^oDbW7x1sp^`gTVsmjC4bIkHf=o>Nf;@RG-- zPl5-b{;WM{Gj1Wn7!*A$EshnNY$ue`M;a^ixxH^eB_CM?ZE1lz<<(MTZTnz$MQW7S zVG-bPy}dztYMsdZq?7hgOxfCJbHvF>r|KosBR#UoM=V7Kf?y4AU*KmDx60h~(NEsD zQ)VM7ZRk262uOIy%d3F0crXI$@2}^LN_1-7ntRJi&1)n-8In&n3Wxu*I{^eXhbHGnp*&C9Rq9qVIa&+ zxf6)6u3nK^c&F9!H{;CR{_r6dUgKC!LVJ#n)?DYf zx*BJ0pd~6hpL~VV2D7p_N2f(9i6b9oHBDxJQ$H0CM-FT}5;sErI56AF|lk?y!!ndz*j< z`xs&o-(>Gsfrvzgg>wHSmrMr@(hk0LaM`lu7i6j^cU_#)=Bd*Gc8jTmu`00}#uwF4WGhzTVhV5ydTkXpU=B*0GJxh~715iwa> z$gMgKVbVf_*#S^uA%?!S0%iiA&EREI$N~RBa1ZF(OC9*}#Y+#&bxq)!09h%w2&JxkyC`7(9dC3e&vJIoys)$Iwlg+hfxTPq#yP zWGFq*Ct?=bA+GJZ+3j2uqf_{rwC!1o{X^mMAxv*JmvyV$-$QQta_UPKQ z@Kyj=VqdVnkTB9LqvLn)jm4Eju)&{_Uq&E8HkC4_7vkxb$%6lGMjp(;7!7ZF1XSZQ6Bpwo&9X zzlsOp6EZfxID+z{6~%L_Tng1Ux-<%%rZs*aH7;P=PebIw*Xd?0tp&49M8Ug@b%)9x zRTbJj9Z`19^vW62nh_UUYu=e;`aI7F@SWEt|7Mw0jNNhi-__!`{e`?&7e9H>F8S0v z#{0>M&&@Xln_SgMy%B5{2y1Rw<>KD?WJJJLU)LMoElQ+XCgN| zX}>;+Sc3c)*ED}zU3kFIzC19S{7YBbkWbb~YmQ$msGg94BW=#oyff z*aPOZzr^ASx+v165zt+e>H^KoZttoc`Z|ywrbbvQi?iB8&<_XRrk6smf}blIXv%;g zN2g*yhjLqd`wMCaB3AkK$NDLKGZLoBgW4)rl8o zD@mK*rfB)9>+g4rdkv)OSs4*5#CA%94`MAN(c?TC&sr4Dkg3^~4@`f~7^d_?d_)z3 zCgx%lA?+u>KAg*eV3jC_*xw|K;v@1^pl*8*=`0{3a+PHv6%4H13%C@HIF?C#3de&+ zz$}!Vv1fibJV z2x(QQgXiFa7p#jB4|Ko2#!6f;rlLFAJ%57_Rtv{&UlMv$U~}##=nQ4P4PTzu$XWJj zmAEw~uvVxib#>EBl$5)R(+vehk>!ZO=|MVH!(1K2SQ_DOVeVPd?1U(%vN+G|xV0|{ zLUgPJvBkr?8P;CB{n0a-J`n=a_#AIlzd)<5lVq-A&BkiLVqX;id2uUVN4Mi;(9^(* z;A*uiC9W(_higu8sNVt+3_eD0#l{m2xD|>T^vUZ8) zp4!?WnAFWL^6exoBCGt$Dhv=q9$qZP2+Ov<>HH5Zvs6zVy;jJ1!M?FCwnmz~kl5b3 zDrOSb+r@_Q!pVZ3JPRHbN-UY!{o{x_^HUa_XK_1lplb3{_-nQr(9>B~Tz0 zRV~U>$FLupfnRb(iWbR|XQlJUtLiHf2$E^(`bNwvY}K*hl|Ll+-8&pR2c7K|2JiG` zaE0lFO5%?c-=5V+Yu`ehhXqNt>I_ic@vF#LhMcx)5@nQ6U2~70(8=JqroEJ%$6WOO zyVbe68|xB%8gemd`bJUQm?L zE8tN!q2kbybQ8Ykph~=Arys40rz{{O^N?dOA369VDms}2_Q8V|KA0$uun;oMnnuAy zHDWHUhG~DcPP8X*0Vr7J9r;KMpSeS+q^cp`S3q~TA&QL1aKM#t=!;%GgEZY5BY&s| zGoh-*A)xW{oc3q`x@8VA+wUU;by@pn&xfSGfFZG8ZJ%k$&aBD~f*deC(LY&wBFt+i^(@G|{AvIKNDf^cgq;yqDrw4y!tgyz&rSt*#4`d=6}D~g z)}cM#a;G&k5wo{rA-n)3wJIVnpJU~G3dpzCRsp&=yavIMOX`%w9v63Vg8EtQq!wi zmM?|1@^HjXduXY@>%+Ev@#_1dZ02U2F}pv&B4x`Lp($Mh0^AnqhcsTEdF9Y_=jAQa zn|{+gpKe>0nDgDHCP0fauXBwE>N^QIfrk>Vv9I5QXXr0W%{}&#X}+(ieF7Hr>%b?C zGbR@i%8N?O(Q#5Qzn60|1HzqWbW+N;Z9x~$iIVT-PpSy$8VURXmvd5g)5D~?fjs`` z1PkZ#0Hcw zC^LJcmVjw6OI?b-v0+fyj!pju_?Gt5%%4Kd26Un+)9*{WX0Qo9nU8TySe3Zqi7b*R zp$AYE>O_#_f>LA!G*H`x3n7vjXCiz1LqNh%4B#Epj8tIQvw)-<6#=&0OsABbffSUc zaP0oxUTvuMV3a%YGlcZB9Ii@FJEi@Htue4=ka$psKv<071U|$8u&|pl#`5eSWPm)p z!pM~fi*JCGlnG#v_4!F*4YpKgeQzd@o|M*Up_?6E*7hYB?z%k|?cCnn;txHHi6ZY58R4$I4rXqi?bewv6O&Z^;oZlVpx(O9(bw1= z)O@S8>Xb3O9PXFdEU3cUKG>2Zt$zX-$buIcgp!(Zk5Nylt*Dm6-XVD)zmzEe?(fH@<*GyaIz zS;xu;Vq6sZC29&hD@fUJHAMTNl z+5qEO0g2jFmQ&{MqA2F=RxDA~@h4QQzGsWq?K!oO1Q3pKeAX^uiBXYa#X@9N1l*dG z1`kol;`Q_MEgeLAu;ONhHR}kJZdIX;j9HW%tBHsUK9E%pQ2`m|h%uHNso`C`MiL=$ zd{k4&OSgK`bVJCH>FOuT>pHHU7|>n7^K-iaHAd9p3o>AL3(Ub0{?(F?k9t}fNOLNk zf~FNY-E%VH4%Kg1HC%K zPojc!eeHhT86?v7U-$cWoME*VejlZ*&n=6ajFJ(vgj9{5g%B7{pOt#;!BIL*n>FvS zY9_2us;TH)!p-6hxjlhaC865aMh|M8XK3jw2}aebY*3E&;pdZ8iBZ(iffu8q*^|Fu z@ezVUNoaP|7Ajbn_iq%HQ#pRM(AmI)&H^K}?e;;%K~=bpJ0md+=v z=aH!Ln*{|HRpIS=bLpf+Qke%PDo^wib7Pzu$CZ%tludUbNuMVdomePe;yG_msOi&} zS>Z_LJd_{2)Pbo5w!5+k!EkaCN=x{I;dvg3b}~V~fAH1;UEVFabL9^SP@>rw^9xe^ zD89bo%Q%3)0W?^N336^$j{-ZwRA=1(8-Om39BKf}E literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_green.png.toml b/icons/turf/floors/carpet_green.png.toml new file mode 100644 index 000000000000..88a2a120f282 --- /dev/null +++ b/icons/turf/floors/carpet_green.png.toml @@ -0,0 +1,2 @@ +output_name = "carpet_green" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_neon_base.dmi b/icons/turf/floors/carpet_neon_base.dmi new file mode 100644 index 0000000000000000000000000000000000000000..342da153076913fe1ddf01607fefa0a488754fe4 GIT binary patch literal 2833 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 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_neon_base.png b/icons/turf/floors/carpet_neon_base.png new file mode 100644 index 0000000000000000000000000000000000000000..08b3ef22e15f8cd154f68537e37099a668bc9bf0 GIT binary patch literal 16351 zcmeHOUu;uV7(X3z;B?Foj7FgHz#cRKLoO3PV zG})HB+xy+`eCPZ7JKy)^+k2|ZN?$5P2$k92vb_U;zlNXnD@x$^8E^9}Le_8Xwr%@7 zroUsRQyc83H`rI5{J#B4waw;qI^TO2K5qPp_p|tXib>bj;<$KFGk))@9UadgCaf=&0?9l1 zesgl};!hGgsxO;Dpg4Z-!d^)aLEUtTM~i58_*?pSy%>Y7A0IyoIsuXe!NTTku{iMZ zXxs=43)%;(9X7dcZY-|{T_6=wjS5pCqQ(g6yWc#Z!!xBge-PBko+7`v!iSYSz4Zz6z4PZ#r3aFdqQTf^f6LQ# z$HJEJ3SXJB8-#wxTFD)!s%wNrA`5J|sbTtj_}Ajgy@$;AR`rzN*nrlsy&>6gIvV?&6QE8|JqXfE+7O3tiTMj-^xjtdPksbL11>;JWfz#<+Jvut{)L z$(6qSjV)VXE3}#^6(Wy~No$po>;kiZ1}&(s3>Z(kg2^}r2*r|xtU~fctE}K9b4i>C zn0ln@MmJqfiUgoCrNIFS&E87Z4h#7P2PAm%As&?G$QWd@D-K8$vPsj&HaH+598AjO zDVY(J!xgDRTnzSp0}_w=3`l53CW3N&0%sc>kYLqGRhan+2PEjV|2!$V z2nQrMAR*z4&;zUafP=&)d546)rsM)kYd9cLm;s*^SDAoBRwHb_mSe@;xyGD)s_&W3 zy8z8A*V1q%*1W^Y;l80cV54ZEle!;l9TQN(rJR6dx5Hpa5n(>3`Yrj-DPECxK!{9!$ M@7QCzw7u@=zu%#(n*aa+ literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_neon_base.png.toml b/icons/turf/floors/carpet_neon_base.png.toml new file mode 100644 index 000000000000..723e73af9e9a --- /dev/null +++ b/icons/turf/floors/carpet_neon_base.png.toml @@ -0,0 +1,2 @@ +output_name = "base" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_neon_base_nodots.dmi b/icons/turf/floors/carpet_neon_base_nodots.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d5fa68a6a1230ee7815fd19acdcf1a459bdbd26c GIT binary patch literal 2990 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 OcDwH1S-jo<;=chnwfhAC literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_neon_base_nodots.png b/icons/turf/floors/carpet_neon_base_nodots.png new file mode 100644 index 0000000000000000000000000000000000000000..ae73004e95bb8018428dda80935a223fe781144d GIT binary patch literal 16340 zcmeAS@N?(olHy`uVBq!ia0vp^3xHUGgAGVdtuOw{z+gYy)5S5Qg7NJG#tAB(lTwEI?e5}|mX;P43IydK@cj%eKncj`@NkeVX=!e5E-kxf&*VDqlNMfHT3+sd9%Q9Y zQtg@KxI=&V3o3S`6c-vum1CR{;6lrnvUE5TX`oR5*Z=DKnL3HpGpDuY2EDE+;abaEZ?+qC&L3; zI2}tU0Mh`>?a1~&_}E{sg>Vk(-0!#V#C-U1+<2Q zCK9She7ClV0Y($hOaHAI@^(Ibn3Jbx0TBX5958VJ(;U$Cz%)mM1XT*oI7pNPa{9jW9;tpQqH0=0jeBs9}hB7uT709yOuDW-F8AnH|Wys)~Kg5Z{-YAv>^k^E=r!h^%9Ep}eN4cP`D69wJ3aT3G9ZtOQF9y!x!+K*A2b>V>wf>G!e|_~^FG3f3T-1rzBkRWoo z(2y@3AY(M60}|AmpBypmiO~Uxku|_MIv_#4auPpm zDrNVgV62bSg6 zL{-j&3;}M!V|cgkw+#g=x=^e@b`)^;AA>^0GGIfF0cbpE$sPkRYk-#JFaTSR48Xkr zj0c`QV`{*o;2_;r3K8ujoNh+lqD93D7-{7c7^Odl%;mVEFDX0tke`M%`{RO@_q4u^@Lwy-m#Ga-Vcxq^d{u%F4!KBfSMTwaQSP z`!jtE|M1r)oQ#0w|A5FPqqj@`%M}3cN}&PMn`sZ;e~;Zlrq8Yq}?5- zO1n4xT8qg&wOew^d7EhT!VZhBgO1BDp_bmY?rIN5w?Qi_9{rf()=5ahTlT7}=fBsI z_M_Jr$kFl+18Kitr3`70sz4P6eEW5OP+On<<{RfiE@IM(25d_Dx}3k$Sv|ep##!!^ z45@d?0&mg;Z`OpD+RR_~coB_2SaN~`4xYGBF{#96Nu#Zoh2Nfu?OK}%Co~n@>OIx9 zZpXT$9jIuk&xi96echz9A*A$Qc{Fd&nYp<+!*rR1Y3HSdTRj0r3na2CB-scb)N~jq z(Col3pq#OJt>WYpaf+$aNb@nzhanR~dg&R(Fq3(v$5@1ik!su>SHMRwGj+x2Mn{i0 zGP@h$XL9(J@qt{Bx9S40H3uvPGh$#W2_T2a1Q%`JMKUBlDv~1E?=Sa$NDWY__CZj4{*u3QGh^D?O?KGANBdn=dy=xA23fa)+2 z8p8-H`;?uY35}nYAEp`MS1?#%wq^TTp&sk*YfIeW`)kISQCdpaxh63Y8eRbyD1aPi zS~04f^q`tJUStyhmRdF`Y*$Meb00g8u|Tq`d3k<&5^&UKyt_yPgzBiNefaR@YyH0rE>?+Zaa1M$^6@$DXT9H@lvJUG@=rEI9R$b(Q_k$~HQ6k5 zU<`tvE9k$8iE6&r>6zHFGg`^J9Ko>R4LUew+1BBl8$xrdwx|HqD{hvwGY3nQr+en_<{ZyUQtFlwzcC9mLF&mHFWG zq@rcLLx)Sg$4EUCn`1BD>}Q#A;qjmys4kw={)fujJ~a2_inbc1otl7cz$i|Nj+*rw zlOXKV4Y@mH9_|Ks7=~nTrGc(+iNF011|_?`e9i0#5r+g5036x7d;>+%KQCynJ>xeV z$3Kpgp#{_G4AwnYMbPbzvJp5!jKtTE45hm$k*t8gC~hZ@m>3ZClz{L1c?8SZJk$?P zwO)*!1#4$%^~X;74aDK-$A@BR+_C}50A5k1~VdHTK#Q531@2r`fGo;zQL*L2!fHp9PKD7 zjL4}neJ-D-bW-oLVP;(he1kDh0LTsA*s6j{)uK+HgyXV`D#?0j+B_4_>jhTys9jkw z%FAKOQ_7{iBKb1;#kcY1Pj!3X!+nqLbKy2n`iY&+V4E=y=u-U>N>h(++FY*}c--^YCvU7CvcZ<{=dcQ|fnLnhNMGC1zK27JPP;5r)F(o#|>kRyQ?8%96M z-CO+>OYoX8-=u!!!#cUT_B~WMTo9Zvi{VIiX{hHs8i?^GJ>^*__{Iz)3BsXqXkP{g zYkKcF_q>943rwH2*IA(}N5#I>x0KK0I_V3sE=(jqBV(S~hqe2MUwQrQI2aYgKL>W? zya9dEVNrA33~&wRBnV353zz`<)@MRFQGuRDVGP6j!rFUer1>zOg??$zS+^Fr5J8?v z;ffWizn1v#pA%koRb^Rj1DF^8rb=&g?jb%s+Z)ty1{v?km}C)KAvQ2v5>GRlq9Wj@ zdmJWT{}Ci?!1pcD4M77~0N&mY(6)P<+e47*Jj){kw5yG4c~B!)wfe-8O`6$+G?Pes z_C!9bzdku)(8$l#gmBO%=-5Es`rpoZ_ZF=4KN2Fbq_B6p6+g38B$G5Xd0~ToG0@G`x?5o{uNdeZ?-q?~3m*2t9_I-WMd(F&OX#8q%_wgH z(LbocMjN4ck2N)p%JoPURvNOMj$iEuHNjEMm)VKDl7}f{o}-VCbm~24w)Hfh?$qaK zzH>cp>VLgm5In%hcjp~YZMwfPL{OJs2N~cunHg8L- Ru!YYB5gZsAz&@0C`Ty~5U-bY0 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_neon_glow.png b/icons/turf/floors/carpet_neon_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..1087698ae60a3f88ee0a67ec86063b8907ab2029 GIT binary patch literal 855 zcmeAS@N?(olHy`uVBq!ia0vp^3xHUGgAGVdtuOw{z`!i$>Eakt!T9z8;{+AYNh+Q~ z-K%Eqc6V_}OG^t21%h%A_F?Y7|8oB=uULD%YOOny|C28FzvtfnIXC$S|A(mcU!(e2=A97j|26mi&$;R!?Js2S zy_Rh&RG}1Z^Qye=dHK8}^$kFM*Q-=MxU8$V0@U~3rZXKRpj&)&F;GF>bI(8GFtb@! z#FSpGm)C-t{AB+Dh=%`)aj&<=y`K2T{xjIhCpYDe*7v(JhRi!X|If+!HWUB5tpDP* z{)@&x_MemOe@<5aWPd_??!Kl;DA{7bJA`EPI2^}lk(9s!WtXO(}bd`gP>J+KMOQ=r z*FxPN9{crv`>D|Izuy;9QFxC4Fu2!$_4wCc4UUUX_R#SB&j68#YXC;V{YoLAJN7Wt ze^Rgih47~-wV6v}NIzRu%d*`RD6-&dbRR7r{ zQ}gD7412g=aO(4~8vp7mMgDIFhI35+qk2AI`~XA4+W*o2nNSOzq2Zzrm8fUa3je$R z8zi!3qDFHO>(tf%;(vqViD?heb(a?Z(EkE-thzri{=fde1&);a4?zxP_~AZFr8KL` T^Q99o!!UTd`njxgN@xNAsw?L{ literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_neon_glow.png.toml b/icons/turf/floors/carpet_neon_glow.png.toml new file mode 100644 index 000000000000..2af0ddb34bf6 --- /dev/null +++ b/icons/turf/floors/carpet_neon_glow.png.toml @@ -0,0 +1,2 @@ +output_name = "glow" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_neon_glow_nodots.dmi b/icons/turf/floors/carpet_neon_glow_nodots.dmi new file mode 100644 index 0000000000000000000000000000000000000000..72175d8b3537c0af870b4883da127dab0a1a7928 GIT binary patch literal 2092 zcmb7FdsNbC8b(~NTSL1HAef3+mIQd2mWzVHZ)rN)nLq2C=X>Ax`_6mLch2)X-}_xV zb@KRnYa4422(#iWtpcXlZ*f8IA&0 z)qJj<%8wP_bgzNo+ZNM=K!{W+U$zd~QAV5kqSx#yxlY1(BIM0UKa9_iA`>wdPl*}I zF#NLVzMFr_t;rpjJi(s(8h_kB?G5vKnh?6kew@9a|H_r%$y z_=@;J%btsGCZ@dyZzO(yxSExi4zJqM!wRabz6=deHxJmUmSe?VjpD(2Zu1Fi+x=Ie zP$uw?7Vr+FlCwqQ>BwAW&6^&_maWuxv`m0N=F2CJ9SzC4vnWQSO@*y9JJnzRP!RCD z!H1cTc1d+D6PE7eA-;Rj+j|I~;+zfc54i1W)@f&xjmHBDJr`L}w4h#24bm&+K3fSy zDk!XGYjNM4q~NLmiO2XS7Y=$lir@lZ5c>O68%hH4!sg`Uc)K`)?PH3J+}wX zrXssZo^lEPeY4Mx61tyNABKF^81elxhBlU>S;~m4>otxSiatq3%k1v=quu$;;kad zCK7U?S|VjfuU{-;KPij=)bQ481a0_msp+ z^CB&4lpz4P9h(!#09=^(i z=5pf}Ve!3F_Iw3Ak~$WA%5vk8Ps4tzSm|(h4J$8bwe_tEb~hos+gv=lWB@25>esq9 z@t}r>(eE1oPdr>Jr=RP%w`{wkIg;3$6&>-imEsv6~p>{?I59{~c(Gu)8l3uyuU{jDjZmf9T zv=RRevZi28Td?R0XGBKVY_9!C66}O~AiM1Ki=Kvyl}u0Q6+2^7*z! zx6pROn;s75VJSTsnerJD3xppELpSKSslhV(54-kv{JKj%+5ICuYo+7fVpl!Pi`gK; zYnGD4ihyO{H2LwR_6C;#tbU)E-yy7;0j&OHle@QMN~@LshR!P+R)82`EA_oaJXjgL zB-r!ETEewGK)`_MguduTlG2JbWHCLpXzM1^4Vn_SbrXd&gGyS(&P@Q3N2Ipi7K|R9 zgsYH*ZtUKNA|9xMnL2jmDp0<5gw22G@m`gWiFH{Zz9ekvZHmm==&M4D=JT*Pk(%Eq zB5i`qs^}3(##6;bNQ5`3c}i#8lw7xP5;wF5SH8@bsma;a)XBOqjBx6B1JG^=nB-=!^B zxAWFh?|=P7rGCVqIEYWTwUyRzgiysaWwn_pQ!o#VmLHt?+ivmJ3p!m?;Zn(OzC;yn zM5Wf=ocZ!kQkv98NwqiWgbl9Fgv!L8$HC1i9Un7km;+}?hYEPee6ol{pVGiPt%6}I zL)A`9%#5LoPM9H7(OzlnKR<$EKNV)L<$U1oJ%b+;$-_(~ua&|{FS@`}!-?XoGq+1L z8ci6_xBfhAs=k%Zxlj|pQyO) zuf*n5#o!Z-6r6+2c2h5F^KnFoM>340&F?Z6vF{386~v=Jo4?+e2y30}!~dTZALGjR zJ$0X(EF3l+Ya36rO*f0Gf`{{d+S>*5mR%1Ug$9N@R|Ixi1ZGP^t5b literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_neon_glow_nodots.png b/icons/turf/floors/carpet_neon_glow_nodots.png new file mode 100644 index 0000000000000000000000000000000000000000..19b9d311b13c2983426c5aba1674af30131168ff GIT binary patch literal 770 zcmeAS@N?(olHy`uVBq!ia0vp^3xHUGgAGVdtuOw{z`%6U)5S5Qg7NJG#tAB(lTwEI?e5}|mX;P43IydK@cj%eKncj`@NkeVX=!e5E-kxf&*VDqlNMfHT3+sd9%Q9Y z(%-lD|K>zee@5%sV04|7-63pL5ke+F!`t zdo9~ms6r{+=2dy!^YVE|>KlOiu2-pia9LMz1*q@6P3M2f6)~k(>*ckeCOp}H04kvv z_j+sG>xqBtKZA{aG81S--E+@B-xq$0`S-;C-;>Ti>Qzg_tCqTdv_CQb&&l~V6aPEL zy__1?`QNAhlY0FpmwA(aymx-ObI&F1y+Z%zBUAietoMJm{$sxAQBp z{y)6<$NctF+#f-5{*UYrfZado|3aw6^4}p6^=ew-v0v}Ep9&5C`+Z^2)zJU7P(M&n znENBd*Z+4wg6zLDYDhm}{Q(JPpgXuf0DY_O|HS@+_TEd{AMGzfL!%KC8ZQI?u>YED z|8uhXr$3$l?Ly)jfI$}i=zlXZ_46mtFxh|7ft7LnkN!^whUjVGpXa}7{CmFO69X_b v_J3CSHy@-16t731;lc!!NMC>v2K6jSm*T{CJeyz&Oxp~eu6{1-oD!MS_x&Bu^IkZ7 zC~Sqjt33<`TXFC}$We2gc)x6yns?W2>95S;9qIT+TeB{7|gomV95UCxm8-(pE%bD$C4wc*NnFyi&vS|yzc9t zFJ4?7Oa7%nwXkrwbRm;!G(c~^Ln{9 zB#^TB(g;6bQc9>90A*B?!v)nwU70Y!i_V$YD4hUYf=q~vz(OCka>|H6Q!6_o`cAn0 z;RWal?kQLTq=;#(w($J6&=DSFYxhmj631XmTThFk%dp@Bu>Vf4U5Y2>+>uG>I5CJI zhO(p(E)2*VS>2Q%oDSc^_d@bPW?ei@l+c&XmR!;dbO$a~8K0=MMD6E@zUv7?m26gQXsV9r3(htS>&$f8!EudB- zz>B7fV(6D}W@C{Eaiw-hF%zXK%ZW2tkXv_?+dx)M^ax*IE_?3sN$n1x zu1^Ncuzs}}NpTma4F+cT$!CgT)(u?~vEY51T9zAD&q?={BO{F5FX7`<(l zb`KptOzs#lHER+nPKr1)CV9WKjbys#t~I1Vy2Q17cDKNyJ~2Cz{!1)75vuil{bfKm zIh^vpkCi_Bi51BfavHscub{cvC!Uk)w9pn}+FPDE5jOIeuQs-+0BO|+BR#Xs^0dBcv z=s9R7HennG3`0X>Ii}7GfBMV`rQARL8OY8iaELBTmSrw%a*f>Z1)kfsY~r17p<+hc zF#Uov^_(7HgMa2ONIO>1iK5scsS|Z<5nXNQ{Gbk_+?VJrWh?dCyOaW_DVZP7MT6ki zuo^T!SUs`~)7xnh3(fPOJaAc0{5U;{!ZJ`teJ0-BbQsWbpl*6m14W(-PvxKu)JWLr zFx;b{|7+`i8v^Z9`+V4QGC+q^UTFt6pLH9LC6*f-cQ4?2nNZvy5Uq;IX|QTR(OU0m z#`#|HXsT%*#TR_)^{xZlo?;$qv2mqD^uh&Y!kXlYP}j@8NkNKcKnE^UWp3Z^nH(_D zH&2co(6E1Z*qa$ZpD)VafxvfVy;cFb^d2)Jha0!FPovg+=8*b`Cdu-F#ytf6G<9G# zw#$9r+^%Ujfwcb2+($F^rOq&fK1`M&`Bmnh%> literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_neon_light.png b/icons/turf/floors/carpet_neon_light.png new file mode 100644 index 0000000000000000000000000000000000000000..9443c6942903dfc2786b9d829f872ad8628794c0 GIT binary patch literal 678 zcmeAS@N?(olHy`uVBq!ia0vp^3xHUGgAGVdtuOw{z`&I2>Eakt!T9z8;{+AYNh+Q~ z-K%Eqc6V_}OG^t21%h%A_F?Y7|8oDSSFXKYrOW*1-1|R$Klr~yt^XRu_G9k-pRynAZ)ESimM!_9yzY7Vk@^MK ztJYpOI`AH-u!Fq_k~4QL;u&p91;5!Xf|zx^$*n8ng8cM^St=8 z{e`TpLjN0q{;RYLTRrv1d*`RD6=46^Ln!rMpn&|RycguH^XEYU^5K5RsbZk}f#LiA z1UNANJI1}<8h82+MDa&^_NlAa{Q?@bYW2V00Xtv)-}ObzY&x@Hu*8Qq~ oJ2md*R0eP){nG}U&G4V&)#T8NOKTLj0n;CYr>mdKI;Vst0LeU#Hvj+t literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_neon_light.png.toml b/icons/turf/floors/carpet_neon_light.png.toml new file mode 100644 index 000000000000..6ea86ad1e650 --- /dev/null +++ b/icons/turf/floors/carpet_neon_light.png.toml @@ -0,0 +1,2 @@ +output_name = "light" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_neon_light_nodots.dmi b/icons/turf/floors/carpet_neon_light_nodots.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0cf86fecb67ab8d92b9a5d8b56112c0c3fe18bd2 GIT binary patch literal 1631 zcmb7Fdr*>D6bH++d~Rhn=9WyY)$~|x-7FtqsgbQ=rbuaomMvf^mSPGbYL;m^y{1|- zW35TYASlb)U{~xhI%x`IO7c+DlorA-OC-Mh_!es)&g@K6f82Y{%)N8&?|07c+*7&@ zhjp6eF$;k}I7Ms@+ita*$z?yox_hij>9-m)BX&nt*uKoY2dNoZR9ZR$k#p(X`3=rR zKCa>NvAN}Z-^c{sO4a;hNvK0!$RlB>!cBtjTjShm@`p<+Doomv8)!Fe{WJ5mSV{K9 z4+o@JLw0G|Zq^*((4O)#;axF3>5r$?&W3|36-F|Ul-lgm@?=x^R!n=FL$r*3eUX7- zS>^8SADLdE^3831$@Dfw<|n>&+;e3Iicpwnd&ccpoL539%Te!t>cSD@4$2}2{Q>EO zvk-GlWUmFP*+IOPM`q?a*s*(YUjJxw=;J-3c788C4G(1Vw@_V{8wvxW)_4$Sw)3a2 zP0I+_{%n}NJCzttGxW4rq)En?MY?ufQK8>Cv;tz!+z7 z5l&rz-w7+kJTo8QlT)Da0@vAI#nbIk$c>x7)UAGmsEsO#H-Mr_A&jlP(j|wfSpClN z*gGI-tVG8(P53BryfOABBb~^Ci0jymNd4&`iHqG2wt3umij zg$$>^MxvJdja*7B5J_qS^eeUSwZz~6iV&KF6@m5hPC_~B_5DyY5x8qG1ha*=f{ zOtxm^MSWLu%~n%}nuS)5TpqgcLuXC?>M6PSC%82&pLeD76twD4ROLmXMMkf|wX7)t z0G*uOx{rZYUDd_NY9gyz$5S)kXRmhy0-zarW0dzgP>|11==59?Or26{%6-HkPE^i$ za)pE-wvg8g1?Z0?%k6$s20cvRwl7tsp*04GFK3$un6n2lqM*`Sy1b^_L7?Wza{$qd zMv|bJX9cg(c7jGr%Ha_9ZM(^`ejfk-E({^NGnH{w3;g$)jPhn&cwoJ*ZdX@Qut*Ir zHRFJ^VKGHtE{*CUA|9Z4_1~){;0vP0qZwUGm?pD?@x$fZBf2BF8<)z zL>zt-T*>h4eNT{rPWL_-%`p(;#eW!4$oeCAZRo5?!ArA|y=b!!v}6klQs2miTR6pa zjfa`Df2MJJ;WV3Kw<+Adyb<}_j&?3I1`>$c(+o)TH0}4us(JLRWu0Srcd=Cs7IL(J zeW6pwr@L~i&SZ~+1dJPhHyg54Ha1S_7Df8n$9(MI0;ikapS1kcPL+!0n2Y!OF3LC? zeA?Eakt!T9z8;{+AYNh+Q~ z-K%Eqc6V_}OG^t21%h%A_1n;hZMF$2|Cn!@HK=^FpOMS#A@sj7N7`Z1kNM4~Lc{-lUs!ZC^ndLNo9Xud9^0G! z?~MC7H9qnW|EJ^ie~v%G22hDgr}&|5j4GY~9k%f*c-l1N zezu>W@=^Z8wn{sopj}8DgXbgr2@ui$AZz)ju3q=+z4OymtN;BD*!gM|P|dnsulCbQ zIIaQW7ydsV<^ON|DgR<>{LiUJ>lc7U&mY&`|4F<1zg@@kq}zYgC#l47AcYXawzK~o zCLO6)xc%%WFxY+vRO(GS@?RN<6}FwNSMq#R&!-h0`}KZ1a@fU`Uagn^C%CaA+_K|( S$q!)aVDNPHb6Mw<&;$V2eMYbV literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_neon_light_nodots.png.toml b/icons/turf/floors/carpet_neon_light_nodots.png.toml new file mode 100644 index 000000000000..20e0713c39f4 --- /dev/null +++ b/icons/turf/floors/carpet_neon_light_nodots.png.toml @@ -0,0 +1,2 @@ +output_name = "light-nodots" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_orange.dmi b/icons/turf/floors/carpet_orange.dmi index 4f0b2078fca38ac8abc90f9da781d86a25d412b1..0ee9b56e8b09c19a79b2b903e80ea5c86c070d84 100644 GIT binary patch literal 10705 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 GoBt164`MC= literal 3293 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 C;Ol?@ diff --git a/icons/turf/floors/carpet_orange.png b/icons/turf/floors/carpet_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..c58cddcf0bc18ca18a44e75062bb63de9da66a56 GIT binary patch literal 16306 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�xOCRgLnw+j@UjZ=yBZ!DU^k)eQN^(`uD65 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 FzX5sU({%s< diff --git a/icons/turf/floors/carpet_purple.png b/icons/turf/floors/carpet_purple.png new file mode 100644 index 0000000000000000000000000000000000000000..530534c5bca328b08fa0d285b2c472ce27706fb5 GIT binary patch literal 15486 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 Uc&o#?Vg=)U2ln3jck9pp7lGwdKmY&$ literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_purple.png.toml b/icons/turf/floors/carpet_purple.png.toml new file mode 100644 index 000000000000..708027cee780 --- /dev/null +++ b/icons/turf/floors/carpet_purple.png.toml @@ -0,0 +1,2 @@ +output_name = "carpet_purple" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_red.dmi b/icons/turf/floors/carpet_red.dmi index eb0527f430dc4a4044ba9be0806e3ba1682a7e7e..dcba136f81150bf2b85a04e3bd75f9ec99fbf12f 100644 GIT binary patch literal 9295 zcmYjXc{o&2|0iWqn6f0rjLOzxP-0>jiX^)fVj{9--%T+yB_wNrU|Q^I=GH< zvhHVOo=&rxy=SK8zMA$vcHYjOzRn)*Y;1w)?-PIWzLXOPb=((-?mFXc`I#GX+wSzN zAotr#+>AVh{e3D5C_TGqd(FJi?DZ{X<#M!thn4+$o&I>>x7+rJ zg%U(6R`e=^Wo0oFOW}M7T-g<;An9nxlB(rYWo+|IwUb+dVR%qYY{2if9-f^0c z@ILPwJq@~$ZkwGhm}oa4`sw{kq-=6PqU=SBlXIUVyth7a?ug_*Wdzh)tuK%7W|P=6 zwtXlj@SrmrF_qeNQ$ic^LW5H0VEZ~4HIgOB1Lngm7kHRec2<-3Mt zOW#a%6USU=lp_)09A0@%VJG#bhK?R)?!k}7#fpR3MVc_;XTP7ncf$VScg;3FowptR zq;tkrYKa1E{c24aUf7YU#*qnB=UCyFwJ(=!yaM+1@T->nhzj?~wdd9TCD!+_w5_m( z)iu7=J7xa65>xd(F7C(;D0HZAd&h^_q2@ojx~|FeTEVHwU+ki-QIODw%*N+UGoe3c zny26X8L_tbv6r~C|4@I0(g4&#E?)IQ=8KoFJd^%rbv@9mgSvuRIcrOsf8YIuG#;tD)m|+f5&9wi-P~$GiIPccc9 z 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 PLTox(2AW@P+PwTfyl{;L literal 3011 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 diff --git a/icons/turf/floors/carpet_red.png b/icons/turf/floors/carpet_red.png new file mode 100644 index 0000000000000000000000000000000000000000..3f7f190a126c4ea6ed436588b7427976fcaefb82 GIT binary patch literal 15094 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 literal 2967 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 literal 3133 zcmbtWX;>3?8pmQy7r{YY1QilQYqWdR%H;u65RwQ91vO9vbSa|T zU^S3%h;k?dA_N3M45#41O@M?mmq3!qY_Qs0pFaC(Kg_(p>wVwvO2PQt(BMEr{yENWkuKVgfm)JckQt5DRb0C-Y&fS{qDW-*CYJH-Rxq| zxnb?r*ATP~Eb?#1hH8Irm-^&ksw}-G{G`2;+@Z+ua$5N=PZt4KGZm!Z)x0ysmK=x^-$GLrZ!@;)HAV4K?uX8hbRHj z*TvrX7tWZG*KfM@XTvs>@vmC*Hm0TwL^ZK?Vk~&~QkJ96<)ri;I;Mr{^p07xcK@N6 zZ`Wd<-_nrdtK}7aTj%bBT#pa)!Kn}A{5HF&%3Suz3zj_|03iw9zptOMOiqm=C#O(q zYi;R_&0=Nly|DA;mg_UfWxpFr*EE#&W7l!@@mg{6E!!e|`AI*SY_^-u9ZARvdfxCz z`(L>A_Dib8R!|1Uwq}mA5FvcF=WXi6hGz9ay-Er-#a?50Ua%A_so2h(a&@KKk)hgq zOrli4p13$HIbh)bg!&IY8-=JEe;*-PT4vABGy6Cn3xeuj`4jaEaMbds`2C>`ao6sz@~Dot+23A>xy1BW&&^4b`7M!Buj`vy7J__aM)=S3qJ zKY@m4kNKH|kgz(~yKyVlUK&@pyE3X%zjk3?yG~!bf9vgKFn(OvU~>Y#>2&l9)A-zm zap}p+m4LH% zVC@-X*jT_~H(1eUfA0Y6y-IChd`iRdrE$+%?Ot@HXZgw=t}&K9Q55l3@7+b$;uV_{ z(X%Qeo1CEd5<>mluiWtT;Ed1uK4~8L=}}@4 zvB?EGz%Vcna)Z(WT9XWngee1@OUmh@{h6L#q7sWwJabS}7GSf(S+5lL3RCX-Uw_)$ zQrW-Xp~9)D7d1w2))sJ?WOAyXuHgLm6rmAoN_;BvkSNb)Rx=$Qc=@4R4`fFjbAZ>P zu5{7BN?J5QSEwsC<^K}Vb;1yF05#b~Q)+)dMLt>fI9L2;YsZ+NLeF)aH(c*NWPwV< zr-2{(FBd03pt#~b@jh?H7bliDb1)ynCNIyDFQs|!5g2Av|0(tfY7R0a<8_3fQ=H+u zQSdvm1N2fauUpw(7EzWdMf1yy^&?F#nE&DB-iWOnccc=#Xw6eW&+fa=>;OG#H3qnp z=x8!=RASJ^9GX4Op3?WDJ?^)I3UG<@qy6HOBGXJ7x6KO)CQk0D`2kyJ_#pSmwa1#>04cA5goay1&i|=)`RvVfZ6}(Jj17BBpu5B98z+r!)#qv*+ zNfA|ZKmJgEUAhq{^Wk@~^Pj;tyN&4xQm_U`3W&!2P8W9^Se8m>XtEc3VecmJwCR1C ztyYeGfCkY`7KT9=>YIRx{;{-=NU`PxcIQQ zTvAh#T7opm|N8Q%WHi4QbtYr0)J_o6ZCDx*?j%C{uvAldVZF!43hGsBrTL%W<9gu# zfzjaeO;73{QX8`iwTT)ETCt|45eb;5 ztGfj$O}ZYCY>^2A14fSCMq}bsz zeeoDsCS@TKWazjgxyi;PFBAGvCd2^gtN{>&od|YDEx?+w2y9sDikI5Nqu__y8(*yOeIlGm?(&&(6vRRcb}xOP{?RR zl?}rX%ip1HiqN8l$Kp5r-s-c6BN8nzk7MW}CjCrrrTqo!nAjHSnL47HAQ3}#WdG^A z8Cz9;p1!Zvb>_1uj{PE5eqSh5rGkt??_$q$Uqr>L-X-*D5lOc|_`>Rp?9p#5DHE!C zLXPN)`ZwO;pp{CO=oGO_2w<#dE`aF21@MKE0t#%Q)vAotW=O#=2HVaG9tk3&-TIuM zKj3$yr9eA=I=7e6JuLLaIDn~mH&LxcF{g-l5;#umC;6ER95}x01<@l4S!!#pFY!ce z5%!|Uq&DCP=v^|z&gaGLgH%f*WqW)&AoNT&To<)}77DNHv0}kspm*L^k&#?-iLUZDrp^)NC9Da`|TGKnMKx28b+)&=O(aUvVl zVah~(!x;A7I> z4L}$@L@{~og2UXR(USPZh|S`vhy)oM_cvL6$bC2JJHM3FaNCDZofv&MjQobwI5?jW zJ?>uq&2~C61|xV=Z8iZR!_Lu>*D!*P;hRw!h$l@RjX7ZQxEuClUn zLwiTJTSYWe9nq@V)2GTWwbgs%f!&b&i zacSPvC@-`pMwOmD$pmlNVPfb$G2T`?Rv#X0{#% z(&(vD2PIBEFH+YKh>vDBNFCwIW@ZD3Hu+c*Ol*aFUj328iy0Y}8O+5bFh6H>`(J9v z9Kc!w6D*PzLw^}ifESWbv7|(X%i1r}%rKy|aM>u>8Gngs$ z^D1rLBvZlG0*$4qRYPN#QBjc)a6=_ghi?cF=8J(Dn2$Z@yze_7G7M(eZkOK==HvZ* z&ig$7^FRM{4(~m;aGwA0F~fO0p8x#+n)3p@9)RE9-ZK>bekj{$(z&6%@e#fm>Jh95EhbX~X`KX2iwqoeUED^|>%JLjFey?ch2 zJ-Z@W94i(_mEk3yU7pl2L4CUX=%-hP^!I1*f&TY_)9?hHpKTR)*H+Zbi!kS!QmT6V zA`H3e)Uu@gn(9Yot=2esXxx}8!lNmEX+*h_OTpSBQIf}2t6p~Ab7<0e z`NrDat>$!L;(s0!KI|XKZ4OhN3DynAuX?|*Hq}(4O8j-p%_sQQcY{o4 zBMakiq@CDa@Szot30G@_-@3>O%m4CXq?O~vj@c{>feQ@hto zjbG&Y9Vp%Dt1ad0=2^5=`4Pr1>J$wJrTc{Wt!+Msj@0oKhDggufkiBj%5Qx_WIhz! z6s<`}YC9({bI`@!VDOYue9?$`P{ZZ$3348nc@Rmx%smgZUTlNs9u?2T1~g$ zT-StDXJhKl#%1xP<7jn=O=srHtk)jR5g$HM_iXDj7;||-+RU)hqw3E}cmDLRhkzxV zxP}un!qTMP>%dH}<6?lak3qx6Tt(v|^VJ^Z`}iildEWJtD{WVLo_AQg2FOlq z7+5mg;~&mGw7alzVfhD$6A`vt!PZKR9s!)tmBp6P>;k-FF3N14w7LjbY zurzS`f>1B0gY#LHP;t!wuE+0BZ@#IWs?turbaj1u^vXgrF1UyvO43VDof;|77mA|V za7OT0z_N80iPvw)er~0x0H0xI^M5EikE!16g)wfo28inchVH^HzS;m)SAgRCHHzQZ zwTbqVLVsBSn^ky!mAC)I0$$|w##jb zj;HDnU-?NF(XE_~3=YBPqx;Tphf1nn#%<>Hvz^=AI!K@|(&98isL!-L=Swc5Tz+!{ zdcL%XH!StzB4fHohH7_-r}zNA@B&47L2FN>uX=G1uz>bZ|Hymq-FZCj+6@4Z%vXk; z44Fdqi&B48|5@;QU-TP$q_3wDeh06%GzxE&_HobLJ>9L%Pn=jxCM(K0jgv&$spP*l zX1Aha!rJOd8X666ntD^{^$p?WUk*kPf3{#$^7h;t{<$xe0nXysW!CztUTfdB^b6p6bS#)?o$l+rn%%8?;8^ygFDcsA0(W6d)!U%JUXYR; zC{=F*I2p#+3+ACxTPE1QD!&-#YHK72wN>T-=rzlYxOt?Nk&4& zdbR#}L8)AA?7S{7-DyCw1!Sfw9Zt`=UW61LPDlV^G#1$W(2?Alc2&Zl^0!6{5~~9B zFpmJfGZe1^NyfJUR)E7-$QD+&f9 zy#N4rA-X4ly(>4q)i(i2YFSnoUp&wH1cD~Q1SzZO3n8+V zkyM-QL*$$xFk)B_NV!fsrVT_(Y0@+P9N64)(Q`{<42S6=9tWknjWG?_E!-@if511NdZvj(fOC7Ij}6>$ zbb^?!*Vi`I$$A!<^cA+>MRfG69aP=V_3F2%Z#GMc`Lo_}XQ_(vhwMH)pf2)r?%b7F zO|Iqi?6~4J5g%scYevN5n~J18d(EaQ+rKF-z+?if%Dq28$mopQ-N<}DT;44jW&?a8 z{jVvL!h7*)y3?gggZdi8zy7A@Ti-@!4)}-RrU4fgC>rd`Lb=5c)-rg6kSPGc%v+4) z<539#Ypiy|AOGG8e=s(yXU zZgRcwwxRY-@kVgBj>~d)!0d};4i3Q=yl=Z2FEeyxEPj6Tdf6P9 zNMm*NyKd$N%bx(EHg@dT>CO`~*8oztw-1|+E>K={}A5Sc)E^rTb_k+~b2?LKQWIq=)^4Ly=veRN)I_KPCj4 z0h5tDNMMGoo6LmqJWNV%VljM7*DNnfwdk^Szo0{-E`7tq76}v#pa%t#&AuR;0&U}5 zkXl>ESl^Wz0KSmIh*Av$9NR)I{pMI(RKur#N>H#p0p|DQ_`7 zCs z7zG07^e}5@fVra6XG_w&=5pjl$x9X=c-I01xI_~I$;psl^elx zL|UlBCrJpWcM)j-`}C+mtF_yLA)12GkxhUQN52B1^r|Hr`jl4(ROsNLt5_uKAzVV7 za>}>^a~+yGny}vz=HT#ZT*U2|9hK+;c-&mXfNLRyr;ug<6%f5B1eNtP+0eUAf~Xw8 zD*9k20NAKxZqYQ)mhK-7A#9hWGW+=+h|!BAJqbLNM$tJ1d|z2vy;NEQVOkwU9>1gw zO9F{5bbrWF5x*S}R+5Xyz!4+vY9Iv#Q!8M7qZO_23%(Vd9W7!Eze#20ViY9COX9HM_>Ru3_JPLb&A_K&4Zb%id@`!ujRw(vbE*Hj9_ye1xkJl z2_s{Wl0DC6x@dM94s%K^P4(Z~f1L#s!8 zq>LT~8wjr)bAuI(FxHePZTo~+Kce7rC%L<`L%k1%_yV~zeuUL%{(7-%;#NU<+pUgpSKvN#2WrjF7ZkD(K%27T@7#S`|-U6L5 zt^QICpnEq@nWFWMC?y6}}T%20nf$bjLUvZ+gmh#CTqlleK(Syz$)FrS_1OzcCxb)XCBN?ID7$ilEmPD(s0> zC!_3Fi?yE{G8$8DH4D=f39s(Vk$pT#uKoxEM?<*EJ_>N`!1F5$H=ip{;}_@UU#Zf6 z7m#_ou+_566NuIuG+pDb^jYZj^jo)`?%_ul8uhI=wR9xFv zmm+O`S1dc|EA5C94u1o<0Q`PXxLlpK5E4^w|NLHvH<38v=-_DB82%)0nMk;K+P; zpvBUalK)Y+9kcC@PSVZp!;Z$Y0p|27*)X&&nzF9BIIZDEOsgpVa-g6-QEH#a8rXM7 z7GJnqoS36(SS+->|8rdEGkw)xq1*$&0`UL^RuHF2-9TzVfw^05fOWbI;o7in-5JmM zkHBQ$DiHCnwl9Zg;jCsrI)`+mQuQ0Rd@>R?aMGEb{By37QvI2!6{v9>wr+J^V5tzHjR>f5FwCI3_>(Zw&2Bkz>GB_ zPT~&}6wX0G$8KTVJr3Y^W|tVZkco9XKf6$Yr9Dj!5M~4;0$YmCz3Lx7;ZX0Y%LJKa zH3g1NRg2Mwkw*RE4xPRr61g2nBj_f3rFXpq%+A`AU>9KpeILLJh`KJhE(+a`)RD{o zc=ta+sDK4ZRXNk*VU_BLm~1Ykfw+?pfmHpCq^FjE$0+)V z^^5I%oa#W_ilSfw^04TsEHVF7@R!Gqor0(V3M>jw2wC;WbRaZwCg{2-0Yd2)l;ili zs-;CaPqVdUA7$?SfpjFIgGffe59j~_fa*ah57m(2l=pB#xE>AIL*)k$5t@$3Og4g3 z12hBHi3LJkJ;*VCOgY7mFTl9_M`U4S>gCzM_|Y>%GKL|{Qq1u}@D1TMQfqVPqDbMlN|9cJAv?HxXTM)%rGp^uqrk2{(|nX3PXfu-IFt3)CEN)4O2HX zq@NbeGER&`dBAhDJ#td|xu|g6F@W8R_#0X~4g8Ot!5tKeAQK-ojr(NL^MyC_<=2Sb~HCo$x6zVv*T z#TE&~h0#Nzgvu$J&Ly(qY^CXeDnkz+HFZ!)#=bEt$^19PwKdkM^6uIcNts49_-gncVl^nVtqhs@Kklh zs18(0$og{Mhi{<;AQo^noRqkvw3G1a5NLj3dREws5i$nyt0+1E^JS%u51?!|1vaf# zL0JcTp?XLfJ%CyUo1!BAj1ju_KFlz%`?(d1-bT)VE;xW0jMXeCTfd!#dH(q3E$6T@ zb)}}~X|?`i50zGACVU1|js~?3gQ|N~WA)mn7S9K;?kFx{FLzjQ3Dz)P_^>L;OZ9}O z9tLM)!qZHm$XRdcX_inGgHn@RCWD5ge}0u5l_ByJ?ZwwGP}Q>I4OZJ?$s*-+?x-1K zk!I$?HnFpet3>t9eyZnU-qe>sLA)v)lypy>9B?oy<(>?FM@=KC<8AL(bcHGl$1!F2 zwo2g{rc4{gIl^u!ha@p`|62c178&#^VdHG4tz2Pg-S znn>*$&a*9->y|@nkLq5bb#B#}dA5ra&gb9>2eeWS^0ZthjeF}D$)uDLL9%qqefP7G z>iuY1XfqN;PNfv+JjmC5x0T$LjjR^h@eq^1irrjg$-ZX3lxCNpo4Aeg)!QoDb(FZ` zq+t=B{Dm=P4A5beVU4+|6oTN~awuS^-D{BxYm7r>C$C%?3i7NRK&J_!-hDW0D97P0 zE4b=#lX8cH$iZadmA(=7SmhS)MaZ`?;DOo2NBa$bL@pnbdd~{W_U(oD$5U*_dF76*d@rlEiNK8$k$>g#_kHqWYl=*OrZHtC}SRnWUO|eo9wgdn4omnldf&C#N0q1BEP@@pi!i|L33qX#8;rOOIsewjmwoM1W`RS zp%d3yM?H2_ZSAc5f>lBRD^BS0gg|J%EG0o26-_Q#!!~h(!tCCuhs~U+_O_@Rzlg@H zxV@?22ULwyAwYqc3{DHX)3pYq{}5GEV8YPKCTS^_MW7sGy8U4>H`3Rjaci2YGf<~f zS${7vuaS+!wPwb~aJE&4@%7H+I)Et!+^C;&OyKTp&74SW$f=S?B;ib(DP~Y;wd4Gu z=Z*^-@0gM*xX|2o;oZhQo_A3Yf2AC}~|xC1yTi?yqhD<#id#b-bSY_YeK6D!MVfppi z8_Je9sT~AywaF2t;TuOQ$1PwHmah-yX;DXYhmZzGuSkCYbX)%cqQ8G6;rw3{gR8TY z8@7vkKF_ULB(xdKSl;gVzX>lr%cnJUg{|wz}?>pRKvXe$TeQzHK?OcE}0%-yppC&n%qt#nUgp{SQ&dGTHzD literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_royalblue.png.toml b/icons/turf/floors/carpet_royalblue.png.toml new file mode 100644 index 000000000000..9a11f2507b21 --- /dev/null +++ b/icons/turf/floors/carpet_royalblue.png.toml @@ -0,0 +1,2 @@ +output_name = "carpet_royalblue" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/carpet_stellar.dmi b/icons/turf/floors/carpet_stellar.dmi index 6ba816784261c0920a47e8ff19776980ca3bcd05..2e0eec615d843810175fbbbe7d704e976cb6f9eb 100644 GIT binary patch delta 7376 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 delta 2970 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

    As#*^gULV32P zZR`|fe7>`ey(PSWbZ6`~=Eb(%# z{1!<1$L%ih2&35vNaKhq=9Y#|thGOj z!U1X;3Q$TNMTuCx@nK_kHB{wV*BDp@r66UK{vqI7*&+x53PMUJCNw}Xb0u&FqByLA zR%B+*!*K-XiARgd19HKzo+c=fOtARvixjTluJahTV2a$m7wtpDzf901yql z_>x6Y-6-zS#P)gBQC@PStU&S(0G5G?^Fdj$Z@9MB`CvQd+cwZo6`m01dXpD*8gBx} z&PIt_AUrV!(}nG>SnPd*V{W8A>5%ZmQQvI&Pdc3rACgm^;W5YWh(JauS$+`Ih9VtF zHu>Doczof;1`xZ1EOs(NBG~Pk?0p80hL}ZxfF;=TjL%Nr+vu>q6AbM>5_@-XG;ep)=^=#V4)3y4C=_^51PkBw3i5lZ&0Jr1!XuKmpFhf zFukz36>^Q%B#xtAz;}c1Smv9#=a~TT0T&0#^|3xzQaM-kY>=Y4a*Lc|x}l=Dy}Fpt{zwvUYt7FAo`?c2+79?%*t zgX-8N9bKk4(i+#GC!!LZ#fv)dxTa;aitwy~l<4z76@PHc5g}0&=}Zy_KpXS9VI*2p z4A1lSw0rYuNasy>3NVJ=w~S$kaVLD8*Jb)e$Rw^ZKOI|V7e-IiYyx(pS!h7}qI8?}50`ALUnHdT&N9#?+n0jOR7r%v$Bb!OjqI^20D31*Mp{>MFzHUpHXTXE)#D~}? zNLiy-Xvt*TIpv^gs|-k}RKQemK$XTH@p^^GeF$F6yEmgF=>!^C z{0g|=RF0xersJy*;vDOl3F*ea400RUBoVu3qDG-jP4d`Z@FSgh3i})e0UxDJs!{5d z>nz3D-I@BlI>fQ-a6R96*;#+clL9{pFvUF2lpzj0kfSV5k%pzR0gf-g5>HbIs%{** zpGFHDHf{m9(l?70o&4r`$1QvvISmB=!1i{MXVGTaZ< z0yeb@=rx0@Xe5C?S^2y)$=@EElBePPR4+TpMdnV-(6 zL^XuM3o8{Bx5Np2IYXsJmB+Z-wwQWK;TELI}QeCszR# zT)#poh(eN&SgRLa!r5}NJ$%MJ7p5NT+HbTf}769t(BH zf7LIeAUgO?Ictxq(yxb@d9KhbmF671 z(Vp|L8u0Al5O$C!F!U$|SZi2$`_@UAYW4Gecj#z10B~`pQcldkxyB(+p{A33?}!S> z1>~EayMz-0Q&`);7FwkkCNVT}^KjiyJdbPvZ5PpN@0lH0CdOM27txu-w#7D$+yoV4F>HhjicJuIZqGz$X{N@L%_OKS$N zCA8FfISZ4_h8EMcw*6EmwhBB$-K1~FmTBP2=V`ww(AywzzI}j3GG8{{eRuVvAAWZ1 V;CugqzXft}G4atKJhg1=zX7U#F4zD7 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/carpet_stellar.png.toml b/icons/turf/floors/carpet_stellar.png.toml new file mode 100644 index 000000000000..817768bad5f2 --- /dev/null +++ b/icons/turf/floors/carpet_stellar.png.toml @@ -0,0 +1,2 @@ +output_name = "stellar_carpet" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/chasms.dmi b/icons/turf/floors/chasms.dmi index 2e93b5391120cfb7936249cf244dec9f5031baf2..d37fa7d50c64770eb5404f29f42a9ce71baaaad8 100644 GIT binary patch literal 7643 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 abf?0r)*vivjsCZmLGO{VcA1ua#Qy+&N%T4Z literal 3329 zcmZu!c{rQt`qnW+t4ZTb7pX1P%aoaF6Gc;LNHyrDmRf5GN(rXc(8QL}%p?@Gl_<5B z+D5e)dqQJtsid{EwkokiR0T~*B%E+&uHWxm*ZJdnpZmF=`+lD9y}tMTpkr2@-Y> z?uNOw)P=bZUXo-z+{OWCd^^M=*e4L@6W}i;g@2r$Zgk)tOy1=E*F(TcJu|0Dt#NRy zyV~7j_g{W@UGweYHBawbs~_rSe$o-4h*=yDLbfZWan6%%3=G`?i^GJ`wrc z)Wl_Mve~Ec_p(Q$0A-=-t*XGV46;*S}QyuoJw(#)J&D}!=!vh`$ zA664^GNni!(SxvF8Q|n+> zG}$CHf|S?Ap?41{cl{w~E}k6lR#~8X{P~o9aEoQXLEZSEYvgPeep4yJGs6_>Xwk1$ zR{WN*a`TyyXecxwA>PXl4S&}3*7{N&`?{lw%2_+_&e@1mFp=Nd(E!dW4u9>#EosUg zvptZg{7uHz1BYp$rgv-62z@8Tcj#2H&=BxfQc1BHWot9wc`+%2}DulTXeb#F|^J( zgQ}!~jteTFJ|NqzSE>S|gtx8M^j~AKiH$+r*22K$u0*x2&Q+a0zX|>e$dM*YZR$YK z0aHb$Ac)IbufNOgl4oDEPq&+~pyTVm#tao9`r9iCde5RT3-dL1+252dI%9PJ;Ullg zsWpudP6)uTSh0q!`^B}373YMGjlY?=`0bIf%4*RO%EiKT!`~zgz@rU|mEdHsLSp$s zYAtHQvNx`OK)VkyWcEXlKv8C4=Z#F@z)d3i|2GuJgX3JGP zTK6bWdTA#6fMjuEaO*yMKl);``Y+B@kZ$R$ldQ0>UPWf~RXy3u6jPsY({>1qHL2qkxp0d19?jXDPgrLX@o`$3Xg2M|>`%D5mj^JkB=J~=H z1>v;_)>7l=MJ(_jC-oaH_51FScsp;>UQkBI_3e9X{V4NKR;pTY*;_w!hb-z7O$pWN z{z3(-T&GD{P&qfV-(0mXb{Wa(y1sq9DZ1F%F&n-;EAiaY>*$2i~DTaFco1OTrXIP$yV08n zf`*dBOObm;VaTUKo_lGl09uHeW>89hSXDYz|5wu56nb!R<_$6Cufb^&LLeWySpBjqp7xL0;bVv$H$%ZFWJ%JmJECqa5dbNi z8{Izxf3VJx&k@v;jo#ELC^H*H8-y>@K5$gYh)`|yac|N$fd=;P%sKI72+Kd(tb38N zFE{&>d|}v{2f`6$wz4Dp*2x^pZHb}mc#79@{u?KmMd5Dw!+J>Y@zDcZ# zf&2@984UlQBhbvRUUImcD%s=P?h&XwfD270GB&GXH-*w`EDk1t+ywG^_8{Y}{hMp{dtc6;mwdR! zaJT!AJH!h5MfuZ{M-7eN3`tvyu+x~%J6Du;C8Q`kn8P|PqWgrNPJ6epa%ErwAQJdl~?f0J!`B{cj^RNt(L?hH5n zJ)dEQN#MD?py6FmeKVbIK*pc~bdhosoSb^z4W$7rWm3YlBM{378bV={C;s^{33aF^z;N=9tX_)XnTh0hBWdy2(~~+JY!1lr7`?7duE2ag;$YRFj&F=; z_~mN^%Z%pd#*LF)4<}$ASdY34Jg#qGB{|R3t3>sjC`*}%125fb0a})Zy*fxn^<(NME&Onm!&G zU|1X3!~68p_U*Y%9m5s1ZW2{QeFWi2z>a$tycbcayI|i|?`zOTGQ0iSR&U=f@RNW` zhBJ6rJCPvhp(uk+Y(RA;b84$ZQ%W@0K*3&u4=1JUmNg^8m=-uCX=uWh4YsgT|ovVy7U9UH3M|yc`*3Ox*p)c)K=@%%1~h)G65Rz>!=@UoC2M?bbxOvrb6?kQ6$kq(~!MLn7VMml)m zr6EV68Bo_F|A=;(9p7y-{2yQJrV(8m@|UY#hd7^D2FW=3GMYsn1jPe_P#jmTWI_Yv vE0oVTjvfaIsY3S@_iD&j5Fg#YynW@})qnwoSEZ646{#yG=EhYQ-R}JxXpE=M diff --git a/icons/turf/floors/chasms.png b/icons/turf/floors/chasms.png new file mode 100644 index 0000000000000000000000000000000000000000..2a856eb8aa42d7c188706a0e461d2c0649c3a8ae GIT binary patch literal 6029 zcmcIoZBSI_6}}57prLAL$Edh8Lt4{6+9pl$0|pyuR!6Hz6XTDF#OTm;YzeR;AS0kn z{D=x#+A>Olrp9KB4aTM;EG8}uDB6)(_W=+Y#gO|L+Rz_YGs}OG}b}{8Fyv zZi{8#6H9*c#F9sMe|X@uEjc+YE$!u%_?N?fzKj2le;c{=s#Ua-miF9p$#0%6KQO_y zENxXzc23R;7fmjEZOgH;&EHEJxUiyaN=a_mq09 zhVQ5PpYc!mQGEQogoM_kse?!PJ&@-uJ#;b7+81H%pebK|eVp~LG=K*!a}yH6TDH$f zf7Na;4Q#gc8ce zge}F~2!1#`*RMY=?#M4VhzPyQ>T%V#0FD)uT!x=<=gJS#tFMnY^j@ax z@ZofK&F&fL)m!O{><=W&o#2rn(Gvw*9=A;O-%tGnNZQ2|QS2e`294%wL};gY=7Muk z@ou9QyR9hjmdfhTnO197Q%X*znU6@`^fe>+tuSmMCWMlE{kz1w)0VK!Iojn+1BT&O zaj($0QF*%i24FRaYxw3dF*@Nt-3PbAO-FpBP)uGyrpf%1*4CHwm6tWLXqi+S{5kj$$h(h+)4;O=e#U(O2*6zLJ7ALV4*j> zGAn_88Ziqt?O9qjJCoFT6QyG*!e4z%PC^y1=+2QF`WL+5o#^|73cf%;=I0=Gh?q&qKvhh$;WgFTfc21(A~qiPvie-nNaHE-;#%SV?c zT!L5T-M|k8+j$M6={IS|wVHmcnOC>cDGbU43j&%nbj=iIFH;O4shk9BW9Op{#WQa*T2o!4Ns`$qHIzT<2B9Rzd4yO> zTJl4U!!{HpGKAV!G2A-KPGN)|^~K(0u?%!MM>kMIJSW#R7|cvSM#&jvhGCfmkdzY; zifeZc(xLs-OBJ|{ffTTsjny?9cfoB~5_KPqBek=#m5%L0P>?M6#vJM3D1++$6Vh!*Ex)V5)Nx&rG5=B6B zmh$Mj%RG_~=CkY@eWU~ZQs||NDoL&>5^VAG30qO-HUB6PR5x~XqeaQ1po|A8RxFE! zWwTRmfO+AAB!NgyFYySUkLq&PnNJSK$7y;5HE>*_UWc`i;+!@>1YrYF)@{Y0;&3r( zj1SjqFvfOJ#LfgOQKu(@65(Qi=KpaK;z(F zEJ%Nhg{_a(0E5U?C>sL_Bjqk#rw7})dk7fSj!703;XTE^P&_YQjYymvbx0)92Rt=w zqlyMMJ+s>j!A@aQ3*D})*<&a;S*NO2SxO$wEm+8*V)i+r{J9Bv0w zRn+DdH6)Qeh>x_ZoR1#C{2?8GrR&+=Wz-A!$BssRv-SkghqDbOPFg}hQaG*2C`N|5 zNH&!&a!91rRB`T20b%?D6ll*)l8a=*_wkB3Y>MIYQOsbep)q5QnUxV*A-O5C(M7rn zDGpVXPuQebl1qk0*#89xc9^de%;d>ca4KrfL7$x0)g1UpX`Xk_qGQ1>&0FGHLMp--bvs~-r# zar-G^qhgL0JEVlBFe`XpVF{g4B}I);TESc@5{j0J6|Nk%@hLJfpfThYM_Cp~q;&Au zyY!Ume7xeV&D2e6WM1_z5`WAp{{fhOp{#_snju%Xk?L&#>oJsyAp4X5t}3! zE33Xe?hhemF-6w0>#z_w1pC)8{ZvMMxN*6V8^x9^C-ZhhpjR|0JwDnzg}2$9kQ|HT zONOq(6C#0RGht)r>sO7{U`qr|#A~IU{uhEpC+i>nC+maGHG~+(r4XdaencD7X-$*k zprD}+U^)g2j1QUYUktAiw%Gtcd$zKb{MAnn;Tp#U|9)nTnr;Xd;@XG)m+KLCg@ zw3Si3fbApcZ;;b*OrutK-NIgXht_wam3>4w07wCR8Q&FxKG0_*yw8 zascNug};?xQGg^A+zC3&A$=c3SXE<}4j}AAaQb9H%E@6^Gg`)3dp=o2UE?gn5EP+h zwCm1c+h-#lk`Tvo)4LGc58Gsi%E48Si}2~}GkD@JUo}*c0Yecfy$;OM{*`KU2KlsCJgO-}zv5@pfxlUv2+YPiJ8|Dir zF7#ki=@+_#a)^|Xg_Q)${{1W~b;uQsD~t%yBR`9bGQ*)LcmPJU6k^qvq(`9uLr8h) z;u<=cIq;-9{D>oPh#CnPZ}Lr&mRAS$e+q}q5%OGmlVne}ri0<{&BK(8`WseO)gf&-sX;9l;@pvfiGckE zILiDs=A{GqBX87jmk7fZ8CX@O1W-9>@_?`qCw>&aA}LJRHe!UIg0zx(1+{h2szHEvei3 Y{YB+pWX0n(yRqaa%abdgeRbP^00*1$2mk;8 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/chasms.png.toml b/icons/turf/floors/chasms.png.toml new file mode 100644 index 000000000000..51e70389edde --- /dev/null +++ b/icons/turf/floors/chasms.png.toml @@ -0,0 +1,2 @@ +output_name = "chasms" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/floor_variations.dmi b/icons/turf/floors/floor_variations.dmi new file mode 100644 index 0000000000000000000000000000000000000000..81cff6d76e86d126ed6819a978530079f262efdb GIT binary patch literal 2873 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 LU}srv?h*HYwM@T* literal 8083 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Ξbh%yK< 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 &gWe~YMRF2-M2J4Zo+Wzu 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 UEat!)X{x(-?%yuGWfT6t08l*zV*mgE literal 5205 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 AmjD0& diff --git a/icons/turf/floors/grass.png b/icons/turf/floors/grass.png new file mode 100644 index 0000000000000000000000000000000000000000..82790712e30b7632a48908e9c0a255034f3d1b04 GIT binary patch literal 14338 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 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/grass.png.toml b/icons/turf/floors/grass.png.toml new file mode 100644 index 000000000000..e06f8518c7c8 --- /dev/null +++ b/icons/turf/floors/grass.png.toml @@ -0,0 +1,14 @@ +output_name = "grass" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 50 +y = 50 + +[output_icon_size] +x = 50 +y = 50 + +[cut_pos] +x = 25 +y = 25 \ No newline at end of file diff --git a/icons/turf/floors/ice_turf.dmi b/icons/turf/floors/ice_turf.dmi index 61574645759c989ad26e6403f2332562da1558f2..ccb528c872d6c2baa2fbc8548274245c2464ae67 100644 GIT binary patch literal 13249 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≺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 F{{`OhGED#g literal 4712 zcmaJ_X;>3i+jgOb*DX{O7u0|jL1nR31QZz&DN+SgY^4Q>iXe!}jtU{ErWSBRtH`Ft zN)>S-Y_bR>vIxkkqJ#t_l0a6-HknK^+1`om`@P?f@A`gZ@;vu*-}iaWnUgcQCVOw7 z-@Mt&W>1?oZJz(Go%_-6&!&(0O!Vpm77k3CHp6W1o&&yUx_3y;A7?70qA4*~tpepz z5u}ttpmb8mnG$jMoFTPZjc8PASUEb>%^Mq1$ixbnXq45Xh7=09cuG8uAg~$+AxJjK z{|qT*T12hYYP4FlPKONizSLBAOI(VHoC% zxRnA}2`LUT;ou=yE|-Kb;VFrzS^&!xQUwH73e=EBeP9T#5WotBR4x;OO4+_4^}Zok zB;-g@9}!mxO7{=JXnzm{YE0e2GO2h{Dptd=OePkK#$gp$B~VGFB9T-yDH!98v-sn~ zFeKkQ1P?R1Sp%J7!PqFP7luLJ7()fg5dYW0V{MvVp*a9IX}p3h+^(KS*?G-{=3 zz2s7{R2<5Le`LZ!Ay)-MYKH;2Saa7^?<27v6q|d5?(d7&N;2}UD387v zom3_^?CXCE$%z9=Q)_b9h0AZT#*SWH$Fguag@hx?yN8W-`(x_vGh{#Br;a~ zm@~4XY%Ja2Ylm~yJnr>75=D9zi>*Vl?g0124ti?U$g;B3k+$qscLVm4Rh5N^e)GL?! zma^ktyqdjwW}iL8405#ERy7>f?z<$(E!4}OsDJ7i9?E`O)LlnSnRnw`ilgjya>mC5 zt?FKa-we2lceA+8PA=kBjde!?+15)zw9gk0`r}q`s%D;s%Qcud%Yh9oVvDWhUp4xG zlSK8Z;(%7)@SM8E(Nj0QUh{4Whaa?wzt;9`u{OsQ1&JytkrguO^ z*A;`}Rg|+m%);zm`*(b|v<&E5D8bYG6|ual?l>~*_aJT>Or}K?tCPu@E}jdhJ|idh zemc|8MX+Mj;*NR0`YmoP_;VPW_|}|d9eO&npr6B1k!ceiG&b)EVI`vm_hIIt4JU^F zj>jK7yl5>upz$nA00c!NlH`ST?4)a4L`5FMFNwG}787^7PAzhg>}HdEf+O*-20MbXB(frI$s9t@4`FZ>ei^ zrNmQG+!OJEp4CBs$>3ht2?+={eHn!;sfLn@( zkjoTiu|8BC^l{H2_GDV`DKHW(ttL6}UCKx?K%Ic?5Vy(c3{#BXB&n|nY2V$Gqi%hz zdkxt`WIsdiqk!GqRfL+4NW%hfqo%cu7%ySxTN`M_OKB%a2agihkjz!&S#J5($+_Au z6rXZjbsV>4yYkG#iQ~%5!$5RF4_sok{`|q)ly|rb`uoi4Ad3H3?mxx7Zi2^D>Ia>p z!D12vS+-cNZEVr)F(su--Ls(FLdt901>*Gz$Z2jzyAUeHCcMSYXB8DKxps9x6r{Il z^9I}nsp-xaBDfzAT7=JXB{?>V&hU#rc_)O#!`RM8y!lt6QtS5ehTJO*J=h&6;Zw{= zO|Hl0z-ItRw!rA`+tz(dJ`{QF>P=Dq7sF`tVRL-WEtK&DfK80U{i?^?Wk2_%;IG<$ zq-edfT*R2w#ODLTbjOG63u;Fzr|!c6U)>8czQyh!{0uCS$Ciz{rLEOlwP7QGx7(be z9c0x=Fkmh}3pi+8op+Ki?IMn+W#QVRZ0^*2zv%3VjHm*O9EeGS%Ka z?h%Gr124i)-wS6S`@5Q?tw}l9h1ixA4B+!m{h)Um(?*@1|Do14(1!l~S8akXQNk)U=OV*Xwi2Ds&k zy2Yr>s@{u`m2Gh^0ox?oB8K2VN!51ekNv$55e4$ELAp~I={m_cQ~AK{SSzNV-HqE) z%RL|Vgi^E{LVp|2NH?`bnW5M{sm$xA>0|Fz)@RHz&s7tNWe>|JhxJ8aMnzFsV*zbK zv^p+hxH!%YK?1F4A^3|W&rM|=0$m%B67o`<>XwDE(rX!{oTA)*@l(ZLChN;`I6Q+L zA*C-f!wp#uy$xHcK8+u8a@o8^+LGPQ3NB##Q7(32<@6~`&k-HMwHC~<4QtI(&bK;Tx zEZyNjQ@)nkp?LN!J?7SCAV0;_LY7v##4^?sCU+T}*Y<5eM{62^*;^X#U7lx@$7k@?Kkx!3+^$2mHgv$U`0q_ zljJw!*%#~av744{1nNHXzX9^E`bqL)O(UL@#wD?ij?8nIBf*`DbIY3K9|Q8U{TQ_t ztzgD=c6U07w|Pm*+|ZCU>~jT4tF#_W>;=yzz|1t~JlIgQZ8){%VAMv!x;SD++GPGX zDmPc`($`UZG#x^nO+2Zd#%Iyu;*%l{CmQDI*WA$GnZ(%Ms{x!^3Al0izP1~JMqeHI z{^oNJ-mmlG5+`*wEZhzQb}K2X2 zU}nCid58YUAI8=`+)*CpAO~CV14wy6dSSDc&_?s$eesj?!Tfq#*kd zpP!&LZ06W6V^`Y|lee|q)P25ze_D8k7C9Rpb_(YBF?>AVVf*yId?bAHdnuT05u_q- zL~Tl3XpNN36m$7P;H-f0gy$x)&fqtk8Wua^>9gd=0CzCwc53)Qw~i2179SM07}|(#m3KsxD5OpwsWYb*{AJgm@g;Zi=}`n=|osP z5u^Y0eMIW7NZC?@0|0jk$DATIRUUHLPZD9?8L(V<_Tzq{XXA@rd!M*fsZ(zt>l?_} zOaOQ+foGTY{|+$6fEUjwOMw!4bO`q%(mXcnogs)RU9_JReO0(HzztW3Z70d7C36SJe~pNyZR#`uZ%>o*NzttN~Mb>X%UJ|m?i(@@M<$t(&tb~K@) z8squ~+VPV)ek26!rB4QE@YL5xbEO{7gzQ&F?jZ5vNa!Yt)Y2=(Y!<9PB*o=f>JKvw z)Ja4u2`(9KEwQA!WDv`h$m#_6t@=0zdf1P>eTbdvXGCCbz^tu zpI`v`q$y48G)7Lm)jUG&6O%fP6XR%nEE|8hhrh@qxrs{tup>HsM>)6&bq+T^gGbM#u>+)wGEBS z73miJp_J`Jr*=D1UY-vTt0Z}dEjy`B+{*@MmrPx_l`*fx>%5Nj9ZeurBz8(8<)m{W zlwcQ+FYqC{6dAk2O!92&CG#~+a}6%B88b95_PdY6iE6+Btvp|d;>!)#F8k~F_1UPR z%1BnA!~eiV&s2f&J^`gyqV!7SZ@ME&fA$akGD?4n(r-|J5WVJ43%?A*;T3(@i|!H- z6B|!-X!{6|%GdBScZBItAn|_#8W1Bk0l6r{8D%W@#4k)Y9QWpDuIqPk-il9NhJ!+f zKw!=m;J`Uz0#oy#-pd&0Py81@^GUx;d;j8G#A#APd3^`>#EZUUEB=7QubfY^LM@LH zzfGk*9*H~BZ`?`2UAlw6a@S>925=rQVz(GAi*oLofOS*Y41@h<+*W!>9nNt?dIaaI zZEn%8RPC!arGL7Gl>Z;_e^|&;M;6v<3NFvtuRDB$h}AxBGfv3Uhy3geE;;O0uXX5d z1>ade>oG?5_{Ej4Gv>MCnwp>J@Ph>9tfvan&!F7;8TvOMjhsTk?TjmzfMmhE!3?5B zQ}fGy>;tzDSmUjnCH4ZcMh}1DV^Alpi9DNsrYspHd0zy#9^7IoO3=X56pW(5w*NQy d#5PXXzIxGIcY7igeLFDC-#2h)*^a{({tbYGvVZ^p diff --git a/icons/turf/floors/ice_turf.png b/icons/turf/floors/ice_turf.png new file mode 100644 index 0000000000000000000000000000000000000000..26887f27853775d4c93d43d484e14f4da4bded45 GIT binary patch literal 11601 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 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/ice_turf.png.toml b/icons/turf/floors/ice_turf.png.toml new file mode 100644 index 000000000000..3aa5cdf4a36a --- /dev/null +++ b/icons/turf/floors/ice_turf.png.toml @@ -0,0 +1,2 @@ +output_name = "ice_turf" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/icechasms.dmi b/icons/turf/floors/icechasms.dmi index 5585d792ef86e8ab5fcaecf70913f46668020971..e01521e34416d19f1ccd575512f02357da61e701 100644 GIT binary patch literal 7713 zcmaiZc_5VE_rD3rI`%z7g~ZrZ!i=a?3L#k|lXYxmjbTQzW>8rZLkL9(*|N(dG`0+~ zk2UL9XPD(Xecr$Se}Bw8Gv~g}z2`a4>zsSeed5hbjJP?(IhdH3xNqIOX3n_I{`;Id z$@mrrd(JT~2ceeM0oPpoVNX5$0z793+P+_br1YvSpN(LAC%}<{Dx5(*wf#P0Y5yny@@D zJ10w0iokP|Q#vx+F9tNuzwN4)F;l8~bW2mIYVKy{>0ADhRtbIMZ@faBJKt!BsV~1C zVHRL> zy^9)hyqgnJT=F+}^~&QzO9-E;PV8n`-)H~(R=KUA`+xrq78qsYAje+*fq}K!Iy!&O zha}^A!nT_0$cHn?ODc{nlgAruAVejZkPN-3wmmh2r0Y>Q=csjmHntPOW)JIpXQopZ ziZKxrQxfX=%nvIZTU(w`m)9z0K1nIij@ByXq-O6<|M_;j*>rc0zEL-GavX<&&LBv0 zu}yo^^-nr2>0k)T57i|dNdd6TxrQ22qzp0#L{uJfwHmuXC_G}on5D4j!*0FlXUjSL z$6KvXL=4`1MNfwL%lSY1xM9auP7TG#&3c}lXTFG&O*I3U)$VX8owD1!XS;?xxG^gP z=>nRspr7TxuZ2b&;-GY{?sFwzv*8nu$4sHrfZb&bvL#I{O{In8Z1Ea|q^OZ|)}W5a z$2Wvm#2yZ#X;=jwc>CXRW;HW~U-Ek^ zo);e3LL=Srj{JEuaHy}RFP5uf>Z_y^&XAU`PY^R}aW16~ocO4UXn%5ozppC^{lvL) zAy(_;v}03{cS@9%{&8P^qIqrJXvBrHqb`2bmE3vl4#YI00is22Je7|#X%w*9=OUL_o$KYDPCg-!2w;P_%FC9j5@pu_`9-E&u z8~;q#r4rws$fEAA;XB6?%45F@KN4SBLArCsAwl7LgAdoRt>ArVG2ixCzb8+sG`QSK zQtpj4o7WtSik%zfu$_R?NCby7G40FQGiRO@T4tP!p1x$Y)NY|4Ky| zX?t!v=a=83pNAQa5n}3gA+2Lf!unt3AR>jU?NMyLJ;`%Npkg`!n|#Ut*4;$O0_3Kb zLT=WOEgd{#_G))`SB9{n&zHr<{(QTl<>+rY3p0YoAloLl<#>6V3nVWKnDr{}!}&CF z=8c?ibDOSxOfiz@N_X}rXwyr7I-er7?hcEi8bRPV0SkFFQb z$Jpq1e103GHQ?;-D!KLmcYUjeDCS4)UBMV~QZ204S{FNtpR+R`JR1kz@c2Dc(V=yf zgg&V5d>fNxnns}>&K$O2QKI2X=Ccpy8YNsBY2>42b33|P**<6@JkcWa)VWh@)+<{l z0*cK(8P=!M1n*dTVU0XFM8Pb=3V^2DvC3mo1|gzPBAOwfYebPH zKg$K(&((#uj>mVspnCN2k{XBIhqn0wV+@PbBs)p2slWRAi(X|xe0}!nDKJvMinA}H8k@MHs z#z%K7Fd5VF{BNpQ{=*=O(y7?7_Y1>zqLbgA`B$jq!dRv<-%dP+gIkxDW)x~zYhF7J z(_)>#Geb0|UcC@Wk-UrZzx;B;0B0rPr)asG$BlT?I&tvz2-342Hqa5FbiL?@iZ|WR zCIMmAODot3{42r}SAyOaON<0Gj`GIJ-9}<`x^ciJg@W!uW`d~?|%voW%( zE~${|$2U(@Gv}{qNQz)$;C{&7^G0&)6pt~v3P-f{yu_l;vL*J$0}OqfM2!r!chZf$ z#r@U2YB}d8bNM2^23ap~vhob7uUsy-4eSWTFJ(npddW>sE%YDG$vuv)HSXJjv+tBs ziDipX4F?ZaZg-7)@1IM~mq*+D^qotN`xft=b+|P%W0pLZ>U~!ieo81w?zEV7@yl9M z9>)s^;Pu)XEDsb-4!7y8JHXmKhe|L0s)7zoDTRVqF&=oH)xkrn9lJ41v`P>cZ94ys z<(;~PO2s^jF0+%_?t}N8Ho9VO$#&Y*DYU96l1FJF#@lQx{u{uRML+;q-%j~+wMS?` zbN}rK#bb@|E9)p8y9?;_$JOJ|8FQ78gZ1%EjZxJ{ik-tz&zwB0PdP_8{^M%h4z@ZS z14oW*e&kH@M@@Ccqpd#`vPszWJg}?THsab{@ZrC~RyX(LubMSXhPOusZeNnsQJd5J zLbQkR@W-`&eOYV^d!h05?GvTN>NPDqZRO046ih%TH9uN;GXAj)hD{d#1uD-5!_EWK z`m==z97yZ$Zk(nWkc%ziXy_$~qc!2gBuG9R-CrhU{1cSoG5cu^s?st$xu!NZY(RfZ zb8{}Aua4G{HXrUSC3&ivnIKxW^@eR<8&UvS!g%^+s(*!VK6Fd0mmX%P?s;su>Xg+L z6kT#}TTkBD?_t4*w5yk9I}Gv)dAhV+`neJw=)Ima=iQ+aE-%-O5P?LnSdaX?)d-}&gA1Z|6 zk=|Z*B*WU-?=PPb$+mtBq4GcdujQ0{TV7WKRUu4;kOeJ7cEy3N^(FfSK$tjwTSFe= z=>35LFdk~6!C~;zm~vKo34*IN8uuW(l!O2?u(B3YAXWR3vgSY1av;u;chpZChxM9d zM*hIRq!bPHfd&#vNvL9FP$HSIFOBSZx0XFYLkUX?fVKq}qtuY!q!v`NHWcs%v0ZGs zE@TVq;vPHwc;G3e`GVi`0}Raz(DZb(puTL1;G#;F|9&qA3|pS23d!UD`z&DxW+vq_ zEYU1NHghZv1BPNS6aq0rr?3pkQZ%Z?eKLFTv8!6t6C!yf!Ai@~wMX?;R=kYP~ zlKK3$#q;kDzrLWqvsvnuFV^|FOYJfO)N!IT$Qz%1%$y##bz`ZEttK5;4x1DHGE_)m zB%|dC~d+*wkp?2Xw;&+Bh#lje}91mpWJ&7%~ zS&`e8E3$vR7jlX8Q7?4Q{nTLUQ;ul+bD_6wrUfEgZmOtBuswVOYh+QMJ5juKjn<_vSQ|msp1epUf_LeQrSd9G6!2h`s|ZweUUH zJ>jn(=8mhx@wP2ADL0DNzW>(i|0^`)7+qY$O()|g$R<(j_rDJwe*S4zMDW%9Wk9tEfNgJ4%oKvOKCeM z7*dH!3;**3MlbAO{iixaeExW`D>%x+!v~>nOui!Qy7KWgp_1|7#dCWNAV1JsbxUi9 z&W0tewh3=u;tm``%PBJ2hVHVUa*MmiDh{-fE~l};YZGR1e($hmsD)!~G7=|oX4I6m zSQ67e0UEMpBwCgGkjMGkfIEfmHRp5%OunpaHMC1DEYZEUh~t8Aw`hs0L!JFUizgk|P@7_IG z%!@%=lMR)xM{HFJbv9}?Th=Sz#DDQ^A-i7ocn9!%dX;u)@#NwGkw9s8gr z=+OfK*wwEw=MmyO$|5Q#iDOb6JQ-K-T2H*%9(o#!kYsybJ9Js1$oA@ggT;cFC+GoL zo;-bLL#?w$kGlB@T0wfoK<+QysA8t#w(|M2w!OhLDDgxS%sG0kyXov%+FDY#?Kl4D zs$=1SE0FiKh-G@yeW%?_6{QR@lyJTC8>9qQ7c#H#-OXNNCA4F6ViEgZha*$C%eH!G zN<@E+6sOnaX0KkUEj-u2WIFJ7syQr})U@>4Y+r3Q6`Ia(!d{n>47d!uZ=OQlnrf=+ zksXmmB##1XeOG{|Y<;#Qr)e#|ofcS%H zGjX{AG*>mRwGd^IfU6hoqh7s~Q(!^&J9Ql%hcgqcQZa-75C_UG0Y&{+0{%LA(>FP# z?Q~3x1bn#9hM0x6`FV_h2AYaCs=go(S$RLp&3RbqZryY17`yJ>{+6JTdjhua7qA~PEwW135US9o^Eat5DZ;vNAgEn<@j4eKm9^VEaf zhbBo+8BBVzxgT27`g_;cgYGBa_e|7)(?_I;(0T82GJvfwB%uh=udADm!kmp@h2PY} zr5a5NH1f*~R|(w}dW_;qU^{`-@8<4;qA!^x7_LJvQMK{0#U^&Tbm0Tjsz01RCs6FV zOZLAEBRUC8`=Wl`Z1&F)Qq{?ClYxLdFV*Q*SrVcaJd_hVOyO`5J_u)L^uDDz$c2^YI1|fY4*G7>W=7Y zGVG8`gt1Zhi(D(C(|hDG>(nG{#@ZMkP(+OXi?c)3SSU;p*_KLcSjGMGs@*YcbDnuL z!PMx({O^A8IwrY=rNK8Jpqzko5hvl~uPhWUpUBr73qK{q%>XE&)%$C2VK}ReR zEn{KxME148+jPMO9FUdetFaJd)6@BqhA>K_u!eSYhnN_6BixtE`VZ)WFa}2u@HrT| zrX*YhUjv;zB+r3@l=*@b_w_NY*Gt#)&I{_!WZ`Ob)dRgGJknxb>{`nNXT4(vCWs((Ji87XabXoNqb_w-~Zelo`qf(pOYO=JV z5!1Ju2^G9tOX_)A=e*7rNYxHOM_o=1 z!r0;6#hmaAKap=(`E?bD)34ov8L7?oO(hNqw;xptQGpP_uYO)4n~UYFL!{aEsFks& z515vZ3~l;G`I1e?E+Hb$2b{`%o|u&W3Jhx6uj*hk|1*0#%B?h8XU_)c-zJ6mC0vJu zh}sqKzIPevxZx|%@!50ja|^^G$+X>!Ne_|(_Mz))I>~W75{1}?30zql=g>9&RnHIE z&1VWlT(O&^Ejo!-RieIAKz4i(3tjlvpUeMEDi)w8TJf$XA1SjAuNr2XwQ)WZ2eU{b z64&eg18CQL>gkA!-naHW0aL%x?hU|rkiG@KQEej(kIx>c7+qc(uHR&d7T_dKCRs^@ zrz5(XZiyzFy1o3<3OVmLDSsRD-Rg~MNKE5g)Kg*~TX6jZarMK&iP0rdvex|Y-JS|Y zV_A|JoTB)^8sGqU!{6R%$ zCN#H}vT>hq8t@C^gVZVWrqA$6GEC;LLxvk5b@_L@eZkN_pn;ywjhUF#f8Y-^l!6_93y?YU#i-nknG>}N4_A}%ACGnAkZLrP7NHYt)535R>|Y~~Go%+*Nx#&} zSL4+moUc(=B>T`WmOyjAv(GA!U+%DZ@qv8eccy58|8oVSP#U`cnKWNK^r27O`Dg3Q zOYT7!0#dm|3h|*oNg}d=SCd86#X!7!qL_*_il7hD?zqlL6OxBrhRZ`^{AKGNZ6x#3v;$AAsE0VQqsXR0DB*R0@;4`c4rlQrB8ewR^S4 z)`!NOd|Dwd>o(ICUhkU4fbzOpSWTo8vsN6gnj2^08n61H==V~ zCH`{CG;83y4);2ZCDHOH(#@;^?>fFkP(u%cFIRtb75Q*|ksY)Z^}T*i2VK&80FQz|GEe4BzzT|z!@dw5*lc3#R3CPHdwZ*_QTW+i54 z!P}(KY0iOD4&n=8k6Ox1*k*a0v1Q%v7WrV`8r3Q#XKWo;|K>VpelA2LNNbS$JJj#l zvxX)&QMNBOoN--q*UF9$w}4x(w$tUM50z)KVv4(~{PLL4IrkDyTnW+qwrVv`{?Hxj zwLi=JZYE{G+la zhvwekgR7qkjgDs;1K}Yz=3d+?yFao8Fm3K$Cg~tXt1hSXb2yc$=n3EGUDN>&#ES$8 z5X+p6NU=t=*ebzsgZK9rNGXN$`c@d$#kRf0-i*!}aS&K|yf_{4p15l31a1v>r&}Tn z0@G`^v0g(blD-?kuU~*TsO*Hfl^*zh;khgfDwnk&u9`SRY$*-WK1}n<+O`?O1e~zU zqqCJ|_NON#kG`$!_6n!u)H0-RsoDL{Kg<`T)z`^BM0wdX zQL{H*-1=_h|1Q_VoC!N$plyQFR6xOqgObH=Zw1?`NbX6)8vWg<(*OOq%Q0(>(8R80 z{blvL0C`K;>zlsfgw_)Bdd?cKS`3vIzGfJlVqrh5BL{iNO`g-kKCY+!S(`ya^9V|> zK2rdv-8{;sK?6@l@4QiVUjfz&wCukj=Cs%}GXP~-{{b{tnL9uObvfF<{=5SbhCqar z+Ba%Q{X}4c)#cd9HMXOaM$8XUL=n^}GbF~V<1i7|Egh?t(r($Vjfa0I zW60ya7$r+_Z^4LwFnsF=iXeE0F4|;cHrlN@kYC#-1D2)$2DK8%%m&I*Cq2EsnQo*$ zLR`#M_^F>@|LaFX%U2qs6*SG&6`L1i+=Dkc)=8GWPTpM})QWr;8J=iar^r%!s2o~y zXSA!)tg17Ik;jVm+%h`%p?B!wJGaU>O9;-K71z7JTnZH?lnHtF~txSNIdE7auy>Azvo|$C_y63&oY`$RNf`6yvL2-5&)r+3zFu zM_NLf!;cR>L{o~oV4{vFD|;^)h2WyPVym$4wrc%K&OKspbSg~)<4yS%rz28 zD8=GnDn1FzX0I)U@tX=kv?Vc$y53F#v-moyu8RTY{0IKVR4$Rs$eA%AjO?h^MPR;? zBqPOO1s7w6Bv>4lEkM#xmyudU&6}A#5&DV8+X;dCN~h}FS!H7Bq!xL`S1B3dX^XqB^@)CP`KNT`V0I)1W^Fsi?G;816#~1XYh=TFoV?jL;(EhO+@2c>)zn> zTOu?D-2>v@3`8N^8UhGF(cI|xLoV|n#^0=fWuW`i#;#9s0b?LD!4&_JA*29P3Q5U# VMRVRV-uW`!x^8mqvw_p|{{z~=!3Y2V literal 4129 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 diff --git a/icons/turf/floors/icechasms.png b/icons/turf/floors/icechasms.png new file mode 100644 index 0000000000000000000000000000000000000000..c47756629b524d6b1ef47338f728972691ae6024 GIT binary patch literal 4131 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 DC32AY literal 3648 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 literal 5209 zcma)Ac{tQ<+ZKkIv5ztKlC@!weIm=qFpS7#m?#>19@$c)%`(<8jARKRQ4$%n$U_*$ zQc0+XC&EyodSok;(D$44yx()Y$9ufr_s1OfeO=dipXYg9_kGMCzqCV6b|O$YC=U;h zh&|4Rz{9h{i~Hl{12PP3X&SHyA98fX0;^Nx5orq*)Dbgfwu=f7?}#Ee9pA%55MdeG#NNHHx|0SbNZzt zd1vEO-=MndibXQg*gW-H7c*9(?Q>Q}$C=Svw-FV8;7-zCE8joxL5gs$!b|0J-<(xJ z#?8IO%or%2W=2(VhyR38r(c0=r?PK>>{Djwk=Kex_n-M(;@@pxQ1a&Yz%?&@gM{cJ z9TPsS4q#_)&G%tM|uN1iok&Ia8V^ z?09%!YxXu6*O=nJiak>mj>z^5MD;w?3?5B+;}6oss5}o!m;$NG^;}qvDCM_#Ij2l`B*J799tdKmQncb-K=ba{x2f_Hfoi=!>G5!n&|2dM!kY-Ir+oUEb*Wj|s73 zoZhvGXwJa_*;1&`$6c3t*KLo*%&|gzm%g#YHWpfz>KXKmo=Fq=kId@|!(hpTrOR9O z3~_SdRoZEGfRo0RAyg)<^r*_)uHYJ>(t=s^)1b_y)0@6zvRvh8NR1E&MVmLA@Vwb( z74~Q9B7Ey>4tNCer|381nsUOZO>^9=)3sJyuWI+5rK~}fwcf~voVW6c=kP|>CF*=6 z27wbh=l})xiwQ!y?H#5BS9^^^w5)>~yfjofx$uq3aM^j@jRH2>Ue76vnPsDTO+39% zaf52QJN@}d@57YSe&D$|%?_6<@5g*ejB|^*Q3^RZ(Z40dIF7=knZr2gL!Yni-Z)-7 zEu`UXyGurtJ;31i{(U9nS~%C7+xbA&~5v<6cBuZl7ot@cb(GVVDdb zJ};}`{((Od+DP+;=4b1)FKgJB{-y_w z=Z-k!e4IPDgzkKAT%H>83NqY?+_>z(WuI+;|G3~wX9ll}#E#HypWdNdc6s2cK}UKr z2r>6V)c7fx?E7P!)1wEKNx6_MWt!k(zWYat9$EfA><>WxCgsN7eYDTFHhPl|-mix_ z&&6J&Pw#)9au0qcTSo~#xZg=nw&wskjpp;jg- z#J0^Q%voR9&La7v)irvDj=;s;?TFuN9!%4ubHJrHPFPS{>zwz#k;&GxH~vUb*h=~< z)KO-JvP-G*fZ_AJoL5nDSP16^)o-RtMyJ2%H1A`aZH=C!fZx71M9-yGAM(Az9<&E* z{?r^h>NEWL(nQ=RomY@H^A6(@@m@`{eMHg6T^eT|93H*xHa#dbN9*i^j7EDghg(g_ z4sIl0ovu~bn3krXWrZN)BkP+n3%-HA&av2+c7tY0R;UcAn_?Oc*cJtAO`v<8?z`?j zvUf`(R?v$Y;Sj1b)8y0(p5$2LF2}f^RC_KpGqU10b9=17d(T3ta?F?aSG@Nm@ZOur zzogT?_Nls-)7@$4G|XAiIuW_kd?(x9*4yl$ev7L{Y7ut#TZl#7gK7MR;(q(^Rfl32 zx^!4Zr#X5V((0ixg+5qTFJAWT?ET!P*-E7SqFRE%=rOi>cxs;m?AUEdt91iI1XDb0 zlXQ}0veTS4lW|kxdidMWnyC}e6n}>gl!%5eaI=a>dpk^?SJjecOl*ErO=Ei*sr(jn zRYz>;LQ{ZhUyc#;%AqrHkocQGD=c@GweZ?sYsivf3a!+U%;y-<((0-4f-N_e^+-JX zExsuDj@loby&ZaHrzA*mJI7Psed5n$wD!0Ub$qU?RPoJ6-3XOLkFgdzjW4E6*d9iU z%pz}EiWts{qDsINzQ^wyzSKW#hluMW9Dee(L`Eb0bcS8mc|wB%%Ro4~U4`~0CbU7E z-DVq8R9hMSLr&*7^@{LaklZOdozmt4mCT#be-ZW8CUzBDuI5T+9Sa<=6|?-Bq9M9# z>y_AK3q1Ilf_MHv+W68N-L}Po%|{1H%}>of8?cDwlrFxX_+FB-zA1T&_d?PP=$qeD z#Zz@V4Rtv0EI#nnOBQA!HTouf{gqh$ znYQJw{I(O?cDS+yKAT!E1y+$|?2_loP0Kw^Vkb6zeVgJsPVO^ywkCI+g$+R$Y*r-3 zYu`oZzXm@azPYve$*;IOe0a<@ymSsvkEC7rr0^U{PuN)p#*8 zOwBbgP>(7wp2oN)`Pdz`hs*OvjAeYOG6uT;K`y1zwkc8XcP%97k7{1z`80A^pBfI+ zqs4?F)X!18FzM|cM5Uz9DvTqib`Yj~rO3A>7DeCT&mTQOjE6t&a(Vnf1p_VQ4hYBI z-(@nJR5fB3Bk#bh! zZ60Je!yT|QTJAHWNc5a1Q7#AB#lasSFFV2zFYCZUV5wMkrmHxDO`l`6D_>}8)ZndX zmrFGJZX=FBw>vO-+nTI($Kyd{iA<4rFJaVBj|n@Ax1x+yn|cf*OOEHOQAW+-lDsGf zV2A}J-c}h>g>xQTNgNocSC=acvFJ_#X}irOnfch0nhump^HEptmZV3k;xIxc%YA_G z%fnzHkE$0!(G`~&;et|J7p-_tGr;*`eXggZCRpeLkpgnVawWtO^Wr}NoKxY0FeOlb zn{hkf^QAjjXgw;)t0@u3WGdda(iK3=vjd%kftj!9o)nYBkfyF2l0e)$bX|G@r%GmL zlFGO~7W+NZ_>n;ufBP*JM8=pWG0MI{Tfr%+sBui{+fX^gyvV}=VBp%qrRA3yWhK_6 z7lXg*y9cT9*w`gdF_g~C+}I&2#N-ungCWEq_Xx0NLF*=o zBMfheBUXccjW`tq9L8Dp{COx2K6)&oD>OicjA>10D6MXB%_*Un+0a#=J674~ZViRDBz0bVj||%oVm5%ySio>DoydYd zW5?pPb`hb>NY%gr1Kw6nKIuXeS#;!_|57*+miMiA78JW=;>iP$)#NS(rqz1KoFhP#TSAhi7FI)Y(ouF+g{pv%{DDK$fw#ZBrp{AZ0#N=?M6Lw zSv%C~E!H46$Z(=nu)q*J_?_1Sl(EY&?dtM) z_*0hv(u?Wvy)u1M_LGhk@D>|db&wJ(@`@~?iM-z3ryQdns7Bz|9W2+B!__M`Nbw=0 zbChF-9>S0b+q|Qh%AEr(2Fm;0JFAoaXWRP6r zSh(!|dCxR>2mU3u;}E-Sa{Mj%jU>R@&z6H+q(rt`&a~;w1+pgGLHr{-4M8Som}_M# z$D|>MgI4K((Q8LHH=|OX0LC0Dz+UCH#3;ItnctoC{KZ}Bm?yFEUVsu@nC@em?k1%x zQDhx=<#$l5%MDG!3rzaEJq9Q>T{cY(M=oM!R^u>y$h;fR7*|?sLVR}+bX4qIE5*0_ z#P{JjYj`?Ao$#{CVK;Zw@LEkTrX^P*jVmF}l}#7s;*9f@-g);*5Rv@by%3gRTbr<%kjq+YF>~(}NH$CMvk(TK~iupe6`6G-LZ??%cH{t`;t_t%0Xu zG&4g7CLY`^hz4HZtD3ChU{~xN!6o{qw`$*&-dQ&0HJg4g4(PN=UkFd}Tn)~{=_xFP zQ{6-)k;$F1p?Vg7pt5~TkFpW1a_R)f6s>We^KB;Cut;>L_L*c>E^bK@5!S@YCP%0e zHYhCl(0T*ZT^olu28XGgDNNPMp4LD;4yUSgPU9*#5US<4PasJl4Q@$ZO7{H3t;3Z5 zRp$p&b;qZB8E6=C2Xk8JAzB}m`HSlRlKS^LFNGx?8sYa#3g}CiDnQWeP(q2OD25I) zaLynkG7pCvM}u3qKk|2U_Kb9q5^ zA{}+?hCZAl*}PNJ{D;-me~Jv&r#`{Eu9iyz{}S~~?eF)!zkjiG>(@u&73EBrr~Vqm zA1E8$*=l&8jJpjQ1GZhyxZAxGJ6kyhC_m1u~N z#zlw-M4JB7>~XHydDT5L=`FH(ItiwCdrQglN>wxI8{AO;XQ=!itD?Wa+$sS68UCXB zJN#d&zpKjI%-nD;-t9&N_E_~`Q@PHoprbDN!G?FM@J90PFRvHUv_1?KY)%d(E;M@s zSMo!m669PcED)?dN9w|pUJG^CXdV>cGm^|WLi}gi6tM)$`NLn~5aAoz0~1;om}<7EK}nb;OeWvh50kyTK}(&oItA9u?=>zjbMHHFoUKSInb zki6H#uNw>Lul8|#F^xDsr)GF3T@OR`T)dv&UZZLE4B}CoAlAwsK>T(ONFQD-=ca|a z`L#nkQoO7is{sNuXjd%cS#{*g;xZNzkO*>l8uz*U&-hj<)KkmfS%3w3%i4F@Fl z-g$CkmS0<^gX+cGSlu!SoKuS#pO%9UYkxKy(b4t24_aweTUcHv zt$d&OE&43GHh1md`4sn6kF$+@iq@d!Nt3Wz_tCn|*L6Q~3TX_A+<*;<*GQfWF)B%8 z@CO?+VII?0!T7QO6;wR8o)@FegjM~yow?p^AdzR)Z@Ya$d&!ZacBm1^oS;;mPFB08 z31<#jbi(%JGVTH2I~-I{wFap8Au#@fNx>2)B9w-UH+**w7g=7&Q+1RN@-#vesSO#q((dF-)HHg~O$C;Sib CDr5Wr diff --git a/icons/turf/floors/junglegrass.png b/icons/turf/floors/junglegrass.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d13d4f4f273f1ff80e68f2fe08d2d80109fdcb GIT binary patch literal 14976 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 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/junglegrass.png.toml b/icons/turf/floors/junglegrass.png.toml new file mode 100644 index 000000000000..0096e9bad747 --- /dev/null +++ b/icons/turf/floors/junglegrass.png.toml @@ -0,0 +1,14 @@ +output_name = "junglegrass" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 50 +y = 50 + +[output_icon_size] +x = 50 +y = 50 + +[cut_pos] +x = 25 +y = 25 \ No newline at end of file diff --git a/icons/turf/floors/lava.dmi b/icons/turf/floors/lava.dmi index 3b889c9a5f68c17e0ada49b6699e95d3a6bc37d8..a2a06f34200a889651c3e428152e7207c613837c 100644 GIT binary patch literal 93049 zcmYg%byQT}A1#eY2}s8%AV?_PF(Oh@A|;a29nv`>EgedO(u{;-OItv6$i&Jr}*3O{Vu@=O0%Pe1j}ISlh6UqEhpOO2`crW$zkw$gUT)@AfRFKtWH7vr0Y>z%6TI--wbh4i9?nGIISH3^fmgIq;(1eiSJ&dX>l{)4;@Y8!2A}@nRpP&={PX0m zR;W165t%(-7ZF};(i4JbkDW(J5EmHkqRa;E`aAlpPZmm!>9{P(_ zbs_XZDoNgu(#30<6q6@v!BUcY2wtDEr&T7zuk^hO=3IWBF*Y+tO@` zOUH&F$e;YlfBV!^@-vz^xQ;?X znepv$T);}tNmM(+lbD+xseR(yxov|YgAX#zw@u(p?Tr6|`rl=WoVUoHoXelwwvOML z+zK?VelBE|a2*+wzdhs^52^Kt$54`y6=5(Jr9jR6p9Yn$A$0+Hf%UG-?^n7p8|NYP z29zQ2j-7=_a^~M{v(JW)1N;_;8pi%Ra#p+Y!o;zcj z^a#xHa?5b%jtE2|TQ1P&W;2tP&mhhL=Fr}7lN%TaYavA^hFlaLBGE?k{+{W@Br6gp zX@`Fl6K#Hie0=M-XR3#6QTBFOtEKSqF$y`zqs1Cb#Km(iAPvmCAupv$=sL62{B|Pr zFv_^WrZhh!;0k#@4w#xXfI)=?fq|nHmY>H#A)ew8%n#?a@pc~O#BtUO%OWe z**u9%gG~!%Zq5p!^XgHMyAPmperGIl_B`5=lc*p$dng#iD#{F~?h^ zwXtR`z_tEBZQuu|tJN_j&67e(U)g|{&3$td`HO%P06nsK$DA_64W&JMb0XshTYZ2} zxGE_~{X@EAMFNCII-hTk_LIrSLpN3%9N7=rBi zUG{Vj|8_q3CR%en#y#?{FPNW>jvOw+=m1^u<2(QcG;Xom6Jv72)Tz5cma{pcoknj| zwq-L|m#@MsEq9>T);05uiM?F~YVe&@APT)&;EYb@ct)?#uuh4T$n}0ZXyPZ($U1js zGWZa25pWm=?|xtpmzNT>MbupWGj~Hl=4LU@36ZL#Go3%AK2;KZEb1hDykgYG&8E=y zFAQo5Yl?!l-%N$=VN|_ExoCMQi>0~fA^yuHufv^|x>40q4j+8}wfgs8eBeX?mVR@f z%(=z_-}pbBd5n9OJ?jE~)z~Muqz%~X_FJ8ehrl)hb^HUsg_Qc2x|boxYv|LCMEJ%3 z>xWk*PF$E$RAaK!zSV{|#L#=n%oFDSoSlwps~LW=>PsIKqDV-c$xlPREPvz8lp2dU z5A>#*n}%AYS}Ne$RlsyY8wc!LiRWscH~ndJm>IeNg;YPsTbu|yQ9Jpb&tG=hQOyim zRcZay8Td&JUjPlI5ZAmVhsP0PUnDlXHHfaP#+bHCpe)7=c>wzNnUFN0 z`BwOi4mi5Mch{rmI~3D3aWVKp?&I#88_=}OIsYqIu1CX8YM{eunY;nQVRDCBNjPmA z|8iOGb_!EUiXDY7o;>NO5?-8kg;^e_gubibTW$yqx!W&E9w`q=+@_r`=9o+_?Fz|3 zE1+>F}AtAh5kQLv(nZsi2O%I;)v6S{*x65ii61!Dg$vxhp{=+>YdHoY+BrE9qM2ahbCs;i0pcUeGI>fnG^GI)^XnbfBK#2uEJ5SxVp3?nC z60fr2J~^!piwHhr%AXl^<3zMwVrN*y0|nm#Qk>$mNk)BC!<#imLxQf)HY36pD|091 zt`=<6f1?Cgw8F+;%D_f`I}e9inVMer^wL(dg|bO~<4bm|M#{<% z#3r}bbjY2UmmzypP|CgHYNB{!V=`tc0+dsDh&W^)yMiP3zO6&rB;lJmPycO})akU?IoJjaCtff&4J9bK4j1E?VkGW%_37 zXkZ6@0EE-_xH?EQ<1xz58vcW%Q{vlz9b)4agf3N?Vt=vDjwVvuC#K9X14F(1BXJLy zDsP3LnMM3bj$};1-vus0wN2Z8!ho=?XAV@4E=QX;*EvUz5a_nz8>MtRy6;sJ9b)LH z-T}Pp364=u%L?ohG2OmLs@acDIMMfW&}+o~k+Q3JGHvwHxBiy)BX;plsS!pYM~mh=@q!K;0GcBrb~~TwgXXArD38( z$21Y+a{SNbL-{Hi_?-k-X@MH4Ur73k-~{aW2KyV*e^$r+atugCx?G6??=kB`mTxI5 zq{W`S_`ra03`%+nn3WrdGKFhds$_QdbBA76G&;2eDV?qmxS@?oMW=%l$-oK`tcC`+yHg)j8sndbs| zDW~Q7!tG(NFf2#7y5v|yil9u8lwqJL>BdK8Jq&LA~y~vkPDZQ<_+OQgFPh! zUl3=t$e1KY=Vr^V5%dE__cRago@isAABS|07PCw=XF+<35N|7YSIh~3G>8+A zK2RehYx-r+X95z1@-RC@_I>QX3m_c}1yrSGXuAAXIjHuiD~Cm&ZxJMv=oyojtGB9j zn=@VW&%&M-GDd?N3}p}l7SrNB zT800^!teOzCA7h5w(7BWVL*R|T>@)r$(jWFNw|h`zX@^6TKh|03tt03@JA4+95Zt; z00$pj-m1dHf>bt#Ukoe7*3R3RCm$ik8YWM4sJq@&pnZk!9@Xtz$MfVz7^Yw5=8Kxb z`X+LvrmIw+{8+Wn1e1CqmlnKvraMUxg80`hzcem&};poJ4_z%BUgygeDg$8e~29xNthyBsQxe8N){XG}Z zV8A~7C-vVAKBgZ!*Esab^dhwfJmPc+530$6&Fh2)ha2)Q}u? zN|~p5GK)`MuI)Xp3QJxE?Jdt1AD%FE6hq7`j&>XHQ^bCZz=I@W1VCr9VV8lUNoZMIyT(ZV-r zrdmCEbwr2b>&%xw{<8V^aV?Gr8i%JelwClJo8JA4BvOND&Sg735KL9p^oX^b8~?7_ zP>E(=PSV8p(zx~Xp*TT5`>a<@m`CP&OkNcB>sn8sZf$l)wFI8wlB`@Cw1So}tDd6RQXJ6obrvpK4m5&Sg-b z;f{*5=hd{x_Ec?o|AAF?A1h1cIi8tuE}qptsVP;ytHnDd90L8WVXii!46Kz@y<@{; ziBuQBrKVch0FDX0Y!!?Tj4|5D3~fJoIVKHX^4ct>BrPV9!Q+@OKRq%EAMU|w`?{2R%SuHrEb14r(~T)z;}Vc7xb=P&3~yZ*%9X| zzz{cG^S!ta*^5s>QxqXHRF*F<#xc9yi;xDlCG0|i?B5fkx;gJx+Z)fD3tUu%dcq85F``3RU~W4vwe;Uwheh~hjiLE(M#QhF1Z=csAtCf5tl@sNzqek7-2@A5oUV&AGrm|-_z)Z$2@x~xD<+O5bQ5DOxV}CUa;~Z zHJhY6NRo#vH~YR}62 zP%9qvm;LuaMD9|2m`;v?O^5*9|3(mxn|j?j_lZg*ID_;fClWP=lC@)D7j$p`yN6pX z`#wBzUwxa{3SW8T;=}WS6;S~t7NNh>d zj}PLS0QTbY67qT*EM6TgPFY&&)HEhPU-~fm;)l+^-sB$7d^Fo_Wd+R6~P2{lE3tvv?gXUcUT}rVp4ZFGAWsmRuU`x{6xU#Zbn&94mrP*&m3$~#0fJ` z$*S!mApVaE=~suc*)&JuN8cHGX%(rWgQ~kQ%ZB`_Z{;gTZt}Zpm_m;)D|g-426hP> z5%6Oc?2i6aW%z-%=U=+7r8VEV)?Af9iZ7N3<_6peWb$D7S~uec>|PQ+c5%munrjfJ zi?sJ29mb3t7yVNFta|dSSfTouE@Fcryk9@c$YilB%+ROdy}L?3M>Hc%Lr`9b!7%r^ z*~s0x^1gtxP*8sT@R7xYqQU(uOegN8(4tJ(TR4 z8PhEW=G$ng@`mn+vk#wQx2wwtMdR$?zhla^0R5ZuJ(B2?izncXM0#XtD!O*VGCEIE z_F-b_VIKOFy^4l|@IyVw#q_2sbRuHwT>q=O$w2C7%&-J^7Yl00a1tB5<|1gpAiXCT zWW4TBv!MtHh7DC3i6$~z)VqAYG)>SyGbf^_yPj_{!ORv~%f$8>NjK%uONW8pmyerT zFX56*aIBgxtxKvM&WW-dI0n-F7V<<<4NkiU+lDuJxXAPXg)-1 z`~WTB6izeH|LBa-F&`dtPFH0{s$%UUEn)1T?ZjbVC6Ut?{snG#Z z!Ib}iXwC^f=XBw`WgqaL`)7q#V-SdUTClI6u3F|Yz>9{Fb=wmI`o21LZl$y-j9qmi zQw7bKX2T5)NZj=B-M%V%^569dk>mIFDUQN%=U87~Pu+O%&o?n2HE%OYIc`N55h9^z z8>ynX(6SVr^-T%-(!BuZ(+ne*iME#ed|f$YLB-JKyEQX&;8C&$EyQf@y2XwUH(ChW z;@9+$$8j~cOj*AH|Fn+giSf$T?NEi;n5e@4ckLPWnxz!War)z~UyHeT&5WS6+ClfB zwdHS(3(3OmWKlAb6gsARk&;FT0iT<3pMLMo2}E2y{^CkoU}96%N`2Olnstz!K6#DrF|-2NpCPr#-Vz}K$D&h(n$UA>wKVr|Yp9FJ+g z`2cQ*>)x?i{;w#sVXQy~cPMXVejYY1dO3A$2a&7MBtpmLVi#*T>3wY>y8Aq-Z!3!; zqcUO?n`~K&8Gdeh2-_}fH)I6x{A(!SXrC&okVD+HODvOn-G*xLUazXN6U#mGKeiw4d-|}%8)xRaXO%g3O^%7Q(~X$ z3m;ojBqc*^f3U$%z${|?!HooASAWF1uSnYYchc0ry~fV)!;)>!sobw8L1$!8(?73U znmhIr7Q&#|W=@G5c=!j?dKA|^xV1z>H1f4IuDNF;k|H&f=WWm|7)OwWffBOz8iU>X zrD>nFQL;We7rNh{6vrD>bZIW>=K8Ttpf-7PC%ZXfwVpqAc^`XxBm2TP=QjS)5K@+WnjN zg?ZI>R`7{C?lk+W@1Jt3cHqz24zKu)Aw2pXPqnB$`^oOQK2B1_LvN37Xu)EXy12?F zUyt)~o>(t&{@Zjl!wXRBDlqrr#JJXW^v%e_>YG=4NpCO3i!_VX>9Qs{Ku9fj7rpU! zfodcV%TrAy*!-WN=l<`^2OY2Zi|cBAeVC*~NXXH0yYfWsv%x~?G4o_&=XlBb`grO+ z+^MpDz0gy&Pa)Rw7v=BsH4)_xV2gB|%Jt{jz^B4UiK5{B_8gKyT5pS;BpI4w^TtTVGa}h)yXT1Uw&kvC6i(H6e{B$A_KGkS zq|X~y%kpf+i~F#wym|{?ShUPxt~sK?i*?q-sZt5=uVsOOcMXR>RQHz#7$(Pti~O3(s?3}&=td+t~yD; z!Q5>IuyVyR;z!4;i@@_euiW-WR8A)`&$xK|!m5`SnD1(-{KFe=jqh3X-uy6BCCk*x zP2fb=$*^zd<0op*AMvm|6cEe19si!pczvehgAuC^(FZ>mAy5%6Gx%X!^F2`C(SkkX zNQL+}z}2PdhFNBT0!>2v#Y?j_fAgm*kiN|a1SaeaOpZ&Ewk)LF&HI|QJARZ1Pb8He zbsV9P&sQarL^(Ri=KU!-CU0fJryS*_NMX(=i;z3y=3ARKZu^jjT_~s~Hu0v?rM*EOOICtKp{Z6DGvxm$cE2rCpaadD3-vsH{XN7#uDQUkQ{|fz z->?C@b`*B1e2%6dX#A#9o(x4KgugVmLVi6d!l>p-v-t5RK8NInQx+=jSKm>%+C*r* zF;EUwT=zOBp2*d!F109#0qh5~&P`UY&y0k*agY#s$d~e7^q)g)JpYX(?`m9!^dpKd zsgIaHb9W_U(N8tZ-m})s&**2r`|M5Pk=FtyClPrTe_a#%^KG{kNP`%M3swC zykv3pW8k7o)KE-$a<;fIa?K7rlkDN4Irw%~qPu=RD(!Lbd99I;wm27pEUmnxQM=*H z5rDG(zHv#=qN9I}rl?%W!D2O7ZeN1SBQ$4fDD9N!g5*6gC6tw556|(Rs?QQk;|LquZgcW}MT-&MK z^aXjY?_}~_sqZ5_|KR5hSAmhnVZ$~0s<8+!Lp>aMaYQO%jhE&Jnzi#>zJzbF1cvru zk30wg*5&4h+7mh~1#`^3H z^9WFHHAW*~rDNR@R{iz&tpV*dh00a6Mqu|riQwi;mKTOeto`r8{fe&RuilYp(#b()u|ib#U00f zi~Pms(ZQR_uHIVmkLc$n`@i(FTU*z}Lm&JP!mUi&I=RkrJq5^}z%FJ#6uj-w zMu7R{<@e-dU^`|96d-yF%X$*QyJZJWBccrp%FJzDJBzzfn6+Q7zD`)c#rGE@N-TV? z@-{BVw#J_Dj*}l)5qigItvOG8rZDr!{CP@bV13m@v-vqI-1){ZUJ=}tSk=GC9L zI@L-+RS+od$ihX1$T}H2eE^z%zB;b6sGxG$#Z7(R@yEEEx#)95nWSI!2ez{O5#RLn zUM3@&H!?rOZzeb*9DCH1ZSBYfr9e+lC@Ne@F!<&xDZ#s66Y0e!o;OM6ZV!b2$Q@52-gU7jaOXgg z>%XxXMC~;o<+!xbfJL*(uL$j#n?zLIcx#mQbT8=ka33oxbRIy=SM@mx390<&CnGtH zRNcFY?BvJI{?xgP4yLsld`)2<&l7VC?5p~@_IrO_nmUO4ax1Ta7MbEptpUet>?k7igNvN#P?Lql3rG2Ly zK6w6{xCZPTxVQIJkYFb!_VagcIwdt`@Cd>T+DT&1dDE{U)C*smO1?NzMwU9F42=(4 zF0krJW(#_l{I8Xr?DOa5HKN|X!9$IpVc7Rc@IE!V8oq@x{<6W_JU6{&vfxBpG`8m=j5{N(D+Yl-4OSUKQi+R#6yfsz$U_ zeqG(hCv3(9W;(6zO8=+w?@(O>3?5o)6d>JzIKH}}ziO{=m@4`anTB4D#OPIFk|&GR z?!=%btQZ7zq*(J-nlx==m$DU}vjs)d2=*9-T?GfZOjIdLC9h?P>$;@`%X<5O_M8}%RS?B2910pA34#J*0yPYil;yM&6p8zW$^ zx_{07Vm5ms^G%|56XC4S4a-c~u`Fgp=A! z?^N4c2(KId#=;StKnvo!N0ZR;A?*B`)h_bn>KPlY{3Ia27wV!;bG?5s^(ujzKt9u* z#Aob9tm7zsX@^59Hd7_wADBtj9-PvnU+q!0^CWKl$aP>FR88W9T+GoJmF{3v5up7j zpgfU$Fnb_STrgkakvvhWHX$nNcyZDDZj^u+G-ckOKUmHjcB4(`@smhpgA2VGNNEFT zLZFrv^%nd!r-x z*j=1~ygl+n@_P8ihEl99|6IaJ5Fe_lDB_~qmy3-pfG$=;i>Aq1^^+(mo?WbKzj-(O z)!z8aSfdyQW<62{&S(^AvrGFyhOK+C@#4kDs5)xF=&a0@LWlR?uP3tA#%_OJ z=F5i06JUZN&EF-#M3*tDXAV!SA5_|wlvZotWh|+}H0!J`U22Ikl4S$TuFIwE`4LmZ zdXy%>(;*WkO%$ zz{mNZT=vc<)$TLP3N-bQ<*%46zBv-AQhe=iaJ z-*;pFn$O&WFtX&vU0h%G#_ouBHq<=GA6^p(z|88JwhxYAH++CKAP&;JU1||NDDl-S zB)0@4u||n}0$9#CYIFT~0IIlf153j;G-EJJzRSNi<3w4{fn7ki0~)0qQ~9glu&G*f z3khfqdULaLwjhTiH#3~j(wHBJ5XUsG`KOxpt+R=`M{-v$CJAqJNLrhpHA#zFdv32J9LrZGYRTCZyI` znk&kKY@!^D3KUf?6kc6{+<0JRCn-Xc^D~vH@LccXCYuF5PU%&99F;8H-Va^Y#gMc< z-gIOm_mj7MW=TIa8sR16q|HpARfx@ep4vqIZ4$Ckg_eq!<`|W2Qa4)&N<`;wf~iQr}cb6(*}3v z`dL`4M8nifrzH?2!c$R`|5jTJN&*pbmmE)2+uQb112v-$&y~J~qqZ_A$Z}R@5cr_q z7j~ylW9WS1@QY=<6VY-v4I4n+UQAyYC=Sk{x25`TZnGo?z5EHIcaBNk1v+(pCRFj3 zQ$iK(pZ-snFpU4zKFuNCuK`MgBam*$>x$p)^r>0f%GQIiyvREVA}-cxL_G0+2Zv7_ zsl(S~^nW@8LB4@$ICX^2L2;?}J&a_?%sa0A_IO%!i3#g!xW(H{JSW3wQeG~5!LWVJ zZ++n{Cq|^Qd6~DS%6yREf$Rw*+Ta$LJ&)Sp9X)C8WQrmtBg*cz~hWQiuMh{jiq2pt$0s$9T z;UV>|+Xt|_wu` zi!%Lp2!hkID0+*#*zirk#M6Q#uA#xbpM~q6ZNuZT-*N9k$q~MvF^R7*?fO3r$eSKB z_;%vV;rcklCjtF0de{-a*37^j57l1KntD&#y>qI;JXvp}`!wZ=nR91M)1fz$E$wE~`3SVZwdBU-&*S;IqLW#R zFQ+Lb4+}hMvsmajo|Z{U8k+eFxLnseXJdHx z(PTaGXnl`4dk?Z%=vj-U^PCERu#}4|$HA?0cql)ozFATnOzvjf`Q~;-3kIoKHIING zzQt=^ndQFuQ@v+V;2C?N4ZG*bz>R7lzXPbk2?#LW=qbIn6`q;*c%*3N0F!G_jB+2t z)af|oPRmifH;DyaI~O0>pZLyS_dd+vi)if|zGt;&|>wC4&-~Do$dDK?+F)3R=4y@sL6|0~RFm@kIiZKakXuZ1^ zX4Vp|&$ADXSoppXl`kUOXMeq2o#ss+N@}&qL>~Dtb%vdawno~>p;g}Ol=vUFLABOJ z)Z>rPbz^bPKGmzo3njCZf#I2t+j)e}Kl@`x?tT}yU$aN=AsRkIuIkBSeDr>*me!BL z)0kDtS4Jdc#Bp}>d0&dASf*#2hnRAwCGSGx5!$pE-;sq02$aMowyLZ(X+2Z)GYh#g z;fs&zF4lzF11@Yn5lSq7&vz^Q$J4$ttP>b?F_Xx%&e9?dU5wQUUeLu@EaMZhKO+9& z6W`xz6~qdSfl7yH*KDDikwei$(MnyRct#O0UpV|qc-vw!Nd+cY<)NRX%c zAn$%HH$K4OXpfmx;1_ks7&4qPb?)K@HNRl|hJ%&&iF)zi1}lbg8!C|tHwkEfbs8ZA zQ?x7Oli)N+fWVVsgYzFMm`ruhqTV^=!^z;f-ny;kkN3Be_uIFA*_wK4-Yk>H!AF`m z7rfXv^|tDqZ{6>`f`Sjeq*_$4PfC8}sd)Hj*9=+u1w*+=5&K&W?w0vgR@%CWS{BhL;?Ym8tu#@jU>BL04&E3B*m4lT`gKzUbh_@ieD zN_r|Po50j9kdW-^Z<#!`xODU){Y{JYV9Gbx=^w)9Cu%|Q70-bSnKuv4L-xsEYgi0n zJ&yTt0yD5^{R4{se5Trjn8YnA8qG#bC?Axd!^@3Mqb&>*Z+%*RsZ#qJj|@WQ1^g}R5+bw_i}F2Zq(^3* z=HExVDQ?YEpbz=~l!5AcH|%t5e03eH31C3bMw-_&p?jueiw8vIjitaq&-#R}1JqK3?Gwo>+_@D%EnXY}R8-b17WLuRn`&6;sT|m$0CyG>I12ZyfJ+sd zu9UVF{!crUM^LTkodL7->NbxBrOpHo(*_}HM5z@=XJhd@ztfMHMnfRM|lLYm3akVKn*I~kLk?^-LrmFg%o1&*b z^m{o96{kW}TEb$hUnAI%cP(HIn@*Kl*KJu(E4sA5jyJgQm|kZe1`ZC|*xYwY;-;&w z$Mb2g3I7kjQ&uwdSq9I+-M&I0SFZ6Pk&DeT7xQ zk1T|ht|j!o2c>*0Wew7M%GNE#GzAFT8kgLNJ42PJ>*xOZ+c@TlJeBc@D9fXgIL==j z@Jf8f!FGKY9@qehfU2RRSe?6dZ-1-6kKLZbb@!~o^Y7zAToe`td_vBNyE835(muTc z>g5taoSZgJVoW`$%{eXDF3ZZN*a96NwYb5j{4q~odhC}gP*0=@!f>lc1(s(@b z6~m+Vh-y10#eA#U$hxmkQTNbTLvQGG4#AR`Uk@&ty)W+}$mZlhyn@cuE zUo1FnO~m%l%E8yqb@op>tLa02qE{ckZ_L&XLOaDeHV|Q%>?Mi6{sjl-hREK>jD2_B zPoUZNijBbvkc-EW-u?Psp+#`j*-vf*?7?}BlrD@*ox%E|GLuZAV}=l``&GV_q@DVoPO zP|w1MUfw7aFx*K{#8~;upeWD}=n#|?GT?MSBw&vHv_}~LOFLtl9QRwBx@e6RO3lge z&{$2iOKR*FzGiRThu_6rKgP4#^Mss_zVuoq^SXLr-wEg_M~wAW9bu3TQLo+FW2!(i zK6j@{)Y<-4BJeQ(Dl~O4LZ%$ z8Tu*C9Y`6{26F)4^M27m)V;)Ay>7h?8GA4z_Qs}*s(tIzyW7pLIU_f-j73BE%AfC? zJa$JkM1q-@)gr22iC-Z^g3;sK_9L#00!1%#;&1!|P6g+D#m>NcnLTc14dv9UOmM-> z$7MVd$mzyqiuQ>cYO2OESxX(&ke>m_o*@4vMa(Wf=`bPID|zQ@MVRFVql<{C4 z{4!W8H&Jotou&nZL2oBni@$_L*aFBtDLtFKUr*k;N8Ff5+^*28YJQdbA)DthgG7SzYUH$yE%pcXK%=a8ubNdEF$_*90ML5uR zsW3j{E&;Bt_P1T#mtsuyclwu?{AhCN1^v{y`}j}sr4$>eWHAX~F*sKH_%-%eO4Lw@ z!B6Im^_-&V%h6vhSD}GpTu-Qp&gozdRP7#yHPRw*gAGqhfR!J~=z~;#=7cS9pOe2p zD&nWhY9Raf;5ur6n5@bdCz^$o{o1ubF~mKBHuqhL zCCV;L+jjn$xf=-US>&@8N%tP0qmzX-l5Qo!m4yC$APlVI46f z1``o?_IkC?(=C&a5~ep_8Tnma^6>C0JCV(eA4!&{MelZJU7!DkEZ*q-i$~y_?~UQ5 z33cP8tYQ83B_X&nOg-`OP3!v=e^MXGeWWf9ZGc^Gyox4p1WR)MDocndRmooyFxxQV z%B$M7J$-XO_DV%jN6;1{zlT(=KHT*zdt=8LL~5Q z_#gF-O9&}s76S$q*WGA+DX+?cj)wr9H#8j5Kdrvx{7kC7!4^PDT zuHLkE=*mfL%8L#F$gA{hWz^2v*ZlD_iW$A3VsJL{9}j5q{sT-3gmE+g75}qn{=sA^yS@25K2gcgcBh~u{x+# z^+0jPDy3~ZRW@+X4%WFwjf| z;&sh_^-252MQM9?ulKVEG26y^*N;rHbft}=ACx)Dsp*cc`4`sB*Q=gtDI69L_fGDP z9UXu?&ASL^on-gYn$uqE((Xpa*XlPC=4*5?w8rW6b!{ZZAZpB)lDULVUZrfjio1xS zU!sMeMPj}+<^h5Z_ue)e@RqtQ_`y%4yyDWK?^ZDwbobi(Qw(A_Pj$TEGi4ZVr07|i zg>G~huEs;O%*Q^doKX(-uHvy?%Yw}L^+)tL5ltYE09N+>@7fMU*pa#`Y`MXv`W z$T)ePJRo_3>qY(#m2vVw(a<#Uu=(taO@5vXecZ8ML5rje@>gFVnD4MP{pj)5=4t4J zm%mouS)`MwdpzcYFfVTT?^X1LF`6y46rJcIFxX6mp@i0PxO|q)|1IFmCO)ue^0Zm` zAY{~+&S4~NwQEgcrMr~*V}MGp&JHCsxQs;?27w(CPra&Kul_SXG{Z!qepyA5FxuW- zGA?)0w)>)7{tGyvq22CXFab&%C<3H%Yd>JP;d7~t{#kWwg>~zTP|kkAET*6E=$}!c z0j6RNIlA{XtQ*TF&21m@<;4-B`vv6RIdTUXiX{aKpF^0!lmWY>!K>#eAn4ch*uWe( z^f1*30}Lqg*V0=9ZGJ}8tz%T206cXf^jgk<}fyjY;_ z!^4=m1uIn|YH?o?Jqlu+x4$UWmkaL4H%E$*>SbcAcR)YmrLGiivfuw~zSi_XDW)3; zed@w`UQ|Jv4?WJa4{s7ZEjf|c^9}+M9lOy#a4(wGzkQpG3JVRVi?0N;7c{?M4H6~m zS5OZhiyzf6k@$Yk9RI0`TXFT|EpI+c&bIvp;ii5nB2zD)eB)2#siZyfgL8isY<^L~ zZaES})@PIYC02p&w0^Zm9h?&MkpbIN8lHBj_>^{7xOL_)A zl!`INLn|&4qhW&CB2t|+dJZ$iFPo=i$1Nau5KFb7FcUba{!^&@;_Vm5NYVL^xhT7a zoFx4?vACs8&HK(bc^S1pd$a+G4$YIW-ZLu59AuG*3vKE2sQ6DXI}J! z0UXf7dLLeM$tLtV{k&*^?fdNlCvVcrQ^+8+*dn%i(wun%`_saWos}ao)^TMHzd0F> z4_7QHSmSbi)R=_Z;y9mKtoH*gMg3^61L~)<@0a!f5r=QjEw}C1(E~%31JIH`yD*bh z+C?O>dPhWW- zWCm$R^N38rwn(mo=EAKGJx>6-|r8(lw#Z!qPkYk#~Zn&zow+BNJy)AwK+Q%Ro!TPl8xp>E4-)o4g5U z`~P9;yu;ym-*_D%LS&1qGjw>HA_w2DD!@7OA61J~OpBcppAr ziwQyV)qM~|WOhKrG4P(v&2LCGi3Y=$Ks|XMX$r_(4MD*4Ju@5R%W%M;@q4caw1s&`Tg;D1+y4&*Ztjv4%jYoMiAtbPb zB4MI&iIsC)((5h=^mTHE(Uj0sbXZk3KMAt`5f%lOM;P$?t-Fd0v~*nN_M+BH5GOGV z7#y!?9Edie|0?E3KdKT?0$FZ0kO~8ic);XVLLSqI#{Ulfgo;T%hdSN+P{w&}tPuHg z#E*IT#|ym!_hggy^(k-tFbu*V(K4KXBA}F1Jwxyt38v2v;vnE`WlU?*hm$*d#Dd2jgJ7CXp zoi;3_6Od~v$NqjxSyIn;sPp&w1b-cLB^ITl-jsG;_MWJIWYMIqXxKkRN@j|?pf&Bz zO|pp|)l`YHn#DQrt0)4KqvfbuU>hFw9%9>dHizw92Z!OHr+y=vQ&tX>c1mq792K5U;xp9u}dy4X%yVAeMp!~m}qhV;jSqgvXAUoK| z`x_JEu9&tv&Np-7*0ZIloStkIcA6q;U0=4y^RsTh4BtitV$SH1rE7heqha7lD&AFX zJ_-n1{D-lxifB5-MoZQO%`1x_3FJ&NS1uaVbYOi@6rPa*27)q{D{$XTN^b6ItS?L)#$--)UoE)H{FFR^tF`v{2Zq&syol zzZp2ua^^T}B+CJzS8fSS=&_9RQ3fy-T1yB~4x7<2TMYSyrIvthz1#;${hk3F5X^c3 z1O>YkJ{MwLFEpGj&O38D#x#JOOy47Jc#YEb8YTTYd|g7^lQWIQl#C~z>GNN&Fb&%^ zCso*?M_|S)iuXBR2kE?1r1g|)6%G-DQ6VzW<=->F83Zh+@n&2>{D{iLJu!cc8%6xj zPEN>86S8%rZ`@EV6J#~|JYht%?ckWwKjG)Dy`+)}$dKFa1Hm+`ZoLhVznbPcEZE%` zNhqe+ruHQC>0Yq5vYh)l8q0nk3TJ7K?*MZ>Ry3YDVMBo$*H2rux>U5F`t4d1f8*u~ zSh^H`-jEeS>SIXOOzX={P;*uVf#7_!6W24=-C9b=%*Qt+I4kG3r=NR!`Y5#VhpxYR zTiN3BpeqP|!~0GRlWam&F3`9A!yC#&uBaa~EY-W-YFIsEF?FO-Dc+B-e9uUyUY3{f zJOPummujpl#}PG>K90x_sGNJO_!q_N+18$`pn2tc4D3}|#$%GQ90=kHr6#*Za;=!{ zBGta(R61BqhE^z~jw|r+rPtqeysxPJDQ^AaLSon|Xn}q_K`WUfrB14+u^+S5bQt7F zQBqMepiCn&G^QGeE}NyNAwz-v{7otlJPTq!K7JLf_{|gb#iop9z%mEpB#GE``34|v z9(AMw`ZDu6Trv+S-ZP~DIUdmve~lTyc=|ipP~&O^0UVb4K5h?Hos8dkyB6NzYR@y@ z6p<%^Za81PrBk<9o-CKSuD6eu^p%Q=K7a$tBV&qcVe!@SkXlWjFtru8YauMq}xNluXVy>1jnDZ=+}ua+kH z4Tnf9Ir@(mZs_B?his^CpymBu+c>cj%XeJqv~wtB@7$E~S?M0Cm%mFLP&ln8{a#Cc zu((a@5l^;=B5jdL_$q8&Ve8vy=igI@6Xh%})%er6@Gu8Kf_jG+Q$M$Ej@_P|N<}B4 z`5`r3?Bu$ci1>(;h)Zr|=TzFp7X5pv@Cnmx&(>AI>xqa!S0JFQPKc(*AxaEi?NgbM zC!H9#-h?R#IY#CtiqeYV`UFxJC?m0$#YMWyZ96UXR`#uu*vvPx#lICtXEJ&uWugg=o&tX zpgHZyl&?xB_GbiMB}sqiy0b0>kMn%Emb1?AW+Z&P_*{}}kG5^V-oseX`i3QeH!|0(vlRVHR z3V)Db(=u3!Zm>)F@fJ1+Ysjw0*of zt0OLuY6WDR${pQ(&wR!tMTZ0tqJ{%MdQRt#@QIaLbRne9beKF%T-solK1 z4Wpwnm~uy$x{vq$B`ZrVf_<_U9a(LC%^9FeJNCktdo*i^H=ME(6SP5qYqiQcxVQF8 z9>cJjsT@xbmq&7A+`hiRhOd%*0AF?La1j)gSop~Onw?1v8!;tBkpA<_?q{hdNS;A< zq}STPowtzE%k7czcb)76BMhyMuWax4&X*E3yFsLW`XUe+wDR$_DxXr+kehvGAF2lbhqqwP} zb!k{QmjD46KMJnkk+MoTR5K>?8dZU;GwtUKm;_kfH0Vr7&`4RCcTd-&w+nqE}`%q zzQmVID1UU=h)DCg0B?X(yYP+rkG#$lLY>dUeqN3n@7gV${$bwGEQ#jrlclR`bw%$J zE}06SA=`TlP7@318YBN;>W$+4z6|%lUrJ1?|6po0fdc?jA1FPwCUH_^wQ+hsSNua# zL}u&5?G(&6OW^V5-^cBmilJPOS-RYbACsEr#8G(!MNj>%KFofbw*>j1_mgbmtEpEO zd1oyxM01|^yOwG-jABpO9K8+2 zxvT8LS#w-#1!{Q-ZK$68coErCM_l-qo&8s!#xuDjdirRBPLE__t{TRtdc^{?3Raf# zG&L-J!PSkCS9v+PU+23Z`&keBt?+g!fD*0Y#W<8o_*q`zQ{m9jXn7TFQwGbh@cHbU zt@V>Ei=Q@X$1<@moFaQS)aJr#p3{urw$85bH~hsc{t?cHwKo_?#yqEjpG+6NlkL;* z8lN$&FLL6t=%w&;OYx6zTKLiAT!EA#L6oNLcR>r^G6Ah@^!0d_L|-fIooJ7kUFY=9 zy(P1NcLn65`y>N;$Eh_w%H8?cX6OgbqTCh3IAlA2W`X%ism_?rEO0!9$$+r(onhb2 zB-;??%afJMB&oxVJ2uAtS6d1jF}RAK#jCkfaSb#cXDCNfPu9rpkiH{C>X{n5KP-g% zIXm+L)wfv{4GmZ{u#Zs2P@txGefc}Xc4pkRGPJ#r(m#sP5%X(h>Q~?OeKJ04#eRxR z`;ViqVDe?nZwN5k+Sl(dUT{CobX}L4^l*Uu!6%!+To3vfE>(OKFg{MTabG9Sd_QSj z2)qzLZD(^7+b~pc2P1KgS^{Rz9u9%FJ#+ki3309~iJ7FJT!US2rl$$7hMj;c8)X3W zxZrvDSA)ItIjY^b#p7Y`W3gT3u=o!2=ACRGc?Nr>2b=_}eLO#`?1#^*bhkAGo@raa zZF!k8KjOQw1N3{nv^*H{(K>h zB}s=VvQx=gt)j-kp9Br^IcB#dU0nYq<#UmbA(OQd{^E#dq+fJYNG~v|51+zaV-cZ- zfhFDY^$?)b`LTCvm~mqtYeAryX-);Cf-}jLc$VY-XZSe@#Zu;di~t=Y#Sl3~HNH|P z$6_GnkEwyFURd?&u^a-jH)D~r^c=Nd_;C_#rG4|pvO!-#75n~kadl?i6@HhqaP#k_ z{sBL9_X@n}VlHIfOD?B$7$(ne8mE>$3vyil>qVn=Bl-kjK@4m5$AvD78yICP)kpcX zI++(aiL`KoHGR;AgfI?e@%{s}TTOIa(ap}dJ^Bbd=Vf#D_Mj7x>N=|!q$}RmNUuCr zm#5{y2#|>SMocH~8(*7a-gRo&ZoU@1=h%vZ@V+9yxp?$82nqw7%Efu`f9$$mVQ5p8 z{}x_5^~H5LdT5v6wciSpVUI^BEtJbW6h6~jK!CKpgi6%WNkNu~%n|AADqqXXx~~;a zy!Jjc6!8Y!W+(xHVly_>^^?`7^n>njd4uli;ksz`rEgvYPyK&n8@Z}KQ=oaDr~47x0LH^XKxS{Ffd1{w0bu;9bhbW#h~h}; zm+G?*VJiFs+8Ti@3nBYi!c^wy&dvK#f1W*8{JODi$95;W!-{;Zc$iOz(#QB|AnHJ}A7~hV=a6(BN_%;lzVIy9uJC_t2PkMcub?pV z%IWHuF$Xibq&q)q{Fp~ey>B!`8moaG)zaXoLEUs8l0t|PK}DrSR;-RUuYMZ0kHbqp2|t!gW&zoNgH!`$ZmhKTbe24tN7I4)%DaB=bS~H##Kl zOu%_7kz;jwQD4uzutb3UsYywgzx45q7_hU40J;OR+jCDTHy`f*IrTHLZTHtTnSX0? ze9h(jE;c@{q|o$jhM^O|KerLHZj6zPxhR@hvY!E$nB0CYn^|PQzqS8nkUKPsRk8p1 znxSE&F=N8e4ij{=vCYv4yqe~$6{e<6kyCXhz}80Roiz{1q&n0a#IY z&YHrQf!O+VGm$lh;a6+lw%7Sve61evk@*7wh6jXhuy~;1VNMF;eQer#z%YKezZBA` zzhhQ3E0dKz^GoJ74huYVuF;pazgX1;rjHNo8#M1P1;eY1BdG7cYZGa&{e%#dDx&jc z%g$2wcHzH;*mibQ+YNT>2D*2RHnNzg+{~%xSCk*J`?AZxeorg?3pMP?{ejXuM?_wo zGy-lXQ%%PJK$B#;Vg^BeJkMhcrbk=zdCvw(IakL!`Md6gUyXu8_NVnF$zR3J(>|(D!Lo* z$1B5V7pqt8*r)P&941p=#tNK=Ol2>k?AhRF$DgO*rkpdAAlNUxO!RGNS7O(;5+gccJv}Gp3^YhI#v9l8%1WF%USTjME zAi>YkSqitU^HL+GP2(<9uPY^xhJ0}n>9}-TT~%O@PO;+>_W<0`S3A>mUuFo8`pSQ_ zv$q_+U4Y#;Eg9dL+I*mL>&icmL=Sqik(4#SJ)v}-!CM+)hn2@Jre`L(xlIYF0MxRFwZ3$TGRiC<__dAn+-j47P%H^E8b zaE3z5omtF6eov2i;XPFQ9M?P1p6CIh@}58(ikLi?OUWh(1Qjvol@wOS$=zp1KzuS* z44NS)x4al{J@(ZT@m;C4Mz`h`&H}KPgl2H)ZX{nfVe{1tr+*3yW4_SCE=9T|331?O zXCfJeh!H1=4^9yn@?|OvzjFLGcP^bxd`i6(l-M1HU;jUtZS@*3Q2#H?{-8A<19fR+ zMd@$fRFYxtL&UFU;P1Z*SkJ%W&yTxzbJs&Kl$Q2O?@YH}-@_LA+biFG9jy=Mg|rr8 zwa=im_uD*xsYa~p-QylyR54M+l*Gm+cn)zSu_D%(-&zkE&pFA|MP!LvKo2@h!&=o5 znOPW7N3&^W=5WDU=u~6;0Yecvoxwn8?wg)3vNHQUP`=$wWWV~*UTpj`wbpOTmyn7l zbSE)LOtaRyMyz;rG<@sr^olFtA37} zZy4;j^s2ag6d&rssxM!SRe~niF8*ylQ(_O?8O6S3 zsBE7EaN)PuoHZT?$RPY7K==NmOudg8|lQ-o+B39G(>k=1^A7r zevV{b^IZ%_D$cO@?tK@md@$_teegKMUR3qPm%$*lNqfGxwK3~w3QJ1M=ThpK33&Zyk*)Yax&RTe#7-|n0HYu3 zgGNGp;{&if4q*Wv-Y`X&s3rn7fcHr>{Z$ff$mPDgp?XKg0FD9w57o!6n*~bq1K&dO zH+pjT_98n4=Hu@XIUwc1pNwd0sjb2g?IH!|gY25h7iltJsk66fid?|oFy5qM6W?O+ zZauR?l*j)^i3{&$Xwm{ zoZ}-ySIZ^mu#$(3s2aWdMP|_%-m@CR+UCZH_`1CK11MSEL4Y(bI4=45;A?+OVnoPP zr752ddaZ>xF`)mevDZa_Z8cCF{@UWmsqd<8z)Q{lC_DHoR%fW$>*D84JBP!U2?{6o zF)@{C?}@Uo`^K;WViKlOD@t*d7TAS}X*Zc~5)CqU`!F?%d!|A}B@ZwS>QX6c*608pf>cig2ySEi z6{Pd4mhxSoUT>s zs7xO+V+<>^{RmVMbR3ATSk=#bE-r-08&cQz2bgZS5k3D6Dc{1bZp_v)#wGMscV3@-2TqNa*Z!U6l{fD2UH9&y7CWPt`^$;-747x{ z=wJ=uuLE}id6=G>nJ#`o=}7tYVgCcpB{G+xPr_tq&}Rar1POI4{IiZ zC?Yi6&;S+Hbf)ZuQfe(y$Vuh{?lVAq+MLviJP55vri)hxzf zmq9nPH0}#AZME)zgb=2zHc!p7pT4HxIK)ndBogA3lH7D>wf%5I2xbUh0FH!b%l-aW30-DGdOkx zx|FRddu3wW&gM*b^^j%ZVf&3OfLWC-;P4n zoz)v9U0*xR^$?@(%nXcpuv}j{mERao*%_<{ImgHLDGjyepj`l>N9ga#%p5?{IQshN z@?!j)48M&1knq$>=i+fIQ6|ug<9!iLZ$>JnsF|266+PNN&nf&wCvIkXey;`0;rVIx z`=fsSf}m0s&1Do_ez7t&F>2VFXN(EGKi?k!N=T7hVdtsn(5aJO4R_2SQ$_sa*|g%m zeUtwA_%pmLe?p#NvB|m)Bz@{K5D=CtEPYXYo7n@5L?7=Hq(YeHIj$-b|BT0R8A8Jf z9TO}=S|0IkM)jS5SlehRWy zU~FFCfQ`{h-p-ht?!Khk{z9^|wwsdjR1ORxBMmI3~(-_G3Z5rYdI>emi~m?-Qw z!F%d*T}R$w`EoM!OZt}z$9d;5uC3kC9KGmZ>h%Bm+_K-ZJ<(r#st~q+McIZq_&2d- z-(`UIZ-=nkWg@yiTIfC54L`&We!8*Ca-*Fy6>yn|pCCqU=JTC#e;%k7PuApUpM^~J zmCNBbEY0G|Cb(Se$_VU%)xWY46?Bsn(|-t=8yN6=!hW^c`xGzNnr)7wH!4)^V}ES9 zn^efvqnIMv_I?Wq(>HJt@wDjDH3Z%HpyK0>dy^@tl6|64IAGpD^;IVa;^z<58F-DQ z-d14nP*6yI3c@?DS7}F1zH54*ymRheJe!_$Q|hj749v{JjCl2Ih6wl_<{6ImzT$g= z(>WIgv16?Sdu<)WZM?E;N>dK`1`PZ!nmHTDg?{*aP3xLe@u@6uJ!=2kT;sRq^=jjH zLAP8CS|A?nhv`?bA^vhkUX0^BA?UpS%4%1(m2&U9kC?K3vh4YJn&EXVkJKz!_^C?T zKq#Wcdh+kdF0BC5u?e0UcF_|#BDvONY3C{hBcuX@-dSeC&2;=VP%|gYBSZ9iQa#At zS0mO%uXt{+X`Qd-pZb;jRh0caJseROE3%Sa@hwfk-8Z5JLy`z!{=`#6^y z<=0SJWOXo@`VyHX5UM^6^<;nluye9_oxO)R{}Q?4ojrLRJ0UM`GEt<(HjKf?H=BhyGprd5r6x;cmw zwNgsH{swlRm74crkFNQ{mLAmF7%Zdz{$Mkl~Yh4swO%U2Gc!gUV9hH5Nv^Q1C%S>fBZT!wlc4P>(CjJ19jOTf13c(qwJ@CB z+#>Ttxka`&4Di!EtcJ&XTqS#axGgSz_^|SRZVBoJArHNYqG(TBr$BO|-X18}emf zB69d=OrWG&8d@nT3Cd37qRL$9zRF;`%z=DwDCJGI&-H3R0k~LCQjpW{_G?aeM>q);^3Ysc6Mnokv;2$U(4rWeJ8XqheVu2 z`@#-${r+_J|MvZ)-lca8+Fn>N%tTW7J!AwIOF$ZG39)yDQ8ssP@{%)%?lyZ{hQb7a&)Gzz%^49I!0kS+J|*LgzgS0Z zE4%;i(IeLBOokmLJ)c*Qr9`9-#QsW=Mvv`XNrzhm%r4hQyoFwDtdEky$$>G<YE1e{gj^4n{NW%;|WRnZs4pH=Zg zb`^7IDgX&h3Db^2f+>iX|FO$qO%m(9qrWO6FpAh8&HycqFp?}aISB@rw!8CDQ13_k_Mn82|kKW0%6w3b;bJ^&S+stMBEn25{j2Smgi=PR@;9;i8IcR&o zzjz-}r}{-EVa%c(vd^N2fps~bNU&+@x*%zJ2Ba^xKzqu!V`@qGSd@vH?0Aep5ExZU zLMqWTDJVo7zEd>~*sf+)ca%~;Cc$`qPHl<;(Uq=y&`Z-`0OkbqvL13pAP==Yk;IN16GMXlmY9{--^gqQG+;IBJcM z;%BYCy|rqjxVj$8lkp^KQ3*$R!V31dd3;V&@lU$vd^^s9Pkmzg4t36Ny0|)3?m3@c7C=wx8;9W_zDaN( zwgyzR3jd$*S_eSZ@BR;&LCAK0ZDGW=JwPW_{I9khpzP4!av)p&YZI-mLya4bOd=X0 zO80e{#52>A$)<&sgCwCz1~2@okU5GQ&{t3IG=m=*Z@tgJO=qx}tXGnCz5+_F5$fdF zx?Wfx{sc?e&^^Yz05gnv{&75*stvm;=VT`^n_zx7JQ3iL@^%KkUFb`IjllEY0@`qR<&o%u*=uNH@h6iP}lp#)LSl=Hhs| z=Io0$Uu6}-6-iCn7g(z*MopE*_m%Y2(I|2E)%L|+1jJz1X}J?fLiiz&GskNE@{iAQ zDO+K1CmQHUI`#apcYU6$_V9+>?Q08cc+Mu`v$bLXk@7jvf1vJe~EZ=8$f?Aho)yy zPtnE}yUFnILuI{UO1PCoONuelz?N<(9kV#AAIqHA-d)5yPEGVf*yTTk7>pOR-ux=PE$m=s2{!P zDhkj^oMjd1I?n9I_H=l2OeM1(>wOzT3dR>lR9+^yNYqhzS~~oI^Gwbk;!pT^W%>If z(TDv#SRS0{X*GP#sB6?+2#X^OM`jq=%ED^Rq>lb{~G@WH84PSE!)2yMAuWPaXW$@

    VK$f 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 literal 9697 zcmcI~c~lcwx37wtRvV(Cq9DXMP6&#Kj3wHNBT*U^nF5UnLTjJ}k*U&%N;@DZ3MfOI zLFPd~nF699Qz9UViVzS;fCzzvKq{$Jy%X*J*89GD?_2kuw-!`Y_WteZz=Q0nG9-2ra;hY#BC2KU*sXD?j1aMh|+W@cuJ zQ+m}q*79wqqe=G2<$3X|Nodg-V~sfu3+Edc7>w9;^ZB6*fwSO zXYUQKXHL5wyL!6*^517g9Qes)QS^%EpXTpfy02s23*CJkaqbf*?;kj6{e&Hnr@Qxa z#JFj!)$vtlA~fD@jNP&3=JS@%qv>a3zLotFn2>&U>k7N&xQX}F#bTd$ebSrz%CPJ*GU6U?_a#NwR+K}o$i16k6o+2erx^Pju|t1U%zE_ z&+>nG*9TJx9e0 zH@e1PBRXEG!)0>j@e9hb_Ofp;<42U)w=?kh+g&Vw`hC*iuBTj|!^op&?#Jo!BJKdh zS(Gbe5^l0IzM+FP@Lplbv!38*gW8a@L|e$55igu+?H1nXTcq4)xsza@pOn&&M4ru!ohEh13*p z|L|y^EOOBVrR_a2pd-j^p)3AzB$#Hw-O_c`E>OOqKQ&J+_-;oo<2b#b*ywYMkCPLL zTa%k1m2;0&RD>`8;6RX$c)JCU97#K^{M0r?Z7uB&7#E02S@iRdw1t(q9khyHahsI( zYl^tKvNGQoa>sG4ag)-5VykOI%@6f~e4xW*veq%7r;SN!PVR7PsR#NkxtuPLR>t^b z2|2#>_mj?oM3ww!Cda3!#h|8*sPGsbV};n`e3M-FXesr|#EYCOfi)N0oh&P%<}y_A(@?Jwp-aSH6oH0!y-E7Royp$2<;kGu6tgl^c$xNxkXf zZc|IYns$BpdY8x2$55qVcIAjE7tDz0m2&OR#V!n$g0Z+xWj&|kO5m9LK^}FdD~%-8 zRhT``uQc{nw1qrr$NislRA24#gN|KLvIVKWdKbc#kH7>`>W5!G{p!pQC(h_Eb$J!9 z_!g48pZTy{Z|Ei_w|JfpdnzVQ+sEk9lx^oI;dPSo>kVevCG>9thZ+Y0%(ms`S4zvy zc8nXla8G2HLbE=#1$YyGR+7)q6T%O850_=9P9C!JNWrdbKWiWJdU&d(VY|M7aK>Ke za*{sV6RwkO02+qdNXw)Oj*(;L2xY>is6L(~^BO5(9@`T)E3-tut@Hz<^Nlg5WS}lK zN2#96t$Q40TNNO${dLxf3irgOT=R#h%)`PFx9s>ovG}6QCq5sM5ets*2(zxA*kjM zSDKQuB<#b0VpBG0sMIsLsQLQoXz8JerH@S3mOrB)g?ociM??i7iY;Oto(*uW^cK(T zRMA(gZ^NNX%htiVHlqV+j6=JQ(R&7?yPo#y+WKZeeuH%#IighFBZI!&n>jc3nqYS7 z%xBU(EhLnF%_oa$dW(m|1h|aGbs8}Bl%fN<{Y&J`=1KjF5WrJDPI!Q7z@kVWGbR-CKG; zejoJ7J0`fIr+mn4_z4(jTC%))SiS=5+zbhUL;6w&xsV@~eI5J45n zVb}$>utfvpz@$oj-H{j$$LGj!Ysp=Y!ycA--?~wa@TvH~B>yTapd+OCSv%K;Rz}d1 zl(BqWJ(MMF@r`H%{eH%ExS-Gm!Vc>eNSCwZ>>4^|@)K z!f_7MvEx%{cj~|*sjzkf(BN*EH>m6B=CmhclYB690FJIOPBFdPN%qiB=F~m~yF*DS zCq+IDi>?Z>d{BCJDVOPr?+!MP6X{l#x)mUAE~< z_T{pk7g$XazQ`vFGD9$1Wf$fjc+xBllSC$THSXV@(NcP5Yc^CF%nOFH^I0$yV=E8A z7lH4zr8lMG+Oce>yQ9?c$3FTwy7nHO?DwK!BAICWCBi+pf)%BlhnMjqx`s?sj*D_0 zYYTPsFJLRf@%oktEKz0k3|b@z@*=E1*Xv*@VW!acV`9(dKGjJ zDZ~q9OEpD@1Qr?j*kq-GqxatHb0APqe=>aBGcX+eNKVK;4@{rn&OUK3dQ? zV|_X7TmG$NaQNorq18w6W}g?IhT|2#s_ZK3nUxtiEw11A8QY%cmUa<~tgmC!ZzOoJ zN=UEgWjm3_$?rqyr!C6(#vJ8TkTI z<*8>|)P~y}gIu>OSsU2F;Vj>*j`5>+DrddK1_LuT$q*f7$o7Y{{hwJUK}tEwZLg0P zULcz(bql2pzhv4L2R=U6-NM_A_T$Yo;OIn-JG zxa)D@p2p$9^KL^So+<4Wn##L^`)AnKeX`8eI^0HU1KR?tDaYQ4T-$=KXm zV(dqbInasaOken;mdpk0@<(G7j6Frp^n(5HWWL=zS?6whk8lo@(Jzlvh|9v|4Fu$i zQrIWgB3XU2hP|j%(bIuK?1(;>@g;$GI#f!GWw*$++Z|$rpQIEB{;-Vc>+0;iPM*co zZMRd_ha;W2pE<^T=S)6Nm}cdteyEqSH*JD1qa&@wG`sN=_@>++mXfG6IKz(GB)XW? zt>eghB788DE3zu2En}L84$lPo=#s53`{k1&%1E>5>_zBkI;~bTO%gSGI4(ybcXEvs z3eOt-iL%``!czgFHh+ejEj8QB^gxGeC!+(x-zi@dcS{FDQ`8XMaD%PDYr34{ zUOz#e><>D~Tq3hkLG`^)uz!_iTPGnjv|GO%o||YB%e!|<5e&RxcdbA9Los1^!n#Sc zm~NyKZSq`xci4!&1B$5@CRzJUL0mev@|uME=<*q~b|(x|7Ig>RJX>L*hO$PJClgM~@9<9K z@If@bfUA zd=FJ0wG`8`O?Xz0dF(`_#9wz5QYjO7!ME#q^D6~Q2cFH5F~(|rg}@?y zVqCLOf0!WXHS4B-fzrtT!0KGDs8!(~8(-YZut8%g4iZ{nKdT%ytWJ3@MSok23G{=9$e&PserT!xAN-V6C|juOd|u;h%PVGkyOS8}3%iv%%6u0i?L(U= z1v01CljRBHz0A9#Ojc-QrG4iku*f%Ms;>8h9~`}{P;kg{9m ze$C39*=fdGbpm)B95~VRv2EKCrQt4ihLN&6?2z!K9RbZ1TJ(eUE@8-{?wZwqr5UA` zSn&(c@Rq6b94%>*p`uR zWsXzY4|hji9yOQaFP1T$NM|+SPX{7*%T}+u&$}F_uPLtgE9ks}FoVN4I9#IMeuQ*B zf!nWy{b5Ji=7!N+nOn4a5>{!!CZ9AV;d4Gb&UV)l*S8eYXG-Yjaj;^2Uz}A%!esy_4jv~Up2z4b8bzCOf}+w)#*yvKl23v%*vK&ED@x*=IK!JB z`Er8NF^%!!zWQ=JN?NsT27Irb@lIUkMJj=}PV2ZP3C}es#=jW3kXg99a=e%0G?5_O zj(fEnu(ldZjE}`@N-4Zm%a~0=l#@sb?BBoHk~JATkynHIV?^P|+q*3A5YzP{IF{0y zRI1U0yLUdNjmA<>Ny!Ch&N;IW_w)pcF5~bRq!)NJIMtaSBcbbZ-!Er`rA=BS0`*?z zoBj^^+>H{Aw%#yCi}{vB2)NVv$IL~NIs~fo-X2TQuBe9TfJKgAfUipfP5u$rP1r-n zYZ=dmIi@@SM#xNATT=Gl;j+(|x~TQ3>D=_^s3F!_NtNvZJ77Z_NRU(oH52!XORlu} z>&6nl>4*Z<`Uv@5#TFgYkZKF%w=0X~kI@IK=te)+8SSvj;~JS+#**HY_BxcRi6c$r zro8FcY54GM<_VWV%l2Ts_oluk&tO-Nl<>pJ@?QgI{mX!f;BD27@wFsx^ox%Twify; zP;PDd7b#!#9}~R{4=&fc`Yla5fTyGM!O$@j2u|?IMjezkwQw4Pz#l z$*~-p;2oHW!w6{X%Ekk3{fpmBY!I8oSW#YCH51NTki`^9qyu+QlBi%(xCs*!gx>^I z>=&CTpY-^J-zSV~$Y)N1E~6~F_^q;J;D916>>QubPgsp4o$)cC4n>_!2EFWO#bj5$ zo`8_AH{FpbO6|}o8MrPliXs~<=Y80w(KQFLK7lRr4*eV{+TfT>*m_zyQ1+zOEYl>l zE5~4n@d3};RcZPhPb2pcJdutb_~r53OQHUHql?=eAohDLDR)hb^E(sYID>%Y(Aq{G zr{?p8pgVn2kGmYNxuq{|zO_Lm=hTB5CR;3!tqGsEKpa_sW_!bXsrzsZWKA|*OA>ke zJAv*=+F7|zsD6jEF`lRYo*~)y9)J6yRz5}C*n~XFKsu)>O&Qabrp#oJ$xN9|$p#ts zdHSu4vArMhi(ChayzqY3HQp?wa)!@^@Y5+J{U3)owHfkv`QW4;Ce z>^oK~dWKXkVJ3l{$w~+{8j$QU~BHGtz z=*}!)<{!=+Bq{nzw`fA)poLERch-LuN*XIU4I5r(c6LC`gf*za*BA$ijKl{q&*J+U zVcVLC!0}K;8d7x$-wpN?M4rFQ%-byrDxB3@y%`^4li=4p7Y&y_|hrNf=Vi)xT z#ZKn9j3p{h0$M#%wFF>I#4V^SUe_dQ>ZYB*9wE#3_4qQYP`5?&MzK~iao=oe$0gMW z#`hcCC!G>ox1$;?lfaN@jV~nc@*(Dd7B2}!|M9RV@^lhx6z1D`9|FwOUqX3j%7tkI zg-BXNe^DXYssQUvw~6c+@>pGR{U(?8WS|gzBr0y+2!Ui>9rmdAzEzWfc1Xwm7B6J? zdCHxB@@|Q_d*yT8pD!sRaz5>Ei9^!HnI~YotxQdR(zbBwN7BcltOb_$==-TY1?UrR znA~I%?p_4YkU4o>$QFFO2zn=udxWIKQnn_mEoXi->UuJ8m6vb(1Kp>oTQgUDeNS$} zBQo6R|AUxBZTc?qJG{A(a*ZEUfV}hWjZY4rorQubo=heY4jvMAzuSwREgrpGgG1Uqt@}n zOK40#K@d=dJHUrIxxhwWqy_0G8Hr6~foV`DiEM@6N^F*s`j8z}_yyPxEIKHabVmy0 zXCvKPN!xqrZD@D0UKRQviz-ErL=eSc%ev`x;N0v`;t$;4c0}7jpFF1t%&Vhp(n8s? zM#4^P@(k$KH2DNir7EC}*i1>p!6?MKmS;C^or*b65}%EkBoa@WH4(R9+j7Yut)Z_* zNC$gqv7*hoVyKqKmtMmAd)R@vn>IZ%EM_nk-;8ZbQ^OLXAf7UE9eU^;!OrC!vGmj& z;ZE3)K(AB~ew8J~5}%aDlD;`E;#@}EG_WvWXVhdlX>Z_iNLG06BDf_+LR@9!Y4lKc zsJ)hq%Dxa87=ib9|1hK}(`%oBd5woS0G7sgH(A8Hee{C=d}I^v_Wq!DSwb%s!-*oS z+FTH|sD^m16H43+y_gFp3bE=N$iugzH5QY^Q%ywuDy(i}Y@+@(68|NAbOd>L8)2?S+;bEJ zQ7UQuJ=`f?rE!#nJUqake1bgmvoe~CP&*E`R3o3XF0he@jr_@zfLtjk)gNU-A!o0p zCgbnaTlv?Yv578QnB+#{Wl0gsIRZ~{9$FXj2WHK+O)|J|1_gXVQ!VHRSvDfE#XJ09 zNJsJ`Hj9mYxW9$Em4`fRMdu~Qbgf(*i?@_L>naCbOs7d&lU8#OoW2oSFtPH!K2Z!+ zgty+~R%3769;7vEH3!1!TcJyec?4U~Ddc(v{5pP;{)mo)e_?Y~rb56Z;DMa4>9mhPk{qs$|%_DO3er*5$QWQX_Pl(B*$;&lMTn zKziQlD>Nis^mGg8uSp%2Z28Ba^gn)}X#mX+w9f=gE9kEYom%w$tHco#`*QqnI6QaQ z1k7m9l6OLl&trJuxm_DdoQ6mt^Ba<@Wj%b0#k@c)^x?K@)D zzYshKN>sz+K2u*l!7-$Isf_Ufd%aqDI?V7m=9Tmn-dUnQV(`YSqQzP_yz(W;~y z8ekVXkU2akQHx$ajQ*nrQ)!(5{KG}xjVS@cei#To@KGr~ssIw{pMgf}_WuVIiU^Bt zp1g!cH{);2`e-d^%NFDl`s*#~{3@<2j8esup_D8&Y*8~wKMsF&b`Bg*njRL-o}7+G zvw=i6Ee!K|j%FJjA1y?eb^C@@l2s%!XDYo{0yXw|z0i;c!*j*P+jyE{lWn-BFqWB; zHn3a1gmDQ@C0+VAkQ{(gFt;&D-t<5virPHW<(xdNG6FhYG=T3q() z0TfgNZ%8V^ax}Lv{4_=yo5V? zMZEij)qsWdqSt6XNz$j?&s*CT-rWeV*HMG z_y?;_@w3fmJ)JuR#omWhb-%g*Z(K^YzkEcS`~FoVlL zW8(<4ssL3VNG48$1W^tI%qpeT{N}cB6*JnI4N>-jF~l+Mo#?lxUv7j;(63O^%LsFa42K zZ_tab52I*n%^`nyaID5OTvI?0jZmt>4qGuan~41qb3x!%{9J=zsK_u&bUJA>Gl@gY z2XD(>F5<`O9Upp)wx)q)(Lg*kPIj|e%V5vqM~RUXiCoPc7TjQG$DC+d-4g_+qaYm! z9DAK_$h^aKpfBqq6v{OXNq5+S>5^Rt%39!($Xg5_d+SIsJjr_CaJ2JhI;90y01 zn*cV4(j9hq8$**tl!902Nq%tJMrI_}3)%4z2Q_r%EJ@_Ou)~SOjCSUHe$*agP8{;^ zMSOqIsC*;oCj|){zR)9(>VsBmn+VxiQLoYW;QiH_WZt?)QMdGj)!Ydj9BrzU%o($; zfK1Q-B@==7psus&PH%EA;+|4+V(u(d zy0R!hDg8fw-v$eKkM()^NcV_;@TM9kgAF zIiAX2jG1wr)U`r#29oj(WNGL~v*_fcR)hSi4@@ot`J7@eG5-WoH2mm3uYSbfjx=E% zlzs_{|8ZRprC)^N|EKE)DE&_;{`(bX5y4-4GU!l2eINluB8(&OsOD$rog~5yBeRLW>8cpjl+*Y!HsK<|00mp1As#0n zK+lztU|I<11dNpO=ZrfjScDh~sKV^`MFaQ7m diff --git a/icons/turf/floors/lava.png b/icons/turf/floors/lava.png new file mode 100644 index 0000000000000000000000000000000000000000..ef826dee188b0b8e9786f281f50db39e3890b425 GIT binary patch literal 64976 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 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/lava.png.toml b/icons/turf/floors/lava.png.toml new file mode 100644 index 000000000000..c4e36e85ab19 --- /dev/null +++ b/icons/turf/floors/lava.png.toml @@ -0,0 +1,5 @@ +output_name = "lava" +template = "bitmask/diagonal_32x32.toml" + +[animation] +delays = [20, 20, 20, 20] diff --git a/icons/turf/floors/lava_mask.dmi b/icons/turf/floors/lava_mask.dmi index aaefebe39deb36acecd43ae4a39f52a9ea381e49..3e77c406b268d939758fb96d674cc06bd1ed4567 100644 GIT binary patch delta 2859 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 HR`Y)VI&umL literal 0 HcmV?d00001 diff --git a/icons/turf/floors/lava_mask.png.toml b/icons/turf/floors/lava_mask.png.toml new file mode 100644 index 000000000000..08d0173d5cde --- /dev/null +++ b/icons/turf/floors/lava_mask.png.toml @@ -0,0 +1,2 @@ +output_name = "lava" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/plasma_glass.dmi b/icons/turf/floors/plasma_glass.dmi index 83aa755b7bce1a165f5a2040471147b91de64852..a0e2dd20b796cde8754fab4232b64cc9c0fcaa66 100644 GIT binary patch delta 2252 zcmY*adpy$%8=qE2HyueXW$U8IHE+4s5J^W(d5hO=?>SwR3?-7wZ>oceaGF$pFf`G`F@`7leUSflkGsxbzOhc zdV>eJpmUG0-#f6%J1^YXZY#+_srxs&Xs-BE(;6ePt06@*6b5JB>%~F{-{R`K2@GlKIM4& z5Q|Fwn9{b661eM{_ake0X4?S@S)Avb^3de;hf_HJ8)sJ)ZTc|agKbf)n>_c+0o@@^ zbNrTl>{}wjlx4F#VG64?J0GPo>cpo=HHdNb^BZ3HFR86_@Jxu>m#RH<$SvVe5N(>V70l8UQN~kPzAK&J1bT^T3K|=_>`9MDC*lRv4m6 z^+q}6=3vG_8ch?}qOnHubqK0qJs48eg4{Zl(JNJLu0Poid1`lMx~KFWf=smfQ;b4j@=+n$`gw5CL9juoUe2@co_YbAry_7R9%Mm&SKxjOMA7S zijXh1GU%z4xxzmUq@%uN^wUwLt_=Kn_zVw`ADdFeT`>|2PQ)yiT-$AFKOq>eiiSgL zfT6TXi+DKr_uuwXBpUjzGkn$FX&t!USoN@9K5R!eQ7(xjlIQMD_V)fs;-y3=t(wdB zC$9)%0}bvKkYb{oN{dwaEXo_zb6nJYR_If(EA`2R8n~pHdXjw%?>ZkQ#|~7HHZ{e! zj^C!V4mi+*k9Tq{!;ma#Xjz%SvsNnM&wbH<_swh>+XJY#h-!c&fWPkGQQoSyc&aT%Qe?ucN zYT-ng7^$wKc5!L#QY*;+ZUFLQ9@_|V;PCF&$e4|VQIku;S^7OJ@WHg9g1q)g*>2Y&d+`%qS9h_0I%M1TD8U%3yn>eYiPe9qhfT&lN}(1?-gt6kPWbpL8< z3N@=ivsYH!v0oO~TFWWxC?v|za$o8rf*7ggce0MH7AU?qhH2Y(H$6T;zxgIYftr{?Af-8(4~bpvA`1*!+Wt*_J%bQ2>BY9osi zZTqwu5UbqDDd3L`IK$$JjLoEo)N$nCv-pv;tM9rYZZvV!w(?#hQXJC_N71F|laTTs zXF$2TU+_X+?KIHZ+a<%7ri;>?s<7FQ*sSQ%@Vg>NsCaN>qOF|w*rJLCEdAbf&6TWt4{kj{(+v;E zu{nnsaDdTFw&f^6uaq%2-5?N$geH9#RqHC`kD@PXFA8@DML10XO{V-2 z1ddV4ClxJddy$~vBhY+3U>ZXW>s7KD(br_HcjSGF7W(1({*medg(gdi&cufmfmnkk zA)IKz!29Ag$LqAd&Pz9Y=~3RTFtF(a9CMZU5H|a1@%B{6NjdE=LgFwOOv*kgx%)3} zls9?fP0RmZk>|n(CFjZ)l5-_1{!#bwJs;rltnDb&(Sd=}A1?^!R~(iXDGzU0}?HTu^p>V!~?c2dZIgqK`n zG*+LKm{_ksW`f|(&5y;N88!#eadD{GTTF4ujVxJ5UES!%plc%y+%&Q8T_-kPY7U z?de5w9V$~fEgDNtT787eWxRrEmdON>^C8-mE{JuBgwR*x;3qZMI##|g&HTRg-(IMz zcLbFNUpRUG2ufgd%eZj!5&Zab?6LMw;PPBJa>PiMZqkfx9gQS32YEvQ;1iI5R}~4a zCE)`OoUy*#(=!FU?scysk7#{f9S<)|Waaau@C8p#t2H-7p|c)U1zJv+o< zULJFf#kR@9P{Xm)lZppJe5m?=Os6=Eu=VQegn8u6)46mJ>B^f_5g9tOJ*1~LXa(t zL0udBd!YW@t7<{jv`9n2GYeB9+Oqp;O$XG!eln^=w=cy0`y2Q8#vuu|fB}7tIEH*e PEr*xKad(E>zi<8*Q^nt; delta 2354 zcmYL}dpy(oAIB#-`_ZY@DXj~wUs6qJbxsQ5i*w|5w2Dw+-9zY?xy@`}Cq?Ci&V*dH zl1oUdD8-q1*vU9zxy7(nWEX71FuQ#B{ppCe1X<4$Nkm zG&`@nJ~8aO>$(4ncr3cpl9c-BVI1lFBP4RWAjh6z7oVD!{&=f zbG{oe@fB~GCNvhe$HBw8Ge1JYZQlce-DcvD@HR$&Uet8Lo0jYxx2P9Aww4ucK5_Js zYM2V=?4+IA7XP#S{_p2!Y-q@Bpl}b#Xz$S{SyisjOxmn|s>-S^wM*4oe;Ip#L5_|- zz@RvaGaB#2^nbwyqV3LrfgEUp0^VoNq;S!wRaG2RXdB5srQF7^d%c&vp%2}^w%%kg z*vM>fB(9`H1~&$JkV8xO@gl>PnyZb>BGK1b%Y8VPN{IAm*&8=~c|P+TIk~ zw`Xs5-E{rq{%4ZYIGNffU-ISt4__L#SYG{jARr)s?Pp=*W>W;2%ta# zRnMuDKC0`a^=E0e#9YR-0i;bmj!q^qaGL@PCEWFl00QTEPxUQnzAd~+wm*t#0WX2 z27Vt+a+1!cd0`#xMNv*K;oZrRL;iIPcuH16CjU}}!!a}WIG+1fmB|Mscvwe~s2Ah{ z!6Wkqb+2C92AHXB66C{hg0?5*#i?06Qx)O8y@^Igu6L9~jN@n-&jWYGvEAgl8IkIq z6Ce-@(@-oHO91iJV;zc}6#a?d{=P)k3iJ99CI&)H>Rx>96RKzhNHee%;q_p9u4M_X z$eo8Xr|6|>Zta!2V1%#NKhbx5q@JRhJVO0rCD0puKc9{n>tPB*RLmw8d4EVyQqojW z$MMd)99?&pm_f&sMh>|@#0$g^Z${tN%PQ2R7CbN>_>xp?RtCPK0jPxWI-H<_0aqw1 zm=6j%%EI$S95A5in3f-{HW}FG^D>Bz3G(~?B0M&u>-spqI(odGstJC-BN!M8B+eOhzN_>WGWI9w)4s`)(}%PvM;7w7EEDH80+GU}V-dIuv?AmN>_4Q)k~!^k zA>pI0a5I!#O9kl4_5#N05=_#XmC^O6!(0osM z(}D9@xIs#TLc3A}oHOJlO|-gQlWV`3wcAh))=)T@VNYnM5%P;&EX3U3r z6#>q#F?Z<%dyNi_alZB6rQM!PBYUFF9AO((Ur}?^>?p?CO~rBS|2oOjUyF{p){hr6 z-}$J1a7v@LBE=7rpvb$W1<$;?~2yPHB_%nH}dav z$>x0N<_)lMsN`C6HPXi&%8PIj5IZ}YK zZOP`c8zK)dh5?6U4z;mja(iK_T%0a1{~3EcH<#gXA1}i=*^Hd(uxqboWGyCiKzDRC z3k*dgh!fY+b4K;Ed)+#Ps+5F8SVv!V%!OvKbi?jW3AMJHq#w0jyKMHH2c*6wci&kg z20qGUk^7ar|Af{3muGjL1{)PLXQR!aq*PipE-f7?#;tbemEUUwmZMI`0B53fcz^X99J^Bsx{kLSYFAY24<&%ZkdgTD3P`+Vm34MICYp8k@u zEvzT}tm7CSyt@u-0t)eE{K*L6J_M6y@&DRT6>_X;2JwcQ5`bX>2-Q9L z(>?>sg>d>nIHwT5v$C)hmrJ$vl4`}puMwgTDD)yUMBkuAdehSVHTpMLt7N-*j++$) zHdEj9pglmMX*tF#js7Rc6Gx8bS`PQ)(WDBe#Ksw4KSb4d7$8t7KoiyxYexbJyE~aU zuPho#8Y_K`@b7bglFA(j>K*gTTQAnQ0J$E#fK7TNI<}{?GT$%~vG_dQ4*&Gj_4KuW E1ImyYSpWb4 diff --git a/icons/turf/floors/plasma_glass.png b/icons/turf/floors/plasma_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..06e8a79b5675033aa3691f73840ca0e26be38ca8 GIT binary patch literal 1041 zcmcIjZAepL6uzQq87fv}WM!aH3AQL?Kh#FKw82sbR!Om+V8sKVjI= zsAWQ!qm4es)U{nDm%3Gx)E4BNUu&ef&Dq+AclYhyp&(p|bFJ85zu*ss}CM1~!j_3Q;uMK&50~7BwoXHZKV(jfLoy zw-I!QK)A9hqmUHy72xA4{9E?u!%2qzwfK!TN^Se9o{H5(q9$Ps<@E8gV3_}BRYYOT zC&jb|wO&9lO`C{U?3$qhe0W}Ciq%ZbmyrpA9L4fqNsK-am)ILYAMbS;xd!Z=2{nHx zL`~ZD3=E;U%V`6ccHJif6ay6Enr`t7KoSif+trHeH zsDqicbGvI@`#q8yx{7Bhec*lx%`16o3xQlx8L%UfQ|L0+>+(2$cU$>b9u#$45RQ?z z`x{+NDqQAw8JD=7_nltP4cD4gf) z4k_8?mrCyo`ZZNaYnPcO8WzA1QlHe3_Bj7xLSgHfKSWhW&}$ZBz_vA$6ipCz$so8@ z(pnYRNzV~bx4?*M%86u~W|_ZwI>01Rh)}7=_3B-4J8BluSEtg*1!-^(#Q^Bep2c*l zBL@m@eq7d4OBEc9vL?X;)!UbO?5D# T_|gILS4UVUvzW3I7wdilY2R;W literal 0 HcmV?d00001 diff --git a/icons/turf/floors/plasma_glass.png.toml b/icons/turf/floors/plasma_glass.png.toml new file mode 100644 index 000000000000..0fb4b5fa2761 --- /dev/null +++ b/icons/turf/floors/plasma_glass.png.toml @@ -0,0 +1,2 @@ +output_name = "plasma_glass" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/reinf_glass.dmi b/icons/turf/floors/reinf_glass.dmi index a7607cada6a7f69478bb9928ea624775472df96f..0713375caa6e33397f3f906e44d128bab444749d 100644 GIT binary patch literal 4161 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 q+k6pU4kZW9-uYkprWarU diff --git a/icons/turf/floors/reinf_glass.png b/icons/turf/floors/reinf_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..9659f3e35c10dbc6be0c06b3ef00d3c7c2e13726 GIT binary patch literal 9078 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 a+VN+?j_WbaZhBLgB;)Pn>e|H{_Wuiq)3+)B literal 0 HcmV?d00001 diff --git a/icons/turf/floors/reinf_plasma_glass.png.toml b/icons/turf/floors/reinf_plasma_glass.png.toml new file mode 100644 index 000000000000..1b3fbb05ef9b --- /dev/null +++ b/icons/turf/floors/reinf_plasma_glass.png.toml @@ -0,0 +1,2 @@ +output_name = "reinf_plasma_glass" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/turf/floors/rocky_ash.dmi b/icons/turf/floors/rocky_ash.dmi index cc6847dc5884b9b4a1096c72e0108058109f56be..758793cba42160ddeef814e560f83ec6bf028e1b 100644 GIT binary patch literal 24275 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 UV>F%vDfLIxl(m&gubUzN2QSKM{r~^~ literal 3881 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 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/rocky_ash.png.toml b/icons/turf/floors/rocky_ash.png.toml new file mode 100644 index 000000000000..6e3f50e05427 --- /dev/null +++ b/icons/turf/floors/rocky_ash.png.toml @@ -0,0 +1,14 @@ +output_name = "rocky_ash" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 40 +y = 40 + +[output_icon_size] +x = 40 +y = 40 + +[cut_pos] +x = 20 +y = 20 \ No newline at end of file diff --git a/icons/turf/floors/snow_turf.dmi b/icons/turf/floors/snow_turf.dmi index 8b70aa44896fe2d2a90cc83a4d0f6969b253ad55..a150dfdc2db85d114b0d8fe275b63259f95c69d2 100644 GIT binary patch literal 14571 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 diff --git a/icons/turf/floors/snow_turf.png b/icons/turf/floors/snow_turf.png new file mode 100644 index 0000000000000000000000000000000000000000..474a0f486e79e9412b8d9c424e02b8d8ce11d50c GIT binary patch literal 5128 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 literal 4949 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 diff --git a/icons/turf/smoothrocks.png b/icons/turf/smoothrocks.png new file mode 100644 index 0000000000000000000000000000000000000000..dea84d594f6683ce51547a7805d9c796e511bc68 GIT binary patch literal 9893 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 Udp#eopE-*ke00%k4=h{vKLc&@N&o-= literal 0 HcmV?d00001 diff --git a/icons/turf/smoothrocks.png.toml b/icons/turf/smoothrocks.png.toml new file mode 100644 index 000000000000..4466fbbf3c92 --- /dev/null +++ b/icons/turf/smoothrocks.png.toml @@ -0,0 +1,14 @@ +output_name = "smoothrocks" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 40 +y = 40 + +[output_icon_size] +x = 40 +y = 40 + +[cut_pos] +x = 20 +y = 20 \ No newline at end of file diff --git a/icons/turf/smoothrocks_overlays.dmi b/icons/turf/smoothrocks_overlays.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e49a48ca09e73fb3f11da36d90f8398d33d24498 GIT binary patch literal 1243 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 literal 2606 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 F{tvku?dkvk diff --git a/icons/turf/walls/bamboo_wall.dmi b/icons/turf/walls/bamboo_wall.dmi index 3111c32b7cccf7758da4169278a0786f7446b3a9..4eafc79ad48b7ce46d289df915fdb24e4f50b5ac 100644 GIT binary patch literal 4667 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 diff --git a/icons/turf/walls/bananium_wall.dmi b/icons/turf/walls/bananium_wall.dmi index 47e249c42e5b4c5eecbe48c53a32ca382a6d3c3f..abf70635337d472e2891999a0316d1263f23b927 100644 GIT binary patch literal 2613 zcmV-53d;3~P)N2u{{X^zkqKp-V ztSDuT+nRdN6r7BJrP33aE`1$So1_Md*+D6MNjQ{`$n@L1LRCt{2Tv2wTI1uCrOA-zc zzs&*s@_YdACjZOW-2W2uw#Il?nG@cuZ)-H!0F0B3kE;E-5& zFA@w7;iE_3Om927Og1s&yA<%XWRWkzfx`_x?SEBRfrY=Nfv*)3`JxHZ;Wq6SR$$@# z)blC{d=dB#-U0DW!&pIS;72FqmNX9eumwKhj_?i{zbJ(Qus|!mg8<*H5*4QTI|#5< zi2Mcu9{vb+AfN<{6{h&R2*3)NfYmR-?jAvA0od(WH+*;tqy;`ez{V|rgAE&e?jt}O zZWF_AqhXeYJ0ipJ;BX*5jTNexr9QugHJ6OJV9X_BE?Vr8NvD%Jq0A{|PAWL1!tGAE z;qIkFEc|{r&`n3TTm~M9j}QkSCIUpD0)Yv%7Z1f)Xod+xH4M!HtzGmB7=uw3oZ^AO zs0dD(fC?)#3J~EshUaWPzakh!i~RviP&ik7D=o$~!6*QyU{HW~1WZ8i(x{kCO0k!c z3JAK5j@kYJIzPbX_b+uCv;6~Xetj+dnW}o>;%O9StydH+DVJS8|4-6qhxX#YT>y!Md(02+?)f+hP0QssF8)O3z% z+5Um)^3+G53?6LqdhX=3DDR-o4>WT494=nCe_*OSmxLYA9Ee+5ynkS#yia|8U^;EI ze_+0VjTWse0yfz{FyD{gX#c=(^$2z#;Qspu4DtL%`v-orNAM>Ku-Ji3_77xlfxQX9 z;nO03%>`&>t9Af!P+`gr;CuqZodD*NL4`@|=L_azU4U4WG6?YV1@o~kK)TTe0ddK+5-+DYEh0+ZhxVCwm) zazdU8xWkf7lBWXJFIuJf8IPc9CYSBBbwlfCza|0d_Xbdb{ln*Ug7(|u)9=~$zi9EA z@n!+^`vT+s1N_u0W!l($fRWfRbPG&JausNXPSR zK0xMI`Ex=*I-Y0q0g7OSzrG~|q~m!uA0YE9e0lty7C_>8HXk7JYy9EgW?Dd^FjWA{ zul@M)-jsh$2w?F%oe#jI@nuQ?Nq2F<&hOKY;HL2uwa=^am&;D|Dy_Q`voQv1Sa&;?y!P8EY*t8Y|h8+(*o>^)hgNwkJAIkHe`}Hm0|2*(`Iw~Ge zi(x#);T19F$MT$j_qQ*f&M)on!KvqC)MD@`(7`~A`LR5=lj{Ae>;GRbgQfGQ9Uq~h zxPniGE*4_UkL7s*-(9WOQNT44a1Aa%r;Z80{8(NrU>I)wX>h@4IMA_2KOZsX$MT#d z+))cW1q^QYb?7KD>Iw|I6~_CBF+Y~)?ZBQ|;HL|C+JRgGvJOVshvV!HNp_bkzf+ps zEzcg9WDm`n+`;J%1jH4BpknKkT>!px_)=~zKy*9kmJbs!7#=W8n+rhGi>7&V0XX>J z;Iz2_G5o^tytx2$K+r+iT!3)Fz(sqIfNLb+8-IL+fWZ(!obWIKLkmEh@OS~a9>ER- zl$wA?b;I#yalYW;0)Fm0@U#P&A3?^!DEn}n-67eFOP0?m&F+?G4@~lhX1RmY+yedw X1_}*z4$(P300000NkvXXu0mjfo%`=w literal 1406 zcmV-^1%djBP)KOdqg z*%rI9BKf|=S2a34Sh68vxx#4DweLdU8AhGbZRh9Uy!0xJ38Ol}sMezkiDA@?vRCu` zW-zloVC|{MvV?bqc+AymjyZ z00cHkL_t(|ob8!mlA|CHg+0RJB>zXE2gs!M0I_lbvzz;0Wii4?9%7Se+BmazRjLpO zpCApdq0q)k^DDqiUZp4U(NtM|v=jAAR(&WdRd4}%9-s@Y1`FP7upEH)-iNS)=|i0Z zu-nA}=Q9mZDh}vJK$qt(Hbnbfm7xb^b2u5p3Vq(kH3Ps*v(waU>GMwgG|K?^s4tfb zRxnxZApt=9fvIqru5h`(0k;Qa1yMjAN1K_)DLtV5;FUwP0D$iYlo9isZb1AE*9}PU z6B@wu6B@9@5OEem(zwfc3V^jCk;dIp697C>Km(Yvh6XT&SptA3EolH#9KRk=#sQQ0 z>jS9ykDS4ibs3+g6Zz`{h!4@pT5A5&rmdysKW!IlsrgTvcn>zf24L%dIslUEtNE`C?Jh1YiIydn32YnmZWjT zF=#uj;j#~YKa@T{t+)E|{?ibeXf?9=uu7Bp;45j{{;4=4b8h}H%8iXV^wt{<#oh**mq1z<1N2>{-PLk|&i%cKF!O`imC zWeW-53NISKl#V1|e7~=WUwHtCZEOJ>3;>W3h<9-Ss(A%p5kKn0GuD5M4q#FhI1htq z89ZZshz`Il3iPDFvG5t|V|0LOUcp*`OGEIC^)Wg?HGhKD3>UZH8S7(ofNCDsV_cqt zcLL{DDMycw8MBHhz}qG+xtO7wD|$i17U#ZVkf>_i*Go~Y?+dqzPM}= z7hdwx@!P9w3>Yw=D7YpLz@QC-IyL~qP7F)40i0`KV9f?#=#NJOYyci!;Nb=vU|;rg zfyLt)HUJNh@PLU87=rV0lfxsjOn~MAaK+3VfKNw*bI@#n&mO=zXnugy5G?>uQ-EC4 zbbML756BMqzTaT;0|Fqp*oiOK;v3FVTc+HmFD_feg_pc^{O;=dA3i8W``^3tdH?_b M07*qoM6N<$f)yKrY5)KL diff --git a/icons/turf/walls/boss_wall.dmi b/icons/turf/walls/boss_wall.dmi index a197aac8ce3298dfeef2e661dc9a1315b36e550b..eb0992e86e0092d23c60cdaaf8a9abea9b29e700 100644 GIT binary patch literal 4611 zcmai2c|4Te-yTXMV#XduGnPoUQjDc$8j&r#6orTi4`a(x%%~wGktNxMB#B6NGmq`T zBb0q9GZ-_nWM9UNnRoO&zt7w6{pbDTzR$VN_qwj{_k7Ohob$QwSW9z5J{}1k006*e zY@~0^Zb|zO_W|}>Wj$kn-C!&)+ZwQ2Q4o)~;1O|wBS*nUBn0_HLA=sO1r(uTr;bA) zLi{SS5~mf8$%+fghzmkR!N){Fa+1RG5D{4kA($vwN(7_?6F+fGR7FPOm?&6TTKu%U zl$spmBQeQOjw44%-qEZweWv5Ouj_TIN7(g~e z3SB>OVe<}eZK?zfO-&@N@x9s3dSFxrAM(KtPP95TWg>#g-#B^IoUqjlOdEVA=4Csq z`Tf1w!0{p-jTyfnOnZpLJU!g$vu)6iT`i1Asv~{(>t!mm6fg`J<{ai2J`i+x6fi1s z({!3k{h5|Rn~wD4;nNl|4-Oe5-_>jrHg&ru$Y<)NC3xGgfAOoyb8TQ!`~|mz>eLIA z8-n7T@E7luPg^M$SgB|iPQ2P(F{&}Fw<;{u54Xu{QS5Y(G9ebj$bYZbwQ(HMs`F+>|%j(6fi4m

    ;PNb+Y%B*B+~wB(6Ck31Mu@ zv7l%7~VD|9gS1$PbjetmmwAoRE?6ON^jy7`#r44V?jxA zB@X2y)X3dK!5_Q(OlPmNEUXG;Ob0eBo_DL=)SFjul{5v;SnF_ayvD5wb*^X$jJk#9M2J!;XLXv5Dp_Qulr^$8vNkj0UB~cB&m!KjaX?x* zTQU$2GG+FPlO}WI8*K71@Q#_OTJ5DEV)B4TrP>uPQ|T9mC7`9-ncYQe?^)ZcVOna> z;@XKFX8z-QuuY*M>(zLte^+|G1f+8=Nfn99enm8}o9~o?A^~d_##_!rr|^^b;Qi zHS18W#swr9>K-#_F|V01sP!emRx&O7T8Vef_04z8&$Hd+s?k#3p|<|nmY)}m&pe4O zT`NNpScB!R*3S6a;oR6;h2(?z6OJKWtH=-E) zgUH>D*Ts+T8|+$bdaGw+a@!`n3M$bnp~}P;)>l{F4@8%Z+&-2hvQes*nZH{npHE8| zL?h%_i{(bhdb2|Rlq7S7Pm@l}fMW_B_8IP;`Mn4ov&);W+70CiH;KESVktGECeDs6 z6NX&<3FEQ0M&);`3+evVFABarc>Xs}nfj`qIc3Y*D<=yX>2NZ11Rm9&Ch7p0GfarJ zbsV=Jh_Kb2c=2Za_D8$cu=;bwXv=G@443p01jUgkY(o6=Ato@_$Uv9>-60rRKa1>{ zqSQS-lJ4nBbvCfKS*MaMzshQZ$7h^q--M>LQCzJWEoBu?&#jq z9*quOy#5d4rKneEEcJC_cc#8syr*>jrMd}E=#&|>!m!KDsV{(YMv6YHpWxeq$Ac63 zZ$~jA9OmUVYf?HFWY5PezYC8f(v996J~lb*34gd!wnw3E@%pj3DRCwD&CXpZNGu+i z+w`}8<}dWgfm!n?&7(OWxe zUs!q~b1tk>Bs9Y;Zu5Abes!;!fleyR=HZXVM*7!l6I5UjBm{832 z7=i0?!Td=zefuKU3=w2hr@pjmf5r*BcVW8eSHXnxvoW=Ir0Oo!x)YQ$zcd)BP2YJQ z9=)Hc3VLProU?KE8u4sXq3e~RG5PKy_xf?4?$8^kMthG$a%a8KX`eB%d})iyKw0NE zL>S_x^Yb$Tl=6tPO7V5yft27a?y2U#(T6Hxx(VMeRn(n-5>H`0np@!KWG+pfYAY!o z0c*0-{;CNzTGT}yzZVs@Fu{PnMW40$lW@L1sM@YH^8<}=xvl41)ySpO@vQat=yhx% z{&XjRX~x&M?CQC_Qyqoj#ebX7%zXq3uBCs|C@3QRDOxx>Jh~}Csh1Km* zpXu>))ayhF>uz{>K9G^=0Fx3X%8Pl#wXeFaV}Z1Xj+Zr7Z+9&3Q;foIy*;!8_lj-! zL?cj^UP1~7pAiYni_E&A@^@(EY7Ukr_JdE4S0*d7L&JASR$hlibtI0fKHvQ-=}IBrM})w21-p;Fpmd0%9+ym3Ife={{JVk=QvzVI}P?6%0S#!V~|U zoIoXjalQ3ZtnQ5bAIx(1>9hCt=gnS?gka_HGjj)bYRX!Smx$;IX#Bt6-@prmJB@0RExkT>&IYamGV}xXD8RN(i@KZaeIz<)

    # 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 diff --git a/icons/turf/walls/clockwork_wall.dmi b/icons/turf/walls/clockwork_wall.dmi index 8263e901d00b9e0f979037bbea2558b644fe2cd8..d6f1872d7c0b38d5c573eb40c4ab2387c4f2d083 100644 GIT binary patch literal 3276 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 SbZhCaBjCK-6-jmsNcaQU^up%= diff --git a/icons/turf/walls/cult_wall.dmi b/icons/turf/walls/cult_wall.dmi index 5239f7b1e0688f81a62f98d55395804ac02bcc0b..d1ea0a85413ce865090d59c2a1fc04eeb250f358 100644 GIT binary patch literal 2898 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 diff --git a/icons/turf/walls/diamond_wall.dmi b/icons/turf/walls/diamond_wall.dmi index 0645aa2e6fd666cd1e75bd5bcd7b8e209baf7ac5..1dd44ba283f90512f99d7a724b79dba0acb8d14c 100644 GIT binary patch literal 2552 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 diff --git a/icons/turf/walls/hierophant_wall_temp.dmi b/icons/turf/walls/hierophant_wall_temp.dmi index 9f0d4b8d23c08e1bd8cc58f4134e31c1a10c1d53..235f8347cee4461694cdf70aa338fa03426c5cb3 100644 GIT binary patch literal 3547 zcmaJ^X;>54(hi#h5LtAD0cBA^M})9BE)W7Jn+g$UR2D-RWXpgGil9K!h$t#ZVB8T1 z5S6PAgiTNaL~&45Fl-WV42zDKkU#_yLOSX0ubuC?|9tL`>aM5iyr)igSG`qzac_{H zzOI=r27}QL@ZY%)y^ntr>=N{9X8-#H2BW5t{%c6e&X^O2k5iITD94UsFsDjNud)j| z91VR$i*~+y&pJ1q4JcZoRlV;iuH4@=@!}2R1O;UOpBo=jl9TV;`rwlG6C2_tU4ixAy#R=I6D}ANg^p zm6J2$CCjFS<0Tdrj9ebCw;)TQC5X#9vE(K>OYtZv=yPYzZJmwGWoH{3@%+94vm=56 zeSVQyjeYfaacYu2P|#UT?5RWKfA3p(838_zgfY-{f4)oH#W4(K>6L(;Uca6ynJ#^H z+Wd)ePPj4; zNFJnIIJ*Ae#Co^kK8vq9j#q#V;LOrzμHQdM3cxx4$)A`{QPKpTD-eEyg<(hlRc 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 diff --git a/icons/turf/walls/icedmetal_wall.dmi b/icons/turf/walls/icedmetal_wall.dmi index 1782b9809b6691bb14a0576c02ab1beff60cb360..b069da4394d671c2d984417b42bd5e20fd1f7141 100644 GIT binary patch literal 3680 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 Mw7+Ec+$JFL-%}X3mH+?% delta 1846 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 literal 1740 zcmZ`)e>fBB9-qSrdn&oOX_6nMhnf7i8#xtnhO>nEQCSKV)p&3?SYxxBRi|hEIc|YIJ=kvbrAMf+tK!%5G z0fK-40ALH^CwP>uzE~edhPpW+w}Y-LR>-3Hu5!xAoh=@Q7iWlg5r zpiB47+XB~M260ZN@5DB4kI4Sa9hW@FD%$bJr4Ndh$Jug(=T-F|w+19jQU5seN^`Dg z$+FEaWAC&>bZG@Y)v4F|EO_WA&)zc)VcI*yy?-|abl7jUJAc`u)#BOL`wVX2*4P&Y z^|r_-9yn{(HC3kA*Rb4+`yTlGe$t}RhnfpJxg*-6^ij5|fZ`JvH?pw&=l3W8;QK}d z{BX>rdy=ZOp)v1mSDb3Nd-z)SAUo>nqkyn@>N4l3%llM%8TRwl(E1>*F=89Z`M%4M zP1ic!E*2w&h~^cu#N#Pdo%mK(a<1mfk!vSDTefvD6GZ3?zKeUaWyuh|cMhu#&o6f6 z4};8qk8Vy{c)s0U0v2=`lIcahe~szsFUtWNpik5;HO+=K5i-rE3)>?dUIQOW>;+lu zp)FR32SZ-Yzd~IFT|``Kt94j#5akE2X)y#LUT&yQGj{4pY=6#Z4fm>Wa&RNO?3CDp z@g)!c0zNzbBzMArL`V!B+gg4jJcJN?>X{MY7X|cKN=6KW6<~ZtT>xE?Xl>VFDDlqhct*2EB2>TEIq?RXY~kQdhK?fnBitmO z79E;BA;cm^$c9!eJ9_h#~lQ#{B7W4Pc z^&h;+zLlruux!$;&a{X~nz_@|#aCSiU z_Xe~ULj>2GPNP2V&S}yr`l_B=6n5(3z!P@-Z-*GCTx1Wr0K?&=)Vs9GV z<_|9kY|#3MXt}+ z^UnJy+Jq*@;M)@Ax+?2#-eJBpkHn2sU5Bls&Vtf zLK~mvX*1YBDSAms<;$yPrbj< zy|Qo34`l2hVwu4HT;}gLQKh>IHgrVfhPNw_q{c(H2D0N!zllyweP+^;ckk%qI9En{ zR&^P^%5;Y*aj$R}p0Qaj`oySB#Alw12=PP-6vy~!$GfIDr@t~MToR-Zzl`9t# zv8&jx2Q|<;|F_lc2r2O={kY42;|(ieoq1v={|iYP-0H)&p-(8&|C>lC4bH%E97+F+ p_BqLtjbBvsVd{o${FSFw#@Dway$sz7Ai56+fCvhQw*@8^{u|(?m-zqy diff --git a/icons/turf/walls/iron_wall.dmi b/icons/turf/walls/iron_wall.dmi index 86bed015f15285517159ddfa44c95038c074c100..351109bdd3fa74ce67e1d1d8d2634c6331a1be6e 100644 GIT binary patch literal 2568 zcmV+j3itJiP)fFDZ*Bkpc$}SKnq1%r)a$nA|18C|_^R%C;F*jeg z^26^ZMK0w$chpBN!+(!js?Bcw^Xv2t&LXJYzV1gC000PUNklQ@;(f$6 ze-!Zc@53qm{X?r@JReiee@ocr!?9aDd_ARy*sY)f4R&I++v7oKohbqEm`) zH)19L-EPEr{<~IS8JGyn?7&M|p}@IaX$6*{84JY_W9UUfF&UcmTDwRSF%wY!UWv>6 zJH%@XI3NyL<}Q|pe(vDA11ey=5O9EB=-|@<{EqQKJVQUg)cW|QH zcJSSAEV~`yO99dFw9jQf_web+_&ZHN$rraEn%<_lA8caAcPZodl0`n`14kTuj{p43 zEAa5Abm6}#B=R92I^*yg|II7#@aJ^qH4gcZ`3}heNlrswLF3?iC*+hg4*Agb>G5pY zvI<%UKPlw`us|=qf`HVmj0$c33Ico;BENuu)o;ND1T=uLLW{qO0IZM+nEeoJ?iN%Q zfZdLD!_`~B7Px|dg7hd`g0I$g)4?s5frk-@G#X|CFi?TO1lo&- zVk|VngrORSW+M6pjKL@iPFXN2f>S17hZQ;nh;SXlb2gv9BN#-B{Q-1-fK8F4bI@F3fc* z=Q_24uJ^NepFV`PTOa6pKa2ON9k2r%+&|zBt>%Vy`SSgw;Bszo%LLHynh9Xxz3>Ob z1^qE?|G;p0=@4T9HW8b$aZJgK6CfTMct+j(2ki2c;8b)QW7=-i{sE)B<01V4VK}l2 zChZ?E%1Z*M>Fm?A{R6}0skcBGJlN#**vV;8-h(zjpbekrG?aq5T8n1uV2^bIG7W6Q}ut@mLoi7Nr~l(tN>q ztP7BCv_rsM>%k`hG@j22pc|b~u!&CsNN83Tz_#_gH4dx`&=#l13pnf?SQnrz&pQMh z9Jmv};&~{*v;$)*6arX04+Szzn_LKB@w`s}f9Qk&9?yFOV18D862Rj5tUzW5Mi?F; zfW`Agf%8nUE`Y`J9sy$pA0dFn^Bw_XhF>9o#q&_185fLkK!gC60V=fcq;wPD6R_~U zVlJS13)}?Q?;BJRFt`5qCSc+BjJSY>-!t+HSh)ojnyhBE+SB#w9s}jtL7oaA3l{48 z1!rF0eE=I8nSd)S*_b>PFn`g?=0`k)#gN*CjxG-+(P#vW?9oLHjN7>i6j1 zKWXur@ooY1{Q~Fy1ANuXGHq-=K+7-qDB@Sh5?o-#vur*<%P)8$z>MeFe1MW)^2f(; zX9zHg0L&ODKAr9C;3)}?E z>xQ!*f-SVbhZk_O16vc|m|}PD7toRzjhxExJza1j{uLwVwJ!P#lzOLW9Ap5pL|81rL!;)BWAY2r(C#Nbh&gMk?H zV|ntE(fw)17bt{R@Tt(nLX7#bJo(Y={`7LeYjy!TbxZ)}$MWQN%lp&pg5GeTV~>75 zV$6@_$?uj|ZGoGBi`)Hr=_n=Y3e39|#`}mdKb9x{enIUP_~-&|cA%Dks)JGW;kdd( zQr#u1@03<|%c}<_)kCwkc5u1@0cC|CC@h_-3&4jCAIilAh;9enay0=L!vltCaRF$0 z(KIhE00$o&oE8^=!!Hiciwi&p1Ra#c1qc@mT(p%0ycPnU@ITiOa4|#>C#)vm(gF}C ztS_L}E!cp7Mia1BH|&2b&KImM;Nw06H#<=I7E~OJst?E29g^xUS#_thx?5g7FsUD! e)ecT;3-}*T3zK8@kp>_D0000#K|xVbQCV48EiEm;z`(#r%isV200DGTPE!Ct=GbNc007T=R9JLG zWpiV4X>fFDZ*Bkpc$}4!K?}kl7>3XKD`dN7qR zlo&>Xmsd5u9KZ+w!>9%LEhR@(*N~q%kLVQ%g{7FaPOn+A1R-ul4G4ehbdVg=GaLX}bFTt)CwB2`YRn z8)yIk1R6<1K~#90?U})D;~)@*{RoQ>>9s~mdyZ1|1(KEaT*VKN?qSdEGwg$}o!}b( z82=>0q;A(ERl-318Nx9CKw%pzo4*3AsjKWrJ(?-2r@>g@)|@T) zva{s?yq?Aoc4)@%kOQz<#R1172N)9vv@>AK<6CTs?p9TX5tNU=w~b+kw(j{o1E5)E z+kIo$p{?7t%Pa%n>1SQn*rBO9>=FRn51J13c!&D*1=11F4yu4WjyAE5Q%1o3;4`P_ z1^~GqFeB@nzd-#9=M6~k6Alpi2?yL_iX@vMHR*Pq0uTixYSNIJ0Fa3S4iL&34iE~n z1b|Fha)3}Ae?Fj$14irT2Qbq=at2SfWqg^A)Xxu~K1Ew+sr47z-dSq>#a25@t-si; zv()+pumBVQG|!cOfH;Nv4*)FBo&N~t4xrn))DLJtl8%6eR4IUp0{M?jWR2Vp7+~&G zM8&Z>pqvI&3_v}(ng*0&fO($+JZ6Y!b_$Si1Hu7sall;$fHA8$;K=nq1vLB7-x%Om zg8rv~c1w)`QuIFsv_T=(Aw~Zu{K%xk0$2c_4^V%>0$2e00O@v4O&XA>Nkb|%sVJZ( zl{ElG6L?mQ_v0%(_wKz)jC05Atwrr7QkT?c2ui=7!V0&EXPzyRVYnit?2 zKcE1qAIxHkM4KH0h_~wmfGptfDH4WE4iE-?3XsYc3Xlpf4iHL53h2M@I`OLy0I`j4 zz!wGps0hTnIsnzYfnO1S)RAZGKgRGZqN9P{e$cP)qD*R1p^E|WB(vKXqT+7 z=GPDtF+}1s_Q&^~Dtsl0L6-rrKfcdZ^p1hT2X#=Oi=YDEcdHS62Y~VZ!C!Wm4+QxE zRN(u*(G)FyKt`YpP~Gg*w`=u)qaHHVgTA_KQ5RnN((%iyYfKn0p(v!L4#1=hlR7Z~ z(@soFvjIBSz{FY%z|_Ew$?w-yF9U40Y?Mk7H;ZNoaWOriQ~v^^C^9jRjYV5&J})r?|1FKPeFUv-Zzil z`s>Dt;y3LfR$o`$306I-`u14atO#XS>B|dc-%n2DNuJZz{rJnf;1km)d`{jvA!+)r z#9s@R-uV7d;{D^w7~?wzcZ}{B?n(P$eAxDIyu>|+nJd-=g!8su4T$7jdNm;0xt8a# zd4N9mW#Ev~)@Kd&=-uJxHn*HtnJ{rjJzkZ+iS6ZU~8N1y43XP51ez4zqB6IfO zMYE90GFh{jOXuZfyk3>@epSLHwsQAXTYft4zj6P>`Jygahv4!V%U@@jJ}cO(YyZbC z=t+=Yadhodqd(=Vmqz7>+kfAYFVFEvwc+(m7X}7qeoq(2kcv5P?*!&8HV|n|%xBb; zUa`Bmgn6aO@A%6qFB{$@KWP=Gdv(^4g{3iSO`jw$>1EoeSQ>hdKE3v6+qT;IOgWW%x9(a0SGM45{q@hx>-IAR#29T) zxx7&&_~rT-`4x9eGNU(F-hH)R$B*&M+zC88^cURx7O{p6Zg7EBgP&40!}S^E&ypCP zvt$_FrJqB%4b!Zzf3z95ipAL8=iD%T55tb6O~MKJRt(RXcQ98mWFrN` z(T2jyuii4;OuqGVejMW*!3~w4Z`s~?#}K{!{oBWXUnXpu_kPX)?4Rt9#3re!Z+Tt0 zSuTK4r42|KpMN>C?>fi|1SH?f$ZC)sd>2Yw`_`ju%aye!fP|_R*i) zF8gD;BKoKQgWJzAhpFJl5|IP>>@u-)zRkoGj}%tARr?%rBSaY<}t%*2~JAj#_=H_#LT`CaPT=&}l%<0-SfcC1SVr8rkgRx)A z54U4C&kuKudcw3K*-S?#Va^Dqleo)h4aQm|5`kM2Ve%46s-Wp=@+Ad*n&kC0J)6ub z>T7MCOh4bgj!Ao38sqTp%GA5hMhUe>;dJa0pI=7ge=Iv<+YP-N$^G#&bTWUvmi-;6 zE@=x66~u~VxN#jMM6F^pZw&|4<4@S|=e}0a;z z08o9dt)^@eV7-yKUdq)On9nBdTMoI_v8R1i{kEc3+Kt`2-_FZJE>HrWQvxZ@Ker4+ zENxAOdx5+Kh|iud+Q6@deS5FukvE!aZg^!~Yy5(Mq2r^J8+yodNZHyhGIFag7d%VOL_AH2|7W zM-Gz|+Z*73ur0tBV&ecqlC2ZLU$W}T3iu?>=d=Ow7lzI zYK1uHO77^h4n$e$EAw&7!b5hd4%C`J!~wgwugUZ}s#HqaX9%Y*07-OVVs8zg#L<6) zv_0v)fiFfJ;5+Jn0>!_=x6bl-wj)XRM=(Voo6+6&rS4ed**x2XHr7(n*J)>-!`;O_ zR9WceE;|JYxH+Z_5$d^;6+BK0Hcb+0w$%cicMf@)=NlJiK;vZI+;=MN zcC$2eyQLQ*whqgLdoH&`B(5Lz>casrQK>rVhoqLROxc6Qn6_v(cS*Tcxu0T79WYXz z@7s?hATX;s~)2%xxaByNZrAn}!GP z{2WBH@wi80PKc+mn(0{wquHt@q;ALFo6{j%jSnV;@6SO=XM0tSc27|{SNhyJ652n* z^FO~q1by#wo3_kwJG+wM*X6eHdfIo%~NDnKVuqgYo}zjIZurIs#sq<*`yc3%eewFmF+PLTA|`F)*Wv2k-h^vKnH zQzP}VQO)eT;|%(c`E+lCYZ4N2+Un&6&p#a7JVMH24Ve!f!ARo; zg}XoPck?jnUFyzXcV7mGNH0e;t5GK!9ZAqhGuT|ca{V(eZTFIG%DWHRl+K!q7tXJ6 zzNDaWa2$J^ylyKL5t4#EoicDamDw&v1QEjEtW{$)g3(Bje&LL3F#DN%1u;{*84-9e zETt6l;e~-p&}}y<&!!{k8n0y=eNUn58jz%sT1P&B*1*R~ zGhgTqXd)mdGbRKuPuA468Qel| zPkr>!OtZz6O@~&~w;>v;f;#>17b;9asTLV4h!JQBeEx~Wdb972=}I3TDg6^>CGz=~ zr;V(AgV$&3=9ac{+xGT{%*&$C`46Y3){z$mSm+`){ zPg#=YTc*eM^2|x^{8*~B6D}r~^L#AlQNl%Yoi-1%s<{~5R93`M&z(OLI*0%{@e%pC zxG1!LQS&{v;QTRpuuffPzjNo#X$lD8yNWI86tNs#4R7!N5vi3C`HO9(cH;wXuk-D# zP0VtZpH-Zx25H}X=4sFx!W}MYtRRwv{f>!x$TMB@IbdU>dg9;P7RMezm>q~LXEXMDGfUHK|877fVgEdT%2R4sbo*~nqp#7j5N za~$`@D|^;PN@PW=d%6Xm&#yrFCX@SNeVGIwg3i!RimfBvsiN)=%``Es`1fX6HB>g< zfd}n5SbWz{=Ss1DU7c{ZeH9~08*8(W?2H?yu;I`;D)C-s<&m`g{XTlD79A=_L$yFJ z$uJr0K5S&?Nq@X5m2KyHcE=1aTNEV(U9%UXEjf%H1k8tU1QdCnYN z%=xseiEya1?;R`RSDPN^D*J@BRf=rNF8WXIEDoG*>Q2A9)FJ0}0mom#)1b zkMHbfK7^dJ(GigMeU^Gb>SYQAYg$TOAMJ+!_hcS}gmr5)iJ92jX71%)DihOR)`caB z+86olG^l2W4}YINRxnz`D~VNA$y#f+ zhPs45ULeYuY@zl%O6VHnuS87!z4iR08ew{jTUFw(jMhIm;XqzBnR7wvTrXL*m;r65|uhF77>g+-oIc zX7ej;??Ptxgz0U7)1u+OFzj2XA!Iy~RD zU%j$)s%&De%x~oknmB3WJ>dDKHMdbD1uh8=p~W#A=UmLFBNPUkcQQm=b*Flu67-&P zztkAct{X3H2ARTT?PYcqW#+99n#(JgVfD9yN>?-Iy2{{R_YPB;*OE_Ha1aBm{$<|f zi9Ng?V4e6(%n%FBBLHEw`Vnu&h_83?Ydl{F!-tFqTRs4$tb}|6V>qWFSg8vd&ql(} zM5i@u&iDgn!-jvdtA1pvIagG@MZEYCVG=JUiUT5vy&pT z37xDzwmLp*!Wcb*KwL}}VgrLxf0O5CIHtj4jy2Uok4vF0U?J0AR&)svscU#abkUjo zx3hpox^0>DwlLmMQRjVoxxdIAv7?dxrSt7Z!(4l$oad!>U^62%iCo9^vK`43Vu3=% z5BvngCO8yz40+FQ3S3*tF=$V9aMcAjTbHlmoiFJk%)sTP#VUy9Hl@2amHE75H}xJ1 zhBMp}@R|=7n|E?4UpXs^6$vht7D@kzQFFCUE)-VSv0L5Jx$ZQGT3N`=ztei(Q&eVq1xn=fWu6Q`wmZF~Gj1ChA5bsx$W(DuC^`jIS*jrrpOe z$UwQ9UW=lWM8rY{x+-piSNWQ z2nF9~pL^D_V7&Bw6&x3xQI#g~2s|?qq;2s}`nC_FtGX+gh@XpgHv~u}g&k1CIOlxZ zo=d=mb7E(Q+e!OpdlMG0X2|!&7zl-R>`zF*T7UKkq}p^XMTZ8>NPV0V48X$xwZT z&AhstnEzuh7oFuq=)Ovn6?tvO2?DMdQ$-ss-4(&wf+@LQ&f3z^ zD~r0)`IHYFz`eT`SQrU3V?mosss2B)^GIzmk;oo$HlmZ7rIW@hePg=~=>-@rVA6S| zl7NIylw5%4Fx9N~U9NK0WHzW$ZJmS~2@dEbe}gBXPh>_g2^~jd{%X$)$E?k?YR$a1 zYo5}dENU!v?|S3GYN`gid+b06&gDU>hQwtfo?ebB7r|GH89cYn(cc2+2`~ie`Y0@B zd*8f{8)Qn^O|6*g!5`@%Qh)wgy(f&rHV(KZ4J0zWHWzorDGwTC!S)wEvAWo*HX?Jy zP%(K?%`zkz`uK{C#a*{L_)6DAWaX_~41=n~`5)xVH-+Re_^}lmEOY4_(8G;?@w>WE z*)q`T9B8+L%RtI2GPV3&vk^NNU^f??eFiX?EJlP7J~kBYc7GEeS94|8>JWBI+$WnT zwSYPAnj18`-(UL+!KTf7hNNH~3n2CLt+6Ys`b(9cWDV zuRmL`jW7*m?sGf$S(m5wqmxJ|SM z&}>)l7alFxUYdPi?$>N0>tc|S0o^U2FpZHxRG@S{Al0qCc(WpyVjf?z8!bW5;`90R z0umrGOs$J?S)^D~to5S$a|v0D&HFh>0RD!eX~$J&Ilen{ce8lFEQzJ;SaBL zU38@pQAJs6o9;bU8hN_Q`CI(pj)xMmk%~N z_h7WNdiN~~>SrQ}U+7lTM#J7P<54=vX2jE#=+FD9-&f<}-HH#RODo~+7B3w{=f`=YLAojc^qy}@<%_H42g z-|0ju^~sU4dZno7)TMT2zES1_#)KYkCx#TyCeX35`g6(G)MTB!DpIw-6T!*WgG-bhN{xWvCzDuQyANsizN~6%U=B4G-qupzpgB zbuf%sMV^awrCtF!jXEB%FAsYb%bOF=UQ z;HFz;3=e(itrRks**4nMWxOyEgYLE&@K5U*v|+ zm$N?|JY<}J;*p;SjeAFjouo%0+?-xj_ULZ+yd+UP_Gm0pXaE5$FlcpVS9-<;QR>qL ziP2D}69YZIkELXaU=oa)R-D%k&8C80$D*Q4C2y2XP>H6W#szQ{KZ1J1xUt}!zjJ*QB(s{r2~tTsPdywkQtm_$dvKb% z?(w#Sz2 zo48i7#6b$4D7oJ+jH@vWOH^Q`7}HfY<0^zUq5@PfcH*ncckG%hctdTI*9Lr++sW-L z%rQ@SPg~wTEMv>WI!IkPaDJOw;-M--hTToVaVK*72RoG7=yf)97^sUVB>3vyZU|cH zns?;FhkE@Ctd>#AcSE=@SX#*y4KWy3BeY4SkTBcsi>ad3uu?-%UX9P%&^&6}borViBu)G&%U-Zb6O_@#|j20={2sog4W)0NJwi@%6>4ScY2JOUBSU zl~_nqt{TaBh14-zB*&#RgpAOAxHEBBSWeBLqVN~NdFa9NWbF_K{0OpWkMI)RPwkTU z(|kO~MY^eOR*IoPJ0XLy19pJMZ`JA38;uU5^Lo7OaqT`XJZ@3OoSbejoE~EQJP@({ z(|z-dBH>p|zGM9trZ|Ly$?9BruJMIxP}9#kxa%t4hc_M2eqCXP_!MIi*O;aMwAfJ{EkKZ8&sEki zjgpe)A$e`#H(uR(>_o6S5Y5Lzs}Uax5BwGBc*U;TU0AKzwx`Q@{IcY8H(&4<;zPuu z-!Nu?6Tf$4}9 z^zDA4_Aj1hXFWOvzvUZ;JzSGh=4wZuSu{brQrgKXH6!9xYk z{1Iq1DRnO4{!@}4WOn!PKJXspGrxB~1YfHyUS(CYt(9+f5vH49e*S9DTZ#6n1dvS_ z*Y?CrQFnF9Pw0(*+|~?0m=_AK8OuP^|QHaM_zUqBiNcjX~5+qETqsP|yi0CLuR= z9Qb7?SG;@?tFOMlv7~c58NP;aBhkAdrf8_)((f5syxMrqhmn~KHa;dqHg#UF0ZQui zXYFg+H>&@6UTmqqoAJeI{EU_$z2^(TH>p6M&6LMFgxMxjjWO0u{%|;LAq;NcP z0^vP@7I`n|{HVlJ~#)pH$7tk?i<){feZ+wZ$lMofthNySLgsUayu z*aPI57Bh^x{QX(N15NTciN|iWi>K^|{qAxU46VFXK&mB3A3vDIUgd2xcQeXK$)IP+ zlBV#ytmCdRC(gK%`9dU&RI78YqeK1-9j?67+Qv_wz;Ai;7%C&wZrQCbzftl&b$2@z zRiL@C;MpjOr<#o^AM$-_N=+pi!=|%vaz)aw?vgI%d-4z8p(KlE^04-en{qVL)gH2%4Ko0*c)Ep!M9^V*=>IQv!tKQ z6Vc&*^8AAa)ZM=HxagYuA?jn;4H&pe!SY7WpmNu_8!m9cCr$T;lq=VL#tf$45sQA- z`h6lyNt2f%U*=z{y!IewDGc*r5kFT4c>{7Kd2{xtFDrDnWubFIu0pH0EI~eKbMoT>O~{|aKe>c`H?l<{ZX{E z`({PG5CMBtD+1m%(Nq!qnBWNEvCbPOecoHPAdK=c5I=A^a{LE}uyGI?=Eu8FlyXS{ zxk&N*Q^ezC8R`@TtK(zs2eoziF@St~3Q4W+G z;4d%gE&h4z;rO6Wel(d#At0OPNSVlz>TQV>O1gz0+p=W$FPG>}#)ssWEvL10~+OPDB{%N=g<=>JH%K{ed4ZPQ!wgUZW`|n+gW&>QTEN2pGR;}H3DVJ z7kGK|hU?W|0t%}4qsETW22Bf$;OW?52|)Z?ZpH?%ebj?Qu}#?1@7yx*#qaYa>$q4n zRaa4E!uz8_HtVONEhQ=#2*rsFs)vzqD0LWU_7CbHPoRC!>gsFs zNZ-BSPnJICeuHEPg?3?H#ZIIn@h|jAU-OW=sy*q0Gg%a89Y;+#Yv~X&`0x|4Uy=nF z*s1BvQ>E(aNnse>$xllu?Vqi$EJ3r;mkkaoh%`%S;&+diFH9HaYWlB=W`BE`CnR$P zW^uoB?++;{1211PMie{#1kNHv_i@MUx`<~y5tbjkIstH_q2Ixwha_g%_qDXX_7lC_n1jpRytZy71XzFwS9GHdrK zJnKI8(pk;fuzVB=^1O{K*g;9`?`OS**<72e8CsYl-}PGE-m3B@Docgc*mvd0{~r+L zec6C9=-X4?k=u!3 zlkON=!Wv+ku4jbQ=G}LTTPD~~0IzIcrp+&Z>komEAWy)uw?v{i)#I3-KYt6zi(*fAae%JHmK| z^#jQnuOR-QmrOaQ3-P+jMg5{uUkM#`tL~bB24-=+n*m@0VQU{#ih_Pr>#_m&8DNS1 zFHMuW#scp(xah&)$?s%hwlDNw&%W-k1w4`dY()US4_A7$8(*!K zdOy=nrZ($sc@idx9$j?acx~&`DWUW~#2}Laq~0dDtaoqXx;xuwYg7aHK3Yqi~J+oh$}Z}0K`z5t_CI(D{=o_enpDUUHmT%6j0v+aNL1Qj-()*B4O|J}WN@--K&xZH46zF{Dot%irSV+^MoYd>F&@paD_y4Vuxn z_xsR*^r=6$mbIHHRV5a8dlSQ^{xF$|&jj1oUbc4k2tSMg=byIlHl|h88_4b!h>QpiDO&QcY3z2os{EDm2B6Hzt2h$`Bz(a~BFZQ-4?<0X-6kTEm3`_7XG5+AD-HnSMpDKfb7evoT`&# z8~WQNt>HEA^@om)(uVAt$tkd({{gfAyG@Y`Q>B4ve@In-Dfbn_+jJU|6rpp-&DSX~H~tVt<1Pdi%qH!rK+| z*?-$o?r_B?7bNGi$wuLRYEE2Snm7|Qg*fi7B9`Wy|3Njx`YpFM=Z6mv#moFh zQ#kl7YLfA~{|vS)w4@S=GS@)h6su+qQb&*VBR;o_9}LVU?TVitG6nQsoelj7eD73g z{wo{rjXcLs7{W_Z`Vo}4JUs4|VD_JhX{el9Au0t%kEDqU9~ryzbbO-Lj*0;BX)pFF z!c!3i@QoLr7O+$Xqxv1*2;u4e_psdW>Uf68m4_C z>X`l40y3m2KDvz6uFZ8siF--Ce4-@0EBMRh%p0LRq%2m_)BTh4+uC=tcb|FEyM2i& zK=ys?7Rfu4vs)AWN&-u}xkTSXBW*Dgkx2;0--mH{|T862sY2BwckC&cFW& z6{cCn=WpDy5-wT$o&wQ2Sa6}C)9VIkF$BGfEx&^M@-E+}6dby54DqAD{lX}r#NVJ` znAT6uQ#9}KRGb!M;PPyt@ZgmC>ZbEfSeW2AvNjw`yq52TU<%z>1FQ%lYeHmBeR*5# zFE+Vu=C!_H4+Gm~h3<4%T?}1wd9ih407I+a^3crwukfCJ+pEzV_u}P=+igEiYciYg z;j$j&74__aWx<$Xp6RO7{=&?9TF^+z_s8T8K1ADPJi?rz4<&g%+#e%0?@>Zemqh*F zoV&3nG|pqx1UcIt&~!KCWsl?rtw`2bpX`u50WS)fg)8}Xr_&DaPaYe~xFLI^XpcS^ z^8UOyp};}>V2Fw~p3`3UYp#B1CV*8H=LoL3yxG#nE;qpTY@l!6?`i*0+Tgp}`wOHK zVKcum(qXN4EE|Hb-l6&CoB1{FQQ%n|iZu9(H(+Fc5a`J=ThE{%QA_TBw8LEINF2h0 zpfv8DrP%oH5bf=8`qVMunsS;TxvrE2t;$Us>ei$t+k5l?Z3 zocv)=ajO;C4LKuG(H+N0RtE3UpvXPpyt}iwmE|%_)|u4DiMM`SM@)ufN=%fbm{X#R z^R6GztQ00YP+=S7;`Q!K`Bkph#J$|zhVh4)$Xey>-L2*bt@$rvnIzvQJ7CrcI{vd| zJn&;-Z-AgqZ^pRKSFP{j=YMcq{sfcDF361J)+LdJG6sZh@f2eAZ!^O15#M92Z&$IN zbKR_WI~XnOQdJKf2w#ZbH$Guz-h7|185Isc$jany4y#G}tPF9l3!#efUY{>NM+_ycx9KZBjDeSScsGd>jwS<_ z=erKp=@jY7+cPFyEzJhcLpH(&CxAx6Tk8s|jog*%Xa3A7-JrXUwsO62iY3N1d*f%! z*Xnm4>hQSAwcjs6c4^3&S?tqsB0J;kZ?1+b;t6hdt3n}R5@b(0pRA!#64-9n(GvZY zdPV10fO=Qy$01{Wg=8fBXKT0Ls`dUO{K{4uWyT|Do(qGmkVSePCV+*PwP7Ry`&Q6T z^pY{D|KV}=%>~3gLNz}*nur&l?Gbb9gxENcj58=RE<_p2&a_Ia<|i`9$7lNRDO5k3 zei}4v`Oq0#gEWs4{BfUx`xK8eBd;E{-M>v1qGf2NZ$$i|1ZLz>B^O-91zedFP(|`EBylk|Yes{#)q9*Rrb)9EV1__H@jF(k0BnsyX@p8c0i)89syTpnK>V3X- z;cV(o-|xv7vit9_23u1M`|#ldp(Pv>c(&t5IosGNw9QRBbN;^49W)bmuY;wj_nolw zefFb^-C_beoEfm$W$RF1&xXs-%TzFD>&l4??vv&Xhldj-i1&{WS4RkNchdK|736iG zS-U*V-7jyM^?`Te$XM=H7Fxf_x2=0dGkSS7(S2%r_h?`)5Wi?4-EbD_6Og5Na`-$V zj!OpHbm8@L@jJy9;D?SEB3z^B<UW3_K!D z?~0-n@e8Iek9Eom4=%FdqQ#R-?qmO`U6dw=@Xu~k_El4mA72_p@Ue+u`;Tk2V;*@) znFL@sRa)dNsg6kP=q}nposa%Xw7d!$aKoZH%cma8yCWvI4~7B_RH7YGK!oe z_LcZ@of!*0Eg|r)=O9+Kl`hAvcfY%sPs>+&)%wPp<=COo)toY7sdkO!2TRTSwaMT1 z!cQG3TRY98?osq^V4(Y=!@xYsI76Chy6%-3eKX)6Fo`d6r&Qsk%X=ZzGx(6*t#QVJ=Rmu@k1G-jZgKu1LIW`NkYsn({YJ{qI~i3$jHmn}u|V z{0(Eo&M$MG{XVR%&E46nclkgV;DKn3grqe{ye_^0ts;_jSziw=q46m{3|gg3Nu@FXh-KEb@jM28k6V`g9z@$D&X7Cd zN0V}eC^s&9#-E}e-LlO?CIpU7 zgz0ZGu-<`!CJ|>rLIRpu_&XpDF06O-5*6<1xHkW|le5d{W zt}->AB_hLpZdD%R!6TS%yaHb1U0Ytr*x#j1*Fj{gJVEOWL+_z@9#0oMyLfQNu59pi z{bqyr&V)YH6&F6p=*C7G&=tLp18(00P+g?n23=D@1qEGCHB%_RW=46D-%?~pgYDSU z!s(vrm1K0+P@S}O51Hb~adr>=wFPETwRQBx z9MxClWd>3jf~4aSi$PyN289RB)?xyGtaKS{t04*O^jb@=fuW_w(rayHpo3$pVbEGC zCRMhs|82|pf}n>%mJTW`xYWXfh&3g$+_Z`n3dgTbSI>*&LLuQ?YX}y+It-RT$j6vS zWnR;p2D+5#YnXxdl^a8fUD(wzkaewMkfhrT#O5-=ZiI|vXZE*z!Tl#U0W3{7zXocf zQItEiwyd`8!=nW|0{@Cr`tV1oa9Q48(dJRdk5bC+Q9Nf;TYgZOWxDF+*(K}+mk+rN z(-X9+%+xLN;1&6GQL-s1Drqzdue+{N>2w2@{r~ z+SXQLd7ov{|HUbQN<@e1z_p|ZeYht;Kj4I=)~Dk}3PqzMo)&5R$LCUT+A9L&4Uoed z>F&?r24l|u+lLzSZlzxHM?J-MhxGsr0JK+jiZyHEkT`le>~YCUktDN==&b7o>Q@XD zfpU`%iY;E5Du4X8Egl%DI(aTxlOEiz2_tJx_BZQjm1F|=8LQ{T!R0jgaEbJBVn2$s zgtK;b7fj(MXx$6C+^-L0{1D7oU?TH2_THRg`3IfoH>F4E!P6OBD-}zD=%KP7+}zZ2 zwigdJQ>*+v9HDD$wCF4!rG8 zCF>d}qyx9*kMq}f)`ABQ;yPGa%yZoTQKXCw$)qeO{Sl;K$byv1t&H@w4d=Jy%cA^4-6-ExO&CI78;ZD) zH+jLHwBF11gUZsAGpzvg8G(Gi@wd=RSa9hJ@4!3`3?PL3{dqn zUP0;urRoXUx}>Zuin}5&DLOVTkg-kpEf<5&CguPBuDz=^{?j6Pu4JK4takIFAb@K4 zIUq>V)j!*3k*}=Ec~@gzfYZe$F)F`By>O>q1cdrqkrIqTu%rSfIKp)dJfcLbRyncn z(7HaU_os?BY!Y9+$z$g+lFDct>U*Oka9B?iNlz~&rIsO1ez%xZN>iYOe4Msr+N@C`lS+Bq>M*FK&+Qw^y#fX5T4Vwrb8AO*Z)u;a; zj|bVv=O)%-&I+rDFpI;Khr4>sSW%8<{zq-lcJM2olVejHyv5i!4ozc8EO5oX=o8e z;g!rhGpZwdkR~`}oEq{gWQi=d+hi|uqhhtPhiPC=-!|1vzmkh07EBE&Ud!*_8p2<& zTM;!JC*g8H@6$>%`QJ^@II$x{1$_abWUeqH%bk9kFjKmL%r%iNS^+@dr`vPaPs}^` z*+gz`$_99NPBlFa>U@AV1PWQehIa%GB2%e(G-iD@kAtdrI#R>E^3L`I1=x`>iR3d1 zE(B{uZ-{-e^x_B%)L9sHM zDNwnwfuXFj6b9b*ikCJOk+i&N%tNmyD5}s{O4fn^rRN51@X6kPSP0-=33U8IkqhEw zpf+Y1c`g^!oY17NCx8{3onb-Z7hWFYqB*EMl~C_ky_zD?gL(^Z<`sOq@+H)w*7|;K zyR~*Ilj#UzADT?`eTulTK`Ot_119`Ama}@gsKT!orf=m95X# z5w}8n(}|s1B)AuNB^MKi(ds21O|a%u>6F?oVlH>;$S@P&79AAe%V;iCACR?b-a*$lpu}2N!&E3iw^CxjI zR)*YV>lFKa(hQR5von}#J^pr;!M=1DD)|-PnWu}GgylcsI`H2h$%{`OmkmJ$$^=zOu7>M}@Utg88okzdwr-Z?JO7k3NPUEA z{RLBJd5M0cjhWmSBca=<2%*KFdSjIb`(eZg8%Nr*uB*)SV%NbBPm7rna8=OtcGMxs z?1CAmlgxIbYP1_+GlHQiiVE^R9IaFgT5qn3rXv?=5RgHo$>=VBKa``-Rg>&LxXsM5 z_o-~pxVBd~b4`yEeGTrSrBtUU(}Dyz6e*huiVAxptuPMjs5i!8h0(L6P(0cVodweR zidlng$lJ>}!G5533*Xwju5cYV?VvfA@gsZ0^B0w24J)}c23%b;I%xXk-@^IxWCq<< znKcN*e!f}p^LZbZvfp5_bEo|C*I{1L%G)~&b_UT>0# zuPnG?UReUVPck*+tyj5|8w$}9Vo4X0J9_n{_Z?Ogapq{KS#=XD(wIcWHJ-9r81>N* zGmf-paYwzu4~P&Z0e6z!5}XjL%ii$W|R%$9Rkw@o&Z z5igMUj{4}ili_QE6GjgcC|qaugZI`SYp;9T#HFnW$A9}{+C2Og78<`yiVK+Ro2>&-IUg<+3B4Nk2-@szD^`7 zU6PGr|AP)@dSz4WF+OhH^BWl0diGtKy8^QQhsIIZJdV`>$uC&+Y{tsK%t@y8^5UrQ zSVr0-g6gl!I>m`Z(|dL5Bie|c#6CsEYZe(8{8by;C}lyNHO~y*AZu$Wu4K!O>rfhGPjO7#{+-u*NcSg4-7?Xh>2}`RlsX0*vRVaE?z=Pk`7kgP!OHtij)XFMtZgXk_>E0* z=cjN|c{X4C?;lmHLCTpF0e7n^`}q$QsG2cd@%(5iWZ@C#J|B9Az^z-{Qn(M)z2&b8BuB7mq1JvrH z2StQNYcusBsLyg~$H5@ckR;?56IB2saWM=MrC%H>0+5u8xYxdZe(;kkvdt%3v8`9q zMw|2Df)B~F#!7}#i#Y#!Ti{1RyM237cnTOjF;%i@9HJSDccygzXvyyQG|pU=Y?WF*3~EG_sSH{t z4nl{A<9zwiNRN&s?0LQk;P&QiSb#n|-Fk@l&2PdzgD3C!^J8_pQbbj?$L`(2Qo*+w z1eUrlkAL<{*sB++JJS!Poh2USa0-%|+6f4kDn{1p7Ne_`3(qn$rxB|xrR2jty=`Ab zwm%e^pd3AsOsLB$T~X1`6wsJFyN6HGsgTBcQ9t4qY>j!s1Q&Uxj5G1nI3al#(dI_;as1v}#Y0-?p_i0PwUT|SGPhUtemTa@1qV(mqI zc$vV3O6EH0mm-hT&9t^?1X9n>`GBF(B;Sj!Di9gFVu>rA{a&Grup8-_JB$bzfAMJT-bFb@67mj||AmBp;7eVRjyDgWh-; z;d=T-&(ev+BW_sd3<-O6{6iG}xu{xOd2ZzcasG71{of`3@WF-r4q>ha&UV2p(y{$c zIiK8yIG(ibkC9t3dnJxrLy}F99To-M6g94Ri?2UKhzvtkGswE&2XM}c_V}%D!*EWo zPYlLBt4MqsrxpIF3*ka4Y@#=xAfgB!T4TTZBI5E8W9K|bR(SL%(0N~f&TMD}31ygW zB*l#b+n)m>`5Jr}!?61b0PiZ(ls`IQ#Ush3UWGefHaY)31T;t0Mj!S2|2PKpV45L~ z^cC6tYvKj;_?PsAui~XoG}<r|P$M)W(%d?%`EmE`T4-Kwq9y5@I*7jlVrJd&abNXP7b;mHX zvRtwUk>SIpZ_N6Z2MNMz2J9pB1Qh0n+z%;SFCB`>?GG2g9AQf{c&MVBx%sFeo zzIl2g#Sbc_SRsb2oQg4;0Y%9FKcMkosZDWmV43ln7uZ9P-u>3Ko^IKL?rRPXBbmRQ zTO1u64xw`Vfc~<44GNXz(T^O?VK7S#0MYpr94B89usLj2G&7%b3Lv6>fbc9wr$<1Z z_P-<^Q)M43h-7`+Urpav$^-z@(}8PQGcBAgo}B^q#H=svc1^gucMe^2)p$7=zJcaz zy$-DZo%C0w$({-10xRT(2IW^U#2a8|1&d4FHsR(;0IVz0tn{P;9UXSbL?L-LY(5nu zoOx$Nli4VBdx%EO3v;$--~8c&Jo!9KA;`(}W^iAa1`vM$i#mBQ`{6!1lqU=>6L^Vy z2+t4@H+J{|q?IYMEyig7<7Dtg7zir8&oAFV|Dj>6qge@Dx&h zN9`0DfSNl?>vRqW-2;yy-4WJ>tW9n?qUV7}6b7umvY+o2GU=W-R&=q^Eu$M`3*DBv z^JSIuIK7hx)1gd(w?F6(V|VJ5cy!bq<}yfgc6NXZR)Cyo#wmDa*(*!`Q}*rThLyr|#{!_ql)kp5Obv-_Q1azrSamx#eJIEhBY6 z3I>D8oIYjg2!m}?gr4ujz)8fTB`SFBajEn*d~D zVaP>7P%~cf79EsL0?|V^{{VBdj{_HzN}mwC6hD6stZ&4s9G6g5BrX$9#`yh z4Qpegj@(B&uhcYYm>bRVEuQaJD+UrvzUl93 zv%TdmGgD&Y*Wb{Q8o%)jpVcN32vd$b;M26$ZDV%l_fp%`oIkDftGAucv9GSBWE7bk zofKYZ3rbL{w_$LB{^3mJz=`Eb!G{z<9ArXkKrqbfoH9FflXo)cix0-G%m80 zCUbYwKSBYd<&iQYSZ0KU76fSyG-(oYbz)K!bTvWE89h13Wsd8zW>X=PgMEy%KYSVz z*{`k|a%zy#*CBh*bR)9L<=w5P>A5Q6nb}t75(@j>Ivr%=TPKqQ`;>b%&~&g#xVWkx zTDt0l+hdU0;>9rYq43ZUD1m;HSoqQzT6QVqSh7Z^3VlI#K7CB$+FOhvcvMv)1IO`I2cM*TBZ9+GEv>n!2Nt z?7?IA+kApo*`_%ewHLXBnJdwsF#5;b7ti;^^@SaeAZ#yFQl1vXR7a7O#d+F>w?|z= z6x%9>^_I$moWYcLD}e=c^Y^N3CGfKum0+5G=!oHiVKFWp4kWMDf%ytnpMI)33VF5b z0Jzu%xENl0zRnTAFyaE#`$#b0o6>@TGC!z`rup&@{?uaM!`6EEU{pmFXi~(y2$<}l zrjB-sE0~$JuK4N}Go5>u{;_?nO#+Irl_d#ep%^eEtLDqSyC7cN1cq6%+aMK#$c$Mj zr_G%K09mhbOe`x6sPB*e9H&#EVF|mk)z!UH16uobsusxc)1M(x!TvMPH}{ zjgE1=URY4zo<-)*z!yPsl3v&X?kg?_Vh@STor>tRHg&5lV8Ye@M{#iHE5u?si99zoV($6q|G0^olA9e~{bV2<8 zS{09;tr#u~GV?ro<>_Rx-)E{wmx*h<2+A3`VH%3yH<9>N`P*{(7rvfH(D8Jho7m`n zg4=p1Lhs<#IMe27c(_EAmkDW}7OwIkR-nU3*Q<0v-E54Wm;{i7RGY*x#GR}5gRx1!_nO*(|6;JyR(6(@lU{NE0>^zPF8}}l literal 1565 zcmZvcdpOg39LL9`IOUeh%5iBDj!LezGncF_Ry!z49a;=6)Lf<=Y_y`xgF=#+DN&u~ zx+R>ksivedB8-Gdl%E|VlS`amb)M(+$NA&?{d`{U&-?Q{pYQkkJl|9=54Uxy8&x3? z$U3Y$`XCrvzAhywxF4r*%fX=Ih4aBQH8ru>?1hDek&%&xhK8=LE>Ib?ZKZ$)g_wgL z-jLnzdryE+74LH-1|32UiVls835_5@AhFDhE3T@Kc4%OFo>`!Hmta@Q^+U6^0|ttP z`Sgrzr3qPv?i=i~bY|I?U&_qN5z#cgw zV$L;Lk&vTNn!M{J{a|4SBxu>TeEg|&ace~V|iLr+N z*&EUUD5F;WNUFMf>GZkG6~U;s=8pcMwYY=zmOQD0pGoJ-H5>>3?LYNBH}NV{Ja#Kr zbfGRTeN!^U$If%0_d!NjzQ^q8+O&uA14x_1f#VhXW)uEM*jO1hE`fy^)tczpeAv** z?mjWkKBM34h3dMLo;ck3r1y=fAI3UIqvn>c4Oh@#5$d$vXwF>OQe|@dDlQ^^g#w@jVN)wjL;%uamXM>`45H#k;ObT~dGN>f%HV`@Ui?Y#vhQ7EUY@3&;^ zM^d8 zFTcGA(-rr1Sk4>B`Xf$j@AoY}8pPSYX$H#AzW(BfiM#8jBAA14TV*514rR~|4hk(pNUgf@fg)2*Df z8o@96n`_Bly43VDaB|BLti1ln<|+HijvH1+>0loSv*!{g^@4^HNX1&Bo~?pjZ}SVb zJlZ$P^II}k%a@@>$=-1NBELJRZB{XwMFrYXG+(p82Lu@OZ*nJm!ZP>ljj~o-qUxB@ zlf25b+f~iTgm=6o3t;}e^fNL<5S7SFdC{jcGdppk-!~Uxlw2(Zh!v20fFe3?ZmQ_1((#P7p@+Umb?@I-(m*!ZMJhQYk{S zNwF2(^9}bnq^RNl6gnnl3xP4e$vL;Y{sM;5&*=pG2Jno2eOXjSG43qVpf{r2(8uEL~JXJR~vvSoY_@ zs-2=XT|_Um*9^uFF9j6nc+w0gMU*E|Ja;Qk`KB8Uq8+-vkn@%|<`U>ZP`YgIW>ReD*CN?R85 zg@aIfq`Lh;vTjZuMEQ9IM!|hrkwfPb!SFJ5TL=1)i7r9CYXa=Ef?S94-1 o4#GAuSp!KFxdO~DLKnK=-b8uf$>7FB@CS!rF&^j&RKWRv05>2K@Bjb+ diff --git a/icons/turf/walls/plasma_wall.dmi b/icons/turf/walls/plasma_wall.dmi index 4f2080d06acbd42dbd17a9524ea1f8f3e88d7048..c2f10843c6ddcfa50b909b179e8dc44250ec716a 100644 GIT binary patch literal 8763 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 F{vQ|7>|y`_ delta 3787 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 O0000nN=iT&Kq6sDLKqc-)dHnX z2wMZP7m!6%Hd!>K6bLZvi%XzFAchdO5R`51jqOb7qfh(v$9L~{&-b49ea|`HkNcI& z1qXRqHCYG*BJbpAdkF&Br2?+q(m;fmyV3%@6kHH)cEDTjm=4^;==`~JSU-Q3JDLTA zc12ve;0m$kj^cq2G06=bVe5YlN4Rn|;!0R31QMN1Ppdv~!$8?CVC}XHUcOQnC39FB zCbzVoc0yM1=q~LR{mxR>*ySvX7tPl=&YwT(JrHxRA2;7pN)2o%9zWTbObH9p!)=)t21L)O9n8kP!?dkD=X zS~vb}Jif|$Vy~IjYa)ei- z6MNy7{B@-+`!s81)?lEn=hX8&k)jRN8X+^T^J=g~1A5 zvam!)JW4*RL(`+bdz|R2?pbS;p!;oxI}0z{i-ePx@&a6w6E&KQ!okqAXN^$$-tO4Cc_JcKUHXL~yiBY^{jsXj87(&B7KmLws|gxKjF2;HA671_t^}VK)wzOBNykUr zE7niioqsg9SQlaElHs2Jbc&uv*x&14$YX3RKJ`Z>$=tPLkeJA(5T1jt*)$)iR}*A3 z8vK0Kn5M$Y?2@&>)wdXcTn#@YU*j-x%MdN1{}dALV^5dSx|OMy*9mi3^SZGpPLE0l z=*&k*3N!7j;m~`Y%o?ANw2(B%b$5!f9|`kWyZ6LYLbl{EsBSzXaz+XS7!j_i;Jw?$ zKChue3>BNL&W0W%EueHY1Ots(K{aQ;+pDsAUNiNV;!{_S6?%O4dSkHtPKiezoefUl zXi;SZpE!Hdw|-^T>=V#R%~GcU|4gA-j~Vauz=-^5utiZGF)#b_86utyhcvUKV(kwM zeQ4(PhH6(<6oyM!kjel@=Zx?@Cz1)DB7_f*B*K9jfUdc(rp*_j2ji*RqO*9QYXf`k z@V)t}O+KD+j=D73DPJ?eGxG%H;h4@=;+ru z1lHq}rga}+UT*j`G;Bi;xGM#dxas+*dUmOnyymH>mM*~5l{Iwzx(_f4M^=01OCce{ z{d0`fsswbgSEs98jmqdOS0g53B(g8=17eyl?J(c(gAM-o&Jo zTh=wA6`XP>g41me>%@2PALucJ%cwTQ*M}Jo)p)f$!UEb282MWJrgX@!pVNY)^A zLWaN9*xmfa<1XUL;botS{FZbfL4C80!r;&9a~r)K;$WO<(z`o6y^#T5L{xq9mS6Kn zpvXAb%RdSI4Qrn-`_Hp({GhbGxL}HTtiNiCA?a7QzwIY~rLK|Q`6iSYjs2_)Iv~7W zU#{_*s=)Rq;@-gx7(=fI!O#;}t0A;GYbYrkfRVS0)2Ipv|LRag?H=xfhD-^NB>^&9 zH#O3`-Y|LMR`1njDKQyfE$f)P{{38RA79++hI(OOUNiaJ^QEB#7xV_i>1PYYHR5gQ z=K@f@2visCjs%s$Bnm&%`ZDA>J-4Cu0VWiSbz=UUsMQ-)84prWn=Y=BuzKW{biOm`V~XmKA6j%R+7lpBeWu*p|x_9^0^&(X(>{9CdpyQ^r1U1cD_; ze}It?f|#AmJG6H4d>tTTYsgeRh_vie)Uh-;@&~IKCjB1tzs;{1%>gpeSX29tFA5F- mNFKjM{XQ^poVmtagTlT%b`o2L2?G9_AWn7{Y%6TAH~tH`iuHB? literal 1727 zcmbVNdpHwn93H8;cA=Bp%OvYE*O6gNsV6Az1(t*W9~#aiM42~ z7R&8nD(a9k+gO`nIC54y&pA)$oaZ^ubN={!@ALb9@B9AV@2@Yx#o10yT3H$Z0LVGm z+qepm^0g#32v6V0rdlD$yEwVol1LLP&gHfaCJTju$msd zC~TTz+)hQ<_=h9I(3d07p&g!2sSM5Xo70R z6V7>4T+%0Awmo4*vLS(RDW;bZ0=Yv*y~*m8}+gYIu|n7_QFUjv&ZqW z=Lv(ht@GMCxt*VlSic#Xk?cu2B+0qh!p3xSaSMNtK%Bp`n1Hnti{h>BLa2ii?Okp1 zw0BhoYn|JEt`m!4uu7ihL;coE@@9z3U#d(}WTv*@3$^$Fz{WfW8-!bQ{;bc9jQj)J zhb*3pE8Z~x3ItbTW#6qkO&B(p+AqM&)$dnn5noNGwy-@A@!c2ma3?Ei4&aq7Lp4K2 zGq!d5K1=9uyc2ANMu&gg*x=anxI14B){-!Igf`{Re7gCi2T zbLVIDN-+pH@`9@~I(qMr+FDgnAX*WDo$s0|!*_L12ZJ*5$QR z$Q$ogNTAmTN<(}tfpF_ePX#>8sZZ%v&mp@*P_tANcMz_tvqq>8{i{!N$0e& z>WCLGi-rGDkZpA+4!8xyk^dO;Jvl?TiQE(p*~Dv(j!co93gWU=w^2rZp_^)^)e8qU zyL^*SzuvJT?x6K;i^U!+EZBn=c$=FYmEiuXpvh+I-vuD?iw{1D+)C{OZU2p zi7ced(oKcvkzl^+E;rBi#CDml{xG3O!;wv1H~Dh^=ar0LZiU6%uVQ%sn997LtdVuo zZsApT>X=Mw-~{dLG&9I)Un2*l8@>S5?nu9GiOH?5*Ds+wD(ZMWJd$&2>Jy!M`g*dI zZOR(kzmC{lrn!n+H1PCATBjpL+)4^j#C4e*75V9eu|=H}40L^w7t*s8b?13d?d_%peE+jwGhpJ0uc;$BE>o26 zsn*G$!@kp>zCKChCd@5+JvX~v{}F|n^qs3~x`l|U6XqvcY`Z9;R#LuL;6_`c-0C^p lNn%Io%8L5>?HibNje76$_82M#B>ZLo4z|uVb=K$bzXO&&b}0Y= diff --git a/icons/turf/walls/rusty_reinforced_wall.dmi b/icons/turf/walls/rusty_reinforced_wall.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e2636950d27ec49f56a9a67e121e534eaa09b9d7 GIT binary patch literal 34674 zcma&NRa9I-*RI>$SOWnXcXxMpw-6w>1$TE1ZowUbJA~jK+$FeMaCc7{-+cex=iBGv zT%4OV)>xy)SXDLOsyS;uv%aZ(l0`uxKmq^&DDrYrp8){i`zv4z4FCQ-6K_>{|3KiQ zuI(me?rQ2{?c`?d=l}qCWtXHWIrOnX!j`V-WojL;-->CX?JCGp;PipgvE*rVa&dYC z=j~enZ9~t$JMx^lj=7t*I9;u)H_*PZ;X5TR7XctxR58P(wrBlcA z%hCS4YuFoR5AzaUpVi8U`*-c){Zp$V(?quzv#LUkpu7L}S)#09QYtO{liLLzoz!L1Gqc89e^sl2s#oK_g54qNzvJ3Yp4KV&f8U&!nExISWVtFCj$EMuIn5OGYxuZv zh6i@^wTWP(lQ*NwThh)8()~rtMTcWbbj|ZckpTcQfV`Brx>xpDr%p1FY+LC+uQOYg z)FuF#oD;J;(9G3mvXnh`LXKl@I#!yxAPj$a8w%$R(J3IHmn{>j1l*D2n~ zz)KxRH_1IKW4Lnl1Gs@o``5tfAU)H6s!zC1)BDAPsg~ zrInmEVj&Hp)ddLXB!h+r8v75?r$Io7?3SxHeP~)XXX)_%t{(5h{W;+@07nfivTWWR zQOp3R^~->lK#6uvP!@%{bd}NCY$c21skol$MUijPNRf>mQN9f|*;NQ2Fz4LQG-iKTue#62RHBQWC#LU>-V-x?tn6o-PYWiC!TBqvliszkrs9GF|3oS zm>oA3!5!fiL34P6h-6k;D3^4RacJ zk;HjY%ww_rwz?7Dyir>N&&i|UOzLG*vGWB(*XN8i4L|Fa<3{-+0F$VpeKtuo2^@9Fzv)6fW3Gn;7|CQwJ4s*pteg~9B6=R~g zpvRT4zr`Vof%#2XK^t`V82m0*%Kbp{&e+7 ze}sB;RUQ;dVGCyN%`?nRL{%}>R0mAK$CAlX2A;VbORF?-%V!%kF;g2Q?3lLDkZI^>)EmK{5XHLlOR4is<-x0koo0390s4_^{9`n| zXnqiVVHJP___M@PFiaSS=i~lk`di9gTb2CirMZ={8k`Th=cHFon) zppU}t{9Sl+y*F5}M6851+dIhV?7@WS0|YxgfhAyvhoptU;QoFXv5?5vHvL5_0f;b| zy@QOvEFUQ9GIKey_j#0y(vv!X``vKKTyY2YkU!0~;6ic1HfHYKd37(lDBl zm9~J{nMeY!Usznrfs&kD%LpRf=(lt6@vW(W_F3P@U5LrdI!Ky>xoWScyEQi%_q zzd8hNYda60nKKDah#&*I%-~WhzocuPYcqI%qy{~zmaZ)&8hKBLT_5z(vb-6@cr&g- zI?b~`4<8ngJUm+DhIktAEc7T#^*EDONDg~QEd8+i-5_m5Qb}>N^UF{sF|oO7^Sa#e zB)0*fv8%ZhRJmE$AQ~l^1CrxNCOzY#?@Fao1Qf&tO#?E)q-urVnmxe%DXIdX^{b#a zi|092u)*kGI!M;qhK^S zy8JId5II38+z&x&X9JAwV5bS#tK8cbA_6LiFMyc~SDz~hNoCCRv&}}fCf9xNZiA~> z!4p9}TwT>S{pqg=5BQGC0o+v+zs2|Udv~~R{60yI^CRNAi^JU2lQS|<(ygO!1vy<` z2c|{kR@lJvgDHSzWru-cXfztb?3|fH<=V8jVJoBt&qyi#WBR)Nf9Zlt^DEl#pGcvO zLjjEIgSRj}+g=VNRIq2~_LvVWafe%8EI(+kAjLt^#I00`2-j|=uhMG9Mb6R_(G9ov z6l)5d{yrcwbXNlA8Qtkh4g2ej+m=WgKye$)`YsStH8`9&?$-o*z` z)oJy4knS)$%wpX{f+rS%JYPp1A8P(LgImwYx~Q=)l!D(Do$8OY=Y<6^N!$6&iJsoK zHvG3mj~=AyI2aJo5|EsaKa21IU|vFpo}#PLW!k~!P(1-fhzo&{`V@??Jei94F`WL8 zq6DM8av7eDMa?+H7RWrXAP0a;hkHQ&AQ#y!CGHenmBiSmw6>-#rJAY=sv_`-T zwsTsC{G6IttA>fQ@bBWffX@l^&|aYCb?_e;!F5B@MEUq*M(iVC^(+7oOg1D708P1E zg*}Xor~%3ZjwV-~tO-g+Yexrgu#d58@t967`2&z`g2`a3 zzRQRNF@v*n1@scpDY5VDC<(HffAk^FZO8b(4aTRLq{E)X(Jub6r$BxsHgBUMI;yca_JyqA{GciP6V`9Wvr;!<4O>xtmc?-w<)HOx&E_SUT0w+rBpDyA!7<@5LgFNotmdA zP*|x;lgtbuk2T*mU}*w%7-P;m|9XRSizX^8aG3It2h%;FW+!~2$1xALL}aN41%n0g z3_NBKUI}lyiB<`~22el8EF7iHe}O}4QJ*Dqt70l88f<=`Ho!Xch!SWH6c|gP4m6~& z#W+9a!b8&P@(&p~fePa`zqm6KwGQ9?{k7=ZI_~3vR=4Hrv#-z?Ene)%l)temKNsCR zn<=#CFaqJ(>n>vq%(-g-PlOy;^Uv}6wx}!xc7VK+0Ujn=GJC+QOR<>&IErhyvA_2~ zNx--_$BO24JNG6n-lr)bbHEsPIM(E|9tqeC5Alr<@`HjO9h8=3OlNk!FcaevZqwx`MA~lYSq(*o9n$_M!udys1z9EecR_ly9zt2!6l^p1 z_n=^9WyK_|l&OJ{nTkY7JG*lwvfKP2RP`e>VHbbL7#dm}#9kb^^^4S;LI<0fqY#Ds z=NqP?*@@bdN0komnujbhb6Cagh9cuGU3NmH*6RgY_0;0UEgc-f z9TZ+!^&>M%RM>Zd*He_1R{FC`(d~6GUK>Wa_p6DyoHefJ1IPf^OrZdG7}~mQrJj}? zW0K?+vnxRJn?ddCu4*R|7LMC;e^#;kI~uX2Z7b)}*JAU|A* zf?skoYAGB+mYGC&&AO^-`n7xP*Xz0Y*3;W5+0Znd@0%sVOK0wu$}|?U4r}_IMbpyk zryb?%SD_LH#T$xU!&fNG=Iez>`lEfBPos^B0uWWlp`ONX8wKrZKVZY~74>{!(hZJj zGCie2j8!)Vw@>Q(uQFfM6*mN!cN;7p`j~kA!EZ(Ygq7#)Qm(yc}M52pP7L2Kz1L zmz?a|tq0|N1*!zps+vGC=pKQ`Fi9&SBm?m;%v&tf*MH<;kSH+uA!;~24qz45qk|?L z1Q|L=m~37wsBEQo>Ov17e>NsXrL{ct`}ZOVFBg+K*o(7eqE@uBo@)$L%}~)C^qtzQ z1Et%zOHlUSYz-}Dcs&8wSkM}W>N%*`SCUC}5SI}tD=G+%q^XPtMmfr0x*m6U_%QP+ zPV}585>S2x3uPs9N2%b|HR~qOAi6P|Baqr#8%Yo#1=9^(4}*K^ZOC@e(EN=Qr0`_a zQ%9RCV8@5_#-~162RVv%OLAxQJa?5zQwma!n=d+B`?w12RzLIvaK6?vAofR6@K&7n zzP_?SVVl><0VOffOj9ld-oN03RThSxnNyQL{i|ipN`Byv@Vu-hZFf-VR>e?WCPF)D zkx^5}4@P??zKSHuh@p_!nmES)^f%er!zzM6I&hTD?HsTvujBYBoDp|RfILp)>g<8t z>0?CLG@LeleU&^#(7cG=F7fpKs^4sZc&5|v+-+1tbc`C7HDAH@-c$n7_yyw!iN`j5 zK{Ent37!(0hyFRsj4exK!Y~>s@)-%TtCf}9AP4K8V{y=)0L)humhGOQqTTB`%JB_Ixe3zBDSKW3c+YVWTfA%iIk{9m~wJH0=`7bgzp%z$Tw?bZrFc4LM1 zjB&ZIa%UbfFM(}KDX~&y-w=wLpD zB3HTliV&(EBFH$VWqX-rYdh2xlQ?Owy7^v`o! zRWLzBwJUGWn4gdl-G{U0_{TKFe{y%iH%e6Y6B7;9sfv0?De7t zb_%5doOl+J3Ot1NFXOg(HdDPx_$t?N0<=jR&~&+g}#w(-O&Sgy}~qtBqg_{$44ncTEC z-e1N!9P-N#D%?ZP!X0E{#wksw11-E~Z=YLXNwRAQBw!6M0}yS1eWo+semhcozs<-j zR@yvf1c5b6(cRW>V;e#l!8!1L<{@AIkW z=J!kFA`@sJ?+Qi2VR3t&tB-@r5&aZflS?(OAtXZ>qjnZjV(PEM!YBIry^Te#FEH7d zpflhykTg$t_b@L&oJ>VKRPqPHipHPrf4(FlP*lLu-(Ot6yg`4PEsJ;21;zq5go;hB zkiJm9mfl35E?r**I-*_Ptj}PoCvQKJ8>xNx<=oEM(Bu?m@qM9~gsIj4S!sXs6e%40 zG3&|jW>^-@+4(3%{*mLrD8kCOk7-@Td>F5askl1JcG$CTG}c{PQb*rOU!RTe;o0F5 z$8~#a#}pZ5`F*rCe*~Y2$W%)(l18=cxPN{pKz7+7uP7YbPQC zt=01iyO6o3KGK)dnK?Cokz~cj93$ZwU1=`A?eFS!j(%?r9lmA}pnUWZ@V%=XLe zk6PyA7QXqy>Sge!g%U2Qnvc~@E+ToR1$D4qdvXSxH7wfBFa_KS8Y)XtJ?^_pA*kei zkOm90=i^ElXeMVqmY7~0ca|y)JEXNTnHzSRp(lDVww5@WmzK6z@`Fd(cP`b~9%uIB z>_A8HvKrg~wFl&sZ?;w(`4%#xHo0g|Pg;91K&MjDI{gfL1+QNh$EU-%gnzqB3(N3# zM93V29*}EICiQ^1{Z@yV^_Xf5)j&U#&%9&H3x;Rh!*5Sb%lN&5<`9wKZT3ZF(QBPCKaEQl!hmui*(}q;&A#(4DxPa!6T0 zN=T7X2KRo&Vw^a~z1GK+=9VtpY@$4XQ=LHnFe%CSYej(p@_-j8rR&SHgXu%oS0BN~ zZM?jwIP5Ky3Trqg=epc{2C_Q|y6AwA*Ub+BbFWKyl0Wh6PJ&KV1ra~f(!hThNmDF_ zFaP#}o{tx1s=08pddHL+MrI!(dYLP@`blZHR~S(j}8mTqvD zV<7zcWN%&h6TCbxRbcG}nYe4y9zm%j*ak+zK=55QxSjN(!WR<)^Y`llr*-@5pN|04 z4J$nI*??KB!B&fR32tT~HZRFsbY3`DB4UKWf(S}=6QPhNt>admPNHXmrD#X#AjzL4 z-@k>5Eh!RkQ6oBd_er_s6HW%aVAjC^4E9Qt1;1qgm zisXxMY`*vr{1Tk9WIPX$c*J&iQ~ec!cEJ?eS1`yq6W{;Qbtdb6w7?`LBD1@MDNWs8 zaiMuBuDk9Tp=xI~;}8&5Va-LgqSzQ3oaD*))Tfdl`AitojdIPL`9~e=M}*7bWCG0z z+9M2#HvR8gaWocc(IHhN>2}omBlWQ8V!fQYF(j@OJMtao>ENNfX%!&*7<@1rN7HEy zA*oneeuTIhFoWs?mpXyPT8on}ZYUzdP2lH!Nt#@-Syi_v)be@A4tKd3sE#CtbO!P{ z#NqfS=wH2PHD-Y1L%IPXAJaa>l`W-4BV#A!h*30lmJMryf*Ag^Y1ff1fICLC1WSo_ z^aO+wqxxrc9q96hhqgexdJ^7^ll_)A(D6ZBPB-iEFtsw@fMP98nw}p&V6tx`EJt|; z*3a#b6YOziCmtqAE1@~CM?v+0sIuAcpPBQ+jiyO|njq$G4ULC7e}TW`TAp_!GvZZRUi%(|`(cPU+0OL1 z4+|AIdEJW)?hIv982?v||Gvy^^KpaaLjNpx$^VdKiDC>8Oq-Du05&2g{r%7`Tw={w zq50)MQsk}2Znd)5W$qyVFbYGGyC~%_zQ`vt%|VEtV_)B78Pj}ZJKTci@%+|?E4!yN z>P@?hUv}2&q|cyhjfz3XC_jS*>oBl#oHVx&TC1b`O+XagmAYqHV5RJLo%!6~F zJJXn?iQLRoPDIB#=`560#kFISiaF+5jk$RNw{7)XM^$xh`+K>glf6QIi%_GzYBRGj z(VX0_~LlWRMltHrLq7Cs1(;R9vAd=A3TVsKb=rP}HSF7#-4-Nf2F zS(bb4B6VtJxMt2erlOfj3(TJ(X`Vy(8wY@@Cy@1+TAZ#$n8L8i;p=`hflr?+#V5(fZnKa_VK}_}uU!EF7DtOym`Uj3T0lKmF>ZUt>wp2!j3V z$@IF`{mkh(o9n=)X~^4k8pf6W#BLv>i2vaytQ>t0DqRGHFNsPEw?D-BbSRcl!Lq343mOh-a*A>{NEAeBGw zYBT?hckq34BA6heo4M;NsEBZVYVD!ilK3drkBADF>0`gbIvVxv0f?{oe`()bif$Y< zhYl&DuTmwKf^h`QqKwYOS`U_grM93X)L+s8JYHb?)cWz-FDk9E%@%8IUmxihLB;@e+Ckqp%Wb0G@vQN z$a#tYjZ&*1=NOg5kl>Mf9p?04lla&S7dDfQ|t8fs{5 zpY0<5ksT}dD3I$;8)s_5GZankd0Mg=feMWx0f4cl8BUuLrOcXp*Ba-Wboo2$Z(99b^ zCouL~QTl4W|1ZCjsjK?GY;Hna-`@zfv!Qe1bgAZe12Oxd=j}~2paY9goM&LUtO#qN zc|P`swy9u`(f36$R_rfW86~K@PaC1#@J9s%3>32dM!9|;165!`Rew|bw8{()%uEVo z6?w`=KqG;aXfL3^58|Rha9AK5=u67jZI#!rrRTw$*zX(52 zwm1X?I|za$x>~&>29IkZcVLr*r%TaMA)1c#XY-)}T`!5D)QgsHfu$rPX!s`t7{gGz zuYUCvWGIwekii+q?;>CsQ)319tsITdW0<;B_PiP%lywMW=u0Pm(xyV9$ z=G|hg7|I~ELsMmfBnwwm0_@di6VXBi$?WR)L2Cat;LqGA+LfTPV&r5f5^DdxgcSF| zpO7bSWZyDIATE=(f*m$rBME(ZH*8;bMBhB$@(Fb?QObU6YQ)(x#D&mVBVhO43%hBc zOds3`5jJiuP7t%iDM#E|EpB6TrP3gc|4HZWuc;ui<7<6_>+t`5>mO~Go`Z&yT&;5L&Wtn7{j^;#SV-6Ovknz<1Z@$`AYJwnBn? z?~n^>+L%2Ou5!mE_rEC}3s~$)a@J)y3DPJnc;=RR!n;G-CMIaPLIn-k?MP2|cEv6r z1hI_uRZf?1)VmN7!t3=vO$4<5<|wPY5&uejvW~g!%ihI1L=cH#Jyd5wq?cZ`<+Y-M zjBD5$gZ?LyY!QNxuBsKR*Jb8jw{>;Z6R9#lgqbYEULx8)?+59js!zPrAF_Xd)$)Gp zi!^LJ7wlt8)f=`3^lu?tg#@~(boB*kY$1b0!@Ejjy=R~S_VNvM= zXhSPc|dhA$PIW z{LAUySHTp7p!CTZ3Ex7*&IAX5#b$q2vJwGf-jgT=eC@3OMybWp9y0*~RT$RvVEC-D zk*CaUqcB2t(HCf>9^!IHQ$vM|#GwrhMo&cwv=PkI!?B&Mn;e6oFEsf{N%!!2l>YxR zx~|o^i9^;8C@2boUb!SYyVR?MFf9LJKZay{k1JGnRL3}_@G~h%^lUW42+dXlDV|z2 z)&ww%L(i;lIqB4^JjcpNL9=Yg6co(p=h;6X`umC?w~V>!Rg9hgrxqY+)A2Q}Z@BLa zr$)hCzZTc#ZvvS@zOhgyo4s;tVw{|`Vs=~1G*uD0be+lJq-D8gZ9}^>NAveVwlxCw z^~}WazkCRP`F4NemG)y%2OYa1HAf>4e0iS$V@CmE&B`buc}Cq?Rf!z#0qZDr=Hx6= zV`TBnm~n=zxRH8np3D_9g<|qqbX`R|DkwX3rj>03+s6rS>$Yu}w+U!j5u`2YTvaS> zYK0^=oInVGT?b%B5+auiQ4FBYX0|QeIC!SDR-o3KodK(wjVGa#B&djWa>O@SL2!yM zQU=`RLy`OD<^A6IYS$t8a|+u>^1Dci_#CTX)Ls-~5K*%1UKvr2LedP5qGNROmYN$M zwTt*a;yud_;g^LGRz?I6qjrZ(?$ozPe%kFqo{}h^l>}^T_l3Yy%=RtS{*@`amhPm_ zz@7EmkKVp65<1we&9Ys(s?8Sr+=sirvd3{PEZwgeX(IPdGGwZZeX+#VR2H*}vn$T-oT9o$M`Eo;ce--Ec&`*G8@z}~#-|}i>e=Gb^JJVWtFu3yI zlW4!6`bz|W!Cp3lQ5E*Bg!Id$V8E#YBfBpWq7`rfDGh&b7K^5qI6~cRUI|!FRyVQU zL_C9@pTk~qqLS0|$%CJsF)A8~wDta)hktrY4S`dgE!+b5rLVr+iCtcW7)6gMqK!=i zTTe_Wg6#s!J_eUKiSGs<4t3kf!G~ksDE|K!y`vYtXhjA0j;;`y=7!dPP5~=0(=C0n zEI)NIeGS^pu#=$eg|Rzi*bx7}_%2*wAlO~!?0s>SAoOjK>!)k_W^)}x4*_g6zbj-w z2IUEWz(&R0xK^xu99W)KhscG)1N$YQET^a;!CLDlF~Q1{Btl+MlRaby`@u?%-772b zFRcb}ED~IRj3Uf^i4HMEXm{Skh> zu+mn11^Pe?OlyVWMmk~EIk@=Dk{(==#E(A<;YG%V#((MfQsV$EN(ZRZr+;U9@F|RD z2P`I8A|tJv7FdN2)Z3}O%sT|dsqY8=vn*&%*HW_#_}kJc^V0Lya>ILWQ_B=|2+QSh zGdTn!1wp3>2jLu4D9Rh)%$wJ-zbz(#35UML+X`B((R}n+gc7*^;mJTSKr4IsBK+-= zH^9}!2*F$f6Gb&uK2u_ieSMVzR$y%BP1w^q#byZwO<0m+c();BvyShp(&oIF7?yov zYUbk^HZ}=41{YMffW?y9**!rvGfoaLjBbTuj0fCT5xuOS|K=3&!kVwQ2SIW7ZB~>J zTk+fqbyKLL;}lYKO2mdpE%&N;?Ysk!2SZeQlu#DGt`?<37`T2e z3Rv62ye3|4)>V1_7vF7E&f>((rTCfCh<(#xZjs@{feUUv!%)2j0^bgdp z@)8t9ST|^nC4#oUX9xZ6%+_sCwE4F1Xor@bTA&XzY6_qoh-NAoLuBy==j*q#`rDtcw!kwuje)1qTvY?el7ELNlc=bt zI2hIg0cfP#SN^wetZ&DpZsglCM3oCe1KiExYp@)qIx;%X{mG>Ae(5uG)KMR6r3^gG z-j9RoQUqNOe(Bj*^75MxUg94N5a)#g>OjVt-66ygTHPdbv5qxxWa0U#T&1` zXeMK@Jg>JQmSA$I4NtIFUp>?HQ`|eYbC}F|vUr2gAqE!KScOG=27&pfI5QXNtnxNC z-tmYbp0dpUkV@9y7`S{ntkc>=e+0SokWt!Ntldnb67sFdjEdItW!AiN>{CqHP=S8GNV*frs= zO5kNl3aqs$c)Cma>DUh#+NO6fpuDa;5NuY?h6geC43^3?vpt^8SRim}F2E*PftjpHPT?PXICu-$Nxu0i18G*>WH44=+{TaT9EANXM+ zIjsAtAJYtkE^yvFw6<6UY%mQAeIK-eR=tBRqn3GJgJV}*SDHfRXJM51BbYFoCR$RG|YLC`5xBpZgNu_>wKbQji*K^U@*m75A0?o%egStq_~cZ@A9=U}0H-LQN`{USkzrMH{0kr#&=#NRn?I832Pl)|MUJtkwa zn}qDj)ntk--|DC_q@8-P)|nOmMJVb#*M1E$T-(tJq2%a2(ywJQXd4U-i zEm--3{j(PAOys8~E{qeL;{U=tUpjDUf)zOgdS*8z*3!5zjs6}>4Up>h1;xq^@0Q70 zT)}*(Lj>WLP!aTAG}GIypbkbG_;S9^Gs6BC=GCEAE&zrW=tKEQy@Yb>&XHWi3a&R? zU*poaL41bHh=mE$VN~~swa2X3c#h$v`!jQv#d|$GN5(salmj$)QH*~6o_T@6^Q7#T zzSE^C&IW0XD@018^>lnbGuwi|W;~klp0ghw_LrL2H=y%~z0W2qLuP+| zre!3=#r>&+K5ikeHUnUlNVnD0JS^a}&GF-?Rr+LC$(xv#zh_`ZO|BuKEw8P-MneUU zl`=iE{nBx^0Gx;~+n%Hk)-zsgu16F&h;4pX=vJU_ zgk)PX+N>nEiCkR82;?@XzEKA97`}OXU8P@_%yW62ijf@>lY#*ICcQPTa}6v!UM%JO z1Xl*>Q5iHpBPHjIzi?PM`+P9}22UdDA57W!&BABcl>?Paao^d}GqfF>jkx3)3I#hl zUg}=In01I~D#AF%D(G+43*#Dk=(bRNRT+sxwCjak(_V^k ze9w9Y2Ub)-`onk1ES2d`;q|i;yO4(B;O19NEPd-8S_b|+3cMe~UrAp>P@N)z$k100 zcl9_w)n_kzShc0~aA50_iawKUBZ;j3`Zi?tT_YrVXTneX=Qe5gi{MEc8EnNiUePCd zE6u&zmH|D^xb&<2*K{IcVVZ0zecD$y4tQYEb;iOho-@-F^_3sd68mL;Ja65TjlFPph3~>fB2r+aURl!3gZ4{Oj&_S@FUf}` zv8~?cI}knLyU{V`L7~Hix8R&e{qG+JnDkIEXBOb)R(Eu-?blZ1UX3#S{df?n9z6eD zf~Xr=zAmXD$EqOFjW&$A=*O=3z!mUUK?$yjmGvxYX0u*CawvE|JfaMjx!UC)V^@#T z?!I37PxZ^nb`Vs?7TBx(V07R6_pfW)u=@%1XyO%~6WKSJ8RY$`?TNqauuO7f4u5*< zc&2Gb5_#3MNxKlPSY9E`Tqxikejrb4R`B_eM43cn8+!M_R3S(z<1s&dxM_@}2p3FY3(SP@T5e-*N1^ zI&ub%BCkAyp5xg@NfM!pdn?&y&5}u_p>aw-So$H`+cW40h8x@0w}#NN_NV8oT{YB8 z5~sU8d<4&b-d9KH5uX1L0%)|`XelfUFl1&aL<9QT<#LIIC4{f=D+PoyNbPcLhy2}|Sh`C$?aHe%MsnnGl@ z1?Rn<)wrT=yvc99z5k!=F2W~Tk-EG|wpsT(ELDKi99Mbu;A-uAPSLZ`DRx2CP}kk$ z=9Y6hlSoN$fOJEcFR)BGg4|Y}^~Z*@b;qsT#Gxw_R~jIm=!fmW0vw|QS)%pHyd9`hnyNZ(w)9GdK2u z{tgaskC`n1s5$P<*yDTrG{lU?hH5RyR}&h#;)lUib@?5hs3~V% z<7;dA%AP-nMU38baqI!Ii3lkt2Tx*LQc?a9B5~NptbU88edW30P42dyD`CII%X5{O zL|j5Mgj2`WBCo*?#O-q`zIWesqzH&*Z;a|KC21w$L;PF}q27Wu8>9XlGS3~vEAfu& zcDX0rcLW=?`gjk2c%=k*;5plxRI;{f@siEIqaTKVnXH?+-Hl2~gUzadb(2E$nhQ;itgjMkOK$ZP--K3A ze6CAYRbD$+y6*bTW=~0mGgUmew-RO{)`aIF{HEsYM!F>+|t8G?P2GFKy|wHxjYv= z$&Ez+nc27e(=FG61Z^xnqwfUXC?Bzx!vUY+`9?-LF$NyZkQ+?DjzKqwuUubPo8LYk zJ$W;5x)>3O%6LCjW``(Co_0Pk}Y?9$MU(;o_wz%w~$06 z8Y>=Hq0&+37%VN;&92|1VxfwGY=cwCJR|ms#YTh>rqFs2k97?dl*TnCrs-}dnJl!& z!JsP`Kzaoiokma^=MS?vb#!t0!HOhxF@`Lx8l}vz7>?m;=1 zLXTS(+crtHr7Jdcejr{66th{7>SR3hC*`(C%w}9 zHqGe`YKd{K5xojNHN%e>$%mhMZApRqOKe|y9IsRc)dfpOrwlj!mm+^@eK?|z=!I_m z;XWQ_l*Dzvloh_|WalG^q;3-wi&9~f;`}At4~O7q_YBzCuXlZEe$^6Vh7G#<)#xi% z=vVsF@jBbWjN6UWggnqsMp^DNS($8k1yU};64sM|=zAo6c9IyUTAnBLyj(N= z<1i`U$GKqVO>@+<7}N}AQ@W(ZYsa6CU)nv+C7IIcaoTEU2L4H~=wK_(tygm2NX(K- zGwo9Uq#CUIxTAqYGcP@Qb0=8ols9^oQ8?m+qHU4XK}VlrWF}@K&LQ0I@=->$$E|L_ zO{i^Nc`T)IWaJc7#(<9`UqRJs`piHnmGr$m8yij)>-z2ptfRm*MmDCo+}FdvF}qr_ zL|UJn2O`%_>S-)zKy)B|zpat>XdgfB90DA+bWPJ(_#yJ8JN1ot%=8ySITQF%^3x7= zyKsCxlXGXJg60{TeUcDutzE@$>10QH2H5a(kBU63^PNj=p0a4zCAJm(aHd^;vXRsf zYmLx_Br5s*@kr#n4ko@Y?EN=Ijq-JU&PAYmRy1RyFg`-?U>Raz#?6fRUJ~wdFbnT?9SXQ2oNRBv9wd-VXQ1p*dHoc2BzkG8M!bL+_v!;^i(j0HB|?&Q0J zzndi5w|C}bPu$7(9TYYETKE+jdao=Pm}`|u*W+#wN@&t9e)wqrqO7JIUsZNa4fI;O zT)%u8$E2IBtW$R!A-?!@LUG;_?g_w|E9wwbxGI94cDr8vwgLp4H4kOk|DWRA| zhl0RTOLh0xoXT-0KvVj}cD@cTbWR!p|uj-+abx(jC*Jsv1`zEPM0a3x76gH9j=p@%Ink0{S$*p|Oe(c@JwH{JqUW$H zo6`C=)Dpq>2+N>zot1SNIO|SeaH5CS4Yj*vG|z>ousZ=u=y2KTdFY}g#J|8Omp7ld>^nPs|9Z?LHvT8Ks@%TpTvE_1bz}t)I5sidK04pcB@O z=uFU<^C|>UY#Mhxet!FSOV-{csUrsQn%W%|oX(rVt$L0>R{MP`s)_+B1GKhI0501_ z%)eC4)d8R;Ma;#jfC~hb3 zVS`C4FRxb^@xt>f$*Gl2!w5#ykWLOC&YHzhU?fOm?i#v4^V<7w=dz8Yn%Md&3wjxY#(Vv*T&}kD>#0DV-wk4C`EZf!rcnlt zdE%_BaiYpc_qnuSh=F4H?SV>u<~)Vg;MRNw72#8n|A4%z-5D#>i&1qthdVtYC|)+6 z)HDO$f2$>`8&uASqyxkbI!)A=E^;_yy$*@gsZ4PHBo}@q%rr(b#qsiaB?blLL6JA- zEi)ywxvqbxS&75>l18899==0+J&OA+$hf+U)>h=%}oENq{sUWwXK1>HY+pg;<~Br;U1ZkF*L7KM9;pZZNS}mlWUj zkmV$l12kfW2$srhso(VIFcf+fwdgL{d@8x%<@ z$LqI%9036az*u@+!m-;@Jfr%Or82NsA zjB;qB_Rzo zz#?p@oO~m+QjA|X?dLKEpNO6SSr#-i4`w7dbgv|ZBS$31S~++^K*?JthojKfM>;w1 zy~onTg5x8x9t~TZLYDp_Pg92JAMgZ^cCk6!%veumg;b_idG8%eNk5Ik1+UH~3bd<^ z@%w}elJ7;r9gG3xh1T--!K9c>W@;B{KTJ~1#PTm1yx!6FxWoF`R}p#% z1euTlKA!tpnFr8bi&}OYFXL=+E~k71Q%ntrr_(Srr&@&2Q2=&E@vG16S0UYOc|=FL z-D)CFHDUq6P4~fpPiUf+mX;$I4tYT%KV}FgBSHYrA_z}f>_MYklqJK5YB}EnE>H3E zkEAKx&%1nlht%C2!GTFj#1B{@FoTab~lHfuHHUfdOmB=Zf$QZVG>-b2bg{9JTq zoBYfC{u%~}c*B36Oh7}Ryz)?Ky@PKL?PqUAk71o__X{a=mT&aLUPC-G@Xb=-lln?p z5xU+b+mT(ncF8O31^6rhRH$?cCA(Sd$H<=K^vI+boZMlB#lVFT_Hob~{K$WWjgUfy zL1sBkTCYarN`Hd+EtswTxJY+x)B1Ud6`&p#0n;}mokvslIPNXz;9ZOyq@f1cGkp=Q^n1_MRgnW6Eghy?J(z?mi@x3xs&dSTV@Vh{T-& zab%NA=Vf|&ds%{PP5E)sOfmV}T*dcRGIEtzoyh(i3%yqFlKla1#`k!FK@puskvF}6 znT41-VYX%d2+|+l%Z}%u4{va%bkD86w{#2)y@L()_?zU82_JTum2eu@AU&5mQvXrR zSO-ITC3kA0&VR}8Z}mN*Tl%t`M!pS^5gmp~?J&9){~#`>OxhQYj8bVt^|TV?S|#KU zXy(VAz_G=i#N9c>UtMNN>NY1;7*vO-f%Q!9{aVxU27ju6i*T-mIWva#<$d6_k(=QfZU*M)mr#?3dHS&h#f-rXo}HX$rchAck{# z25+rHCZip7pm$$mfz-AbkUQnTc3;EJOdZtug%$1$oV(jV`t^l7iuAC-5bLXQ(CMke zTX{H6JVkL2HmYnW9Tt>Qh*vrXM#F64mJ+ap+|qPTk6H_*d|1VD@WMRVEQ*nJ8mR0*E`?hItS5^7v-nx?YNdVQGIMI9NyN-67fqoKv(>A#r@^M)OZ=l8eSrmTViuM+Qh2<* z51veH)30ix{^|2Jmxkd7Ouub7=+VyJ{p8oQ6tmGNCLMQ@w|mNCFLDs_TJsSC5WzPh zg$}|3#+A$*nB5j#G53+lw76r=(otpO+K#pAsRJMB0U_ilXkmr=w27KJ z4YJ+Udv3hx`)f`wM(Lo1#=6gZpOfgchmc{no_ywKM{VoppsaJ$>Iud8;&bZt|BJ7; zjEXB-+6Hm=U26C}7d4#5cy!QI^&nx4*m-#atw zTWjWD|2ci?RP9|=&r`K)Q^=}+JdXKrFJVQQ<8R>@LMOy^VDk5QtihWUbg>6|?r6Oo zcghRA0R1W)WP7E~O+l@)oBd-XJi?*p%YSdlGKs=q(ufJUF#s#iPyqqKFYnrJMfri+-H%C_Q2gPU9| zJEtHy<=Tof7})8Zt#$@jFr0__I$D6l)&x0D7@jxd&sNmWOhCy8+w8TzKO(-+*3>wz z7%`pu&2)7<5|(rPUiB$$F;#edTECeL&IJ@J!LA5RDgJFEJ;2WSF7SLu=WbEDG&N3K z_H13{Pd$^?I%O7j0DNN)YyCWyDj}yJOuEF~aov(%+RXK_!}~K!7K(QE_M3SXdG&3# z_DmWfU)P-6yw9&dlH(O&N(D{j3CD{VAzxpiQGQ+3eT>HhPkT5)VYXUI{7OlmZs+aW z?B->k`f1nN3Qhyg4e|hf63i&7<0ZmUg(<&&Yp({79^;|*7`q_q#61YD14Vs5q(iGJ zM0XI5X=0m$U=4m2@G$$u&{QyYYlN%<_yOFbAYpDGIF05^Ls0&mh7oeGaRkj#VburK zE({_3@(=y^aH)OLSzEECqD%9~9PuwRc2BV-V2Pw%pSZz`Z5dj^H?vQ-0}Qn!fgUIL zU;WdEtYU4BAWjw#gOc2VwQqjnWjIMVRWYQzOqb}!MCL7_*54UXQJ%Mw;}_|>?oj`H z)DeB@zW7aTwc&sK6aEB?5p{C9sj#b^0NvjXd;!LMP0A0-3i40u9^@#uPZIOs?`+d( zYlOP*c%zqvTm*%{T>>0vbj1J$g8`AVK#%z0`m6g;=a&bM+`f&Qu40zd2eI8#h>tkyXvX`^pjFYzj3hv&0jRVAx#lkx!mU5@qFbG!gLw2O%3$6Ecg-IeHU=Z zIYoshrDkNDf{^c71ig*};6D!~AP7e94Gba_6Mx_T4Ki6V%pkp4@FK!#y0?L0oYrz@ z;eJf`K-~?#A%1;GQFBenR+CsOL%*>0x*({~&iJQD9AxYIJj_x6>)}-I_mt(Zr{<=n z2K~?t{aVS_&OWKM)*sGE)f||{e*>3~1)tOOX|8sXUjbi9w``twv3`SMjdTm%2*^-k zFn^l>JbvZW-jmJlsf8C{-g?lX5hm&dTGpG7pY%vM}N9C zh?}*0;^J-bg{i21VzwkxQ)3yW;J_&^Bg?mZt4$KrPd77NExxwX7nZlxv{|>ufI=#( z!H0!^S;ri|g{>tzg&(tBQEtB)Cps+~bM}B19By`Pa4}`_8SrKP`Ai>jx&SviiiSV0 zs(juVPOynG@9^@e+Y6;l;DC7@QoX|t@h1dGV=d4U{yx-?kX@*}KaRHQK@?+mPX}rF zu*k&MV>?IsfPE<(bf#96LF>=G6G+{a-m4`kWL6rQ_9XYXS5p&dS2|g0@RO#s&xi1; zo8+BZEjS{+ccYYoqK~&7pamnvWfShuu(Le*qCb1>M>>;_XDhp>E03I;WEp_yS-dj+ zi$z(BuSn!LA+}xLA7bjhSO2ah6JOhE_KjWfJre|jZeN;!U|7Kt=ITGZ0zBn9mI9zv zu(bw&=MmzCTp%C2cFyT_!8xZF5a&B&#@nP-NS~gw3VzF%*TxyqurXNO;Fyb9Rwa&G5X|Ff)~W%ZSYD@P$oB$anp7 zE~>9T!2iPj>VT{D1~d%xTK})*Zd$p06T|40}&>L~5F-;9(+>P!z=wS+7%~Oxq%Nce)Ljtp=Yy zf&YjKQ8EIWenPN_+)r?aKSD$4t>5KK=CO2Jy)y8H zxG@=}M7Y^v`Frqx70GDU@7AHJv*c$*u%J)M(y_^t#dz~r%nM>ASNvgSj50JAR3JFt z47k?GRfE^UOh#^Ej^+yxzu*qjLWUEp!=CWFdgX!)Epqg_qHQ17+{_k2|9N#EL*FB( z^IKPC$#1gE0;$*4568=ek?+7ABochzb#lzfS+`{s^;58l&kbpFYx9Y^+(bh0+O5}B zbUa+q(g#Fh`6-}Z(uEkW?;iHQanXv`NPh?=3f}$BVJa+w#EL{JXTuR!irc>Zl4;_+ z&PMEx*ue%y4S=aN0nf!z)~qCy!R%EcKvj;aUvwPT8dGXJy>RMBlSX*>4&M?4Pc_I) zFZT%I2!}6Sk1hM3MqrwC@v92|K=Tic6sL+KQP8kYkVs1Vc}bS{+SQML&l1pEkM~L8 zs{`iA{W;k^?6s;6`%AL8aS_aACS?0w$xI9djr9n6Up;;kPF|IGS^f1^V-7&8*<<@~ zfZumP<5u_!J-Tnor5QH0TCfBDz=LP_yMyc|o*MusHP|urQVk9TBErF5K2Ct=EftCk zSHYb8uDm$owe%mw%@*P`tH#Z`LEnLmQ|=$NC28nnyhveI<_xY*FQ`zd$~dBk)|a?_ zGdEi4<4zj4zPq>wo2UT3Xr}Y5z#GlX1Z@6JAMXsp+dJQwbizR@&;f55Q$knee)t0f z?s6@D&UP*=r8Z(uVsDDRlf$8k{ew~70;5yb0MK@FzkPI*|0g?|PvARKN-@$jqn#x+ z9S6T5&-!JtQvJ?%FueU+0Mz6UJZ;)ylg9D-#59PCfR|I{v9kEs5T1Swmz|`5pWJ!R zbbWg21z0j~JBO*8n$}A3Y60jdh1Zi^!`YM3R4GaDz2$LkgdUDle`J$7KOE;7%PqG) zU7S!sHm)$ek+G;0zq#HdhOcT(J2=m~XR_e>HCAohq7Z7a{qzX%?5LV0AlqJ01uIKs zan*SGVlUc{$lbx#BOb1Qlk^g1PbXdlKu7*<7mHi)-t^HCMKkF&hA7h_PG2MaSEOTO zP;Uf<6+uNVEFSWBOK}IPw8trqZ~nHc=baTbACUUFg7#~u$zM3c`U`Fs(-zzZPn^HZ znn*^yXw;*NRx0(+1&n`$Lvvus2HLIyse6mOn1vDXI|lZ4uB}0Nx}qx`jGwHJ(cb%XVFn{GM=qQaz^*_ zG+#HAhW0h(S7aQ?C@H;D+>0qS)>0V_`K;Ut6jI%cZP^f#BUfSh>re|EBb&-F)fLaw zF8=Gk^>5xXtlMh1xTB$(=8^hH5n=rF)(#@;VSk?-Iv3yroY4KK!Vs&aZkfPAq_{8h zqp%C*kJQ#r=?TVbY9f^R&t->M{)Dth>g4QSNC6%n3r={jZ$4713)~8QYCa^*!AcHm zE_aKB60^!mrX9tJhZnny-e^|D?Fk2C;^%y1zZn@^i_Yk0uO0uDrbHs<-2Nq34e(IZ z04Hlt2wb=(J(d-x5r<;*)(bv2$+MMUldC`F!?SHv5X@TT)7mJ~9AOtvuMM0J0Q(=_ zYYLTYs^uM4m?C=ZkHuWhugET%A z*`xJ9Si*^14aLGwk5lrX*wC8mH7Ahb`f~jr9*+mcfcv72-nyM$FfMp2BOfiD@GgTU zmltz<9=cb~aDLq;G@iYtm~Ps0Vj#5M77?HqufJ#_&~oXg28nvzDql}=EB{HvW13Sn zDAKAxh<>fvFIH}%vzHI%b^HBA8On3EqCxog|HQ4ZcB4EA^j`o5RrJ zL6e{lG3;!LzQ4{OY0pg}8+G8VY4096U@7FeotM_QYf7w?T#&m}A(EDDlT3FkyEcN( z9rqMya8U|upXi9VlL(_GZfrCGUHdr`-DC_tusF@#h>gz1FgtQ4RUt{0y}hjOI(Rra z#{56Xu7oj~Jk3$P7Y-?%*0UN<6a6b4`*$WvaH`zP#R3C>$YdH}{DzhwD~bk04MQvs z*IiixRbZZH^eA1b^ZtoD-QP6Jk7af)FnDv@vqFd~wF|qcuKD*imD5+0a!zVFGa(Me z9XzDA1{g|rN3~5*Aw_HraTfu$Xjc$3H!lN)Xb!EocOemPYb=C_;`!O(2qZm84>n3$ zxty|6FaQKpuh}%{*WAr54@uQD0SkqAUqB&|zjj5Y}onkH;HT5w`vtXKq*?Yl6Mpq)4yx4=qYZT0$-0`h71Xz0( zYDMr}V{&Wb-;84jt4D)y2(9qtEyI7JS-XI@n5^EZxCM{69M__`8}hrvTw^3mbR9G_ zuDNXfaqydrP%#dT2avHj$m*rCp%2!5)B98>A9!A>s&p}+1Y-P9IN}{ zAnY?oJX30x-w(9kUZ^>oN+R)yG|lL7O?bjaXYzb;wqz%1FWmNde`2f7hE3H%mYa-^ zO`oiiU5!>i%G}Z!NpGUxTzHiGjB`vJ<@W;T$I-O&-)O+eZ z5p}=#oxz9m*l2-m?CW3XAm2so3;n z!jlf;jOJY=K?U=9RTS&KfM}FWyv=%BCy4E{TZij1vm%-)Ive$$pJ)@z+6Evn-19Xe zA#S^cOd)b52LN;_oM$+qDGa%YvP3eji}%ymcsVyEiIuGJ;iO}>e)FgYY}~~GVrJ_# zI>{OIO`aQhPfW!8>UZ6q|5zpn^YP~M4&_(p^t5d8ahn7zo-R27e6ed*CB<4x*|eYk zRnz6)Anu3b=zhnm4x{raI8A^L@_n4wB}qh+3p{P{xA#oTcotR&v0LGgDi|?1Pb&mP zM`7FVqmSg{tjL)JS&E9_?(79XTr8;-Wu!DINsnZUG6dlfdAhE%26#$ro#4zHq{w5YDG(F8in4s?@G}amkmxaKWpe9cj9aI%cfVLlpst@~459hLJ2_@J+`jc3b zU&bMa)ErD#=~dDFRt#n^^WIA^R0w>WW6l!`jM>81Up$*Z_s!BwCsT`?@brsPW}EUo zA?dhV$4)N}fd!*_#rK9v(})FhnJ&0k0lOAG3t_;;Mk$UkXPpL`=&(tDf+?SR1?It9 zw~_kkdz0(O>PmQJ)qh+~!E0K;1iCnI-KVn%CD3E*jqa-<(wXp6BEwxyX3i~aH|`5r zX>xTbU=7!C)9d&P)4uKNFqHe1nEv$KT>t(+FM6>qt!v0BOHA>v-aW7~kNn z82^oAi;gj-V@n;et-*Zr{>~b~?l9wCYTiY%S#^WNp74x*I+`+Q+{-Jb5MdeKdJX2| ze5-FE)?ccAJKyk*fb5QTby|p4A~~Dxf9aapSn=qRrFp@&*#9xdTH$`i#HrwPM%Dd3 z*TZ=OC)P!InXW#@*;=Qh#!nnFals6-aKw==96URTRfYjnK(@>fpW7O49SGWQG`vvDak z(P6QxsAHb4*gP#I%wCpGBFE?G`Xw}dqU3MEHqTBqg~9Hnf$%4A2bdRh6a0K`aFaFh zya{bAU{ey#%Ta&RkH`kHRnkI!&Nb+zrugAEI`X51uMbn{JnZv;`DqBa>k*zDRJo>V z@^nB5(Wd>|G6stWhDf*}_KVmS=LhMR z*q38{K{RnS<+9?NjtK_X;=#=T(2=<_>=k=@cAdYzXM_RJ-*QL`B_n<#W5ljCqAahj zHQex|-0lampB@Jh65LbhLmc3cIhRtN=WB!nO$5+@hul?Jnn%H=Tf;O&p||eqL?C>_ z2H0f--}Xx#xQnwJ2Co)>t0Zh&J%0J-R+hy(GBmDM8 z=>GCYweQuT_9^HlY`Mu9WgScM?{&kpFrQ@3K#E=X!F$7_ZaKA*7|c-Ie`JEmQPXsj z@zvt;0d9VR?aZe-1#^82wfOj`Eb4P%W5G4<8b`sbs&1Bh3hn=ud2J@DW48`c)@fV8 zG)MIwX;9AZg-xq4vtHlW-8=jiGIg?`j)Sql#Q&NIT6F#n4C}v%#@5Bq%hl3!3M9D3 z)lB%FQui`aC=6sbd2IS zxa&x4fpHWbw)8}UrL0wLBO6%1_)s5m6M2Im0U*T?0Ig0#&*v3zr3)Qfxvq8+j=WW} z`E1T{9%#gbeh*K!0`0TDDJ~mN^Yg?FWMwUUELyJqKg;h9a#3-$I1fhVGk!j{IkMR= zyoHqwcCYF-9g?F2mzL_<&l)o3Y=mrWh>AbuH(@`^&cR!rb-G+V^M$x3DnFYXL8xJ8 zYw+EM-d;izD}aCHBOmeJ1@6J}|4&Htgs33`4O@+Q0k1f)J3A5lnfIVjIe%vIx4iN;8LB$bVl2%6Lq%MO`rRv&}~PoE7yE0*b+|?jXJ=l|sN6DE$c2cTQZCf_YfU zYjrJ+dGeAM3EL#gXgXbDdK(V_%(h2M*=`bnG7U=0T1P?h65a8jnZqd|j=Z9GpLqK| zi-nn~vk|2-{b0giQ4bPjdh2Jo$lmb2h_{Of@RH^&b_=H-Z4QgwR|~sweX1|BMEc4j z^y%-S+}Vfw)#h}LWSpifJ)%!YtBQIkM6x+J)0MH2a7StvUdDcw(_ikKgaUU#5edr8 zG6Z4@4xYbb)(lM)+uvYI!yBG?ir`wOpsTST5wxerCcFFPr*>xBOzJz2rA*;A@@PSqwd7(_CzgCR=Pf=qBKDb?q)*GwWwEpex`FX1&rtOd6g{}-m*OmQEM;CN zB9@*Swm;t#KQ%WRABgMCnL0gqNCM3PCXO^+(G_ru=W5xwgInP-Cw{%n4GqSjq_C#7 zz=)2ENP!XKBe)b4xbrMzI%4DPM2JROxCj#kDPMpu7Rx&aS?3o+*b~;1QdQigwSVb5 zjj%bemltnuP?#j7vG2u8!v$$ykIALGIl#_9j@6}!(?C5Fpy^BIhMATX&0Wg4Djaa} zQAgvRo@?I8g)}(26y5}jM_HR?G)j&`>(Ys*>6imyLxEm!18wb&KLNL&w`7A-ov#Uc zx}Kt-9byjqzw&dwF}$!%GelH!6{17z2vRFy+kVh)r7O~DUUdpXIO_v2GNT_yZ!gRe zYpu7|@sd+oc7vlFB=Vm5TTl8HoVEoXOXXs+_ZZ-*W(N?NON&=!+!YGAE_~mEC85LT z3lLv(5dm9{m8EPZ7E(pR5&qd~pC^gzs~(&V4D;QC2f*GtcKwm=63Vxc;#pYL1rRZ~ z1@COeB#;j0FfFRWxhn#f?;$u)$Tn>L(;8mDp0tIV^3rySLwguqy^0|kOX>$ah2X79 zZ=M@DI!`aXcV?N{t$qqYx_462=F5PYggti31OcTvpZBa29;z%a0`0!c*ALZNeuwPV z8K}%_19Rz~0Gh+#N)v5u)XyQczL`{52(HVQzIHS*NMnq*CNWhuixm$ly(uv8YX#wa z5p@nLSo%Di83Cc8A4tQPPJQb9IfKl4<>pt0(79KwS8BhOMN6%D*|E#_Bib%l^S5PN zzjU(+&~{+Re4ra&XrQmZu|xD-0G^cQN|jyb1Ao%H4KnH7NIui$UtTGtyhS?3tp*h!5YY45#qBxor{2-RdXAE7r4`@2kb2{qKS(_(=B?D# zdX{vA?vpoB7$h7j%*FkGN1gqw_`sKt180vs<^v@jl>x;T|jEeXcFZhk@6Oq4|2)8i{@1Hz- z@C4~3PON@ftK`spla`DaHMhRoCJ}=9^Dsq9Se_jTTxX?hyr28vphMUUKPT?!9uNPQ zLss7`A0Xz&gPtgE-XNmwG-{ zlaRJXl-kJlzv9m#v{`tx95?90Ywlk0TM^RsOm0_)zBl&{UD4YedH3SgTzJXmx9IBs zO()ho`vbHej-75e^b*n&$kc~J;6C>+MIM&AWD3s{Q`qQx)MMnvovY^)D$;%&qV3N?N*^>2 z-u#lKws=LLNogud$FGc_y;65Hw3$^~x+?gcSD)}(X*2|hUV`iG+DUjQ*wEZ6&&FTp zJNl6r&)l1MK33}F61q4}s3XZ+zwON3kN(Bi{Yz3+J;-6XC~VtJabaJy1Gz4lQJ#d< z75P#{z7%-Y^|`zG_`kgXTBF6i29IBk69-j+n^%u_uKuBjGB@H-aET?#pZ_Q6 z^}8DU?71r1Rouasa@2V}b&G!)a*H~{KYK_2j*tdm`%3F*_{vVYYIck8_~aCcT-@_h zmT&hKXzGLle!B7nBoFV||N*4!>>#CRuR=&^htir=}$E=&I%s#|==AZRBR3xt^_l@%oAob@^){ z=Z25FR5@vr%gW3R5~*cFtnLx6E_eEpGJW&qfHoo&qKjRrkl0n2qVcAWl8}NGP;1`aKbvr0sSQgJkdL_*0ZiDw)ztE_$8FK+d6wP(%%W4lA)TgLUBoj9bSfUI|&3a%Fge_mTxK2S2k-(MK--BS_ zb|s<=uo^mnXtZRxqZQj;F%S|We_6p|`dj&SKmBc*jfuzTzCTY8?9=U9=QD;$;LST1 z(ePniL+^6CT2e(&RC1fRgu9cXy;+eJ6g!+r{@tdam%MF`$c=uz# z<;9mk(A6K2ri6tqik(#g-KXAS5M6nT3)K51BwoF_llDl(RWZ9fw_Oh=07d zz<4GQnUo|p%bvTZ9xsoE_QkvR>u&9iokpgMjsd5y@?}IH(UYjLeeo<~6m*r-S`TAb zIbR}~o*0?|reirhZ2}OHB|Hu;+q5=mGH5;HH+#R2BwH(PFIl7>lJs7&N)Qy_=l3nP z>zCNI;^BikRlgs@d_V=ICEnNAkIWohp5iegjHI}(CwqZ+vL_TOJpDHxNV+Z(S7oxe zRTaqHuD+;9+oOL(H+3NW?C^N=4pESdcYWWxhX?YwDwPn)b?)RqcMY&jn4=JVrdSUA z;Q;X6gZ2yFLnQ|2eF?rA(;)+~g6OvOoa0b>7 zffSNhEmCIEsZC9gj3BFo+4sz|yL+biQ9~NTi=zY|uLu!9r=S>CIPMxOSvgoxQ6&g5 z%C94CT1(@lfhgozeY8^Kab?@-|Bo8hAHnIPtnhdH@c|3OtqPWDJVf>@U-hQrSH>y` zE_a({ORY#_e%C0tW?7G=F{;;gnJEkrbFv;MNojp^co+5Bj(wuor@n?ZpUq7LbG`

    #h>@_p^hpdH6JMq9y|u3yTE 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 E14Y~0sQ>@~ literal 0 HcmV?d00001 diff --git a/icons/turf/walls/sandstone_wall.dmi b/icons/turf/walls/sandstone_wall.dmi index 4118a3dbabf27be7259a63360b1c86b6cee78522..d53e686ee507f140e102a9029b9b2853a8ebc078 100644 GIT binary patch literal 2576 zcmV+r3h(uaP)fFDZ*Bkpc$}S<%WA_g5JlJ0SD0km7VF`vUUU-@N*2v81W_xoLA8Qq68iUb znl4l5G2ZAgSIlr`E?yR^&D(ZYtlzit9ERMbzIZL{Qz^xzYsPlk7%fE`x??-uHhJ`8 zn3jv|`zDX65BrOc@v&S;(R4$eu9Osq!GDI^`Y(Z^0!;;m3M>^=RPam%jtX9=pvK@h zYRp<;*b38D7`MW_HScmlvQP>Fa-Z%i$WiPp8m>(5^q; zkFKWE5dGKn_~G}HBBpe@_tZyBdG1roVzXQS{3U(^Q8WuB)F|ar000PUNklQ@;(f$6e-!Zc@53qm{X?r@JReiee@ocr!?9aDd_ARy*sY)f4R&I++v7 zoKohbqEm`)H)19L-EPEr{<~IS8JGyn?7&M|p}@IaX$6*{84JY_W9UUfF&UcmTDwRS zF%wY!UWv>6JH%@XI3NyL<}Q|pe(vDA11ey=5O9EB=-|@<{EqQKJVQUg)cW|QHcJSSAEV~`yO99dFw9jQf_web+_&ZHN$rraEn%<_lA8caAcPZodl0`n` z14kTuj{p43EAa5Abm6}#B=R92I^*yg|II7#@aJ^qH4gcZ`3}heNlrswLF3?iC*+hg z4*Agb>G5pYvI<%UKPlw`us|=qf`HVmj0$c33Ico;BENuu)o;ND1T=uLLW{qO0IZM+ znEeoJ?iN%QfZdLD!_`~B7Px|dg7hd`g0I$g)4?s5frk-@G#X|C zFi?TO1lo&-Vk|VngrORSW+M6pjKL@iPFXN2f>S17hZQ;nh;SXlb2gv9BN#-B{Q-1- zfK8 zF4bI@F3fc*=Q_24uJ^NepFV`PTOa6pKa2ON9k2r%+&|zBt>%Vy`SSgw;Bszo%LLHy znh9Xxz3>Ob1^qE?|G;p0=@4T9HW8b$aZJgK6CfTMct+j(2ki2c;8b)QW7=-i{sE)B z<01V4VK}l2ChZ?E%1Z*M>Fm?A{R6}0skcBGJlN#**vV;8-h(zjpbekrG?aq5T8n1uV2^bIG7W6Q}ut@mLoi z7Nr~l(tN>qtP7BCv_rsM>%k`hG@j22pc|b~u!&CsNN83Tz_#_gH4dx`&=#l13pnf? zSQnrz&pQMh9Jmv};&~{*v;$)*6arX04+Szzn_LKB@w`s}f9Qk&9?yFOV18D862Rj5 ztUzW5Mi?F;fW`Agf%8nUE`Y`J9sy$pA0dFn^Bw_XhF>9o#q&_185fLkK!gC60V=fc zq;wPD6R_~UVlJS13)}?Q?;BJRFt`5qCSc+BjJSY>-!t+HSh)ojnyhBE+SB#w9s}jt zL7oaA3l{481!rF0eE=I8nSd)S*_b>PFn`g?=0`k)#gN*CjxG-+(P#vW?9o zLHjN7>i6j1KWXur@ooY1{Q~Fy1ANuXGHq-=K+7-qDB@Sh5?o-#vur*<%P)8$z>MeF ze1MW)^2f(;X9zHg0L&ODK zAr9C;3)}?E>xQ!*f-SVbhZk_O16vc|m|}PD7toRzjhxExJza1j{uLwVwJ!P#lzOLW9Ap5pL|81rL!;)BWAY2r(C z#Nbh&gMk?HV|ntE(fw)17bt{R@Tt(nLX7#bJo(Y={`7LeYjy!TbxZ)}$MWQN%lp&p zg5GeTV~>75V$6@_$?uj|ZGoGBi`)Hr=_n=Y3e39|#`}mdKb9x{enIUP_~-&|cA%Dk zs)JGW;kdd(Qr#u1@03<|%c}<_)kCwkc5u1@0cC|CC@h_-3&4jCAIilAh;9enay0=L z!vltCaRF$0(KIhE00$o&oE8^=!!Hiciwi&p1Ra#c1qc@mT(p%0ycPnU@ITiOa4|#> zC#)vm(gF}CtS_L}E!cp7Mia1BH|&2b&KImM;Nw06H#<=I7E~OJst?E29g^xUS#_th mx?5g7FsUD!)ecT;3-}*T3zK8@kp>_D0000fFDZ*Bkpc$}4!!3x4K42I9`QZoQF#kYd8!MZ?0<5X4>_|PDDXXWKk$z3pdRJDakOJ&9 zz!uh=E%>stuv*0d$0G+A69=?2V9VoMY>MtyRfZ9ikH5E#VTZQv z`8@-mS!UaPW7wgs+qTOr1K{arUDw#5sXFWu0Nf9n4)u74`t$|T5zr2*fIN;iv5r$l z!2RGer|1R%xgRhi>zuzp{R`&}NbnO55c&xR++vC(n;|vncAf$d1tee)P#k|gpo{}X>*ohB(?49pTW6{D7u()hYW>Al zJ4>y<*sQbE`US866aX~Om41LYh58QwEYF?)2<8r;+qu*aXh4#VfQD2lfQkb7k4$8Z z+z%LF?o&j?u{xlf22>0{J-M0&lwyE+p8`B)h-h{SkZ=RS0dH}@T?T+Lt2p4u^*;qP z`_bPR;8%kFr+{`#jR8{hKLxZwA=V*9|0n#&q{9MO0G|&~f58G+0Qvywc1}$ikf=#R zDmAGnpeB_y2>_Weqb8M>)TH8=npECXYaPlZ6IEBfpJ?}ra{-uvwU6cfbo*uZN8L47 zcdcdZ5dhHM7ZU;QqOQA`vk$8w0NeXwBEVfWc2|q$?R5yi_P&@3IA4}_m!sQ1768!R z7t;XUb#HgQyW3dvW1`(FCIe0v*4+j5J_HQfyWl69Mi#DLMjZmyJMuif#Zf2Uw=q?iF1JXTgh|88QNF4@STM z;whRJ;2J-m0I46$Vv0nY9RrBB>jZ!-;P5FDhD;6+27L;U$`%Tc3NH>2N=FLlzwbKn zs}BINjc>pg1^}oC#Jf5G)x3dU5r5Q?XY4=B4q#CgxDJD589ZZu$PU0Q3iPDFvG5uD zV|IXQ-oRdfTSM@S{V_X0HNS=33^%vn8T(^)fNFjZ`!R0M_>BF7>;Tn#4G{$c3_fH3 zAUkN6tgq(R5EC&(;xqQg_nj(yC5b_o0kA*5&sFq}fx-uMP@s#T0^fJ55qt-L@&3VI zc9;(Y`2kem`@Yc>Eq*{opbSvm?9{hw^?;)uGS!2=x@=JwUi#AU%d2Zl7%-tIq^1tQ zqz#igF#yv}OiQx?I@iF&S`5I{ACCsa06e_F!woS2k6-Y3Mhw6MBs^de15UZQ7v%7W zEE8Zo0K8yj4#0<_!8vF)z{d#S95g>bYl?0FFk^sR%e4Pkybs6@_`1Kr;s*qvxY?<1 t*XjXBJ!Gl}eRbKQF1+-m<5ySL{{Tmzo>$~T+EM@j002ovPDHLkV1in>d-VVS diff --git a/icons/turf/walls/shuttle_wall.dmi b/icons/turf/walls/shuttle_wall.dmi index 605e0c32febbf01b5c157bf5a3669424f8f562a8..c96b087f77fdf09ad8dd1ee23a14372b0f3e1e66 100644 GIT binary patch literal 5329 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 literal 3272 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 diff --git a/icons/turf/walls/silver_wall.dmi b/icons/turf/walls/silver_wall.dmi index d8a93212199543520abeb3f768a253b72c4a2542..f0f170fdfe3bf1481adff15a28c1552268954fe7 100644 GIT binary patch literal 2570 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 literal 1386 zcmV-w1(o`VP)k@Q(X_O*!^6YL$;sB%*4x|LySuxfFDZ*Bkpc$}4!!3x4K42I9`Qn82oVYry|Z~CCtpMKNpI5ke+9^=L9eFq%f0RIK#tZK^VVc!9A zrV0n$+Cqi^00bIIL_t(|ob8#xZsQ;jhW!YO59zf=N_&n{^#ziZ_FTmeknUm6?KA9y zubto;{}}%y!=!H4BUQpc{TaeA|3G0IE1SOptf{N)NIjYw*Vv({I_wev+z*-#^>~N+^aaup&-8ENt zt!3>I0MOnS69Mj`uDh7C533;n+xuc7z+E+VSBvKDbqK)rzL*L)UzT>4quW0g0MOnS z(*WIdZ+E@B+gS5sqTMSd15Ov#-39eN1Pt1}Vj7^ka<}e^{jk9)8n%1Ibim8`zt%B; z-|iK!05sln*qAuL80!@i0q#60Is#~yjX-^hZU8U`Sf<$S6h0T z4*;=^Z@?D@0H_GWyE*{Xyn$a4f7Fp@>_5y7U{Mvg4ufSGJY#>z4!|u6^rXPC@EQAK zc7ST$z+Qk`L-36KF*`stzlGflH@Dy!`(t*1YJLycTJjQxY`0M&dA5d{MbK4bqN zJ7|}zujbbf6EQ^MGxo>#ohp1Ki9weEus^=fRrHR5!UuIwpo^da-*>AKd{=r{% zm=6T`0aW1ozR?sden3W`3{c(d)VFK(fTJEV)q}peY*80p`qJ^st7}XcFrg@H$YRWU2>!b=jgWy!55xS6A2n07synSL8z4QUCw|07*qoM6N<$f)r1Eg8%>k diff --git a/icons/turf/walls/snow_wall.dmi b/icons/turf/walls/snow_wall.dmi index dfcf459f2a113cd42b66c12154bc9fe0b4ebc9a8..833f7245e4614330555442ea60fe385e2002e196 100644 GIT binary patch literal 2465 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 literal 1016 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 Y?-OC8AwiS<2f$B9Q(vP{{a)bz0Je#dFaQ7m literal 16177 zcmZ{rbyU<{)bD8!kd6VVp=6K_0qO16kk{ z&s+Dd`~Cs5*34Pwcg}b3ePZv=FG@pA{y8=!HWCujb43LiFygc4?;jQh;y-xB4ioV) z=dG>hCS&1h=3?#SX6@*Jgyfl>Iwgq{%mo-cySM_q|Fcxk>b}C1a++@plvAVrL7|r1 z<%d~F7u;Dlh9OS#6jAKN3blCdr8Cu@5lk)0l5mg8RB69ULlOx|T3e{eYmxtaX(u81 zJwuhn`iMjVxwI(f&xhvwWpgYB0y%nIOPWbyfnanQ^%bXPdT-op4NS{uLXceEgD$TYr2k4No=sFS5B=K3Y-gKPYSy-}fVx=1wuUAw%5y6=GT_tM2t46pwK zK1uhb54M(V5#e_B*;>Oo3=5dRt7m)j4!#I?o4US+J?_E1ah|h-~4(R z`+a)7<)JmeWZ-d`TFCNkI*uvCTtawHuXY{{rU?4dgppr?ixqT@w?~a4X{3tQx zt9o0h6-OPI%`=zDBiUP+I;a=&Hd93|5<-9?&^je%Sy3VN;<-@Xx9ifO$7NBd&=09i zW@RJvrDovVyEe72d^nIfK2>R@XT^MU1X8DfPjT5qC}ovXFKp#HI0NwBZ-vPH)?3RjhkupUbf*kv-X4JDBHNF`rYJuKvUd7hL)gj!c*ewvhm3c~a`$W}TRH>cbVPV#7iZwnKUSc)~2fPp4} zR!@IC`squ=^bbmyZzQ4<3BFt3hmzP$=fdD~%D&{!fOYL%VwX2UD|koOj@HX$ zdsKUQ_MVqp0v8}AtIY5+V&-?u;wJA@*RP9GM#p?M^*GY7(3Ef_xLSw#giN(nw05tq z()KuWxm%-1h>?Jvp$P+qV%(V}CR7-ZC^w@JR|+#xchYj37_w*LGGI0H582F_8X+VJ z67!@0t?Ae79{E!%>WoK9Ku88z@iUL2HbHB+;ZV2 zA2LPU?G-^hs>C3swz{qJgY0FGcNK3DUNotc({}$dVlK1UK5F#h$YR3VJt&1}>p2p= zvV)^zzy^Fojh^*X`i*RQz_Yin>Anbs^wJ^;9>uuxP_ua(PvfJGjin8kO3q(nfq*X? zxx)!Wruhh^id1=-TIbmn`g%3 zuBtYEQpk{5A=$D^VRc+60EO&)$i{;M{tWrZa1EC!j7NTustCQtaFGj}<_yextlLmO z$a8Y%cfP)iW~0}Xb^BRn70G&bjS5;WVOFsQ-* zoMM=#P?heb0*E^fuREqnx8}2$5HU^feZw4mQNOVKD1{j+kKACn9LgIjf(!zBQ2LlN zBoV+D4Dr8xk+;=3%KJw)v z^`L$dgsuAFZ8QfHBV};_2;0*tJN2b6A#`QLr=?U@LL-SIEZG z2~EQ{v_v7{%3*pg+_;J$c5;TQ?@D(z$iR`Bnk_$y)SdxWynMR7iRYZllzE=Yj&A-)zy+5=f zI|-6=Hx*1~ntU#EbDkaCOKhxEpkRibX(qayIrXcjf5=oFxV5xx^Up7rmr{WAMPg?X zc&8mU_ahH002Qt2iy`&#TTk245)%#v_P9%c_uY#Hhf!Rh%sM&Qplce@fWG_H+%fX- zOPetN`&oV+9p_uqK9|;hp$Pn-ip*1J!GVHGQX4cul44{RWzDdA_x571ltw(peM~U6 zYN`1lB=D`SN~f7u+VAUJ&4t?q3=k3MW!K&0Jj<;h^I6Kxo%+j^1Fx$v+30?oMGalj z?^pcr_}5T`O5qSn=O+8V%X7fLyq!g9g4>RcVw=!gw@zXk^Q2*4coe@aAJ{ za&}l3C54B8LZEeK*+JV)Kp0)P1SGnGCXv3b_2#O~6$&igK3`;tkpF;EoI;oWEQ(vI z1g)P{hpZ}kn6dkLptS~=TlM!eHPY8q>CsS+z|R&s&* z>(V3d-?~Zwvq;dF6scF^rgbu`Ki|+-M6nT7&SDqSKWeP(s3s2!6&|*I7m7$qa;A!p zp<_~nL=PAg7Ma%R|LPo4Jz0PPTo29)Qwl2B=n}w)WkLzm;rdN;YmoBrIaKKNgf5?| z)+c@jPm(V`i2Kq4#oaAN_=`UOR3h$>jPlI3EFW#3mD}okmH12E33C{v*~AW3%68Ru zmtJl@x@zC7@Yq@2kH~GqlaM=PGRx#z%D;|41xbnH8v6UIWx86JY71Htb{3Km3b*4` zHwnT{*BG`KoI+I17CXsewk)h#)`6ii(V>&b8*Isk3tiL;+3Yt@j$PX|OHiCWYladR z8*Gpe+)i|F*t|%INw0`!tE(tcfv-MTj&p3Cw)Zf3e->7%u{q^L>Y4I6RLBGN%9{0H2Pl zubrOEvIB1xQ6dR?_7YjBE~kFZ@QcOo8;C?pm^S^)XIS0n;lg!uP$!6E5zWF;Ov@-^ zuwSn4&Rysd)zBf0nM-kdR!nS=u0v}^Z=oO*qCm$ZlwMR|;-u2B?9^mn66;68oInsf zs#ip?vbr{TNexzdo%MXqrV$%gwUv(I@N~^7AYh_Ww>GY(p%j-kI-_uRT6AC&8xu=x zD_dGYpT}w_(F9O-KnYYj87~KherPqUe_uNm(W&>tIVLfiH_K9>LB100s-wlVIk3>0 z(%eEca`UB8_1o?2D9|+Sb0|fox6EOnD`|Vq*6uFG9PRp^UXdS(Rl3>GNJpUO4If7>r;Nh5($x8;${eoz6%i?n$Hn!r}oQLZyL z$nn59o;U_z3ZI`XI}oFY73cL%eL@2Z`Fk@FCGvR>sKt*>O!1rEXYB#r4?E&_%B{5C zQjy>MyoAO}Ht*u+-6pQs=0!_#J55ssOJ>A;NdgXQ^Ip?Ft;0E=VtrTY%zECEM)V|c7`KDMuKeVw^DO19e2c9RNIehtbsPg$P*Rc!R*|8as~PUZRrzn6@8HLLe;(MOoBw(clwY@D$ zQC{uaE~}7%MT4@y1?9G;Y_jS)JI*H~>hMx@Bs!UoEz6UR)b95B9OU1wD09%a^g=QN zzbp(!CSfLDoHYu9Xvj>UR`zks23SEO%0!tO=42t^WhcRGvDBRz&vP7! zNEHie@aslPGPCDvm}z6EZE1{X6un$nE|lemlxDaf%Rv)C_iIfsO=XUY5|adfmIOmr z_J=vb!)2HK!IaN}7XJR2;syZbDD);t0fSrZ>Qz(} zRLDWjtc;?WI$Hj8njSE@vrif%yK;E#4N@J$v^F=szuHUA|He;ze?KK)CIYmosCYw$ ztjMIuJ?WmOlK;{XB`2U+l2tY`u>#x=C_jiUqX#{^^NXoL1z+jC%IGjVVqR)y5)Xbp z6N@aVh$fOLB{a=PAugqZ(`KYkf)d1yQO%#8mzPW{%W~L=(26cpr6ovyo26?LCrBu|QEiWH) zr!Fo`@44hqs{13;^`DvA+K%0sj;yw`_oA2hvql94W{YR;R_%^YT$y7uk3B{S<8MJH z@lg@WW;X9c_qSiiy7NP;Mp!{}lzFI!F-(Z?DkjPBH6QaC{i|H5n+lU)K-b2qfWXa2 zVG~Dg>LPSPD1@anlz>TU#l2J=v%9lX_C+jrxOJvp^*nB6lnK>uJWMc3G1Ekz_}a1?{nbvyDx3bNAW zHNL2?iW_y}pd1~~n7Y;PdF~Jh_}(H*=ZZJp*KLVy(j&dIERCK*5M09>zllmD#id%~ zWW4)BP__6g6B86VfrvF*_BrMgm^@ginCz|c;B@Il9+mnNnjqY+uf5h0n>UxUyssJR ziAkVWGQ3UQRQ<6wnx%Z;HE(Qbw+zQp+BY_G0|8Z*>fh~n<&5yAIfy5*CQeFQ)m z3b$!8-S;VRmKuK#1feHiVC9P<1RVM6YpBI{6YavhKQ<|uE^i+OFqo8Ak3xk0NRYVO zV1b0%4FcX}U$}ZHftA8dejVAwa_?9zEr$dEf(Sb4#w;0_+qIu`!N#}t$u#^ z5)c%#fip&{tnh|P{`vKlM6EX*nOd7q<9}}#(2Opa*VTY5g;s7(b}LEq3p1`kr%z40 zSC^tvqw<>5J~kq^%3o86kXe|9_313W_=0E?dhWp}){VJ3veDNvN+X*=ac3!yx)oMN zzlm_Tc&9x|_PdZnH4e~d7A_#%J4tXXvQtC|sR!IK**!wx})VyVZ^;DR$9&_#Bq;jzA|@*|7N zH?6G^&OqA7iOf10Lj44DDRX4{Bpn%V=`;!xZ!i%7DHvaY^bC65c5zCZ-3*7%ufH;N zl)A#Ncv}QeP%MajIp87{`Rl8_`e>5ij5+e4_06l&qsQL}?IqgUN+&lIh$#zMeQz5E zC7=ad7Cs?UCTbxBMcd9X)3E$;o9}uNS*!;o+U4kZBdwn$QHJ$@Wed9 z%Vjy;E@E^8ZJeP!V4{!7bQVGU*hZ>Mwo`!cUIv|Tq!EcqbiaT*W%IYemy7jQMNEMz z*wNz|LI;HuW?%h#dkDJnq-wNsfaQ6;&<@qjT9r&SX0F9T*% zr5V*R|0BTw|G2e0u@`Q2=jP>lx$HnoUo5tHrif>$$`mgXB4pZG>GyG#)BgNcUn$G$ zkl?lo|B^yvVB5QGcI=3iS@SC6OXcMq3tn9XxqR-7mNZCq{kl8<(?!qrql7EVp4L%h z#=@bN=0hoZ;1qH(O8Y7m;5_V7(pGgf1z&7J(Pb`eUWaqM@a)T8HpO7L2_TM268{J3 z+!E17Zeb57^$fA`+{*|)lJ0JMo--3{7iRE67?^eYx8s92ig6CiQNlC4zWFga z2e#4dWA<^mEmRyG4ER-kEMU_x*vOWr*933m^nX@=*;7g^@vKdZKne{wDc4|7O8_R? z`hiSBKS%kN_eJyD0|gm(8@BW@A*@|Oo{f%8f8j}YYN!vGHSt#sEWR8c%$lY=TKp7+ z@EjyGK#mYqzUK4K1qoWSq&mfMhWYKQHKzyrkyA`U4sa}vUXVpq^~bDkHU%IL^i{b3 zhfHQfHb6CrfYEQAmf`zaK<3j+IK~khVY{9=7ez<@;TzU>{bUf37u?`QxJgmD?Ft`h z)2%$+*U5=sI{RhQO3J`dY{;|XlX+n<$I^)Rdpd48DM-BJ?)5f7_obsleN%WgQN%J0 z5G|{cA3hEe*VmmE{ zsr~V!tjih#(yzyYPCyleE(D$q*2R9`-?uy^2Y}*}^UJ@~WEFb)tnw8B_VgmNXW4NS zzY^3JH5Wlv*4+#PTqEX6j&OlLQYd+A8L1WrKd)NjhgQW)zWh|j7Hp4ykXCtVbLCG0 zUQQvYKi>QBcHE&|4m5Bn(9-erdpyb~z*}TS8c9C&GoNytngb%YcOBepognqqid+Hs zt-E{ANwD+TLNoguV?N_Og>59^pb1@aT`Cik;(Tfci~XOoWl||RS2aNOvtEW`5f=q| z9wp2w_b>r@Qn3dUz;Fuw3HMh9a&#xZAFI0cEXXwiqy}E5DV~Jj zS64T0^15__>EJ$et~@354W>CF$JtfA?<2U=IE4km>iX<^vC5I;I`VSeusR-1qyAk2 zr#GZAvMkP^>eE|ILQQe(9BV@5Tz{8frPm6mAlX5`qUv`iFz--^_GQw=gp!+E%QE5J zndWDw(r|t<5aV2m=TLzW(pT}Lk#a7@^rWA@RpB_36E=sXwdIXE1u&cJtkW)&rh~;3 zDxFjySsg*KHsM4v6Gnk0XD%2U6ea<^x)>Mm=*W^K$#%DEc{RvIuVSh+urdPL$YzK> zKb#r1fo{(b=EXoPRWd-acGuJq4#;038Ss~*+6CUdtt90hG}aLDtxy0>axBrmvKZ%lH}I1 zQFRG9F{ceIU>vCoh^fM+phCW_hCWncnlDU>(Xxu0srP{Jvjl!_c?3iaM0)K(JWb*Z zmBKh=b6oG*+AT3_r;ck+pFcCsNe;L%WD9Gpr^D_G#d@k3cXQ_U^I((_){L`q=jAK znHfu4t76a(Kp_zO&YwlcX`Cp7QH!e8>)l$`3$=jYt9xVu1*Wg88>qPV7@>4tK~ss% ztCPPspOHv?2{UnT-bLIQ{mvFkR!-2hn}8*HPYxnWXrU_o+R?8d{8+#dV1l$KiPD*l zQ6C#_#4rmJA^n!0TzMo{l$*H+_ zNuLJM!EQ3GTfltMV^Ef60Y14(s#)t&a(b{y_JVyn z-G>9BhMH!&6(AqE+K|}iBxnR#cX$l#HcBT9CI%{y7Qzj6bsF5GQ$n# zcChFde8t)*@4y7Ubj7BdB-fe+F!priAlKZ-C#Mb>?Kv^**z%eeWrwEoLa;rVS|-1B zhF4)K(S3e0FUDQ)GIMgON0L2BaBgO98sHBowi6kHQ5E$HtvwOwS>qT2twJuWAF0E5 zLrM7Dd9!|$cBA^jjjwRG0!hvlKC%@_L~brPPm2Q4$Ut>^Y-NX+M^~L6I^U-Y2YTQI z(G4nS$q!2AKLit?>`kCph?+M}4kipXGPA=2@S*!{1*$xcI-+#%{^;j6) zq?M$zyLTAk5;WCrtlmDqaIG<3CD5V|SJ5Hm^`k<4d>pQYUtN1$%nG}V+GUASp0VRY z$-AEl3|U7aals#(Taxy4!z+UNzHI9^eted=73Zy_x9IfwLOgADg%-cvI=k8QGpU3AW#Yhv>i25kz*U>e^zQ{Q&n--WAubgz>ze{TNPGH6X5;-fsB zVo0}aV~W-Ni(HJD|2wUIhQXI@%ei640P8S+WYoS16ajTDrh!XPc@l9gN|u{ag~&Y@dKgAx{4|WYo)T zktg?py1v(dRONAMy2PRBy31zPr=4Vh{dHcBxK2sZB9$Tw(fr!wp%$!z=46-VNi z>MERl8P324aW@xOlY$jZBX1_PbTU5A9pMXyLp2wp8!lW=)*jJ->fIqZlt9mu_v_q3 zLuyi$`rM##Iu6dNe5u#So((Hwutoc_nW z@8N%_ov~JYI~k%QtJ&^3rsC)0ZJvgVoM+|mF1Ze~?n=p>-oEVINo z6aG<4?4;MWB{M!1^i^$GR0z`MXj)qN~Y&FZV73u*@n zEYpH=%un~xCIG!!b#+{vUjXaZh=UD}iQhW71yzbEyz6@$zowjvl3PRt7lXO%G9Th1 zCGHGU$6sYFIPd0zBk5Z_lo2%DARdXy_TyZy@8@gP5zPAo`C6yLjq~@_U8bS{ zUXkhe9>1s@Xe*yKU{qQeNz32Im58VltEd0ML_D#6`FQu16Irc=oaMe!6n^|M#z-b@ zHrjJr5*+y^1l8}dQ#ss3;&4|_h?j;+M|6@8TZf{eL~10;A1SJ5VAz|97M+_U(u~jp zT3%#7G;BlR=@AK__??CcHQYV8P?o~N0-Zt&XMT4AO2a!@c$B0lDpKX}@Snw<6n=&W zP+e{=V>N?`9t+_OeL^9hGFPr5yMU~+or-oXnV&v2 zukNc{xT0d7OC`Mq>cz}ts+*U2Y*yp~RCr7VRYMr0qz|*i_`mv{TAst1rAU027NWtDUUrx` zP+w3}nZaQBAybX^8I&UUTHd(HH5b4jO`})KBh<4^5~Dg{v!aH;A84@uvH&{`yihZ? zD(jj65~iGZWLQlL#BBUJpn(OO?Krx&g+WmPFJecY8(yz&L1?GzW+Y!8hM7@ZP{TM; zLqBYKF*_Djars#_e(DThI1D0`%5Grc-6Z^Jn_khVGVi{!wnhsQlZs?aEF(*sl?x#{ zYNzH<{rtjfvHJj4bR2279G>0T+Wl>9+7i|uQ+NprNt#qHauf|#CRRe|+k6$+| z%2c$O)_LK+KC(Vj&kp$Q+*zpqE#CjBsVVIj3ect~rE1Rht|l}+45^rJ#L_U+ikuz9 z?4pKiHn=~%90)|ii(ndjlNJM}X?P&hc+GImYlG};u}Z72ro zvds;WjTSpIOTI5fx8IANg78jf_Ke@^$aYhYm_wmZKtzxSj0OdV|3H#gm&vX8XOn3* zVsxM7rP!EK8N(doxBRD$K1F1Z^Du;&cN$Cx9bW;EmSN&XA$fNXV}CSeQ%$nv$i~pU zJ|Z37ClSXX1$}T5UEI@8V5e40QHvTdMb`f+w4UJmhKEL7Yv8A4^YV$ptqDZvyniNj zaA6wLMJ={e3|U=R#T55EO9*6 zFrh;eBEJ~ggvLf6H~%eVz(i4kF5=p12;+YddDw_t-p+$TcU{t;aZ?k(P@T;56!IRQ zG%S9pRq2&!=341Oj7<$@}Zzy9s?&5W4n5MN= zKGA*Ci|_BWM3@bLZvJFv!&sDS~e0oFk_a}5koml;L+0M=Xr%Of8p^| z+3hhE)8BnR4{xgCmLWuJ?*u#!_1d#Cqe_+_47W_%kI8=>x zM39@N%*ZAD_)!$)6iQ6nFTn#KCZs0}W=0!W5IVWSt5i28&hlmc6~!_BY!;n*Iy3E~YpSMk8r1S$L>Yxbgu4-}Jx63_-m3Q_ zWzhoIuNO+!d@nN^Jg!7Tj?0S3WX@yzpY}&GPNteJrcjF)hfbA8B4rBQYsxoXt*pA= zOo~(1A=3Vc1PO3d-bi;gkx_6^umQp}oY4%b`F`B>Kocx6`n}Z6CR7i*Q?+2{ppSdvz$%Pmn^A3($seTh>)Do9VkeHhqI?XBFu7DNMhgXJL^>gApJ#qq0)s4OcqSdEBq<6&3TB2VLJ9|3r%O>t1nlW{ zP}gKl!3r5b^T8Ua2o3G+pkJh0CbCBHM{T&iZ;%n=`RuKT$3VBRE^o?4d&$MeC>~5y zRFqhc_SSCa=U{%J89<#@0Y{R-eDHebywbf#NLojTBiCc)eM@ADl0n1OP1$b`oVSPe ziSgc>H;qVZIfV1?4&HFnuw6bZxKE6G<_42yCA!p~ps(TWe%QvT*(Wf_QAFq0q@?p4#)`QUVTt zzafBn*nn&iqvjBuM8Jng00NzFefwW#2yqki$HTx0N1N)y@u^JL#NWSDV2taF4#m%(BBwHU=CWD?ocq zmMmJOyr#xbbBjbC7Y|1)wV<=Ie0@8E6UXM8I?skF1_D7}T+j3O`Lm;2 zhO89=?tPb8FJ5Qyn~CP<6dz)QCMbY1O3Ixkv~?ymJ<;B$&|6ZDj_~cVv8PkJix#-c zcuM~q=yShUqcNiz8wlRjV(l*_{_toQ<%$~nQu}A=ud=#qw9T8Mf z57`QQT?!8bE3qw+?PoAY5kxsxaWUsN$u}l`t5vF^dnuK`HkUTuFk5O!CzgYBRD*A5 zX!upHWjm#uRT(R{?~|5|T$rS+R?-$&3cL4f4&qb_Qp;1wunb<3T~10iuXAF_81)+f z6)BHKwQorcwZ1EVsW3D! zFp!9Q@X+vl32-3a6T5incRTB@cZd{JE)uD-s-|M5`ZEkptE41z8iYXMF3ttI1nu`| zk#l`Td%7{W_KX~KZW^!E!>^iqAmR$B697w zzL?yND)<*{>rTK#BXO4mo~~{9YED)iVgr>XAp~Cysy`MJN<%4VMGUMV{8q)57D*yw z?$DGiAq4fZv`>HfNMkRyd*)#Tm(0EILR70hbQ>p3rE$W4j4||arQFTaQzo{0d+8Hx zW@1#&7c#c4=8bE*4vGESC`$j9D6U(;UP zaEgoH(@pppi`=4X%rZz}-F+#ovBA3*b#T+@LLIc0c@>)wY`=8zxb7VV!?u4oxy#&f z8Syv%gP;Pl1DZEx1~xzWz?itjL5Mrs^1=x#*5?CJv0TIi=a`jO2mh5fct2WTGc%pA+USfrG? z(7R2wx=`0@$W1jG*Zda<>(tGP_j;f`XobbR3_t;xVSUk-A0YVMj9M9kj@G+aPhZ^6 zH;aWfNa-?)II?g3bYCbMdGr6^Tx4gR1SnuoNuNSmV&2pKE3$DEUh-di+4|z|{4D== zKhgE==06lcqPhtD-*~JffIPG;e{${g<)!+!w#;w$-m+wgW%O_MiNrOcEW5W7!CcRY z9nRS}4aj29x#j#Hx8LtqSfr{A_t;zh>&#xlbyC3h9>aspFPxyE5 z-Nw9H;Uk3BbT^C-i9CIB|1V#ml80~?i*Q-EC^f1|tHoV)FrdZOKPzUS8)oJ99&2ak{i;@kgni?o3&y%03p||+lF*Lyx-N!{FonNuy(R}-PsP^zb2kzM2R#L&r zVQi#|s?!Mg2!MZNPh^en z{*C3o)x{?#I@$e*ps|SwMOQUN2=*RZfyWFzO{?^O@IhvZ+-Xwvh$K`6b}>o&W6caf zWHWclm0)bkA^~>DP&vwX?b;( z8i?42(RC+ku^*d<`?VQmL-19!#;>}zoCHrd2XI0YV6%S%Fv9!f{_mLt!Rg5JWB`ak z6Fb55y+1H1J3azd5@l@vVmj>dO$6G5^kKhFuHtH73E=ugyRUBxbv{^OK$-xDr(MH@ zo!*xf367oe{~dqbNUZN%_KH)OaJVf^NBN{fT*FIfEGrVDSE0_Xt|6|(LQHd&q~pF` zGlTi5n}{*(9>2g_4XUX5N@l)n77J1euRnEPDwgBl>|FY5F%85bv|kF1hi{I(y8B|8 z&1^{ivBf~nTvFxYo9fvs-Bdcu5k69G3~?Mj=~j<0z*n7t4JW#Ah0pYJ+AO5jnHYtz zQ;MR54nO|*EhMUsE#rZrH{B&xr~}p^JH2L-=eq<3-Bwu;HUm!gtk$HSA+MDD&?N8$M9kY7ld! z6mg>&q*fHB5XtL*&z@}4=Gw`A2ITUJBB3BuE?>K~d;uP9VEi54_r*+bAF=vzS{0IE5m>fzJ1c4FNw&D;_Q_dhG|ydn4ZU7QeZ8_X?4>wH-P> ze!g*ulbx)Gld8&+q4Xu3fTbAA)gtLe$c6-nEeaGOmd>}gNCXjOkPs(lIn{i7Z0lm^ zzqY*qIv<<`lp!{)ZLPf_$7M1zHXR*J9fm>A#@CUEwPWf!x;%ZRiA|ir5)1{HC4gx> ziZS(>xWzpJjMuWba|!r#bf{zai;{{y$D#Pargx<`X13r7uuH%EJXZ0iUrMLjJGG7p zN`$6G6(rnp6>anto3{to>}_}oi)Pj4=W%seR?BHrJp+MsRO5pwqj7Wp3H@Y<1oZ$y z<}wj$&xrYnfBijT2PfLg%lY&$FTUvacbok)aj_*&U&8HnAD>5STsOd%OCY5fIl5jk z@V`JoX2{J+7Uaq)(;qWOt+oCof{d2D#jm}tDwpeh{1E!yKdA{n;a{#?hxvbvaDNw< z24K*W?vseTE8G|&x5P6cR$`<}Y?R#CKf&m@HuUv(cI$5a-?5?RDuouAtc_;?Bjz4V z>C+@qK6H3j_{s%KE1N(XX|A<-zVE$6kz4P1JwA>7SsfemAnsv)XLBNW$^Z zoVj2AlX1!BE_H86Jyjk#nV0F0cppF(D=bw-G3afyUB1yA)rqkG^)+XZY1SYh%H;ca zdu-G5tZ^I&ci5K?|KLSFe|lSD5qQx6YP0rWr~dIn`^v?6O!}X`9{-k?dp|BXIXv%YFP+JWr1F~v_j(Wz(}t4-NVWvc z{bbD!v3+9>L=6SNnSK8;C#v|9jedi;%1n$@*an7rw?Mz(SG{?xUQWbo8sUNx8$&RP z@T8Kno_N}1M(hzMmg|&JZ?YJf=|)^rmVPB}vQIlg+x}0!eeI48r^)iRMj`~RHWE+@ znMI~B7Q(5T7)1W4AXe-|uktd}gr6IN;5{Xj@*B4iQ1VJwYoR{bJ>P%~^F+;FfHxw} zL@;yI`2CrVF}+UirE2roDL%#FR?YMGV%`B0@S`p>jjjECEqKRWdIrv2vT-10L%RiH z;Wv**yc{N;BLlOGlNTDnLF>^kt|9;*#K4f_t~>6SRggNXQ(pdcB}kf0Sf<=gu&+C>#2gDGZpHB3|3pZn0k zpcJs(`mv%Axra3t%m1IPYWv<8P5XE{#I__`r&?;8?OK%Lc{PB({;>TVDCe-=v3pd- z94_P0!Zcty;jh_w^EW0-X}Ysk5Hk71cN+=xmusk7b?tPBzr&+N7x(Y{qvG1}-9UAk z4~=%eO{$Ynnr=YQl3};-6?-@lPDaUZJ@ZG2R^9$TKe#PzGO0l1;+KM|dbWxn=TH7> zM)P{Mb+4TR#FN0^t@_~WYpoXxi76&G)yl>b_6{@?RcCblCm3HriA+Q&C@3zBSU1le zkcd#8(7MBr7-i}SqfkQ=jxW7W(#1+SXWfBiyq3=I4*1*M{2GQH&C{y9!~^bjZ`|Bx zwZJYj&({uNxX&)T1BUbN#l9xzsTwNK`lPQvouxbML&W^AOO1t<#Kqmk+~ENi5ylD7 zycq+`%Q}y!f(_og{HqJCJ+13J@271$N1~abHH-S>=ed)ZO?i25^4j1t7cZA}^boxf zQ21qcw=rJ+XKPQZf4|hYzb(HgzgHIx;K`7e^gA+=GXEoayjKb>JrTcr7zyxm2)SEm z7lCI{iWJ7D2NaL^vE0r)mgb84KWLk|c%q)&P-=dBEq3*AiV-8<5_yHQpF{NBDO+?R zahtm+6Qt!iuyI35=3rUzdC(Lzu+&>lLxAF?u`o~^zbaB!Qfql1o+ z*LwNWDMT!7AZcboJ?GyazWl4tWZCEc`0nnOcx?zezvl<@J33*fZ4a({n(OhQ^-25q zg0}tF`sRvFB!s5Sg;wd`ai2GNaHk-KL^2R!`RB_!gMW>Rn9wMTl#x!>OK02a>pEVH z<|ocFxqD-=PjNBxx?kr^{kb0J@O)_K3gcUhE;jz{ZDfzLG5!&eHvS{=U)DPNi4YXX z(}njR-h$}(O>92mJNs(PiJLZGC2_d)aOu%syLyw(4XqV}A}01jmi}vc>7|+)wD*Ym zg;*gzLTq<2FL>0Ry8lD+Uqj`I`tW(mIf~Wg<%#5d`|DWUH`n$W2y;!R?;)o1-%g{5 zLH^ed5&U`Xq`Zz!(SI5;Pvmx+uIyinbiqfo!2dP<+%7@<12dQlESHw2FrHCS;eXoe z|F$!&urG6t!=q}DelD^T)^A(*EG*yzsfV)RHOjqk;iyg+W0ceBHj-s6$A_E&0{5<) z3!7hNdkpv#){T;x%pV}NsvTGdwz^6tVtKWkF%1b*uw%6(tPi;MmH7tf7;*-C!=LD{ z<2@2SQWOy&QYQw7`CV59pL>?xW&1v$fk!V(SRxR);Gt*Pu7bYx__plUISk8DY&CDc zHKFG|ojzMi4Vp9YJ61FZ;SR57O=Je82{36_KZu!N&Zs^IF#;@$+~e$C8uDXnZih)< zug6H=Elr~-Op|z}ZC%w%yjK5U0u;Q?yR$y%o+h3bs?Qk?iN7KkAk21O5MJtaX~I6R zjW575XnA@qW&gFUnrk@=DbvLAfb-ZPa|VXQSmkOioCtp~4ElmhPG3Q;y)LWpROVp;(lAn)R-2j z-Er3RqOYel49uMp4RmxtMD*Ej-Z<~sd}{*|*&uoO2#xW3aYM1&Uhbu4*=1J1A*|Af z>c{B=j6am?L%A%8wUYxz#f9m&lQs@5fecJ3CO51*1r8_R|uru$#lgqX)LnmEN3T9ZItOZpwlzl>n1M7&ce zQT@lebt*^*!|bs^f~5M9GxQ(n6#=0nSv&ndyRHN{p-321qN4pf=O0}=#uc_`KeVn- zh#Tf?f%hXIKhEv8-cK5YxWa6Q4CI|*wk?jgOYBOilI2!gwgQ6=zQ;z2sgsV)AaLBz6zns>HnQ%W&L^9WDi}KI1}m8JoIxP;+8%7E{rdhJ4Y@597kbD zV;)3DiPSfv{}6C5bWRyhfQ9~ zImvn{e!oQFs$dHLB(NTp_=BObdeE({-_3wQ*%k@uuOQFJS86zwKO*4F>n3Gqc#hHL zL2S|nHOxMZUuSl6Tb`&kcmC(|kV#zV&$++L1udK}eDe9s-86Sx z-`!HvRkJ`ZVj*)POiR1 zYy4(sO0zD3fy-O=#wn}OK}SePw|ZJ5G_ktB8{6V(I-MK7%U@KxT5bIC8MN-+D(Hff zbMiHN(VrLF3*NS&u5pN_$1*3hFqG3uM){XGGR{;p^Zu~iv*j0pS9l(;U%i3cYQ4V> zpecY}oEe>B#&&r6p>v@9qN=DsA*U~^&A~wiqB%_9=l8U}@;%0HDAH z0)&MGhV0wsDKP48&S!0DG}>`pnUngm2wiELgYwSC3T9d`Gfhc-Whns_9)wBVy%*)- zat46Nl?_bfi9s1QA_112vKRNfDLRUX~@!dBS8nzCazMuFL0056V z*qk^UTejp!y$A!`%NVb`-|zYPS3lq`H`+8pd7wGQ z*b}k#q2{Bp@?(FC8qY~o*UXH64{zsf`)pET@?{q$3mei@Qu~(78_rkL!1NG#L##

    i(I3tWOX+Zbq^2;HYRayl!RvS>rSm6oA$^FC+1*#gd{f1| z6$ZozDF7G^E!)e_Rk8%LYyo};uXT^eo4zyfyHb-f`tq4aYP^r5x>VL&isdL?yh9RW zTGiK>;u$N-5|`0Iku)xXL_{(Qd~c=P7v7-U_LcOKfl_rHi^0Kn3o_0gbZlf{OjM1B zmY+cF%4G82zM4jkzC@owZ8n9bc=Aj0NtgPp73 zB64{P;gPp{U+n2H*lvy->1z=mte8WCQXw)rZf<%1i^r#U9;fvlcto<9xIH3W?wo4k zK4kN7@BR3;f)}ek;g^DszF0TTg)@PBt+fIuWHGw8{n_=542Q#U#X08AlSbw$s&Bg0 z@rwE5#h;_t^7-yXWhL!#iRiG#JLP#(dIZ_tzmjRP^iexhQy$u@ARz0u3@Ka%-ogX6 zB524@R+t+O42qir*qJ;r*kI_ln;ARQa-t3!~{N$K6`VU50CXn%crMhimuFB4OpgYmA0zWS&}6`zDZS8FaomS;JB&hZ%IA z(f6jow89%6NgRC76WaI`H$_!I47Nw{X&++46KS%r!1Irj(cw?BEQBrx|IEVt+9ABq zin0xwEn0!E4sI}oHo|HKV+75jvT34Rv7JEENZ3yR=Y_sbYbW|$7#%nCAEwWN3&RKol5K` zprZ$iTmT2jK)j?Pxhgo0UJ&^6dYqTk>ehMgBg7*3vxnaA0}cnrfP*#!Oyt%v_TnOx zkboHb4s=N#O!}p7tx-AF5|3Y6nMzK0345`)(V&jz;@Iz?gwJ(g0%~W4aURr?lm2-Z z-|AwIKq+iRr6iaoxIvrpRDE?T_^@&jjGibe2~vSYcAP6L3{fb=ND$8i0))%<)QRRGGSBOjXADKYr2;8eI5^5WIU(>uVP;vXOWaa%sk20+Nce9cCk6MfT9fZtA9rK&&4M7pj36b zPO1F^L44tg1|}%urP)K)0-`el-Y| zi=IWRAk()m^hVJc^50XOQUUD2wUHGCmP`(3uXZOAZB?e2Tt3eckx3ZgNIc&$n%TJ< zmHekwm=k0HH`#ycnW4xe-R8t7~MxOv2XFd)qzI#w!+0uncgqmUn2VMBE41-IIjoEBTU$!$U&Bgk zbF$T#BBio)zk=mM!&G(rZb()|$;IP<-|(^He1-jK?R^IB$F2yzga8Ly7aQ_PH1S{S C=J^-^ literal 1520 zcmVfFDZ*Bkpc$}4!(F(#K6o#+$DP+6N$Z40|#769*y+TNHO)!lqNpGLED2Tul z-kksN@$(^Cl5MkVJ5ujkd{vXz&XNrg%N0gZ_hC$dR~U^-pT;l;A7oHzEEv@VM!lYV zN(`f6l4mu~Z>9n;9KZ+w!>9%LZR0brtYeHI#`H0IzgD*u)~sJ5ry^g3;ok+;Ws@jBlHN8|i|1tn>^`uVNzALt1y z8~ahD000D|NklMyl#R6aO%T@i#Up$XWrGYDX)p!};~SX|TO%UY_5+QC(0oSQ$DDrUV@8 zqFkOqy#b(YtF~>?!8DonEdbTh431j>4yWGGVQBoe0f4H*pUxOM^ld)`0Q2*IQ-Gg# z2Iq@0bm-gOwwOUlhjVHMA^`Ev;QShY$i0L1J)qIydcC59X?ot~7I6+c;PC;v0r+63 z1PHEh2W$gSgc8*m0d4*fKn6)06JO21E?Jg+uLK`xEN9kZEP|qx&52-1DME^@>(4_zp z{V#aP#^L~x{$~Nh${YuX^gjz=9d^Lu1F{dW1MVN74JE8;gCT3$aL$@`L1In2q_UdZ$%-%et$F_P@fS1{Z3IngV*t~4Y9`n2xs8-JH-`% zaewbQIs@o;iYox`{hRrc1~~mraR=NBfYYA-0Av8P0HE3_{tqDg40b>Ypa~Tmfc#(< z0I=UF%4e_`t}7;7O8}|`hXs(gB$8P&2^Ji`|5g;wK)2}g0HtiBE05n)|B6buVyvUTH(r5izJ&w;^8u`*e~=x(Yth#$|B4`b26goJ$170HpCA@sXb9`* z57_~#`3@2Q%m;!x`eSy0YW@Q87{hZ=M}N!?P|bI+qTm99b@UIigZ_!QY912+%m=WJ z{y1KNYW~;C8K8fV9W)?SwE!G%2iy;U902(M0stX^A^`e&x9EWZ*+az?oaPm6B>??# zy!_$%V-_6e4+%O*05Bg2>gW&SJ2{1wt#R2mbyaCS;e6pyt)$7styl z-!WkzutICN-;d`3YQXJU$H#(6of?4q{dgXr2F%xLUkyyG)c{QWace*g!2Nza4^RVe z`vtdW)BxN-!t($%V0@T2MUUqJY5;EH;U=FNfZLF`O}PWU5`bcW4T9YlxAxAPCph#^L&-7Mxkp<9UD@kbTk5E?aQFAI}5Sfb7x{_xtfYKn=((-~R#Q Wuw{!rgh{6W0000 Date: Wed, 13 Dec 2023 16:52:45 -0800 Subject: [PATCH 145/281] boy i sure hope nothing bad happens to these bar templates --- .../StationRuins/BoxStation/bar_casino.dmm | 80 +++-------- .../signals/signals_atom/signals_atom_main.dm | 4 +- .../signals_atom/signals_atom_movement.dm | 2 + code/__DEFINES/dcs/signals/signals_global.dm | 2 + code/__DEFINES/robots.dm | 6 + code/__DEFINES/shuttles.dm | 2 +- code/__DEFINES/subsystems.dm | 2 +- code/__DEFINES/traits.dm | 10 ++ code/__HELPERS/areas.dm | 133 +++++++++++------- code/controllers/subsystem/icon_smooth.dm | 1 + code/controllers/subsystem/mapping.dm | 90 ++++++------ code/controllers/subsystem/ticker.dm | 4 + code/datums/shuttles.dm | 2 +- code/game/area/areas/shuttles.dm | 5 +- code/game/atom/atom_initializing_EXPENSIVE.dm | 7 +- code/game/machinery/navbeacon.dm | 4 +- code/game/turfs/change_turf.dm | 4 +- code/game/turfs/closed/minerals.dm | 14 +- code/game/turfs/open/space/transit.dm | 35 ++++- code/modules/awaymissions/cordon.dm | 13 +- code/modules/mapping/map_template.dm | 98 +++++++++++-- .../space_management/space_reservation.dm | 53 ++++++- .../mapping/space_management/traits.dm | 31 ---- .../space_management/zlevel_manager.dm | 2 +- .../projectiles/projectile/energy/_energy.dm | 6 + code/modules/shuttle/shuttle.dm | 1 + icons/turf/smoothhardrocks.png | Bin 0 -> 1521 bytes icons/turf/smoothhardrocks.png.toml | 14 ++ .../code/game/objects/effects/landmarks.dm | 2 +- 29 files changed, 406 insertions(+), 221 deletions(-) create mode 100644 icons/turf/smoothhardrocks.png create mode 100644 icons/turf/smoothhardrocks.png.toml diff --git a/_maps/RandomRuins/StationRuins/BoxStation/bar_casino.dmm b/_maps/RandomRuins/StationRuins/BoxStation/bar_casino.dmm index 7e40e14c98d0..ea3aed4e9e81 100644 --- a/_maps/RandomRuins/StationRuins/BoxStation/bar_casino.dmm +++ b/_maps/RandomRuins/StationRuins/BoxStation/bar_casino.dmm @@ -24,8 +24,7 @@ /area/crew_quarters/theatre) "ae" = ( /obj/machinery/camera{ - c_tag = "Theatre Stage"; - dir = 2 + c_tag = "Theatre Stage" }, /obj/structure/table/reinforced, /obj/item/clothing/head/hardhat/cakehat, @@ -35,33 +34,18 @@ }, /turf/open/floor/carpet, /area/crew_quarters/bar) -"ag" = ( -/turf/closed/wall{ - icon = 'icons/turf/walls/reinforced_wall.dmi'; - icon_state = "r_wall" - }, -/area/crew_quarters/bar) "ai" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/rockvault, /area/crew_quarters/bar) "ak" = ( /obj/machinery/door/window/southleft{ - base_state = "left"; - dir = 2; - icon_state = "left"; name = "Bar Delivery"; req_access_txt = "25" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/crew_quarters/bar) -"al" = ( -/turf/closed/wall{ - icon = 'icons/turf/walls/reinforced_wall.dmi'; - icon_state = "r_wall" - }, -/area/crew_quarters/kitchen) "am" = ( /turf/closed/wall, /area/crew_quarters/kitchen) @@ -100,12 +84,10 @@ /area/crew_quarters/bar) "ar" = ( /obj/machinery/airalarm{ - dir = 2; pixel_y = 24 }, /obj/structure/chair/americandiner{ dir = 4; - icon_state = "americhair"; tag = "" }, /turf/open/floor/carpet, @@ -119,7 +101,6 @@ "at" = ( /obj/structure/chair/americandiner{ dir = 8; - icon_state = "americhair"; tag = "" }, /turf/open/floor/carpet, @@ -140,7 +121,6 @@ dir = 8 }, /obj/machinery/firealarm{ - dir = 2; pixel_y = 26 }, /turf/open/floor/carpet, @@ -163,9 +143,6 @@ /area/crew_quarters/kitchen) "aC" = ( /obj/machinery/door/window/southleft{ - base_state = "left"; - dir = 2; - icon_state = "left"; name = "Kitchen Delivery"; req_access_txt = "28" }, @@ -208,7 +185,6 @@ "aK" = ( /obj/machinery/airalarm{ dir = 4; - icon_state = "alarm0"; pixel_x = -24 }, /obj/machinery/light/small{ @@ -233,6 +209,10 @@ /turf/open/floor/plasteel/rockvault, /area/crew_quarters/bar) "aM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8; + icon_state = "vent_map_on-1" + }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8; icon_state = "vent_map_on-1" @@ -367,10 +347,7 @@ /area/crew_quarters/kitchen) "be" = ( /obj/item/storage/secure/safe, -/turf/closed/wall{ - icon = 'icons/turf/walls/reinforced_wall.dmi'; - icon_state = "r_wall" - }, +/turf/closed/wall, /area/crew_quarters/bar) "bf" = ( /obj/structure/disposalpipe/segment, @@ -390,7 +367,6 @@ "bg" = ( /obj/machinery/airalarm{ dir = 4; - icon_state = "alarm0"; pixel_x = -24 }, /obj/machinery/camera{ @@ -530,7 +506,6 @@ "bC" = ( /obj/machinery/camera{ c_tag = "Kitchen"; - dir = 2; network = list("SS13") }, /obj/structure/closet/secure_closet/freezer/fridge, @@ -586,7 +561,6 @@ "bJ" = ( /obj/structure/chair/americandiner{ dir = 4; - icon_state = "americhair"; tag = "" }, /turf/open/floor/carpet, @@ -637,7 +611,6 @@ }, /obj/machinery/airalarm{ dir = 8; - icon_state = "alarm0"; pixel_x = 24 }, /obj/machinery/vending/wardrobe/chef_wardrobe, @@ -766,7 +739,6 @@ }, /obj/structure/chair/americandiner{ dir = 8; - icon_state = "americhair"; tag = "" }, /turf/open/floor/carpet, @@ -774,8 +746,7 @@ "df" = ( /obj/structure/table/reinforced, /obj/machinery/chem_dispenser/drinks{ - dir = 4; - icon_state = "soda_dispenser" + dir = 4 }, /obj/machinery/door/window/westright, /obj/machinery/door/poddoor/shutters/preopen{ @@ -784,10 +755,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) -"dg" = ( -/obj/structure/sign/barsign, -/turf/closed/wall, -/area/crew_quarters/bar) "ge" = ( /obj/structure/table, /obj/item/kitchen/rollingpin{ @@ -976,10 +943,7 @@ pixel_x = 6; pixel_y = 5 }, -/turf/closed/wall{ - icon = 'icons/turf/walls/reinforced_wall.dmi'; - icon_state = "r_wall" - }, +/turf/closed/wall, /area/crew_quarters/bar) "Sb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ @@ -1170,7 +1134,7 @@ ap aE aE JA -dg +ac "} (6,1,1) = {" ac @@ -1269,10 +1233,10 @@ cX ac "} (12,1,1) = {" -ag -ag -ag -ag +ac +ac +ac +ac RH CC df @@ -1321,7 +1285,7 @@ cC ay aM cc -ag +ac aR bq cm @@ -1333,11 +1297,11 @@ db ac "} (16,1,1) = {" -ag +ac PF ba -ag -ag +ac +ac am am Tn @@ -1352,7 +1316,7 @@ am ak bV aN -ag +ac aG am aT @@ -1365,10 +1329,10 @@ am aa "} (18,1,1) = {" -al -al -al -al +am +am +am +am am am bz diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm index 4fc26240b084..5ff55578b944 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -3,10 +3,10 @@ // All signals send the source datum of the signal as the first argument // /atom signals -///from base of atom/proc/Initialize(mapload): sent any time a new atom is created in this atom -#define COMSIG_ATOM_INITIALIZED_ON "atom_initialized_on" //from SSatoms InitAtom - Only if the atom was not deleted or failed initialization #define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success" +//from SSatoms InitAtom - Only if the atom was not deleted or failed initialization and has a loc +#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON "atom_init_success_on" ///from base of atom/examine(): (/mob, list/examine_text) #define COMSIG_PARENT_EXAMINE "atom_examine" ///from base of atom/get_examine_name(): (/mob, list/overrides) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm index 3746bdc2100e..b1aa3a75bfc5 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm @@ -13,6 +13,8 @@ #define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" ///signal sent out by an atom upon onZImpact : (turf/impacted_turf, levels) #define COMSIG_ATOM_ON_Z_IMPACT "movable_on_z_impact" +///Signal sent after an atom movable moves on shuttle. +#define COMSIG_ATOM_AFTER_SHUTTLE_MOVE "movable_after_shuttle_move" ///called on a movable (NOT living) when it starts pulling (atom/movable/pulled, state, force) #define COMSIG_ATOM_START_PULL "movable_start_pull" ///called on /living when someone starts pulling (atom/movable/pulled, state, force) diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 1026950b9e5b..b0151607e40f 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -51,6 +51,8 @@ #define LINKED_UP (1<<0) /// an obj/item is created! (obj/item/created_item) #define COMSIG_GLOB_NEW_ITEM "!new_item" +/// called post /obj/item initialize (obj/item/created_item) +#define COMSIG_GLOB_ATOM_AFTER_POST_INIT "!atom_after_post_init" /// a client (re)connected, after all /client/New() checks have passed : (client/connected_client) #define COMSIG_GLOB_CLIENT_CONNECT "!client_connect" /// a weather event of some kind occured diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index a5ed9eb4b5d1..cffa494d5c1a 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -58,3 +58,9 @@ #define BORG_MODULE_ALL_DISABLED (1<<0) #define BORG_MODULE_TWO_DISABLED (1<<1) #define BORG_MODULE_THREE_DISABLED (1<<2) + +//bot navigation beacon defines +#define NAVBEACON_PATROL_MODE "patrol" +#define NAVBEACON_PATROL_NEXT "next_patrol" +#define NAVBEACON_DELIVERY_MODE "delivery" +#define NAVBEACON_DELIVERY_DIRECTION "dir" diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index f6a8b782498e..76778e372d5b 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -42,7 +42,7 @@ #define TRANSIT_REQUEST 1 #define TRANSIT_READY 2 -#define SHUTTLE_TRANSIT_BORDER 8 +#define SHUTTLE_TRANSIT_BORDER 16 #define PARALLAX_LOOP_TIME 2.5 SECONDS #define HYPERSPACE_END_TIME 0.5 SECONDS diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index ee485f2c4358..f8f06a0529b7 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -161,7 +161,7 @@ #define INIT_ORDER_PERSISTENCE -2 #define INIT_ORDER_PERSISTENT_PAINTINGS -3 // Assets relies on this #define INIT_ORDER_ASSETS -4 -#define INIT_ORDER_ICON_SMOOTHING -5 +#define INIT_ORDER_ICON_SMOOTHING -125 #define INIT_ORDER_OVERLAY -6 #define INIT_ORDER_XKEYSCORE -10 #define INIT_ORDER_STICKY_BAN -10 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index d9b21c104f82..a8ee313b311b 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -327,6 +327,8 @@ #define TRAIT_NEEDS_TWO_HANDS "needstwohands" #define TRAIT_NO_TELEPORT "no-teleport" //you just can't #define TRAIT_NO_STORAGE "no-storage" //you cannot put this in any container, backpack, box etc +/// The effects of hyperspace drift are blocked when the tile has this trait +#define TRAIT_HYPERSPACE_STOPPED "hyperspace_stopped" #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" #define TRAIT_AGEUSIA "ageusia" @@ -524,6 +526,14 @@ #define TRAIT_VENTCRAWLER_ALWAYS "ventcrawler_always" #define TRAIT_VENTCRAWLER_NUDE "ventcrawler_nude" #define TRAIT_SPACEWALK "spacewalk" +/// Sanity trait to keep track of when we're in hyperspace and add the appropriate element if we werent +#define TRAIT_HYPERSPACED "hyperspaced" +///Gives the movable free hyperspace movement without being pulled during shuttle transit +#define TRAIT_FREE_HYPERSPACE_MOVEMENT "free_hyperspace_movement" +///Lets the movable move freely in the soft-cordon area of transit space, which would otherwise teleport them away just before they got to see the true cordon +#define TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT "free_hyperspace_softcordon_movement" +///Deletes the object upon being dumped into space, usually from exiting hyperspace. Useful if you're spawning in a lot of stuff for hyperspace events that dont need to flood the entire game +#define TRAIT_DEL_ON_SPACE_DUMP "del_on_hyperspace_leave" ///Turf trait for when a turf is transparent #define TURF_Z_TRANSPARENT_TRAIT "turf_z_transparent" /// This mob overrides certian SSlag_switch measures with this special trait diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 24422b2d3313..b7a97f91c7a7 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -1,25 +1,23 @@ #define BP_MAX_ROOM_SIZE 300 -//Yogs start -- Fixes a very esoteric, mostly-hypothetical bug involving the fact that the /TG/ version doesn't use list() here -GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(list(/area/engine/engineering, - /area/engine/supermatter, - /area/engine/atmos/engine, - /area/ai_monitored/turret_protected/ai))) -//Yogs end +GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/engine/engineering, \ + /area/engine/supermatter, \ + /area/engine/atmos/engine, \ + /area/ai_monitored/turret_protected/ai)) // Gets an atmos isolated contained space // Returns an associative list of turf|dirs pairs // The dirs are connected turfs in the same space // break_if_found is a typecache of turf/area types to return false if found // Please keep this proc type agnostic. If you need to restrict it do it elsewhere or add an arg. -/proc/detect_room(turf/origin, list/break_if_found, max_size=INFINITY) +/proc/detect_room(turf/origin, list/break_if_found = list(), max_size=INFINITY) if(origin.blocks_air) return list(origin) . = list() var/list/checked_turfs = list() var/list/found_turfs = list(origin) - while(found_turfs.len) + while(length(found_turfs)) var/turf/sourceT = found_turfs[1] found_turfs.Cut(1, 2) var/dir_flags = checked_turfs[sourceT] @@ -32,9 +30,9 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(list(/area/engin if(!checkT) continue checked_turfs[sourceT] |= dir - checked_turfs[checkT] |= turn(dir, 180) + checked_turfs[checkT] |= REVERSE_DIR(dir) .[sourceT] |= dir - .[checkT] |= turn(dir, 180) + .[checkT] |= REVERSE_DIR(dir) if(break_if_found[checkT.type] || break_if_found[checkT.loc.type]) return FALSE var/static/list/cardinal_cache = list("[NORTH]"=TRUE, "[EAST]"=TRUE, "[SOUTH]"=TRUE, "[WEST]"=TRUE) @@ -42,75 +40,118 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(list(/area/engin continue found_turfs += checkT // Since checkT is connected, add it to the list to be processed -/proc/create_area(mob/creator) +/proc/create_area(mob/creator, new_area_type = /area) // Passed into the above proc as list/break_if_found - var/static/area_or_turf_fail_types = typecacheof(list( + var/static/list/area_or_turf_fail_types = typecacheof(list( /turf/open/space, /area/shuttle, )) // Ignore these areas and dont let people expand them. They can expand into them though - var/static/blacklisted_areas = typecacheof(list( + var/static/list/blacklisted_areas = typecacheof(list( /area/space, )) + + var/error = "" var/list/turfs = detect_room(get_turf(creator), area_or_turf_fail_types, BP_MAX_ROOM_SIZE*2) - if(!turfs) - to_chat(creator, span_warning("The new area must be completely airtight and not a part of a shuttle.")) - return - if(turfs.len > BP_MAX_ROOM_SIZE) - to_chat(creator, span_warning("The room you're in is too big. It is [turfs.len >= BP_MAX_ROOM_SIZE *2 ? "more than 100" : ((turfs.len / BP_MAX_ROOM_SIZE)-1)*100]% larger than allowed.")) + var/turf_count = length(turfs) + if(!turf_count) + error = "The new area must be completely airtight and not a part of a shuttle." + else if(turf_count > BP_MAX_ROOM_SIZE) + error = "The room you're in is too big. It is [turf_count >= BP_MAX_ROOM_SIZE *2 ? "more than 100" : ((turf_count / BP_MAX_ROOM_SIZE)-1)*100]% larger than allowed." + if(error) + to_chat(creator, span_warning(error)) return - var/list/areas = list("New Area" = /area) - for(var/i in 1 to turfs.len) - var/area/place = get_area(turfs[i]) + + var/list/apc_map = list() + var/list/areas = list("New Area" = new_area_type) + for(var/i in 1 to turf_count) + var/turf/the_turf = turfs[i] + var/area/place = get_area(the_turf) if(blacklisted_areas[place.type]) continue if(!place.requires_power || place.noteleport || place.hidden) continue // No expanding powerless rooms etc + if(!TURF_SHARES(the_turf)) // No expanding areas of walls/something blocking this turf because that defeats the whole point of them used to separate areas + continue + if(length(apc_map) > 1) // When merging 2 or more areas make sure we arent merging their apc into 1 area + to_chat(creator, span_warning("Multiple APC's detected in the vicinity. only 1 is allowed.")) + return areas[place.name] = place - var/area_choice = input(creator, "Choose an area to expand or make a new area.", "Area Expansion") as null|anything in areas - area_choice = areas[area_choice] - if(!area_choice) + var/area_choice = tgui_input_list(creator, "Choose an area to expand or make a new area", "Area Expansion", areas) + if(isnull(area_choice)) to_chat(creator, span_warning("No choice selected. The area remains undefined.")) return + area_choice = areas[area_choice] + var/area/newA var/area/oldA = get_area(get_turf(creator)) if(!isarea(area_choice)) - var/str = stripped_input(creator,"New area name:", "Blueprint Editing", "", MAX_NAME_LEN) - if(!str || !length(str)) //cancel - return - if(length(str) > 50) - to_chat(creator, span_warning("The given name is too long. The area remains undefined.")) + var/str = tgui_input_text(creator, "New area name", "Blueprint Editing", max_length = MAX_NAME_LEN) + if(!str) return newA = new area_choice newA.setup(str) - newA.set_dynamic_lighting() newA.has_gravity = oldA.has_gravity + require_area_resort() //new area registered. resort the names else newA = area_choice - for(var/i in 1 to turfs.len) - var/turf/thing = turfs[i] - var/area/old_area = thing.loc - old_area.turfs_to_uncontain += thing - newA.contents += thing - newA.contained_turfs += thing - thing.change_area(old_area, newA) + //we haven't done anything. let's get outta here + if(newA == oldA) + to_chat(creator, span_warning("Selected choice is same as the area your standing in. No area changes were requested.")) + return - newA.reg_in_areas_in_z() - newA.add_delta_areas() + /** + * A list of all machinery tied to an area along with the area itself. key=area name,value=list(area,list of machinery) + * we use this to keep track of what areas are affected by the blueprints & what machinery of these areas needs to be reconfigured accordingly + */ + var/area/affected_areas = list() + for(var/turf/the_turf as anything in turfs) + var/area/old_area = the_turf.loc + + //keep rack of all areas affected by turf changes + affected_areas[old_area.name] = old_area - // if(!isarea(area_choice) && newA.static_lighting) - // newA.create_area_lighting_objects() + //move the turf to its new area and unregister it from the old one + the_turf.change_area(old_area, newA) - var/list/firedoors = oldA.firedoors - for(var/door in firedoors) - var/obj/machinery/door/firedoor/FD = door - FD.CalculateAffectingAreas() + //inform atoms on the turf that their area has changed + for(var/atom/stuff as anything in the_turf) + //unregister the stuff from its old area + SEND_SIGNAL(stuff, COMSIG_EXIT_AREA, old_area) + SEND_SIGNAL(stuff, COMSIG_ENTER_AREA, newA) + + newA.reg_in_areas_in_z() + + if(!isarea(area_choice) && newA.static_lighting) + newA.create_area_lighting_objects() + + //convert map to list + var/list/area/area_list = list() + for(var/area_name in affected_areas) + area_list += affected_areas[area_name] + SEND_GLOBAL_SIGNAL(COMSIG_AREA_CREATED, newA, area_list, creator) to_chat(creator, span_notice("You have created a new area, named [newA.name]. It is now weather proof, and constructing an APC will allow it to be powered.")) + creator.log_message("created a new area: [AREACOORD(creator)] (previously \"[oldA.name]\")", LOG_GAME) + + //purge old areas that had all their turfs merged into the new one i.e. old empty areas. also recompute fire doors + for(var/i in 1 to length(area_list)) + var/area/merged_area = area_list[i] + + //recompute fire doors affecting areas + for(var/obj/machinery/door/firedoor/FD as anything in merged_area.firedoors) + FD.CalculateAffectingAreas() + + //no more turfs in this area. Time to clean up + if(!merged_area.has_contained_turfs()) + qdel(merged_area) + return TRUE +#undef BP_MAX_ROOM_SIZE + /proc/require_area_resort() GLOB.sortedAreas = null @@ -207,5 +248,3 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(list(/area/engin mobs_in_area += mob break return mobs_in_area - -#undef BP_MAX_ROOM_SIZE diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index 4d5f3069eca6..3902027b923f 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -1,6 +1,7 @@ SUBSYSTEM_DEF(icon_smooth) name = "Icon Smoothing" init_order = INIT_ORDER_ICON_SMOOTHING + //runlevels = RUNLEVEL_GAME wait = 1 priority = FIRE_PRIORITY_SMOOTHING flags = SS_TICKER diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 1b9a351fcc4c..5906283a23d3 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -132,7 +132,6 @@ SUBSYSTEM_DEF(mapping) require_area_resort() process_teleport_locs() //Sets up the wizard teleport locations preloadTemplates() - run_map_generation() #ifndef LOWMEMORYMODE // Create space ruin levels @@ -195,14 +194,14 @@ SUBSYSTEM_DEF(mapping) message_admins("A shuttle arena failed to load!") log_game("A shuttle arena failed to load!") #endif - + run_map_generation() // Add the transit level - transit = add_new_zlevel("Transit/Reserved", list(ZTRAIT_RESERVED = TRUE)) + var/datum/space_level/base_transit = add_reservation_zlevel() require_area_resort() // Set up Z-level transitions. setup_map_transitions() generate_station_area_list() - initialize_reserved_level() + initialize_reserved_level(base_transit.z_value) // Build minimaps build_minimaps() return SS_INIT_SUCCESS @@ -237,7 +236,7 @@ SUBSYSTEM_DEF(mapping) lists_to_reserve.Cut(1, index) /datum/controller/subsystem/mapping/proc/wipe_reservations(wipe_safety_delay = 100) - if(clearing_reserved_turfs || !initialized) //in either case this is just not needed. + if(clearing_reserved_turfs || !initialized) //in either case this is just not needed. return clearing_reserved_turfs = TRUE SSshuttle.transit_requesters.Cut() @@ -638,20 +637,29 @@ GLOBAL_LIST_EMPTY(the_station_areas) return reserve QDEL_NULL(reserve) -//This is not for wiping reserved levels, use wipe_reservations() for that. -/datum/controller/subsystem/mapping/proc/initialize_reserved_level() - UNTIL(!clearing_reserved_turfs) //regardless, lets add a check just in case. - clearing_reserved_turfs = TRUE //This operation will likely clear any existing reservations, so lets make sure nothing tries to make one while we're doing it. - for(var/i in levels_by_trait(ZTRAIT_RESERVED)) - var/turf/A = get_turf(locate(SHUTTLE_TRANSIT_BORDER,SHUTTLE_TRANSIT_BORDER,i)) - var/turf/B = get_turf(locate(world.maxx - SHUTTLE_TRANSIT_BORDER,world.maxy - SHUTTLE_TRANSIT_BORDER,i)) - var/block = block(A, B) - for(var/t in block) - // No need to empty() these, because it's world init and they're - // already /turf/open/space/basic. - var/turf/T = t - T.flags_1 |= UNUSED_RESERVATION_TURF_1 - unused_turfs["[i]"] = block +///Sets up a z level as reserved +///This is not for wiping reserved levels, use wipe_reservations() for that. +///If this is called after SSatom init, it will call Initialize on all turfs on the passed z, as its name promises +/datum/controller/subsystem/mapping/proc/initialize_reserved_level(z) + UNTIL(!clearing_reserved_turfs) //regardless, lets add a check just in case. + clearing_reserved_turfs = TRUE //This operation will likely clear any existing reservations, so lets make sure nothing tries to make one while we're doing it. + if(!level_trait(z,ZTRAIT_RESERVED)) + clearing_reserved_turfs = FALSE + CRASH("Invalid z level prepared for reservations.") + var/turf/A = get_turf(locate(SHUTTLE_TRANSIT_BORDER,SHUTTLE_TRANSIT_BORDER,z)) + var/turf/B = get_turf(locate(world.maxx - SHUTTLE_TRANSIT_BORDER,world.maxy - SHUTTLE_TRANSIT_BORDER,z)) + var/block = block(A, B) + for(var/turf/T as anything in block) + // No need to empty() these, because they just got created and are already /turf/open/space/basic. + T.flags_1 = UNUSED_RESERVATION_TURF_1 + CHECK_TICK + + // Gotta create these suckers if we've not done so already + if(SSatoms.initialized) + SSatoms.InitializeAtoms(Z_TURFS(z)) + + unused_turfs["[z]"] = block + reservation_ready["[z]"] = TRUE clearing_reserved_turfs = FALSE /// Schedules a group of turfs to be handed back to the reservation system's control @@ -664,17 +672,17 @@ GLOBAL_LIST_EMPTY(the_station_areas) //DO NOT CALL THIS PROC DIRECTLY, CALL wipe_reservations(). /datum/controller/subsystem/mapping/proc/do_wipe_turf_reservations() PRIVATE_PROC(TRUE) - UNTIL(initialized) //This proc is for AFTER init, before init turf reservations won't even exist and using this will likely break things. + UNTIL(initialized) //This proc is for AFTER init, before init turf reservations won't even exist and using this will likely break things. for(var/i in turf_reservations) var/datum/turf_reservation/TR = i if(!QDELETED(TR)) qdel(TR, TRUE) UNSETEMPTY(turf_reservations) var/list/clearing = list() - for(var/l in unused_turfs) //unused_turfs is a assoc list by z = list(turfs) + for(var/l in unused_turfs) //unused_turfs is an assoc list by z = list(turfs) if(islist(unused_turfs[l])) clearing |= unused_turfs[l] - clearing |= used_turfs //used turfs is an associative list, BUT, reserve_turfs() can still handle it. If the code above works properly, this won't even be needed as the turfs would be freed already. + clearing |= used_turfs //used turfs is an associative list, BUT, reserve_turfs() can still handle it. If the code above works properly, this won't even be needed as the turfs would be freed already. unused_turfs.Cut() used_turfs.Cut() reserve_turfs(clearing, await = TRUE) @@ -815,30 +823,30 @@ GLOBAL_LIST_EMPTY(the_station_areas) true_to_offset_planes[string_real] |= offset_plane -/datum/controller/subsystem/mapping/proc/lazy_load_template(template_key, force = FALSE) - RETURN_TYPE(/datum/turf_reservation) +// /datum/controller/subsystem/mapping/proc/lazy_load_template(template_key, force = FALSE) +// RETURN_TYPE(/datum/turf_reservation) - UNTIL(initialized) - var/static/lazy_loading = FALSE - UNTIL(!lazy_loading) +// UNTIL(initialized) +// var/static/lazy_loading = FALSE +// UNTIL(!lazy_loading) - lazy_loading = TRUE - . = _lazy_load_template(template_key, force) - lazy_loading = FALSE - return . +// lazy_loading = TRUE +// . = _lazy_load_template(template_key, force) +// lazy_loading = FALSE +// return . -/datum/controller/subsystem/mapping/proc/_lazy_load_template(template_key, force = FALSE) - PRIVATE_PROC(TRUE) +// /datum/controller/subsystem/mapping/proc/_lazy_load_template(template_key, force = FALSE) +// PRIVATE_PROC(TRUE) - if(LAZYACCESS(loaded_lazy_templates, template_key) && !force) - var/datum/lazy_template/template = GLOB.lazy_templates[template_key] - return template.reservations[1] - LAZYSET(loaded_lazy_templates, template_key, TRUE) +// if(LAZYACCESS(loaded_lazy_templates, template_key) && !force) +// var/datum/lazy_template/template = GLOB.lazy_templates[template_key] +// return template.reservations[1] +// LAZYSET(loaded_lazy_templates, template_key, TRUE) - var/datum/lazy_template/target = GLOB.lazy_templates[template_key] - if(!target) - CRASH("Attempted to lazy load a template key that does not exist: '[template_key]'") - return target.lazy_load() +// var/datum/lazy_template/target = GLOB.lazy_templates[template_key] +// if(!target) +// CRASH("Attempted to lazy load a template key that does not exist: '[template_key]'") +// return target.lazy_load() /proc/generate_lighting_appearance_by_z(z_level) if(length(GLOB.default_lighting_underlays_by_z) < z_level) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 1185be13bc9b..b4f2760b22a7 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -462,6 +462,10 @@ SUBSYSTEM_DEF(ticker) SSjob.random_bar_init() if(no_clerk) SSjob.random_clerk_init() + + ///Yog code, since we load in templates at roundstart we need to resmooth + for(var/station_z_level in SSmapping.levels_by_trait(ZTRAIT_STATION)) + smooth_zlevel(station_z_level, now = TRUE) //You should smooth yourself NOW /datum/controller/subsystem/ticker/proc/transfer_characters() var/list/livings = list() diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index a51cfa22ba23..6b164b749f6d 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -101,7 +101,7 @@ port.dheight = width - port_x_offset //Whatever special stuff you want -/datum/map_template/shuttle/proc/post_load(obj/docking_port/mobile/M) +/datum/map_template/shuttle/post_load(obj/docking_port/mobile/M) if(movement_force) M.movement_force = movement_force.Copy() diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index dd1e0a52e6ca..2ba493f1caa7 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -4,7 +4,7 @@ /area/shuttle name = "Shuttle" requires_power = FALSE - dynamic_lighting = DYNAMIC_LIGHTING_FORCED + static_lighting = TRUE has_gravity = STANDARD_GRAVITY always_unpowered = FALSE valid_territory = FALSE @@ -100,7 +100,8 @@ /area/shuttle/transit name = "Hyperspace" desc = "Weeeeee" - dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + static_lighting = FALSE + base_lighting_alpha = 255 /area/shuttle/custom name = "Custom player shuttle" diff --git a/code/game/atom/atom_initializing_EXPENSIVE.dm b/code/game/atom/atom_initializing_EXPENSIVE.dm index ac7cb6e98e35..379242c346fd 100644 --- a/code/game/atom/atom_initializing_EXPENSIVE.dm +++ b/code/game/atom/atom_initializing_EXPENSIVE.dm @@ -42,6 +42,11 @@ BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT else SEND_SIGNAL(A, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_ATOM_AFTER_POST_INIT, A) + var/atom/location = A.loc + if(location) + /// Sends a signal that the new atom `src`, has been created at `loc` + SEND_SIGNAL(location, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, A, arguments[1]) if(created_atoms && from_template && ispath(the_type, /atom/movable))//we only want to populate the list with movables created_atoms += A.get_all_contents() @@ -118,7 +123,7 @@ flags_1 |= INITIALIZED_1 SET_PLANE_IMPLICIT(src, plane) - + //atom color stuff if(color) add_atom_colour(color, FIXED_COLOUR_PRIORITY) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 287e5ab40616..2196eb34120d 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -25,11 +25,11 @@ set_codes() - if(codes["patrol"]) + if(codes[NAVBEACON_PATROL_MODE]) if(!GLOB.navbeacons["[z]"]) GLOB.navbeacons["[z]"] = list() GLOB.navbeacons["[z]"] += src //Register with the patrol list! - if(codes["delivery"]) + if(codes[NAVBEACON_DELIVERY_MODE]) GLOB.deliverybeacons += src GLOB.deliverybeacontags += location diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index a3fdfa780022..85756e2cb337 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -188,7 +188,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(!istype(air,/datum/gas_mixture)) Initalize_Atmos(0) -// Take off the top layer turf and replace it with the next baseturf down +/// Take off the top layer turf and replace it with the next baseturf down /turf/proc/ScrapeAway(amount=1, flags) if(!amount) return @@ -198,7 +198,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( while(ispath(turf_type, /turf/baseturf_skipover)) amount++ if(amount > new_baseturfs.len) - CRASH("The bottomost baseturf of a turf is a skipover [src]([type])") + CRASH("The bottommost baseturf of a turf is a skipover [src]([type])") turf_type = new_baseturfs[max(1, new_baseturfs.len - amount + 1)] new_baseturfs.len -= min(amount, new_baseturfs.len - 1) // No removing the very bottom if(new_baseturfs.len == 1) diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 6d8d875540dc..51f601fdb96c 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -4,19 +4,21 @@ name = "rock" icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') icon_state = "rock" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER + baseturfs = /turf/open/floor/plating/asteroid/airless + initial_gas_mix = AIRLESS_ATMOS + opacity = TRUE + density = TRUE + layer = EDGED_TURF_LAYER + plane = WALL_PLANE_UPPER + base_icon_state = "smoothrocks" // This is static // Done like this to avoid needing to make it dynamic and save cpu time // 4 to the left, 4 down transform = MAP_SWITCH(TRANSLATE_MATRIX(-4, -4), matrix()) - smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1 | NO_RUST - baseturfs = /turf/open/floor/plating/asteroid/airless - initial_gas_mix = AIRLESS_ATMOS - opacity = TRUE - density = TRUE - layer = EDGED_TURF_LAYER initial_temperature = TCMB var/environment_type = "asteroid" diff --git a/code/game/turfs/open/space/transit.dm b/code/game/turfs/open/space/transit.dm index 3ab965eb643e..3e641c17f9fc 100644 --- a/code/game/turfs/open/space/transit.dm +++ b/code/game/turfs/open/space/transit.dm @@ -10,10 +10,12 @@ . = ..() update_appearance() RegisterSignal(src, COMSIG_TURF_RESERVATION_RELEASED, PROC_REF(launch_contents)) + RegisterSignal(src, COMSIG_ATOM_ENTERED, PROC_REF(initialize_drifting)) + RegisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(initialize_drifting_but_from_initialize)) /turf/open/space/transit/Destroy() //Signals are NOT removed from turfs upon replacement, and we get replaced ALOT, so unregister our signal - UnregisterSignal(src, COMSIG_TURF_RESERVATION_RELEASED) + UnregisterSignal(src, list(COMSIG_TURF_RESERVATION_RELEASED, COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) return ..() /turf/open/space/transit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) @@ -21,19 +23,38 @@ underlay_appearance.icon_state = "speedspace_ns_[get_transit_state(asking_turf)]" underlay_appearance.transform = turn(matrix(), get_transit_angle(asking_turf)) -/turf/open/space/transit/Entered(atom/movable/AM, atom/OldLoc) - ..() - if(!locate(/obj/structure/lattice) in src) - throw_atom(AM) +/turf/open/space/transit/proc/initialize_drifting(atom/entered, atom/movable/enterer) + SIGNAL_HANDLER + + // if(enterer && !HAS_TRAIT(enterer, TRAIT_HYPERSPACED) && !HAS_TRAIT(src, TRAIT_HYPERSPACE_STOPPED)) + // enterer.AddComponent(/datum/component/shuttle_cling, REVERSE_DIR(dir)) + +/turf/open/space/transit/proc/initialize_drifting_but_from_initialize(atom/movable/location, atom/movable/enterer, mapload) + SIGNAL_HANDLER + + if(!mapload && !enterer.anchored) + INVOKE_ASYNC(src, PROC_REF(initialize_drifting), src, enterer) + +/turf/open/space/transit/Exited(atom/movable/gone, direction) + . = ..() + + var/turf/location = gone.loc + if(istype(location, /turf/open/space) && !istype(location, src.type))//they got forced out of transit area into default space tiles + dump_in_space(gone) //launch them into game space, away from transitspace ///Get rid of all our contents, called when our reservation is released (which in our case means the shuttle arrived) /turf/open/space/transit/proc/launch_contents(datum/turf_reservation/reservation) SIGNAL_HANDLER for(var/atom/movable/movable in contents) - INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(throw_atom), movable) + dump_in_space(movable) + +///Dump a movable in a random valid spacetile +/proc/dump_in_space(atom/movable/dumpee) + if(HAS_TRAIT(dumpee, TRAIT_DEL_ON_SPACE_DUMP)) + qdel(dumpee) + return -/proc/throw_atom(atom/movable/dumpee) var/max = world.maxx-TRANSITIONEDGE var/min = 1+TRANSITIONEDGE diff --git a/code/modules/awaymissions/cordon.dm b/code/modules/awaymissions/cordon.dm index 8e3cdc28e583..cbc31dbfa81e 100644 --- a/code/modules/awaymissions/cordon.dm +++ b/code/modules/awaymissions/cordon.dm @@ -9,9 +9,10 @@ opacity = TRUE density = TRUE blocks_air = TRUE - dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT bullet_bounce_sound = null flags_1 = CAN_BE_DIRTY_1 | NO_RUST + baseturfs = /turf/cordon /turf/cordon/AfterChange() . = ..() @@ -39,11 +40,19 @@ /turf/cordon/Adjacent(atom/neighbor, atom/target, atom/movable/mover) return FALSE +/turf/cordon/Bumped(atom/movable/bumped_atom) + . = ..() + + if(HAS_TRAIT(bumped_atom, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT)) //we could feasibly reach the border, so just dont + dump_in_space(bumped_atom) + /// Area used in conjuction with the cordon turf to create a fully functioning world border. /area/misc/cordon name = "CORDON" icon_state = "cordon" - dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT + static_lighting = FALSE + base_lighting_alpha = 255 unique = TRUE noteleport = TRUE hidden = TRUE diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 4e0b926d7090..24dead54cfbe 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -6,6 +6,27 @@ var/loaded = 0 // Times loaded this round var/datum/parsed_map/cached_map var/keep_cached_map = FALSE + var/station_id = null // used to override the root id when generating + + ///Default area associated with the map template + var/default_area + + ///if true, turfs loaded from this template are placed on top of the turfs already there, defaults to TRUE + var/should_place_on_top = TRUE + + ///if true, creates a list of all atoms created by this template loading, defaults to FALSE + var/returns_created_atoms = FALSE + + ///the list of atoms created by this template being loaded, only populated if returns_created_atoms is TRUE + var/list/created_atoms = list() + //make sure this list is accounted for/cleared if you request it from ssatoms! + + ///If true, any openspace turfs above the template will be replaced with ceiling_turf when loading. Should probably be FALSE for lower levels of multi-z ruins. + var/has_ceiling = FALSE + ///What turf to replace openspace with when has_ceiling is true + var/turf/ceiling_turf = /turf/open/floor/plating + ///What baseturfs to set when replacing openspace when has_ceiling is true + var/list/ceiling_baseturfs = list() /datum/map_template/New(path = null, rename = null, cache = FALSE) SHOULD_CALL_PARENT(TRUE) @@ -16,6 +37,7 @@ preload_size(mappath, cache) if(rename) name = rename + ceiling_baseturfs.Insert(1, /turf/baseturf_bottom) /datum/map_template/proc/preload_size(path, cache = FALSE) var/datum/parsed_map/parsed = new(file(path)) @@ -72,11 +94,10 @@ // first or not. Its defined In Initialize yet its run first in templates // BEFORE so... hummm SSmapping.reg_in_areas_in_z(areas) - //SSnetworks.assign_areas_root_ids(areas, src) if(!SSatoms.initialized) return - SSatoms.InitializeAtoms(areas + turfs + movables) + SSatoms.InitializeAtoms(areas + turfs + movables, returns_created_atoms ? created_atoms : null) for(var/turf/unlit as anything in turfs) if(unlit.space_lit) @@ -90,7 +111,6 @@ // need these two below? SSmachines.setup_template_powernets(cables) SSair.setup_template_machinery(atmos_machines) - SSshuttle.setup_shuttles(ports) //calculate all turfs inside the border var/list/template_and_bordering_turfs = block( @@ -106,15 +126,23 @@ ) ) for(var/turf/affected_turf as anything in template_and_bordering_turfs) - affected_turf.ImmediateCalculateAdjacentTurfs() + affected_turf.air_update_turf(TRUE, TRUE) affected_turf.levelupdate() /datum/map_template/proc/load_new_z(secret = FALSE) - var/x = round((world.maxx - width)/2) - var/y = round((world.maxy - height)/2) + var/x = round((world.maxx - width) * 0.5) + 1 + var/y = round((world.maxy - height) * 0.5) + 1 var/datum/space_level/level = SSmapping.add_new_zlevel(name, secret ? ZTRAITS_AWAY_SECRET : ZTRAITS_AWAY, contain_turfs = FALSE) - var/datum/parsed_map/parsed = load_map(file(mappath), x, y, level.z_value, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), place_on_top=TRUE, new_z = TRUE) + var/datum/parsed_map/parsed = load_map( + file(mappath), + x, + y, + level.z_value, + no_changeturf = (SSatoms.initialized == INITIALIZATION_INSSATOMS), + place_on_top = should_place_on_top, + new_z = TRUE, + ) var/list/bounds = parsed.bounds if(!bounds) return FALSE @@ -123,7 +151,7 @@ //initialize things that are normally initialized after map load initTemplateBounds(bounds) smooth_zlevel(world.maxz) - log_game("Z-level [name] loaded at at [x],[y],[world.maxz]") + log_game("Z-level [name] loaded at [x],[y],[world.maxz]") return level @@ -141,8 +169,22 @@ // ruins clogging up memory for the whole round. var/datum/parsed_map/parsed = cached_map || new(file(mappath)) cached_map = keep_cached_map ? parsed : null - if(!parsed.load(T.x, T.y, T.z, crop_map = TRUE, no_changeturf = (SSatoms.initialized == INITIALIZATION_INSSATOMS), place_on_top = TRUE)) + + var/list/turf_blacklist = list() + update_blacklist(T, turf_blacklist) + + UNSETEMPTY(turf_blacklist) + parsed.turf_blacklist = turf_blacklist + if(!parsed.load( + T.x, + T.y, + T.z, + crop_map = TRUE, + no_changeturf = (SSatoms.initialized == INITIALIZATION_INSSATOMS), + place_on_top = should_place_on_top, + )) return + var/list/bounds = parsed.bounds if(!bounds) return @@ -152,9 +194,26 @@ //initialize things that are normally initialized after map load initTemplateBounds(bounds) - log_game("[name] loaded at at [T.x],[T.y],[T.z]") + // if(has_ceiling) + // var/affected_turfs = get_affected_turfs(T, FALSE) + // generate_ceiling(affected_turfs) + + log_game("[name] loaded at [T.x],[T.y],[T.z]") return bounds +// /datum/map_template/proc/generate_ceiling(affected_turfs) +// for (var/turf/turf in affected_turfs) +// var/turf/ceiling = get_step_multiz(turf, UP) +// if (ceiling) +// if (istype(ceiling, /turf/open/openspace) || istype(ceiling, /turf/open/space/openspace)) +// ceiling.ChangeTurf(ceiling_turf, ceiling_baseturfs, CHANGETURF_INHERIT_AIR) + +/datum/map_template/proc/post_load() + return + +/datum/map_template/proc/update_blacklist(turf/T, list/input_blacklist) + return + /datum/map_template/proc/get_affected_turfs(turf/T, centered = FALSE) var/turf/placement = T if(centered) @@ -163,10 +222,27 @@ placement = corner return block(placement, locate(placement.x+width-1, placement.y+height-1, placement.z)) +/// Takes in a type path, locates an instance of that type in the cached map, and calculates its offset from the origin of the map, returns this offset in the form list(x, y). +/datum/map_template/proc/discover_offset(obj/marker) + var/key + var/list/models = cached_map.grid_models + for(key in models) + if(findtext(models[key], "[marker]")) // Yay compile time checks + break // This works by assuming there will ever only be one mobile dock in a template at most + + for(var/datum/grid_set/gset as anything in cached_map.gridSets) + var/ycrd = gset.ycrd + for(var/line in gset.gridLines) + var/xcrd = gset.xcrd + for(var/j in 1 to length(line) step cached_map.key_len) + if(key == copytext(line, j, j + cached_map.key_len)) + return list(xcrd, ycrd) + ++xcrd + --ycrd + //for your ever biggening badminnery kevinz000 //❤ - Cyberboss - /proc/load_new_z_level(file, name, secret) var/datum/map_template/template = new(file, name, TRUE) if(!template.cached_map || template.cached_map.check_for_errors()) diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index 7ffe67406d0e..a3ff5f892554 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -36,6 +36,9 @@ pre_cordon_distance = 7 /datum/turf_reservation/proc/Release() + bottom_left_turfs.Cut() + top_right_turfs.Cut() + var/list/reserved_copy = reserved_turfs.Copy() SSmapping.used_turfs -= reserved_turfs reserved_turfs = list() @@ -50,7 +53,7 @@ SEND_SIGNAL(reserved_turf, COMSIG_TURF_RESERVATION_RELEASED, src) // Makes the linter happy, even tho we don't await this - INVOKE_ASYNC(SSmapping, /datum/controller/subsystem/mapping/proc/reserve_turfs, reserved_copy) + INVOKE_ASYNC(SSmapping, TYPE_PROC_REF(/datum/controller/subsystem/mapping, reserve_turfs), release_turfs) /// Attempts to calaculate and store a list of turfs around the reservation for cordoning. Returns whether a valid cordon was calculated /datum/turf_reservation/proc/calculate_cordon_turfs(turf/BL, turf/TR) @@ -81,10 +84,13 @@ old_area.turfs_to_uncontain += cordon_turf cordon_area.contained_turfs += cordon_turf cordon_area.contents += cordon_turf + // Its no longer unused, but its also not "used" + cordon_turf.turf_flags &= ~UNUSED_RESERVATION_TURF cordon_turf.ChangeTurf(/turf/cordon, /turf/cordon) cordon_turf.flags_1 &= ~UNUSED_RESERVATION_TURF_1 SSmapping.unused_turfs["[cordon_turf.z]"] -= cordon_turf + // still gets linked to us though SSmapping.used_turfs[cordon_turf] = src //swap the area with the pre-cordoning area @@ -111,7 +117,7 @@ /datum/turf_reservation/transit/make_repel(turf/pre_cordon_turf) ..() - RegisterSignal(pre_cordon_turf, COMSIG_ATOM_ENTERED, PROC_REF(space_dump)) + RegisterSignal(pre_cordon_turf, COMSIG_ATOM_ENTERED, PROC_REF(space_dump_soft)) /datum/turf_reservation/transit/stop_repel(turf/pre_cordon_turf) ..() @@ -121,7 +127,15 @@ /datum/turf_reservation/transit/proc/space_dump(atom/source, atom/movable/enterer) SIGNAL_HANDLER - INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(throw_atom), enterer) + dump_in_space(enterer) + +///Only dump if we don't have the hyperspace cordon movement exemption trait +/datum/turf_reservation/transit/proc/space_dump_soft(atom/source, atom/movable/enterer) + SIGNAL_HANDLER + + if(!HAS_TRAIT(enterer, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT)) + space_dump(source, enterer) + /// Internal proc which handles reserving the area for the reservation. /datum/turf_reservation/proc/_reserve_area(width, height, zlevel) @@ -163,7 +177,6 @@ for(var/i in final) var/turf/T = i reserved_turfs |= T - T.flags_1 &= ~UNUSED_RESERVATION_TURF_1 SSmapping.unused_turfs["[T.z]"] -= T SSmapping.used_turfs[T] = src T.ChangeTurf(turf_type, turf_type) @@ -216,6 +229,38 @@ return return_information return null +/// Gets the turf below the given target. Returns null if there is no turf below the target +/datum/turf_reservation/proc/get_turf_below(turf/target) + var/list/bounds_info = calculate_turf_bounds_information(target) + if(isnull(bounds_info)) + return null + + var/z_idx = bounds_info["z_idx"] + // check what z level, if its the max, then there is no turf below + if(z_idx == z_size) + return null + + var/offset_x = bounds_info["offset_x"] + var/offset_y = bounds_info["offset_y"] + var/turf/bottom_left = bottom_left_turfs[z_idx + 1] + return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) + +/// Gets the turf above the given target. Returns null if there is no turf above the target +/datum/turf_reservation/proc/get_turf_above(turf/target) + var/list/bounds_info = calculate_turf_bounds_information(target) + if(isnull(bounds_info)) + return null + + var/z_idx = bounds_info["z_idx"] + // check what z level, if its the min, then there is no turf above + if(z_idx == 1) + return null + + var/offset_x = bounds_info["offset_x"] + var/offset_y = bounds_info["offset_y"] + var/turf/bottom_left = bottom_left_turfs[z_idx - 1] + return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) + /datum/turf_reservation/New() LAZYADD(SSmapping.turf_reservations, src) diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index b1915d4b580f..3cc21d61040f 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -49,37 +49,6 @@ . += S.z_value break -/// Gets the turf below the given target. Returns null if there is no turf below the target -/datum/turf_reservation/proc/get_turf_below(turf/target) - var/list/bounds_info = calculate_turf_bounds_information(target) - if(isnull(bounds_info)) - return null - - var/z_idx = bounds_info["z_idx"] - // check what z level, if its the max, then there is no turf below - if(z_idx == z_size) - return null - - var/offset_x = bounds_info["offset_x"] - var/offset_y = bounds_info["offset_y"] - var/turf/bottom_left = bottom_left_turfs[z_idx + 1] - return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) - -/// Gets the turf above the given target. Returns null if there is no turf above the target -/datum/turf_reservation/proc/get_turf_above(turf/target) - var/list/bounds_info = calculate_turf_bounds_information(target) - if(isnull(bounds_info)) - return null - - var/z_idx = bounds_info["z_idx"] - // check what z level, if its the min, then there is no turf above - if(z_idx == 1) - return null - - var/offset_x = bounds_info["offset_x"] - var/offset_y = bounds_info["offset_y"] - var/turf/bottom_left = bottom_left_turfs[z_idx - 1] - return locate(bottom_left.x + offset_x, bottom_left.y + offset_y, bottom_left.z) // Prefer not to use this one too often /datum/controller/subsystem/mapping/proc/get_station_center() var/station_z = levels_by_trait(ZTRAIT_STATION)[1] diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm index 094bb0abdb9f..0aadf6d40349 100644 --- a/code/modules/mapping/space_management/zlevel_manager.dm +++ b/code/modules/mapping/space_management/zlevel_manager.dm @@ -19,7 +19,7 @@ manage_z_level(S, filled_with_space = FALSE) //generate_z_level_linkages() // Default Zs don't use add_new_zlevel() so they don't automatically generate z-linkages. -/datum/controller/subsystem/mapping/proc/add_new_zlevel(name, traits = list(), z_type = /datum/space_level, filled_with_space = TRUE, contain_turfs = TRUE) +/datum/controller/subsystem/mapping/proc/add_new_zlevel(name, traits = list(), z_type = /datum/space_level, contain_turfs = TRUE) UNTIL(!adding_new_zlevel) adding_new_zlevel = TRUE var/new_z = z_list.len + 1 diff --git a/code/modules/projectiles/projectile/energy/_energy.dm b/code/modules/projectiles/projectile/energy/_energy.dm index 806adc1d8e2f..26f6fbe90b05 100644 --- a/code/modules/projectiles/projectile/energy/_energy.dm +++ b/code/modules/projectiles/projectile/energy/_energy.dm @@ -5,3 +5,9 @@ damage_type = BURN armor_flag = ENERGY reflectable = REFLECT_NORMAL + +/obj/projectile/energy/Initialize(mapload) + . = ..() + + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT, INNATE_TRAIT) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 4a6b87885842..357f2b50949d 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -231,6 +231,7 @@ /obj/docking_port/stationary/transit name = "In Transit" + override_can_dock_checks = TRUE /// The turf reservation returned by the transit area request var/datum/turf_reservation/reserved_area /// The area created during the transit area reservation diff --git a/icons/turf/smoothhardrocks.png b/icons/turf/smoothhardrocks.png new file mode 100644 index 0000000000000000000000000000000000000000..f455fa7cb45315a0f14e9012427af1eff8240af7 GIT binary patch literal 1521 zcmVYAX9X8WNB|8RBvx=!KdMT000Gi zNkl&2p{BdJVZV0+hLmri0`7KL>T|bBmpPYS+xbj zS8QQPwy|-}K_X*}bIuvj$*PI;`8}pg%s`AW4gj2U#u($?-`~-79b%Qt&yO9aV}GHs z=<|CH1r3BM6ac!e0|2ybi`{N_u4KQ$cmtqgROtXf$NA6voM)u z(=@QwVzb%cbUFbTS8}Mr_}}>X05A;0xvYPkVHjYo1@QP4t|kMOceZ z>cS|WjL$gdChkk$_d&Q&m)7@v5-wE6Kh70$VQS~&+VA&nO+HBjR6aT1*+2k*zoAnX zj5Qo-eBg_hjTuPId|as@a|ym{f?(wqmew_}EX>x zN1_T|i%;4Bl~2Z(or^`?l60v48u36%Iv1-ZK43bRXlXvF3!{88zEKad*=&*-B7UKJ z1yVqGFs^n!k|fByC*LiCVCB1LG7jQf>KquqOlrOiKR*=&*Um@sgUqG*N`qkKOY;RM zD@v3b-uEF(rVZpKE7r!xC0);OFTPu?w@|)ci55)x7bm!q;e81lom;wKss=uiBu#lw zzBvt0`Qm({CAXn2i{MIPg4}iaKNK^Pn)!h6Y}6(B=FFB=zBu2+Ki<{l5*vFoBf5nE}~~!W#KVrE98h&3EfH-+!Gi zyB?&}8VNGi_2tT@vP8A>0n?G-rTI#-M9P=vn-~bqQz;2-N+A66{AmKIiGa290hc`f zT71%R2IZ6S&33Wo07=UBeUH=WboFO{mgXZ#U4(n_-O7bY-Q$|FkH$ALkkoKKx3-x7 z7lTX%Pa(xd(re};#VU9yzPSxh`NDjnfkN`VB~v|8DLFqo5gXx*Etsm6k1JHcOY+TW zfXWx=n@lwcrBV4plh|DPlyXD;T=b@hec7Z|K2j)6xg_75G^+B&`6fZS|E4C3wARjo z^Of@#Q*Y;_&$LaUfHe Date: Wed, 13 Dec 2023 17:30:33 -0800 Subject: [PATCH 146/281] we're back --- code/__DEFINES/chat.dm | 18 ++++++++++++++++++ code/__DEFINES/traits.dm | 2 ++ code/_globalvars/traits.dm | 2 -- code/datums/chatmessage.dm | 23 ++++++++++++++--------- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/code/__DEFINES/chat.dm b/code/__DEFINES/chat.dm index 4c66ba43ada7..f4f676d0e9f5 100644 --- a/code/__DEFINES/chat.dm +++ b/code/__DEFINES/chat.dm @@ -20,5 +20,23 @@ #define MESSAGE_TYPE_MENTORPM "mentorpm" #define MESSAGE_TYPE_DONATOR "donator" +/// Max length of chat message in characters +#define CHAT_MESSAGE_MAX_LENGTH 110 + +//debug printing macros (for development and testing) +/// Used for debug messages to the world +#define debug_world(msg) if (GLOB.Debug2) to_chat(world, \ + type = MESSAGE_TYPE_DEBUG, \ + text = "DEBUG: [msg]") +/// Used for debug messages to the player +#define debug_usr(msg) if (GLOB.Debug2 && usr) to_chat(usr, \ + type = MESSAGE_TYPE_DEBUG, \ + text = "DEBUG: [msg]") +/// Used for debug messages to the admins +#define debug_admins(msg) if (GLOB.Debug2) to_chat(GLOB.admins, \ + type = MESSAGE_TYPE_DEBUG, \ + text = "DEBUG: [msg]") +/// Used for debug messages to the server +#define debug_world_log(msg) if (GLOB.Debug2) log_world("DEBUG: [msg]") /// Adds a generic box around whatever message you're sending in chat. Really makes things stand out. #define examine_block(str) ("

    ") diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 7dec1965695a..8f2e3a67c787 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -144,6 +144,8 @@ #define TRAIT_CRITICAL_CONDITION "critical-condition" /// Is frozen in place #define TRAIT_FROZEN "frozen" +/// Is runechat for this atom/movable currently disabled, regardless of prefs or anything? +#define TRAIT_RUNECHAT_HIDDEN "runechat_hidden" /// trait associated to a stat value or range of #define STAT_TRAIT "stat" #define TRAIT_INCAPACITATED "incapacitated" diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 782a464007a4..2a4a196ccdb8 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -6,8 +6,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( /atom/movable = list( "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, - ), - /atom/movable = list( "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, ), /mob = list( diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 5694bfa0fd08..09f8d36e059f 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -1,9 +1,11 @@ /// How long the chat message's spawn-in animation will occur for -#define CHAT_MESSAGE_SPAWN_TIME 0.2 SECONDS +#define CHAT_MESSAGE_SPAWN_TIME (0.2 SECONDS) /// How long the chat message will exist prior to any exponential decay -#define CHAT_MESSAGE_LIFESPAN 5 SECONDS +#define CHAT_MESSAGE_LIFESPAN (5 SECONDS) /// How long the chat message's end of life fading animation will occur for -#define CHAT_MESSAGE_EOL_FADE 0.7 SECONDS +#define CHAT_MESSAGE_EOL_FADE (0.7 SECONDS) +/// Grace period for fade before we actually delete the chat message +#define CHAT_MESSAGE_GRACE_PERIOD (0.2 SECONDS) /// Factor of how much the message index (number of messages) will account to exponential decay #define CHAT_MESSAGE_EXP_DECAY 0.7 /// Factor of how much height will account to exponential decay @@ -12,15 +14,18 @@ #define CHAT_MESSAGE_APPROX_LHEIGHT 11 /// Max width of chat message in pixels #define CHAT_MESSAGE_WIDTH 96 -/// Max length of chat message in characters -#define CHAT_MESSAGE_MAX_LENGTH 110 -/// Maximum precision of float before rounding errors occur (in this context) -#define CHAT_LAYER_Z_STEP 0.0001 -/// The number of z-layer 'slices' usable by the chat message layering -#define CHAT_LAYER_MAX_Z (CHAT_LAYER_MAX - CHAT_LAYER) / CHAT_LAYER_Z_STEP /// The dimensions of the chat message icons #define CHAT_MESSAGE_ICON_SIZE 9 +///Base layer of chat elements +#define CHAT_LAYER 1 +///Highest possible layer of chat elements +#define CHAT_LAYER_MAX 2 +/// Maximum precision of float before rounding errors occur (in this context) +#define CHAT_LAYER_Z_STEP 0.0001 +/// The number of z-layer 'slices' usable by the chat message layering +#define CHAT_LAYER_MAX_Z (CHAT_LAYER_MAX - CHAT_LAYER) / CHAT_LAYER_Z_STEP + /** * # Chat Message Overlay * From a2a11d1ecf119792188479e57108c364c787abd7 Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Wed, 13 Dec 2023 22:00:11 -0800 Subject: [PATCH 147/281] no runtimes baby --- code/__DEFINES/subsystems.dm | 2 +- code/game/objects/structures/window.dm | 29 ++++++++++++++------------ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index f8f06a0529b7..ee485f2c4358 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -161,7 +161,7 @@ #define INIT_ORDER_PERSISTENCE -2 #define INIT_ORDER_PERSISTENT_PAINTINGS -3 // Assets relies on this #define INIT_ORDER_ASSETS -4 -#define INIT_ORDER_ICON_SMOOTHING -125 +#define INIT_ORDER_ICON_SMOOTHING -5 #define INIT_ORDER_OVERLAY -6 #define INIT_ORDER_XKEYSCORE -10 #define INIT_ORDER_STICKY_BAN -10 diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 405032dbe4d6..5258514419ae 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -112,9 +112,9 @@ /obj/structure/window/CanAllowThrough(atom/movable/mover, turf/target) . = ..() if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return 1 - if(dir == FULLTILE_WINDOW_DIR) - return 0 //full tile window, you can't move into it! + return TRUE + if(fulltile) + return FALSE //full tile window, you can't move into it! var/attempted_dir = get_dir(loc, target) if(attempted_dir == dir) return @@ -321,7 +321,7 @@ /obj/structure/window/CanAtmosPass(turf/T) if(!anchored || !density) return TRUE - return !(FULLTILE_WINDOW_DIR == dir || dir == get_dir(loc, T)) + return !(fulltile || dir == get_dir(loc, T)) //This proc is used to update the icons of nearby windows. /obj/structure/window/proc/update_nearby_icons() @@ -356,7 +356,7 @@ /obj/structure/window/CanAStarPass(ID, to_dir) if(!density) return 1 - if((dir == FULLTILE_WINDOW_DIR) || (dir == to_dir)) + if((fulltile) || (dir == to_dir)) return 0 return 1 @@ -508,7 +508,7 @@ /obj/structure/window/plasma/BlockThermalConductivity(opp_dir) if(!anchored || !density) return FALSE - return FULLTILE_WINDOW_DIR == dir || dir == opp_dir + return fulltile || dir == opp_dir /obj/structure/window/plasma/spawner/east dir = EAST @@ -612,8 +612,8 @@ /obj/structure/window/reinforced/tinted name = "tinted window" - icon_state = "twindow" opacity = TRUE + /obj/structure/window/reinforced/tinted/frosted name = "frosted window" icon_state = "fwindow" @@ -690,7 +690,8 @@ /obj/structure/window/reinforced/tinted/fulltile icon = 'icons/obj/smooth_structures/tinted_window.dmi' - icon_state = "tinted_window" + icon_state = "tinted_window-0" + base_icon_state = "tinted_window" dir = FULLTILE_WINDOW_DIR fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 @@ -748,7 +749,8 @@ name = "plastitanium window" desc = "A durable looking window made of an alloy of of plasma and titanium." icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' - icon_state = "plastitanium_window" + icon_state = "plastitanium_window-0" + base_icon_state = "plastitanium_window" dir = FULLTILE_WINDOW_DIR max_integrity = 1200 wtype = "shuttle" @@ -814,7 +816,7 @@ /obj/structure/window/reinforced/clockwork/ratvar_act() if(GLOB.ratvar_awakens) obj_integrity = max_integrity - update_appearance(UPDATE_ICON) + update_appearance() /obj/structure/window/reinforced/clockwork/narsie_act() take_damage(rand(25, 75), BRUTE) @@ -858,7 +860,8 @@ name = "paper frame" desc = "A fragile separator made of thin wood and paper." icon = 'icons/obj/smooth_structures/paperframes.dmi' - icon_state = "frame" + icon_state = "frame-0" + base_icon_state = "frame" dir = FULLTILE_WINDOW_DIR opacity = TRUE max_integrity = 15 @@ -881,7 +884,7 @@ /obj/structure/window/paperframe/Initialize(mapload) . = ..() - update_appearance(UPDATE_ICON) + update_appearance() /obj/structure/window/paperframe/examine(mob/user) . = ..() @@ -938,7 +941,7 @@ update_appearance(UPDATE_ICON) return ..() - update_appearance(UPDATE_ICON) + update_appearance() From 884623e600d10b3f3e5700dc63ba59f9240b795d Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Tue, 19 Dec 2023 16:05:33 -0800 Subject: [PATCH 148/281] no errors --- code/__DEFINES/chat.dm | 2 +- code/__DEFINES/misc.dm | 12 ------------ code/controllers/subsystem/icon_smooth.dm | 1 - yogstation.dme | 2 +- 4 files changed, 2 insertions(+), 15 deletions(-) diff --git a/code/__DEFINES/chat.dm b/code/__DEFINES/chat.dm index f4f676d0e9f5..fcb7bae48ab3 100644 --- a/code/__DEFINES/chat.dm +++ b/code/__DEFINES/chat.dm @@ -33,7 +33,7 @@ type = MESSAGE_TYPE_DEBUG, \ text = "DEBUG: [msg]") /// Used for debug messages to the admins -#define debug_admins(msg) if (GLOB.Debug2) to_chat(GLOB.admins, \ +#define debug_admins(msg) if (GLOB.Debug2) to_chat(GLOB.permissions.admins, \ type = MESSAGE_TYPE_DEBUG, \ text = "DEBUG: [msg]") /// Used for debug messages to the server diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 16a155614d68..361593a8ba9e 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -253,18 +253,6 @@ GLOBAL_LIST_INIT(donor_pdas, list(PDA_COLOR_NORMAL, PDA_COLOR_TRANSPARENT, PDA_C #define SHELTER_DEPLOY_ANCHORED_OBJECTS "anchored objects" #define SHELTER_DEPLOY_OUTSIDE_MAP "outside map" -//debug printing macros -#define debug_world(msg) if (GLOB.Debug2) to_chat(world, \ - type = MESSAGE_TYPE_DEBUG, \ - text = "DEBUG: [msg]") -#define debug_usr(msg) if (GLOB.Debug2&&usr) to_chat(usr, \ - type = MESSAGE_TYPE_DEBUG, \ - text = "DEBUG: [msg]") -#define debug_admins(msg) if (GLOB.Debug2) to_chat(GLOB.permissions.admins, \ - type = MESSAGE_TYPE_DEBUG, \ - text = "DEBUG: [msg]") -#define debug_world_log(msg) if (GLOB.Debug2) log_world("DEBUG: [msg]") - #define INCREMENT_TALLY(L, stat) if(L[stat]){L[stat]++}else{L[stat] = 1} //TODO Move to a pref diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index 3902027b923f..4d5f3069eca6 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -1,7 +1,6 @@ SUBSYSTEM_DEF(icon_smooth) name = "Icon Smoothing" init_order = INIT_ORDER_ICON_SMOOTHING - //runlevels = RUNLEVEL_GAME wait = 1 priority = FIRE_PRIORITY_SMOOTHING flags = SS_TICKER diff --git a/yogstation.dme b/yogstation.dme index 2d0b1027c737..3d70e8bb1d18 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -2159,8 +2159,8 @@ #include "code\modules\client\preferences\assets.dm" #include "code\modules\client\preferences\auto_fit_viewport.dm" #include "code\modules\client\preferences\balloon_alerts.dm" -#include "code\modules\client\preferences\clerk_choice.dm" #include "code\modules\client\preferences\chapel_choice.dm" +#include "code\modules\client\preferences\clerk_choice.dm" #include "code\modules\client\preferences\clothing.dm" #include "code\modules\client\preferences\credits.dm" #include "code\modules\client\preferences\donor.dm" From 046058827cf8c38b8966044b63f303603f5e1cd2 Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Wed, 20 Dec 2023 13:08:09 -0800 Subject: [PATCH 149/281] shuttles are almost fixed i think --- code/__DEFINES/flags.dm | 13 +- code/__DEFINES/maps.dm | 36 ++++- code/__DEFINES/misc.dm | 10 -- code/__DEFINES/multiz.dm | 4 +- code/__DEFINES/text.dm | 3 + code/__DEFINES/turfs.dm | 2 +- code/_globalvars/bitfields.dm | 1 + code/_globalvars/regexes.dm | 5 + code/controllers/subsystem/mapping.dm | 52 +++++-- code/controllers/subsystem/shuttle.dm | 36 +++-- code/datums/components/rot.dm | 24 ++- code/datums/elements/mirage_border.dm | 41 +++++ code/game/machinery/computer/arcade.dm | 2 +- code/game/machinery/cryopod.dm | 2 +- code/game/machinery/doors/airlock.dm | 4 +- code/game/mecha/equipment/tools/work_tools.dm | 4 +- .../fluid_spread/effects_foam.dm | 2 +- .../objects/effects/spawners/vaultspawner.dm | 4 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/objects/structures/false_walls.dm | 2 +- code/game/objects/structures/girders.dm | 14 +- code/game/objects/structures/lattice.dm | 2 +- code/game/turfs/baseturfs.dm | 134 ++++++++++++++-- code/game/turfs/change_turf.dm | 145 ++--------------- code/game/turfs/open/_open.dm | 2 +- code/game/turfs/open/chasm.dm | 4 +- code/game/turfs/open/floor.dm | 2 +- code/game/turfs/open/floor/plating.dm | 4 +- .../game/turfs/open/floor/plating/asteroid.dm | 2 +- code/game/turfs/open/lava.dm | 67 +++++++- code/game/turfs/open/openspace.dm | 86 ++++++----- code/game/turfs/open/space/space.dm | 28 ---- code/game/turfs/open/space/space_EXPENSIVE.dm | 45 ++++++ code/game/turfs/open/space/transit.dm | 14 +- code/game/turfs/turf.dm | 3 +- .../clockcult/clock_structures/wall_gear.dm | 4 +- .../antagonists/cult/cult_structures.dm | 2 +- .../eldritch_cult/magic/rust_magic.dm | 2 +- code/modules/awaymissions/zlevel.dm | 1 + code/modules/buildmode/submodes/basic.dm | 8 +- code/modules/buildmode/submodes/fill.dm | 2 +- code/modules/cargo/supplypod.dm | 2 +- code/modules/events/shuttle_catastrophe.dm | 20 ++- code/modules/mapping/map_template.dm | 21 +-- code/modules/mapping/mapping_helpers.dm | 30 ++-- code/modules/mapping/reader.dm | 2 +- .../space_management/multiz_helpers.dm | 19 --- .../space_management/space_reservation.dm | 18 +-- .../space_management/space_transition.dm | 14 +- .../space_management/zlevel_manager.dm | 6 +- .../mob/living/simple_animal/bot/floorbot.dm | 8 +- .../chemistry/reagents/other_reagents.dm | 2 +- .../modules/ruins/lavalandruin_code/puzzle.dm | 4 +- code/modules/shuttle/shuttle.dm | 146 +++++++++++++++--- .../spells/spell_types/conjure/_conjure.dm | 2 +- code/modules/unit_tests/baseturfs.dm | 6 +- yogstation.dme | 2 + 57 files changed, 694 insertions(+), 428 deletions(-) create mode 100644 code/datums/elements/mirage_border.dm create mode 100644 code/game/turfs/open/space/space_EXPENSIVE.dm diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index b925415272be..b9e2b473db1c 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -60,20 +60,23 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 //turf-only flags #define NOJAUNT_1 (1<<0) +/// If a turf is an usused reservation turf awaiting assignment #define UNUSED_RESERVATION_TURF_1 (1<<1) +/// If a turf is a reserved turf +#define RESERVATION_TURF_1 (1<<2) /// If a turf can be made dirty at roundstart. This is also used in areas. -#define CAN_BE_DIRTY_1 (1<<2) +#define CAN_BE_DIRTY_1 (1<<3) /// Blocks lava rivers being generated on the turf -#define NO_LAVA_GEN_1 (1<<6) +#define NO_LAVA_GEN_1 (1<<3) /// Blocks ruins spawning on the turf -#define NO_RUINS_1 (1<<18) +#define NO_RUINS_1 (1<<4) /// Blocks this turf from being rusted -#define NO_RUST (1<<19) +#define NO_RUST (1<<5) /// If this atom has experienced a decal element "init finished" sourced appearance update /// We use this to ensure stacked decals don't double up appearance updates for no rasin /// Flag as an optimization, don't make this a trait without profiling /// Yes I know this is a stupid flag, no you can't take him from me -#define DECAL_INIT_UPDATE_EXPERIENCED_1 (1<<20) +#define DECAL_INIT_UPDATE_EXPERIENCED_1 (1<<6) //AREA FLAGS /// If blobs can spawn there and if it counts towards their score. diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 44dd0676c9f1..7c2da9430f7a 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -16,8 +16,23 @@ As of 2018-02-04, the typical z-levels for a single-level station are: 12: Empty space 13: Transit space -Multi-Z stations are supported and multi-Z mining and away missions would -require only minor tweaks. +Multi-Z stations are supported and Multi-Z mining and away missions would +require only minor tweaks. They also handle their Z-Levels differently on their +own case by case basis. + +This information will absolutely date quickly with how we handle Z-Levels, and will +continue to handle them in the future. Currently, you can go into the Debug tab +of your stat-panel (in game) and hit "Mapping verbs - Enable". You will then get a new tab +called "Mapping", as well as access to the verb "Debug-Z-Levels". Although the information +presented in this comment is factual for the time it was written for, it's ill-advised +to trust the words presented within. + +We also provide this information to you so that you can have an at-a-glance look at how +Z-Levels are arranged. It is extremely ill-advised to ever use the location of a Z-Level +to assign traits to it or use it in coding. Use Z-Traits (ZTRAITs) for these. + +If you want to start toying around with Z-Levels, do not take these words for fact. +Always compile, always use that verb, and always make sure that it works for what you want to do. */ // helpers for modifying jobs, used in various job_changes.dm files @@ -27,6 +42,23 @@ require only minor tweaks. #define SPACERUIN_MAP_EDGE_PAD 15 +/// Distance from edge to move to another z-level +#define TRANSITIONEDGE 7 + +// Maploader bounds indices +/// The maploader index for the maps minimum x +#define MAP_MINX 1 +/// The maploader index for the maps minimum y +#define MAP_MINY 2 +/// The maploader index for the maps minimum z +#define MAP_MINZ 3 +/// The maploader index for the maps maximum x +#define MAP_MAXX 4 +/// The maploader index for the maps maximum y +#define MAP_MAXY 5 +/// The maploader index for the maps maximum z +#define MAP_MAXZ 6 + // traits // boolean - marks a level as having that property if present #define ZTRAIT_CENTCOM "CentCom" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 361593a8ba9e..62d0f4ee8229 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -57,8 +57,6 @@ #define MANIFEST_ERROR_CONTENTS 2 #define MANIFEST_ERROR_ITEM 4 -#define TRANSITIONEDGE 7 //Distance from edge to move to another z-level - #define BE_CLOSE TRUE //in the case of a silicon, to select if they need to be next to the atom #define NO_DEXTERY TRUE //if other mobs (monkeys, aliens, etc) can use this #define NO_TK TRUE @@ -226,14 +224,6 @@ GLOBAL_LIST_INIT(donor_pdas, list(PDA_COLOR_NORMAL, PDA_COLOR_TRANSPARENT, PDA_C //Just space #define SPACE_ICON_STATE "[((x + y) ^ ~(x * y) + z) % 25]" -// Maploader bounds indices -#define MAP_MINX 1 -#define MAP_MINY 2 -#define MAP_MINZ 3 -#define MAP_MAXX 4 -#define MAP_MAXY 5 -#define MAP_MAXZ 6 - // Defib stats #define DEFIB_TIME_LIMIT 15 MINUTES diff --git a/code/__DEFINES/multiz.dm b/code/__DEFINES/multiz.dm index 370eaa8ba459..0bd2f23c3097 100644 --- a/code/__DEFINES/multiz.dm +++ b/code/__DEFINES/multiz.dm @@ -1,8 +1,8 @@ /// Attempt to get the turf below the provided one according to Z traits #define GET_TURF_BELOW(turf) ( \ - (turf.turf_flags & RESERVATION_TURF) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_below(turf) : \ + (turf.flags_1 & RESERVATION_TURF_1) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_below(turf) : \ (!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_DOWN]) ? null : get_step((turf), DOWN)) /// Attempt to get the turf above the provided one according to Z traits #define GET_TURF_ABOVE(turf) ( \ - (turf.turf_flags & RESERVATION_TURF) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_above(turf) : \ + (turf.flags_1 & RESERVATION_TURF_1) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_above(turf) : \ (!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_UP]) ? null : get_step((turf), UP)) diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm index 823a88345de6..bda614681c46 100644 --- a/code/__DEFINES/text.dm +++ b/code/__DEFINES/text.dm @@ -8,3 +8,6 @@ * Uses MAPTEXT to format antag points into a more appealing format */ #define ANTAG_MAPTEXT(value, color) MAPTEXT("
    [round(value)]
    ") + +/// Removes characters incompatible with file names. +#define SANITIZE_FILENAME(text) (GLOB.filename_forbidden_chars.Replace(text, "")) diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 7b972abc20cb..6ff0d233ac0c 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -1,7 +1,7 @@ #define CHANGETURF_DEFER_CHANGE (1<<0) #define CHANGETURF_IGNORE_AIR (1<<1) // This flag prevents changeturf from gathering air from nearby turfs to fill the new turf with an approximation of local air #define CHANGETURF_FORCEOP (1<<2) -#define CHANGETURF_SKIP (1<<3) // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE +#define CHANGETURF_SKIP (1<<3) // A flag for place_on_top to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE #define CHANGETURF_INHERIT_AIR (1<<4) // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR #define CHANGETURF_RECALC_ADJACENT (1<<5) //Immediately recalc adjacent atmos turfs instead of queuing. #define CHANGETURF_TRAPDOOR_INDUCED (1<<6) // Caused by a trapdoor, for trapdoor to know that this changeturf was caused by itself diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 92f5325f0edd..b795541d31c9 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -158,6 +158,7 @@ DEFINE_BITFIELD(resistance_flags, list( DEFINE_BITFIELD(flags_1, list( "NOJAUNT_1" = NOJAUNT_1, "UNUSED_RESERVATION_TURF_1" = UNUSED_RESERVATION_TURF_1, + "RESERVATION_TURF_1" = RESERVATION_TURF_1, "CAN_BE_DIRTY_1" = CAN_BE_DIRTY_1, "HEAR_1" = HEAR_1, "CHECK_RICOCHET_1" = CHECK_RICOCHET_1, diff --git a/code/_globalvars/regexes.dm b/code/_globalvars/regexes.dm index 86c41cc7ab69..1a8a863a3469 100644 --- a/code/_globalvars/regexes.dm +++ b/code/_globalvars/regexes.dm @@ -6,3 +6,8 @@ GLOBAL_DATUM_INIT(is_email, /regex, regex("\[a-z0-9_-]+@\[a-z0-9_-]+.\[a-z0-9_-] GLOBAL_DATUM_INIT(is_alphanumeric, /regex, regex("\[a-z0-9]+", "i")) GLOBAL_DATUM_INIT(is_punctuation, /regex, regex("\[.!?]+", "i")) GLOBAL_DATUM_INIT(is_color, /regex, regex("^#\[0-9a-fA-F]{6}$")) + +//All characters forbidden by filenames: ", \, \n, \t, /, ?, %, *, :, |, <, >, .. +GLOBAL_DATUM_INIT(filename_forbidden_chars, /regex, regex(@{""|[\\\n\t/?%*:|<>]|\.\."}, "g")) +GLOBAL_PROTECT(filename_forbidden_chars) +// had to use the OR operator for quotes instead of putting them in the character class because it breaks the syntax highlighting otherwise. diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 5258e8619182..036f377b63c0 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -132,16 +132,17 @@ SUBSYSTEM_DEF(mapping) require_area_resort() process_teleport_locs() //Sets up the wizard teleport locations preloadTemplates() + run_map_generation() #ifndef LOWMEMORYMODE // Create space ruin levels while (space_levels_so_far < config.space_ruin_levels) - ++space_levels_so_far add_new_zlevel("Empty Area [space_levels_so_far]", ZTRAITS_SPACE) - // and one level with no ruins - for (var/i in 1 to config.space_empty_levels) ++space_levels_so_far + // Create empty space levels + while (space_levels_so_far < config.space_empty_levels + config.space_ruin_levels) empty_space = add_new_zlevel("Empty Area [space_levels_so_far]", list(ZTRAIT_LINKAGE = CROSSLINKED)) + ++space_levels_so_far // Pick a random away mission. if(CONFIG_GET(flag/roundstart_away)) @@ -194,7 +195,7 @@ SUBSYSTEM_DEF(mapping) message_admins("A shuttle arena failed to load!") log_game("A shuttle arena failed to load!") #endif - run_map_generation() + // Add the transit level var/datum/space_level/base_transit = add_reservation_zlevel() require_area_resort() @@ -218,7 +219,8 @@ SUBSYSTEM_DEF(mapping) var/packetlen = length(packet) while(packetlen) if(MC_TICK_CHECK) - lists_to_reserve.Cut(1, index) + if(index) + lists_to_reserve.Cut(1, index) return var/turf/T = packet[packetlen] T.empty(RESERVED_TURF_TYPE, RESERVED_TURF_TYPE, null, TRUE) @@ -235,6 +237,25 @@ SUBSYSTEM_DEF(mapping) index++ lists_to_reserve.Cut(1, index) +/datum/controller/subsystem/mapping/proc/generate_z_level_linkages() + for(var/z_level in 1 to length(z_list)) + generate_linkages_for_z_level(z_level) + +/datum/controller/subsystem/mapping/proc/generate_linkages_for_z_level(z_level) + if(!isnum(z_level) || z_level <= 0) + return FALSE + + if(multiz_levels.len < z_level) + multiz_levels.len = z_level + + var/z_above = level_trait(z_level, ZTRAIT_UP) + var/z_below = level_trait(z_level, ZTRAIT_DOWN) + if(!(z_above == TRUE || z_above == FALSE || z_above == null) || !(z_below == TRUE || z_below == FALSE || z_below == null)) + stack_trace("Warning, numeric mapping offsets are deprecated. Instead, mark z level connections by setting UP/DOWN to true if the connection is allowed") + multiz_levels[z_level] = new /list(LARGEST_Z_LEVEL_INDEX) + multiz_levels[z_level][Z_LEVEL_UP] = !!z_above + multiz_levels[z_level][Z_LEVEL_DOWN] = !!z_below + /datum/controller/subsystem/mapping/proc/wipe_reservations(wipe_safety_delay = 100) if(clearing_reserved_turfs || !initialized) //in either case this is just not needed. return @@ -264,6 +285,10 @@ SUBSYSTEM_DEF(mapping) returning += M qdel(T, TRUE) +/datum/controller/subsystem/mapping/proc/get_reservation_from_turf(turf/T) + RETURN_TYPE(/datum/turf_reservation) + return used_turfs[T] + /* Nuke threats, for making the blue tiles on the station go RED Used by the AI doomsday and the self destruct nuke. */ @@ -348,7 +373,10 @@ SUBSYSTEM_DEF(mapping) // load the maps for (var/P in parsed_maps) var/datum/parsed_map/pm = P - if (!pm.load(1, 1, start_z + parsed_maps[P], no_changeturf = TRUE, new_z = TRUE)) + var/bounds = pm.bounds + var/x_offset = bounds ? round(world.maxx / 2 - bounds[MAP_MAXX] / 2) + 1 : 1 + var/y_offset = bounds ? round(world.maxy / 2 - bounds[MAP_MAXY] / 2) + 1 : 1 + if (!pm.load(x_offset, y_offset, start_z + parsed_maps[P], no_changeturf = TRUE, new_z = TRUE)) errorList |= pm.original_path if(!silent) INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!") @@ -495,9 +523,9 @@ GLOBAL_LIST_EMPTY(the_station_areas) /datum/controller/subsystem/mapping/proc/preloadRuinTemplates() // Still supporting bans by filename - var/list/banned = generateMapList("[global.config.directory]/lavaruinblacklist.txt") - banned += generateMapList("[global.config.directory]/spaceruinblacklist.txt") - banned += generateMapList("[global.config.directory]/iceruinblacklist.txt") + var/list/banned = generateMapList("lavaruinblacklist.txt") + banned += generateMapList("spaceruinblacklist.txt") + banned += generateMapList("iceruinblacklist.txt") for(var/item in sortList(subtypesof(/datum/map_template/ruin), /proc/cmp_ruincost_priority)) var/datum/map_template/ruin/ruin_type = item @@ -524,7 +552,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) station_room_templates[R.name] = R //yogs /datum/controller/subsystem/mapping/proc/preloadShuttleTemplates() - var/list/unbuyable = generateMapList("[global.config.directory]/unbuyableshuttles.txt") + var/list/unbuyable = generateMapList("unbuyableshuttles.txt") for(var/item in subtypesof(/datum/map_template/shuttle)) var/datum/map_template/shuttle/shuttle_type = item @@ -857,10 +885,6 @@ GLOBAL_LIST_EMPTY(the_station_areas) GLOB.default_lighting_underlays_by_z.len = z_level GLOB.default_lighting_underlays_by_z[z_level] = mutable_appearance(LIGHTING_ICON, "transparent", z_level * 0.01, null, LIGHTING_PLANE, 255, RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM, offset_const = GET_Z_PLANE_OFFSET(z_level)) -/datum/controller/subsystem/mapping/proc/get_reservation_from_turf(turf/T) - RETURN_TYPE(/datum/turf_reservation) - return used_turfs[T] - /datum/controller/subsystem/mapping/proc/get_map_weights() var/list/previous_maps = list() diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 50afece2f532..fab37fb5a696 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -521,10 +521,10 @@ SUBSYSTEM_DEF(shuttle) // Then create a transit docking port in the middle var/coords = M.return_coords(0, 0, dock_dir) /* 0------2 - | | - | | - | x | - 3------1 + * | | + * | | + * | x | + * 3------1 */ var/x0 = coords[1] @@ -541,6 +541,7 @@ SUBSYSTEM_DEF(shuttle) var/turf/midpoint = locate(transit_x, transit_y, bottomleft.z) if(!midpoint) + qdel(proposal) return FALSE var/area/old_area = midpoint.loc old_area.turfs_to_uncontain += proposal.reserved_turfs @@ -718,39 +719,42 @@ SUBSYSTEM_DEF(shuttle) QDEL_NULL(preview_reservation) if(!preview_shuttle) - if(load_template(loading_template)) - preview_shuttle.linkup(loading_template, destination_port) + load_template(loading_template) preview_template = loading_template // get the existing shuttle information, if any var/timer = 0 var/mode = SHUTTLE_IDLE - var/obj/docking_port/stationary/D + var/obj/docking_port/stationary/dest_dock if(istype(destination_port)) - D = destination_port - else if(existing_shuttle) + dest_dock = destination_port + else if(existing_shuttle && replace) timer = existing_shuttle.timer mode = existing_shuttle.mode - D = existing_shuttle.get_docked() + dest_dock = existing_shuttle.get_docked() - if(!D) + if(!dest_dock) + dest_dock = generate_transit_dock(preview_shuttle) + + if(!dest_dock) CRASH("No dock found for preview shuttle ([preview_template.name]), aborting.") - var/result = preview_shuttle.canDock(D) + var/result = preview_shuttle.canDock(dest_dock) // truthy value means that it cannot dock for some reason // but we can ignore the someone else docked error because we'll // be moving into their place shortly if((result != SHUTTLE_CAN_DOCK) && (result != SHUTTLE_SOMEONE_ELSE_DOCKED)) - WARNING("Template shuttle [preview_shuttle] cannot dock at [D] ([result]).") - return + CRASH("Template shuttle [preview_shuttle] cannot dock at [dest_dock] ([result]).") if(existing_shuttle) existing_shuttle.jumpToNullSpace() + preview_shuttle.register(replace) var/list/force_memory = preview_shuttle.movement_force preview_shuttle.movement_force = list("KNOCKDOWN" = 0, "THROW" = 0) - preview_shuttle.initiate_docking(D) + preview_shuttle.mode = SHUTTLE_PREARRIVAL//No idle shuttle moving. Transit dock get removed if shuttle moves too long. + preview_shuttle.initiate_docking(dest_dock) preview_shuttle.movement_force = force_memory . = preview_shuttle @@ -760,7 +764,7 @@ SUBSYSTEM_DEF(shuttle) preview_shuttle.timer = timer preview_shuttle.mode = mode - preview_shuttle.register() + preview_shuttle.postregister(replace) // TODO indicate to the user that success happened, rather than just // blanking the modification tab diff --git a/code/datums/components/rot.dm b/code/datums/components/rot.dm index b37c6773f3f2..35e5879af1eb 100644 --- a/code/datums/components/rot.dm +++ b/code/datums/components/rot.dm @@ -4,25 +4,33 @@ /datum/component/rot/Initialize(new_amount) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE - - if(new_amount) - amount = new_amount + if(isliving(parent)) + var/mob/living/living_parent = parent + //I think this can break in cases where someone becomes a robot post death, but I uh, I don't know how to account for that + if(!(living_parent.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) + return COMPONENT_INCOMPATIBLE START_PROCESSING(SSprocessing, src) /datum/component/rot/process() var/atom/A = parent - var/turf/open/T = get_turf(A) - if(!istype(T) || T.return_air().return_pressure() > (WARNING_HIGH_PRESSURE - 10)) + + var/turf/T = get_turf(A) + if(QDELETED(T) || !isopenturf(T)) + return + + var/datum/gas_mixture/turf_air = T.return_air() + if(!turf_air) return + + if(!istype(T) || turf_air.return_pressure() > (WARNING_HIGH_PRESSURE - 10)) + return + var/area/area = get_area(T) if(area.outdoors) return - var/datum/gas_mixture/turf_air = T.return_air() - if(!turf_air) - return var/datum/gas_mixture/stank_breath = T.remove_air(1 / turf_air.return_volume() * turf_air.total_moles()) if(!stank_breath) return diff --git a/code/datums/elements/mirage_border.dm b/code/datums/elements/mirage_border.dm new file mode 100644 index 000000000000..999455a0b834 --- /dev/null +++ b/code/datums/elements/mirage_border.dm @@ -0,0 +1,41 @@ +/** + * Creates a mirage effect allowing you to see around the world border, by adding the opposite side to its vis_contents. + */ +/datum/element/mirage_border + +/datum/element/mirage_border/Attach(datum/target, turf/target_turf, direction, range=world.view) + . = ..() + if(!isturf(target)) + return ELEMENT_INCOMPATIBLE + #ifdef TESTING + // This is a highly used proc, and these error states never occur, so limit it to testing. + // If something goes wrong it will runtime anyway. + if(!target_turf || !istype(target_turf) || !direction) + stack_trace("[type] improperly attached with the following args: target=\[[target_turf]\], direction=\[[direction]\], range=\[[range]\]") + return ELEMENT_INCOMPATIBLE + #endif + + var/atom/movable/mirage_holder/holder = new(target) + + var/x = target_turf.x + var/y = target_turf.y + var/z = clamp(target_turf.z, 1, world.maxz) + var/turf/southwest = locate(clamp(x - (direction & WEST ? range : 0), 1, world.maxx), clamp(y - (direction & SOUTH ? range : 0), 1, world.maxy), z) + var/turf/northeast = locate(clamp(x + (direction & EAST ? range : 0), 1, world.maxx), clamp(y + (direction & NORTH ? range : 0), 1, world.maxy), z) + holder.vis_contents += block(southwest, northeast) + if(direction & SOUTH) + holder.pixel_y -= world.icon_size * range + if(direction & WEST) + holder.pixel_x -= world.icon_size * range + +/datum/element/mirage_border/Detach(atom/movable/target) + . = ..() + var/atom/movable/mirage_holder/held = locate() in target.contents + if(held) + qdel(held) + +INITIALIZE_IMMEDIATE(/atom/movable/mirage_holder) +// Using /atom/movable because this is a heavily used path +/atom/movable/mirage_holder + name = "Mirage holder" + mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 7c6a41699814..1cf5d4dc2ab6 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -579,7 +579,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( playsound(loc, 'sound/weapons/genhit.ogg', 100, 1) var/turf/open/space/T for(T in orange(1, src)) - T.PlaceOnTop(/turf/open/floor/plating) + T.place_on_top(/turf/open/floor/plating) else say("Something slams into the floor around [src] - luckily, it didn't get through!") playsound(loc, 'sound/effects/bang.ogg', 50, 1) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 973b7e39f7d9..11aa55b781a7 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -447,7 +447,7 @@ GLOBAL_VAR_INIT(cryopods_enabled, FALSE) if(prob(90)) sleepyhead.adjust_drowsiness(rand(3 SECONDS, 10 SECONDS)) if(prob(75)) - sleepyhead.blur_eyes(rand(3, 6)) + sleepyhead.adjust_eye_blur(rand(3, 6)) //so much worse if(prob(66)) sleepyhead.adjust_disgust(rand(25,35)) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 143652cb56a1..1794a6bc3d71 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -212,10 +212,10 @@ for(var/obj/machinery/door/firedoor/FD in here) qdel(FD) for(var/turf/closed/T in range(2, src)) - here.PlaceOnTop(T.type) + here.place_on_top(T.type) qdel(src) return - here.PlaceOnTop(/turf/closed/wall) + here.place_on_top(/turf/closed/wall) qdel(src) return if(10 to 11) diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 855df49cacb3..56a7af725331 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -313,7 +313,7 @@ var/turf/open/space/S = target occupant_message("Building Floor...") if(do_after_cooldown(S)) - S.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + S.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) if(play_sound) playsound(S, 'sound/items/deconstruct.ogg', 50, 1) chassis.spark_system.start() @@ -322,7 +322,7 @@ energy_drain = 750 occupant_message("Building Wall...") if(do_after_cooldown(F)) - F.PlaceOnTop(/turf/closed/wall) + F.place_on_top(/turf/closed/wall) if(play_sound) playsound(F, 'sound/items/deconstruct.ogg', 50, 1) chassis.spark_system.start() diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm index 8e013e9e167f..856873061293 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm @@ -366,7 +366,7 @@ /obj/effect/particle_effect/fluid/foam/metal/smart/make_result() //Smart foam adheres to area borders for walls var/turf/open/location = loc if(isspaceturf(location)) - location.PlaceOnTop(/turf/open/floor/plating/foam) + location.place_on_top(/turf/open/floor/plating/foam) for(var/cardinal in GLOB.cardinals) var/turf/cardinal_turf = get_step(location, cardinal) diff --git a/code/game/objects/effects/spawners/vaultspawner.dm b/code/game/objects/effects/spawners/vaultspawner.dm index 9bdf0a673ed9..31b4a6f7842a 100644 --- a/code/game/objects/effects/spawners/vaultspawner.dm +++ b/code/game/objects/effects/spawners/vaultspawner.dm @@ -20,9 +20,9 @@ for(var/j = lowBoundY,j<=hiBoundY,j++) var/turf/T = locate(i,j,z) if(i == lowBoundX || i == hiBoundX || j == lowBoundY || j == hiBoundY) - T.PlaceOnTop(/turf/closed/wall/vault) + T.place_on_top(/turf/closed/wall/vault) else - T.PlaceOnTop(/turf/open/floor/vault) + T.place_on_top(/turf/open/floor/vault) T.icon_state = "[type]vault" qdel(src) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index c4b03c4c9928..6c55ffe680cd 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -217,7 +217,7 @@ var/turf/T = usr.drop_location() if(!isturf(T)) return - T.PlaceOnTop(R.result_type, flags = CHANGETURF_INHERIT_AIR) + T.place_on_top(R.result_type, flags = CHANGETURF_INHERIT_AIR) else O = new R.result_type(usr.drop_location()) if(O) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index ed25a37e1eed..a99425ec1b81 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -84,7 +84,7 @@ /obj/structure/falsewall/proc/ChangeToWall(delete = 1) var/turf/T = get_turf(src) - T.PlaceOnTop(walltype) + T.place_on_top(walltype) if(delete) qdel(src) return T diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index c007459bf5e7..94ebc96c3bf2 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -74,7 +74,7 @@ S.use(5) to_chat(user, span_notice("You add the plating.")) var/turf/T = get_turf(src) - T.PlaceOnTop(/turf/closed/wall/mineral/iron) + T.place_on_top(/turf/closed/wall/mineral/iron) transfer_fingerprints_to(T) qdel(src) return @@ -108,7 +108,7 @@ S.use(2) to_chat(user, span_notice("You add the plating.")) var/turf/T = get_turf(src) - T.PlaceOnTop(/turf/closed/wall) + T.place_on_top(/turf/closed/wall) transfer_fingerprints_to(T) qdel(src) return @@ -138,7 +138,7 @@ S.use(1) to_chat(user, span_notice("You fully reinforce the wall.")) var/turf/T = get_turf(src) - T.PlaceOnTop(/turf/closed/wall/r_wall) + T.place_on_top(/turf/closed/wall/r_wall) transfer_fingerprints_to(T) qdel(src) return @@ -182,7 +182,7 @@ S.use(2) to_chat(user, span_notice("You add the plating.")) var/turf/T = get_turf(src) - T.PlaceOnTop(text2path("/turf/closed/wall/mineral/[M]")) + T.place_on_top(text2path("/turf/closed/wall/mineral/[M]")) transfer_fingerprints_to(T) qdel(src) return @@ -355,7 +355,7 @@ user.visible_message(span_notice("[user] plates [src] with runed metal."), span_notice("You construct a runed wall.")) R.use(1) var/turf/T = get_turf(src) - T.PlaceOnTop(/turf/closed/wall/mineral/cult) + T.place_on_top(/turf/closed/wall/mineral/cult) qdel(src) else @@ -382,7 +382,7 @@ switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, span_notice("You finish a wall.")) - T.PlaceOnTop(/turf/closed/wall) + T.place_on_top(/turf/closed/wall) qdel(src) return TRUE if(RCD_DECONSTRUCT) @@ -422,7 +422,7 @@ user.visible_message(span_notice("[user] plates [src] with bronze!"), span_notice("You construct a bronze wall.")) B.use(2) var/turf/T = get_turf(src) - T.PlaceOnTop(/turf/closed/wall/mineral/bronze) + T.place_on_top(/turf/closed/wall/mineral/bronze) qdel(src) else diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 4d73a9dad331..bb5ebb5d3cda 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -59,7 +59,7 @@ to_chat(user, span_notice("You build a floor.")) var/turf/T = src.loc if(isspaceturf(T)) - T.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + T.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) qdel(src) return TRUE return FALSE diff --git a/code/game/turfs/baseturfs.dm b/code/game/turfs/baseturfs.dm index 195b52de1106..06316a5aa8cd 100644 --- a/code/game/turfs/baseturfs.dm +++ b/code/game/turfs/baseturfs.dm @@ -1,19 +1,96 @@ -/// Places the given turf on the bottom of the turf stack. -/turf/proc/place_on_bottom(turf/bottom_turf) - baseturfs = baseturfs_string_list( - list(initial(bottom_turf.baseturfs), bottom_turf) + baseturfs, - src - ) - -/// Places a turf at the top of the stack -/turf/proc/place_on_top(turf/added_layer, flags) - var/list/turf/new_baseturfs = list() - - new_baseturfs.Add(baseturfs) - if(isopenturf(src)) - new_baseturfs.Add(type) - - return ChangeTurf(added_layer, new_baseturfs, flags) +/// Take off the top layer turf and replace it with the next baseturf down +/turf/proc/ScrapeAway(amount=1, flags) + if(!amount) + return + if(length(baseturfs)) + var/list/new_baseturfs = baseturfs.Copy() + var/turf_type = new_baseturfs[max(1, new_baseturfs.len - amount + 1)] + while(ispath(turf_type, /turf/baseturf_skipover)) + amount++ + if(amount > new_baseturfs.len) + CRASH("The bottommost baseturf of a turf is a skipover [src]([type])") + turf_type = new_baseturfs[max(1, new_baseturfs.len - amount + 1)] + new_baseturfs.len -= min(amount, new_baseturfs.len - 1) // No removing the very bottom + if(new_baseturfs.len == 1) + new_baseturfs = new_baseturfs[1] + return ChangeTurf(turf_type, new_baseturfs, flags) + + if(baseturfs == type) + return src + + return ChangeTurf(baseturfs, baseturfs, flags) // The bottom baseturf will never go away + +// Take the input as baseturfs and put it underneath the current baseturfs +// If fake_turf_type is provided and new_baseturfs is not the baseturfs list will be created identical to the turf type's +// If both or just new_baseturfs is provided they will be inserted below the existing baseturfs +/turf/proc/place_on_bottom(list/new_baseturfs, turf/fake_turf_type) + if(fake_turf_type) + if(!new_baseturfs) + if(!length(baseturfs)) + baseturfs = list(baseturfs) + var/list/old_baseturfs = baseturfs.Copy() + assemble_baseturfs(fake_turf_type) + if(!length(baseturfs)) + baseturfs = list(baseturfs) + baseturfs -= baseturfs & GLOB.blacklisted_automated_baseturfs + baseturfs += old_baseturfs + return + else if(!length(new_baseturfs)) + new_baseturfs = list(new_baseturfs, fake_turf_type) + else + new_baseturfs += fake_turf_type + if(!length(baseturfs)) + baseturfs = list(baseturfs) + baseturfs.Insert(1, new_baseturfs) + +// Make a new turf and put it on top +// The args behave identical to place_on_bottom except they go on top +// Things placed on top of closed turfs will ignore the topmost closed turf +// Returns the new turf +/turf/proc/place_on_top(list/new_baseturfs, turf/fake_turf_type, flags) + var/area/turf_area = loc + if(new_baseturfs && !length(new_baseturfs)) + new_baseturfs = list(new_baseturfs) + flags = turf_area.PlaceOnTopReact(new_baseturfs, fake_turf_type, flags) // A hook so areas can modify the incoming args + + var/turf/newT + if(flags & CHANGETURF_SKIP) // We haven't been initialized + if(flags_1 & INITIALIZED_1) + stack_trace("CHANGETURF_SKIP was used in a place_on_top call for a turf that's initialized. This is a mistake. [src]([type])") + assemble_baseturfs() + if(fake_turf_type) + if(!new_baseturfs) // If no baseturfs list then we want to create one from the turf type + if(!length(baseturfs)) + baseturfs = list(baseturfs) + var/list/old_baseturfs = baseturfs.Copy() + if(!istype(src, /turf/closed)) + old_baseturfs += type + newT = ChangeTurf(fake_turf_type, null, flags) + newT.assemble_baseturfs(initial(fake_turf_type.baseturfs)) // The baseturfs list is created like roundstart + if(!length(newT.baseturfs)) + newT.baseturfs = list(baseturfs) + newT.baseturfs -= GLOB.blacklisted_automated_baseturfs + newT.baseturfs.Insert(1, old_baseturfs) // The old baseturfs are put underneath + return newT + if(!length(baseturfs)) + baseturfs = list(baseturfs) + if(!istype(src, /turf/closed)) + baseturfs += type + baseturfs += new_baseturfs + return ChangeTurf(fake_turf_type, null, flags) + if(!length(baseturfs)) + baseturfs = list(baseturfs) + if(!istype(src, /turf/closed)) + baseturfs += type + var/turf/change_type + if(length(new_baseturfs)) + change_type = new_baseturfs[new_baseturfs.len] + new_baseturfs.len-- + if(new_baseturfs.len) + baseturfs += new_baseturfs + else + change_type = new_baseturfs + return ChangeTurf(change_type, null, flags) /// Places a turf on top - for map loading /turf/proc/load_on_top(turf/added_layer, flags) @@ -22,7 +99,7 @@ if(flags & CHANGETURF_SKIP) // We haven't been initialized if(flags_1 & INITIALIZED_1) - stack_trace("CHANGETURF_SKIP was used in a PlaceOnTop call for a turf that's initialized. This is a mistake. [src]([type])") + stack_trace("CHANGETURF_SKIP was used in a place_on_top call for a turf that's initialized. This is a mistake. [src]([type])") assemble_baseturfs() var/turf/new_turf @@ -42,6 +119,29 @@ new_turf.baseturfs = baseturfs_string_list(old_baseturfs + (new_turf.baseturfs - GLOB.blacklisted_automated_baseturfs), new_turf) return new_turf +// Copy an existing turf and put it on top +// Returns the new turf +/turf/proc/CopyOnTop(turf/copytarget, ignore_bottom=1, depth=INFINITY, copy_air = FALSE, flags) + var/list/new_baseturfs = list() + new_baseturfs += baseturfs + new_baseturfs += type + + if(depth) + var/list/target_baseturfs + if(length(copytarget.baseturfs)) + // with default inputs this would be Copy(clamp(2, -INFINITY, baseturfs.len)) + // Don't forget a lower index is lower in the baseturfs stack, the bottom is baseturfs[1] + target_baseturfs = copytarget.baseturfs.Copy(clamp(1 + ignore_bottom, 1 + copytarget.baseturfs.len - depth, copytarget.baseturfs.len)) + else if(!ignore_bottom) + target_baseturfs = list(copytarget.baseturfs) + if(target_baseturfs) + target_baseturfs -= new_baseturfs & GLOB.blacklisted_automated_baseturfs + new_baseturfs += target_baseturfs + + var/turf/newT = copytarget.copyTurf(src, copy_air, flags) + newT.baseturfs = new_baseturfs + return newT + /// Tries to find the given type in baseturfs. /// If found, returns how deep it is for use in other baseturf procs, or null if it cannot be found. /// For example, this number can be passed into ScrapeAway to scrape everything until that point. diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 85756e2cb337..6f72c9ee2a83 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -91,26 +91,21 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/list/old_baseturfs = baseturfs - var/list/post_change_callbacks = list() - SEND_SIGNAL(src, COMSIG_TURF_CHANGE, path, new_baseturfs, flags, post_change_callbacks) + var/list/transferring_comps = list() + SEND_SIGNAL(src, COMSIG_TURF_CHANGE, path, new_baseturfs, flags, transferring_comps) + for(var/i in transferring_comps) + var/datum/component/comp = i + comp.ClearFromParent() changing_turf = TRUE qdel(src) //Just get the side effects and call Destroy - //We do this here so anything that doesn't want to persist can clear itself - var/list/old_listen_lookup = _listen_lookup?.Copy() - var/list/old_signal_procs = _signal_procs?.Copy() - var/turf/W = new path(src) - - // WARNING WARNING - // Turfs DO NOT lose their signals when they get replaced, REMEMBER THIS - // It's possible because turfs are fucked, and if you have one in a list and it's replaced with another one, the list ref points to the new turf - if(old_listen_lookup) - LAZYOR(W._listen_lookup, old_listen_lookup) - if(old_signal_procs) - LAZYOR(W._signal_procs, old_signal_procs) - for(var/datum/callback/callback as anything in post_change_callbacks) - callback.InvokeAsync(W) + var/carryover_turf_flags = (RESERVATION_TURF_1 | UNUSED_RESERVATION_TURF_1) & flags_1 + var/turf/W = new path(src) + W.flags_1 = carryover_turf_flags + + for(var/i in transferring_comps) + W.TakeComponent(i) if(new_baseturfs) W.baseturfs = new_baseturfs @@ -188,124 +183,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(!istype(air,/datum/gas_mixture)) Initalize_Atmos(0) -/// Take off the top layer turf and replace it with the next baseturf down -/turf/proc/ScrapeAway(amount=1, flags) - if(!amount) - return - if(length(baseturfs)) - var/list/new_baseturfs = baseturfs.Copy() - var/turf_type = new_baseturfs[max(1, new_baseturfs.len - amount + 1)] - while(ispath(turf_type, /turf/baseturf_skipover)) - amount++ - if(amount > new_baseturfs.len) - CRASH("The bottommost baseturf of a turf is a skipover [src]([type])") - turf_type = new_baseturfs[max(1, new_baseturfs.len - amount + 1)] - new_baseturfs.len -= min(amount, new_baseturfs.len - 1) // No removing the very bottom - if(new_baseturfs.len == 1) - new_baseturfs = new_baseturfs[1] - return ChangeTurf(turf_type, new_baseturfs, flags) - - if(baseturfs == type) - return src - - return ChangeTurf(baseturfs, baseturfs, flags) // The bottom baseturf will never go away - -// Take the input as baseturfs and put it underneath the current baseturfs -// If fake_turf_type is provided and new_baseturfs is not the baseturfs list will be created identical to the turf type's -// If both or just new_baseturfs is provided they will be inserted below the existing baseturfs -/turf/proc/PlaceOnBottom(list/new_baseturfs, turf/fake_turf_type) - if(fake_turf_type) - if(!new_baseturfs) - if(!length(baseturfs)) - baseturfs = list(baseturfs) - var/list/old_baseturfs = baseturfs.Copy() - assemble_baseturfs(fake_turf_type) - if(!length(baseturfs)) - baseturfs = list(baseturfs) - baseturfs -= baseturfs & GLOB.blacklisted_automated_baseturfs - baseturfs += old_baseturfs - return - else if(!length(new_baseturfs)) - new_baseturfs = list(new_baseturfs, fake_turf_type) - else - new_baseturfs += fake_turf_type - if(!length(baseturfs)) - baseturfs = list(baseturfs) - baseturfs.Insert(1, new_baseturfs) - -// Make a new turf and put it on top -// The args behave identical to PlaceOnBottom except they go on top -// Things placed on top of closed turfs will ignore the topmost closed turf -// Returns the new turf -/turf/proc/PlaceOnTop(list/new_baseturfs, turf/fake_turf_type, flags) - var/area/turf_area = loc - if(new_baseturfs && !length(new_baseturfs)) - new_baseturfs = list(new_baseturfs) - flags = turf_area.PlaceOnTopReact(new_baseturfs, fake_turf_type, flags) // A hook so areas can modify the incoming args - - var/turf/newT - if(flags & CHANGETURF_SKIP) // We haven't been initialized - if(flags_1 & INITIALIZED_1) - stack_trace("CHANGETURF_SKIP was used in a PlaceOnTop call for a turf that's initialized. This is a mistake. [src]([type])") - assemble_baseturfs() - if(fake_turf_type) - if(!new_baseturfs) // If no baseturfs list then we want to create one from the turf type - if(!length(baseturfs)) - baseturfs = list(baseturfs) - var/list/old_baseturfs = baseturfs.Copy() - if(!istype(src, /turf/closed)) - old_baseturfs += type - newT = ChangeTurf(fake_turf_type, null, flags) - newT.assemble_baseturfs(initial(fake_turf_type.baseturfs)) // The baseturfs list is created like roundstart - if(!length(newT.baseturfs)) - newT.baseturfs = list(baseturfs) - newT.baseturfs -= GLOB.blacklisted_automated_baseturfs - newT.baseturfs.Insert(1, old_baseturfs) // The old baseturfs are put underneath - return newT - if(!length(baseturfs)) - baseturfs = list(baseturfs) - if(!istype(src, /turf/closed)) - baseturfs += type - baseturfs += new_baseturfs - return ChangeTurf(fake_turf_type, null, flags) - if(!length(baseturfs)) - baseturfs = list(baseturfs) - if(!istype(src, /turf/closed)) - baseturfs += type - var/turf/change_type - if(length(new_baseturfs)) - change_type = new_baseturfs[new_baseturfs.len] - new_baseturfs.len-- - if(new_baseturfs.len) - baseturfs += new_baseturfs - else - change_type = new_baseturfs - return ChangeTurf(change_type, null, flags) - -// Copy an existing turf and put it on top -// Returns the new turf -/turf/proc/CopyOnTop(turf/copytarget, ignore_bottom=1, depth=INFINITY, copy_air = FALSE, flags) - var/list/new_baseturfs = list() - new_baseturfs += baseturfs - new_baseturfs += type - - if(depth) - var/list/target_baseturfs - if(length(copytarget.baseturfs)) - // with default inputs this would be Copy(clamp(2, -INFINITY, baseturfs.len)) - // Don't forget a lower index is lower in the baseturfs stack, the bottom is baseturfs[1] - target_baseturfs = copytarget.baseturfs.Copy(clamp(1 + ignore_bottom, 1 + copytarget.baseturfs.len - depth, copytarget.baseturfs.len)) - else if(!ignore_bottom) - target_baseturfs = list(copytarget.baseturfs) - if(target_baseturfs) - target_baseturfs -= new_baseturfs & GLOB.blacklisted_automated_baseturfs - new_baseturfs += target_baseturfs - - var/turf/newT = copytarget.copyTurf(src, copy_air, flags) - newT.baseturfs = new_baseturfs - return newT - - //If you modify this function, ensure it works correctly with lateloaded map templates. /turf/proc/AfterChange(flags) //called after a turf has been replaced in ChangeTurf() levelupdate() diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 1dc951fc6d42..f44ef3237020 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -88,7 +88,7 @@ * This replaces the current turf if it is plating and is passed plating, is tile and is passed tile. * It places the new turf on top of itself if it is plating and is passed a tile. * It also replaces the turf if it is tile and is passed plating, essentially destroying the over turf. - * Flags argument is passed directly to ChangeTurf or PlaceOnTop + * Flags argument is passed directly to ChangeTurf or place_on_top */ /turf/open/proc/replace_floor(turf/open/new_floor_path, flags) if (!overfloor_placed && initial(new_floor_path.overfloor_placed)) diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index ce29e208588c..856410a9554c 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -40,7 +40,7 @@ switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, span_notice("You build a floor.")) - PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE @@ -72,7 +72,7 @@ playsound(src, 'sound/weapons/genhit.ogg', 50, 1) to_chat(user, span_notice("You build a floor.")) // Create a floor, which has this chasm underneath it - PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else to_chat(user, span_warning("You need one floor tile to build a floor!")) else diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index c0cebd1f3fe9..e7444610c999 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -259,7 +259,7 @@ switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, span_notice("You build a wall.")) - PlaceOnTop(/turf/closed/wall) + place_on_top(/turf/closed/wall) return TRUE if(RCD_AIRLOCK) if((locate(/obj/machinery/door/airlock) in src) || (locate(/obj/machinery/door/window) in src)) // Have to ignore firelocks diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 865d3b6e9fb5..6ea3bdc0b73e 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -68,7 +68,7 @@ to_chat(user, span_notice("You begin reinforcing the floor...")) if(do_after(user, 3 SECONDS, src)) if (R.get_amount() >= 1 && !istype(src, /turf/open/floor/engine)) - PlaceOnTop(/turf/open/floor/engine, flags = CHANGETURF_INHERIT_AIR) + place_on_top(/turf/open/floor/engine, flags = CHANGETURF_INHERIT_AIR) playsound(src, 'sound/items/deconstruct.ogg', 80, 1) R.use(1) to_chat(user, span_notice("You reinforce the floor.")) @@ -82,7 +82,7 @@ var/obj/item/stack/tile/W = C if(!W.use(1)) return - var/turf/open/floor/T = PlaceOnTop(W.turf_type, flags = CHANGETURF_INHERIT_AIR) + var/turf/open/floor/T = place_on_top(W.turf_type, flags = CHANGETURF_INHERIT_AIR) if(istype(W, /obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow var/obj/item/stack/tile/light/L = W var/turf/open/floor/light/F = T diff --git a/code/game/turfs/open/floor/plating/asteroid.dm b/code/game/turfs/open/floor/plating/asteroid.dm index 97a747d723aa..725a9f570778 100644 --- a/code/game/turfs/open/floor/plating/asteroid.dm +++ b/code/game/turfs/open/floor/plating/asteroid.dm @@ -53,7 +53,7 @@ switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, span_notice("You build a floor.")) - PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 55b554a113e0..99bc27e1725f 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -3,6 +3,7 @@ /turf/open/lava name = "lava" icon_state = "lava" + desc = "Looks painful to step in. Don't mine down." gender = PLURAL //"That's some lava." baseturfs = /turf/open/lava //lava all the way down slowdown = 2 @@ -10,6 +11,7 @@ light_range = 2 light_power = 0.75 light_color = LIGHT_COLOR_LAVA + light_on = FALSE bullet_bounce_sound = 'sound/items/welder2.ogg' footstep = FOOTSTEP_LAVA @@ -22,7 +24,14 @@ /// The icon state that covers the lava bits of our turf var/mask_state = "lava-lightmask" -/* //to add when emissives are added :thumbsup: +/turf/open/lava/Initialize(mapload) + . = ..() + // if(fish_source_type) + // AddElement(/datum/element/lazy_fishing_spot, fish_source_type) + refresh_light() + if(!smoothing_flags) + update_appearance() + /turf/open/lava/update_overlays() . = ..() // We need a light overlay here because not every lava turf casts light, only the edge ones @@ -37,7 +46,52 @@ light_mask.blend_mode = BLEND_MULTIPLY light_mask.color = list(-1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,1, 1,1,1,0) . += light_mask -*/ + +/// Refreshes this lava turf's lighting +/turf/open/lava/proc/refresh_light() + var/border_turf = FALSE + var/list/turfs_to_check = RANGE_TURFS(1, src) + if(GET_LOWEST_STACK_OFFSET(z)) + var/turf/above = GET_TURF_ABOVE(src) + if(above) + turfs_to_check += RANGE_TURFS(1, above) + var/turf/below = GET_TURF_BELOW(src) + if(below) + turfs_to_check += RANGE_TURFS(1, below) + + for(var/turf/around as anything in turfs_to_check) + if(islava(around)) + continue + border_turf = TRUE + + if(!border_turf) + set_light(l_on = FALSE) + return + + set_light(l_on = TRUE) + +/turf/open/lava/ChangeTurf(path, list/new_baseturfs, flags) + var/turf/result = ..() + + if(result && !islava(result)) + // We have gone from a lava turf to a non lava turf, time to let them know + var/list/turfs_to_check = RANGE_TURFS(1, result) + if(GET_LOWEST_STACK_OFFSET(z)) + var/turf/above = GET_TURF_ABOVE(result) + if(above) + turfs_to_check += RANGE_TURFS(1, above) + var/turf/below = GET_TURF_BELOW(result) + if(below) + turfs_to_check += RANGE_TURFS(1, below) + for(var/turf/open/lava/inform in turfs_to_check) + inform.set_light(l_on = TRUE) + + return result + +/turf/open/lava/smooth_icon() + . = ..() + mask_state = icon_state + update_appearance(~UPDATE_SMOOTHING) /turf/open/lava/ex_act(severity, target) contents_explosion(severity, target) @@ -83,7 +137,7 @@ switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, span_notice("You build a floor.")) - PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE @@ -185,17 +239,14 @@ name = "lava" baseturfs = /turf/open/lava/smooth icon = 'icons/turf/floors/lava.dmi' + mask_icon = 'icons/turf/floors/lava_mask.dmi' icon_state = "lava-255" mask_state = "lava-255" base_icon_state = "lava" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_LAVA canSmoothWith = SMOOTH_GROUP_FLOOR_LAVA - -/turf/open/lava/smooth_icon() - . = ..() - mask_state = icon_state - update_appearance(~UPDATE_SMOOTHING) + underfloor_accessibility = 2 //This avoids strangeness when routing pipes / wires along catwalks over lava /turf/open/lava/smooth/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index a73bcb32b632..e2c333838a42 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -1,10 +1,13 @@ /turf/open/openspace name = "open space" desc = "Watch your step!" - icon_state = "grey" + // We don't actually draw openspace, but it needs to have color + // In its icon state so we can count it as a "non black" tile + icon_state = MAP_SWITCH("pure_white", "invisible") baseturfs = /turf/open/openspace overfloor_placed = FALSE underfloor_accessibility = UNDERFLOOR_INTERACTABLE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT CanAtmosPassVertical = ATMOS_PASS_YES flags_1 = NO_RUST plane = TRANSPARENT_FLOOR_PLANE @@ -12,18 +15,26 @@ var/can_cover_up = TRUE var/can_build_on = TRUE -/turf/open/openspace/debug/update_multiz() - ..() - return TRUE - +// Reminder, any behavior code written here needs to be duped to /turf/open/space/openspace +// I am so sorry /turf/open/openspace/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() - - RegisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE, PROC_REF(on_atom_created)) + if(PERFORM_ALL_TESTS(focus_only/openspace_clear) && !GET_TURF_BELOW(src)) + stack_trace("[src] was inited as openspace with nothing below it at ([x], [y], [z])") + RegisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(on_atom_created)) var/area/our_area = loc if(istype(our_area, /area/space)) force_no_gravity = TRUE return INITIALIZE_HINT_LATELOAD + +/turf/open/openspace/LateInitialize() + . = ..() + AddElement(/datum/element/turf_z_transparency) + +/turf/open/openspace/ChangeTurf(path, list/new_baseturfs, flags) + UnregisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON) + return ..() + /** * Drops movables spawned on this turf after they are successfully initialized. * so that spawned movables that should fall to gravity, will fall. @@ -38,46 +49,37 @@ return zFall(movable) -/turf/open/openspace/LateInitialize() - update_multiz(TRUE, TRUE) - -/turf/open/openspace/Destroy() - vis_contents.len = 0 - return ..() - -/turf/open/openspace/update_multiz(prune_on_fail = FALSE, init = FALSE) - . = ..() - var/turf/T = below() - if(!T) - vis_contents.len = 0 - if(prune_on_fail) - ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - return FALSE - if(init) - vis_contents += T - return TRUE - -/turf/open/openspace/multiz_turf_del(turf/T, dir) - if(dir != DOWN) - return - update_multiz() - -/turf/open/openspace/multiz_turf_new(turf/T, dir) - if(dir != DOWN) - return - update_multiz() - /turf/open/openspace/zAirIn() return TRUE /turf/open/openspace/zAirOut() return TRUE -/turf/open/openspace/zPassIn(atom/movable/A, direction, turf/source) - return TRUE - -/turf/open/openspace/zPassOut(atom/movable/A, direction, turf/destination) - return TRUE +/turf/open/openspace/zPassIn(direction) + if(direction == DOWN) + for(var/obj/contained_object in contents) + if(contained_object.obj_flags & BLOCK_Z_IN_DOWN) + return FALSE + return TRUE + if(direction == UP) + for(var/obj/contained_object in contents) + if(contained_object.obj_flags & BLOCK_Z_IN_UP) + return FALSE + return TRUE + return FALSE + +/turf/open/openspace/zPassOut(direction) + if(direction == DOWN) + for(var/obj/contained_object in contents) + if(contained_object.obj_flags & BLOCK_Z_OUT_DOWN) + return FALSE + return TRUE + if(direction == UP) + for(var/obj/contained_object in contents) + if(contained_object.obj_flags & BLOCK_Z_OUT_UP) + return FALSE + return TRUE + return FALSE /turf/open/openspace/proc/CanCoverUp() return can_cover_up @@ -121,7 +123,7 @@ qdel(L) playsound(src, 'sound/weapons/genhit.ogg', 50, 1) to_chat(user, span_notice("You build a floor.")) - PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else to_chat(user, span_warning("You need one floor tile to build a floor!")) else diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index d9dac63995ee..bd1102fdf055 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -83,34 +83,6 @@ GLOBAL_LIST_EMPTY(starlight) //This is used to optimize the map loader return -/turf/open/space/Initialize(mapload) - SHOULD_CALL_PARENT(FALSE) - icon_state = SPACE_ICON_STATE - if(!space_gas) - space_gas = new - air = space_gas - update_air_ref(0) - vis_contents.Cut() //removes inherited overlays - visibilityChanged() - - if (PERFORM_ALL_TESTS(focus_only/multiple_space_initialization)) - if(flags_1 & INITIALIZED_1) - stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 - - var/area/our_area = loc - if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(our_area)) - add_overlay(/obj/effect/fullbright) - - if (light_system == STATIC_LIGHT && light_power && light_range) - update_light() - - if (opacity) - directional_opacity = ALL_CARDINALS - - return INITIALIZE_HINT_NORMAL - - /turf/open/space/Destroy() GLOB.starlight -= src return ..() diff --git a/code/game/turfs/open/space/space_EXPENSIVE.dm b/code/game/turfs/open/space/space_EXPENSIVE.dm new file mode 100644 index 000000000000..a9b3222bd592 --- /dev/null +++ b/code/game/turfs/open/space/space_EXPENSIVE.dm @@ -0,0 +1,45 @@ +/** + * Space Initialize + * + * Doesn't call parent, see [/atom/proc/Initialize]. + * When adding new stuff to /atom/Initialize, /turf/Initialize, etc + * don't just add it here unless space actually needs it. + * + * There is a lot of work that is intentionally not done because it is not currently used. + * This includes stuff like smoothing, blocking camera visibility, etc. + * If you are facing some odd bug with specifically space, check if it's something that was + * intentionally ommitted from this implementation. + */ +/turf/open/space/Initialize(mapload) + SHOULD_CALL_PARENT(FALSE) + air = space_gas + + if (PERFORM_ALL_TESTS(focus_only/multiple_space_initialization)) + if(flags_1 & INITIALIZED_1) + stack_trace("Warning: [src]([type]) initialized multiple times!") + flags_1 |= INITIALIZED_1 + + // We make the assumption that the space plane will never be blacklisted, as an optimization + if(SSmapping.max_plane_offset) + plane = PLANE_SPACE - (PLANE_RANGE * SSmapping.z_level_to_plane_offset[z]) + + var/area/our_area = loc + if(!our_area.area_has_base_lighting && space_lit) //Only provide your own lighting if the area doesn't for you + // Intentionally not add_overlay for performance reasons. + // add_overlay does a bunch of generic stuff, like creating a new list for overlays, + // queueing compile, cloning appearance, etc etc etc that is not necessary here. + overlays += GLOB.starlight_overlays[GET_TURF_PLANE_OFFSET(src) + 1] + + if (!mapload) + if(requires_activation) + ImmediateCalculateAdjacentTurfs() + + if(SSmapping.max_plane_offset) + var/turf/T = GET_TURF_ABOVE(src) + if(T) + T.multiz_turf_new(src, DOWN) + T = GET_TURF_BELOW(src) + if(T) + T.multiz_turf_new(src, UP) + + return INITIALIZE_HINT_NORMAL diff --git a/code/game/turfs/open/space/transit.dm b/code/game/turfs/open/space/transit.dm index 3e641c17f9fc..15b667e30adf 100644 --- a/code/game/turfs/open/space/transit.dm +++ b/code/game/turfs/open/space/transit.dm @@ -16,6 +16,7 @@ /turf/open/space/transit/Destroy() //Signals are NOT removed from turfs upon replacement, and we get replaced ALOT, so unregister our signal UnregisterSignal(src, list(COMSIG_TURF_RESERVATION_RELEASED, COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) + return ..() /turf/open/space/transit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) @@ -23,6 +24,14 @@ underlay_appearance.icon_state = "speedspace_ns_[get_transit_state(asking_turf)]" underlay_appearance.transform = turn(matrix(), get_transit_angle(asking_turf)) +/turf/open/space/transit/update_icon() + . = ..() + transform = turn(matrix(), get_transit_angle(src)) + +/turf/open/space/transit/update_icon_state() + icon_state = "speedspace_ns_[get_transit_state(src)]" + return ..() + /turf/open/space/transit/proc/initialize_drifting(atom/entered, atom/movable/enterer) SIGNAL_HANDLER @@ -88,11 +97,6 @@ /turf/open/space/transit/east dir = EAST -/turf/open/space/transit/update_icon_state() - . = ..() - icon_state = "speedspace_ns_[get_transit_state(src)]" - transform = turn(matrix(), get_transit_angle(src)) - /proc/get_transit_state(turf/T) var/p = 9 . = 1 diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 753c4c228e7f..7c4f668b44cb 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -610,12 +610,13 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/proc/add_blueprints(atom/movable/AM) var/image/I = new + SET_PLANE(I, GAME_PLANE, src) + I.layer = OBJ_LAYER I.appearance = AM.appearance I.appearance_flags = RESET_COLOR|RESET_ALPHA|RESET_TRANSFORM I.loc = src I.setDir(AM.dir) I.alpha = 128 - LAZYADD(blueprint_data, I) diff --git a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm index 7270696af35b..8a79dde170f9 100644 --- a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm +++ b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm @@ -60,9 +60,9 @@ brass_floor = TRUE if(W.use(2 - brass_floor)) if(anchored) - T.PlaceOnTop(/turf/closed/wall/clockwork) + T.place_on_top(/turf/closed/wall/clockwork) else - T.PlaceOnTop(/turf/open/floor/clockwork, flags = CHANGETURF_INHERIT_AIR) + T.place_on_top(/turf/open/floor/clockwork, flags = CHANGETURF_INHERIT_AIR) new /obj/structure/falsewall/brass(T) qdel(src) else diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 716568c4736c..519f16e4b613 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -223,7 +223,7 @@ var/turf/T = safepick(validturfs) if(T) if(istype(T, /turf/open/floor/plating)) - T.PlaceOnTop(/turf/open/floor/engine/cult, flags = CHANGETURF_IGNORE_AIR) + T.place_on_top(/turf/open/floor/engine/cult, flags = CHANGETURF_IGNORE_AIR) else T.ChangeTurf(/turf/open/floor/engine/cult, flags = CHANGETURF_IGNORE_AIR) else diff --git a/code/modules/antagonists/eldritch_cult/magic/rust_magic.dm b/code/modules/antagonists/eldritch_cult/magic/rust_magic.dm index 8804e4240d29..9cea94672e9b 100644 --- a/code/modules/antagonists/eldritch_cult/magic/rust_magic.dm +++ b/code/modules/antagonists/eldritch_cult/magic/rust_magic.dm @@ -226,7 +226,7 @@ RUST PATH SPELLS GO HERE /datum/action/cooldown/spell/pointed/rust_construction/cast(turf/open/cast_on) . = ..() var/rises_message = "rises out of [cast_on]" - var/turf/closed/wall/new_wall = cast_on.PlaceOnTop(/turf/closed/wall) + var/turf/closed/wall/new_wall = cast_on.place_on_top(/turf/closed/wall) if(!istype(new_wall)) return diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index fde8a87c5f97..ee561c802f13 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -39,6 +39,7 @@ GLOBAL_LIST_INIT(potentialConfigRandomZlevels, generateConfigMapList(directory = /proc/generateMapList(filename) . = list() + filename = "[global.config.directory]/[SANITIZE_FILENAME(filename)]" var/list/Lines = world.file2list(filename) if(!Lines.len) diff --git a/code/modules/buildmode/submodes/basic.dm b/code/modules/buildmode/submodes/basic.dm index a52b4642490c..d6aaa08685f2 100644 --- a/code/modules/buildmode/submodes/basic.dm +++ b/code/modules/buildmode/submodes/basic.dm @@ -22,13 +22,13 @@ if(istype(object,/turf) && left_click && !alt_click && !ctrl_click) var/turf/T = object if(isspaceturf(object) || ischasm(object) || islava(object)) - T.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + T.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else if(isplatingturf(object)) - T.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) + T.place_on_top(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) else if(isfloorturf(object)) - T.PlaceOnTop(/turf/closed/wall) + T.place_on_top(/turf/closed/wall) else if(iswallturf(object)) - T.PlaceOnTop(/turf/closed/wall/r_wall) + T.place_on_top(/turf/closed/wall/r_wall) log_admin("Build Mode: [key_name(c)] built [T] at [AREACOORD(T)]") return else if(right_click) diff --git a/code/modules/buildmode/submodes/fill.dm b/code/modules/buildmode/submodes/fill.dm index c71f12eab249..04c60d35ef46 100644 --- a/code/modules/buildmode/submodes/fill.dm +++ b/code/modules/buildmode/submodes/fill.dm @@ -59,7 +59,7 @@ else for(var/turf/T in block(get_turf(cornerA),get_turf(cornerB))) if(ispath(objholder,/turf)) - T.PlaceOnTop(objholder) + T.place_on_top(objholder) else var/obj/A = new objholder(T) A.setDir(BM.build_dir) diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 5bba3f117cf6..4f2bd6b9ecf5 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -289,7 +289,7 @@ if (openingSound) playsound(get_turf(holder), openingSound, soundVolume, FALSE, FALSE) //Special admin sound to play for (var/turf_type in turfs_in_cargo) - turf_underneath.PlaceOnTop(turf_type) + turf_underneath.place_on_top(turf_type) for (var/cargo in contents) var/atom/movable/movable_cargo = cargo movable_cargo.forceMove(turf_underneath) diff --git a/code/modules/events/shuttle_catastrophe.dm b/code/modules/events/shuttle_catastrophe.dm index 7fa850c78943..91a398b9f524 100644 --- a/code/modules/events/shuttle_catastrophe.dm +++ b/code/modules/events/shuttle_catastrophe.dm @@ -13,8 +13,14 @@ /datum/round_event/shuttle_catastrophe var/datum/map_template/shuttle/new_shuttle - var/list/datum/map_template/shuttle/blacklisted_shuttles = list(/datum/map_template/shuttle/emergency/arena, /datum/map_template/shuttle/emergency/construction, - /datum/map_template/shuttle/emergency/construction/small, /datum/map_template/shuttle/emergency/discoinferno, /datum/map_template/shuttle/emergency/meteor) + var/list/datum/map_template/shuttle/blacklisted_shuttles = list( + /datum/map_template/shuttle/emergency/arena, + /datum/map_template/shuttle/emergency/construction, + /datum/map_template/shuttle/emergency/construction/small, + /datum/map_template/shuttle/emergency/discoinferno, + /datum/map_template/shuttle/emergency/meteor, + ) + /datum/round_event/shuttle_catastrophe/announce(fake) var/cause = pick("was attacked by [syndicate_name()] Operatives", "mysteriously teleported away", "had its refuelling crew mutiny", "was found with its engines stolen", "\[REDACTED\]", "flew into the sunset, and melted", "fell into a black hole", @@ -23,19 +29,19 @@ priority_announce("Your emergency shuttle [cause]. Your replacement shuttle will be the [new_shuttle.name] until further notice.", "CentCom Spacecraft Engineering") /datum/round_event/shuttle_catastrophe/setup() + if(!isnull(new_shuttle)) //If an admin has overridden it don't re-roll it + return var/list/valid_shuttle_templates = list() for(var/shuttle_id in SSmapping.shuttle_templates) var/datum/map_template/shuttle/template = SSmapping.shuttle_templates[shuttle_id] - if(template.credit_cost < INFINITY) //if we could get it from the emagged communications console, it's cool for us to get it here - if (!(template in blacklisted_shuttles)) - valid_shuttle_templates += template + if(!(template in blacklisted_shuttles) && template.credit_cost < INFINITY) //if we could get it from the communications console, it's cool for us to get it here + valid_shuttle_templates += template new_shuttle = pick(valid_shuttle_templates) /datum/round_event/shuttle_catastrophe/start() SSshuttle.shuttle_purchased = SHUTTLEPURCHASE_FORCED SSshuttle.unload_preview() - SSshuttle.load_template(new_shuttle) SSshuttle.existing_shuttle = SSshuttle.emergency SSshuttle.emergency.name = new_shuttle.name - SSshuttle.action_load(new_shuttle) + SSshuttle.action_load(new_shuttle, replace = TRUE) log_game("Shuttle Catastrophe set a new shuttle, [new_shuttle.name].") diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 24dead54cfbe..d20448ef9243 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -111,6 +111,7 @@ // need these two below? SSmachines.setup_template_powernets(cables) SSair.setup_template_machinery(atmos_machines) + //SSshuttle.setup_shuttles(ports) //calculate all turfs inside the border var/list/template_and_bordering_turfs = block( @@ -126,7 +127,7 @@ ) ) for(var/turf/affected_turf as anything in template_and_bordering_turfs) - affected_turf.air_update_turf(TRUE, TRUE) + affected_turf.ImmediateCalculateAdjacentTurfs() affected_turf.levelupdate() /datum/map_template/proc/load_new_z(secret = FALSE) @@ -194,19 +195,19 @@ //initialize things that are normally initialized after map load initTemplateBounds(bounds) - // if(has_ceiling) - // var/affected_turfs = get_affected_turfs(T, FALSE) - // generate_ceiling(affected_turfs) + if(has_ceiling) + var/affected_turfs = get_affected_turfs(T, FALSE) + generate_ceiling(affected_turfs) log_game("[name] loaded at [T.x],[T.y],[T.z]") return bounds -// /datum/map_template/proc/generate_ceiling(affected_turfs) -// for (var/turf/turf in affected_turfs) -// var/turf/ceiling = get_step_multiz(turf, UP) -// if (ceiling) -// if (istype(ceiling, /turf/open/openspace) || istype(ceiling, /turf/open/space/openspace)) -// ceiling.ChangeTurf(ceiling_turf, ceiling_baseturfs, CHANGETURF_INHERIT_AIR) +/datum/map_template/proc/generate_ceiling(affected_turfs) + for (var/turf/turf in affected_turfs) + var/turf/ceiling = get_step_multiz(turf, UP) + if (ceiling) + if (istype(ceiling, /turf/open/openspace) || istype(ceiling, /turf/open/space/openspace)) + ceiling.ChangeTurf(ceiling_turf, ceiling_baseturfs, CHANGETURF_INHERIT_AIR) /datum/map_template/proc/post_load() return diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 1d065cb064eb..dcee2c37f556 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -6,8 +6,9 @@ name = "baseturf editor" icon = 'icons/effects/mapping_helpers.dmi' icon_state = "" - + /// Replacing a specific turf var/list/baseturf_to_replace + /// The desired bottom turf var/baseturf plane = POINT_PLANE @@ -18,7 +19,7 @@ /obj/effect/baseturf_helper/LateInitialize() if(!baseturf_to_replace) - baseturf_to_replace = typecacheof(/turf/open/space) + baseturf_to_replace = typecacheof(list(/turf/open/space,/turf/baseturf_bottom)) else if(!length(baseturf_to_replace)) baseturf_to_replace = list(baseturf_to_replace = TRUE) else if(baseturf_to_replace[baseturf_to_replace[1]] != TRUE) // It's not associative @@ -33,20 +34,16 @@ qdel(src) +/// Replaces all the requested baseturfs (usually space/baseturfbottom) with the desired baseturf. Skips if its already there /obj/effect/baseturf_helper/proc/replace_baseturf(turf/thing) - var/list/baseturf_cache = thing.baseturfs - if(length(baseturf_cache)) - for(var/i in baseturf_cache) - if(baseturf_to_replace[i]) - baseturf_cache -= i - if(!baseturf_cache.len) - thing.assemble_baseturfs(baseturf) - else - thing.PlaceOnBottom(null, baseturf) - else if(baseturf_to_replace[thing.baseturfs]) - thing.assemble_baseturfs(baseturf) - else - thing.PlaceOnBottom(null, baseturf) + thing.remove_baseturfs_from_typecache(baseturf_to_replace) + + if(length(thing.baseturfs)) + var/turf/tile = thing.baseturfs[1] + if(tile == baseturf) + return + + thing.place_on_bottom(baseturf) @@ -90,6 +87,9 @@ /obj/effect/mapping_helpers icon = 'icons/effects/mapping_helpers.dmi' icon_state = "" + anchored = TRUE + // Unless otherwise specified, layer above everything + layer = ABOVE_ALL_MOB_LAYER var/late = FALSE /obj/effect/mapping_helpers/Initialize(mapload) diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index ab6743ff17a0..77c9731da35a 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -148,7 +148,7 @@ * - y_upper: The maximum y coordinate to load * - z_lower: The minimum z coordinate to load * - z_upper: The maximum z coordinate to load - * - place_on_top: Whether to use /turf/proc/PlaceOnTop rather than /turf/proc/ChangeTurf + * - place_on_top: Whether to use /turf/proc/place_on_top rather than /turf/proc/ChangeTurf * - new_z: If true, a new z level will be created for the map */ /proc/load_map( diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm index 34f2774b5aa8..b0e2ff7fa065 100644 --- a/code/modules/mapping/space_management/multiz_helpers.dm +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -44,22 +44,3 @@ us = next next = GET_TURF_ABOVE(us) return us - -/proc/dir_inverse_multiz(dir) - var/holder = dir & (UP|DOWN) - if((holder == NONE) || (holder == (UP|DOWN))) - return turn(dir, 180) - dir &= ~(UP|DOWN) - dir = turn(dir, 180) - if(holder == UP) - holder = DOWN - else - holder = UP - dir |= holder - return dir - -/turf/proc/above() - return get_step_multiz(src, UP) - -/turf/proc/below() - return get_step_multiz(src, DOWN) diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index a3ff5f892554..25305978ef44 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -56,20 +56,20 @@ INVOKE_ASYNC(SSmapping, TYPE_PROC_REF(/datum/controller/subsystem/mapping, reserve_turfs), release_turfs) /// Attempts to calaculate and store a list of turfs around the reservation for cordoning. Returns whether a valid cordon was calculated -/datum/turf_reservation/proc/calculate_cordon_turfs(turf/BL, turf/TR) - if(BL.x < 2 || BL.y < 2 || TR.x > (world.maxx - 2) || TR.y > (world.maxy - 2)) +/datum/turf_reservation/proc/calculate_cordon_turfs(turf/bottom_left, turf/top_right) + if(bottom_left.x < 2 || bottom_left.y < 2 || top_right.x > (world.maxx - 2) || top_right.y > (world.maxy - 2)) return FALSE // no space for a cordon here - var/list/possible_turfs = CORNER_OUTLINE(BL, width, height) + var/list/possible_turfs = CORNER_OUTLINE(bottom_left, width, height) + // if they're our cordon turfs, accept them + possible_turfs -= cordon_turfs for(var/turf/cordon_turf as anything in possible_turfs) - if(!(cordon_turf.flags_1 & UNUSED_RESERVATION_TURF_1)) + if(!(cordon_turf.turf_flags & UNUSED_RESERVATION_TURF)) return FALSE - cordon_turfs = possible_turfs - - pre_cordon_turfs.Cut() + cordon_turfs |= possible_turfs if(pre_cordon_distance) - var/turf/offset_turf = locate(BL.x + pre_cordon_distance, BL.y + pre_cordon_distance, BL.z) + var/turf/offset_turf = locate(bottom_left.x + pre_cordon_distance, bottom_left.y + pre_cordon_distance, bottom_left.z) var/list/to_add = CORNER_OUTLINE(offset_turf, width - pre_cordon_distance * 2, height - pre_cordon_distance * 2) //we step-by-stop move inwards from the outer cordon for(var/turf/turf_being_added as anything in to_add) pre_cordon_turfs |= turf_being_added //add one by one so we can filter out duplicates @@ -136,7 +136,6 @@ if(!HAS_TRAIT(enterer, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT)) space_dump(source, enterer) - /// Internal proc which handles reserving the area for the reservation. /datum/turf_reservation/proc/_reserve_area(width, height, zlevel) src.width = width @@ -179,6 +178,7 @@ reserved_turfs |= T SSmapping.unused_turfs["[T.z]"] -= T SSmapping.used_turfs[T] = src + T.flags_1 = (T.flags_1 | RESERVATION_TURF_1) & ~UNUSED_RESERVATION_TURF_1 T.ChangeTurf(turf_type, turf_type) bottom_left_turfs += BL diff --git a/code/modules/mapping/space_management/space_transition.dm b/code/modules/mapping/space_management/space_transition.dm index 7311681fbfc4..b61897dd7b6b 100644 --- a/code/modules/mapping/space_management/space_transition.dm +++ b/code/modules/mapping/space_management/space_transition.dm @@ -93,13 +93,13 @@ level.set_neigbours(used_points) point = pick(possible_points) CHECK_TICK - + // Now that we've handed out neighbors, we're gonna handle an edge case // Need to check if all our levels have neighbors in all directions // If they don't, we'll make them wrap all the way around to the other side of the grid for(var/direction in GLOB.cardinals) var/dir = "[direction]" - var/inverse = "[turn(direction, 180)]" + var/inverse = "[REVERSE_DIR(direction)]" for(var/datum/space_level/level as anything in transition_levels) // If we have something in this dir that isn't just us, continue on if(level.neigbours[dir] && level.neigbours[dir] != level) @@ -114,16 +114,18 @@ //Lists below are pre-calculated values arranged in the list in such a way to be easily accessable in the loop by the counter //Its either this or madness with lotsa math - var/inner_max_x = world.maxx - TRANSITIONEDGE var/inner_max_y = world.maxy - TRANSITIONEDGE var/list/x_pos_beginning = list(1, 1, inner_max_x, 1) //x values of the lowest-leftest turfs of the respective 4 blocks on each side of zlevel var/list/y_pos_beginning = list(inner_max_y, 1, 1 + TRANSITIONEDGE, 1 + TRANSITIONEDGE) //y values respectively - var/list/x_pos_ending = list(world.maxx, world.maxx, world.maxx, 1 + TRANSITIONEDGE) //x values of the highest-rightest turfs of the respective 4 blocks on each side of zlevel + var/list/x_pos_ending = list(world.maxx, world.maxx, world.maxx, 1 + TRANSITIONEDGE) //x values of the highest-rightest turfs of the respective 4 blocks on each side of zlevel var/list/y_pos_ending = list(world.maxy, 1 + TRANSITIONEDGE, inner_max_y, inner_max_y) //y values respectively var/list/x_pos_transition = list(1, 1, TRANSITIONEDGE + 2, inner_max_x - 1) //values of x for the transition from respective blocks on the side of zlevel, 1 is being translated into turfs respective x value later in the code var/list/y_pos_transition = list(TRANSITIONEDGE + 2, inner_max_y - 1, 1, 1) //values of y for the transition from respective blocks on the side of zlevel, 1 is being translated into turfs respective y value later in the code + // Cache the range passed to the mirage border element, to reduce world var access in the thousands + var/range_cached = world.view + for(var/datum/space_level/level as anything in cached_z_list) if(!level.neigbours.len) continue @@ -142,7 +144,7 @@ S.destination_x = x_target || S.x S.destination_y = y_target || S.y S.destination_z = zdestination - + // Mirage border code var/mirage_dir if(S.x == 1 + TRANSITIONEDGE) @@ -157,6 +159,6 @@ continue var/turf/place = locate(S.destination_x, S.destination_y, zdestination) - S.AddComponent(/datum/component/mirage_border, place, mirage_dir) + S.AddElement(/datum/element/mirage_border, place, mirage_dir, range_cached) #undef CHORDS_TO_1D diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm index 0aadf6d40349..6ca2f822f661 100644 --- a/code/modules/mapping/space_management/zlevel_manager.dm +++ b/code/modules/mapping/space_management/zlevel_manager.dm @@ -17,8 +17,10 @@ var/list/features = default_map_traits[I] var/datum/space_level/S = new(I, features[DL_NAME], features[DL_TRAITS]) manage_z_level(S, filled_with_space = FALSE) - //generate_z_level_linkages() // Default Zs don't use add_new_zlevel() so they don't automatically generate z-linkages. + generate_z_level_linkages() // Default Zs don't use add_new_zlevel() so they don't automatically generate z-linkages. +/// Generates a real, honest to god new z level. Will create the actual space, and also generate a datum that holds info about the new plot of land +/// Accepts the name, traits list, datum type, and if we should manage the turfs we create /datum/controller/subsystem/mapping/proc/add_new_zlevel(name, traits = list(), z_type = /datum/space_level, contain_turfs = TRUE) UNTIL(!adding_new_zlevel) adding_new_zlevel = TRUE @@ -29,7 +31,7 @@ // TODO: sleep here if the Z level needs to be cleared var/datum/space_level/S = new z_type(new_z, name, traits) manage_z_level(S, filled_with_space = TRUE, contain_turfs = contain_turfs) - //generate_linkages_for_z_level(new_z) + generate_linkages_for_z_level(new_z) adding_new_zlevel = FALSE SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_Z, S) return S diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index c0c624ae27c0..f09a96c64678 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -323,9 +323,9 @@ sleep(5 SECONDS) if(mode == BOT_REPAIRING && src.loc == target_turf) if(autotile) //Build the floor and include a tile. - target_turf.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) + target_turf.place_on_top(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) else //Build a hull plating without a floor tile. - target_turf.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + target_turf.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else var/turf/open/floor/F = target_turf @@ -339,7 +339,7 @@ if(mode == BOT_REPAIRING && F && src.loc == F) F.broken = FALSE F.burnt = FALSE - F.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) + F.place_on_top(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) if(replacetiles && F.type != initial(tiletype.turf_type) && specialtiles && !isplatingturf(F)) anchored = TRUE @@ -350,7 +350,7 @@ if(mode == BOT_REPAIRING && F && src.loc == F) F.broken = FALSE F.burnt = FALSE - F.PlaceOnTop(initial(tiletype.turf_type), flags = CHANGETURF_INHERIT_AIR) + F.place_on_top(initial(tiletype.turf_type), flags = CHANGETURF_INHERIT_AIR) specialtiles -= 1 if(specialtiles == 0) speak("Requesting refill of custom floortiles to continue replacing.") diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 86225ee4f94d..7d747963dd08 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1765,7 +1765,7 @@ /datum/reagent/carpet/reaction_turf(turf/T, reac_volume) if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet, flags = CHANGETURF_INHERIT_AIR) + F.place_on_top(/turf/open/floor/carpet, flags = CHANGETURF_INHERIT_AIR) ..() /datum/reagent/bromine diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm index 1bd27290d2d4..6bf65e72e416 100644 --- a/code/modules/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/ruins/lavalandruin_code/puzzle.dm @@ -173,7 +173,7 @@ //Setup random empty tile empty_tile_id = pick_n_take(left_ids) var/turf/empty_tile_turf = get_turf_for_id(empty_tile_id) - empty_tile_turf.PlaceOnTop(floor_type,null,CHANGETURF_INHERIT_AIR) + empty_tile_turf.place_on_top(floor_type,null,CHANGETURF_INHERIT_AIR) var/mutable_appearance/MA = new(puzzle_pieces["[empty_tile_id]"]) MA.layer = empty_tile_turf.layer + 0.1 empty_tile_turf.add_overlay(MA) @@ -182,7 +182,7 @@ var/list/empty_spots = left_ids.Copy() for(var/spot_id in empty_spots) var/turf/T = get_turf_for_id(spot_id) - T = T.PlaceOnTop(floor_type,null,CHANGETURF_INHERIT_AIR) + T = T.place_on_top(floor_type,null,CHANGETURF_INHERIT_AIR) var/obj/structure/puzzle_element/E = new element_type(T) elements += E var/chosen_id = pick_n_take(left_ids) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 357f2b50949d..eb3a3ae5d94b 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -34,7 +34,28 @@ ///Delete this port after ship fly off. var/delete_after = FALSE - //these objects are indestructible + ///are we registered in SSshuttles? + var/registered = FALSE + +///register to SSshuttles +/obj/docking_port/proc/register() + if(registered) + WARNING("docking_port registered multiple times") + unregister() + registered = TRUE + return + +///unregister from SSshuttles +/obj/docking_port/proc/unregister() + if(!registered) + WARNING("docking_port unregistered multiple times") + registered = FALSE + return + +/obj/docking_port/proc/Check_id() + return + +//these objects are indestructible /obj/docking_port/Destroy(force) // unless you assert that you know what you're doing. Horrible things // may result. @@ -124,7 +145,9 @@ #ifdef DOCKING_PORT_HIGHLIGHT //Debug proc used to highlight bounding area -/obj/docking_port/proc/highlight(_color) +/obj/docking_port/proc/highlight(_color = "#f00") + SetInvisibility(INVISIBILITY_NONE) + SET_PLANE_IMPLICIT(src, GHOST_PLANE) var/list/L = return_coords() var/turf/T0 = locate(L[1],L[2],z) var/turf/T1 = locate(L[3],L[4],z) @@ -175,13 +198,17 @@ ///If true, the shuttle can always dock at this docking port, despite its area checks, or if something is already docked var/override_can_dock_checks = FALSE -/obj/docking_port/stationary/Initialize(mapload) +/obj/docking_port/stationary/register(replace = FALSE) . = ..() - SSshuttle.stationary += src if(!id) id = "[SSshuttle.stationary.len]" if(name == "dock") name = "dock[SSshuttle.stationary.len]" + SSshuttle.stationary += src + +/obj/docking_port/stationary/Initialize(mapload) + . = ..() + register() if(!area_type) var/area/place = get_area(src) area_type = place?.type // We might be created in nullspace @@ -190,16 +217,20 @@ for(var/turf/T in return_turfs()) T.flags_1 |= NO_RUINS_1 - // if(SSshuttle.initialized) - // INVOKE_ASYNC(SSshuttle, TYPE_PROC_REF(/datum/controller/subsystem/shuttle, setup_shuttles), list(src)) + if(SSshuttle.initialized) + INVOKE_ASYNC(SSshuttle, TYPE_PROC_REF(/datum/controller/subsystem/shuttle, setup_shuttles), list(src)) #ifdef DOCKING_PORT_HIGHLIGHT highlight("#f00") #endif +/obj/docking_port/stationary/unregister() + . = ..() + SSshuttle.stationary -= src + /obj/docking_port/stationary/Destroy(force) if(force) - SSshuttle.stationary -= src + unregister() . = ..() /obj/docking_port/stationary/Moved(atom/oldloc, dir, forced) @@ -294,7 +325,10 @@ var/launch_status = NOLAUNCH ///Whether or not you want your ship to knock people down, and also whether it will throw them several tiles upon launching. - var/list/movement_force = list("KNOCKDOWN" = 3, "THROW" = 0) + var/list/movement_force = list( + "KNOCKDOWN" = 3, + "THROW" = 0, + ) var/list/ripples = list() var/engine_coeff = 1 @@ -305,10 +339,84 @@ var/can_move_docking_ports = FALSE var/list/hidden_turfs = list() -/obj/docking_port/mobile/proc/register() +#define WORLDMAXX_CUTOFF (world.maxx + 1) +#define WORLDMAXY_CUTOFF (world.maxx + 1) +/** + * Calculated and populates the information used for docking and some internal vars. + * This can also be used to calculate from shuttle_areas so that you can expand/shrink shuttles! + * + * Arguments: + * * loading_from - The template that the shuttle was loaded from, if not given we iterate shuttle_areas to calculate information instead + */ +/obj/docking_port/mobile/proc/calculate_docking_port_information(datum/map_template/shuttle/loading_from) + var/port_x_offset = loading_from?.port_x_offset + var/port_y_offset = loading_from?.port_y_offset + var/width = loading_from?.width + var/height = loading_from?.height + if(!loading_from) + if(!length(shuttle_areas)) + CRASH("Attempted to calculate a docking port's information without a template before it was assigned any areas!") + // no template given, use shuttle_areas to calculate width and height + var/min_x = -1 + var/min_y = -1 + var/max_x = WORLDMAXX_CUTOFF + var/max_y = WORLDMAXY_CUTOFF + for(var/area/area as anything in shuttle_areas) + for(var/turf/turf in area) + min_x = max(turf.x, min_x) + max_x = min(turf.x, max_x) + min_y = max(turf.y, min_y) + max_y = min(turf.y, max_y) + CHECK_TICK + + if(min_x == -1 || max_x == WORLDMAXX_CUTOFF) + CRASH("Failed to locate shuttle boundaries when iterating through shuttle areas, somehow.") + if(min_y == -1 || max_y == WORLDMAXY_CUTOFF) + CRASH("Failed to locate shuttle boundaries when iterating through shuttle areas, somehow.") + + width = (max_x - min_x) + 1 + height = (max_y - min_y) + 1 + port_x_offset = min_x - x + port_y_offset = min_y - y + + if(dir in list(EAST, WEST)) + src.width = height + src.height = width + else + src.width = width + src.height = height + + switch(dir) + if(NORTH) + dwidth = port_x_offset - 1 + dheight = port_y_offset - 1 + if(EAST) + dwidth = height - port_y_offset + dheight = port_x_offset - 1 + if(SOUTH) + dwidth = width - port_x_offset + dheight = height - port_y_offset + if(WEST) + dwidth = port_y_offset - 1 + dheight = width - port_x_offset +#undef WORLDMAXX_CUTOFF +#undef WORLDMAXY_CUTOFF + +/obj/docking_port/mobile/register(replace = FALSE) + . = ..() SSshuttle.mobile += src -/obj/docking_port/mobile/proc/unregister() +/** + * Actions to be taken after shuttle is loaded and has been moved to its final location + * + * Arguments: + * * replace - TRUE if this shuttle is replacing an existing one. FALSE by default. + */ +/obj/docking_port/mobile/proc/postregister(replace = FALSE) + return + +/obj/docking_port/mobile/unregister() + . = ..() SSshuttle.mobile -= src /obj/docking_port/mobile/Destroy(force) @@ -414,32 +522,32 @@ /obj/docking_port/mobile/proc/transit_failure() message_admins("Shuttle [src] repeatedly failed to create transit zone.") -//call the shuttle to destination S -/obj/docking_port/mobile/proc/request(obj/docking_port/stationary/S) - if(!check_dock(S)) +//call the shuttle to destination destination_port +/obj/docking_port/mobile/proc/request(obj/docking_port/stationary/destination_port) + if(!check_dock(destination_port)) testing("check_dock failed on request for [src]") return - if(mode == SHUTTLE_IGNITING && destination == S) + if(mode == SHUTTLE_IGNITING && destination == destination_port) return switch(mode) if(SHUTTLE_CALL) - if(S == destination) + if(destination_port == destination) if(timeLeft(1) < callTime * engine_coeff) setTimer(callTime * engine_coeff) else - destination = S + destination = destination_port setTimer(callTime * engine_coeff) if(SHUTTLE_RECALL) - if(S == destination) + if(destination_port == destination) setTimer(callTime * engine_coeff - timeLeft(1)) else - destination = S + destination = destination_port setTimer(callTime * engine_coeff) mode = SHUTTLE_CALL if(SHUTTLE_IDLE, SHUTTLE_IGNITING) - destination = S + destination = destination_port mode = SHUTTLE_IGNITING setTimer(ignitionTime) diff --git a/code/modules/spells/spell_types/conjure/_conjure.dm b/code/modules/spells/spell_types/conjure/_conjure.dm index f4b7b7d2c17f..5f9a7ccdd7a7 100644 --- a/code/modules/spells/spell_types/conjure/_conjure.dm +++ b/code/modules/spells/spell_types/conjure/_conjure.dm @@ -37,7 +37,7 @@ if (spawn_place.overfloor_placed) spawn_place.ChangeTurf(summoned_object_type, flags = CHANGETURF_INHERIT_AIR) else - spawn_place.PlaceOnTop(summoned_object_type, flags = CHANGETURF_INHERIT_AIR) + spawn_place.place_on_top(summoned_object_type, flags = CHANGETURF_INHERIT_AIR) return else diff --git a/code/modules/unit_tests/baseturfs.dm b/code/modules/unit_tests/baseturfs.dm index 918db53bb90d..e4a584bc4e84 100644 --- a/code/modules/unit_tests/baseturfs.dm +++ b/code/modules/unit_tests/baseturfs.dm @@ -34,7 +34,7 @@ // Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior RESET_TO_EXPECTED(run_loc_floor_bottom_left) - run_loc_floor_bottom_left.PlaceOnTop(/turf/closed/wall/rock) + run_loc_floor_bottom_left.place_on_top(/turf/closed/wall/rock) TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/closed/wall/rock, "Rock wall should've been placed on top") run_loc_floor_bottom_left.ScrapeAway() @@ -53,8 +53,8 @@ // Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior RESET_TO_EXPECTED(run_loc_floor_bottom_left) - run_loc_floor_bottom_left.PlaceOnBottom(/turf/closed/wall/rock) - TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "PlaceOnBottom shouldn't have changed turf") + run_loc_floor_bottom_left.place_on_bottom(/turf/closed/wall/rock) + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "place_on_bottom shouldn't have changed turf") run_loc_floor_bottom_left.ScrapeAway() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating, "Plasteel floors should scrape away to plating") diff --git a/yogstation.dme b/yogstation.dme index 97e2c52163ff..4a08b4944ad6 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -700,6 +700,7 @@ #include "code\datums\elements\frozen.dm" #include "code\datums\elements\life_drain.dm" #include "code\datums\elements\light_blocking.dm" +#include "code\datums\elements\mirage_border.dm" #include "code\datums\elements\movetype_handler.dm" #include "code\datums\elements\regenerator.dm" #include "code\datums\elements\rust.dm" @@ -1576,6 +1577,7 @@ #include "code\game\turfs\open\floor\plating\dirt.dm" #include "code\game\turfs\open\floor\plating\misc_plating.dm" #include "code\game\turfs\open\space\space.dm" +#include "code\game\turfs\open\space\space_EXPENSIVE.dm" #include "code\game\turfs\open\space\transit.dm" #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_investigate.dm" From 6d7f10986c540db557091ed27ec1c2dc5880fc58 Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Wed, 20 Dec 2023 21:05:36 -0800 Subject: [PATCH 150/281] Revert "shuttles are almost fixed i think" This reverts commit 046058827cf8c38b8966044b63f303603f5e1cd2. --- code/__DEFINES/flags.dm | 13 +- code/__DEFINES/maps.dm | 36 +---- code/__DEFINES/misc.dm | 10 ++ code/__DEFINES/multiz.dm | 4 +- code/__DEFINES/text.dm | 3 - code/__DEFINES/turfs.dm | 2 +- code/_globalvars/bitfields.dm | 1 - code/_globalvars/regexes.dm | 5 - code/controllers/subsystem/mapping.dm | 52 ++----- code/controllers/subsystem/shuttle.dm | 36 ++--- code/datums/components/rot.dm | 24 +-- code/datums/elements/mirage_border.dm | 41 ----- code/game/machinery/computer/arcade.dm | 2 +- code/game/machinery/cryopod.dm | 2 +- code/game/machinery/doors/airlock.dm | 4 +- code/game/mecha/equipment/tools/work_tools.dm | 4 +- .../fluid_spread/effects_foam.dm | 2 +- .../objects/effects/spawners/vaultspawner.dm | 4 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/objects/structures/false_walls.dm | 2 +- code/game/objects/structures/girders.dm | 14 +- code/game/objects/structures/lattice.dm | 2 +- code/game/turfs/baseturfs.dm | 134 ++-------------- code/game/turfs/change_turf.dm | 145 +++++++++++++++-- code/game/turfs/open/_open.dm | 2 +- code/game/turfs/open/chasm.dm | 4 +- code/game/turfs/open/floor.dm | 2 +- code/game/turfs/open/floor/plating.dm | 4 +- .../game/turfs/open/floor/plating/asteroid.dm | 2 +- code/game/turfs/open/lava.dm | 67 +------- code/game/turfs/open/openspace.dm | 86 +++++------ code/game/turfs/open/space/space.dm | 28 ++++ code/game/turfs/open/space/space_EXPENSIVE.dm | 45 ------ code/game/turfs/open/space/transit.dm | 14 +- code/game/turfs/turf.dm | 3 +- .../clockcult/clock_structures/wall_gear.dm | 4 +- .../antagonists/cult/cult_structures.dm | 2 +- .../eldritch_cult/magic/rust_magic.dm | 2 +- code/modules/awaymissions/zlevel.dm | 1 - code/modules/buildmode/submodes/basic.dm | 8 +- code/modules/buildmode/submodes/fill.dm | 2 +- code/modules/cargo/supplypod.dm | 2 +- code/modules/events/shuttle_catastrophe.dm | 20 +-- code/modules/mapping/map_template.dm | 21 ++- code/modules/mapping/mapping_helpers.dm | 30 ++-- code/modules/mapping/reader.dm | 2 +- .../space_management/multiz_helpers.dm | 19 +++ .../space_management/space_reservation.dm | 18 +-- .../space_management/space_transition.dm | 14 +- .../space_management/zlevel_manager.dm | 6 +- .../mob/living/simple_animal/bot/floorbot.dm | 8 +- .../chemistry/reagents/other_reagents.dm | 2 +- .../modules/ruins/lavalandruin_code/puzzle.dm | 4 +- code/modules/shuttle/shuttle.dm | 146 +++--------------- .../spells/spell_types/conjure/_conjure.dm | 2 +- code/modules/unit_tests/baseturfs.dm | 6 +- yogstation.dme | 2 - 57 files changed, 428 insertions(+), 694 deletions(-) delete mode 100644 code/datums/elements/mirage_border.dm delete mode 100644 code/game/turfs/open/space/space_EXPENSIVE.dm diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index b9e2b473db1c..b925415272be 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -60,23 +60,20 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 //turf-only flags #define NOJAUNT_1 (1<<0) -/// If a turf is an usused reservation turf awaiting assignment #define UNUSED_RESERVATION_TURF_1 (1<<1) -/// If a turf is a reserved turf -#define RESERVATION_TURF_1 (1<<2) /// If a turf can be made dirty at roundstart. This is also used in areas. -#define CAN_BE_DIRTY_1 (1<<3) +#define CAN_BE_DIRTY_1 (1<<2) /// Blocks lava rivers being generated on the turf -#define NO_LAVA_GEN_1 (1<<3) +#define NO_LAVA_GEN_1 (1<<6) /// Blocks ruins spawning on the turf -#define NO_RUINS_1 (1<<4) +#define NO_RUINS_1 (1<<18) /// Blocks this turf from being rusted -#define NO_RUST (1<<5) +#define NO_RUST (1<<19) /// If this atom has experienced a decal element "init finished" sourced appearance update /// We use this to ensure stacked decals don't double up appearance updates for no rasin /// Flag as an optimization, don't make this a trait without profiling /// Yes I know this is a stupid flag, no you can't take him from me -#define DECAL_INIT_UPDATE_EXPERIENCED_1 (1<<6) +#define DECAL_INIT_UPDATE_EXPERIENCED_1 (1<<20) //AREA FLAGS /// If blobs can spawn there and if it counts towards their score. diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 7c2da9430f7a..44dd0676c9f1 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -16,23 +16,8 @@ As of 2018-02-04, the typical z-levels for a single-level station are: 12: Empty space 13: Transit space -Multi-Z stations are supported and Multi-Z mining and away missions would -require only minor tweaks. They also handle their Z-Levels differently on their -own case by case basis. - -This information will absolutely date quickly with how we handle Z-Levels, and will -continue to handle them in the future. Currently, you can go into the Debug tab -of your stat-panel (in game) and hit "Mapping verbs - Enable". You will then get a new tab -called "Mapping", as well as access to the verb "Debug-Z-Levels". Although the information -presented in this comment is factual for the time it was written for, it's ill-advised -to trust the words presented within. - -We also provide this information to you so that you can have an at-a-glance look at how -Z-Levels are arranged. It is extremely ill-advised to ever use the location of a Z-Level -to assign traits to it or use it in coding. Use Z-Traits (ZTRAITs) for these. - -If you want to start toying around with Z-Levels, do not take these words for fact. -Always compile, always use that verb, and always make sure that it works for what you want to do. +Multi-Z stations are supported and multi-Z mining and away missions would +require only minor tweaks. */ // helpers for modifying jobs, used in various job_changes.dm files @@ -42,23 +27,6 @@ Always compile, always use that verb, and always make sure that it works for wha #define SPACERUIN_MAP_EDGE_PAD 15 -/// Distance from edge to move to another z-level -#define TRANSITIONEDGE 7 - -// Maploader bounds indices -/// The maploader index for the maps minimum x -#define MAP_MINX 1 -/// The maploader index for the maps minimum y -#define MAP_MINY 2 -/// The maploader index for the maps minimum z -#define MAP_MINZ 3 -/// The maploader index for the maps maximum x -#define MAP_MAXX 4 -/// The maploader index for the maps maximum y -#define MAP_MAXY 5 -/// The maploader index for the maps maximum z -#define MAP_MAXZ 6 - // traits // boolean - marks a level as having that property if present #define ZTRAIT_CENTCOM "CentCom" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 62d0f4ee8229..361593a8ba9e 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -57,6 +57,8 @@ #define MANIFEST_ERROR_CONTENTS 2 #define MANIFEST_ERROR_ITEM 4 +#define TRANSITIONEDGE 7 //Distance from edge to move to another z-level + #define BE_CLOSE TRUE //in the case of a silicon, to select if they need to be next to the atom #define NO_DEXTERY TRUE //if other mobs (monkeys, aliens, etc) can use this #define NO_TK TRUE @@ -224,6 +226,14 @@ GLOBAL_LIST_INIT(donor_pdas, list(PDA_COLOR_NORMAL, PDA_COLOR_TRANSPARENT, PDA_C //Just space #define SPACE_ICON_STATE "[((x + y) ^ ~(x * y) + z) % 25]" +// Maploader bounds indices +#define MAP_MINX 1 +#define MAP_MINY 2 +#define MAP_MINZ 3 +#define MAP_MAXX 4 +#define MAP_MAXY 5 +#define MAP_MAXZ 6 + // Defib stats #define DEFIB_TIME_LIMIT 15 MINUTES diff --git a/code/__DEFINES/multiz.dm b/code/__DEFINES/multiz.dm index 0bd2f23c3097..370eaa8ba459 100644 --- a/code/__DEFINES/multiz.dm +++ b/code/__DEFINES/multiz.dm @@ -1,8 +1,8 @@ /// Attempt to get the turf below the provided one according to Z traits #define GET_TURF_BELOW(turf) ( \ - (turf.flags_1 & RESERVATION_TURF_1) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_below(turf) : \ + (turf.turf_flags & RESERVATION_TURF) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_below(turf) : \ (!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_DOWN]) ? null : get_step((turf), DOWN)) /// Attempt to get the turf above the provided one according to Z traits #define GET_TURF_ABOVE(turf) ( \ - (turf.flags_1 & RESERVATION_TURF_1) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_above(turf) : \ + (turf.turf_flags & RESERVATION_TURF) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_above(turf) : \ (!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_UP]) ? null : get_step((turf), UP)) diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm index bda614681c46..823a88345de6 100644 --- a/code/__DEFINES/text.dm +++ b/code/__DEFINES/text.dm @@ -8,6 +8,3 @@ * Uses MAPTEXT to format antag points into a more appealing format */ #define ANTAG_MAPTEXT(value, color) MAPTEXT("
    [round(value)]
    ") - -/// Removes characters incompatible with file names. -#define SANITIZE_FILENAME(text) (GLOB.filename_forbidden_chars.Replace(text, "")) diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 6ff0d233ac0c..7b972abc20cb 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -1,7 +1,7 @@ #define CHANGETURF_DEFER_CHANGE (1<<0) #define CHANGETURF_IGNORE_AIR (1<<1) // This flag prevents changeturf from gathering air from nearby turfs to fill the new turf with an approximation of local air #define CHANGETURF_FORCEOP (1<<2) -#define CHANGETURF_SKIP (1<<3) // A flag for place_on_top to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE +#define CHANGETURF_SKIP (1<<3) // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE #define CHANGETURF_INHERIT_AIR (1<<4) // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR #define CHANGETURF_RECALC_ADJACENT (1<<5) //Immediately recalc adjacent atmos turfs instead of queuing. #define CHANGETURF_TRAPDOOR_INDUCED (1<<6) // Caused by a trapdoor, for trapdoor to know that this changeturf was caused by itself diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index b795541d31c9..92f5325f0edd 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -158,7 +158,6 @@ DEFINE_BITFIELD(resistance_flags, list( DEFINE_BITFIELD(flags_1, list( "NOJAUNT_1" = NOJAUNT_1, "UNUSED_RESERVATION_TURF_1" = UNUSED_RESERVATION_TURF_1, - "RESERVATION_TURF_1" = RESERVATION_TURF_1, "CAN_BE_DIRTY_1" = CAN_BE_DIRTY_1, "HEAR_1" = HEAR_1, "CHECK_RICOCHET_1" = CHECK_RICOCHET_1, diff --git a/code/_globalvars/regexes.dm b/code/_globalvars/regexes.dm index 1a8a863a3469..86c41cc7ab69 100644 --- a/code/_globalvars/regexes.dm +++ b/code/_globalvars/regexes.dm @@ -6,8 +6,3 @@ GLOBAL_DATUM_INIT(is_email, /regex, regex("\[a-z0-9_-]+@\[a-z0-9_-]+.\[a-z0-9_-] GLOBAL_DATUM_INIT(is_alphanumeric, /regex, regex("\[a-z0-9]+", "i")) GLOBAL_DATUM_INIT(is_punctuation, /regex, regex("\[.!?]+", "i")) GLOBAL_DATUM_INIT(is_color, /regex, regex("^#\[0-9a-fA-F]{6}$")) - -//All characters forbidden by filenames: ", \, \n, \t, /, ?, %, *, :, |, <, >, .. -GLOBAL_DATUM_INIT(filename_forbidden_chars, /regex, regex(@{""|[\\\n\t/?%*:|<>]|\.\."}, "g")) -GLOBAL_PROTECT(filename_forbidden_chars) -// had to use the OR operator for quotes instead of putting them in the character class because it breaks the syntax highlighting otherwise. diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 036f377b63c0..5258e8619182 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -132,17 +132,16 @@ SUBSYSTEM_DEF(mapping) require_area_resort() process_teleport_locs() //Sets up the wizard teleport locations preloadTemplates() - run_map_generation() #ifndef LOWMEMORYMODE // Create space ruin levels while (space_levels_so_far < config.space_ruin_levels) + ++space_levels_so_far add_new_zlevel("Empty Area [space_levels_so_far]", ZTRAITS_SPACE) + // and one level with no ruins + for (var/i in 1 to config.space_empty_levels) ++space_levels_so_far - // Create empty space levels - while (space_levels_so_far < config.space_empty_levels + config.space_ruin_levels) empty_space = add_new_zlevel("Empty Area [space_levels_so_far]", list(ZTRAIT_LINKAGE = CROSSLINKED)) - ++space_levels_so_far // Pick a random away mission. if(CONFIG_GET(flag/roundstart_away)) @@ -195,7 +194,7 @@ SUBSYSTEM_DEF(mapping) message_admins("A shuttle arena failed to load!") log_game("A shuttle arena failed to load!") #endif - + run_map_generation() // Add the transit level var/datum/space_level/base_transit = add_reservation_zlevel() require_area_resort() @@ -219,8 +218,7 @@ SUBSYSTEM_DEF(mapping) var/packetlen = length(packet) while(packetlen) if(MC_TICK_CHECK) - if(index) - lists_to_reserve.Cut(1, index) + lists_to_reserve.Cut(1, index) return var/turf/T = packet[packetlen] T.empty(RESERVED_TURF_TYPE, RESERVED_TURF_TYPE, null, TRUE) @@ -237,25 +235,6 @@ SUBSYSTEM_DEF(mapping) index++ lists_to_reserve.Cut(1, index) -/datum/controller/subsystem/mapping/proc/generate_z_level_linkages() - for(var/z_level in 1 to length(z_list)) - generate_linkages_for_z_level(z_level) - -/datum/controller/subsystem/mapping/proc/generate_linkages_for_z_level(z_level) - if(!isnum(z_level) || z_level <= 0) - return FALSE - - if(multiz_levels.len < z_level) - multiz_levels.len = z_level - - var/z_above = level_trait(z_level, ZTRAIT_UP) - var/z_below = level_trait(z_level, ZTRAIT_DOWN) - if(!(z_above == TRUE || z_above == FALSE || z_above == null) || !(z_below == TRUE || z_below == FALSE || z_below == null)) - stack_trace("Warning, numeric mapping offsets are deprecated. Instead, mark z level connections by setting UP/DOWN to true if the connection is allowed") - multiz_levels[z_level] = new /list(LARGEST_Z_LEVEL_INDEX) - multiz_levels[z_level][Z_LEVEL_UP] = !!z_above - multiz_levels[z_level][Z_LEVEL_DOWN] = !!z_below - /datum/controller/subsystem/mapping/proc/wipe_reservations(wipe_safety_delay = 100) if(clearing_reserved_turfs || !initialized) //in either case this is just not needed. return @@ -285,10 +264,6 @@ SUBSYSTEM_DEF(mapping) returning += M qdel(T, TRUE) -/datum/controller/subsystem/mapping/proc/get_reservation_from_turf(turf/T) - RETURN_TYPE(/datum/turf_reservation) - return used_turfs[T] - /* Nuke threats, for making the blue tiles on the station go RED Used by the AI doomsday and the self destruct nuke. */ @@ -373,10 +348,7 @@ SUBSYSTEM_DEF(mapping) // load the maps for (var/P in parsed_maps) var/datum/parsed_map/pm = P - var/bounds = pm.bounds - var/x_offset = bounds ? round(world.maxx / 2 - bounds[MAP_MAXX] / 2) + 1 : 1 - var/y_offset = bounds ? round(world.maxy / 2 - bounds[MAP_MAXY] / 2) + 1 : 1 - if (!pm.load(x_offset, y_offset, start_z + parsed_maps[P], no_changeturf = TRUE, new_z = TRUE)) + if (!pm.load(1, 1, start_z + parsed_maps[P], no_changeturf = TRUE, new_z = TRUE)) errorList |= pm.original_path if(!silent) INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!") @@ -523,9 +495,9 @@ GLOBAL_LIST_EMPTY(the_station_areas) /datum/controller/subsystem/mapping/proc/preloadRuinTemplates() // Still supporting bans by filename - var/list/banned = generateMapList("lavaruinblacklist.txt") - banned += generateMapList("spaceruinblacklist.txt") - banned += generateMapList("iceruinblacklist.txt") + var/list/banned = generateMapList("[global.config.directory]/lavaruinblacklist.txt") + banned += generateMapList("[global.config.directory]/spaceruinblacklist.txt") + banned += generateMapList("[global.config.directory]/iceruinblacklist.txt") for(var/item in sortList(subtypesof(/datum/map_template/ruin), /proc/cmp_ruincost_priority)) var/datum/map_template/ruin/ruin_type = item @@ -552,7 +524,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) station_room_templates[R.name] = R //yogs /datum/controller/subsystem/mapping/proc/preloadShuttleTemplates() - var/list/unbuyable = generateMapList("unbuyableshuttles.txt") + var/list/unbuyable = generateMapList("[global.config.directory]/unbuyableshuttles.txt") for(var/item in subtypesof(/datum/map_template/shuttle)) var/datum/map_template/shuttle/shuttle_type = item @@ -885,6 +857,10 @@ GLOBAL_LIST_EMPTY(the_station_areas) GLOB.default_lighting_underlays_by_z.len = z_level GLOB.default_lighting_underlays_by_z[z_level] = mutable_appearance(LIGHTING_ICON, "transparent", z_level * 0.01, null, LIGHTING_PLANE, 255, RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM, offset_const = GET_Z_PLANE_OFFSET(z_level)) +/datum/controller/subsystem/mapping/proc/get_reservation_from_turf(turf/T) + RETURN_TYPE(/datum/turf_reservation) + return used_turfs[T] + /datum/controller/subsystem/mapping/proc/get_map_weights() var/list/previous_maps = list() diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index fab37fb5a696..50afece2f532 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -521,10 +521,10 @@ SUBSYSTEM_DEF(shuttle) // Then create a transit docking port in the middle var/coords = M.return_coords(0, 0, dock_dir) /* 0------2 - * | | - * | | - * | x | - * 3------1 + | | + | | + | x | + 3------1 */ var/x0 = coords[1] @@ -541,7 +541,6 @@ SUBSYSTEM_DEF(shuttle) var/turf/midpoint = locate(transit_x, transit_y, bottomleft.z) if(!midpoint) - qdel(proposal) return FALSE var/area/old_area = midpoint.loc old_area.turfs_to_uncontain += proposal.reserved_turfs @@ -719,42 +718,39 @@ SUBSYSTEM_DEF(shuttle) QDEL_NULL(preview_reservation) if(!preview_shuttle) - load_template(loading_template) + if(load_template(loading_template)) + preview_shuttle.linkup(loading_template, destination_port) preview_template = loading_template // get the existing shuttle information, if any var/timer = 0 var/mode = SHUTTLE_IDLE - var/obj/docking_port/stationary/dest_dock + var/obj/docking_port/stationary/D if(istype(destination_port)) - dest_dock = destination_port - else if(existing_shuttle && replace) + D = destination_port + else if(existing_shuttle) timer = existing_shuttle.timer mode = existing_shuttle.mode - dest_dock = existing_shuttle.get_docked() + D = existing_shuttle.get_docked() - if(!dest_dock) - dest_dock = generate_transit_dock(preview_shuttle) - - if(!dest_dock) + if(!D) CRASH("No dock found for preview shuttle ([preview_template.name]), aborting.") - var/result = preview_shuttle.canDock(dest_dock) + var/result = preview_shuttle.canDock(D) // truthy value means that it cannot dock for some reason // but we can ignore the someone else docked error because we'll // be moving into their place shortly if((result != SHUTTLE_CAN_DOCK) && (result != SHUTTLE_SOMEONE_ELSE_DOCKED)) - CRASH("Template shuttle [preview_shuttle] cannot dock at [dest_dock] ([result]).") + WARNING("Template shuttle [preview_shuttle] cannot dock at [D] ([result]).") + return if(existing_shuttle) existing_shuttle.jumpToNullSpace() - preview_shuttle.register(replace) var/list/force_memory = preview_shuttle.movement_force preview_shuttle.movement_force = list("KNOCKDOWN" = 0, "THROW" = 0) - preview_shuttle.mode = SHUTTLE_PREARRIVAL//No idle shuttle moving. Transit dock get removed if shuttle moves too long. - preview_shuttle.initiate_docking(dest_dock) + preview_shuttle.initiate_docking(D) preview_shuttle.movement_force = force_memory . = preview_shuttle @@ -764,7 +760,7 @@ SUBSYSTEM_DEF(shuttle) preview_shuttle.timer = timer preview_shuttle.mode = mode - preview_shuttle.postregister(replace) + preview_shuttle.register() // TODO indicate to the user that success happened, rather than just // blanking the modification tab diff --git a/code/datums/components/rot.dm b/code/datums/components/rot.dm index 35e5879af1eb..b37c6773f3f2 100644 --- a/code/datums/components/rot.dm +++ b/code/datums/components/rot.dm @@ -4,33 +4,25 @@ /datum/component/rot/Initialize(new_amount) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE - if(isliving(parent)) - var/mob/living/living_parent = parent - //I think this can break in cases where someone becomes a robot post death, but I uh, I don't know how to account for that - if(!(living_parent.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) - return COMPONENT_INCOMPATIBLE + + if(new_amount) + amount = new_amount START_PROCESSING(SSprocessing, src) /datum/component/rot/process() var/atom/A = parent - - var/turf/T = get_turf(A) - if(QDELETED(T) || !isopenturf(T)) - return - - var/datum/gas_mixture/turf_air = T.return_air() - if(!turf_air) + var/turf/open/T = get_turf(A) + if(!istype(T) || T.return_air().return_pressure() > (WARNING_HIGH_PRESSURE - 10)) return - - if(!istype(T) || turf_air.return_pressure() > (WARNING_HIGH_PRESSURE - 10)) - return - var/area/area = get_area(T) if(area.outdoors) return + var/datum/gas_mixture/turf_air = T.return_air() + if(!turf_air) + return var/datum/gas_mixture/stank_breath = T.remove_air(1 / turf_air.return_volume() * turf_air.total_moles()) if(!stank_breath) return diff --git a/code/datums/elements/mirage_border.dm b/code/datums/elements/mirage_border.dm deleted file mode 100644 index 999455a0b834..000000000000 --- a/code/datums/elements/mirage_border.dm +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Creates a mirage effect allowing you to see around the world border, by adding the opposite side to its vis_contents. - */ -/datum/element/mirage_border - -/datum/element/mirage_border/Attach(datum/target, turf/target_turf, direction, range=world.view) - . = ..() - if(!isturf(target)) - return ELEMENT_INCOMPATIBLE - #ifdef TESTING - // This is a highly used proc, and these error states never occur, so limit it to testing. - // If something goes wrong it will runtime anyway. - if(!target_turf || !istype(target_turf) || !direction) - stack_trace("[type] improperly attached with the following args: target=\[[target_turf]\], direction=\[[direction]\], range=\[[range]\]") - return ELEMENT_INCOMPATIBLE - #endif - - var/atom/movable/mirage_holder/holder = new(target) - - var/x = target_turf.x - var/y = target_turf.y - var/z = clamp(target_turf.z, 1, world.maxz) - var/turf/southwest = locate(clamp(x - (direction & WEST ? range : 0), 1, world.maxx), clamp(y - (direction & SOUTH ? range : 0), 1, world.maxy), z) - var/turf/northeast = locate(clamp(x + (direction & EAST ? range : 0), 1, world.maxx), clamp(y + (direction & NORTH ? range : 0), 1, world.maxy), z) - holder.vis_contents += block(southwest, northeast) - if(direction & SOUTH) - holder.pixel_y -= world.icon_size * range - if(direction & WEST) - holder.pixel_x -= world.icon_size * range - -/datum/element/mirage_border/Detach(atom/movable/target) - . = ..() - var/atom/movable/mirage_holder/held = locate() in target.contents - if(held) - qdel(held) - -INITIALIZE_IMMEDIATE(/atom/movable/mirage_holder) -// Using /atom/movable because this is a heavily used path -/atom/movable/mirage_holder - name = "Mirage holder" - mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 1cf5d4dc2ab6..7c6a41699814 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -579,7 +579,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( playsound(loc, 'sound/weapons/genhit.ogg', 100, 1) var/turf/open/space/T for(T in orange(1, src)) - T.place_on_top(/turf/open/floor/plating) + T.PlaceOnTop(/turf/open/floor/plating) else say("Something slams into the floor around [src] - luckily, it didn't get through!") playsound(loc, 'sound/effects/bang.ogg', 50, 1) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 11aa55b781a7..973b7e39f7d9 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -447,7 +447,7 @@ GLOBAL_VAR_INIT(cryopods_enabled, FALSE) if(prob(90)) sleepyhead.adjust_drowsiness(rand(3 SECONDS, 10 SECONDS)) if(prob(75)) - sleepyhead.adjust_eye_blur(rand(3, 6)) + sleepyhead.blur_eyes(rand(3, 6)) //so much worse if(prob(66)) sleepyhead.adjust_disgust(rand(25,35)) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 1794a6bc3d71..143652cb56a1 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -212,10 +212,10 @@ for(var/obj/machinery/door/firedoor/FD in here) qdel(FD) for(var/turf/closed/T in range(2, src)) - here.place_on_top(T.type) + here.PlaceOnTop(T.type) qdel(src) return - here.place_on_top(/turf/closed/wall) + here.PlaceOnTop(/turf/closed/wall) qdel(src) return if(10 to 11) diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 56a7af725331..855df49cacb3 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -313,7 +313,7 @@ var/turf/open/space/S = target occupant_message("Building Floor...") if(do_after_cooldown(S)) - S.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + S.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) if(play_sound) playsound(S, 'sound/items/deconstruct.ogg', 50, 1) chassis.spark_system.start() @@ -322,7 +322,7 @@ energy_drain = 750 occupant_message("Building Wall...") if(do_after_cooldown(F)) - F.place_on_top(/turf/closed/wall) + F.PlaceOnTop(/turf/closed/wall) if(play_sound) playsound(F, 'sound/items/deconstruct.ogg', 50, 1) chassis.spark_system.start() diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm index 856873061293..8e013e9e167f 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm @@ -366,7 +366,7 @@ /obj/effect/particle_effect/fluid/foam/metal/smart/make_result() //Smart foam adheres to area borders for walls var/turf/open/location = loc if(isspaceturf(location)) - location.place_on_top(/turf/open/floor/plating/foam) + location.PlaceOnTop(/turf/open/floor/plating/foam) for(var/cardinal in GLOB.cardinals) var/turf/cardinal_turf = get_step(location, cardinal) diff --git a/code/game/objects/effects/spawners/vaultspawner.dm b/code/game/objects/effects/spawners/vaultspawner.dm index 31b4a6f7842a..9bdf0a673ed9 100644 --- a/code/game/objects/effects/spawners/vaultspawner.dm +++ b/code/game/objects/effects/spawners/vaultspawner.dm @@ -20,9 +20,9 @@ for(var/j = lowBoundY,j<=hiBoundY,j++) var/turf/T = locate(i,j,z) if(i == lowBoundX || i == hiBoundX || j == lowBoundY || j == hiBoundY) - T.place_on_top(/turf/closed/wall/vault) + T.PlaceOnTop(/turf/closed/wall/vault) else - T.place_on_top(/turf/open/floor/vault) + T.PlaceOnTop(/turf/open/floor/vault) T.icon_state = "[type]vault" qdel(src) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 6c55ffe680cd..c4b03c4c9928 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -217,7 +217,7 @@ var/turf/T = usr.drop_location() if(!isturf(T)) return - T.place_on_top(R.result_type, flags = CHANGETURF_INHERIT_AIR) + T.PlaceOnTop(R.result_type, flags = CHANGETURF_INHERIT_AIR) else O = new R.result_type(usr.drop_location()) if(O) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index a99425ec1b81..ed25a37e1eed 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -84,7 +84,7 @@ /obj/structure/falsewall/proc/ChangeToWall(delete = 1) var/turf/T = get_turf(src) - T.place_on_top(walltype) + T.PlaceOnTop(walltype) if(delete) qdel(src) return T diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 94ebc96c3bf2..c007459bf5e7 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -74,7 +74,7 @@ S.use(5) to_chat(user, span_notice("You add the plating.")) var/turf/T = get_turf(src) - T.place_on_top(/turf/closed/wall/mineral/iron) + T.PlaceOnTop(/turf/closed/wall/mineral/iron) transfer_fingerprints_to(T) qdel(src) return @@ -108,7 +108,7 @@ S.use(2) to_chat(user, span_notice("You add the plating.")) var/turf/T = get_turf(src) - T.place_on_top(/turf/closed/wall) + T.PlaceOnTop(/turf/closed/wall) transfer_fingerprints_to(T) qdel(src) return @@ -138,7 +138,7 @@ S.use(1) to_chat(user, span_notice("You fully reinforce the wall.")) var/turf/T = get_turf(src) - T.place_on_top(/turf/closed/wall/r_wall) + T.PlaceOnTop(/turf/closed/wall/r_wall) transfer_fingerprints_to(T) qdel(src) return @@ -182,7 +182,7 @@ S.use(2) to_chat(user, span_notice("You add the plating.")) var/turf/T = get_turf(src) - T.place_on_top(text2path("/turf/closed/wall/mineral/[M]")) + T.PlaceOnTop(text2path("/turf/closed/wall/mineral/[M]")) transfer_fingerprints_to(T) qdel(src) return @@ -355,7 +355,7 @@ user.visible_message(span_notice("[user] plates [src] with runed metal."), span_notice("You construct a runed wall.")) R.use(1) var/turf/T = get_turf(src) - T.place_on_top(/turf/closed/wall/mineral/cult) + T.PlaceOnTop(/turf/closed/wall/mineral/cult) qdel(src) else @@ -382,7 +382,7 @@ switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, span_notice("You finish a wall.")) - T.place_on_top(/turf/closed/wall) + T.PlaceOnTop(/turf/closed/wall) qdel(src) return TRUE if(RCD_DECONSTRUCT) @@ -422,7 +422,7 @@ user.visible_message(span_notice("[user] plates [src] with bronze!"), span_notice("You construct a bronze wall.")) B.use(2) var/turf/T = get_turf(src) - T.place_on_top(/turf/closed/wall/mineral/bronze) + T.PlaceOnTop(/turf/closed/wall/mineral/bronze) qdel(src) else diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index bb5ebb5d3cda..4d73a9dad331 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -59,7 +59,7 @@ to_chat(user, span_notice("You build a floor.")) var/turf/T = src.loc if(isspaceturf(T)) - T.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + T.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) qdel(src) return TRUE return FALSE diff --git a/code/game/turfs/baseturfs.dm b/code/game/turfs/baseturfs.dm index 06316a5aa8cd..195b52de1106 100644 --- a/code/game/turfs/baseturfs.dm +++ b/code/game/turfs/baseturfs.dm @@ -1,96 +1,19 @@ -/// Take off the top layer turf and replace it with the next baseturf down -/turf/proc/ScrapeAway(amount=1, flags) - if(!amount) - return - if(length(baseturfs)) - var/list/new_baseturfs = baseturfs.Copy() - var/turf_type = new_baseturfs[max(1, new_baseturfs.len - amount + 1)] - while(ispath(turf_type, /turf/baseturf_skipover)) - amount++ - if(amount > new_baseturfs.len) - CRASH("The bottommost baseturf of a turf is a skipover [src]([type])") - turf_type = new_baseturfs[max(1, new_baseturfs.len - amount + 1)] - new_baseturfs.len -= min(amount, new_baseturfs.len - 1) // No removing the very bottom - if(new_baseturfs.len == 1) - new_baseturfs = new_baseturfs[1] - return ChangeTurf(turf_type, new_baseturfs, flags) - - if(baseturfs == type) - return src - - return ChangeTurf(baseturfs, baseturfs, flags) // The bottom baseturf will never go away - -// Take the input as baseturfs and put it underneath the current baseturfs -// If fake_turf_type is provided and new_baseturfs is not the baseturfs list will be created identical to the turf type's -// If both or just new_baseturfs is provided they will be inserted below the existing baseturfs -/turf/proc/place_on_bottom(list/new_baseturfs, turf/fake_turf_type) - if(fake_turf_type) - if(!new_baseturfs) - if(!length(baseturfs)) - baseturfs = list(baseturfs) - var/list/old_baseturfs = baseturfs.Copy() - assemble_baseturfs(fake_turf_type) - if(!length(baseturfs)) - baseturfs = list(baseturfs) - baseturfs -= baseturfs & GLOB.blacklisted_automated_baseturfs - baseturfs += old_baseturfs - return - else if(!length(new_baseturfs)) - new_baseturfs = list(new_baseturfs, fake_turf_type) - else - new_baseturfs += fake_turf_type - if(!length(baseturfs)) - baseturfs = list(baseturfs) - baseturfs.Insert(1, new_baseturfs) - -// Make a new turf and put it on top -// The args behave identical to place_on_bottom except they go on top -// Things placed on top of closed turfs will ignore the topmost closed turf -// Returns the new turf -/turf/proc/place_on_top(list/new_baseturfs, turf/fake_turf_type, flags) - var/area/turf_area = loc - if(new_baseturfs && !length(new_baseturfs)) - new_baseturfs = list(new_baseturfs) - flags = turf_area.PlaceOnTopReact(new_baseturfs, fake_turf_type, flags) // A hook so areas can modify the incoming args - - var/turf/newT - if(flags & CHANGETURF_SKIP) // We haven't been initialized - if(flags_1 & INITIALIZED_1) - stack_trace("CHANGETURF_SKIP was used in a place_on_top call for a turf that's initialized. This is a mistake. [src]([type])") - assemble_baseturfs() - if(fake_turf_type) - if(!new_baseturfs) // If no baseturfs list then we want to create one from the turf type - if(!length(baseturfs)) - baseturfs = list(baseturfs) - var/list/old_baseturfs = baseturfs.Copy() - if(!istype(src, /turf/closed)) - old_baseturfs += type - newT = ChangeTurf(fake_turf_type, null, flags) - newT.assemble_baseturfs(initial(fake_turf_type.baseturfs)) // The baseturfs list is created like roundstart - if(!length(newT.baseturfs)) - newT.baseturfs = list(baseturfs) - newT.baseturfs -= GLOB.blacklisted_automated_baseturfs - newT.baseturfs.Insert(1, old_baseturfs) // The old baseturfs are put underneath - return newT - if(!length(baseturfs)) - baseturfs = list(baseturfs) - if(!istype(src, /turf/closed)) - baseturfs += type - baseturfs += new_baseturfs - return ChangeTurf(fake_turf_type, null, flags) - if(!length(baseturfs)) - baseturfs = list(baseturfs) - if(!istype(src, /turf/closed)) - baseturfs += type - var/turf/change_type - if(length(new_baseturfs)) - change_type = new_baseturfs[new_baseturfs.len] - new_baseturfs.len-- - if(new_baseturfs.len) - baseturfs += new_baseturfs - else - change_type = new_baseturfs - return ChangeTurf(change_type, null, flags) +/// Places the given turf on the bottom of the turf stack. +/turf/proc/place_on_bottom(turf/bottom_turf) + baseturfs = baseturfs_string_list( + list(initial(bottom_turf.baseturfs), bottom_turf) + baseturfs, + src + ) + +/// Places a turf at the top of the stack +/turf/proc/place_on_top(turf/added_layer, flags) + var/list/turf/new_baseturfs = list() + + new_baseturfs.Add(baseturfs) + if(isopenturf(src)) + new_baseturfs.Add(type) + + return ChangeTurf(added_layer, new_baseturfs, flags) /// Places a turf on top - for map loading /turf/proc/load_on_top(turf/added_layer, flags) @@ -99,7 +22,7 @@ if(flags & CHANGETURF_SKIP) // We haven't been initialized if(flags_1 & INITIALIZED_1) - stack_trace("CHANGETURF_SKIP was used in a place_on_top call for a turf that's initialized. This is a mistake. [src]([type])") + stack_trace("CHANGETURF_SKIP was used in a PlaceOnTop call for a turf that's initialized. This is a mistake. [src]([type])") assemble_baseturfs() var/turf/new_turf @@ -119,29 +42,6 @@ new_turf.baseturfs = baseturfs_string_list(old_baseturfs + (new_turf.baseturfs - GLOB.blacklisted_automated_baseturfs), new_turf) return new_turf -// Copy an existing turf and put it on top -// Returns the new turf -/turf/proc/CopyOnTop(turf/copytarget, ignore_bottom=1, depth=INFINITY, copy_air = FALSE, flags) - var/list/new_baseturfs = list() - new_baseturfs += baseturfs - new_baseturfs += type - - if(depth) - var/list/target_baseturfs - if(length(copytarget.baseturfs)) - // with default inputs this would be Copy(clamp(2, -INFINITY, baseturfs.len)) - // Don't forget a lower index is lower in the baseturfs stack, the bottom is baseturfs[1] - target_baseturfs = copytarget.baseturfs.Copy(clamp(1 + ignore_bottom, 1 + copytarget.baseturfs.len - depth, copytarget.baseturfs.len)) - else if(!ignore_bottom) - target_baseturfs = list(copytarget.baseturfs) - if(target_baseturfs) - target_baseturfs -= new_baseturfs & GLOB.blacklisted_automated_baseturfs - new_baseturfs += target_baseturfs - - var/turf/newT = copytarget.copyTurf(src, copy_air, flags) - newT.baseturfs = new_baseturfs - return newT - /// Tries to find the given type in baseturfs. /// If found, returns how deep it is for use in other baseturf procs, or null if it cannot be found. /// For example, this number can be passed into ScrapeAway to scrape everything until that point. diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 6f72c9ee2a83..85756e2cb337 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -91,21 +91,26 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/list/old_baseturfs = baseturfs - var/list/transferring_comps = list() - SEND_SIGNAL(src, COMSIG_TURF_CHANGE, path, new_baseturfs, flags, transferring_comps) - for(var/i in transferring_comps) - var/datum/component/comp = i - comp.ClearFromParent() + var/list/post_change_callbacks = list() + SEND_SIGNAL(src, COMSIG_TURF_CHANGE, path, new_baseturfs, flags, post_change_callbacks) changing_turf = TRUE qdel(src) //Just get the side effects and call Destroy - - var/carryover_turf_flags = (RESERVATION_TURF_1 | UNUSED_RESERVATION_TURF_1) & flags_1 + //We do this here so anything that doesn't want to persist can clear itself + var/list/old_listen_lookup = _listen_lookup?.Copy() + var/list/old_signal_procs = _signal_procs?.Copy() var/turf/W = new path(src) - W.flags_1 = carryover_turf_flags - - for(var/i in transferring_comps) - W.TakeComponent(i) + + // WARNING WARNING + // Turfs DO NOT lose their signals when they get replaced, REMEMBER THIS + // It's possible because turfs are fucked, and if you have one in a list and it's replaced with another one, the list ref points to the new turf + if(old_listen_lookup) + LAZYOR(W._listen_lookup, old_listen_lookup) + if(old_signal_procs) + LAZYOR(W._signal_procs, old_signal_procs) + + for(var/datum/callback/callback as anything in post_change_callbacks) + callback.InvokeAsync(W) if(new_baseturfs) W.baseturfs = new_baseturfs @@ -183,6 +188,124 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(!istype(air,/datum/gas_mixture)) Initalize_Atmos(0) +/// Take off the top layer turf and replace it with the next baseturf down +/turf/proc/ScrapeAway(amount=1, flags) + if(!amount) + return + if(length(baseturfs)) + var/list/new_baseturfs = baseturfs.Copy() + var/turf_type = new_baseturfs[max(1, new_baseturfs.len - amount + 1)] + while(ispath(turf_type, /turf/baseturf_skipover)) + amount++ + if(amount > new_baseturfs.len) + CRASH("The bottommost baseturf of a turf is a skipover [src]([type])") + turf_type = new_baseturfs[max(1, new_baseturfs.len - amount + 1)] + new_baseturfs.len -= min(amount, new_baseturfs.len - 1) // No removing the very bottom + if(new_baseturfs.len == 1) + new_baseturfs = new_baseturfs[1] + return ChangeTurf(turf_type, new_baseturfs, flags) + + if(baseturfs == type) + return src + + return ChangeTurf(baseturfs, baseturfs, flags) // The bottom baseturf will never go away + +// Take the input as baseturfs and put it underneath the current baseturfs +// If fake_turf_type is provided and new_baseturfs is not the baseturfs list will be created identical to the turf type's +// If both or just new_baseturfs is provided they will be inserted below the existing baseturfs +/turf/proc/PlaceOnBottom(list/new_baseturfs, turf/fake_turf_type) + if(fake_turf_type) + if(!new_baseturfs) + if(!length(baseturfs)) + baseturfs = list(baseturfs) + var/list/old_baseturfs = baseturfs.Copy() + assemble_baseturfs(fake_turf_type) + if(!length(baseturfs)) + baseturfs = list(baseturfs) + baseturfs -= baseturfs & GLOB.blacklisted_automated_baseturfs + baseturfs += old_baseturfs + return + else if(!length(new_baseturfs)) + new_baseturfs = list(new_baseturfs, fake_turf_type) + else + new_baseturfs += fake_turf_type + if(!length(baseturfs)) + baseturfs = list(baseturfs) + baseturfs.Insert(1, new_baseturfs) + +// Make a new turf and put it on top +// The args behave identical to PlaceOnBottom except they go on top +// Things placed on top of closed turfs will ignore the topmost closed turf +// Returns the new turf +/turf/proc/PlaceOnTop(list/new_baseturfs, turf/fake_turf_type, flags) + var/area/turf_area = loc + if(new_baseturfs && !length(new_baseturfs)) + new_baseturfs = list(new_baseturfs) + flags = turf_area.PlaceOnTopReact(new_baseturfs, fake_turf_type, flags) // A hook so areas can modify the incoming args + + var/turf/newT + if(flags & CHANGETURF_SKIP) // We haven't been initialized + if(flags_1 & INITIALIZED_1) + stack_trace("CHANGETURF_SKIP was used in a PlaceOnTop call for a turf that's initialized. This is a mistake. [src]([type])") + assemble_baseturfs() + if(fake_turf_type) + if(!new_baseturfs) // If no baseturfs list then we want to create one from the turf type + if(!length(baseturfs)) + baseturfs = list(baseturfs) + var/list/old_baseturfs = baseturfs.Copy() + if(!istype(src, /turf/closed)) + old_baseturfs += type + newT = ChangeTurf(fake_turf_type, null, flags) + newT.assemble_baseturfs(initial(fake_turf_type.baseturfs)) // The baseturfs list is created like roundstart + if(!length(newT.baseturfs)) + newT.baseturfs = list(baseturfs) + newT.baseturfs -= GLOB.blacklisted_automated_baseturfs + newT.baseturfs.Insert(1, old_baseturfs) // The old baseturfs are put underneath + return newT + if(!length(baseturfs)) + baseturfs = list(baseturfs) + if(!istype(src, /turf/closed)) + baseturfs += type + baseturfs += new_baseturfs + return ChangeTurf(fake_turf_type, null, flags) + if(!length(baseturfs)) + baseturfs = list(baseturfs) + if(!istype(src, /turf/closed)) + baseturfs += type + var/turf/change_type + if(length(new_baseturfs)) + change_type = new_baseturfs[new_baseturfs.len] + new_baseturfs.len-- + if(new_baseturfs.len) + baseturfs += new_baseturfs + else + change_type = new_baseturfs + return ChangeTurf(change_type, null, flags) + +// Copy an existing turf and put it on top +// Returns the new turf +/turf/proc/CopyOnTop(turf/copytarget, ignore_bottom=1, depth=INFINITY, copy_air = FALSE, flags) + var/list/new_baseturfs = list() + new_baseturfs += baseturfs + new_baseturfs += type + + if(depth) + var/list/target_baseturfs + if(length(copytarget.baseturfs)) + // with default inputs this would be Copy(clamp(2, -INFINITY, baseturfs.len)) + // Don't forget a lower index is lower in the baseturfs stack, the bottom is baseturfs[1] + target_baseturfs = copytarget.baseturfs.Copy(clamp(1 + ignore_bottom, 1 + copytarget.baseturfs.len - depth, copytarget.baseturfs.len)) + else if(!ignore_bottom) + target_baseturfs = list(copytarget.baseturfs) + if(target_baseturfs) + target_baseturfs -= new_baseturfs & GLOB.blacklisted_automated_baseturfs + new_baseturfs += target_baseturfs + + var/turf/newT = copytarget.copyTurf(src, copy_air, flags) + newT.baseturfs = new_baseturfs + return newT + + //If you modify this function, ensure it works correctly with lateloaded map templates. /turf/proc/AfterChange(flags) //called after a turf has been replaced in ChangeTurf() levelupdate() diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index f44ef3237020..1dc951fc6d42 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -88,7 +88,7 @@ * This replaces the current turf if it is plating and is passed plating, is tile and is passed tile. * It places the new turf on top of itself if it is plating and is passed a tile. * It also replaces the turf if it is tile and is passed plating, essentially destroying the over turf. - * Flags argument is passed directly to ChangeTurf or place_on_top + * Flags argument is passed directly to ChangeTurf or PlaceOnTop */ /turf/open/proc/replace_floor(turf/open/new_floor_path, flags) if (!overfloor_placed && initial(new_floor_path.overfloor_placed)) diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index 856410a9554c..ce29e208588c 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -40,7 +40,7 @@ switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, span_notice("You build a floor.")) - place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE @@ -72,7 +72,7 @@ playsound(src, 'sound/weapons/genhit.ogg', 50, 1) to_chat(user, span_notice("You build a floor.")) // Create a floor, which has this chasm underneath it - place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else to_chat(user, span_warning("You need one floor tile to build a floor!")) else diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index e7444610c999..c0cebd1f3fe9 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -259,7 +259,7 @@ switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, span_notice("You build a wall.")) - place_on_top(/turf/closed/wall) + PlaceOnTop(/turf/closed/wall) return TRUE if(RCD_AIRLOCK) if((locate(/obj/machinery/door/airlock) in src) || (locate(/obj/machinery/door/window) in src)) // Have to ignore firelocks diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 6ea3bdc0b73e..865d3b6e9fb5 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -68,7 +68,7 @@ to_chat(user, span_notice("You begin reinforcing the floor...")) if(do_after(user, 3 SECONDS, src)) if (R.get_amount() >= 1 && !istype(src, /turf/open/floor/engine)) - place_on_top(/turf/open/floor/engine, flags = CHANGETURF_INHERIT_AIR) + PlaceOnTop(/turf/open/floor/engine, flags = CHANGETURF_INHERIT_AIR) playsound(src, 'sound/items/deconstruct.ogg', 80, 1) R.use(1) to_chat(user, span_notice("You reinforce the floor.")) @@ -82,7 +82,7 @@ var/obj/item/stack/tile/W = C if(!W.use(1)) return - var/turf/open/floor/T = place_on_top(W.turf_type, flags = CHANGETURF_INHERIT_AIR) + var/turf/open/floor/T = PlaceOnTop(W.turf_type, flags = CHANGETURF_INHERIT_AIR) if(istype(W, /obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow var/obj/item/stack/tile/light/L = W var/turf/open/floor/light/F = T diff --git a/code/game/turfs/open/floor/plating/asteroid.dm b/code/game/turfs/open/floor/plating/asteroid.dm index 725a9f570778..97a747d723aa 100644 --- a/code/game/turfs/open/floor/plating/asteroid.dm +++ b/code/game/turfs/open/floor/plating/asteroid.dm @@ -53,7 +53,7 @@ switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, span_notice("You build a floor.")) - place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 99bc27e1725f..55b554a113e0 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -3,7 +3,6 @@ /turf/open/lava name = "lava" icon_state = "lava" - desc = "Looks painful to step in. Don't mine down." gender = PLURAL //"That's some lava." baseturfs = /turf/open/lava //lava all the way down slowdown = 2 @@ -11,7 +10,6 @@ light_range = 2 light_power = 0.75 light_color = LIGHT_COLOR_LAVA - light_on = FALSE bullet_bounce_sound = 'sound/items/welder2.ogg' footstep = FOOTSTEP_LAVA @@ -24,14 +22,7 @@ /// The icon state that covers the lava bits of our turf var/mask_state = "lava-lightmask" -/turf/open/lava/Initialize(mapload) - . = ..() - // if(fish_source_type) - // AddElement(/datum/element/lazy_fishing_spot, fish_source_type) - refresh_light() - if(!smoothing_flags) - update_appearance() - +/* //to add when emissives are added :thumbsup: /turf/open/lava/update_overlays() . = ..() // We need a light overlay here because not every lava turf casts light, only the edge ones @@ -46,52 +37,7 @@ light_mask.blend_mode = BLEND_MULTIPLY light_mask.color = list(-1,0,0,0, 0,-1,0,0, 0,0,-1,0, 0,0,0,1, 1,1,1,0) . += light_mask - -/// Refreshes this lava turf's lighting -/turf/open/lava/proc/refresh_light() - var/border_turf = FALSE - var/list/turfs_to_check = RANGE_TURFS(1, src) - if(GET_LOWEST_STACK_OFFSET(z)) - var/turf/above = GET_TURF_ABOVE(src) - if(above) - turfs_to_check += RANGE_TURFS(1, above) - var/turf/below = GET_TURF_BELOW(src) - if(below) - turfs_to_check += RANGE_TURFS(1, below) - - for(var/turf/around as anything in turfs_to_check) - if(islava(around)) - continue - border_turf = TRUE - - if(!border_turf) - set_light(l_on = FALSE) - return - - set_light(l_on = TRUE) - -/turf/open/lava/ChangeTurf(path, list/new_baseturfs, flags) - var/turf/result = ..() - - if(result && !islava(result)) - // We have gone from a lava turf to a non lava turf, time to let them know - var/list/turfs_to_check = RANGE_TURFS(1, result) - if(GET_LOWEST_STACK_OFFSET(z)) - var/turf/above = GET_TURF_ABOVE(result) - if(above) - turfs_to_check += RANGE_TURFS(1, above) - var/turf/below = GET_TURF_BELOW(result) - if(below) - turfs_to_check += RANGE_TURFS(1, below) - for(var/turf/open/lava/inform in turfs_to_check) - inform.set_light(l_on = TRUE) - - return result - -/turf/open/lava/smooth_icon() - . = ..() - mask_state = icon_state - update_appearance(~UPDATE_SMOOTHING) +*/ /turf/open/lava/ex_act(severity, target) contents_explosion(severity, target) @@ -137,7 +83,7 @@ switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, span_notice("You build a floor.")) - place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE @@ -239,14 +185,17 @@ name = "lava" baseturfs = /turf/open/lava/smooth icon = 'icons/turf/floors/lava.dmi' - mask_icon = 'icons/turf/floors/lava_mask.dmi' icon_state = "lava-255" mask_state = "lava-255" base_icon_state = "lava" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_LAVA canSmoothWith = SMOOTH_GROUP_FLOOR_LAVA - underfloor_accessibility = 2 //This avoids strangeness when routing pipes / wires along catwalks over lava + +/turf/open/lava/smooth_icon() + . = ..() + mask_state = icon_state + update_appearance(~UPDATE_SMOOTHING) /turf/open/lava/smooth/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index e2c333838a42..a73bcb32b632 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -1,13 +1,10 @@ /turf/open/openspace name = "open space" desc = "Watch your step!" - // We don't actually draw openspace, but it needs to have color - // In its icon state so we can count it as a "non black" tile - icon_state = MAP_SWITCH("pure_white", "invisible") + icon_state = "grey" baseturfs = /turf/open/openspace overfloor_placed = FALSE underfloor_accessibility = UNDERFLOOR_INTERACTABLE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT CanAtmosPassVertical = ATMOS_PASS_YES flags_1 = NO_RUST plane = TRANSPARENT_FLOOR_PLANE @@ -15,26 +12,18 @@ var/can_cover_up = TRUE var/can_build_on = TRUE -// Reminder, any behavior code written here needs to be duped to /turf/open/space/openspace -// I am so sorry +/turf/open/openspace/debug/update_multiz() + ..() + return TRUE + /turf/open/openspace/Initialize(mapload) // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker . = ..() - if(PERFORM_ALL_TESTS(focus_only/openspace_clear) && !GET_TURF_BELOW(src)) - stack_trace("[src] was inited as openspace with nothing below it at ([x], [y], [z])") - RegisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(on_atom_created)) + + RegisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE, PROC_REF(on_atom_created)) var/area/our_area = loc if(istype(our_area, /area/space)) force_no_gravity = TRUE return INITIALIZE_HINT_LATELOAD - -/turf/open/openspace/LateInitialize() - . = ..() - AddElement(/datum/element/turf_z_transparency) - -/turf/open/openspace/ChangeTurf(path, list/new_baseturfs, flags) - UnregisterSignal(src, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON) - return ..() - /** * Drops movables spawned on this turf after they are successfully initialized. * so that spawned movables that should fall to gravity, will fall. @@ -49,37 +38,46 @@ return zFall(movable) +/turf/open/openspace/LateInitialize() + update_multiz(TRUE, TRUE) + +/turf/open/openspace/Destroy() + vis_contents.len = 0 + return ..() + +/turf/open/openspace/update_multiz(prune_on_fail = FALSE, init = FALSE) + . = ..() + var/turf/T = below() + if(!T) + vis_contents.len = 0 + if(prune_on_fail) + ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + return FALSE + if(init) + vis_contents += T + return TRUE + +/turf/open/openspace/multiz_turf_del(turf/T, dir) + if(dir != DOWN) + return + update_multiz() + +/turf/open/openspace/multiz_turf_new(turf/T, dir) + if(dir != DOWN) + return + update_multiz() + /turf/open/openspace/zAirIn() return TRUE /turf/open/openspace/zAirOut() return TRUE -/turf/open/openspace/zPassIn(direction) - if(direction == DOWN) - for(var/obj/contained_object in contents) - if(contained_object.obj_flags & BLOCK_Z_IN_DOWN) - return FALSE - return TRUE - if(direction == UP) - for(var/obj/contained_object in contents) - if(contained_object.obj_flags & BLOCK_Z_IN_UP) - return FALSE - return TRUE - return FALSE - -/turf/open/openspace/zPassOut(direction) - if(direction == DOWN) - for(var/obj/contained_object in contents) - if(contained_object.obj_flags & BLOCK_Z_OUT_DOWN) - return FALSE - return TRUE - if(direction == UP) - for(var/obj/contained_object in contents) - if(contained_object.obj_flags & BLOCK_Z_OUT_UP) - return FALSE - return TRUE - return FALSE +/turf/open/openspace/zPassIn(atom/movable/A, direction, turf/source) + return TRUE + +/turf/open/openspace/zPassOut(atom/movable/A, direction, turf/destination) + return TRUE /turf/open/openspace/proc/CanCoverUp() return can_cover_up @@ -123,7 +121,7 @@ qdel(L) playsound(src, 'sound/weapons/genhit.ogg', 50, 1) to_chat(user, span_notice("You build a floor.")) - place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else to_chat(user, span_warning("You need one floor tile to build a floor!")) else diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index bd1102fdf055..d9dac63995ee 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -83,6 +83,34 @@ GLOBAL_LIST_EMPTY(starlight) //This is used to optimize the map loader return +/turf/open/space/Initialize(mapload) + SHOULD_CALL_PARENT(FALSE) + icon_state = SPACE_ICON_STATE + if(!space_gas) + space_gas = new + air = space_gas + update_air_ref(0) + vis_contents.Cut() //removes inherited overlays + visibilityChanged() + + if (PERFORM_ALL_TESTS(focus_only/multiple_space_initialization)) + if(flags_1 & INITIALIZED_1) + stack_trace("Warning: [src]([type]) initialized multiple times!") + flags_1 |= INITIALIZED_1 + + var/area/our_area = loc + if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(our_area)) + add_overlay(/obj/effect/fullbright) + + if (light_system == STATIC_LIGHT && light_power && light_range) + update_light() + + if (opacity) + directional_opacity = ALL_CARDINALS + + return INITIALIZE_HINT_NORMAL + + /turf/open/space/Destroy() GLOB.starlight -= src return ..() diff --git a/code/game/turfs/open/space/space_EXPENSIVE.dm b/code/game/turfs/open/space/space_EXPENSIVE.dm deleted file mode 100644 index a9b3222bd592..000000000000 --- a/code/game/turfs/open/space/space_EXPENSIVE.dm +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Space Initialize - * - * Doesn't call parent, see [/atom/proc/Initialize]. - * When adding new stuff to /atom/Initialize, /turf/Initialize, etc - * don't just add it here unless space actually needs it. - * - * There is a lot of work that is intentionally not done because it is not currently used. - * This includes stuff like smoothing, blocking camera visibility, etc. - * If you are facing some odd bug with specifically space, check if it's something that was - * intentionally ommitted from this implementation. - */ -/turf/open/space/Initialize(mapload) - SHOULD_CALL_PARENT(FALSE) - air = space_gas - - if (PERFORM_ALL_TESTS(focus_only/multiple_space_initialization)) - if(flags_1 & INITIALIZED_1) - stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 - - // We make the assumption that the space plane will never be blacklisted, as an optimization - if(SSmapping.max_plane_offset) - plane = PLANE_SPACE - (PLANE_RANGE * SSmapping.z_level_to_plane_offset[z]) - - var/area/our_area = loc - if(!our_area.area_has_base_lighting && space_lit) //Only provide your own lighting if the area doesn't for you - // Intentionally not add_overlay for performance reasons. - // add_overlay does a bunch of generic stuff, like creating a new list for overlays, - // queueing compile, cloning appearance, etc etc etc that is not necessary here. - overlays += GLOB.starlight_overlays[GET_TURF_PLANE_OFFSET(src) + 1] - - if (!mapload) - if(requires_activation) - ImmediateCalculateAdjacentTurfs() - - if(SSmapping.max_plane_offset) - var/turf/T = GET_TURF_ABOVE(src) - if(T) - T.multiz_turf_new(src, DOWN) - T = GET_TURF_BELOW(src) - if(T) - T.multiz_turf_new(src, UP) - - return INITIALIZE_HINT_NORMAL diff --git a/code/game/turfs/open/space/transit.dm b/code/game/turfs/open/space/transit.dm index 15b667e30adf..3e641c17f9fc 100644 --- a/code/game/turfs/open/space/transit.dm +++ b/code/game/turfs/open/space/transit.dm @@ -16,7 +16,6 @@ /turf/open/space/transit/Destroy() //Signals are NOT removed from turfs upon replacement, and we get replaced ALOT, so unregister our signal UnregisterSignal(src, list(COMSIG_TURF_RESERVATION_RELEASED, COMSIG_ATOM_ENTERED, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON)) - return ..() /turf/open/space/transit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) @@ -24,14 +23,6 @@ underlay_appearance.icon_state = "speedspace_ns_[get_transit_state(asking_turf)]" underlay_appearance.transform = turn(matrix(), get_transit_angle(asking_turf)) -/turf/open/space/transit/update_icon() - . = ..() - transform = turn(matrix(), get_transit_angle(src)) - -/turf/open/space/transit/update_icon_state() - icon_state = "speedspace_ns_[get_transit_state(src)]" - return ..() - /turf/open/space/transit/proc/initialize_drifting(atom/entered, atom/movable/enterer) SIGNAL_HANDLER @@ -97,6 +88,11 @@ /turf/open/space/transit/east dir = EAST +/turf/open/space/transit/update_icon_state() + . = ..() + icon_state = "speedspace_ns_[get_transit_state(src)]" + transform = turn(matrix(), get_transit_angle(src)) + /proc/get_transit_state(turf/T) var/p = 9 . = 1 diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 7c4f668b44cb..753c4c228e7f 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -610,13 +610,12 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/proc/add_blueprints(atom/movable/AM) var/image/I = new - SET_PLANE(I, GAME_PLANE, src) - I.layer = OBJ_LAYER I.appearance = AM.appearance I.appearance_flags = RESET_COLOR|RESET_ALPHA|RESET_TRANSFORM I.loc = src I.setDir(AM.dir) I.alpha = 128 + LAZYADD(blueprint_data, I) diff --git a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm index 8a79dde170f9..7270696af35b 100644 --- a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm +++ b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm @@ -60,9 +60,9 @@ brass_floor = TRUE if(W.use(2 - brass_floor)) if(anchored) - T.place_on_top(/turf/closed/wall/clockwork) + T.PlaceOnTop(/turf/closed/wall/clockwork) else - T.place_on_top(/turf/open/floor/clockwork, flags = CHANGETURF_INHERIT_AIR) + T.PlaceOnTop(/turf/open/floor/clockwork, flags = CHANGETURF_INHERIT_AIR) new /obj/structure/falsewall/brass(T) qdel(src) else diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 519f16e4b613..716568c4736c 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -223,7 +223,7 @@ var/turf/T = safepick(validturfs) if(T) if(istype(T, /turf/open/floor/plating)) - T.place_on_top(/turf/open/floor/engine/cult, flags = CHANGETURF_IGNORE_AIR) + T.PlaceOnTop(/turf/open/floor/engine/cult, flags = CHANGETURF_IGNORE_AIR) else T.ChangeTurf(/turf/open/floor/engine/cult, flags = CHANGETURF_IGNORE_AIR) else diff --git a/code/modules/antagonists/eldritch_cult/magic/rust_magic.dm b/code/modules/antagonists/eldritch_cult/magic/rust_magic.dm index 9cea94672e9b..8804e4240d29 100644 --- a/code/modules/antagonists/eldritch_cult/magic/rust_magic.dm +++ b/code/modules/antagonists/eldritch_cult/magic/rust_magic.dm @@ -226,7 +226,7 @@ RUST PATH SPELLS GO HERE /datum/action/cooldown/spell/pointed/rust_construction/cast(turf/open/cast_on) . = ..() var/rises_message = "rises out of [cast_on]" - var/turf/closed/wall/new_wall = cast_on.place_on_top(/turf/closed/wall) + var/turf/closed/wall/new_wall = cast_on.PlaceOnTop(/turf/closed/wall) if(!istype(new_wall)) return diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index ee561c802f13..fde8a87c5f97 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -39,7 +39,6 @@ GLOBAL_LIST_INIT(potentialConfigRandomZlevels, generateConfigMapList(directory = /proc/generateMapList(filename) . = list() - filename = "[global.config.directory]/[SANITIZE_FILENAME(filename)]" var/list/Lines = world.file2list(filename) if(!Lines.len) diff --git a/code/modules/buildmode/submodes/basic.dm b/code/modules/buildmode/submodes/basic.dm index d6aaa08685f2..a52b4642490c 100644 --- a/code/modules/buildmode/submodes/basic.dm +++ b/code/modules/buildmode/submodes/basic.dm @@ -22,13 +22,13 @@ if(istype(object,/turf) && left_click && !alt_click && !ctrl_click) var/turf/T = object if(isspaceturf(object) || ischasm(object) || islava(object)) - T.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + T.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else if(isplatingturf(object)) - T.place_on_top(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) + T.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) else if(isfloorturf(object)) - T.place_on_top(/turf/closed/wall) + T.PlaceOnTop(/turf/closed/wall) else if(iswallturf(object)) - T.place_on_top(/turf/closed/wall/r_wall) + T.PlaceOnTop(/turf/closed/wall/r_wall) log_admin("Build Mode: [key_name(c)] built [T] at [AREACOORD(T)]") return else if(right_click) diff --git a/code/modules/buildmode/submodes/fill.dm b/code/modules/buildmode/submodes/fill.dm index 04c60d35ef46..c71f12eab249 100644 --- a/code/modules/buildmode/submodes/fill.dm +++ b/code/modules/buildmode/submodes/fill.dm @@ -59,7 +59,7 @@ else for(var/turf/T in block(get_turf(cornerA),get_turf(cornerB))) if(ispath(objholder,/turf)) - T.place_on_top(objholder) + T.PlaceOnTop(objholder) else var/obj/A = new objholder(T) A.setDir(BM.build_dir) diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 4f2bd6b9ecf5..5bba3f117cf6 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -289,7 +289,7 @@ if (openingSound) playsound(get_turf(holder), openingSound, soundVolume, FALSE, FALSE) //Special admin sound to play for (var/turf_type in turfs_in_cargo) - turf_underneath.place_on_top(turf_type) + turf_underneath.PlaceOnTop(turf_type) for (var/cargo in contents) var/atom/movable/movable_cargo = cargo movable_cargo.forceMove(turf_underneath) diff --git a/code/modules/events/shuttle_catastrophe.dm b/code/modules/events/shuttle_catastrophe.dm index 91a398b9f524..7fa850c78943 100644 --- a/code/modules/events/shuttle_catastrophe.dm +++ b/code/modules/events/shuttle_catastrophe.dm @@ -13,14 +13,8 @@ /datum/round_event/shuttle_catastrophe var/datum/map_template/shuttle/new_shuttle - var/list/datum/map_template/shuttle/blacklisted_shuttles = list( - /datum/map_template/shuttle/emergency/arena, - /datum/map_template/shuttle/emergency/construction, - /datum/map_template/shuttle/emergency/construction/small, - /datum/map_template/shuttle/emergency/discoinferno, - /datum/map_template/shuttle/emergency/meteor, - ) - + var/list/datum/map_template/shuttle/blacklisted_shuttles = list(/datum/map_template/shuttle/emergency/arena, /datum/map_template/shuttle/emergency/construction, + /datum/map_template/shuttle/emergency/construction/small, /datum/map_template/shuttle/emergency/discoinferno, /datum/map_template/shuttle/emergency/meteor) /datum/round_event/shuttle_catastrophe/announce(fake) var/cause = pick("was attacked by [syndicate_name()] Operatives", "mysteriously teleported away", "had its refuelling crew mutiny", "was found with its engines stolen", "\[REDACTED\]", "flew into the sunset, and melted", "fell into a black hole", @@ -29,19 +23,19 @@ priority_announce("Your emergency shuttle [cause]. Your replacement shuttle will be the [new_shuttle.name] until further notice.", "CentCom Spacecraft Engineering") /datum/round_event/shuttle_catastrophe/setup() - if(!isnull(new_shuttle)) //If an admin has overridden it don't re-roll it - return var/list/valid_shuttle_templates = list() for(var/shuttle_id in SSmapping.shuttle_templates) var/datum/map_template/shuttle/template = SSmapping.shuttle_templates[shuttle_id] - if(!(template in blacklisted_shuttles) && template.credit_cost < INFINITY) //if we could get it from the communications console, it's cool for us to get it here - valid_shuttle_templates += template + if(template.credit_cost < INFINITY) //if we could get it from the emagged communications console, it's cool for us to get it here + if (!(template in blacklisted_shuttles)) + valid_shuttle_templates += template new_shuttle = pick(valid_shuttle_templates) /datum/round_event/shuttle_catastrophe/start() SSshuttle.shuttle_purchased = SHUTTLEPURCHASE_FORCED SSshuttle.unload_preview() + SSshuttle.load_template(new_shuttle) SSshuttle.existing_shuttle = SSshuttle.emergency SSshuttle.emergency.name = new_shuttle.name - SSshuttle.action_load(new_shuttle, replace = TRUE) + SSshuttle.action_load(new_shuttle) log_game("Shuttle Catastrophe set a new shuttle, [new_shuttle.name].") diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index d20448ef9243..24dead54cfbe 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -111,7 +111,6 @@ // need these two below? SSmachines.setup_template_powernets(cables) SSair.setup_template_machinery(atmos_machines) - //SSshuttle.setup_shuttles(ports) //calculate all turfs inside the border var/list/template_and_bordering_turfs = block( @@ -127,7 +126,7 @@ ) ) for(var/turf/affected_turf as anything in template_and_bordering_turfs) - affected_turf.ImmediateCalculateAdjacentTurfs() + affected_turf.air_update_turf(TRUE, TRUE) affected_turf.levelupdate() /datum/map_template/proc/load_new_z(secret = FALSE) @@ -195,19 +194,19 @@ //initialize things that are normally initialized after map load initTemplateBounds(bounds) - if(has_ceiling) - var/affected_turfs = get_affected_turfs(T, FALSE) - generate_ceiling(affected_turfs) + // if(has_ceiling) + // var/affected_turfs = get_affected_turfs(T, FALSE) + // generate_ceiling(affected_turfs) log_game("[name] loaded at [T.x],[T.y],[T.z]") return bounds -/datum/map_template/proc/generate_ceiling(affected_turfs) - for (var/turf/turf in affected_turfs) - var/turf/ceiling = get_step_multiz(turf, UP) - if (ceiling) - if (istype(ceiling, /turf/open/openspace) || istype(ceiling, /turf/open/space/openspace)) - ceiling.ChangeTurf(ceiling_turf, ceiling_baseturfs, CHANGETURF_INHERIT_AIR) +// /datum/map_template/proc/generate_ceiling(affected_turfs) +// for (var/turf/turf in affected_turfs) +// var/turf/ceiling = get_step_multiz(turf, UP) +// if (ceiling) +// if (istype(ceiling, /turf/open/openspace) || istype(ceiling, /turf/open/space/openspace)) +// ceiling.ChangeTurf(ceiling_turf, ceiling_baseturfs, CHANGETURF_INHERIT_AIR) /datum/map_template/proc/post_load() return diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index dcee2c37f556..1d065cb064eb 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -6,9 +6,8 @@ name = "baseturf editor" icon = 'icons/effects/mapping_helpers.dmi' icon_state = "" - /// Replacing a specific turf + var/list/baseturf_to_replace - /// The desired bottom turf var/baseturf plane = POINT_PLANE @@ -19,7 +18,7 @@ /obj/effect/baseturf_helper/LateInitialize() if(!baseturf_to_replace) - baseturf_to_replace = typecacheof(list(/turf/open/space,/turf/baseturf_bottom)) + baseturf_to_replace = typecacheof(/turf/open/space) else if(!length(baseturf_to_replace)) baseturf_to_replace = list(baseturf_to_replace = TRUE) else if(baseturf_to_replace[baseturf_to_replace[1]] != TRUE) // It's not associative @@ -34,16 +33,20 @@ qdel(src) -/// Replaces all the requested baseturfs (usually space/baseturfbottom) with the desired baseturf. Skips if its already there /obj/effect/baseturf_helper/proc/replace_baseturf(turf/thing) - thing.remove_baseturfs_from_typecache(baseturf_to_replace) - - if(length(thing.baseturfs)) - var/turf/tile = thing.baseturfs[1] - if(tile == baseturf) - return - - thing.place_on_bottom(baseturf) + var/list/baseturf_cache = thing.baseturfs + if(length(baseturf_cache)) + for(var/i in baseturf_cache) + if(baseturf_to_replace[i]) + baseturf_cache -= i + if(!baseturf_cache.len) + thing.assemble_baseturfs(baseturf) + else + thing.PlaceOnBottom(null, baseturf) + else if(baseturf_to_replace[thing.baseturfs]) + thing.assemble_baseturfs(baseturf) + else + thing.PlaceOnBottom(null, baseturf) @@ -87,9 +90,6 @@ /obj/effect/mapping_helpers icon = 'icons/effects/mapping_helpers.dmi' icon_state = "" - anchored = TRUE - // Unless otherwise specified, layer above everything - layer = ABOVE_ALL_MOB_LAYER var/late = FALSE /obj/effect/mapping_helpers/Initialize(mapload) diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 77c9731da35a..ab6743ff17a0 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -148,7 +148,7 @@ * - y_upper: The maximum y coordinate to load * - z_lower: The minimum z coordinate to load * - z_upper: The maximum z coordinate to load - * - place_on_top: Whether to use /turf/proc/place_on_top rather than /turf/proc/ChangeTurf + * - place_on_top: Whether to use /turf/proc/PlaceOnTop rather than /turf/proc/ChangeTurf * - new_z: If true, a new z level will be created for the map */ /proc/load_map( diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm index b0e2ff7fa065..34f2774b5aa8 100644 --- a/code/modules/mapping/space_management/multiz_helpers.dm +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -44,3 +44,22 @@ us = next next = GET_TURF_ABOVE(us) return us + +/proc/dir_inverse_multiz(dir) + var/holder = dir & (UP|DOWN) + if((holder == NONE) || (holder == (UP|DOWN))) + return turn(dir, 180) + dir &= ~(UP|DOWN) + dir = turn(dir, 180) + if(holder == UP) + holder = DOWN + else + holder = UP + dir |= holder + return dir + +/turf/proc/above() + return get_step_multiz(src, UP) + +/turf/proc/below() + return get_step_multiz(src, DOWN) diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index 25305978ef44..a3ff5f892554 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -56,20 +56,20 @@ INVOKE_ASYNC(SSmapping, TYPE_PROC_REF(/datum/controller/subsystem/mapping, reserve_turfs), release_turfs) /// Attempts to calaculate and store a list of turfs around the reservation for cordoning. Returns whether a valid cordon was calculated -/datum/turf_reservation/proc/calculate_cordon_turfs(turf/bottom_left, turf/top_right) - if(bottom_left.x < 2 || bottom_left.y < 2 || top_right.x > (world.maxx - 2) || top_right.y > (world.maxy - 2)) +/datum/turf_reservation/proc/calculate_cordon_turfs(turf/BL, turf/TR) + if(BL.x < 2 || BL.y < 2 || TR.x > (world.maxx - 2) || TR.y > (world.maxy - 2)) return FALSE // no space for a cordon here - var/list/possible_turfs = CORNER_OUTLINE(bottom_left, width, height) - // if they're our cordon turfs, accept them - possible_turfs -= cordon_turfs + var/list/possible_turfs = CORNER_OUTLINE(BL, width, height) for(var/turf/cordon_turf as anything in possible_turfs) - if(!(cordon_turf.turf_flags & UNUSED_RESERVATION_TURF)) + if(!(cordon_turf.flags_1 & UNUSED_RESERVATION_TURF_1)) return FALSE - cordon_turfs |= possible_turfs + cordon_turfs = possible_turfs + + pre_cordon_turfs.Cut() if(pre_cordon_distance) - var/turf/offset_turf = locate(bottom_left.x + pre_cordon_distance, bottom_left.y + pre_cordon_distance, bottom_left.z) + var/turf/offset_turf = locate(BL.x + pre_cordon_distance, BL.y + pre_cordon_distance, BL.z) var/list/to_add = CORNER_OUTLINE(offset_turf, width - pre_cordon_distance * 2, height - pre_cordon_distance * 2) //we step-by-stop move inwards from the outer cordon for(var/turf/turf_being_added as anything in to_add) pre_cordon_turfs |= turf_being_added //add one by one so we can filter out duplicates @@ -136,6 +136,7 @@ if(!HAS_TRAIT(enterer, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT)) space_dump(source, enterer) + /// Internal proc which handles reserving the area for the reservation. /datum/turf_reservation/proc/_reserve_area(width, height, zlevel) src.width = width @@ -178,7 +179,6 @@ reserved_turfs |= T SSmapping.unused_turfs["[T.z]"] -= T SSmapping.used_turfs[T] = src - T.flags_1 = (T.flags_1 | RESERVATION_TURF_1) & ~UNUSED_RESERVATION_TURF_1 T.ChangeTurf(turf_type, turf_type) bottom_left_turfs += BL diff --git a/code/modules/mapping/space_management/space_transition.dm b/code/modules/mapping/space_management/space_transition.dm index b61897dd7b6b..7311681fbfc4 100644 --- a/code/modules/mapping/space_management/space_transition.dm +++ b/code/modules/mapping/space_management/space_transition.dm @@ -93,13 +93,13 @@ level.set_neigbours(used_points) point = pick(possible_points) CHECK_TICK - + // Now that we've handed out neighbors, we're gonna handle an edge case // Need to check if all our levels have neighbors in all directions // If they don't, we'll make them wrap all the way around to the other side of the grid for(var/direction in GLOB.cardinals) var/dir = "[direction]" - var/inverse = "[REVERSE_DIR(direction)]" + var/inverse = "[turn(direction, 180)]" for(var/datum/space_level/level as anything in transition_levels) // If we have something in this dir that isn't just us, continue on if(level.neigbours[dir] && level.neigbours[dir] != level) @@ -114,18 +114,16 @@ //Lists below are pre-calculated values arranged in the list in such a way to be easily accessable in the loop by the counter //Its either this or madness with lotsa math + var/inner_max_x = world.maxx - TRANSITIONEDGE var/inner_max_y = world.maxy - TRANSITIONEDGE var/list/x_pos_beginning = list(1, 1, inner_max_x, 1) //x values of the lowest-leftest turfs of the respective 4 blocks on each side of zlevel var/list/y_pos_beginning = list(inner_max_y, 1, 1 + TRANSITIONEDGE, 1 + TRANSITIONEDGE) //y values respectively - var/list/x_pos_ending = list(world.maxx, world.maxx, world.maxx, 1 + TRANSITIONEDGE) //x values of the highest-rightest turfs of the respective 4 blocks on each side of zlevel + var/list/x_pos_ending = list(world.maxx, world.maxx, world.maxx, 1 + TRANSITIONEDGE) //x values of the highest-rightest turfs of the respective 4 blocks on each side of zlevel var/list/y_pos_ending = list(world.maxy, 1 + TRANSITIONEDGE, inner_max_y, inner_max_y) //y values respectively var/list/x_pos_transition = list(1, 1, TRANSITIONEDGE + 2, inner_max_x - 1) //values of x for the transition from respective blocks on the side of zlevel, 1 is being translated into turfs respective x value later in the code var/list/y_pos_transition = list(TRANSITIONEDGE + 2, inner_max_y - 1, 1, 1) //values of y for the transition from respective blocks on the side of zlevel, 1 is being translated into turfs respective y value later in the code - // Cache the range passed to the mirage border element, to reduce world var access in the thousands - var/range_cached = world.view - for(var/datum/space_level/level as anything in cached_z_list) if(!level.neigbours.len) continue @@ -144,7 +142,7 @@ S.destination_x = x_target || S.x S.destination_y = y_target || S.y S.destination_z = zdestination - + // Mirage border code var/mirage_dir if(S.x == 1 + TRANSITIONEDGE) @@ -159,6 +157,6 @@ continue var/turf/place = locate(S.destination_x, S.destination_y, zdestination) - S.AddElement(/datum/element/mirage_border, place, mirage_dir, range_cached) + S.AddComponent(/datum/component/mirage_border, place, mirage_dir) #undef CHORDS_TO_1D diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm index 6ca2f822f661..0aadf6d40349 100644 --- a/code/modules/mapping/space_management/zlevel_manager.dm +++ b/code/modules/mapping/space_management/zlevel_manager.dm @@ -17,10 +17,8 @@ var/list/features = default_map_traits[I] var/datum/space_level/S = new(I, features[DL_NAME], features[DL_TRAITS]) manage_z_level(S, filled_with_space = FALSE) - generate_z_level_linkages() // Default Zs don't use add_new_zlevel() so they don't automatically generate z-linkages. + //generate_z_level_linkages() // Default Zs don't use add_new_zlevel() so they don't automatically generate z-linkages. -/// Generates a real, honest to god new z level. Will create the actual space, and also generate a datum that holds info about the new plot of land -/// Accepts the name, traits list, datum type, and if we should manage the turfs we create /datum/controller/subsystem/mapping/proc/add_new_zlevel(name, traits = list(), z_type = /datum/space_level, contain_turfs = TRUE) UNTIL(!adding_new_zlevel) adding_new_zlevel = TRUE @@ -31,7 +29,7 @@ // TODO: sleep here if the Z level needs to be cleared var/datum/space_level/S = new z_type(new_z, name, traits) manage_z_level(S, filled_with_space = TRUE, contain_turfs = contain_turfs) - generate_linkages_for_z_level(new_z) + //generate_linkages_for_z_level(new_z) adding_new_zlevel = FALSE SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_Z, S) return S diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index f09a96c64678..c0c624ae27c0 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -323,9 +323,9 @@ sleep(5 SECONDS) if(mode == BOT_REPAIRING && src.loc == target_turf) if(autotile) //Build the floor and include a tile. - target_turf.place_on_top(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) + target_turf.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) else //Build a hull plating without a floor tile. - target_turf.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + target_turf.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else var/turf/open/floor/F = target_turf @@ -339,7 +339,7 @@ if(mode == BOT_REPAIRING && F && src.loc == F) F.broken = FALSE F.burnt = FALSE - F.place_on_top(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) + F.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) if(replacetiles && F.type != initial(tiletype.turf_type) && specialtiles && !isplatingturf(F)) anchored = TRUE @@ -350,7 +350,7 @@ if(mode == BOT_REPAIRING && F && src.loc == F) F.broken = FALSE F.burnt = FALSE - F.place_on_top(initial(tiletype.turf_type), flags = CHANGETURF_INHERIT_AIR) + F.PlaceOnTop(initial(tiletype.turf_type), flags = CHANGETURF_INHERIT_AIR) specialtiles -= 1 if(specialtiles == 0) speak("Requesting refill of custom floortiles to continue replacing.") diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 7d747963dd08..86225ee4f94d 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1765,7 +1765,7 @@ /datum/reagent/carpet/reaction_turf(turf/T, reac_volume) if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) var/turf/open/floor/F = T - F.place_on_top(/turf/open/floor/carpet, flags = CHANGETURF_INHERIT_AIR) + F.PlaceOnTop(/turf/open/floor/carpet, flags = CHANGETURF_INHERIT_AIR) ..() /datum/reagent/bromine diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm index 6bf65e72e416..1bd27290d2d4 100644 --- a/code/modules/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/ruins/lavalandruin_code/puzzle.dm @@ -173,7 +173,7 @@ //Setup random empty tile empty_tile_id = pick_n_take(left_ids) var/turf/empty_tile_turf = get_turf_for_id(empty_tile_id) - empty_tile_turf.place_on_top(floor_type,null,CHANGETURF_INHERIT_AIR) + empty_tile_turf.PlaceOnTop(floor_type,null,CHANGETURF_INHERIT_AIR) var/mutable_appearance/MA = new(puzzle_pieces["[empty_tile_id]"]) MA.layer = empty_tile_turf.layer + 0.1 empty_tile_turf.add_overlay(MA) @@ -182,7 +182,7 @@ var/list/empty_spots = left_ids.Copy() for(var/spot_id in empty_spots) var/turf/T = get_turf_for_id(spot_id) - T = T.place_on_top(floor_type,null,CHANGETURF_INHERIT_AIR) + T = T.PlaceOnTop(floor_type,null,CHANGETURF_INHERIT_AIR) var/obj/structure/puzzle_element/E = new element_type(T) elements += E var/chosen_id = pick_n_take(left_ids) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index eb3a3ae5d94b..357f2b50949d 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -34,28 +34,7 @@ ///Delete this port after ship fly off. var/delete_after = FALSE - ///are we registered in SSshuttles? - var/registered = FALSE - -///register to SSshuttles -/obj/docking_port/proc/register() - if(registered) - WARNING("docking_port registered multiple times") - unregister() - registered = TRUE - return - -///unregister from SSshuttles -/obj/docking_port/proc/unregister() - if(!registered) - WARNING("docking_port unregistered multiple times") - registered = FALSE - return - -/obj/docking_port/proc/Check_id() - return - -//these objects are indestructible + //these objects are indestructible /obj/docking_port/Destroy(force) // unless you assert that you know what you're doing. Horrible things // may result. @@ -145,9 +124,7 @@ #ifdef DOCKING_PORT_HIGHLIGHT //Debug proc used to highlight bounding area -/obj/docking_port/proc/highlight(_color = "#f00") - SetInvisibility(INVISIBILITY_NONE) - SET_PLANE_IMPLICIT(src, GHOST_PLANE) +/obj/docking_port/proc/highlight(_color) var/list/L = return_coords() var/turf/T0 = locate(L[1],L[2],z) var/turf/T1 = locate(L[3],L[4],z) @@ -198,17 +175,13 @@ ///If true, the shuttle can always dock at this docking port, despite its area checks, or if something is already docked var/override_can_dock_checks = FALSE -/obj/docking_port/stationary/register(replace = FALSE) +/obj/docking_port/stationary/Initialize(mapload) . = ..() + SSshuttle.stationary += src if(!id) id = "[SSshuttle.stationary.len]" if(name == "dock") name = "dock[SSshuttle.stationary.len]" - SSshuttle.stationary += src - -/obj/docking_port/stationary/Initialize(mapload) - . = ..() - register() if(!area_type) var/area/place = get_area(src) area_type = place?.type // We might be created in nullspace @@ -217,20 +190,16 @@ for(var/turf/T in return_turfs()) T.flags_1 |= NO_RUINS_1 - if(SSshuttle.initialized) - INVOKE_ASYNC(SSshuttle, TYPE_PROC_REF(/datum/controller/subsystem/shuttle, setup_shuttles), list(src)) + // if(SSshuttle.initialized) + // INVOKE_ASYNC(SSshuttle, TYPE_PROC_REF(/datum/controller/subsystem/shuttle, setup_shuttles), list(src)) #ifdef DOCKING_PORT_HIGHLIGHT highlight("#f00") #endif -/obj/docking_port/stationary/unregister() - . = ..() - SSshuttle.stationary -= src - /obj/docking_port/stationary/Destroy(force) if(force) - unregister() + SSshuttle.stationary -= src . = ..() /obj/docking_port/stationary/Moved(atom/oldloc, dir, forced) @@ -325,10 +294,7 @@ var/launch_status = NOLAUNCH ///Whether or not you want your ship to knock people down, and also whether it will throw them several tiles upon launching. - var/list/movement_force = list( - "KNOCKDOWN" = 3, - "THROW" = 0, - ) + var/list/movement_force = list("KNOCKDOWN" = 3, "THROW" = 0) var/list/ripples = list() var/engine_coeff = 1 @@ -339,84 +305,10 @@ var/can_move_docking_ports = FALSE var/list/hidden_turfs = list() -#define WORLDMAXX_CUTOFF (world.maxx + 1) -#define WORLDMAXY_CUTOFF (world.maxx + 1) -/** - * Calculated and populates the information used for docking and some internal vars. - * This can also be used to calculate from shuttle_areas so that you can expand/shrink shuttles! - * - * Arguments: - * * loading_from - The template that the shuttle was loaded from, if not given we iterate shuttle_areas to calculate information instead - */ -/obj/docking_port/mobile/proc/calculate_docking_port_information(datum/map_template/shuttle/loading_from) - var/port_x_offset = loading_from?.port_x_offset - var/port_y_offset = loading_from?.port_y_offset - var/width = loading_from?.width - var/height = loading_from?.height - if(!loading_from) - if(!length(shuttle_areas)) - CRASH("Attempted to calculate a docking port's information without a template before it was assigned any areas!") - // no template given, use shuttle_areas to calculate width and height - var/min_x = -1 - var/min_y = -1 - var/max_x = WORLDMAXX_CUTOFF - var/max_y = WORLDMAXY_CUTOFF - for(var/area/area as anything in shuttle_areas) - for(var/turf/turf in area) - min_x = max(turf.x, min_x) - max_x = min(turf.x, max_x) - min_y = max(turf.y, min_y) - max_y = min(turf.y, max_y) - CHECK_TICK - - if(min_x == -1 || max_x == WORLDMAXX_CUTOFF) - CRASH("Failed to locate shuttle boundaries when iterating through shuttle areas, somehow.") - if(min_y == -1 || max_y == WORLDMAXY_CUTOFF) - CRASH("Failed to locate shuttle boundaries when iterating through shuttle areas, somehow.") - - width = (max_x - min_x) + 1 - height = (max_y - min_y) + 1 - port_x_offset = min_x - x - port_y_offset = min_y - y - - if(dir in list(EAST, WEST)) - src.width = height - src.height = width - else - src.width = width - src.height = height - - switch(dir) - if(NORTH) - dwidth = port_x_offset - 1 - dheight = port_y_offset - 1 - if(EAST) - dwidth = height - port_y_offset - dheight = port_x_offset - 1 - if(SOUTH) - dwidth = width - port_x_offset - dheight = height - port_y_offset - if(WEST) - dwidth = port_y_offset - 1 - dheight = width - port_x_offset -#undef WORLDMAXX_CUTOFF -#undef WORLDMAXY_CUTOFF - -/obj/docking_port/mobile/register(replace = FALSE) - . = ..() +/obj/docking_port/mobile/proc/register() SSshuttle.mobile += src -/** - * Actions to be taken after shuttle is loaded and has been moved to its final location - * - * Arguments: - * * replace - TRUE if this shuttle is replacing an existing one. FALSE by default. - */ -/obj/docking_port/mobile/proc/postregister(replace = FALSE) - return - -/obj/docking_port/mobile/unregister() - . = ..() +/obj/docking_port/mobile/proc/unregister() SSshuttle.mobile -= src /obj/docking_port/mobile/Destroy(force) @@ -522,32 +414,32 @@ /obj/docking_port/mobile/proc/transit_failure() message_admins("Shuttle [src] repeatedly failed to create transit zone.") -//call the shuttle to destination destination_port -/obj/docking_port/mobile/proc/request(obj/docking_port/stationary/destination_port) - if(!check_dock(destination_port)) +//call the shuttle to destination S +/obj/docking_port/mobile/proc/request(obj/docking_port/stationary/S) + if(!check_dock(S)) testing("check_dock failed on request for [src]") return - if(mode == SHUTTLE_IGNITING && destination == destination_port) + if(mode == SHUTTLE_IGNITING && destination == S) return switch(mode) if(SHUTTLE_CALL) - if(destination_port == destination) + if(S == destination) if(timeLeft(1) < callTime * engine_coeff) setTimer(callTime * engine_coeff) else - destination = destination_port + destination = S setTimer(callTime * engine_coeff) if(SHUTTLE_RECALL) - if(destination_port == destination) + if(S == destination) setTimer(callTime * engine_coeff - timeLeft(1)) else - destination = destination_port + destination = S setTimer(callTime * engine_coeff) mode = SHUTTLE_CALL if(SHUTTLE_IDLE, SHUTTLE_IGNITING) - destination = destination_port + destination = S mode = SHUTTLE_IGNITING setTimer(ignitionTime) diff --git a/code/modules/spells/spell_types/conjure/_conjure.dm b/code/modules/spells/spell_types/conjure/_conjure.dm index 5f9a7ccdd7a7..f4b7b7d2c17f 100644 --- a/code/modules/spells/spell_types/conjure/_conjure.dm +++ b/code/modules/spells/spell_types/conjure/_conjure.dm @@ -37,7 +37,7 @@ if (spawn_place.overfloor_placed) spawn_place.ChangeTurf(summoned_object_type, flags = CHANGETURF_INHERIT_AIR) else - spawn_place.place_on_top(summoned_object_type, flags = CHANGETURF_INHERIT_AIR) + spawn_place.PlaceOnTop(summoned_object_type, flags = CHANGETURF_INHERIT_AIR) return else diff --git a/code/modules/unit_tests/baseturfs.dm b/code/modules/unit_tests/baseturfs.dm index e4a584bc4e84..918db53bb90d 100644 --- a/code/modules/unit_tests/baseturfs.dm +++ b/code/modules/unit_tests/baseturfs.dm @@ -34,7 +34,7 @@ // Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior RESET_TO_EXPECTED(run_loc_floor_bottom_left) - run_loc_floor_bottom_left.place_on_top(/turf/closed/wall/rock) + run_loc_floor_bottom_left.PlaceOnTop(/turf/closed/wall/rock) TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/closed/wall/rock, "Rock wall should've been placed on top") run_loc_floor_bottom_left.ScrapeAway() @@ -53,8 +53,8 @@ // Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior RESET_TO_EXPECTED(run_loc_floor_bottom_left) - run_loc_floor_bottom_left.place_on_bottom(/turf/closed/wall/rock) - TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "place_on_bottom shouldn't have changed turf") + run_loc_floor_bottom_left.PlaceOnBottom(/turf/closed/wall/rock) + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "PlaceOnBottom shouldn't have changed turf") run_loc_floor_bottom_left.ScrapeAway() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating, "Plasteel floors should scrape away to plating") diff --git a/yogstation.dme b/yogstation.dme index 4a08b4944ad6..97e2c52163ff 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -700,7 +700,6 @@ #include "code\datums\elements\frozen.dm" #include "code\datums\elements\life_drain.dm" #include "code\datums\elements\light_blocking.dm" -#include "code\datums\elements\mirage_border.dm" #include "code\datums\elements\movetype_handler.dm" #include "code\datums\elements\regenerator.dm" #include "code\datums\elements\rust.dm" @@ -1577,7 +1576,6 @@ #include "code\game\turfs\open\floor\plating\dirt.dm" #include "code\game\turfs\open\floor\plating\misc_plating.dm" #include "code\game\turfs\open\space\space.dm" -#include "code\game\turfs\open\space\space_EXPENSIVE.dm" #include "code\game\turfs\open\space\transit.dm" #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_investigate.dm" From a8ff8d63aa46e0ae6262df5208f3ad199218f5b3 Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Wed, 20 Dec 2023 21:05:53 -0800 Subject: [PATCH 151/281] Revert "Merge remote-tracking branch 'upstream/master' into icon_smoothing" This reverts commit 863e1b776dffca6cf28dccedd131cecc04ae19a5, reversing changes made to 884623e600d10b3f3e5700dc63ba59f9240b795d. --- .../StationRuins/BoxStation/chapel2.dmm | 99 +- .../BoxStation/engine_singulo_tesla.dmm | 12 +- _maps/gaxstation.json | 3 +- _maps/map_files/DonutStation/DonutStation.dmm | 683 ++--- _maps/map_files/GaxStation/GaxStation.dmm | 1082 ++++---- _maps/map_files/IceMeta/IceMeta.dmm | 2227 ++++++++--------- _maps/map_files/YogStation/YogStation.dmm | 1871 +++++++------- code/__HELPERS/roundend.dm | 2 + .../configuration/entries/game_options.dm | 2 - code/controllers/subsystem/economy.dm | 3 + code/controllers/subsystem/job.dm | 86 +- code/controllers/subsystem/mapping.dm | 28 - code/controllers/subsystem/vote.dm | 3 - code/datums/map_config.dm | 4 - code/game/machinery/cryopod.dm | 24 - code/game/mecha/equipment/weapons/weapons.dm | 2 +- code/game/objects/items/crayons.dm | 18 +- .../objects/structures/ghost_role_spawners.dm | 45 +- .../structures/lavaland/steam_fissure.dm | 48 - code/modules/admin/verbs/randomverbs.dm | 2 +- .../bloodsuckers/powers/targeted/tzimisce.dm | 4 +- code/modules/cargo/supplypod.dm | 2 +- code/modules/economy/account.dm | 8 +- code/modules/jobs/job_types/_job.dm | 2 +- code/modules/jobs/job_types/roboticist.dm | 2 +- .../mob/living/carbon/human/species.dm | 2 + .../living/carbon/human/species_types/IPC.dm | 1 + .../carbon/human/species_types/ethereal.dm | 1 + .../carbon/human/species_types/jellypeople.dm | 1 + .../human/species_types/lizardpeople.dm | 1 + .../carbon/human/species_types/mothmen.dm | 1 + .../carbon/human/species_types/plasmamen.dm | 1 + .../carbon/human/species_types/polysmorphs.dm | 1 + .../mob/living/simple_animal/constructs.dm | 2 +- .../simple_animal/hostile/gorilla/gorilla.dm | 2 +- code/modules/power/turbine.dm | 22 - code/modules/ruins/lavaland_ruin_code.dm | 17 +- config/game_options.txt | 3 - html/changelog.html | 98 - html/changelogs/.all_changelog.yml | 63 - html/changelogs/AutoChangelog-pr-20971.yml | 4 + html/changelogs/AutoChangelog-pr-21007.yml | 4 + html/changelogs/AutoChangelog-pr-21032.yml | 4 + html/changelogs/AutoChangelog-pr-21066.yml | 4 + html/changelogs/AutoChangelog-pr-21072.yml | 4 + html/changelogs/AutoChangelog-pr-21078.yml | 4 + html/changelogs/AutoChangelog-pr-21082.yml | 4 + html/changelogs/AutoChangelog-pr-21089.yml | 8 + html/changelogs/AutoChangelog-pr-21095.yml | 6 + html/changelogs/AutoChangelog-pr-21098.yml | 4 + html/changelogs/AutoChangelog-pr-21104.yml | 4 + html/changelogs/AutoChangelog-pr-21113.yml | 4 - yogstation.dme | 1 - .../subsystem/processing/quirks.dm | 2 +- .../mob/living/carbon/human/human_defines.dm | 2 +- .../carbon/human/species_types/plantpeople.dm | 1 + .../species_types/preternis/preternis.dm | 1 + yogstation/icons/mob/clothing/suit/suit.dmi | Bin 109447 -> 111180 bytes yogstation/icons/obj/clothing/suits.dmi | Bin 36167 -> 35956 bytes 59 files changed, 3014 insertions(+), 3525 deletions(-) delete mode 100644 code/game/objects/structures/lavaland/steam_fissure.dm create mode 100644 html/changelogs/AutoChangelog-pr-20971.yml create mode 100644 html/changelogs/AutoChangelog-pr-21007.yml create mode 100644 html/changelogs/AutoChangelog-pr-21032.yml create mode 100644 html/changelogs/AutoChangelog-pr-21066.yml create mode 100644 html/changelogs/AutoChangelog-pr-21072.yml create mode 100644 html/changelogs/AutoChangelog-pr-21078.yml create mode 100644 html/changelogs/AutoChangelog-pr-21082.yml create mode 100644 html/changelogs/AutoChangelog-pr-21089.yml create mode 100644 html/changelogs/AutoChangelog-pr-21095.yml create mode 100644 html/changelogs/AutoChangelog-pr-21098.yml create mode 100644 html/changelogs/AutoChangelog-pr-21104.yml delete mode 100644 html/changelogs/AutoChangelog-pr-21113.yml diff --git a/_maps/RandomRuins/StationRuins/BoxStation/chapel2.dmm b/_maps/RandomRuins/StationRuins/BoxStation/chapel2.dmm index 566736a4d096..4b7ac1a5176e 100644 --- a/_maps/RandomRuins/StationRuins/BoxStation/chapel2.dmm +++ b/_maps/RandomRuins/StationRuins/BoxStation/chapel2.dmm @@ -68,14 +68,6 @@ }, /turf/open/floor/carpet/red, /area/chapel/office) -"cH" = ( -/obj/effect/turf_decal/ramp_middle, -/obj/machinery/camera{ - c_tag = "Chapel South"; - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/main) "dd" = ( /obj/machinery/door/airlock/public/glass{ name = "Chapel" @@ -255,6 +247,14 @@ /obj/item/reagent_containers/food/snacks/grown/poppy, /turf/open/floor/plating, /area/chapel/office) +"kU" = ( +/obj/effect/turf_decal/ramp_middle, +/obj/machinery/camera{ + c_tag = "Atmospherics East"; + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main) "ln" = ( /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -284,13 +284,6 @@ /obj/structure/chair/wood/normal, /turf/open/floor/carpet/red, /area/chapel/main) -"nm" = ( -/obj/structure/table/wood/fancy/black, -/obj/machinery/camera{ - c_tag = "Chapel Central" - }, -/turf/open/floor/carpet/black, -/area/chapel/main) "oG" = ( /obj/structure/table/wood/fancy, /obj/structure/railing{ @@ -346,6 +339,14 @@ dir = 8 }, /area/chapel/main) +"rx" = ( +/obj/structure/table/wood/fancy/black, +/obj/machinery/camera{ + c_tag = "Testing Lab East"; + network = list("ss13","rd") + }, +/turf/open/floor/carpet/black, +/area/chapel/main) "rG" = ( /obj/effect/turf_decal/ramp_middle{ dir = 8 @@ -375,24 +376,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/plasteel/dark, /area/chapel/main) -"uR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - areastring = "/area/chapel/office"; - name = "Chapel Office APC"; - pixel_y = -23 - }, -/obj/machinery/camera{ - c_tag = "Chapel Crematorium"; - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) "vK" = ( /obj/structure/table/wood/fancy, /obj/structure/railing{ @@ -490,17 +473,6 @@ dir = 1 }, /area/chapel/main) -"BR" = ( -/obj/effect/turf_decal/ramp_middle{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Chapel North" - }, -/turf/open/floor/plasteel/stairs/goon/dark_stairs_wide{ - dir = 4 - }, -/area/chapel/main) "Cq" = ( /obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, @@ -695,9 +667,40 @@ }, /turf/open/floor/carpet/black, /area/chapel/main) +"Im" = ( +/obj/effect/turf_decal/ramp_middle{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Testing Lab East"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/stairs/goon/dark_stairs_wide{ + dir = 4 + }, +/area/chapel/main) "IL" = ( /turf/open/floor/carpet/red, /area/chapel/main) +"IS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/chapel/office"; + name = "Chapel Office APC"; + pixel_y = -23 + }, +/obj/machinery/camera{ + c_tag = "Prison Common Room South"; + dir = 1; + network = list("ss13","prison") + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "Jc" = ( /obj/structure/closet/crate/coffin, /obj/structure/window/reinforced{ @@ -1229,7 +1232,7 @@ kI kI kI xL -BR +Im FB iO xL @@ -1343,7 +1346,7 @@ NN Kc VJ zg -nm +rx Pv FD Lo @@ -1381,7 +1384,7 @@ dR (13,1,1) = {" zg Nh -uR +IS zg Cv im @@ -1436,7 +1439,7 @@ EV qK EV Tc -cH +kU Df sy tP diff --git a/_maps/RandomRuins/StationRuins/BoxStation/engine_singulo_tesla.dmm b/_maps/RandomRuins/StationRuins/BoxStation/engine_singulo_tesla.dmm index 849894207bb9..3f7bf072f4da 100644 --- a/_maps/RandomRuins/StationRuins/BoxStation/engine_singulo_tesla.dmm +++ b/_maps/RandomRuins/StationRuins/BoxStation/engine_singulo_tesla.dmm @@ -957,6 +957,10 @@ /obj/item/wrench, /turf/open/space/basic, /area/engine/engineering) +"Rn" = ( +/obj/machinery/the_singularitygen, +/turf/open/floor/plating/airless, +/area/engine/engineering) "Rw" = ( /obj/machinery/power/rad_collector, /obj/structure/cable/orange{ @@ -1033,6 +1037,10 @@ /obj/structure/sign/warning/securearea, /turf/closed/wall/r_wall, /area/engine/engineering) +"XG" = ( +/obj/machinery/the_singularitygen/tesla, +/turf/open/floor/plating/airless, +/area/engine/engineering) "Zr" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -1505,7 +1513,7 @@ gm gm gm yi -yi +XG yi kU kU @@ -1561,7 +1569,7 @@ sd kU kU yi -yi +Rn yi gm gm diff --git a/_maps/gaxstation.json b/_maps/gaxstation.json index 8fb2aeebce07..4eb557731c31 100644 --- a/_maps/gaxstation.json +++ b/_maps/gaxstation.json @@ -7,6 +7,5 @@ "cargo": "cargo_gax", "ferry": "ferry_fancy", "emergency": "emergency_box" - }, - "cryo_spawn": true + } } diff --git a/_maps/map_files/DonutStation/DonutStation.dmm b/_maps/map_files/DonutStation/DonutStation.dmm index 4da2a7598a31..2895b1bb47eb 100644 --- a/_maps/map_files/DonutStation/DonutStation.dmm +++ b/_maps/map_files/DonutStation/DonutStation.dmm @@ -58,6 +58,12 @@ /obj/machinery/telecomms/bus/preset_four, /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) +"abo" = ( +/obj/effect/turf_decal/trimline/chemorange/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "abp" = ( /obj/structure/girder, /turf/open/floor/plating, @@ -3115,19 +3121,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"bpq" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ - dir = 1 - }, -/obj/effect/landmark/start/chemist, -/obj/structure/chair/office/light{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "bpr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -5948,16 +5941,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/genetics) -"cuz" = ( -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/obj/effect/turf_decal/trimline/brown/filled/line/lower{ - dir = 1 - }, -/obj/effect/landmark/start/yogs/mining_medic, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) "cuO" = ( /obj/machinery/light, /obj/effect/turf_decal/stripes/corner, @@ -6971,18 +6954,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) -"cOr" = ( -/obj/machinery/requests_console{ - department = "Chemistry"; - departmentType = 2; - name = "Chemistry Request Console"; - pixel_y = -28 - }, -/obj/effect/turf_decal/trimline/chemorange/filled/line/lower, -/obj/machinery/reagentgrinder, -/obj/structure/table/glass, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "cOs" = ( /obj/machinery/door/airlock{ name = "Bar Storage"; @@ -8948,12 +8919,6 @@ "dHD" = ( /turf/open/floor/plating/rust, /area/maintenance/starboard) -"dHY" = ( -/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) "dIi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -11449,6 +11414,25 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"eLB" = ( +/obj/machinery/camera{ + c_tag = "Medical - Chemistry"; + dir = 1; + network = list("ss13","Medical") + }, +/obj/structure/table/glass, +/obj/item/book/manual/wiki/chemistry{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/grenades, +/obj/item/stack/sheet/mineral/plasma, +/obj/structure/extinguisher_cabinet{ + pixel_y = -28 + }, +/obj/effect/turf_decal/trimline/chemorange/filled/line/lower, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "eLD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 5 @@ -15400,6 +15384,15 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/space/nearstation) +"gvp" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) "gvx" = ( /obj/machinery/light{ dir = 1 @@ -15521,6 +15514,10 @@ /obj/item/pool/rubber_ring, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"gxP" = ( +/obj/machinery/chem_heater, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "gxT" = ( /obj/machinery/telecomms/processor/preset_two, /turf/open/floor/circuit/telecomms/mainframe, @@ -15962,6 +15959,17 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint) +"gKV" = ( +/obj/structure/sign/poster/official/safety_eye_protection{ + pixel_y = -32 + }, +/obj/structure/table/glass, +/obj/machinery/reagentgrinder, +/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "gLB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 4 @@ -16892,13 +16900,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"hkp" = ( -/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "hkC" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -18166,6 +18167,22 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"hKN" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/southright{ + name = "Chemistry Desk"; + req_access_txt = "33" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chemistryshutter"; + name = "Chemistry Privacy Shutters" + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "hLr" = ( /obj/structure/table/wood, /obj/effect/landmark/event_spawn, @@ -19031,15 +19048,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"iiY" = ( -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "ijk" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -19078,13 +19086,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) -"ijK" = ( -/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "ijQ" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 27 @@ -19372,16 +19373,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"iqg" = ( -/obj/effect/turf_decal/trimline/chemorange/filled/corner/lower{ - dir = 4 - }, -/obj/effect/landmark/start/chemist, -/obj/structure/chair/office/light{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "iqk" = ( /turf/template_noop, /area/maintenance/starboard) @@ -21723,6 +21714,21 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) +"jtX" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/button/door{ + id = "chemistryshutter"; + name = "Chemistry Privacy Toggle"; + pixel_x = 8; + pixel_y = 28 + }, +/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "jtZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8 @@ -22514,6 +22520,67 @@ }, /turf/open/floor/carpet, /area/library) +"jKC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/structure/table/glass, +/obj/item/assembly/timer{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/assembly/timer{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/assembly/timer{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/assembly/timer{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/assembly/igniter{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/assembly/igniter{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/assembly/igniter{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/assembly/igniter{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/screwdriver{ + pixel_x = 2; + pixel_y = 18 + }, +/obj/item/stack/cable_coil/random{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/cable_coil/random, +/obj/item/grenade/chem_grenade{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/grenade/chem_grenade, +/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ + dir = 8 + }, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "jKL" = ( /obj/structure/window/reinforced{ dir = 8 @@ -24091,6 +24158,17 @@ /obj/machinery/atmospherics/pipe/simple/general/visible, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"krW" = ( +/obj/machinery/requests_console{ + department = "Chemistry"; + departmentType = 2; + name = "Chemistry Request Console"; + pixel_y = -28 + }, +/obj/machinery/vending/wardrobe/chem_wardrobe, +/obj/effect/turf_decal/trimline/chemorange/filled/line/lower, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "krY" = ( /obj/machinery/seed_extractor, /turf/open/floor/plasteel, @@ -27228,26 +27306,6 @@ "lOT" = ( /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai) -"lOU" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/window/southright{ - name = "Chemistry Desk"; - req_access_txt = "33" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemistryshutter"; - name = "Chemistry Privacy Shutters" - }, -/obj/item/deskbell/preset/chemistry{ - pixel_x = 8; - pixel_y = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "lPi" = ( /obj/machinery/airalarm{ dir = 4; @@ -28092,14 +28150,6 @@ /obj/machinery/holopad, /turf/open/floor/plasteel, /area/engine/atmos) -"miu" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/chemorange/filled/line/lower, -/obj/machinery/light, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) "miv" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -28392,6 +28442,18 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"moB" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "moH" = ( /obj/structure/sign/poster/contraband/random{ pixel_x = -32 @@ -28445,6 +28507,19 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) +"mqd" = ( +/obj/machinery/button/door{ + id = "chemistryshutter"; + name = "Chemistry Privacy Toggle"; + pixel_x = -8; + pixel_y = 28 + }, +/obj/machinery/chem_master, +/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "mqj" = ( /obj/structure/window/reinforced{ dir = 4 @@ -31553,13 +31628,6 @@ /obj/effect/turf_decal/trimline/secred/filled/corner/lower, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"nGa" = ( -/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ - dir = 1 - }, -/obj/machinery/chem_master, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "nGg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 10 @@ -32710,6 +32778,16 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"obM" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/chemist, +/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "obZ" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ dir = 8 @@ -33618,18 +33696,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) -"ovx" = ( -/obj/structure/closet/secure_closet/chemical, -/obj/item/toy/figure/chemist, -/obj/effect/turf_decal/trimline/chemorange/filled/line/lower, -/obj/item/book/manual/wiki/chemistry{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/book/manual/wiki/grenades, -/obj/item/stack/sheet/mineral/plasma, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "ovy" = ( /obj/structure/cable{ icon_state = "1-2" @@ -36939,6 +37005,21 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/quartermaster/storage) +"pTs" = ( +/obj/structure/table/glass, +/obj/item/storage/box/syringes, +/obj/item/storage/box/beakers, +/obj/item/clothing/glasses/science{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/glasses/science, +/obj/item/hand_labeler, +/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "pTD" = ( /obj/machinery/modular_computer/console/preset/curator{ dir = 1 @@ -37787,16 +37868,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/maintenance/starboard) -"qkY" = ( -/obj/structure/sign/poster/official/safety_eye_protection{ - pixel_y = -32 - }, -/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ - dir = 10 - }, -/obj/machinery/vending/wardrobe/chem_wardrobe, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "qla" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 @@ -39802,6 +39873,13 @@ }, /turf/open/floor/plating, /area/tcommsat/computer) +"rhB" = ( +/obj/machinery/light, +/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) "rhV" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/stripes/line{ @@ -40792,6 +40870,12 @@ }, /turf/open/floor/plasteel, /area/medical/storage) +"rFw" = ( +/obj/structure/closet/secure_closet/chemical, +/obj/item/toy/figure/chemist, +/obj/effect/turf_decal/trimline/chemorange/filled/line/lower, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "rFB" = ( /obj/machinery/door/airlock/command/glass{ name = "Bridge"; @@ -45662,18 +45746,6 @@ /obj/item/phone/banana, /turf/open/floor/wood, /area/crew_quarters/theatre) -"tIe" = ( -/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ - dir = 1 - }, -/obj/machinery/button/door{ - id = "chemistryshutter"; - name = "Chemistry Privacy Toggle"; - pixel_x = -26; - pixel_y = 31 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "tIo" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -50113,15 +50185,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"vGf" = ( -/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ - dir = 5 - }, -/obj/structure/table/glass, -/obj/item/storage/box/beakers, -/obj/item/storage/box/syringes, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "vGG" = ( /obj/machinery/rnd/production/techfab/department/cargo, /obj/effect/turf_decal/trimline/brown/filled/line/lower{ @@ -50921,6 +50984,13 @@ /obj/machinery/shieldwallgen/xenobiologyaccess, /turf/open/floor/plating, /area/science/xenobiology) +"vYu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/chemorange/filled/line/lower, +/turf/open/floor/plasteel/white, +/area/medical/medbay/lobby) "vYJ" = ( /obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 4 @@ -51274,43 +51344,6 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) -"wfE" = ( -/obj/machinery/camera{ - c_tag = "Medical - Chemistry"; - dir = 1; - network = list("ss13","Medical") - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/obj/effect/turf_decal/trimline/chemorange/filled/line/lower, -/obj/structure/table/glass, -/obj/item/hand_labeler, -/obj/item/clothing/glasses/science{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/clothing/glasses/science, -/obj/item/screwdriver{ - pixel_x = -1; - pixel_y = -5 - }, -/obj/item/grenade/chem_grenade, -/obj/item/grenade/chem_grenade{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/stack/cable_coil/random{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stack/cable_coil/random, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "wgg" = ( /obj/structure/transit_tube/curved/flipped{ dir = 8 @@ -51681,6 +51714,16 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plating, /area/maintenance/port/fore) +"wpC" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/chemist, +/obj/effect/turf_decal/trimline/chemorange/filled/line/lower{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "wpE" = ( /obj/machinery/advanced_airlock_controller{ dir = 8; @@ -52416,6 +52459,26 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"wDW" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/southleft{ + name = "Chemistry Desk"; + req_access_txt = "33" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chemistryshutter"; + name = "Chemistry Privacy Shutters" + }, +/obj/item/deskbell/preset/chemistry{ + pixel_x = 8; + pixel_y = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "wEp" = ( /obj/machinery/suit_storage_unit/ce, /turf/open/floor/plasteel/dark, @@ -85528,11 +85591,11 @@ swz ooJ vNj icl -iiY -hkp -ijK +moB +pTs +jKC fLk -qkY +gKV icl kbP arA @@ -85783,13 +85846,13 @@ rFP bqU jYh fKE -miu +vYu icl -bpq +jtX vpk vpk tfC -wfE +eLB icl nXP gIJ @@ -86041,12 +86104,12 @@ swH pvV dGO vNj -icl -nGa -vXK +wDW +obM +vpk xoU tOj -cOr +krW icl nXP gIJ @@ -86298,12 +86361,12 @@ rMl etj vWB jtg -lOU -tIe -vpk -vpk +niP +mqd +vXK +gxP lIE -ovx +rFw icl nXP gIJ @@ -86554,10 +86617,10 @@ jMi nMn jZe hhG -dHY -niP -vGf -iqg +rhB +hKN +wpC +abo vpk otb ycU @@ -94603,8 +94666,8 @@ ylr ylr ylr ylr -ylr -ylr +dJY +dJY ylr ylr ylr @@ -94858,10 +94921,10 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr +dJY +dJY +dJY +dJY ylr ylr ylr @@ -95113,14 +95176,14 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr -ylr -ylr dJY dJY +dJY +dJY +dJY +dJY +ylr +ylr ylr ylr ylr @@ -95369,15 +95432,15 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr -ylr dJY dJY dJY dJY +dJY +dJY +dJY +dJY +ylr ylr ylr ylr @@ -95626,13 +95689,12 @@ ylr ylr ylr ylr -ylr -ylr -ylr dJY dJY dJY dJY +aCv +dJY dJY dJY ylr @@ -95673,6 +95735,7 @@ ylr ylr ylr ylr +ylr "} (153,1,1) = {" ylr @@ -95883,11 +95946,8 @@ ylr ylr ylr ylr -ylr -ylr -dJY -dJY dJY +aCv dJY dJY dJY @@ -95930,6 +95990,9 @@ ylr ylr ylr ylr +ylr +ylr +ylr "} (154,1,1) = {" ylr @@ -96140,13 +96203,10 @@ ylr ylr ylr ylr -ylr -ylr dJY dJY dJY dJY -aCv dJY dJY dJY @@ -96187,6 +96247,9 @@ ylr ylr ylr ylr +ylr +ylr +ylr "} (155,1,1) = {" ylr @@ -96396,13 +96459,11 @@ ylr ylr ylr ylr -ylr -ylr -ylr dJY -aCv dJY dJY +aCv +dJY dJY dJY dJY @@ -96423,6 +96484,8 @@ ylr ylr ylr ylr +ylr +ylr dJY dJY dJY @@ -96653,9 +96716,6 @@ ylr ylr ylr ylr -ylr -ylr -ylr dJY dJY dJY @@ -96678,6 +96738,9 @@ ylr ylr ylr ylr +ylr +ylr +ylr dJY dJY dJY @@ -96910,12 +96973,9 @@ ylr ylr ylr ylr -ylr -ylr dJY dJY dJY -aCv dJY dJY dJY @@ -96924,6 +96984,9 @@ ylr ylr ylr ylr +ylr +ylr +ylr bIB ylr ylr @@ -97168,9 +97231,6 @@ ylr ylr ylr ylr -ylr -dJY -dJY dJY dJY dJY @@ -97183,6 +97243,9 @@ ylr ylr ylr ylr +ylr +ylr +ylr dJY dJY dJY @@ -97425,10 +97488,6 @@ ylr ylr ylr ylr -ylr -dJY -dJY -dJY dJY dJY dJY @@ -97440,6 +97499,10 @@ ylr ylr ylr ylr +ylr +ylr +ylr +ylr dJY dJY dJY @@ -97682,9 +97745,6 @@ ylr ylr ylr ylr -ylr -ylr -dJY dJY dJY dJY @@ -97704,6 +97764,9 @@ ylr ylr ylr ylr +ylr +ylr +ylr dJY dJY dJY @@ -97940,9 +98003,6 @@ ylr ylr ylr ylr -ylr -dJY -dJY dJY dJY ylr @@ -97961,6 +98021,9 @@ ylr ylr ylr ylr +ylr +ylr +ylr dJY dJY dJY @@ -98055,7 +98118,7 @@ jAo jAo jAo uhM -cuz +gvp oly sfX pDR @@ -98198,10 +98261,10 @@ ylr ylr ylr ylr -dJY -dJY -dJY -dJY +ylr +ylr +ylr +ylr ylr ylr ylr @@ -98456,8 +98519,8 @@ ylr ylr ylr ylr -dJY -dJY +ylr +ylr ylr ylr ylr @@ -98704,7 +98767,7 @@ ylr ylr ylr ylr -ylr +dJY ylr ylr ylr @@ -98960,9 +99023,9 @@ ylr ylr ylr ylr -ylr -ylr -ylr +dJY +dJY +dJY ylr ylr ylr @@ -99217,9 +99280,9 @@ ylr ylr ylr ylr -ylr -ylr -ylr +dJY +dJY +dJY ylr ylr ylr @@ -99473,10 +99536,10 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr +dJY +aCv +dJY +dJY ylr ylr ylr @@ -99730,10 +99793,10 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr +dJY +dJY +dJY +dJY ylr ylr ylr @@ -99987,10 +100050,10 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr +dJY +dJY +dJY +dJY ylr ylr ylr @@ -100244,10 +100307,10 @@ ylr ylr ylr ylr -ylr dJY -ylr -ylr +dJY +dJY +dJY ylr ylr ylr @@ -100501,7 +100564,7 @@ ylr ylr ylr ylr -dJY +ylr dJY dJY ylr @@ -100758,9 +100821,9 @@ ylr ylr ylr ylr -dJY -dJY -dJY +ylr +ylr +ylr ylr ylr ylr @@ -101014,10 +101077,10 @@ ylr ylr ylr ylr -dJY -aCv -dJY -dJY +ylr +ylr +ylr +ylr ylr ylr ylr @@ -101271,10 +101334,10 @@ ylr ylr ylr ylr -dJY -dJY -dJY -dJY +ylr +ylr +ylr +ylr ylr ylr ylr @@ -101528,10 +101591,10 @@ ylr ylr ylr ylr -dJY -dJY -dJY -dJY +ylr +ylr +ylr +ylr ylr ylr ylr @@ -101785,10 +101848,10 @@ ylr ylr ylr ylr -dJY -dJY -dJY -dJY +ylr +ylr +ylr +ylr ylr ylr ylr @@ -102043,8 +102106,8 @@ ylr ylr ylr ylr -dJY -dJY +ylr +ylr ylr ylr ylr diff --git a/_maps/map_files/GaxStation/GaxStation.dmm b/_maps/map_files/GaxStation/GaxStation.dmm index 0a12bfe13066..e8fb5477ff3a 100644 --- a/_maps/map_files/GaxStation/GaxStation.dmm +++ b/_maps/map_files/GaxStation/GaxStation.dmm @@ -396,17 +396,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aiz" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -28 - }, -/obj/machinery/light, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "aiE" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /obj/effect/turf_decal/stripes/line{ @@ -815,6 +804,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"atJ" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopods) "atQ" = ( /obj/effect/turf_decal/trimline/white/filled/corner/lower{ dir = 1 @@ -845,16 +841,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) -"auN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "avc" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/abandoned, @@ -1134,12 +1120,6 @@ /obj/structure/bed/roller, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"aCP" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "aCU" = ( /obj/structure/chair{ dir = 4 @@ -1997,12 +1977,6 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) -"aXC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "aXP" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 4 @@ -2843,14 +2817,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"bvc" = ( -/obj/structure/rack, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/aft) "bvi" = ( /obj/structure/cable{ icon_state = "4-8" @@ -6426,6 +6392,15 @@ }, /turf/open/space/basic, /area/solar/starboard/fore) +"deA" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "deH" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, @@ -6794,13 +6769,6 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) -"dkM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/hallway/secondary/entry) "dkN" = ( /obj/effect/spawner/structure/window/reinforced/shutter, /obj/structure/cable{ @@ -8605,13 +8573,6 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet) -"ejV" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "ejY" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/visible, /turf/open/floor/plasteel, @@ -9481,6 +9442,21 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload_foyer) +"eBm" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "eBt" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 8 @@ -9728,13 +9704,6 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/heads/captain) -"eGD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/vending/cola/random, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "eHi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -9881,16 +9850,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"eKc" = ( -/obj/machinery/computer/cryopod{ - dir = 8; - pixel_x = 26 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "eKg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -9958,9 +9917,6 @@ /obj/item/storage/pencil_holder/crew, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"eLr" = ( -/turf/closed/wall/r_wall, -/area/crew_quarters/cryopods) "eLA" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -10705,19 +10661,6 @@ }, /turf/open/floor/grass, /area/hydroponics/garden) -"feh" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 - }, -/obj/structure/closet/emcloset, -/obj/machinery/atmospherics/components/unary/tank/air{ - piping_layer = 2 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "few" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 4 @@ -10786,10 +10729,6 @@ }, /turf/open/floor/plasteel/airless/solarpanel, /area/solar/port/aft) -"fgy" = ( -/obj/item/stock_parts/micro_laser, -/turf/open/floor/plating, -/area/maintenance/aft) "fgB" = ( /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) @@ -11029,6 +10968,18 @@ }, /turf/open/floor/plasteel, /area/hydroponics) +"fme" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "fmk" = ( /obj/effect/turf_decal/trimline/green/filled/line/lower{ dir = 1 @@ -11125,14 +11076,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/science/mixing) -"foH" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "foW" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance, @@ -12576,6 +12519,18 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) +"fWw" = ( +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/cryopods"; + dir = 8; + name = "Cryogenic Crew Storage APC"; + pixel_x = -25 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopods) "fWC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 9 @@ -13083,6 +13038,11 @@ dir = 5 }, /area/crew_quarters/kitchen) +"giq" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "giB" = ( /obj/machinery/power/smes, /obj/structure/cable{ @@ -13343,6 +13303,16 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"gql" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "gqK" = ( /obj/structure/displaycase/labcage, /obj/structure/cable{ @@ -14045,6 +14015,18 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"gIn" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 3; + height = 15; + id = "arrivals_stationary"; + name = "arrivals"; + roundstart_template = /datum/map_template/shuttle/arrival/gax; + width = 7 + }, +/turf/open/space/basic, +/area/space) "gIp" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 5 @@ -14125,21 +14107,6 @@ "gJV" = ( /turf/closed/wall/r_wall, /area/security/processing) -"gJW" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "gKH" = ( /obj/structure/cable{ icon_state = "1-2" @@ -14326,13 +14293,6 @@ /obj/item/storage/toolbox/emergency, /turf/open/floor/plasteel/dark, /area/bridge) -"gQo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "gRH" = ( /obj/machinery/light{ dir = 4 @@ -15456,13 +15416,6 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) -"hth" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "htr" = ( /obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 9 @@ -16099,10 +16052,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) -"hHC" = ( -/obj/effect/spawner/structure/window/reinforced/shutter, -/turf/open/floor/plating, -/area/crew_quarters/cryopods) "hHG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 9 @@ -16158,9 +16107,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/distro) -"hJl" = ( -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "hJp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/door/firedoor/border_only, @@ -16322,6 +16268,21 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/security/main) +"hOw" = ( +/obj/machinery/door/airlock/external{ + name = "Port Docking Bay 1" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) "hOz" = ( /obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ dir = 4 @@ -16529,12 +16490,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) -"hTx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "hTG" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -17742,9 +17697,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"ixL" = ( -/turf/open/floor/plasteel/dark, -/area/crew_quarters/cryopods) "iyb" = ( /obj/structure/sink/kitchen{ desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; @@ -18760,6 +18712,19 @@ }, /turf/open/floor/plating, /area/engine/engineering) +"jam" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/advanced_airlock_controller{ + dir = 1; + pixel_y = -24 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) "jaK" = ( /obj/effect/turf_decal/trimline/green/filled/line/lower{ dir = 4 @@ -21392,25 +21357,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"kvA" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Cryogenics" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "kvW" = ( /obj/structure/cable{ icon_state = "4-8" @@ -21578,13 +21524,6 @@ icon_state = "platingdmg1" }, /area/maintenance/department/medical/central) -"kzh" = ( -/obj/structure/chair, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "kzS" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -21679,18 +21618,6 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/wood, /area/hallway/primary/central) -"kCg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "kCl" = ( /obj/effect/turf_decal/trimline/green/filled/line/lower{ dir = 1 @@ -21812,6 +21739,17 @@ }, /turf/open/floor/plasteel, /area/quartermaster/office) +"kGF" = ( +/obj/machinery/computer/cryopod{ + pixel_y = 26 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/turf/open/floor/carpet, +/area/crew_quarters/cryopods) "kGI" = ( /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -23651,13 +23589,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) -"lzs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "lzE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -25933,6 +25864,24 @@ /obj/machinery/vending/boozeomat, /turf/closed/wall, /area/crew_quarters/bar) +"mDz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "mFc" = ( /obj/machinery/door/airlock/engineering{ name = "Tech Storage"; @@ -26699,18 +26648,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) -"nbF" = ( -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 1 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "nbL" = ( /obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 4 @@ -26859,21 +26796,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/secondarydatacore) -"nfE" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "nfG" = ( /obj/structure/chair, /obj/effect/turf_decal/trimline/white/filled/line/lower{ @@ -27060,11 +26982,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"nkl" = ( -/obj/effect/spawner/lootdrop/maintenance/four, -/obj/structure/table, -/turf/open/floor/plating, -/area/maintenance/aft) "nky" = ( /obj/structure/cable{ icon_state = "1-4" @@ -27082,6 +26999,18 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/ai_monitored/storage/eva) +"nkM" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "nkP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 6 @@ -27469,10 +27398,6 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) -"nuD" = ( -/obj/item/circuitboard/machine/experimentor, -/turf/open/floor/plating, -/area/maintenance/aft) "nuI" = ( /obj/effect/turf_decal/trimline/blue/filled/line/lower, /obj/machinery/power/apc{ @@ -27870,10 +27795,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/eva) -"nDd" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/crew_quarters/cryopods) "nDx" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 1 @@ -27889,12 +27810,6 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/supply) -"nDE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "nDJ" = ( /turf/closed/wall/r_wall, /area/security/checkpoint/engineering) @@ -27927,27 +27842,6 @@ }, /turf/open/floor/plasteel, /area/engine/foyer) -"nEA" = ( -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 4 - }, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/cryopods"; - dir = 8; - name = "Cryogenic Crew Storage APC"; - pixel_x = -25 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "nEQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -28524,6 +28418,13 @@ }, /turf/open/floor/plasteel, /area/quartermaster/office) +"nTF" = ( +/obj/structure/rack, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft) "nTH" = ( /obj/structure/cable{ icon_state = "1-2" @@ -28783,6 +28684,27 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/central) +"obf" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Cryogenics" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopods) "obz" = ( /obj/machinery/light{ dir = 1 @@ -28906,6 +28828,18 @@ /obj/effect/turf_decal/trimline/secred/filled/line/lower, /turf/open/floor/plasteel, /area/security/main) +"oha" = ( +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Port Docking Bay 1" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) "ohg" = ( /obj/structure/cable{ icon_state = "1-8" @@ -29349,22 +29283,6 @@ }, /turf/open/floor/plasteel, /area/hydroponics/garden) -"otf" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner/lower, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "otk" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -29632,6 +29550,19 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"oAE" = ( +/obj/item/beacon, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "oAK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -29779,6 +29710,17 @@ /obj/structure/chair/stool, /turf/open/floor/plasteel, /area/hydroponics) +"oFK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/machinery/light, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopods) "oGc" = ( /obj/structure/cable{ icon_state = "1-2" @@ -30320,20 +30262,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"oXk" = ( -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Cryogenics" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/cryopods) "oXp" = ( /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, /obj/effect/turf_decal/stripes/corner{ @@ -32502,12 +32430,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/storage) -"pXl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "pXn" = ( /obj/machinery/light/small{ dir = 1 @@ -32973,6 +32895,12 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"qhp" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopods) "qhL" = ( /turf/open/floor/plasteel, /area/quartermaster/office) @@ -33426,13 +33354,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"qtO" = ( -/obj/machinery/cryopod{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "qub" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ @@ -33746,17 +33667,23 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"qEh" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/advanced_airlock_controller{ + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) "qEC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"qFp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) "qFF" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower, /obj/structure/sign/warning/pods{ @@ -34084,14 +34011,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel/stairs/goon/stairs_middle, /area/hydroponics/garden) -"qQe" = ( -/obj/structure/girder, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/aft) "qQC" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=CHW"; @@ -34420,15 +34339,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"qXH" = ( -/obj/structure/table, -/obj/item/storage/toolbox/emergency, -/obj/machinery/light, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "qXK" = ( /obj/effect/landmark/stationroom/maint/threexfive, /turf/template_noop, @@ -35034,13 +34944,6 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) -"rlo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/cryopods) "rlY" = ( /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/bot, @@ -35575,6 +35478,18 @@ }, /turf/open/space/basic, /area/solar/starboard/aft) +"rxz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopods) "rxG" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -35715,6 +35630,13 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) +"rAS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopods) "rBc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -36124,6 +36046,11 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"rKC" = ( +/obj/structure/sign/warning/vacuum/external, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/entry) "rKM" = ( /obj/structure/cable{ icon_state = "4-8" @@ -37849,15 +37776,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"sDZ" = ( -/obj/machinery/cryopod{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "sEp" = ( /obj/effect/turf_decal/trimline/brown/filled/line/lower, /obj/machinery/camera{ @@ -39021,12 +38939,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"tfe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "tfA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -39634,10 +39546,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"txz" = ( -/obj/item/stock_parts/manipulator, -/turf/open/floor/plating, -/area/maintenance/aft) "tyq" = ( /obj/structure/flora/ausbushes/brflowers, /obj/structure/flora/ausbushes/sparsegrass, @@ -39853,6 +39761,15 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) +"tDj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "tDw" = ( /obj/structure/sign/departments/minsky/medical/virology/virology2{ pixel_y = 32 @@ -39886,6 +39803,10 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) +"tEs" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/crew_quarters/cryopods) "tEt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel, @@ -39976,10 +39897,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/maintenance/solars/port/aft) -"tHq" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/maintenance/aft) "tHs" = ( /obj/machinery/power/apc{ areastring = "/area/maintenance/department/eva"; @@ -41663,15 +41580,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"uCH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "uCM" = ( /obj/machinery/door/airlock/research{ name = "Genetics Research Access"; @@ -41800,13 +41708,6 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/auxiliary) -"uEx" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "uEI" = ( /obj/machinery/shower{ pixel_y = 20 @@ -42195,6 +42096,25 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/crew_quarters/theatre) +"uNq" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner/lower, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "uNv" = ( /obj/effect/turf_decal/trimline/neutral/filled/line/lower{ dir = 8 @@ -44821,10 +44741,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"wck" = ( -/obj/item/stock_parts/scanning_module, -/turf/open/floor/plating, -/area/maintenance/aft) "wcp" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 8 @@ -46236,12 +46152,6 @@ }, /turf/open/space/basic, /area/solar/port/aft) -"wMH" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "wMY" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -46394,10 +46304,6 @@ /obj/effect/spawner/lootdrop/techstorage/security, /turf/open/floor/plasteel/white, /area/storage/tech) -"wQm" = ( -/obj/structure/frame/machine, -/turf/open/floor/plating, -/area/maintenance/aft) "wQn" = ( /obj/structure/disposalpipe/segment, /turf/template_noop, @@ -47333,16 +47239,21 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) -"xmg" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ +"xme" = ( +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/structure/closet/firecloset/full, -/obj/machinery/light{ +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, /turf/open/floor/plasteel, -/area/crew_quarters/cryopods) +/area/hallway/secondary/entry) "xmi" = ( /obj/effect/turf_decal/trimline/purple/filled/line/lower{ dir = 8 @@ -47684,22 +47595,6 @@ /obj/machinery/photocopier, /turf/open/floor/wood, /area/lawoffice) -"xww" = ( -/obj/item/beacon, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "xwU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -47922,13 +47817,6 @@ }, /turf/open/floor/plasteel, /area/hydroponics/garden) -"xBd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/chair, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "xBC" = ( /obj/effect/turf_decal/trimline/purple/filled/line/lower{ dir = 6 @@ -48567,6 +48455,10 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/auxiliary) +"xPX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/carpet, +/area/crew_quarters/cryopods) "xQb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -48791,12 +48683,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) -"xUY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopods) "xVi" = ( /obj/effect/spawner/structure/window/reinforced/shutter, /turf/open/floor/plating, @@ -79181,7 +79067,7 @@ fbN geS xNy kgb -bvc +nTF mQK mpT abO @@ -79697,13 +79583,13 @@ trH wTB wTB wTB -xNs -tHq -txz -nJe -xNs -xNs -xNs +fXQ +fXQ +fXQ +fXQ +fXQ +fXQ +fXQ hBZ nJe xNs @@ -79954,13 +79840,13 @@ fCm wTB bJd eRu -xNs -wck -lId -nuD -fgy -nkl -xNs +fXQ +atJ +fWw +qhp +qhp +qhp +fXQ hBZ xNs xNs @@ -80211,13 +80097,13 @@ wTB wTB jPa oyD -xNs -wQm -nYY -txz -nJe -fgy -qQe +fXQ +kGF +rAS +rxz +xPX +oFK +fXQ hBZ bnZ vNF @@ -80468,13 +80354,13 @@ vrF wTB oci opt -xNs -xNs -xNs -xNs -xNs -xNs -xNs +fXQ +fXQ +tEs +obf +tEs +fXQ +fXQ hBZ vIr hWB @@ -80728,7 +80614,7 @@ wTB wTB xGG vcc -lqe +mDz lqe xeO wTB @@ -80985,7 +80871,7 @@ lqe xxy rXO hHK -qFp +gql kqt eFs wTB @@ -81242,7 +81128,7 @@ kqt eDB kqt dtJ -pXl +fme vNq cKZ wTB @@ -81499,8 +81385,8 @@ mVE eNT xIE yiu -hth -otf +nkM +uNq wqv wTB hBZ @@ -89739,9 +89625,9 @@ vIw vIw vIw uzX -tkl -tkl -tkl +vRP +vRP +vRP tkl tkl tkl @@ -89997,8 +89883,8 @@ vIw vIw uzX tkl -aCD -aCD +tkl +tkl ubS ubS ubS @@ -90254,8 +90140,8 @@ uli vIw uzX tkl -vRP -vRP +aCD +aCD vRP aCD vRP @@ -90511,9 +90397,9 @@ uzX uzX uzX tkl +vRP aCD -aCD -aCD +vRP aCD vRP vRP @@ -90766,11 +90652,11 @@ xTV xTV xTV xTV -iwu -tkl -vRP -aCD -vRP +xTV +xTV +uqY +uqY +xNw ubS tTD tTD @@ -91013,21 +90899,21 @@ aCD vRP vRP vRP -aCD +tkl vRP -aCD vRP vRP -aCD vRP vRP -aCD -aCD -pCt -ubS -aCD -ubS +vRP +vRP +vRP +vRP +vRP +tkl +vRP ubS +pCt aCD vRP vRP @@ -91268,16 +91154,20 @@ tSW tSW tSW tSW -tSW -vRP -aCD -vRP -aCD -vRP -vRP -aCD -vRP -vRP +lMA +tkl +tkl +tkl +tkl +tkl +tkl +tkl +tkl +tkl +tkl +tkl +tkl +tkl tkl ubS jta @@ -91372,10 +91262,6 @@ vRP vRP vRP vRP -vRP -vRP -vRP -vRP "} (164,1,1) = {" vRP @@ -91525,18 +91411,10 @@ uxf gIq nXc neX -eLr -eLr -eLr -hHC -hHC -hHC -eLr -eLr +lMA +aCD vRP vRP -tkl -aCD vRP vRP vRP @@ -91544,6 +91422,14 @@ vRP vRP vRP vRP +aCD +aCD +aCD +tkl +aCD +aCD +aCD +aCD vRP vRP vRP @@ -91782,18 +91668,9 @@ kbG vvd atx oaC -nDd -feh -nEA -sDZ -sDZ -sDZ -aiz -eLr -eLr +sqz +vRP vRP -tkl -ubS vRP vRP vRP @@ -91805,6 +91682,15 @@ vRP vRP vRP vRP +tkl +ubS +aCD +vRP +vRP +vRP +vRP +vRP +vRP vRP vRP vRP @@ -92039,18 +91925,10 @@ nPi vvd atx pnP -nDd -ixL -nfE -hJl -hJl -xUY -hJl -qtO -hHC -aCD -tkl -aCD +sqz +vRP +vRP +vRP vRP vRP vRP @@ -92061,6 +91939,14 @@ vRP vRP vRP vRP +tkl +aCD +vRP +vRP +vRP +vRP +vRP +vRP vRP vRP vRP @@ -92293,21 +92179,15 @@ wcy lzE jWH lzE -xww -foH -dkM -oXk -rlo -gJW -gQo -lzs -nDE -hJl -qtO -hHC +oAE +atx +pnP +sqz +gIn +vRP +vRP +vRP vRP -tkl -ubS vRP vRP vRP @@ -92316,6 +92196,12 @@ vRP vRP vRP vRP +tkl +ubS +vRP +vRP +vRP +vRP vRP vRP vRP @@ -92553,18 +92439,13 @@ vvd rRY atx pnP -nDd -ixL -ejV -nDE -wMH -aCP -hJl -qtO -hHC -aCD -tkl -aCD +sqz +vRP +vRP +vRP +vRP +vRP +vRP vRP vRP vRP @@ -92572,6 +92453,11 @@ vRP vRP vRP vRP +tkl +aCD +vRP +vRP +vRP vRP vRP vRP @@ -92810,18 +92696,8 @@ oRf eXj kqi sod -nDd -xmg -nbF -eKc -auN -aXC -qXH -eLr -eLr +sqz vRP -tkl -aCD vRP vRP vRP @@ -92834,6 +92710,16 @@ vRP vRP vRP vRP +tkl +aCD +vRP +vRP +vRP +vRP +vRP +vRP +vRP +vRP vRP vRP vRP @@ -93067,23 +92953,23 @@ smm rRY atx xHB -fXQ -fXQ -fXQ -fXQ -kvA -nDd -eLr -eLr +lMA +aCD +vRP +vRP vRP vRP -tkl -ubS vRP vRP vRP vRP vRP +aCD +aCD +aCD +tkl +ubS +vRP vRP vRP vRP @@ -93323,17 +93209,21 @@ pKx lwC rWP nBO -tSW -tSW -vRP +lMA +lMA +tkl +tkl +tkl sqz -kzh -kCg -hTx +oha sqz -vRP -vRP -vRP +oha +sqz +tkl +tkl +tkl +tkl +tkl tkl ubS vRP @@ -93428,10 +93318,6 @@ vRP vRP vRP vRP -vRP -vRP -vRP -vRP "} (172,1,1) = {" vRP @@ -93580,13 +93466,15 @@ pKx cVQ hjp ryX -tSW +lMA +aCD aCD +vRP aCD sqz -xBd -tfe -vaq +jam +tSW +qEh sqz aCD aCD @@ -93594,8 +93482,6 @@ aCD tkl tkl tkl -tkl -tkl aCD flE aCD @@ -93837,16 +93723,16 @@ faQ wtt lVK gsE -tSW -tSW -sqz +lMA +lMA sqz -eGD -tfe -vaq sqz sqz sqz +hOw +rKC +hOw +rrx lMA lMA aCD @@ -94098,11 +93984,11 @@ xpQ mmo xpQ xpQ -uCH -tfe -unc +tDj xpQ +eBm xpQ +xme ktG eLA lMA @@ -94356,10 +94242,10 @@ blt aAR aAR ofj -uEx aAR +deA aAR -blt +giq nOX wUk vha diff --git a/_maps/map_files/IceMeta/IceMeta.dmm b/_maps/map_files/IceMeta/IceMeta.dmm index c5d6439540a2..f6ba8ff8b1a4 100644 --- a/_maps/map_files/IceMeta/IceMeta.dmm +++ b/_maps/map_files/IceMeta/IceMeta.dmm @@ -966,11 +966,10 @@ /area/maintenance/port/aft) "apF" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-4" }, -/obj/structure/lattice/catwalk, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/fore) +/area/icemoon/top_layer/outdoors) "apG" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -1655,7 +1654,8 @@ /turf/open/floor/plasteel/white, /area/medical/paramedic) "azV" = ( -/turf/closed/wall/r_wall, +/obj/structure/cable, +/turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/starboard/aft) "azX" = ( /obj/structure/cable/yellow{ @@ -3618,8 +3618,11 @@ /turf/open/floor/plasteel, /area/engine/engineering) "bdu" = ( -/turf/closed/wall/r_wall, -/area/icemoon/top_layer/outdoors) +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/solar/starboard/fore) "bdv" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -4143,7 +4146,6 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/structure/lattice/catwalk, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/port/fore) "bju" = ( @@ -4227,11 +4229,11 @@ /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, /area/engine/atmos/distro) "bkq" = ( -/obj/structure/lattice, -/obj/structure/lattice, -/obj/structure/grille, -/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, -/area/icemoon/top_layer/outdoors) +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/solar/starboard/fore) "bkx" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -4312,13 +4314,6 @@ /obj/effect/spawner/lootdrop/donkpockets, /turf/open/floor/plasteel, /area/mine/laborcamp) -"bmP" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/fore) "bnn" = ( /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/door/firedoor/border_only{ @@ -5028,12 +5023,14 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "bzh" = ( -/obj/machinery/door/poddoor{ - name = "turbine vent"; - id = "geo_turbine_ne" +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" }, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/top_layer/outdoors) +/area/solar/starboard/fore) "bzm" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 1 @@ -5247,9 +5244,11 @@ /turf/open/floor/plating, /area/crew_quarters/heads/hos) "bBY" = ( -/obj/effect/landmark/xeno_spawn, +/obj/structure/cable{ + icon_state = "0-4" + }, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/fore) +/area/solar/port/fore) "bCd" = ( /obj/structure/window/reinforced, /obj/machinery/door/firedoor/border_only{ @@ -6296,15 +6295,14 @@ }, /area/mine/eva) "bSD" = ( -/obj/machinery/power/compressor{ - comp_id = "geothermal_se"; - dir = 8; - luminosity = 2 - }, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "0-4" }, -/turf/open/floor/plating/snowed/smoothed/icemoon, +/obj/machinery/power/solar{ + id = "aftstarboard"; + name = "Aft-Starboard Solar Array" + }, +/turf/open/floor/plasteel/airless/solarpanel, /area/solar/starboard/aft) "bSY" = ( /obj/structure/disposalpipe/segment{ @@ -7619,11 +7617,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "cmC" = ( -/obj/machinery/door/poddoor{ - name = "pressure chamber vent"; - id = "geo_turbine_nw" +/obj/structure/cable, +/obj/machinery/power/solar{ + id = "foreport"; + name = "Fore-Port Solar Array" }, -/turf/open/floor/plating/snowed/smoothed/icemoon, +/turf/open/floor/plasteel/airless/solarpanel, /area/solar/port/fore) "cmH" = ( /obj/structure/disposalpipe/segment{ @@ -8930,13 +8929,6 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) -"cIz" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) "cIE" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/trimline/brown/filled/line/lower{ @@ -8944,10 +8936,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"cIF" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/fore) "cIN" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -9113,11 +9101,13 @@ /area/science/robotics/lab) "cKO" = ( /obj/structure/cable{ - icon_state = "2-8" + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/structure/lattice/catwalk, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/fore) +/area/solar/port/fore) "cKY" = ( /obj/machinery/airalarm{ dir = 1; @@ -9811,13 +9801,6 @@ /obj/effect/spawner/structure/window/reinforced/shutter, /turf/open/floor/plating, /area/hallway/primary/fore) -"cWl" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) "cWm" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/techstorage/RnD_secure, @@ -10638,14 +10621,15 @@ /turf/closed/wall/r_wall, /area/bridge) "dke" = ( +/obj/machinery/power/solar_control{ + dir = 1; + id = "aftport"; + name = "Port Quarter Solar Control" + }, /obj/structure/cable{ icon_state = "0-4" }, /obj/structure/cable, -/obj/machinery/computer/turbine_computer{ - dir = 1; - id = "geothermal_sw" - }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) "dkg" = ( @@ -10948,20 +10932,11 @@ /turf/open/floor/plating, /area/maintenance/starboard) "don" = ( -/obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/button/door{ - name = "pressure chamber vent"; - pixel_y = 28; - id = "geo_vent_nw" - }, -/obj/machinery/light{ - dir = 1 + icon_state = "1-2" }, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/fore) +/area/icemoon/top_layer/outdoors) "dor" = ( /obj/machinery/airalarm{ dir = 4; @@ -11004,10 +10979,6 @@ }, /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) -"dpo" = ( -/obj/structure/lattice, -/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, -/area/solar/port/aft) "dpv" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -12487,11 +12458,14 @@ /turf/closed/wall/r_wall, /area/engine/atmos/distro) "dKv" = ( -/obj/machinery/door/poddoor{ - name = "pressure chamber vent"; - id = "geo_vent_se" +/obj/structure/cable{ + icon_state = "0-8" }, -/turf/open/floor/plating/snowed/smoothed/icemoon, +/obj/machinery/power/solar{ + id = "aftstarboard"; + name = "Aft-Starboard Solar Array" + }, +/turf/open/floor/plasteel/airless/solarpanel, /area/solar/starboard/aft) "dKM" = ( /obj/machinery/requests_console{ @@ -13095,10 +13069,6 @@ }, /turf/open/floor/plasteel, /area/hydroponics/garden) -"dTV" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/fore) "dUc" = ( /obj/item/cigbutt, /obj/effect/landmark/blobstart, @@ -14088,6 +14058,11 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "eko" = ( +/obj/machinery/power/solar_control{ + dir = 8; + id = "aftstarboard"; + name = "Starboard Quarter Solar Control" + }, /obj/structure/cable, /obj/structure/cable{ icon_state = "0-8" @@ -14095,10 +14070,6 @@ /obj/structure/sign/warning/vacuum/external{ pixel_y = -32 }, -/obj/machinery/computer/turbine_computer{ - dir = 8; - id = "geothermal_se" - }, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "ekt" = ( @@ -14676,16 +14647,6 @@ }, /turf/open/floor/plating, /area/maintenance/disposal) -"etc" = ( -/obj/machinery/power/turbine{ - luminosity = 2; - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/fore) "ete" = ( /obj/machinery/door/airlock/wood{ name = "Psychiatrists office"; @@ -15085,17 +15046,6 @@ /obj/effect/landmark/stationroom/maint/threexthree, /turf/baseturf_bottom, /area/maintenance/port/fore) -"ezi" = ( -/obj/machinery/power/compressor{ - comp_id = "geothermal_nw"; - luminosity = 2; - dir = 4 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/fore) "ezG" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, @@ -15971,8 +15921,10 @@ /turf/open/floor/plasteel, /area/storage/primary) "eOp" = ( -/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, -/area/solar/port/aft) +/obj/effect/landmark/xeno_spawn, +/obj/structure/cable, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/top_layer/outdoors) "eOq" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19151,7 +19103,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/lattice/catwalk, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/port/fore) "fMT" = ( @@ -19955,13 +19906,6 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"fXs" = ( -/obj/machinery/door/poddoor{ - name = "pressure chamber vent"; - id = "geo_vent_nw" - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/fore) "fXy" = ( /turf/baseturf_bottom, /area/science/test_area) @@ -20031,7 +19975,9 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "fYh" = ( -/obj/structure/lattice, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/starboard/aft) "fYm" = ( @@ -21411,12 +21357,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"gro" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) "grD" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -22039,10 +21979,6 @@ /obj/effect/turf_decal/trimline/atmos/warning/lower/nobottom, /turf/open/floor/plasteel, /area/engine/atmos/distro) -"gAK" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) "gAS" = ( /obj/structure/window/reinforced, /obj/effect/turf_decal/loading_area{ @@ -23612,8 +23548,11 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "gUW" = ( -/obj/structure/lattice, -/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/tracker, +/turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/port/fore) "gVb" = ( /obj/structure/table/wood/poker, @@ -23836,7 +23775,16 @@ /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, /area/icemoon/top_layer/outdoors) "gXr" = ( -/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/port/fore) "gXD" = ( /obj/effect/spawner/structure/window/reinforced, @@ -23943,9 +23891,14 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "gZI" = ( -/obj/item/stack/cable_coil, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) +/area/icemoon/top_layer/outdoors) "gZN" = ( /obj/machinery/light{ dir = 8 @@ -24470,12 +24423,11 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "hio" = ( -/obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-2" }, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) +/area/icemoon/top_layer/outdoors) "his" = ( /obj/effect/turf_decal/trimline/white/filled/corner/lower{ dir = 4 @@ -26379,8 +26331,15 @@ /turf/open/floor/plasteel, /area/crew_quarters/bar) "hKJ" = ( -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/solar{ + id = "aftport"; + name = "Aft-Port Solar Array" + }, +/turf/open/floor/plasteel/airless/solarpanel, +/area/icemoon/top_layer/outdoors) "hKO" = ( /obj/structure/lattice, /obj/structure/window/reinforced, @@ -26447,7 +26406,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/lattice/catwalk, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/port/fore) "hMk" = ( @@ -26511,9 +26469,17 @@ /turf/open/floor/plasteel, /area/engine/atmos) "hMM" = ( -/obj/structure/lattice, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) +/area/icemoon/top_layer/outdoors) "hMS" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -28691,7 +28657,15 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "iwq" = ( -/obj/structure/lattice, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/port/fore) "iwt" = ( @@ -29782,12 +29756,13 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "iMz" = ( +/obj/machinery/power/solar_control{ + id = "foreport"; + name = "Port Bow Solar Control" + }, /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/computer/turbine_computer{ - id = "geothermal_nw" - }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) "iMA" = ( @@ -29999,11 +29974,12 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "iON" = ( -/obj/structure/lattice, -/obj/structure/lattice, -/obj/structure/grille/broken, -/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, -/area/icemoon/top_layer/outdoors) +/obj/machinery/power/tracker, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/solar/starboard/aft) "iPc" = ( /mob/living/simple_animal/cow{ name = "Betsy"; @@ -30364,15 +30340,15 @@ /turf/open/floor/plasteel, /area/mine/laborcamp) "iVi" = ( -/obj/machinery/power/compressor{ - comp_id = "geothermal_ne"; - luminosity = 2 - }, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "0-2" }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/top_layer/outdoors) +/obj/machinery/power/solar{ + id = "forestarboard"; + name = "Fore-Starboard Solar Array" + }, +/turf/open/floor/plasteel/airless/solarpanel, +/area/solar/starboard/fore) "iVp" = ( /obj/machinery/computer/operating, /turf/open/floor/plasteel/white, @@ -31490,21 +31466,6 @@ }, /turf/open/floor/plasteel, /area/security/main) -"jkn" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/button/door{ - name = "pressure chamber vent"; - pixel_y = 28; - id = "geo_vent_se" - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/aft) "jky" = ( /obj/machinery/button/flasher{ id = "holdingflash"; @@ -33772,17 +33733,17 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopods) "jPQ" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/button/door{ - name = "turbine vent"; - pixel_x = -24; - id = "geo_turbine_sw" +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/machinery/light{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) +/area/solar/starboard/aft) "jPS" = ( /obj/item/storage/secure/safe{ pixel_x = 6; @@ -34288,21 +34249,6 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"jYf" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/button/door{ - name = "pressure chamber vent"; - pixel_x = -24; - id = "geo_vent_sw" - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) "jYk" = ( /obj/item/radio/intercom{ pixel_x = -30 @@ -37557,12 +37503,14 @@ /turf/open/floor/wood, /area/crew_quarters/bar) "kWw" = ( -/obj/machinery/door/poddoor{ - name = "pressure chamber vent"; - id = "geo_turbine_sw" +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" }, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) +/area/icemoon/top_layer/outdoors) "kWx" = ( /turf/open/floor/plating{ icon_state = "panelscorched" @@ -39157,13 +39105,6 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/quartermaster/storage) -"lvE" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/fore) "lvH" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -39598,13 +39539,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/genetics) -"lCC" = ( -/obj/machinery/door/poddoor{ - name = "pressure chamber vent"; - id = "geo_vent_sw" - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) "lCF" = ( /obj/effect/landmark/stationroom/maint/fivexthree, /turf/baseturf_bottom, @@ -41821,12 +41755,13 @@ /turf/open/floor/plasteel, /area/engine/atmos/distro) "mhd" = ( +/obj/machinery/power/solar_control{ + id = "forestarboard"; + name = "Starboard Bow Solar Control" + }, /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/computer/turbine_computer{ - id = "geothermal_ne" - }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) "mhn" = ( @@ -42730,10 +42665,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"mvF" = ( -/obj/structure/steam_fissure, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/aft) "mvR" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -48252,10 +48183,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/storage/satellite) -"nWs" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/aft) "nWw" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -49349,13 +49276,6 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/mine/maintenance) -"olQ" = ( -/obj/structure/cable, -/obj/machinery/power/turbine{ - luminosity = 2 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) "olV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 6 @@ -50295,11 +50215,6 @@ /obj/structure/sign/departments/minsky/research/xenobiology, /turf/closed/wall/r_wall, /area/science/xenobiology) -"oAc" = ( -/obj/structure/lattice, -/obj/structure/lattice, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/fore) "oAl" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = -32 @@ -51006,7 +50921,16 @@ /turf/open/floor/plasteel/dark, /area/aisat) "oNM" = ( -/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/starboard/aft) "oNV" = ( /obj/structure/disposalpipe/segment{ @@ -51352,17 +51276,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/science/research) -"oSC" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/power/compressor{ - comp_id = "geothermal_sw"; - luminosity = 2; - dir = 1 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) "oTz" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 8 @@ -52036,10 +51949,6 @@ /obj/effect/landmark/xeno_spawn, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/port/fore) -"pep" = ( -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) "pex" = ( /obj/structure/disposalpipe/segment, /obj/effect/spawner/lootdrop/maintenance, @@ -52240,21 +52149,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"phW" = ( -/obj/machinery/button/door{ - name = "pressure chamber vent"; - pixel_x = -24; - id = "geo_vent_ne" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/lattice/catwalk, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/fore) "pio" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/item/storage/box/lights/mixed, @@ -52639,18 +52533,6 @@ }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) -"pmL" = ( -/obj/machinery/button/door{ - name = "turbine vent"; - pixel_x = -24; - id = "geo_turbine_ne" - }, -/obj/structure/lattice/catwalk, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/fore) "pmV" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -53069,13 +52951,6 @@ }, /turf/open/floor/plating, /area/science/xenobiology) -"psM" = ( -/obj/machinery/door/poddoor{ - name = "turbine vent"; - id = "geo_turbine_se" - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/aft) "psT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 10 @@ -58478,12 +58353,10 @@ /turf/open/floor/plasteel, /area/security/brig) "qWJ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, +/obj/structure/cable, +/obj/machinery/power/tracker, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/fore) +/area/icemoon/top_layer/outdoors) "qWM" = ( /turf/closed/wall/r_wall, /area/engine/foyer) @@ -58539,7 +58412,16 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "qYd" = ( -/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/starboard/fore) "qYg" = ( /obj/effect/turf_decal/stripes/line{ @@ -58773,7 +58655,10 @@ /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) "rbL" = ( -/turf/closed/wall/r_wall, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/port/fore) "rbU" = ( /turf/closed/wall, @@ -59585,7 +59470,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/lattice/catwalk, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/starboard/aft) "rnW" = ( @@ -60065,9 +59949,17 @@ /turf/open/floor/plating, /area/maintenance/starboard) "ryw" = ( -/obj/effect/landmark/xeno_spawn, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/aft) +/area/solar/starboard/fore) "ryA" = ( /obj/machinery/power/apc/highcap/five_k{ areastring = "/area/tcommsat/server"; @@ -60155,8 +60047,13 @@ /turf/open/floor/plasteel, /area/science/mixing) "rzO" = ( -/turf/closed/wall/r_wall, -/area/solar/port/aft) +/obj/structure/cable, +/obj/machinery/power/solar{ + id = "aftport"; + name = "Aft-Port Solar Array" + }, +/turf/open/floor/plasteel/airless/solarpanel, +/area/icemoon/top_layer/outdoors) "rzP" = ( /obj/structure/window/reinforced, /obj/machinery/computer/cargo/request{ @@ -60850,9 +60747,14 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "rLd" = ( -/obj/structure/steam_fissure, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/fore) +/area/solar/starboard/fore) "rLi" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, @@ -61640,8 +61542,13 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "rWS" = ( -/obj/structure/lattice, -/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/starboard/aft) "rXa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -63663,7 +63570,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/command) "szv" = ( -/obj/structure/steam_fissure, +/obj/item/stack/cable_coil, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/top_layer/outdoors) "szB" = ( @@ -64864,18 +64771,6 @@ /obj/effect/turf_decal/trimline/atmos/warning/lower/corner/flip, /turf/open/floor/plasteel, /area/engine/atmos/distro) -"sQN" = ( -/obj/machinery/button/door{ - name = "turbine vent"; - pixel_y = 28; - id = "geo_turbine_se" - }, -/obj/structure/lattice/catwalk, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/aft) "sQR" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -65235,12 +65130,11 @@ /turf/open/floor/plasteel, /area/mine/laborcamp) "sWm" = ( -/obj/machinery/power/turbine{ - luminosity = 2; - dir = 4 +/obj/structure/cable{ + icon_state = "2-4" }, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "2-8" }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/starboard/aft) @@ -65949,7 +65843,6 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/lattice/catwalk, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/port/fore) "tfK" = ( @@ -71440,16 +71333,14 @@ /turf/open/floor/plasteel/white, /area/medical/storage/locker) "uJg" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/button/door{ - name = "turbine vent"; - pixel_y = 28; - id = "geo_turbine_nw" +/obj/structure/cable{ + icon_state = "0-2" }, -/obj/machinery/light{ - dir = 1 +/obj/machinery/power/solar{ + id = "foreport"; + name = "Fore-Port Solar Array" }, -/turf/open/floor/plating/snowed/smoothed/icemoon, +/turf/open/floor/plasteel/airless/solarpanel, /area/solar/port/fore) "uJv" = ( /obj/machinery/door/airlock/grunge{ @@ -73282,10 +73173,6 @@ }, /turf/open/floor/plasteel, /area/vacant_room/commissary) -"vkJ" = ( -/obj/structure/steam_fissure, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) "vkK" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/cyan/visible, @@ -73325,8 +73212,10 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hop) "vkY" = ( -/obj/structure/lattice, -/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/snowed/smoothed/icemoon, /area/solar/starboard/fore) "vla" = ( /obj/effect/turf_decal/trimline/purple/warning/lower{ @@ -73617,7 +73506,12 @@ /turf/open/floor/plasteel/white, /area/mine/infirmary) "vpL" = ( -/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, /obj/structure/cable{ icon_state = "4-8" }, @@ -74175,9 +74069,12 @@ /turf/open/floor/plasteel/dark/telecomms, /area/ai_monitored/turret_protected/ai) "vwU" = ( -/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/tracker, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/port/aft) +/area/solar/starboard/fore) "vxh" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -75273,9 +75170,8 @@ /turf/open/floor/wood, /area/library) "vMQ" = ( -/obj/machinery/door/poddoor{ - name = "pressure chamber vent"; - id = "geo_vent_ne" +/obj/structure/cable{ + icon_state = "0-8" }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/top_layer/outdoors) @@ -77178,16 +77074,6 @@ }, /turf/open/floor/plasteel/dark, /area/teleporter) -"wnh" = ( -/obj/machinery/power/turbine{ - luminosity = 2; - dir = 1 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/top_layer/outdoors) "wnx" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ @@ -80131,12 +80017,14 @@ /turf/open/floor/plasteel, /area/engine/atmos) "xeI" = ( -/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, /obj/structure/cable{ icon_state = "1-8" }, /turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/aft) +/area/solar/port/fore) "xfc" = ( /obj/machinery/light{ dir = 8 @@ -82560,13 +82448,6 @@ }, /turf/open/floor/plasteel, /area/hydroponics) -"xJI" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/solar/starboard/aft) "xJL" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, @@ -84394,8 +84275,12 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "yiu" = ( -/obj/structure/lattice, -/turf/open/floor/plating/snowed/smoothed/icemoon, +/obj/structure/cable, +/obj/machinery/power/solar{ + id = "forestarboard"; + name = "Fore-Starboard Solar Array" + }, +/turf/open/floor/plasteel/airless/solarpanel, /area/solar/starboard/fore) "yiy" = ( /obj/structure/sign/poster/official/random, @@ -95059,22 +94944,22 @@ ozK ozK ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +lCL +uOd +azn +uOd +azn +uOd +uOd +uOd +kwD +uOd +uOd +uOd +uOd +kwD +uOd +ueX ozK ozK ozK @@ -95315,22 +95200,22 @@ ozK ozK ozK ozK +uOd ozK ozK +ueX +ueX ozK ozK +ueX +ueX ozK ozK +ueX +ueX ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +azn ozK ozK ozK @@ -95572,24 +95457,24 @@ ozK ozK ozK ozK +uOd ozK +hKJ +kWw +rzO +ueX +hKJ +kWw +rzO +ueX +hKJ +kWw +rzO ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +uOd +ueX +ueX ozK ozK ozK @@ -95826,25 +95711,25 @@ tRh tRh ozK ozK +ueX +ueX +ueX +ueX ozK +hKJ +vpL +rzO ozK +hKJ +vpL +rzO ozK +hKJ +vpL +rzO +ueX ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +uOd ozK ozK ozK @@ -96083,25 +95968,25 @@ tRh ozK ozK ozK +ueX ozK ozK +azn +ueX +hKJ +vpL +rzO +ueX +hKJ +vpL +rzO +ueX +hKJ +vpL +rzO +ueX ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +uOd ozK ozK ozK @@ -96339,24 +96224,24 @@ tRh tRh ozK ozK +ueX +ueX ozK ozK +uOd ozK +hKJ +vpL +rzO +ueX +hKJ +vpL +rzO ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +hKJ +vpL +rzO +ueX ozK ozK ozK @@ -96602,23 +96487,23 @@ ozK ozK ozK ozK -ozK -ozK +hKJ +vpL +rzO ueX -ozK -ozK -ozK -ozK -ozK -ozK -ozK +hKJ +vpL +rzO ueX +hKJ +vpL +rzO ozK ozK ozK -ozK -ozK -ozK +uOd +uOd +uOd ozK ozK tRh @@ -96855,27 +96740,27 @@ ozK ozK ozK ozK +ueX ozK -ozK -ozK -ozK -ozK +azn ozK ueX -ozK +vMQ ozK ozK ueX -ozK +vMQ ozK ozK ueX +vMQ ozK ozK ozK -ueX ozK +ueX ozK +uOd ozK ozK tRh @@ -97109,30 +96994,30 @@ ozK ozK ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK ueX ueX ueX ueX -kwD -rtS -rtS -rtS -rtS -kwD -rtS -rtS -rtS ueX +uOd ueX ueX -ozK +bXm +bXm +szv +bXm +bXm +hio +don +eOp +bXm +hio +don +don +don +qWJ +ueX +uOd ozK ozK tRh @@ -97365,31 +97250,31 @@ fSP fSP fSP fSP +ueX +ueX ozK ozK ozK ozK +uOd ozK +ueX +apF ozK ozK +ueX +apF +ueX ozK +ueX +apF ozK +ueX ozK -uOd -eOp -eOp -hKJ -hMM -hKJ -hKJ -hKJ -hMM -hKJ -eOp -dpo -kwD ozK +ueX ozK +uOd ozK ozK tRh @@ -97623,31 +97508,31 @@ fSP upZ fSP ozK +ueX ozK ozK ozK ozK +ueX ozK -ozK -ozK -ozK -ozK -uOd -eOp -hKJ hKJ +hMM rzO -rzO -rzO -rzO -rzO +ueX hKJ +hMM +rzO +ueX hKJ -eOp -uOd +hMM +rzO ozK ozK ozK +uOd +uOd +uOd +ozK ozK tRh tRh @@ -97885,23 +97770,23 @@ oqq oqq ozK ueX +ueX +ueX +hKJ +hMM +rzO +ozK +hKJ +hMM +rzO +ozK +hKJ +hMM +rzO ozK ozK ozK ozK -kwD -eOp -hKJ -hKJ -lCC -vkJ -oSC -olQ -kWw -hKJ -hKJ -eOp -uOd ozK ozK ozK @@ -98142,23 +98027,23 @@ dke lcZ lcZ lcZ -ozK -ozK -ozK -ozK ueX -hMM +ozK hKJ hMM rzO -rzO -cWl -rzO -rzO +ueX +hKJ hMM +rzO +ueX hKJ -dpo -kwD +hMM +rzO +ueX +ozK +uOd +ozK ozK ozK ozK @@ -98399,24 +98284,24 @@ rLk lno qsU ufB +bXm hio -hio -hio -hio -vwU -hKJ -pep -gro -jYf -hio -cIz -gAK -jPQ +don +hMM +rzO +ozK hKJ +hMM +rzO +ueX hKJ -eOp +hMM +rzO +ueX +ueX +uOd +ueX ueX -ozK ozK ozK ozK @@ -98656,24 +98541,24 @@ qzX lcZ oqq tqb -ozK -ozK -ozK -ozK ueX -eOp -hKJ -hKJ -hMM +ozK hKJ +gZI +rzO +ueX hKJ gZI -hMM +rzO +ueX hKJ -eOp -eOp -kwD +gZI +rzO +ozK ozK +uOd +ozK +ueX ozK ozK ozK @@ -98913,27 +98798,27 @@ oqq oqq ozK ueX +ueX ozK ozK +ueX ozK ozK ueX -mBK -rtS -kwD ueX -rtS -rtS -rtS -rtS -rtS -kwD +ozK ueX ueX ueX ozK ozK ozK +kwD +ozK +ueX +ozK +ozK +ozK ozK ozK ozK @@ -99170,24 +99055,24 @@ ozK ozK ozK ueX -ozK -ozK -ozK -ozK +mBK ueX -ozK -ozK -ozK ueX -ozK -ozK -ozK ueX -ozK -ozK -ozK ueX -ozK +uOd +uOd +kwD +uOd +kwD +uOd +uOd +kwD +uOd +kwD +uOd +ueX +ueX ozK ozK ozK @@ -99325,7 +99210,7 @@ ozK ozK ozK ozK -ozK +ueX ozK ozK ozK @@ -99334,7 +99219,7 @@ ueX ozK ozK ozK -ozK +ueX ozK ozK ozK @@ -99431,10 +99316,10 @@ fSP fSP iuW fyE -ueX ozK ozK ozK +ueX ozK ozK ozK @@ -99442,7 +99327,6 @@ ozK ueX ozK ozK -ozK ueX ozK ozK @@ -99453,6 +99337,7 @@ ozK ozK ozK ozK +ozK tRh tRh tRh @@ -99578,22 +99463,22 @@ tRh tRh ozK ozK -ozK -ozK -ozK -ozK -ueX ueX -uOd -kwD -uOd -uOd +wtU +rtS +rtS +rtS +azn +rtS +rtS +rtS +wtU +rtS +rtS +azn +rtS +rtS ueX -uOd -ozK -ozK -ozK -ozK ozK ozK ozK @@ -99691,14 +99576,14 @@ fyE ozK ozK ozK -ozK -ozK +ueX ozK ozK ozK ueX ueX ozK +ozK ueX ueX ozK @@ -99835,22 +99720,22 @@ tRh tRh ozK ozK +azn ozK -ozK -ozK -ozK +ueX +ueX +ueX ozK ueX -gUW -gUW -gUW -gXr -gUW -gUW +ueX ueX ozK +ueX +ueX ozK ozK +rtS +ueX ozK jRB jRB @@ -99945,7 +99830,6 @@ nhh nhh nhh fSP -ueX ozK ozK ozK @@ -99957,6 +99841,7 @@ ueX ozK ozK ozK +ozK ueX ozK ozK @@ -100092,22 +99977,22 @@ tRh tRh ozK ozK +wtU ozK +uJg +cKO +cmC ozK +uJg +cKO +cmC ozK +uJg +cKO +cmC ueX +rtS ueX -uOd -gXr -nEU -nEU -nEU -nEU -gXr -uOd -ueX -ueX -ozK ozK jRB vIz @@ -100202,7 +100087,7 @@ nhh nhh nhh fSP -ueX +ozK ueX azn uOd @@ -100349,23 +100234,23 @@ tRh ozK ozK ozK -ozK -ozK -ozK -ozK -ozK rtS -nEU -nEU -nEU -nEU -nEU -nEU -kwD -ozK -ozK +ueX +uJg +iwq +cmC ozK +uJg +iwq +cmC ozK +uJg +iwq +cmC +ueX +ueX +ueX +ueX jRB jRB ikV @@ -100605,23 +100490,23 @@ ozK ozK ozK ozK -ozK -ozK -ozK -ozK -ozK ueX -uOd +rtS +ueX +uJg iwq -rbL cmC -rbL +ueX uJg iwq -uOd +cmC +ueX +uJg +iwq +cmC ueX ozK -ozK +ueX ozK ozK jRB @@ -100862,21 +100747,21 @@ ozK ozK ozK ozK +ueX ozK ozK +uJg +iwq +cmC ozK +uJg +iwq +cmC ozK -ozK -ozK -uOd -nEU -rbL -etc -rbL -dTV -mSs -uOd -ozK +uJg +iwq +cmC +ueX ozK ueX ozK @@ -101117,27 +101002,27 @@ tRh ozK ozK ozK +wtU +rtS +wtU ozK ozK +uJg +iwq +cmC ozK +uJg +iwq +cmC ozK -ozK -ozK -ueX -ueX -kwD -nEU -rbL -ezi -lvE -bmP -nEU -uOd -ueX +uJg +iwq +cmC ueX ueX ueX ueX +ozK jRB rNT ifi @@ -101374,22 +101259,22 @@ tRh ozK ozK ozK +rtS ozK +ueX ozK ozK -ozK -ozK -ozK -ozK -ozK -uOd -nEU +ueX rbL -rLd +ueX +ueX +ueX rbL -qWJ -nEU -bXm +ueX +ozK +ueX +rbL +ueX ozK ueX ozK @@ -101631,26 +101516,26 @@ tRh ozK ozK ozK +azn ozK -ozK -ozK -ozK -ozK -ozK -ozK -ueX -uOd -iwq -rbL -fXs -rbL -don +gUW +fML +fML rFl +nEU +nEU +nEU +mSs +nEU +nEU pel nEU +nEU +nEU wjl fML fML +fML bjl jRB jRB @@ -101888,23 +101773,23 @@ ozK ozK ozK ozK +rtS ozK +ueX ozK +ueX +ueX +bBY +ueX ozK +ueX +bBY +ueX ozK +ueX +bBY +ueX ozK -ozK -ozK -ozK -uOd -nEU -nEU -nEU -nEU -nEU -nEU -bXm -bXm ueX ozK ozK @@ -102145,22 +102030,22 @@ ozK ozK ozK ozK +azn +wtU +wtU ozK +ueX +uJg +gXr +cmC ozK +uJg +gXr +cmC ozK -ozK -ozK -ozK -ueX -ueX -kwD -gUW -nEU -nEU -nEU -nEU -gUW -uOd +uJg +gXr +cmC ozK ueX ozK @@ -102407,17 +102292,17 @@ ozK ozK ozK ozK -ozK -ozK -ozK -ueX -gXr -gXr -gXr +uJg gXr +cmC +ueX +uJg gXr +cmC +ozK +uJg gXr -ueX +cmC ozK ueX ozK @@ -102662,19 +102547,19 @@ ozK ozK ozK ozK -ozK -ozK -ozK -ozK -ueX +rtS ueX -uOd -uOd -uOd -uOd -uOd -kwD +uJg +gXr +cmC +ozK +uJg +gXr +cmC ueX +uJg +gXr +cmC ueX ueX ueX @@ -102919,19 +102804,19 @@ ozK ozK ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +azn ueX +uJg +gXr +cmC +ueX +uJg +gXr +cmC ozK -ozK -ozK -ozK +uJg +gXr +cmC ozK ueX ozK @@ -103176,19 +103061,19 @@ ozK ozK ozK ozK +wtU ozK +uJg +xeI +cmC ozK +uJg +xeI +cmC ozK -ozK -ozK -ozK -ozK -ozK -ueX -ozK -ozK -ozK -ozK +uJg +xeI +cmC ozK ueX ozK @@ -103433,12 +103318,13 @@ ozK ozK ozK ozK +wtU +ueX ozK +ueX +ueX ozK -ozK -ozK -ozK -ozK +ueX ozK ueX ueX @@ -103446,11 +103332,10 @@ ueX ueX ueX ueX -mBK ueX -ozK -ozK -ozK +ueX +ueX +ueX tfF fML fML @@ -103691,21 +103576,21 @@ ozK ozK ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +ueX azn -ozK -ozK +rtS +azn +rtS +wtU +rtS +azn +wtU ozK ozK ueX ozK ozK +ueX ozK ozK ueX @@ -103950,19 +103835,19 @@ ozK ozK ozK ozK -ozK -ozK -ozK -ozK +ueX +ueX ozK ueX ozK +ueX ozK ozK ozK ueX ozK ozK +ueX ozK ozK ueX @@ -104208,18 +104093,18 @@ ozK ozK ozK ozK -ozK -ozK -ozK -ozK +ueX +ueX ueX ozK +ueX ozK ozK ozK ueX +ueX ozK -ozK +ueX ozK ozK ueX @@ -104467,7 +104352,7 @@ ozK ozK ozK ozK -ozK +ueX ueX ueX ozK @@ -104476,7 +104361,7 @@ ozK ozK ueX ozK -ozK +ueX ozK ozK ueX @@ -125407,7 +125292,7 @@ ozK ozK ozK ueX -rnF +iEc ueX ozK ozK @@ -125664,7 +125549,7 @@ ozK ozK ozK ueX -rnF +iEc ueX ozK ozK @@ -125921,7 +125806,7 @@ ozK ozK ozK ueX -rnF +iEc ueX ozK ozK @@ -126178,15 +126063,15 @@ ozK ozK ozK ueX -rnF +iEc ueX ozK ozK ozK ozK ozK -ozK -ozK +ueX +ueX ozK ozK ozK @@ -126436,13 +126321,13 @@ ozK ozK ueX rnF -ueX -ozK -ozK ozK +ueX ozK ozK +ueX ozK +ueX ozK ozK ozK @@ -126574,7 +126459,7 @@ tRh tRh ozK ozK -ozK +ueX ozK ozK ozK @@ -126686,21 +126571,21 @@ ueX ozK ozK ueX -ueX -ueX kwD +uOd +uOd +uOd ueX ueX -ueX -awB +rnF kwD +uOd +kwD +uOd +uOd +uOd ueX -ueX -ueX -ozK -ozK -ozK -ozK +uOd ozK ozK ozK @@ -126831,19 +126716,19 @@ tRh tRh ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +rtS +azn +rtS +rtS +rtS +wtU +rtS +rtS +rtS +azn +rtS +rtS +rtS azn rtS ucj @@ -126942,22 +126827,22 @@ ueX ueX ueX ueX +ozK ueX ueX -ueX -oNM -oNM -oNM -iEc -iEc -oNM -ueX ozK ozK ozK ozK +awB ozK ozK +ueX +ozK +ozK +ueX +ozK +uOd ozK ozK ozK @@ -127088,18 +126973,18 @@ tRh tRh ozK ozK -ozK -ozK +rtS ozK ozK ueX +ueX ozK +ueX ozK +ueX ozK ozK -ozK -ozK -ozK +ueX ueX ozK ueX @@ -127200,21 +127085,21 @@ ueX ozK ueX ozK -ozK -uOd -rWS -iEc -iEc +bSD +bSD +bSD +bSD +bSD +ueX iEc -ryw -fYh -kwD -ozK -ozK -ozK -ozK ozK +bSD +bSD +bSD +bSD +bSD ozK +kwD ozK ozK ozK @@ -127345,19 +127230,19 @@ tRh tRh ozK ozK -ueX -ozK -ozK -ozK -ueX -ozK -ozK -ozK -ueX +rtS ozK +iVi +bzh +yiu ozK +iVi +bzh +yiu ozK -ueX +iVi +bzh +yiu ozK ueX ucj @@ -127455,27 +127340,27 @@ ueX ueX ueX ozK -ueX -ozK +uOd ozK -rtS -iEc -iEc +sWm +oNM +oNM +oNM +oNM +azV iEc fYh -pVy -fYh +jPQ +jPQ +jPQ +jPQ +rWS +ueX uOd ozK ozK ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK tRh tRh tRh @@ -127602,20 +127487,20 @@ ozK ozK ozK ozK +rtS ueX -ueX -uOd -uOd -uOd -ueX -uOd -kwD -uOd -uOd -kwD -ueX -ueX -ueX +iVi +qYd +yiu +ozK +iVi +qYd +yiu +ozK +iVi +qYd +yiu +ozK ueX ucj dVh @@ -127712,23 +127597,23 @@ ozK ueX ueX ozK -ozK -ozK -ueX uOd -fYh -azV +ueX +dKv +dKv +dKv +dKv dKv -azV -jkn -iEc -uOd ueX +rwS +ueX +dKv +dKv +dKv +dKv +dKv ozK -ozK -ozK -ozK -ozK +uOd ozK ozK ozK @@ -127859,20 +127744,20 @@ ozK ozK ozK ozK -kwD -vkY +rtS +ueX +iVi qYd -wnF -oAc yiu -wnF -wnF +ueX +iVi +qYd yiu -wnF +ueX +iVi qYd -vkY -kwD -ozK +yiu +ueX ueX ucj ucj @@ -127969,23 +127854,23 @@ ozK ozK ueX ozK +uOd +ueX +ueX +ueX ueX ozK ozK -uOd -fYh -azV -mvF -azV -rnF -iEc -uOd ozK +iEc ozK +ueX ozK ozK +ueX ozK ozK +uOd ozK ozK ozK @@ -128116,19 +128001,19 @@ ozK ozK ozK ozK -bkq +rtS +ueX +iVi qYd -wnF -wnF -bdu -bdu -bdu -bdu -bdu -wnF -wnF +yiu +ozK +iVi qYd -ueX +yiu +ozK +iVi +qYd +yiu ozK ueX ueX @@ -128225,28 +128110,28 @@ ueX ueX ueX ueX -ueX -ueX -ueX -ueX +ozK kwD +ozK +bSD +bSD +bSD +bSD +bSD +ueX iEc -azV +ozK bSD -xJI -xeI -fYh +bSD +bSD +bSD +bSD +ueX uOd ozK ozK ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK tRh tRh tRh @@ -128370,22 +128255,22 @@ tRh tRh ozK ozK +wtU +azn +wtU +rtS ozK +iVi +qYd +yiu ozK -ozK -iON +iVi qYd -wnF -wnF -bzh -wnh +yiu +ozK iVi -szv -vMQ -wnF -wnF qYd -ueX +yiu ozK ozK ueX @@ -128483,27 +128368,27 @@ ozK ozK ueX ozK -ozK -ozK -ozK uOd -iEc -azV +ozK sWm +oNM +oNM +oNM +oNM azV -nWs +iEc fYh +jPQ +jPQ +jPQ +jPQ +rWS +ueX uOd ozK ozK ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK tRh tRh tRh @@ -128627,21 +128512,21 @@ tRh tRh ozK ozK +rtS ozK +ueX ozK ozK -bkq -qYd -wnF -wnF -bdu +ueX bdu -vpL +ueX +ueX +ueX bdu +ueX +ozK +ueX bdu -yiu -wnF -yiu ueX ozK ozK @@ -128740,23 +128625,23 @@ ozK ozK ueX ozK -ozK -ueX -ueX -uOd -fYh -azV -psM -azV -sQN -rwS uOd ueX +dKv +dKv +dKv +dKv +dKv +ueX +iEc ueX +dKv +dKv +dKv +dKv +dKv ozK -ozK -ozK -ozK +uOd ozK ozK ozK @@ -128884,26 +128769,26 @@ tRh tRh ozK ozK +rtS ozK -ozK -ozK +vwU bkq -qYd +bkq +nMu +wnF +wnF +aRc +wnF +wnF +wnF +wnF +wnF +wnF +wnF wnF wnF -pmL -cIF -cKO -apF -phW -nMu -bBY wnF luZ -apF -apF -apF -apF rnr jMj oVC @@ -128997,23 +128882,23 @@ ozK ozK ueX ozK -ueX -ozK -ozK uOd -iEc -iEc -iEc -iEc -iEc -iEc -kwD ozK ozK +ueX +ueX +ueX +ozK ozK +iEc ozK ozK +ueX +ueX +ueX +ueX ozK +kwD ozK ozK ozK @@ -129141,22 +129026,22 @@ tRh tRh ozK ozK +rtS ozK ozK ozK -uOd +ueX +ueX vkY +ueX +ozK +ueX vkY -wnF -yiu -aRc -wnF -wnF -yiu -wnF -wnF +ueX +ozK +ueX vkY -kwD +ueX ozK ozK ueX @@ -129254,23 +129139,23 @@ ozK ozK ueX ozK -ozK -ozK -ozK kwD -rWS -iEc -iEc -iEc +ueX +bSD +bSD +bSD +bSD +bSD +ueX iEc -rWS -uOd -ozK -ozK -ozK -ozK -ozK ozK +bSD +bSD +bSD +bSD +bSD +ueX +uOd ozK ozK ozK @@ -129398,24 +129283,24 @@ tRh tRh ozK ozK +wtU +wtU +azn +wtU +ueX +iVi +ryw +yiu ozK +iVi +ryw +yiu +ozK +iVi +ryw +yiu ozK ozK -ueX -ueX -kwD -uOd -uOd -uOd -uOd -kwD -ueX -uOd -kwD -ueX -ueX -ueX -ueX ueX ozK ozK @@ -129510,24 +129395,24 @@ ozK ozK ozK ueX -ueX ozK +uOd ueX -ueX -ueX -oNM -oNM +sWm oNM oNM oNM oNM -ueX -ozK -ozK -ozK -ozK -ozK +azV +iEc +fYh +jPQ +jPQ +jPQ +jPQ +rWS ozK +ueX ozK ozK ozK @@ -129658,21 +129543,21 @@ ozK ozK ozK ozK -ueX -ozK -ozK -ozK -ueX -ozK -ozK -ozK -ueX +rtS ozK +iVi +ryw +yiu ozK +iVi +ryw +yiu ozK +iVi +ryw +yiu ueX ozK -ozK ueX ozK ozK @@ -129767,22 +129652,22 @@ ozK ozK ozK ueX -ozK -ozK -ozK ueX -ueX -uOd -uOd -uOd uOd -uOd -kwD ueX +dKv +dKv +dKv +dKv +dKv ueX -ozK -ozK -ozK +pVy +ueX +dKv +dKv +dKv +dKv +dKv ozK ozK ozK @@ -129915,19 +129800,19 @@ ozK ozK ozK ozK -ozK -ozK -ozK -ozK +rtS ueX -ozK -ozK -ozK -ozK -ozK -ozK -ozK +iVi +ryw +yiu ueX +iVi +ryw +yiu +ueX +iVi +ryw +yiu ozK ozK ueX @@ -130025,22 +129910,22 @@ ozK ozK ueX ozK +uOd ozK ozK +ueX +ueX ozK ozK ozK +rnF ozK +ueX ozK +ueX ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +ueX ozK ozK ozK @@ -130172,19 +130057,19 @@ ozK ozK ozK ozK +rtS +ueX +iVi +ryw +yiu ozK +iVi +ryw +yiu ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +iVi +ryw +yiu ozK ozK ueX @@ -130282,22 +130167,22 @@ ozK ozK ueX ozK +uOd +uOd +uOd +uOd +uOd ozK +ueX ozK +rnF ozK ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +ueX +ueX +uOd +uOd ozK ozK ozK @@ -130429,19 +130314,19 @@ ozK ozK ozK ozK +wtU ozK +iVi +rLd +yiu ozK +iVi +rLd +yiu ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +iVi +rLd +yiu ueX ueX rtS @@ -130539,17 +130424,17 @@ ozK ozK ueX ozK +uOd ozK ozK +ueX ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +uOd +ueX +iON +ueX +kwD ozK ozK ozK @@ -130686,18 +130571,18 @@ tRh ozK ozK ozK +wtU ozK +ueX ozK +ueX ozK ozK +ueX +ueX ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +ueX +ueX ozK ozK ozK @@ -130796,19 +130681,19 @@ ozK ozK ueX ozK +uOd ozK ozK +ueX +ueX ozK +kwD ozK ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +uOd +ueX +ueX ozK ozK ozK @@ -130943,19 +130828,19 @@ tRh ozK ozK ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK -ozK +wtU +azn +rtS +rtS +rtS +azn +rtS +rtS +rtS +wtU +rtS +rtS +azn rtS azn rtS @@ -131059,11 +130944,11 @@ ozK ozK ozK ozK -ozK -ozK -ozK -ozK -ozK +uOd +uOd +uOd +uOd +uOd ozK ozK ozK @@ -131317,9 +131202,9 @@ ozK ozK ozK ozK +ueX ozK -ozK -ozK +ueX ozK ozK ozK diff --git a/_maps/map_files/YogStation/YogStation.dmm b/_maps/map_files/YogStation/YogStation.dmm index 1a84d72a1c8c..8566f976d5a9 100644 --- a/_maps/map_files/YogStation/YogStation.dmm +++ b/_maps/map_files/YogStation/YogStation.dmm @@ -2189,22 +2189,6 @@ "apN" = ( /turf/open/floor/plating, /area/construction/mining/aux_base) -"apR" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "apS" = ( /turf/open/floor/wood, /area/lawoffice) @@ -3790,19 +3774,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) -"aBP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/turf_decal/ramp_middle, -/turf/open/floor/wood, -/area/crew_quarters/bar) "aBQ" = ( /turf/closed/wall, /area/storage/primary) @@ -5489,6 +5460,14 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"aMT" = ( +/obj/machinery/camera{ + c_tag = "Kitchen North"; + dir = 2 + }, +/obj/machinery/deepfryer, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) "aMZ" = ( /turf/closed/wall, /area/hallway/secondary/exit) @@ -6579,10 +6558,6 @@ /obj/item/flashlight/lamp/green, /turf/open/floor/wood, /area/vacant_room) -"aUz" = ( -/obj/machinery/deepfryer, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) "aUD" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green{ @@ -7525,13 +7500,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"bdG" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/oven, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) "bdH" = ( /obj/machinery/door/airlock{ name = "Unit 3" @@ -10216,6 +10184,22 @@ /obj/machinery/rnd/experimentor, /turf/open/floor/engine, /area/science/explab) +"bAV" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "bAX" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -11965,6 +11949,22 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/cryopods) +"bPw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "bPA" = ( /obj/structure/toilet{ dir = 1 @@ -12666,30 +12666,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/distro) -"bYj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood/thin{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/bar) "bYl" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, @@ -13364,24 +13340,6 @@ /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, /turf/open/floor/plasteel/dark, /area/tcommsat/storage) -"chl" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/siding/wood/thin{ - dir = 8 - }, -/obj/structure/table, -/obj/item/storage/box/cups, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/bar"; - dir = 4; - name = "Bar APC"; - pixel_x = 24 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/bar) "chq" = ( /obj/machinery/processor/slime, /obj/item/radio/intercom{ @@ -13627,6 +13585,18 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) +"ckB" = ( +/obj/effect/turf_decal/siding/wood/thin{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/ramp_middle{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) "ckC" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -14430,15 +14400,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"ctq" = ( -/obj/effect/turf_decal/siding/wood/thin{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/bar) "ctu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14745,6 +14706,15 @@ }, /turf/open/floor/plasteel, /area/security/main) +"cxD" = ( +/obj/effect/turf_decal/siding/wood/thin{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/stone, +/area/crew_quarters/bar) "cxI" = ( /obj/structure/table, /obj/item/book/manual/wiki/hydroponicsplants{ @@ -14920,20 +14890,6 @@ /obj/effect/spawner/structure/window/reinforced/shutter, /turf/open/floor/plating, /area/maintenance/port) -"cAH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "cAI" = ( /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment, @@ -15308,6 +15264,21 @@ }, /turf/open/floor/wood/parquet, /area/crew_quarters/bar) +"cGb" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/disposal/bin, +/obj/structure/extinguisher_cabinet{ + pixel_x = -5; + pixel_y = 30 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "cGw" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/simple/supply/visible, @@ -15584,6 +15555,17 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/supply) +"cKv" = ( +/obj/machinery/door/window/southleft{ + base_state = "left"; + dir = 8; + icon_state = "left"; + name = "Bar Delivery"; + req_access_txt = "25" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "cKD" = ( /obj/effect/turf_decal/stripes/corner, /obj/structure/railing, @@ -15956,6 +15938,22 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"cPq" = ( +/obj/effect/turf_decal/siding/wood/thin{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/railing/corner, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/ramp_middle{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) "cPt" = ( /obj/machinery/light_switch{ pixel_y = 28 @@ -16445,6 +16443,11 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/mix) +"cYj" = ( +/obj/structure/lattice, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/space/basic, +/area/space/nearstation) "cYD" = ( /obj/structure/table, /obj/item/book/manual/chef_recipes, @@ -17734,6 +17737,16 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /turf/open/floor/plasteel/freezer, /area/crew_quarters/kitchen) +"dyX" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "dze" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -18086,6 +18099,14 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet) +"dFa" = ( +/obj/structure/railing, +/obj/effect/turf_decal/siding/wood/corner/thin{ + dir = 1 + }, +/obj/effect/turf_decal/ramp_corner, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) "dFi" = ( /obj/structure/table, /obj/item/storage/box/prisoner{ @@ -18256,6 +18277,15 @@ /obj/structure/tank_dispenser, /turf/open/floor/plasteel/dark, /area/engine/atmos/storage) +"dIf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "dIg" = ( /obj/structure/cable{ icon_state = "1-2" @@ -18623,12 +18653,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"dPv" = ( -/obj/effect/turf_decal/siding/wood/thin{ - dir = 4 - }, -/turf/open/floor/stone, -/area/crew_quarters/bar) "dPy" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -19870,6 +19894,15 @@ }, /turf/open/floor/plasteel/white, /area/medical/genetics) +"ens" = ( +/obj/effect/spawner/structure/window, +/obj/structure/curtain, +/obj/machinery/door/poddoor/preopen{ + id = "barshutters"; + name = "privacy shutter" + }, +/turf/open/floor/plating, +/area/crew_quarters/bar) "eoj" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -20137,17 +20170,6 @@ }, /turf/open/space/basic, /area/space) -"esY" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/southleft{ - base_state = "left"; - dir = 8; - icon_state = "left"; - name = "Bar Delivery"; - req_access_txt = "25" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "etn" = ( /obj/machinery/shower{ dir = 4 @@ -20533,17 +20555,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"exZ" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "eye" = ( /obj/structure/window/reinforced{ dir = 4 @@ -21405,29 +21416,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/medical/psych) -"eOe" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "barcounter"; - name = "bar shutters" - }, -/obj/machinery/coffeemaker, -/obj/item/reagent_containers/food/drinks/bottle/coffeepot, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "eOj" = ( /obj/machinery/vending/snack/random, /turf/open/floor/plasteel/dark, @@ -21907,6 +21895,20 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"eWI" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "eWN" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/machinery/atmospherics/miner/n2o, @@ -22594,6 +22596,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"fjo" = ( +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/machinery/deepfryer, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) "fjz" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -22685,6 +22694,18 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) +"fli" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "flm" = ( /obj/machinery/camera{ c_tag = "Toxins Lab West"; @@ -22920,6 +22941,13 @@ }, /turf/open/floor/plasteel, /area/hydroponics/garden) +"for" = ( +/obj/machinery/camera{ + c_tag = "Fitness Room South"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "foR" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -24677,27 +24705,6 @@ }, /turf/open/floor/plasteel, /area/science/research) -"fUp" = ( -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/cable_coil, -/obj/item/flashlight/lamp, -/obj/item/flashlight/lamp/green, -/obj/structure/closet/secure_closet/bartender, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/light{ - dir = 4 - }, -/obj/item/reagent_containers/food/drinks/bottle/coffeepot, -/obj/item/seeds/coffee/robusta, -/obj/item/seeds/coffee, -/obj/item/storage/box/coffee_condi_display, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "fUQ" = ( /turf/closed/wall, /area/quartermaster/sorting) @@ -24710,6 +24717,22 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/distro) +"fUW" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/camera{ + c_tag = "Bar Storage"; + dir = 8 + }, +/obj/structure/sink/kitchen{ + dir = 8; + pixel_x = 11 + }, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "fUZ" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ @@ -25075,6 +25098,16 @@ /obj/structure/cable, /turf/open/floor/plasteel/vaporwave, /area/storage/art) +"gcx" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "gcy" = ( /obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 8 @@ -25234,25 +25267,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/medical/virology) -"gfA" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "barcounter"; - name = "bar shutters" - }, -/obj/item/reagent_containers/food/drinks/shaker, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "gfL" = ( /obj/machinery/door/airlock{ name = "Custodial Closet"; @@ -25279,16 +25293,6 @@ }, /turf/open/space, /area/solar/port/aft) -"ggj" = ( -/obj/machinery/camera{ - c_tag = "Fitness Room South"; - dir = 1 - }, -/obj/effect/turf_decal/ramp_corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) "ggs" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/stripes/corner{ @@ -25532,12 +25536,6 @@ dir = 4 }, /area/crew_quarters/theatre) -"glZ" = ( -/obj/effect/turf_decal/siding/wood/thin{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/bar) "gmo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -25788,6 +25786,24 @@ }, /turf/open/floor/plasteel, /area/storage/primary) +"gsn" = ( +/obj/machinery/door/airlock{ + name = "Bar Storage"; + req_access_txt = "25" + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "gsK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -25859,6 +25875,20 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"gtQ" = ( +/obj/structure/plasticflaps{ + opacity = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + freq = 1400; + location = "Bar" + }, +/turf/open/floor/plasteel{ + dir = 2 + }, +/area/crew_quarters/bar) "gtZ" = ( /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plasteel/dark, @@ -26413,6 +26443,16 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"gFr" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "gFF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -26646,10 +26686,6 @@ }, /turf/open/floor/plasteel, /area/security/processing) -"gJD" = ( -/obj/effect/turf_decal/ramp_middle, -/turf/open/floor/plasteel/stairs/goon/stairs2_wide, -/area/crew_quarters/fitness) "gJM" = ( /obj/structure/cable{ icon_state = "1-2" @@ -28309,6 +28345,27 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"hnF" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/structure/table/wood, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/smartfridge/drinks{ + icon_state = "boozeomat" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "barcounter"; + name = "bar shutters" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "hnI" = ( /obj/effect/turf_decal/bot_red, /obj/structure/rack, @@ -29024,13 +29081,6 @@ /obj/effect/turf_decal/trimline/green/filled/line/lower, /turf/open/floor/plasteel/white, /area/medical/virology) -"hBl" = ( -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/obj/machinery/griddle, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) "hBp" = ( /obj/effect/spawner/structure/window/reinforced/shutter, /obj/structure/cable{ @@ -29512,16 +29562,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) -"hKi" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/closet/secure_closet/bar{ - req_access_txt = "25" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "hKu" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower, /obj/structure/closet/emcloset, @@ -29600,32 +29640,6 @@ /obj/item/clothing/under/color/lightpurple, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"hLj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/maintenance{ - name = "Bar Maintenance"; - req_access_txt = "0"; - req_one_access_txt = "12,25" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "hLI" = ( /obj/effect/turf_decal/trimline/blue/filled/line/lower, /turf/open/floor/plasteel/white, @@ -29716,21 +29730,6 @@ }, /turf/open/floor/wood/large, /area/crew_quarters/heads/captain) -"hOm" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 5 - }, -/turf/open/floor/wood/parquet, -/area/crew_quarters/bar) "hOn" = ( /obj/effect/turf_decal/bot_red, /obj/structure/rack, @@ -29954,10 +29953,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/mix) -"hRt" = ( -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/wood/parquet, -/area/crew_quarters/bar) "hRx" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/tile/random{ @@ -30610,6 +30605,27 @@ }, /turf/open/floor/plating, /area/security/main) +"ibt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/thin{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) "ibw" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/westright{ @@ -30706,6 +30722,15 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"icC" = ( +/obj/effect/turf_decal/ramp_middle, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plasteel/stairs/goon/wood_stairs_wide{ + dir = 1 + }, +/area/crew_quarters/bar) "icK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -31039,18 +31064,6 @@ }, /turf/open/floor/plasteel, /area/hydroponics) -"iiF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/ramp_corner{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) "iiJ" = ( /obj/machinery/ai/server_cabinet, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -31354,21 +31367,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/security/prison) -"ioB" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -5; - pixel_y = 30 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "ioR" = ( /obj/structure/table/wood, /obj/item/lipstick/random{ @@ -33124,20 +33122,6 @@ /obj/structure/table, /turf/open/floor/wood, /area/bridge/meeting_room) -"iVb" = ( -/obj/structure/plasticflaps{ - opacity = 1 - }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - freq = 1400; - location = "Bar" - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel{ - dir = 2 - }, -/area/crew_quarters/bar) "iVd" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -33617,6 +33601,15 @@ "jdO" = ( /turf/closed/wall, /area/medical/storage) +"jdT" = ( +/obj/effect/turf_decal/siding/wood/thin{ + dir = 1 + }, +/obj/effect/turf_decal/ramp_middle{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) "jec" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8; @@ -36181,6 +36174,18 @@ }, /turf/open/floor/plating, /area/engine/engineering) +"keq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "ket" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -37411,6 +37416,21 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/foyer) +"kDs" = ( +/obj/effect/turf_decal/ramp_middle, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/stairs/goon/wood_stairs_wide2{ + dir = 1 + }, +/area/crew_quarters/bar) "kDu" = ( /obj/effect/spawner/structure/window/reinforced/shutter, /obj/structure/cable{ @@ -37512,23 +37532,6 @@ /obj/structure/lattice/catwalk, /turf/closed/wall/r_wall, /area/engine/atmos/distro) -"kFa" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/ramp_middle{ - dir = 1 - }, -/turf/open/floor/plasteel/stairs/goon/wood_stairs_wide2{ - dir = 1 - }, -/area/crew_quarters/bar) "kGn" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -37771,15 +37774,6 @@ icon_state = "platingdmg3" }, /area/maintenance/port) -"kLq" = ( -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/obj/effect/turf_decal/siding/wood/thin{ - dir = 4 - }, -/turf/open/floor/stone, -/area/crew_quarters/bar) "kLy" = ( /obj/item/stack/sheet/cardboard, /obj/effect/decal/cleanable/dirt, @@ -38093,18 +38087,6 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"kRj" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/reagentgrinder, -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/table, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "kRm" = ( /obj/machinery/light, /obj/machinery/airalarm{ @@ -38379,6 +38361,27 @@ }, /turf/open/floor/carpet, /area/security/detectives_office) +"kYv" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/airlock/glass{ + name = "Bar Counter"; + req_access_txt = "25" + }, +/obj/machinery/door/poddoor/preopen{ + id = "barshutters"; + name = "privacy shutter" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "kYK" = ( /turf/closed/wall/r_wall, /area/medical/genetics/cloning) @@ -39276,15 +39279,6 @@ }, /turf/open/floor/plasteel, /area/security/main) -"lna" = ( -/obj/effect/turf_decal/ramp_middle, -/obj/item/kirbyplants/random, -/obj/machinery/light/floor, -/obj/effect/turf_decal/ramp_middle{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) "lnf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -39760,18 +39754,6 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab) -"lxE" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "lxF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 @@ -39876,14 +39858,6 @@ }, /turf/open/floor/plasteel, /area/engine/foyer) -"lzS" = ( -/obj/effect/turf_decal/ramp_middle{ - dir = 1 - }, -/turf/open/floor/plasteel/stairs/goon/wood_stairs_middle{ - dir = 1 - }, -/area/crew_quarters/bar) "lAj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -41152,17 +41126,6 @@ /obj/machinery/anesthetic_machine/roundstart, /turf/open/floor/plasteel/white, /area/security/brig) -"mbi" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/ramp_middle{ - dir = 1 - }, -/turf/open/floor/plasteel/stairs/goon/wood_stairs_wide{ - dir = 1 - }, -/area/crew_quarters/bar) "mbz" = ( /obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 4 @@ -42434,21 +42397,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/disposal) -"myz" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/sink/kitchen{ - dir = 8; - pixel_x = 11 - }, -/obj/machinery/camera{ - c_tag = "Bar Storage"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "myO" = ( /obj/structure/chair{ dir = 8 @@ -43127,6 +43075,24 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"mJH" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "barcounter"; + name = "bar shutters" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "mJV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/plasteel, @@ -43143,6 +43109,28 @@ }, /turf/open/floor/plating, /area/maintenance/central) +"mJZ" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "barcounter"; + name = "bar shutters" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "mKD" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 1 @@ -43357,6 +43345,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) +"mOc" = ( +/obj/effect/turf_decal/ramp_middle, +/turf/open/floor/plasteel/stairs/goon/wood_stairs_middle{ + dir = 1 + }, +/area/crew_quarters/bar) "mOf" = ( /turf/closed/wall, /area/hallway/primary/aft) @@ -45046,19 +45040,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery) -"ntk" = ( -/obj/effect/turf_decal/siding/wood/thin{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/railing/corner, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/bar) "ntH" = ( /obj/structure/rack, /obj/item/storage/toolbox/electrical{ @@ -45623,6 +45604,31 @@ }, /turf/open/floor/plasteel/dark, /area/janitor) +"nDw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Bar Maintenance"; + req_access_txt = "12" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "nDx" = ( /obj/machinery/door/poddoor{ id = "Secure Storage"; @@ -45773,6 +45779,15 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) +"nHi" = ( +/obj/structure/curtain, +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/preopen{ + id = "barshutters"; + name = "privacy shutter" + }, +/turf/open/floor/plating, +/area/crew_quarters/bar) "nHm" = ( /obj/structure/closet/wardrobe/pjs, /turf/open/floor/plasteel, @@ -46049,24 +46064,6 @@ }, /turf/open/floor/plasteel, /area/security/processing) -"nMW" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/table/wood, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "barcounter"; - name = "bar shutters" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "nNg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -46377,15 +46374,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"nUi" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "nUx" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -48314,6 +48302,15 @@ /obj/machinery/suit_storage_unit/security, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) +"oGg" = ( +/obj/machinery/reagentgrinder, +/obj/structure/table, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "oGk" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/reagent_dispensers/watertank, @@ -48944,13 +48941,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) -"oSG" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/turf/closed/wall, -/area/crew_quarters/bar) "oSN" = ( /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 4 @@ -50292,6 +50282,13 @@ }, /turf/open/floor/plasteel/white, /area/science/nanite) +"prS" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/griddle, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) "psj" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -51688,14 +51685,6 @@ }, /turf/closed/wall, /area/lawoffice) -"pRU" = ( -/obj/machinery/camera{ - c_tag = "Kitchen North"; - dir = 2 - }, -/obj/machinery/griddle, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) "pSb" = ( /obj/structure/table, /obj/item/wrench, @@ -51715,24 +51704,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"pSn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/ramp_corner{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) "pSY" = ( /obj/structure/chair/office/dark{ dir = 8 @@ -52198,6 +52169,16 @@ "qaO" = ( /turf/closed/wall/r_wall, /area/security/interrogation) +"qbo" = ( +/obj/structure/closet/secure_closet/bar{ + req_access_txt = "25" + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "qbw" = ( /obj/structure/sign/departments/minsky/medical/virology/virology2{ pixel_y = -32 @@ -54412,6 +54393,21 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) +"qPX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/door/airlock/public/glass{ + name = "Fitness" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/wood/parquet, +/area/crew_quarters/bar) "qQa" = ( /obj/structure/cable{ icon_state = "4-8" @@ -54717,22 +54713,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"qWa" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/door/airlock/public/glass{ - name = "Fitness" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood/parquet, -/area/crew_quarters/bar) "qWk" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -54949,6 +54929,12 @@ }, /turf/open/water/safe, /area/hydroponics/garden) +"raM" = ( +/obj/effect/turf_decal/ramp_middle, +/obj/item/kirbyplants/random, +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/crew_quarters/bar) "rbs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8; @@ -55060,16 +55046,6 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) -"rcL" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/turf_decal/ramp_middle, -/turf/open/floor/plasteel/stairs/goon/stairs_wide, -/area/crew_quarters/fitness) "rdi" = ( /obj/structure/mopbucket, /obj/item/caution, @@ -55967,6 +55943,14 @@ }, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) +"rva" = ( +/obj/effect/turf_decal/ramp_middle{ + dir = 1 + }, +/turf/open/floor/plasteel/stairs/goon/stairs2_wide{ + dir = 1 + }, +/area/crew_quarters/fitness) "rvc" = ( /obj/machinery/light, /obj/item/radio/intercom{ @@ -59190,6 +59174,19 @@ }, /turf/open/floor/plasteel, /area/quartermaster/office) +"sFe" = ( +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/cable_coil, +/obj/item/flashlight/lamp, +/obj/item/flashlight/lamp/green, +/obj/structure/closet/secure_closet/bartender, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "sFl" = ( /obj/effect/spawner/structure/window/reinforced/shutter, /obj/machinery/door/poddoor/preopen{ @@ -60721,6 +60718,15 @@ }, /turf/open/floor/plasteel, /area/security/main) +"thp" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "thr" = ( /obj/structure/table, /obj/machinery/reagentgrinder/kitchen{ @@ -61081,6 +61087,30 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/stone, /area/crew_quarters/heads/captain) +"tou" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/bar"; + dir = 8; + name = "Bar APC"; + pixel_x = -25 + }, +/turf/open/floor/wood/parquet, +/area/crew_quarters/bar) "toz" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -61357,14 +61387,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmos/storage) -"tuR" = ( -/obj/machinery/door/poddoor/preopen{ - id = "barshutters"; - name = "privacy shutter" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/crew_quarters/bar) "tvb" = ( /obj/structure/alien/weeds, /obj/effect/spawner/lootdrop/two_percent_xeno_egg_spawner, @@ -61659,26 +61681,6 @@ /obj/machinery/light, /turf/open/floor/plasteel/white, /area/storage/tech) -"tBu" = ( -/obj/machinery/smartfridge/drinks{ - icon_state = "boozeomat" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "barcounter"; - name = "bar shutters" - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "tBG" = ( /obj/structure/railing, /turf/open/floor/wood, @@ -61916,6 +61918,10 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/ai_monitored/turret_protected/ai) +"tGC" = ( +/obj/machinery/griddle, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) "tGM" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -61987,12 +61993,6 @@ /obj/effect/turf_decal/trimline/darkblue/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/primary/central) -"tHC" = ( -/obj/effect/turf_decal/ramp_middle{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) "tHI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -63437,15 +63437,14 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"uki" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ +"ukz" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/siding/wood/thin{ dir = 8 }, -/obj/effect/turf_decal/ramp_middle, -/turf/open/floor/wood, +/obj/structure/table, +/obj/item/storage/box/cups, +/turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "ukK" = ( /obj/machinery/door/airlock/command{ @@ -63938,25 +63937,6 @@ }, /turf/open/floor/plasteel/dark, /area/tcommsat/storage) -"uuQ" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/sign/poster/random{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "uuW" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -64010,6 +63990,16 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"uwv" = ( +/obj/structure/railing, +/obj/effect/turf_decal/siding/wood/thin{ + dir = 1 + }, +/obj/effect/turf_decal/ramp_corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) "uwD" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/layer2{ dir = 1 @@ -64463,13 +64453,6 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) -"uFg" = ( -/obj/structure/railing, -/obj/effect/turf_decal/siding/wood/corner/thin{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/bar) "uFo" = ( /obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 4 @@ -64792,24 +64775,6 @@ /obj/effect/turf_decal/siding/wood/thin, /turf/open/floor/stone, /area/crew_quarters/bar) -"uKp" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/door/airlock{ - name = "Bar Storage"; - req_access_txt = "25" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) "uKB" = ( /obj/machinery/meter, /obj/structure/sign/warning/nosmoking{ @@ -67689,6 +67654,22 @@ }, /turf/open/floor/plating, /area/quartermaster/miningdock) +"vIY" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) "vJi" = ( /obj/machinery/light/small{ dir = 4 @@ -71010,18 +70991,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"wZf" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/turf_decal/ramp_middle{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) "wZs" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plating{ @@ -71334,15 +71303,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"xgE" = ( -/obj/effect/turf_decal/ramp_middle, -/obj/item/kirbyplants/random, -/obj/machinery/light/floor, -/obj/effect/turf_decal/ramp_middle{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) "xgF" = ( /obj/machinery/light, /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, @@ -71823,10 +71783,6 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) -"xqi" = ( -/obj/machinery/the_singularitygen, -/turf/open/floor/plating, -/area/engine/engineering) "xqr" = ( /obj/structure/rack, /obj/effect/turf_decal/stripes/corner, @@ -72299,6 +72255,20 @@ "xyU" = ( /turf/closed/wall, /area/engine/atmos/storage) +"xza" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/ramp_middle{ + dir = 1 + }, +/turf/open/floor/plasteel/stairs/goon/stairs_wide{ + dir = 1 + }, +/area/crew_quarters/fitness) "xzh" = ( /obj/machinery/telecomms/bus/preset_two, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -73561,21 +73531,6 @@ }, /turf/open/floor/plasteel, /area/security/main) -"xZt" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/ramp_middle, -/turf/open/floor/wood, -/area/crew_quarters/bar) "xZv" = ( /obj/machinery/door/window/northleft{ base_state = "right"; @@ -100915,7 +100870,7 @@ bCq uzc ccw ppM -xqi +wil bQa cmD cmD @@ -108563,8 +108518,8 @@ qQV qQV qQV aql -tuR -aql +kYv +rNJ aql aql rNJ @@ -109327,12 +109282,12 @@ lmi bTo aql uHe -uuQ +vIY +gFr wIl -lxE -uKp +fli +gsn bFZ -nUi xic dKY tEy @@ -109583,13 +109538,13 @@ wiV gSB wcU aql -hKi +oGg jTj sGs -exZ -aql -ioB sGs +gcx +aql +cGb cGS vMK tEy @@ -109597,9 +109552,9 @@ xdm oXZ aFd aFd -gWx -lna -iiF +uwv +raM +dIf aCr aql cuA @@ -109841,22 +109796,22 @@ gSB uyg aql crx -apR -myz +bAV +dyX +fUW vft aql -kRj sGs sGs sGs -eOe +mJZ sTA oXZ aFd hRB -ctq -mbi -aBP +ckB +icC +keq aCr nnM cIk @@ -110097,23 +110052,23 @@ rVP gSB mkr aql -fUp -cAH -oSG -esY +sFe +bPw +qbo +aql +cKv aql -tBu -nMW +hnF fie -gfA +mJH sTA bKr rDG aFd cFS -glZ -lzS -uki +jdT +mOc +dIf aCr inS cuA @@ -110352,25 +110307,25 @@ wiV wiV wiV tNU -ggj +for aql aql ayz saC -iVb aql -kLq +gtQ +aql +cxD mrf mrf mrf -dPv rDG kls inJ vBq -ntk -kFa -xZt +cPq +kDs +eWI aCr nnM tZF @@ -110609,13 +110564,13 @@ nJl nJl bnz khY -wZf -rcL -qWa +thp +xza +qPX col hQg -hOm -hRt +tou +aFd aFd cFS aFd @@ -110625,9 +110580,9 @@ aFd oeV vcp djq -uFg -xgE -pSn +dFa +raM +joU czU aql cuA @@ -110866,8 +110821,8 @@ sqh oNb aZW oXE -tHC -gJD +sqh +rva aCh aFd aFd @@ -111127,8 +111082,8 @@ aAh aAh rME aFf -chl -bYj +ukz +ibt ckQ jCi mpT @@ -111143,7 +111098,7 @@ cyr aPl qiP aCr -inS +nHi cuA aYV cwO @@ -111385,7 +111340,7 @@ iVG aAh aAh aAh -hLj +nDw fgc fgc sYS @@ -111400,7 +111355,7 @@ fgc xYx qiP aCr -inS +nHi cuA aYV duH @@ -112158,7 +112113,7 @@ ota aAh aEH fgc -pRU +aMT fKR iyy mAp @@ -112171,7 +112126,7 @@ mtr rpB pur rpB -inS +ens cuA aYV nlS @@ -112415,7 +112370,7 @@ aAh aAh ceK fgc -tFi +tGC fKR tIF fKR @@ -112428,7 +112383,7 @@ mtr rpB jja qKv -inS +ens cuA aYV rRR @@ -112672,7 +112627,7 @@ fgC aAh aEH fgc -aUz +tFi xem xoK rUu @@ -113184,7 +113139,7 @@ aAh aAh nel iuq -pCi +aEH clh lLF vfy @@ -113434,10 +113389,10 @@ aro aro aDf gXs -alP syq syq -eCa +syq +bQb alP iuq anf @@ -113690,265 +113645,265 @@ aro aro aro aDf -gXs -aoq -syq -syq -syq -rjG -anf -anf -iNv -fwD -ecG -vFU -irT -ooT -fgc -rUu -jHT -fKR -thr -jMv -pTO -lCz -nXC -jMv -cuA -aYV -lmt -lcC -jwN -vcC -qMb -iBh -nxT -cKt -nEH -rTC -hQW -cRC -lYv -aiD -vqa -lMN -pfg -lMy -hzV -krt -uFr -lUn -faj -uWK -eNx -smo -tEx -jxu -aax -cpO -qbG -uOh -bNd -bNd -bNd -bNd -bNd -bNd -oGk -liS -bzs -bzs -uxA -cIh -tvq -llz -bHd -oOo -rFe -bzs -bzs -bzs -cmd -cmd -cmd -fKW -svh -dzz -eDN -xBp -pPW -iGK -pPW -feM -uzn -ufD -aaa -aaa -bPq -pkF -sXV -tgv -oBt -dgV -pyG -vmm -vmm -bSJ -vmm -vmm -gBP -vxS -qlI -gtB -pEf -pEf -pEf -aaa -aKN -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aoV -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(155,1,1) = {" -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aDf -aro -aro -aro -aro -aro -aro -aro -aro -aro -aro -aDf +cYj +syq +syq +syq +syq +rjG +anf +anf +iNv +fwD +ecG +vFU +irT +ooT +fgc +rUu +jHT +fKR +thr +jMv +pTO +lCz +nXC +jMv +cuA +aYV +lmt +lcC +jwN +vcC +qMb +iBh +nxT +cKt +nEH +rTC +hQW +cRC +lYv +aiD +vqa +lMN +pfg +lMy +hzV +krt +uFr +lUn +faj +uWK +eNx +smo +tEx +jxu +aax +cpO +qbG +uOh +bNd +bNd +bNd +bNd +bNd +bNd +oGk +liS +bzs +bzs +uxA +cIh +tvq +llz +bHd +oOo +rFe +bzs +bzs +bzs +cmd +cmd +cmd +fKW +svh +dzz +eDN +xBp +pPW +iGK +pPW +feM +uzn +ufD aaa -alP +aaa +bPq +pkF +sXV +tgv +oBt +dgV +pyG +vmm +vmm +bSJ +vmm +vmm +gBP +vxS +qlI +gtB +pEf +pEf +pEf +aaa +aKN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aoV +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +"} +(155,1,1) = {" +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aDf +aro +aro +aro +aro +aro +aro +aro +aro +aro +aro +aDf +uBx +syq syq syq syq @@ -113962,7 +113917,7 @@ kfW sFE cju fgc -hBl +fjo jGi krr bCC @@ -114219,7 +114174,7 @@ fgc fgc nXX fgc -bdG +prS fKR noJ wCY @@ -114476,7 +114431,7 @@ cIg fgc fgc fgc -aUz +tFi fbU fKR fKR diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 820e3273cb44..4031e8d60df1 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -506,6 +506,8 @@ for(var/datum/department_goal/dg in SSYogs.department_goals) goals[dg.account] += dg.get_result() + parts += "
    Money diverted from non-human paychecks by NT: $[GLOB.stolen_paycheck_money]
    " + parts += "
    [span_header("Engineering department goals:")]
    " parts += goals[ACCOUNT_ENG] diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 2ac99ba992bf..7e17893af9b9 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -68,8 +68,6 @@ /datum/config_entry/flag/disable_human_mood -/datum/config_entry/flag/force_human_mood // force every human to have mood enabled, this overwrites disabling it. - /datum/config_entry/flag/disable_secborg // disallow secborg module to be chosen. /datum/config_entry/flag/disable_peaceborg diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 5e5d45502a66..9b4feca1519f 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -1,3 +1,6 @@ +GLOBAL_VAR_INIT(stolen_paycheck_money, 0) + + SUBSYSTEM_DEF(economy) name = "Economy" wait = 5 MINUTES diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 924b5b22ba79..a71908583fd0 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -893,66 +893,38 @@ SUBSYSTEM_DEF(job) return //bad mojo - if(SSmapping.config.cryo_spawn) - var/area/shuttle/arrival/A = GLOB.areas_by_type[/area/crew_quarters/cryopods] - if(A) - var/list/pods = list() - var/list/unoccupied_pods = list() - for(var/obj/machinery/cryopod/pod in A) - pods |= pod - if(!pod.occupant) - unoccupied_pods |= pod - if(length(unoccupied_pods)) //if we have any unoccupied ones - destination = pick(unoccupied_pods) - else if(length(pods)) - destination = pick(pods) //if they're all full somehow?? - else //no pods at all - var/list/available = list() - for(var/turf/T in A) - if(!T.is_blocked_turf(TRUE)) - available += T - if(length(available)) - destination = pick(available) - if(destination) - destination.JoinPlayerHere(M, FALSE) - else - var/msg = "Unable to send mob [M] to late join (CRYOPODS)!" - message_admins(msg) - CRASH(msg) + var/area/shuttle/arrival/A = GLOB.areas_by_type[/area/shuttle/arrival] + if(A) + //first check if we can find a chair + var/obj/structure/chair/C = locate() in A + if(C) + C.JoinPlayerHere(M, buckle) + return - else - var/area/shuttle/arrival/A = GLOB.areas_by_type[/area/shuttle/arrival] - if(A) - //first check if we can find a chair - var/obj/structure/chair/C = locate() in A - if(C) - C.JoinPlayerHere(M, buckle) - return + //last hurrah + var/list/avail = list() + for(var/turf/T in A) + if(!T.is_blocked_turf(TRUE)) + avail += T + if(avail.len) + destination = pick(avail) + destination.JoinPlayerHere(M, FALSE) + return - //last hurrah - var/list/avail = list() - for(var/turf/T in A) - if(!T.is_blocked_turf(TRUE)) - avail += T - if(avail.len) - destination = pick(avail) - destination.JoinPlayerHere(M, FALSE) + //pick an open spot on arrivals and dump em + var/list/arrivals_turfs = shuffle(get_area_turfs(/area/shuttle/arrival)) + if(arrivals_turfs.len) + for(var/turf/T in arrivals_turfs) + if(!T.is_blocked_turf(TRUE)) + T.JoinPlayerHere(M, FALSE) return - - //pick an open spot on arrivals and dump em - var/list/arrivals_turfs = shuffle(get_area_turfs(/area/shuttle/arrival)) - if(arrivals_turfs.len) - for(var/turf/T in arrivals_turfs) - if(!T.is_blocked_turf(TRUE)) - T.JoinPlayerHere(M, FALSE) - return - //last chance, pick ANY spot on arrivals and dump em - destination = arrivals_turfs[1] - destination.JoinPlayerHere(M, FALSE) - else - var/msg = "Unable to send mob [M] to late join!" - message_admins(msg) - CRASH(msg) + //last chance, pick ANY spot on arrivals and dump em + destination = arrivals_turfs[1] + destination.JoinPlayerHere(M, FALSE) + else + var/msg = "Unable to send mob [M] to late join!" + message_admins(msg) + CRASH(msg) ///Lands specified mob at a random spot in the hallways /datum/controller/subsystem/job/proc/DropLandAtRandomHallwayPoint(mob/living/living_mob) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 5258e8619182..5906283a23d3 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -436,7 +436,6 @@ GLOBAL_LIST_EMPTY(the_station_areas) else for(var/M in global.config.maplist) mapvotes[M] = 1 - var/previous_maps = get_map_weights() //filter votes for (var/map in mapvotes) @@ -458,9 +457,6 @@ GLOBAL_LIST_EMPTY(the_station_areas) if (VM.config_max_users > 0 && players > VM.config_max_users) mapvotes.Remove(map) continue - if(previous_maps[VM.map_name] > 7) - mapvotes.Remove(map) - continue if(pmv) mapvotes[map] = mapvotes[map]*VM.voteweight @@ -860,27 +856,3 @@ GLOBAL_LIST_EMPTY(the_station_areas) /datum/controller/subsystem/mapping/proc/get_reservation_from_turf(turf/T) RETURN_TYPE(/datum/turf_reservation) return used_turfs[T] - - -/datum/controller/subsystem/mapping/proc/get_map_weights() - var/list/previous_maps = list() - if(SSdbcore.Connect()) - var/datum/DBQuery/query_previous_maps = SSdbcore.NewQuery({" - SELECT map_name FROM [format_table_name("round")] WHERE id BETWEEN lower = :lower AND upper = :upper - "}, list("lower" = "[text2num(GLOB.round_id) - 9]", "upper" = GLOB.round_id)) - if(!query_previous_maps.Execute()) - qdel(query_previous_maps) - for(var/i = 1 to 10) - var/next_map = query_previous_maps.NextRow() - if(!next_map) - continue - previous_maps[next_map[1]] += 1 / (11 - i) //this lessens the influence of rounds that were longer ago - qdel(query_previous_maps) - return previous_maps - -/client/proc/DebugMapWeights() - set name = "See Map Weights" - set category = "Misc.Server Debug" - var/weights = SSmapping.get_map_weights() - for(var/key in weights) - to_chat(src, "[key]: weights[key]") diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 420054953b8c..50090137f5e7 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -190,7 +190,6 @@ SUBSYSTEM_DEF(vote) if(!lower_admin && SSmapping.map_voted) to_chat(usr, span_warning("The next map has already been selected.")) return FALSE - var/list/previous_maps = SSmapping.get_map_weights() // Randomizes the list so it isn't always METASTATION var/list/maps = list() for(var/map in global.config.maplist) @@ -201,8 +200,6 @@ SUBSYSTEM_DEF(vote) continue if(VM.config_max_users > 0 && GLOB.clients.len > VM.config_max_users) continue - if(previous_maps[VM.map_name] > 7) - continue maps += VM.map_name shuffle_inplace(maps) for(var/valid_map in maps) diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index e246ccaa4620..b5c72aa16ddf 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -24,7 +24,6 @@ var/space_empty_levels = 1 var/minetype = "lavaland" - var/cryo_spawn = FALSE var/allow_custom_shuttles = TRUE var/shuttles = list( @@ -136,9 +135,6 @@ if ("minetype" in json) minetype = json["minetype"] - if("cryo_spawn" in json) - cryo_spawn = json["cryo_spawn"] - allow_custom_shuttles = json["allow_custom_shuttles"] != FALSE #ifdef UNIT_TESTS diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 973b7e39f7d9..8fb9435b6e7c 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -432,27 +432,3 @@ GLOBAL_VAR_INIT(cryopods_enabled, FALSE) log_admin(span_notice("[key_name(target)] entered a stasis pod.")) message_admins("[key_name_admin(target)] entered a stasis pod. (
    JMP)") add_fingerprint(target) - -/obj/machinery/cryopod/JoinPlayerHere(mob/M, buckle) - . = ..() - open_machine() - if(iscarbon(M)) - apply_effects_to_mob(M) - -/obj/machinery/cryopod/proc/apply_effects_to_mob(mob/living/carbon/sleepyhead) - to_chat(sleepyhead, span_boldnotice("You begin to wake from cryosleep...")) - sleepyhead.set_nutrition(200) - sleepyhead.SetSleeping(60) //if you read this comment and feel like shitting together something to adjust IPC charge on wakeup, be my guest. - //but it can be worse. - if(prob(90)) - sleepyhead.adjust_drowsiness(rand(3 SECONDS, 10 SECONDS)) - if(prob(75)) - sleepyhead.blur_eyes(rand(3, 6)) - //so much worse - if(prob(66)) - sleepyhead.adjust_disgust(rand(25,35)) - if(prob(33)) - sleepyhead.adjust_disgust(rand(20,30)) - if(prob(16)) - sleepyhead.adjust_disgust(rand(10, 17)) - to_chat(sleepyhead, "The symptoms of cryosleep set in as you awaken...") diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index c2d0def5a4cd..2ad7a3249231 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -84,7 +84,7 @@ addtimer(CALLBACK(src, PROC_REF(set_ready_state), 1), equip_cooldown) /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser - equip_cooldown = 5 + equip_cooldown = 8 name = "\improper CH-PS \"Immolator\" laser" desc = "A weapon for combat exosuits. Shoots basic lasers." icon_state = "mecha_laser" diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 36a2edb21125..443abb3556c8 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -77,8 +77,8 @@ user.add_atom_colour(paint_color, ADMIN_COLOUR_PRIORITY) return (BRUTELOSS|OXYLOSS) -/obj/item/toy/crayon/proc/min_value(color = "#000000") // Makes the paint color brighter if it is below quarter bright (V < 64) - var/list/read = ReadRGB(color) // Converts the RGB string into a list +/obj/item/toy/crayon/proc/min_value() // Makes the paint color brighter if it is below quarter bright (V < 64) + var/list/read = ReadRGB(paint_color) // Converts the RGB string into a list var/value = max(read) // Reads the V from HSV, essentially the brightness if(value >= 64) // Min V is 64, 3 quarters to black from white @@ -94,7 +94,7 @@ read[2] = 64 read[3] = 64 - return rgb(read[1], read[2], read[3]) + paint_color = rgb(read[1], read[2], read[3]) /obj/item/toy/crayon/Initialize(mapload) . = ..() @@ -254,6 +254,7 @@ if("select_colour") if(can_change_colour) paint_color = input(usr,"","Choose Color",paint_color) as color|null + min_value() . = TRUE if("enter_text") var/txt = stripped_input(usr,"Choose what to write.", @@ -392,7 +393,7 @@ if(actually_paints) switch(paint_mode) if(PAINT_NORMAL) - var/obj/effect/decal/cleanable/crayon/C = new(target, min_value(paint_color), drawing, temp, graf_rot) + var/obj/effect/decal/cleanable/crayon/C = new(target, paint_color, drawing, temp, graf_rot) C.add_hiddenprint(user) C.pixel_x = clickx C.pixel_y = clicky @@ -401,7 +402,7 @@ var/turf/left = locate(target.x-1,target.y,target.z) var/turf/right = locate(target.x+1,target.y,target.z) if(isValidSurface(left) && isValidSurface(right)) - var/obj/effect/decal/cleanable/crayon/C = new(left, min_value(paint_color), drawing, temp, graf_rot, PAINT_LARGE_HORIZONTAL_ICON) + var/obj/effect/decal/cleanable/crayon/C = new(left, paint_color, drawing, temp, graf_rot, PAINT_LARGE_HORIZONTAL_ICON) C.add_hiddenprint(user) affected_turfs += left affected_turfs += right @@ -522,6 +523,7 @@ /obj/item/toy/crayon/rainbow/afterattack(atom/target, mob/user, proximity, params) paint_color = rgb(rand(0,255), rand(0,255), rand(0,255)) + min_value() . = ..() /* @@ -680,7 +682,7 @@ if(ishuman(C) && actually_paints) var/mob/living/carbon/human/H = C H.lip_style = "spray_face" - H.lip_color = min_value(paint_color) + H.lip_color = paint_color H.update_body() . = use_charges(user, 10, FALSE) @@ -691,9 +693,9 @@ if(isobj(target)) if(actually_paints) - target.add_atom_colour(min_value(paint_color), WASHABLE_COLOUR_PRIORITY) + target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY) if(istype(target, /obj/structure/window)) - if(color_hex2num(min_value(paint_color)) < 255) + if(color_hex2num(paint_color) < 255) target.set_opacity(255) else target.set_opacity(initial(target.opacity)) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index be778330de37..b8058ba0791c 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -540,12 +540,9 @@ GLOBAL_LIST_EMPTY(servant_golem_users) shoes = /obj/item/clothing/shoes/combat gloves = /obj/item/clothing/gloves/combat ears = /obj/item/radio/headset/syndicate/alt + back = /obj/item/storage/backpack implants = list(/obj/item/implant/weapons_auth) id = /obj/item/card/id/syndicate - back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H) H.faction |= ROLE_SYNDICATE @@ -562,10 +559,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) l_pocket = /obj/item/gun/ballistic/automatic/pistol r_pocket = /obj/item/kitchen/knife/combat/survival belt = /obj/item/storage/belt/military/assault - back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/battlecruiser/assault name = "Syndicate Battlecruiser Assault Operative" @@ -584,9 +577,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) suit_store = /obj/item/gun/ballistic/automatic/pistol back = /obj/item/storage/backpack/security mask = /obj/item/clothing/mask/gas/syndicate - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/battlecruiser/captain name = "Syndicate Battlecruiser Captain" @@ -606,9 +596,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) head = /obj/item/clothing/head/HoS/syndicate mask = /obj/item/clothing/mask/cigarette/cigar/havana glasses = /obj/item/clothing/glasses/thermal/eyepatch - backpack_contents = list( - /obj/item/storage/box/syndie - ) //Icemoon Syndicate. Players become research agents working under a Syndicate research station. /obj/effect/mob_spawn/human/syndicate/icemoon_syndicate //generic version @@ -627,10 +614,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) r_pocket = /obj/item/tank/internals/emergency_oxygen/double mask = /obj/item/clothing/mask/gas/syndicate id = /obj/item/card/id/syndicate/anyone - back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/icemoon_syndicate/security name = "Syndicate Outpost Security Officer" @@ -646,10 +629,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) mask = /obj/item/clothing/mask/gas //i want them to look like the generic operative NPC belt = /obj/item/storage/belt/security/full //take like one guy alive glasses = /obj/item/clothing/glasses/hud/security/sunglasses //identify the job of whoever the fuck is breaking in at a glance - back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/icemoon_syndicate/sci name = "Syndicate Outpost Researcher" @@ -664,10 +643,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) suit = /obj/item/clothing/suit/toggle/labcoat/science accessory = /obj/item/clothing/accessory/armband/science glasses = /obj/item/clothing/glasses/hud/diagnostic/sunglasses/rd //it's a syndicate nerd - back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/icemoon_syndicate/engineer name = "Syndicate Outpost Engineer" @@ -683,10 +658,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) head = /obj/item/clothing/head/hardhat accessory = /obj/item/clothing/accessory/armband/engine glasses = /obj/item/clothing/glasses/meson/sunglasses/ce - back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/icemoon_syndicate/medic name = "Syndicate Outpost Doctor" @@ -701,10 +672,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) suit = /obj/item/clothing/suit/toggle/labcoat/md //I AM A SURGEON!! glasses = /obj/item/clothing/glasses/hud/health/sunglasses/cmo //rapid hurt and chemical identification accessory = /obj/item/clothing/accessory/armband/medblue - back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/icemoon_syndicate/commander name = "Syndicate Outpost Commander" @@ -726,12 +693,7 @@ GLOBAL_LIST_EMPTY(servant_golem_users) back = /obj/item/storage/backpack/satchel/leather //LUXURY AT ITS FINEST suit_store = /obj/item/gun/ballistic/revolver belt = /obj/item/storage/belt/sabre //ceremonial shamnk - backpack_contents = list( - /obj/item/storage/box/syndie, - /obj/item/modular_computer/tablet/preset/syndicate=1, - /obj/item/ammo_box/a357=2, - /obj/item/melee/classic_baton/telescopic=1 - ) + backpack_contents = list(/obj/item/modular_computer/tablet/preset/syndicate=1, /obj/item/ammo_box/a357=2, /obj/item/melee/classic_baton/telescopic=1) //Icemoon Hermit. Player becomes a individual who sook out shelter from society by running away. @@ -936,9 +898,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) l_pocket = /obj/item/flashlight r_pocket = /obj/item/kitchen/knife/combat/survival implants = list(/obj/item/implant/weapons_auth) - backpack_contents = list( - /obj/item/storage/box/syndie - ) /datum/outfit/syndicate_derelict_engi/post_equip(mob/living/carbon/human/H) H.faction |= ROLE_SYNDICATE diff --git a/code/game/objects/structures/lavaland/steam_fissure.dm b/code/game/objects/structures/lavaland/steam_fissure.dm deleted file mode 100644 index 4051cec44d95..000000000000 --- a/code/game/objects/structures/lavaland/steam_fissure.dm +++ /dev/null @@ -1,48 +0,0 @@ -#define STEAM_BUILDUP_RATE 0.75 -#define STEAM_RELEASE_RATE 0.5 - -/obj/structure/steam_fissure - name = "geothermal fissure" - desc = "A crack in the ground where hot steam rises to the surface." - icon = 'icons/obj/lavaland/terrain.dmi' - icon_state = "geyser" - anchored = TRUE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF // you can't destroy a hole in the ground - - ///Gas ID spawned - var/gas_id = GAS_H2O - ///Temperature of the released gas - var/steam_production_temp = T0C+800 - ///Maximum pressure it can get to - var/pressure_limit = ONE_ATMOSPHERE*100 - ///Internal gas mixture - var/datum/gas_mixture/contained - -/obj/structure/steam_fissure/Initialize(mapload) - . = ..() - contained = new() - START_PROCESSING(SSobj, src) - -/obj/structure/steam_fissure/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/structure/steam_fissure/process(delta_time) - var/pressure_delta = pressure_limit - contained.return_pressure() - if(pressure_delta > 0) - var/production = (pressure_delta * STEAM_BUILDUP_RATE) * contained.return_volume() / (R_IDEAL_GAS_EQUATION * steam_production_temp) - var/heat_delta = (steam_production_temp - contained.return_temperature()) * (GLOB.gas_data.specific_heats[gas_id]*production) / ((GLOB.gas_data.specific_heats[gas_id]*production) + contained.heat_capacity()) - contained.adjust_moles(gas_id, production) - contained.set_temperature(contained.return_temperature() + heat_delta) - - if(!isopenturf(loc)) - return - - var/turf/open/T = loc - pressure_delta = contained.return_pressure() - T.air.return_pressure() - if(pressure_delta > 0) - T.assume_air(contained.remove_ratio(STEAM_RELEASE_RATE)) - T.air_update_turf() - -#undef STEAM_BUILDUP_RATE -#undef STEAM_RELEASE_RATE diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 9dde10f43dd8..b8924ae03639 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1169,7 +1169,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(iscarbon(target)) var/mob/living/carbon/CM = target for(var/obj/item/bodypart/bodypart in CM.bodyparts) - if(!(bodypart.body_part & (HEAD|CHEST))) + if(bodypart.body_part != HEAD && bodypart.body_part != CHEST) if(bodypart.dismemberable) bodypart.dismember() if(ADMIN_PUNISHMENT_GIB) diff --git a/code/modules/antagonists/bloodsuckers/powers/targeted/tzimisce.dm b/code/modules/antagonists/bloodsuckers/powers/targeted/tzimisce.dm index 7a5cb4209821..13b0e9abde0c 100644 --- a/code/modules/antagonists/bloodsuckers/powers/targeted/tzimisce.dm +++ b/code/modules/antagonists/bloodsuckers/powers/targeted/tzimisce.dm @@ -143,7 +143,7 @@ if(ishuman(target)) var/mob/living/carbon/human/H = target for(var/obj/item/bodypart/bodypart in H.bodyparts) - if(bodypart.body_part & (HEAD|CHEST)) + if(bodypart.body_part != HEAD && bodypart.body_part != CHEST) if(bodypart.dismemberable) bodypart.dismember() qdel(bodypart) @@ -154,7 +154,7 @@ if(iscarbon(target)) var/mob/living/carbon/C = target for(var/obj/item/bodypart/bodypart in C.bodyparts) - if(!(bodypart.body_part & (HEAD|CHEST))) + if(bodypart.body_part != HEAD && bodypart.body_part != CHEST) if(bodypart.dismemberable) bodypart.dismember() qdel(bodypart) diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 5bba3f117cf6..48318064622b 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -227,7 +227,7 @@ var/mob/living/carbon/carbon_target_mob = target_living for (var/bp in carbon_target_mob.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands var/obj/item/bodypart/bodypart = bp - if(!(bodypart.body_part & (HEAD|CHEST)))//we dont want to kill him, just teach em a lesson! + if(bodypart.body_part != HEAD && bodypart.body_part != CHEST)//we dont want to kill him, just teach em a lesson! if (bodypart.dismemberable) bodypart.dismember() //Using the power of flextape i've sawed this man's limb in half! break diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 508e998206e4..708172d985c4 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -3,6 +3,7 @@ /datum/bank_account var/account_holder = "Rusty Venture" var/account_balance = 0 + var/payday_modifier var/datum/job/account_job var/list/bank_cards = list() var/add_to_accounts = TRUE @@ -13,7 +14,7 @@ var/bounties_claimed = 0 // Marks how many bounties this person has successfully claimed var/sec_weapon_claimed = FALSE // If this account has claimed a weapon \code\modules\vending\security_armaments.dm -/datum/bank_account/New(newname, job) +/datum/bank_account/New(newname, job, modifier = 1) var/limiter = 0 while(limiter < 10) account_id = rand(111111,999999) @@ -28,6 +29,7 @@ SSeconomy.bank_accounts["[account_id]"] = src account_holder = newname account_job = job + payday_modifier = modifier /datum/bank_account/Destroy() if(add_to_accounts) @@ -66,7 +68,9 @@ return FALSE /datum/bank_account/proc/payday(amt_of_paychecks, free = FALSE) - var/money_to_transfer = account_job.paycheck * amt_of_paychecks + var/money_to_transfer = account_job.paycheck * payday_modifier * amt_of_paychecks + var/stolen_money = (1 - payday_modifier) * account_job.paycheck * amt_of_paychecks + GLOB.stolen_paycheck_money += stolen_money if(free) adjust_money(money_to_transfer) return TRUE diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index a044c675f4d4..52485432cc39 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -189,7 +189,7 @@ H.apply_pref_name(/datum/preference/name/backup_human, preference_source) if(!visualsOnly) - var/datum/bank_account/bank_account = new(H.real_name, src) + var/datum/bank_account/bank_account = new(H.real_name, src, H.dna.species.payday_modifier) bank_account.adjust_money(rand(STARTING_PAYCHECKS_MIN, STARTING_PAYCHECKS_MAX), TRUE) bank_account.payday(STARTING_PAYCHECKS, TRUE) H.account_id = bank_account.account_id diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index b798d1c85e75..cfe4981644bb 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -15,7 +15,7 @@ outfit = /datum/outfit/job/roboticist added_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_XENOBIOLOGY, ACCESS_GENETICS, ACCESS_RND) - base_access = list(ACCESS_ROBOTICS, ACCESS_ROBO_CONTROL, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MECH_SCIENCE, ACCESS_MECH_ENGINE, ACCESS_MECH_MEDICAL, ACCESS_MECH_MINING, ACCESS_MINERAL_STOREROOM) + base_access = list(ACCESS_ROBO_CONTROL, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MECH_SCIENCE, ACCESS_MECH_ENGINE, ACCESS_MECH_MEDICAL, ACCESS_MECH_MINING, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_SCI diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 177916cf5bb2..395510720d20 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -99,6 +99,8 @@ GLOBAL_LIST_EMPTY(features_by_species) var/pressuremod = 1 /// multiplier for EMP severity var/emp_mod = 1 + /// multiplier for money paid at payday, species dependent + var/payday_modifier = 1 ///Type of damage attack does var/attack_type = BRUTE ///lowest possible punch damage. if this is set to 0, punches will always miss diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm index 49ed03017109..a835b6640dce 100644 --- a/code/modules/mob/living/carbon/human/species_types/IPC.dm +++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm @@ -24,6 +24,7 @@ exotic_blood = /datum/reagent/oil damage_overlay_type = "synth" limbs_id = "synth" + payday_modifier = 0.3 //Mass producible labor + robot, lucky to be paid at all pressuremod = 0.5 // from the moment i understood the weakness of my flesh it disgusted me heatmod = 0.5 // and i yearned for the certainty of steel burnmod = 1.25 // easily cut by laser cutters and welding tools to speed up manufacturing diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index c368723dba36..890dac7e8108 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -17,6 +17,7 @@ speedmod = -0.1 //Light and energy move quickly punchdamagehigh = 11 //Fire hand more painful punchstunthreshold = 11 //Still stuns on max hit, but subsequently lower chance to stun overall + payday_modifier = 0.7 //Moths have to be compensated slightly more to be willing to work for NT bcuz drug therapy, both ethereal and moth are neutral though attack_type = BURN //burn bish damage_overlay_type = "" //We are too cool for regular damage overlays species_traits = list(NOEYESPRITES, EYECOLOR, MUTCOLORS, AGENDER, HAIR, FACEHAIR, HAS_FLESH) // i mean i guess they have blood so they can have wounds too diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index ec31ef5643ae..0d21310381a0 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -17,6 +17,7 @@ coldmod = 6 heatmod = 0.5 burnmod = 0.5 // = 1/2x generic burn damage + payday_modifier = 0.6 //literally a pile of toxic ooze walking around, definitely a health hazard changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT species_language_holder = /datum/language_holder/jelly swimming_component = /datum/component/swimming/dissolve diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 3931d56bb2a9..0dfc2d7ad44d 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -15,6 +15,7 @@ mutanttail = /obj/item/organ/tail/lizard coldmod = 0.67 //used to being cold, just doesn't like it much heatmod = 0.67 //greatly appreciate heat, just not too much + payday_modifier = 0.85 //Full SIC citizens, but not quite given all the same rights- it's been an ongoing process for about half a decade default_features = list("mcolor" = "#00FF00", "tail_lizard" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs") changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index b9e726d8908d..5199dd4cd9db 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -5,6 +5,7 @@ say_mod = "flutters" default_color = "00FF00" species_traits = list(LIPS, NOEYESPRITES,HAS_FLESH,HAS_BONE) + payday_modifier = 0.8 //Neutral, but non-human; pay less if you can get away with it inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG mutant_bodyparts = list("moth_wings") default_features = list("moth_wings" = "Plain") diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 3002695e59be..3739d3c9dd6b 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -20,6 +20,7 @@ heatmod = 1.5 //Don't let the plasma actually heat up though punchdamagehigh = 7 //Bone punches are weak and usually inside soft suit gloves punchstunthreshold = 7 //Stuns on max hit as usual, somewhat higher stun chance because math + payday_modifier = 1 //Former humans, employment restrictions arise from psychological and practical concerns; they won't be able to be some head positions, but they get human pay and NT can't weasel out of it breathid = "tox" damage_overlay_type = ""//let's not show bloody wounds or burns over bones. disliked_food = NONE diff --git a/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm b/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm index c95dfc9d1115..82b6079d4fe6 100644 --- a/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm +++ b/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm @@ -21,6 +21,7 @@ inert_mutation = ACIDSPIT punchdamagehigh = 11 //slightly better high end of damage punchstunthreshold = 11 //technically slightly worse stunchance + payday_modifier = 0.3 //Some are quite literally slaves + they HAVE to work for NT damage_overlay_type = "polysmorph" deathsound = 'sound/voice/hiss6.ogg' screamsound = 'sound/voice/hiss5.ogg' diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 461f7e347f6c..24967d4ad9c7 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -410,7 +410,7 @@ mob/living/simple_animal/hostile/construct/attackby(obj/item/W, mob/living/user, var/undismembermerable_limbs = 0 for(var/X in C.bodyparts) var/obj/item/bodypart/BP = X - if(!(BP.body_part & (HEAD|CHEST))) + if(BP.body_part != HEAD && BP.body_part != CHEST) if(BP.dismemberable) parts += BP else diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm index db1dfd5faaa6..5b2dfa25ea99 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -49,7 +49,7 @@ if(C.stat >= UNCONSCIOUS) for(var/X in C.bodyparts) var/obj/item/bodypart/BP = X - if(!(BP.body_part & (HEAD|CHEST))) + if(BP.body_part != HEAD && BP.body_part != CHEST) if(BP.dismemberable) parts += BP return parts diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 64102eadea66..e551f28c6d25 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -110,11 +110,6 @@ if(turbine) turbine.locate_machinery() -/obj/machinery/power/compressor/multitool_act(mob/living/user, obj/item/multitool/tool) - tool.buffer = src - user.balloon_alert(user, "saved to buffer") - return TRUE - /obj/machinery/power/compressor/RefreshParts() var/E = 0 for(var/obj/item/stock_parts/manipulator/M in component_parts) @@ -220,14 +215,6 @@ if(compressor) compressor.locate_machinery() -/obj/machinery/power/turbine/multitool_act(mob/living/user, obj/item/multitool/tool) - if(!compressor) - user.balloon_alert(user, "no compressor!") - return TRUE - tool.buffer = compressor - user.balloon_alert(user, "saved to buffer") - return TRUE - /obj/machinery/power/turbine/process(delta_time) add_avail(lastgen) // add power in process() so it doesn't update power output separately from the rest of the powernet (bad) @@ -358,15 +345,6 @@ else compressor = locate(/obj/machinery/power/compressor) in range(7, src) -/obj/machinery/computer/turbine_computer/multitool_act(mob/living/user, obj/item/multitool/tool) - if(istype(tool.buffer, /obj/machinery/power/compressor)) - var/obj/machinery/power/compressor/new_link = tool.buffer - if(!new_link.comp_id) - new_link.comp_id = getnewid() - id = new_link.comp_id - user.balloon_alert(user, "linked!") - return TRUE - /obj/machinery/computer/turbine_computer/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index d1ca1265b8c2..2faa8787e543 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -133,9 +133,6 @@ r_pocket = /obj/item/gun/ballistic/automatic/pistol id = /obj/item/card/id/syndicate/anyone implants = list(/obj/item/implant/weapons_auth) - backpack_contents = list( - /obj/item/storage/box/syndie - ) /datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H) H.faction |= ROLE_SYNDICATE @@ -166,30 +163,20 @@ r_hand = /obj/item/melee/transforming/energy/sword/saber mask = /obj/item/clothing/mask/chameleon/gps suit = /obj/item/clothing/suit/armor/vest - back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie, - /obj/item/modular_computer/tablet/preset/syndicate=1 - ) + backpack_contents = list(/obj/item/modular_computer/tablet/preset/syndicate=1) /datum/outfit/lavaland_syndicate/comms/subordinate name = "Space Syndicate Comms Agent" r_hand = /obj/item/kitchen/knife/combat - back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /datum/outfit/lavaland_syndicate/comms/lieutenant name = "Space Syndicate Comms Agent Lieutenant" r_hand = /obj/item/melee/transforming/energy/sword/saber head = /obj/item/clothing/head/HoS/syndicate r_pocket = null - back = /obj/item/storage/backpack backpack_contents = list( - /obj/item/storage/box/syndie, /obj/item/modular_computer/tablet/preset/syndicate=1, - /obj/item/gun/ballistic/revolver/ultrasecure=1 + /obj/item/gun/ballistic/revolver/ultrasecure=1, ) /obj/item/clothing/mask/chameleon/gps/Initialize(mapload) diff --git a/config/game_options.txt b/config/game_options.txt index e7a2a000b0eb..999e6d5f63af 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -674,9 +674,6 @@ ROUNDSTART_TRAITS ## Uncomment to disable human moods. DISABLE_HUMAN_MOOD -## Uncomment to force human moods. Not compatible with DISABLE_HUMAN_MOOD -FORCE_HUMAN_MOOD - ## Enable night shifts ## #ENABLE_NIGHT_SHIFTS diff --git a/html/changelog.html b/html/changelog.html index be7b2eb55507..402cfe1ad4ea 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,104 +57,6 @@ -->
    -

    19 December 2023

    -

    Scrambledeggs00 & Molti updated:

    -
      -
    • new vampire cloak
    • -
    • old vampire cloak
    • -
    -

    cark updated:

    -
      -
    • fixes mislabeled cameras in chapel on box
    • -
    -

    cark, cowbot93 updated:

    -
      -
    • improves new bar by fixing issues and adding coffee
    • -
    -

    SapphicOverload updated:

    -
      -
    • icemeta's useless solar arrays have been replaced with geothermal power stations
    • -
    - -

    18 December 2023

    -

    cowbot92 updated:

    -
      -
    • Adjusts the singulo/tesla engine template
    • -
    - -

    17 December 2023

    -

    SapphicOverload updated:

    -
      -
    • fixed a bunch of things being able to behead when they shouldn't
    • -
    • fixed roboticists not having robotics access
    • -
    - -

    15 December 2023

    -

    Mqiib updated:

    -
      -
    • You can now use darker colors on canvases.
    • -
    -

    ToasterBiome updated:

    -
      -
    • Removes species pay modifiers
    • -
    - -

    14 December 2023

    -

    Mqiib, @RG4ORDR @SapphicOverload updated:

    -
      -
    • Sidewinder mechs made moderately tougher
    • -
    • Sidewinder mechs slightly better in melee than before
    • -
    • Sidewinder mechs have superior projectile deflection, watch those lasers!
    • -
    • Directional damage modifiers and deflection modifiers work for melee too now
    • -
    • Demolition modifiers are half-effective versus non-combat mechs and completely ineffective vs combat mechs
    • -
    -

    cark updated:

    -
      -
    • fixed some issues on donut
    • -
    • certain items now give chems they did not before
    • -
    -

    cark, azzzertyy updated:

    -
      -
    • Redesigns Box's bar/kitchen, nukes all the old templates and moves theatre north to fitness.
    • -
    -

    AMyriad updated:

    -
      -
    • Added Biosignaller implants to nuke ops and ERTs, which alert their teammates when and where they died
    • -
    • Syndicate ghost roles now have a survival box
    • -
    -

    Moltijoe updated:

    -
      -
    • Reworks superficial healing
    • -
    -

    Mqiib updated:

    -
      -
    • Actually buffs the immolator this time
    • -
    • Base mech vs mech damage multiplier for melee weapons and punches reduced
    • -
    • Energy axe and rapier mech multipliers tweaked
    • -
    • Mech katana damage bonus and AP increased
    • -
    -

    SapphicOverload updated:

    -
      -
    • fixed snowstorms bypassing cold protection
    • -
    • adds electrical and heat protection to engineering envirosuit helmets
    • -
    -

    ToasterBiome updated:

    -
      -
    • Changes NVS Gax Robotics to be more open
    • -
    • Mood is globally enabled for everyone
    • -
    • Map rotations and player votes no longer offer maps if they were played the last 70% of rounds
    • -
    • Adds a new Christmas song to the lobby music for Christmas!
    • -
    -

    bruhlookatthisdood updated:

    -
      -
    • you can now hit the captain's gun case
    • -
    -

    cowbot92 updated:

    -
      -
    • Adds coffee machine to the new bar
    • -
    • Maps it duh
    • -
    -

    13 December 2023

    AMyriad updated:

    `_s)~Gcq9i#f0R}ixlw^AH2=aBGg zTnqJIZ$pX|r;;4P;SpS62#pWIwB5X}hr zHonc)(f@qsFZ75h7Iu=p5J2#ktb9#QO~-P_Z|$Mu_JVfpw&S#a`|=JnMqa`5y^=fi zAVxky##T^rBh&XwROQwl*)Ve)~m&ZM<@aRw|8hxjeF&7?sv+q zLq0XF+w#{TTR~-q;>pX$!8Lu~+r{`U-E({<^4T~z`KR#TyX(vt5q%wb*I;Rc(V`(D zfRz*0(2Sp>lrE{apT>bgE?{erVsemHA^3KJ0|ei}+nN3yqorYc@Q$4V;$Pb$OniZf zY9$~h#)sI%K`QL73F3#7%X#bREOPd?Y*6+JE+V8poDJoJFLx?wvp+SfIK$~Lhk4+e z2`V1vMW4!wJVu4bKD4c!7AV1ZyhpAT2C;^*1N?lf63k20+wDzU-QU@9XV1GOKyHYT zdz}xRYs~=Wx96Y5+jY|3|haGItpV;eTPSM8|QbV&pR@V@(!5Kx2u9b)%Rbw-xc}Od}7T zt3l|SbSF*EkD{AafA0LUW9?c$3_-cm_r~mObzf}PvZvQK`&Q*fN5_2r94_NOmGG)9 z{jaoJ0(d7BS#Sx3Ed<}sQHa@BOC&oV7G;ywZ&{ASu_*!7JPKsTikvgA(J_K>e{}O0Hf_!^(y~b%s67wIx%6 zjuS6(j@HUNFLVorCb`M&e4^MLob66rv`f@g$PY)U-shS1Y?VZ19?n=PXqj`*GWxc+ zMG5~>E?N#8I(2lIWo4C5Zm*2?LyT-H0&DZW8Ky+je%12SgT>ctn+#hwBV9 zj5NMnVedArw6DbD9CgR%DxholH7Q8+nVyFjK0SM%aduTZR0dC6%5sygK1;eaE}XH#-9CW@H%dH`F|6cbtL0^C zmbfD87Ho%&iz>6kgeYSlRxT!eWT>I{VcG-zK5{0q_&6F1qz;!(I?qMvwp|(xa0wW( zv`xxhCT4+hNl7c!N54;0pQr288J#%@M?2@mXC70`a(~kOty0Cu^WaLckc$@l^KHsa zmw@q9`AI{xh(D@iY?ZU)5AKMj`45uMuY8l;Y~}FfDWFl8&1}8Ht`dGd$ca1XVAeAM z@-_)|q>*syL)RUKos%Gy7oQaq9l=^0ddge)vEYT@My?byx%E_JT>sk`In+bt+GLgu zfJt%0Nt$PB*$=bWb*U3YIpY$9<_vZV(l|CQdjMa0} zuktR7Qir5(O!ai->bLVAr4uJc=NmiE?+LuY(+8EQXrI`%j*sg2sf}FR3{pR*BK@3A z^!B9MvT)nv9#>a+F zK%mpo5@!hgQcH4okF5RO>aK1tjF3!lIl>+$))anPAPD^`;=H>k@@i%11Jg0iv-e7c z!L0Daa}aH+^*CcnNA=-#Ux7|3^4ie8tWw#YdS%s1#FOg7f{DI4T7miR1SiK?J%Ja3 z*lF*ST>D{LTgaaeKW}SKu{Pcyjs=lNsU25EAd^ZDuX@dR1A{atA-v|Mp{N60*`=yd ztBOS-!}?L35L{@faqr~EzclaV6Q#?u73JWr@z%@*n$I^A6Zw6o{1XQJ9;G{_X1s*{whre8U8#9evpuT7~k^k0k4|t7)wm>aW-GV_)gghc(%w>3RBHZ2FoTOU>xl>es zS8FX3UKM5-oonLvIC=8x7u#)bYR5Yea@ifP)vj#PxN@9@iqM3EY}jxq{UCiR3P&Qp zFk!H?!?3`sX5pf5M}Cl(lZ4sc){LRLt%lPG2K&LAYT91&_-l&1pP-U@mf1N^m#vO< zYS5*U+n{8A7Az^+n))@Oo!8A_wPjGl9|wANMq7D)$@{f?AVNV97JIriG5(DzlVcgy zlMrUZgy&vM04QPso1|YBAXQ6cexwkEjNqab}dzxUKz>DWPXo*t$t^m1~~5m zsa%t{=I!U4&lL4!+$(7j@U_P}sUFbIwZ`qazz6ED)>4xQwIR@BUuLSV6hT&n@F97B z@W%BkO_IHgP~7jP@Ohpt;x1HAVOcGQ4;I#e#b)}nZGZZ3C{R%XQKcqE9W(Ov)x%PC z+^-LjCpl32TKFl5?`24~pC6O&PLTtP!z|;!5j1muKTavft0ln+%4^Bh1a2Vr z;O>IV^rMMGQPWB5^iMGJw*a^fuYpNU5*pX(1E6I(!UYp5&na`7p| z?lJK2=|^?&%g^~Tj(BN7DB1D7QflnlQ15=Mfko_JT3Vp^?Gaw->oij&$2i)bxL(+*#)!_g)z+P4ZU8J~ZVhFy5v8;MxZKgHc(m8_~f>)ax4#U7JorMYw+OT0jqKHQ{k<)-%7A}B?HjQqOvZ!&O? zove%F*>%|13pJ{>_W<M*A$_?D5ddDXB4UIV<9*vcC5N?;-tK%&NisIWHtz%Wg z=IZLqeJ>$`KYd}3bV?#@!;Fy~u}<|YAyqhpwoxB@zoxAQ+KMw&m)Ms#uS|Y#i@Eb& zCz>NV=@vNS{2SD!j+umEDYGDjW`puR*S`luiFCOk9z}IfX-qlyf2eJu0mqoz==~b~ zQy@gErB&(p&#F6ffC$GqD)B)O8kT}RZEe=lVj1wWQ@pZf<;wsH9@ishL2!RTxp6k$ z?Rk#zYn0k&4y94XRy;i(nv9IDDz8(0X{#3;Y+ZQkXEhhI!Mcjf1x_70u?}-Bl!fIh z7>*hPzu&Db9le_AcuQ%cpNdH}UVZ)rb8UlaImCKhe*o=sUbKmR>HjHULSVrJDB2qH z!C%qG^ecq1)#%;FG8+|lEY^=0*X=VQn8R{=_uE89O~E~=3nK1C@yt&U#orBW zAAk1{rPv}=o0XMd5>#cY5DamgQoFK80()t`(`eu3UAYuh>GU+d@8Cdt7ou-L*0&zWBwp zpFJ6rWns>_FRV~h`94xfk?j3_dFh#wH%@dzV-WjY+T;w|#giJ421F(q{?&KlBx9R3 zJeKR<=6bLddh;gXEawd3fjC!snH!dBsV;IhzSsWo_CT$>J}Kf6J!^KsiR#BXdB{xC zXJW*}u=lOTMK}MVGxcJCqu{3Bq!L2xXKyrD7HK?f-%M?9*Frs+W_E!k34bVXJbryN z?3A}<{-7S;fbGF|33zZc_U!VDeZ{JiNKBO`#J;wThTzVhF<&fK507*t5sGz)4vFwJFDYh8I7B z^t;7)qOQT$W<9-ACf_Sda$&h$g1k4se`+a`ay#iQ+Pn1RP4bD{KTeEOtvcR{^px;*0ygyaU8l&6?B<3qEb#_*|8qObndH*cV z83OWzsL3rN(hye0NEWb~--2o1&X<6DpVQlQef64~e#DobSZ~9xMREylPC-v@aSjXq zLIdf8`@qOQ|Kv#W{KfGtYkN7jKuxhis$O|Z$DB=?Hxe*+M@vT23XvAh;aL*toHeyW z6pIkP?BcarGz~j;rkWS6w558`Z~iI#zO=bxgcfUQOORfHGY1~f5T0e1HygILW1y%>g4p{UZ3J`*m?jLy66f>1s|wC;A}~p){!b(Kr#awC$G`B)Xp1{t;7d-{K}^+FrG+*azL3wMiBne$@$*4v{t{GMyZ6VT z^8g~7XO(oLwFsR{azGg-2| zFT5a+e`Qut1)(mxwH^oBwLHn?&;dX*exxM_U}3AsDu&QpuvU`@^qWQGJCv>cK^>Gc zGU;&hW9EB9eDfukRZN(LdPUf{RFLCI#`S0$?}0!sue2q+|2cRYo>a3KR&)eRsK5U7-M~eO>DtVaTtk1e|8T<4b$5XK<`vv?U z_g%@p_%T!wc|6zosA@PfA|<$!`2~yJFihFQ-QT+Rn8-r+2f_v2HqvH3ch$Jr(4~3# z`(H1-0UypyRLwyPY)C{L{+78ppT(_k$9d)Ha`4^W)#j&*=?Gv$!HgY3k)65l(aEWO zJ`UK#TOCSQVA6T@rzP=f&F9cfci)EVOo5ufFEf+0=%=T5%%VOdHT!;?2aJ&#qafI} zdqmFE5uVK8RXeaqWOA=<=Qcr+nVsJkqA93l=cDY`{0&66?41BKi1JkYJI2s^aGlv$ zLspZYBkAsoUKatQBkY&DW>)_xH9!apKtvLSW)&iTC6dd>$|53GKsGFO99E(~eyMz$ z|Dv-xJj;RNT%=v;h8BNeX^` zUoh@GcM8f#n_EUuHuOyRxxa8dC*M|V`-Rn@1za5w5;A!Ch+k9xL1XP@nDFp7-&VuR z=H|Gmt8T*Uzx@G&YqheUnH?e)11ad}>D%)93d&aqJ>w?P0=7sPMAxW1#{f_h{Y>m^ z!)Fi)=P|%(tLfpkcLJjS+ru73B;1&0_|R=APM#It0$U)CJD?!s<>b9ToWpXhy& zP@^v8DJ+`sTAD|KBpEi&v4&V}UDeucHHoD4Oh6QgmTq7R4>w1rf3RuU$!4@Qb=zXm78#A(eV(IXXK_jFE8)~m*p#X&0!2* zlyXDTEB~@7C$%V&3e{J)ba0@XD-R7rg>~AQ_>%$!83Z|$JiOeaNZSI+OKnDAaliD&_pWQ&I=+84y*MO9pE6NK@SM4^?#+n%FtK% zNEhv5)9iuvidPn`a<#ppIiEzQa67TWZ^1?D?1qp5vNv*+-n@{W_GDHaU}o7@$lPE3 zB!g*lQF^KO#2f$eEh!D13K-(AC-M5DR(2xv#*}CX1jg zfjvHmjx9CkaGHqIkIOiyXQZ({@hJ~&b|GYp@VC;oZv~}{7u%O5Y_HN8p!iE4{ty9X zn0t^)ZixkW7&pmei*{+Ek@hAwdZn7WNS+}L;A-Dt>(d0_*r5Cjf*yd zvJB9@;gx)4)ycUQc8v#+>I02c$;oIS5)Qe`L6!`+#&{NrZU>WSB@x*cqzo$yX|Z`X ze0}fUy6muXn4OYZ@Ts6c$-*+0(Ye%+|QW zwq~d`UB^K|X`)UyHNU8cwSnR?t`2N5nC&#RlF zzXdhLq?!h3C~+IZr9W6$@!bUG>lft?sCIux%XE~uV89rgIx}&9ZcF&ucUgiqN%T!< zN_bv-%K7YV2ZHp6^#NGuNkqkc3Dq$(qves9D7t0$OUj1s35cT+k3cyDwI8!uUY@Y? z%EG)x(Z>n5<|XY4;g#vvd772X7s>J!;|=Vmt41e%ee!6S93CgD`p4?|oU2^*-rOV5 zQ8A^pqS+9p3+R`T<$^`5F`u)ZplqrUj&V6ANfAR9u30YW_X6@QnvT=|f+kr@k+g~QLBK-Z zYV+qcLX4YNM}}DCE@u{)*2)hVbW4TniZ5$)n5!Ler?-e;TawKlYXF|w8k2L@5XXU2 zCjV3`KBkMcGJBEaY_3@mpxM3UpjNq1ax9z9OgoMHedJ|y)MP>!IFd9!QhYu6Mbb)* zy_Yu ze|XCxC{Fx-Sht^=@J=##_RKrOb1`bxOK;V;og$KjVtD+jB9+HFf1*hurj8m1%8`Di z!Z&>Sxw{XD0_2)%&eH zNrFSBM?AIcvG{>CyCgUrbcy7X5R)Gt>EGzR+m5@<8eX&;KITBL>a7k0LKE61`+VRBAi4mD*CI;7kWV4B1zkDp2t3q-l z+&2okM#^LVJk=G+iKWRQp$c%lf;Y@VA6=hZ_f}IIK@UIEMIh3cn%G{$*{*@tXAM zxy>H@GQndC`|N6(ka?TL^~*}V)^rjC^be$Xag})xnsSIjjA%zqWEva`IC0NGYO$U# z?3k}o5`%?Avs8k|^qklanXXxX?`F!7O8%>WF%q0HDIt_)Clq0<$H=Q973bq4k3IbL zTGGbGink2Qz1B;E{fabr$-4pJYdgGU%)C-rr8b7O}0D706T;%&HeXsUCp3R!Qo}e;zrttnxk+L#Y zIsUJLR~z!S2?kOQxba3#oCZuNfg37XV_0xHGUk4VE1uoG8)A=}&Uu-08e_bD@vq1W zX)bk0_zTVTWPFWex_b&Gl0sk(xsJ@;dQ$`is=;HaDlmu^U+_4Uh(drou^qy!zzfk)=>sSneInIya{aIZ&pK;ND*w(Z$ z7sr_>?)rlY1G~uC19H@`z#aRA!r`+BKS?k!Ue???{#6+g5#Fk2?L#=!^`hlWfL=v3 z9mxo3+mV3fuC#xyG;i)H=YE8rpb&K2?L2Sjo6}B|#y9_9lsmBjE|{6TY?15sFJh54#X5dZ*_d{3YQS0f zbN_piuN5iozhC8bEgtwXC#x1zhMa7?7n0V5z(TB#&Gt9MQ}8H^rExT(#vCVpJFrm@ zh#1Z&e@Q?)ZZv&VH3M691pGsM6#Aa_9%N+Hh-o9I4k@6zRU5xqu`t}X#&Ei|c^N@|N6tq`?OI23IXBfKGjtJcX+#xBHw9322?hotb=ab|6o3~uVV^}kXutY ze5bHOyD-{*uhk-HPG{+J9vLuo@vN#O|y~CJ2eD0;O7jn9ant>5iB5A?G?zUuOn2V^isCR(U%DDlOjwwq5%RL zXH7=Z?^p97t}WbpZAf2Z%su5QT0m@P7{}>AauxUiBmf93Q84Rx1Xd zrbPFn!R|HAP>>gE@J#Qgbn4pv5E(5O@VHjZ|I3N&GX?PDTWok(;?)n601lN`5NsCV zfjcoxu!JVKZV+$GmI>zMAQc_Ij`rsLTI`nh%exIiXT2};YM~OifU_{Q$MS-!-JH8Z zrB}%PFA{GC?)=PfoOLQIBoqu~Dv0wQ<2T(p>ZjTtA0tg+MW!jzfmmhv)!AFFCtGVb z^1TH`PMRtfRn^=&Y5MQ5IxamwtQ)B26Z1oD&)P<}-w^1a6z0m>|Hj_2c@py(!kN`BDleIDjvT z?-o8&xv9gtFZ+&+_^$hzk9ra+oMsuaZ*S^|Qv$5vBTv-Qt)$o=>dr4Vypjn7>IpX? zkC-0Y`c@d?J2_iQrT>ft>=SidsnHvW$l-_Q77;}K)BEBonfMzqt>MO)irf#+)ILp9 zP(Sy1nR4MWPfFPEe>2R*U@_z@O%L_a`gAxKw3xS7m+s6__PfCR)6zBmsbO&C9TR)z*f=Y z%&%CQj0}*^{0AhDHC-|CZ5|A*{fxE~h!0s8zRN&>+T9k)=U%1z;jkS&#lKi%AE6$+ z=miTUG@i93>(A@#3_R1VKc&Zb&P`uMo7V2h2R8Omv6y0lyW%o~24+p4@=ZDZnkR*N zaH`Y%g&U0l;x1M%vA~~ZjZH`8goSP~L!C04VDP1QKgLYUTW?eddz(JAIXx_5r4gET zMtfxOQ2<4p(r7BWXLl)MVZiD5=u5RlYT}B=>(rbwCAui#A&sI+T>-9^>S}Q6S7;HM zaa6gn?*j{oQjEG{Ox=yE>E6|alfJ;x`+@RRZH;TdJM z$||50!@YTB?&o&0nXOE<(`SZHf;Z(LQ8&1xZspY~`t3b%0j2 zdX^*VTstJ=Gw3{>jXOA|=i?iu?doJs0t>G2zDhG8`8xRp2JV{8yZRY>6qd^D51)*` z$Ssn!`@h`5`co7pwR+6?m{8>yHvlP_Gy?pE$3CF>w#-C5jcjyU9Y|P5Bbz;yd)j6@ z2dgSf7X{dl=eWhN{KPBCBr2A8(2rT!kgU!KBGD0;L!g>sFm!-Vkm@ABBCa3DbJMmd zz>Ddu$hUrE{F{27y8UY#2(3e=4H@2S&O#T3Iq?y8vqCMB zG!BcFk2EPN)<|ASNw;iq3^22OU9GRxsCW;0fUiA_ltfVGjP5lUGr_)m3FuixLA?#W zk}y0qXxwOt5E@%HHgRgU1mIY^Z zr@)Nn)2l-(ET`wM4@~+>R1gxOj?*3mhLy9nsUja|-TmZ;e@^RGR0(r8QQGZLp6L5B+!Db| zO*jWI`S;2}soY&W?fK!27Wu;oH_`g=b!$D%U#QnKJg!TGAogX@52|Uv*$dZ#0_b)` za!%61rBA2y0x>-NQ1NnR*0Yx_`A|HdlQnueu-Z!{oi9ZCX4cDWF6=%%@d_#%@FdRa z)-5rSH+1P=VW=E_y8gA_)57cozL>DnI^yCd<@}jTCe?8KYy%m$@DR8;c5Vykr3D<@ z2A6DI;42}m$KaFB0T%znshs&FPC1oquB!(@&G0knD;!3CaKr>TV!VT;wEiG6g<`<& zTFLDbp7qhamvfFeJl<2|gc{(htakl4jFk=EN9Ax}1olOifL4GV2 zdj?Ivu@CC!c#c)yMZ1B(`@>h4W0H+OD^l23W^f4z!9Pf&wkwa{kpgPuz24^|)R5Q1 zr||QqZN?QN9}t2LcwrJ4`YXV~xpU)ua@VZf6)qlm5%XJ?Ji8Do7|HRU*ZrRNCzz5= z&vBL~7Nhs@x0S+_5Kg=Lbrj$s%w%Nj+Zx^bYP0yTjv{pW9j)faA?L+{%}lcBU=C z(Imv)@@lht7|To9=dMc?CjflYyHog>L+J$;)&$FCNrg1>?Ad0HpF$#v;xmgBCh2ZY z=YRZzO9Dbva|F4$ZIRZXOFvUsy;+~N-B(RN|4EZ{|vdOnM{k{SSud?Wcr^6A28sYDjYHL8QGsg zXHT)7;=(6eD0FpIdH@L={YRxYZs#VyIwm4cn;5&Czhif0cm0bVpGLL6dH(A+^D%Pd z=f9kRQ4^~$0OQ#SHkPsXzo-r~8)$1}G>L$$t%g!h(UDKm$q;m&i~e~;*rI7M-+&+G#%*P6uT^DV%xEpDm@z!CLc0RRFe>Z$d9hFw;BM)U2@NL8lyO zeu8V}$lWt)LZZ!xvzJTG=)d`7j(QkIArQ%!(6!l7{CC3-13!qcpMlm+@s%@jCb>+M zV2&P|*-&7-z+V#J}7`Y*_PYQwD0l;1;w%$FtqbSxR zrN6jQ`;4C$isr2E@a3?b=+~iP{ES=G$*Ddp*;>&YOn21A?s&FsR??YYLpy_Jr>Df< zZ+U`==>!6aw({X5#A<4JaIr7#N*SF?cD`h4qrVO6zl!f&YL`3ea1_{{KbRtymLov$ zX#8jSXAxAR9G4?6Cv8T%r9ZL(5OMO3sJ4e~U)DImP^F{VQttP#7(p}Rrtk~ST*;n3 z)nT6%j`98amUByOI)Xb?rvNgemaYnP!Uk*hQ8Jp-0(S8rMPFZnBUPd;qS3&&f(g)8 zF_zFb?ieQp{xf971cK{CHm6fpj0H7#uSuP-jE+!kP69huQe1KB&3R)Fh^WNl$cuyO zeO(AfrL4UTcbEszPSLoLrEo?r%b3DP_UzSnUKR+$>vC_sJl$~wp8!=-=!&wIF-Lu4 z`hkcYo74t5MQrif1IhKJ8ms@Y=;|j7uG;=XM_fd)r%X z5nW}c7bd$KI6=_P$=Q~bD-(ek{BTAqF98eXKSMEx5tJW=_FwZ6L!=7p*y7KK!YvZ+ z6EC2aqNRx3dHhc~w%xxbkXW@`X_D(%>_drI?l_!5`+92~vv?hN8otuWxQjHc<=4E) zJgYW#EIM?5;XDD`&IZrPb*7W0MClA$eXq${e`ATHiT`-trSVhBbXhCw9;!&|p^f|F zaYOw3gDbW|DGBfx#Au6jjJZCxJgE}omZ-Nd>FhYV?k{k8S$;E-gT%l{^`wB108bK` z;O0iH1+&Q9uJ%)AknN+=(%M187Sn|S*yngVn2Zd7y9XkSNS3Vb=TP^Depr^@mAhQ!nOzk1KiGTtUB?$an?n^}w#%UZ z2zpNbS|6g^+(%t?i<0rZO1TKHr+0g!%%zc7EoeIJFamzSj3Tf{`=iyZqkTN^&bk>hP$t zQ{(#WgB+(+tff9NxQX>!8!!I=EV>ZpLjr*RO3ikFwCe_ZlS9BTLbq9uj%$R+;B-F( zk1v|{2A2aAqm_#$n*hXHN6kzMU)4nR?%IiYK7V4={mf(d1HCO-GjH-*Zp&A}wx1>E zzLd(ved4H3-VzQM82F|f#i_z*-fp6C+1i#yA@l@8Ca(7y`)&!j$DLCuou6kpK{UZ5 zh}tHfvPcLc*ZI4EtrOednFg*AVq*1OIk5w6Hg*|0TBF7{bC6wkHHncwVYJNWkA0I_Hi*DP3sc`;89XfJ8*DIV0f{xLwm+gPS66K(zNyZw9#gc8ddxP3v+3Q;Tj()&rt;vtTwNHtQKrzJ!L{7+A$jFNsPo2n}j613|Wp;2MBh%ymS`|x$I*W93 zOww-&By4UKfrASk$85C!Bn|*j8JA2?!mW%Wngl*9?Wg`0ydS5O-O^`Dj2qMHXm5+; zKD*}qjh%~8pY`wPf+*C!`KHYBJk7XnTr)T$Gc)o#WUDnMY7Feswyd7yP-Jp=z4$^tTuxH$d1uGLO?{;kt2 zkWPuEC*QEpt9&SEjn%c><1@U@iuF zmYDz12~WYe94xf(c+75yCK660ThgO4{&N7Rphed2hh~WuPw2b-lWBPQ>H~jGTTS&! zFBVgGiEKl)rzW_A1l+Un8w(vQmvDm@9y}W(ekeY-8c=)lD{(fp@N>C3H> z=r$S_LDy{aMXz(mM^)oxQPSk%KZU{Pb0QV?j1127AB7W-$RS7~#IzEmPMAZ96&BhX zMbxx1F08Z&b!~3FcGFS%_WA3l!d!zBb!G^Y)8D9V`Rw?wHAh9Kf2r-SKTRl(jJReB z3H``p?|*c&abzs8pgyoKL?q46y>NML#JOGK%kcI!-guBkvo3S3aD-sz(7-$ezoo`c z;?#e=J`)4I|Al5LZN5^4HL1m|w^k-64dDPc&Nk6j=SPm?>eh_jP%iwhmYY-@1`oU? z#Teq)gO47ZvzbB}{P=zUcgKxf9oDuI42uLq6wsUSvQpmSDx53mRw4<Lzq9baQHK4md0eyfl!xq>p{kFW-W9=J=WG$J%i6O_ zu!wXb6Dc2k4Pyy)`MJ9CR<5o0Ia1JqL&K$tVFqqtT_W^$lOiK3>92H{>M2G^8^_rg zo|AxM^qg^haL-mL2*>}IduHL|kkGbr@#2E5rEt^w-#YF~ZshH1Th(}wk2vY~77T#p;LgFfMo(Ko5eAHqH1}D9h*W!%BVs~6dU)a zwvVGzM8Vo)ej>s~&zpMmzf2MAS?`iu_}IoRY@v-S19sDt7bsFA{`>>9M_y_$5q0FW zW1=;@O>F?AjGJ<*->0Qk(Qee6-T&P@Shx6HfW?wjajDaKd^era0oKp+YPRj<`wuyI znNn|wFzT+_7~in>tayuxu1xU$mg4#O8TAt%8bdyFv^ zy1VbgRyjl(XXFNU#j?`EZO0!vNa zgrIx&-Zf<24-Y5?kREwBt}ILQlm|TSv@RSQ4htpnkE-g4^aT9)-bmU~X?NgyPBh2x zW96J2DQzf|dGj}Pkz$c*k!JDRe~>+5@Ec7q@B@F=I>|SH0ayxqL~b(R`SQM**Bc57 z?#FccaVmsnE;yU6v;yV&J z5;~5>ZBE5+wq~!B5Q+flZ66j!QD9?LNkRJ0ljwhQ*OHsPDT|M9DoRpmC;!JCFNF8{ z|A%V-52}(-7p^n=!KLwktjv|~iKq@~cBAN^K6%%L-OxLK+U*IC44dkd5d9P|c~7zp z!n^~;@dD}KK|3#y-I5Xl3!@m*eDwen|H+%yoON%=vKsu|)(HW322FgvG$iygBAT}{ z{IQ$v&K5b>Y3!9%m28qt6B5Wo$5AM^Ap>=?_L;s;u)i{zUvx@ zd7RK*8Ok4W?8#UG4$;Tx5k)ipp!m_titZ;D$|G5h5?5S`P7s(vN6QA79WCu`M*-?Q zAU+UfiFS0^~!eyDzkpLN76`+0a4S?8i=ejjLk z#*1*tKG&3!UleZzr8TXgK!=cQdGOagazhYV0WY>-bVT&?X)++nKK7r66D(2R+{csp zvU45qXaK5Br!yyD6WSPLl}&!K!*2M!4EGV?gQG8scO`B3^(J3Ny|9GHuCq5Gq9pP0 zDn30PMc)h}bp~oNbg)!?Tlu=~D0{x#Q!lV%tc%79QsXxC1$)XlIvqquc8SPjP&U>Z{Q1vA z<>y1WQvk2KQy!I54#)M3mC{b{foMCmrj9)fZWN*}Jb3sc1^Tn_Q+h3qi)ajf!bk^n znNRc!t>pwO8uv6luh4)7uGU3-chdjmLp5->eWlLZQefu=4bdBsJ3yoTzcwl`^^`}+nLd#;^wd!UsQd1+M+Qjif8fF zs1p;~Hs0a_$1w_F!THm%i~%M#3f)coH z>xousao@`gd2kP;L0>yZ%m)zhV4SNwJAC64J`EVNy{AF%D)UTpYy8=7BHF1KBv2@g z;lb$xt0Rv+7UaF}ehl!Y@Oxu3-P_aOc}~3h^Wxmy3ysSo&cEo{^-n?Us|aI+sPt}s zwcvx=*t-2$q^XM$W)&k)DD)5)yzXcJV98Xbdoa@c_Fyu3NrxeWmpGWR_?gzU^!-09 z8fpj(*x@Bu&z*cy@7As>1s*I`ZH%TNsUF!UAO!T9bx!HRvB0gtpbYsgy+iL;vj4sN#z*xE<|;h#^d{F0KtLHS_R$o9fMhVaJ2L+y?b2y6Dj*Q;Q5b7 zq6*Q%BgX0Gry^v?JIMStk*nh3&OKH}r7aR|5USUA_y$Z;sfgtF|;A&$Eih z%pihY3QM;N9P{vr01slcg`kfyQ3N%Q1g_(KR0*^I$45HgA~vB?9F=$~9AR*7|71BQ z(6G4~EZQzw?R$~0zejk7J3nyNH44x9w=PJ!oGZyZW7T(af8LkBTeO1T8 zF-;$ipOe*0u)VP`pH`Koy<_mt*B}EEaygvu;Qk2VoNVW3*~Wp z|9fQdxhN@dFwRS7%qFTGv}g9oz!K@2oi*j$lgOwwA-KI4^*TZSM#{EGPImPFMq^7j z#Zd}Dx$#%}`t~9bXjMt8#VEUB*+suE6w(Mc*`C^X4G-t=4q`o;~|>I+(V@P-N%?b&1dwS=lg8U4jYoK zxxJ-VUmsfAkN4kfWuZ_|R_W;_zdHK%rtScq`07;|I=1!vP0t2^xyH;QE<$0O0$`(O z7ABb#hx17)!`@^e;CCL4z(`N37f9j+2JhgH9EXXUeo=g06T{K<7Wymb}I@2GOY zKtMGyMtv5*CX}C4_JbzGzkFl(xihULImM$=#}(qS4TS3#`TodGqE4UU^v&7^D@cjj z-AJ7UjY|b+i&@tO|KNcnc;WL^?<)O}j&>f?v}@zKwbrjW@w?BO@4Xsy9cQITp7bb& z`430SYN<#IlRA+`1=FK<5SVOJkTn!MdZn|nlHP;R!ab&CZh&Hc>;IazbN10J{^`!r z7}jguXx^c&R$QX5`EYYBh~(^%FF29{ba>H>O4g;n4+h!!=N}#Etm@u^wO7hE^mk5t z$^DJ?n&}+Yf3xEjF`vF?B*tv+u|0pF^ee+KFe%T&=#VJOYD1e3+5)?^odv9KF8ls8R)c zMvG(V{FjDDV@}QkpO46U!2+%`kEHRmk#l-Ln^yW@0Qc+mf82XGU@aAE{OZ;0FfCUy zVUP)YGBr%+xA7zINlgE~=TaLkK)s9nY9|qSvGV_h6#}~?$eq9nGf!biC~y9a^#&k2 zJzN1p9)`6i3$1TukmnT8CR7|q5PC(~)ZR-pTVloemBpWPyfy7NT>P4>lxRQ@`|SSB zfH5FSPhxxU8J4Jk7OUxlSuDt9jvGyPM#BA;tfo1voJvXbEm|EHFz9_q-r##;6bcl} zfB=no8D^4{@F!FCC;4n^-~xN-j-~2>)9p`@c(J@}RTGtm}1MHPyxK z*OiIY%_IsAFtRu?Rdm1vZ#QryzC0L3bN-CEluPjM>Y>+#^W!lRJJd~IPPja%y3RS1 zA&ccJC$zHvSzDCNQ0&lY;)ln(91^e=v+fNJw|_$xpV1I%r$q15q_|CQD@p;*&ge)Sfxi@ zHn(q>@!ZFL9tVB(-#WVsqa&T>prmT|V4W+Uih5D~=y#>TYQaT?6y1S_7y|!%gu^`zWof?A>^`pL7Cgpp^@EV@lZW@=R4ZXjj*zd?iw}vw89m~K*u?TgDJ1$& znU0B<&dD#*rCqP8#^cPwD+HCCG9*$;*^kts5h8i3ON2TUvW8>@N#&(t(5@g-=r12sYxI6F&Nmy0 z;HE~vWjXoYPi-IZ_P?7Ngm{;eCc zZg0B#!dLeF5Y;4)$mXxyUed<-ocO5CUPp(7bzM=P?FlGK(JK`d2tSW)`P&uxl>W&? zw+#73xun*q8Ir6owp59woRWm`8;gV0xz0)pHK}4+z$a>6A?`_?>8B+zU7y#Wg?+=g zr4gt0Q~FQVQuzOfBGrahr6etp+P#JclUhPiNdX)UPzZOla@WbM0pV?MS`_n{1NcyZVrB%ubLObR<5@^ z?Q9Ocx4+INo7j6F7owpj{6|?cpS3F`S0TJLf{O)2EBHpEo~sC-LnJ>27xh%edu^_) z&6uHhu>yw|K*{&#^heLfI^qlSqQ#yK-;u1>W|&Nh{OFmPeuA)flY@5S^32#1%jQfp zBBFv7vKBR>B74YPsN2^ z&SnNyOV~!Y?CX_Ufj@qQW|vPKTq`p7dA>&a(M;y&ynS`Bk>*5}8SHCN?dL3k#CO%( zW7YaL9E}qWE$YO&<~fCWdlB;Q`TbtNN|`QKPw8hcr;y2m+y2UUbxN(rq@4}1=Pn@D z{g3?(DqJz=D%x5Z@{$hJ&uJ(x355g8`o|g1iZv%n^CXaR_zb(astper|kLyQXy<2i}TIe%MxEPslAk``K0>n(P>WyyX_5=JT_uyRDu^ec8Sp}V^aY?*Ny>EyR@-3PcItgLH# zpv$Q!{bDq6VO&Pl1KE4^%CQwK0zO*V$X`GFv*!yia(hwXM`B@Lh_WrVSA7qlT zC)TPTXwt=56J1&67aKHiu36Izmdk@rW~yiPjen$gR>sfk|0r}}xQlRjN4A*F5@(I( z2D5W~+8 zM+}j3rAZV<&4L!xq{=i}HeS!p<$X$S8g&zvPAQ?hFL~#{lDgNrL=WQWn7PX`Rj}zA z|9Y^CDcTU~Bq(H4U3?HlX)oryJ}`HO9i$8}kEqG6KAfq&%bEC`d^1dV<{#2jl{%ww zWy=v;)w5HB_@Awn5#B53vJz@M7TKD+eKAufRU2YpBX956VA63ty?l@GZ*o{O+uGPPQ z-s9Rdda*Y;E1mq~juOD44{6{xkZTwg}@WQ>6bKi5YviWir zshi~g>Nw6`JD2~-OLx)kH2-D!m8>dDUQ_cB+hw|pA`+{b-IVkZqBwTen;N3=n$Q{( z^OQhQ`jYTInt}Wki?b)c-aRLj-9+_BT8%Vhdb@r;9Zb;p;;#90EF!w}1&8}(uE7F& zX}K`Du+&VSxUy$%Mud4pi2JlYDLUQ!?7`br9;A?bXOJ|(6}SkJm|LX#Z5SepZGUls zzFcYfKzrY>ZZ^X9R*44D3Y~ge<;=6{vL^IdD(g4gu#h_2<>;t#(a3g{{lxQ0I{d9# zfto*iRR{Nw!a1W%u9BP7Z3+NmE_E=Wt6udk=P|};P``W6qh7Lod{X});Yn_|gn|N> zef7leF_4UIMe~_lGYZ~dGF|=pyHx5~%2OxLmo;B(;_WpkNQsUnTrrS+CpS<)KwAYW z`cL=lXbB$yBVTJ|2Hh)VYJkwL|I4B@6IsoH#CHu@B{}!s6+8JMj@){Ek+2n?dqgnt z5Was`;FLv`gYCHuuk4NOD-NaTzYxR0@j8M68P^OJ_evoi@*@&b=g1Z!c zRZllWK8-~qA}7c5XFuL(?CeQqKQuq@e&S-8S$Sfy@d;zQi@T|eenH9{s=w&s`qkb8 zS*I4k)mOhKa8ldXM6Xjn)XPLe=ND5x8+ITir`6=IMU&x@KWrTjPSACFm^)@0 zkD*IL#beTaN;o()CW%Wg`E@HSLWt5BQ2eRXyP=EHyPsR$QX)BO$|&?#*@^)b85KT` zkGIoURVSCx6xaMR2oZ`*wzE4H5FT0&S#;z4xak6_+xPm_5d$8?X?YoXQ(i70nq&8U zR_Db#_goSx`l%1Cl?QE1KuXp2>lS_8)iiz`j$1{gb*M8new3obmZvJH1d49N$Pe(0 zh3X0d#pXQ7=CRG&`E>J4%hg&QKLL#-MrK3ZNPaRm(hZt*6L?U@Elj;RQcbGLZmn zEA6x}!hBFKVI{@&1vnh&??U@lpjE&Ejuy~6t)-YpaumM{0@Z^ zw!A99qIwRKx6F?QCaAP!_GziRSMKpCxiOCOR+y9dGDH|!6`-Yt;5+RG^r`$5@gGme zy1IQq!ywxWR8@w~a`uCc;pUr}y4!Gav}=$S-epXe>Tf1ANCb9%;158{hDq7?CXQ{N zG__So!pC#UvdHV42gsB68x9S2j9#I+7^i=14l0E9JtGqFP`ZD>HyEwwupLLt}=v1|F z_N2ULSvCVoUBF3Q8ricOs>yXiSIXf7CV>IPQpVv3&D|f)0(9HKy6r0#Pn>BZ1O5fv z1$mVZ|9HfR15k!vIzSBW6tTg0++`;NzCdIUcO^VOGiAqC=1VHus4v|_Q^fB- z0dRa+1MW)E7m)`#TDG@ecSu77gVTJLZWt;0Hb>Y$b*K3A*|Pad-@6%n8y|+mDB)8J zHBqk@+1fSDB5&eDE{)9^ZYCb)sPd(QFc@Xjciw5I3IuLoL*!hR%5SJKP;IC4YtOw* zwbZI#&JoMVUq4;qa|=b#dJiN|WP`WVxDGkzLY0m0k*3PZsJ+eXWBIo%ZZO0W7hNI# zf?lS@QRCWz)^P(5pV@rdV@ZZG>qbW?X>)hZ zkS87~cA}dCGO5EQlgawxK?735OG|0D8s0lcF(m{Q{ z$LE`7HxMPrDcDqWcK0A;X$7p&23fAwiUF;R(%uD_h4-~riqCgs)P$gA+~)VXF`{VI zyLpHYF<_N#-ACK>kHd%5{^iWI|HkVQnI4G=uPaTa=M6tFIrd#_I3p>S;{YP!K+I6m*_b!AIohG&=-RO zNj*Kr$-B)EAu5kr1l`bpn$naO!BEU4Q_LuSsOeXQxo>^vVI>p~BiOu=+Gcnbb6txIO$Dt4V529}d& z+uuZ!mah;?9V`(`?S}@-_=;R$tC#Vc0)BMGMMoTtsQk(y^H4kgLu&G&a}4pa>tum1 zF5t9pMs;(J2uqX@V2*(lp<)jL@N0^dAKL1x&tk4}fbl~4 zecA^gb~s#cq7PbnlyQgvoUyE3Qrn)EX0)hl0c}aK-P)5gu_XG~8LX zF=cvr?7m)ObVDS~{lizY{UfiQEIefKL^!Te8H+HC+RkKIjXa88MQN6%3S6O1FeWGb zC4iRP-=$^ecC+@A4X2z0SLRXcPxn?BvQS8AX5}PNaeBobuo=Uf*~U&1P}~+iVWnv5y`$*kg7o1 zJ^W&9&aaO!wl z1mj6<*5?5Av&t^LlaKOliQL%iUI}c3Ad`PY9^hGYs`3re${y*SY-7me%gxFI6&3cF8 zM0=Uu@F@)+^e4b+Qi*}AF@>SkQR^DV@6?t~{_$h*z_;pV&I1u4MGs!FZsQ{kjSc`xDF2|dzI+aXuvF5{ zE3&b+^f`&%K-g!#FWSK(uY7QdU*+!!TIfef`PoR!`j=TICZ=dLm$K9db*ob%4sK0K^wM}FAoKBqpDIw3 z+3nHlgin|NOfAzC(87gT%DejO*7&$2T?h`st6Jui4sE?CZ(N_=uNPMgnge2}yC%CZeqnwJC{vJObexjPFUuTi-&M_MFhzJHl!Mlfh05pQ` zKEC;IcMPIV>mu7q&gl$oLXhG@ABq#u%F8AkyQcJYFy5A0Pkf&4p*}yjA8%h>WMxps zZP^(%U%e-e?SP@(rDQh$mESkq#8(Q&wgIKZkxv-T+gKdQP|J@)u484kr`P{iy6L?9 zM3>eZFi*a<`$HVezGsXQyhsWDmVKqC^6f?y4dr@e{dXQJ5i-T?dTSlC5OxV>*H42z zUb;)l@rwo8P7ckWPaM*gE!RV){3Qn$4mFD6eU9h&;sNQuKeE=-Vv*-A!v~(Sol8W! zrxnGN`x(RHORt_^9+Lkn+qc_C`7f#XzdL*nTp_QnAUXiT4`dMs@M8H)&=$lsXp_=9 zEa|Ul;=_>EZaEWN=gZRWr_o; zGC5S@f=dE4SCsbH+hv+rS4%t{gJI)xvOj)R8reM5QC$xMwqo>zdLPL;9D>__JS8un zeiMWdV`_2dJRwFjwS4^0U*sJd4Ax;d7{Srtq7buih$}l*fil$n=mDC;8i#Lh#zNo^ zh|V%{nV^cwm+%ktfYA*>7oc^wK>Ejz@z>ntTDyIW&kG zTXy3A;(fSW#o~X?ON{9v3aUO++_R*u{?27&S zLm|YwoRZ5y5Q8`7*INdhLop5QZ1#oA9-R=KQkp~ApGbzxhOuR4cE3v&4OG@V02 za!!QP@C9BJeB9BT@k!>)TJZ**l3a*r(_|zH$8EueAs&tEY}xz*$j&ig{v$h=GWe%M zzoecB7Xaway$X*2FY*TXMgm%O;}=q`p#6-^POsayP6le{K~YxsqJzPU{R&Z#1tViT z`+2v@shgx`N%zfjyNU8}fm87gR}*oQP+f}i&t8q=_&GDt7MCi#hOE!>c?dS(yx;M~ zyl+JG*A7tm%<$*U*vod_)E5Be0hQmL5ap$|BaEThZW>*anF02S4^}_#G?$AeVURAv zBkgLBx9nH9Y|u$o}g?L85lfjtL{=9Dl{;+MiT5i@%qFJI+WRJKLd#H zw0D3MyLxNBZ}Twdj~kw}xb!wW0&4~RCu~#2wl9C&f_JlrtN7+xZD@pY` z9`g=M^=1~*rfT6PKx0df)Z;#9vK3IErK^+Mxf^W+b^Ib?tze-|>}3CvMzG+hFnKJ0-DWgq^%||t!0W*JEdgvZ`UHlBJyl7&LBUFw zaqYX%^N2s!3EBs4I!llY6PmTx%{S>EAO%S%u!I_029($(ptPay-{Nk#?tY$?Qf zSAYbMK7Maa`{oTgCt@E##mzQZE(l4=U8qD`DQVCr-ZOH6T-|MY>CICN2lL9T<%#|f7qk&*Q9uE>E4i+Hj3oyhoh;Z^`oIg3besX{SfM-_B6gPJ8YXa1bcW~1137zLjyo&0P!H=QzymOS#dqQrn!5FIw zYwqZ@aYL1RbE|g=OZoG;H7twtUe0Ni+TmkfOsb93Hn?Z{=kOvSs8|l0SJ)7p(^{-T zrQVfPPPF!@NJpR7Q<=%j=h)=v>1eOR7~(bgQi-Qp>~PZf?F0b7k#~4Mx!V!vL8L*@ zpraI82+ z33tJj-u9}5V0>I+lqMYs)R84^6@GyCQ_;<6`+A1FiC}C#VUIv44 zRd8l%#=-#rvSzT}>3z1f19=y#9JsurMMTWP+Z^mz9Pq1kdG8A zR3K-!*;*-qQQey7dCU{E^d8dIfWd&oKoarlZZBZY`ETy3v2hoSRWBxt3K{6G@g_H& zmJodB-fp-l*2jsnQbo7Nvrn3a-Mq!slty{~N8!UAcFUT=SRjiI*PsX&=g zYuH@)-R3&8Xrh1Wk8=_U*xu-`e59dT1B8AoOl8RF@o}FyVt~GLq|0O5#<5Bi$wq47 za^`6)_X#d~r!zfFv0$VJbKESOTjrFpf2R$xm6@-j)_iXu_l32nq3OVtdg;L3jqgl$tu|^uh3hg8KwO&MQp-NL@EFx z==ODHHr2B%nAXlZ(x70km18Z5)--Sc_5C!-+4XVA{+hE~C7YR25&1h-y~EM+WzR>H za!;k=0?WGUh`dGopE2yN`oo69?PN=&23{pBiS5bH;vdui}Z#LgK8o!C3+bQ1#8 zs>aCXFA^X?!C)XP{p$+=pc=)%DN$+Dl5qC^tktSLP#3|QhQ+lBNqX1GGk?>!JHMGS z-zBOF#x1XO^YI^v`vtQVckiy5k;tD!$j%%cAMCoRT>s9QEu8eCG3C&-)8nC@9b8|p zcZJ{e!0x&y>yW#!H~W0Y2ANP|@3><2Ry)5e=bfK(FR3Y8lKdiAdEr&cK4qo>?~oG) zT}Y0glc}kfMQ8wgYw~1v-H5&YVu}52tOc|EJB?4;Y_}_}%o!ocho$#TYo5YojkF+O z-v4@@Q}iKD6z;HdBHFXy|YVIt|nvnw5To`p#SzKn@l&OG&4T1 zkpH{vulXXooI-EZo2WW+I+c2P5Xcmx*u6tmJK#?Aae1_K?V)rh0~5Zob#Vh5YQpM> zFz500X7h*m_>^vz-gDS=JZ)wAg(xP-1Yn*VK1{aK{vl9cWlCs-*m$t79*}=*gv7tc z5=)}b8N#TwiTgGromFjpmz|q<(kI*;sgkNm6!toNr$9(#{>?CNMxQ1IsQyQDe2yBU zPoX8pq}4YnnVL2pVG&9qy)_T`V3h44;d=jUkkwH@>bA6eZOlta(*^G#Yjt3$(|@H_RNYv?w>zOU@*!}s zuux8B%n#l|Y+$PTOcrId{z?=Z$aBAZC4q62JX^&U*YryrvT~k3`j&8~z@u4No*ZGC zf2$6B@Cx)0X6;C)ls=^9N>5g+%L-+q zyL4H>0uBjeb#OJ-mzT7;vP3}?Qza|-&Z4^YpQdNc$4jK8yPvgJBOkJd-6bWSm`byZ zepQYtksRfRtgTgj_4L4@)J#g+)~cL;4Tv=@H{7Q_wNrZbC!H=o36wCxx1IbyxqqTV z)O|}+;!jI!h9>xAf7pT$y6#P#SuVF6@>auq+O?WrRu?CzMHxm4 zUWD`}RB8-~Poa8m?;Ne_aCO`@;BQeRqXEs;OI>Hlwe5K|$K}FjOx=a=g6_7EH&Y3a zmVRBt&dlfstbF4tC93^fBp3Uh9ZCg=VIUtK9f^|w1w!2`l-0=O`}}N&o;25zaPJa7 zVUPRhW`h-?ozl10u%il<+G)C{-L9wkrLOz=r$+dXTl5Y>MoryuMJ9-r;qrpY$dR za^Z~$02-@(Rw}t!|H=bmIyIj^qjwb#><*|_^kdQuvYoD+N#Mt}r|n1Mwk~x@;}Ub< z>#7JT9x}5j@mYZy=Avsd z=h%5k3w0&Bx*D1|!~b-bI{F{bewm^{>v*Vrfo1rHEY&{z*B1^M+)Ve~tzM4Nx@hUV zxxWdxD1j{IJFfMzSVmE)Aes#Sz-kAH)__T=^r*G>718nqC3>X5^XA3tUvanS<1d;- zzrVL#wUnKSagN9xD`Na^K+DcEzI92-@6o7#1q}(@)g&@562r{jkn$2bQu&F0H&}~t z<3y4B+rG7a)?Gvb@N{S9f90h6#>RpwN=7d0YXrXvEtuGR!03KX)EbW7@t`-(=w10E zs2=_f)og`y+f3^2j4YTy<|PG}I#!WQJZYYoi~1E2Qa5$fH!qL24n`)SV?lyuf^Y$y z>eW>NC$?O?DBtv9sOu1qTJajBy}5!W_V^b4Fvg_@AFb*^4^LBNVuvcCFF{V=N0{x` zACAr@Sw|2Tix@+vbpc`vu06h&d_F&3zuHdI{55a1xf*t&y=IhJd{3gf9F~;2YZk(PoJdm@NwR5IUp$W3S>c)P#!CxWj zh%;-afAQ+lh-T~^0T4L0`GC94>N8zSotT>8x?DgiPQuS`lZ`v#cx26!=sQg+A}4x4 z%M-ltXs3LneQ6xbTJE~?#z!oII*PI(Bj9FDl*|8=zstz~KAh4)d&&73 zmvx`YXK4$+CkAEAcJ3(&W5wx%31@f?WvbizB8c^nFx=-HR=#&1CNd42DFsWnMVW04 z=Y|aq+Gc5_M>?BVo6)I9Z;o8yQAg1Phx`mNXkCm}u-n?B7x~~jPwO2tGHITM*7|UY z2(M8z3$2*Axvo}kY@Sz!QSxI_0vu=deULq}y*#Os;`vJEaPB_(z~0rnhSc;WF&v$Z zm-L%^?XPAPP`(sS4&DsULK}FWYuI>&X1-NwBQz23jfGA*MjLkdr!{gcwdmL!x`MO2 zyMho&^W#2v?U4fj!~qgBj8MiE+xO7n3~5fPM5VkufksluUfA#Y0#`Tt(umjHx%Yo& zHOc8PBJQOGs7#lSVCF+|N%~bZ$F2rdw4J_!98nTqcAM#uzLbB3)!-;XR*aypCAu*R zC=v&{yZm1H?|JoxEk_zIe&f}3!~vo= zds-@>mvwHY^z*%PBmb0SKE_>j^19y*F0EIcKcfna_8*LgU_wI8vJ#`czS=I(yG(Bm+ z8jAmPY~*~H60==CRr^+Rlw_ykQm|B=p%{|`06eFQ z^u#|5CNEtN=CbWGO|M3FySN_jS95cSq=G8n+Zv5C3WmQNavA%ad&WH!m54N`C1E<) z?$iR@Ikkkq?gD9|M}-v#KN))=V6YG$Zv_)ITZM-ejP09gqnHFrFdEyM?dDyT`#c}@$Zl*dA#dNlaq~_6LN@b5#mAZ^MS>Os zR$i<&R_}EO__xKG3ufZgDl(lVmvyl8VNCYV<+L?HuZNk@al?>~Kb?f27kGWT^ChD& zc>oZbQvU?`V~8MbplsC8=QuM^6lY+ta_=l8u z`T3}|e}7*~k^X|tdYiB@*w`uyD(k2vj)*S(jQ~{0igE5zg$FjE7B7g06sTZg5u;u= zGh3m|pIJG;%`GD1sGKArGI~w@?6BT5c%tDko|ryoVcc`p{fF{9NdpN zNBRfDvFVr5-8M@uWN1*+S-IY3kCh)LWp=fbZBRDHYmI;?gKHg=C`7Aebk#mgaHNFE z-tggU&Rvn;ukE6qn`xNVs#US7zZa$@NU?}mQ>F(*nD5mypgU$X8?n2{cJSZ99%$${ z#^2~mBx~T;S;!zR{i`LIQO?2nqwohmVN8gwBrWV-#`7p@ksRL<5fjSGjqi?aV>&o@ z2FI7%{y|nZP|pl}tK)Ea7*xiii(Y{7rFk8Zet_P^V&e&xi6K}T{LIgA@EZbK0iYuF znt9ApSqW;TDHJ@`@r-$In(^sY)n5|GLIm6IhM$At_y-6G#U{-*l$ZBZN3c+onEh3X zVnABr>95YNqOJ}*UqnJ3(Ks^ck=&>WIKSW0LjfES>}qsOiC|$;(1#6*~i8aDS~qOU(+nW$Wf9f9l1ZVsk%? z8)9sidwIds*zaL@qE5%OIq)BL%uBv=*|`|TM4%-A$W*80;gqhodsltZypJg#tVtlb zHZuljIRDaIuOWm|Bk=)K72?{r>i+-Ym!4@;x@o!{E@#-Xx{Kx8uBNMJw!~b%ppT9@ zOww`&KMwan!T`wW$mqH;0BS==Bq1dc_-iCbLrWEU6mr(7jK76`TUM_ErnXK0X+oZC zG(B8ri)%z79U?xgVnAt28Sz|>9f6hpk1$nLREEoG@uLJcpqna;`}$oq(HV|{PmJoS zqqeP}-tf`T&zqdy3#L~Ba=&TdzZwD&c$g`ykshBhg8}e+oA=SHndzlwL}Ay5DYp^o zMK9qM59{iZNd@^V?FP(8Lv%1Q%z41t zNJE&w3#}O8jzXavW)do_WQ-R~_h|Gcq+w+#|kBLf}Z;T}{7^<3k zzMOJ@=7w21Ybw~fAloui+{Rcxn@{&V=korLq?ha#&^A~~E5CIb)VzQj4RB={l8d_R zOO<>}Xd}($(8OYVX2G@3_cFD0q7*`=)D?P-eH|OAF%Q>jlIKR;(!eSzNP^bMz;fQX z(bppwl!~D{!O>cB%TWqJr+72@w4YZ)(Yp(`6+IkgD?h?|zpoFX`&~@SKHOvlNheA& z1pEXjZvASGdxe?43o!>Ri3iAqTp`acdsLtDT!zilI%jQ5i_d?~M#JwwioK@`hFUWT zU^?;zK{bxlVm(UpHqCG@@XBg>Y(8irB zax+nQ8lF$Fe`Mqc)z~v1vD4O^JzGQRmR#>~*f?4UzB3m;y}k$!@eBBA!|agSvXE=zRv$h|F=Agzod?T@F_Tgsy~0; zX>(NlGEe)4Id9J}xubcpPSln2B14nqae8GK^&nrgsDe7FzJ*QJAPB#w^8pk*!NvbK z`Nge6&L4-ros+oa_%5EY1M$`wf4=r_y=*gjn%OA2=IT1GcAA1i(Xt(q0;X|ePyklf z!#I6rI2)oxa?QXt&gBoi7DhqO{s5WEh^P}q^K9?RpSPd^Ui`2AMk)G=KVq2ue?|Hl z1V|o78X)%5oiXCAe}J|1o4}vp3#QZX4xFEH{2MKKHcIU+1f@Adq;p{|9NNj=Jmdr1 z?Y$P_;^bmI^fBhIEG!F|Wa~P9@Ax0nmBJ}oRq(%CI5~)mV(m@=kI-vTbg3`JV#7W6 z&TH?dl|qKS&qvks`p3Dfnl?q@DJJp%cEG?D7=Pp7F>EdWfVIlE<0fVONnWn|pDz#- zdV{AMsAS~{A4U+?`Hw4oDFga~vkefX>smYT#VLE&FWOQLaA_GNKe@5PClky`ismBUk4 zLj++C*TS&&(~ovA^^a3f{IA`lj;ahgy;LG|E_qw8HbFFcq}L7}{Hx0S)7qbJebiD8v_U= z*r-rRtv9){_nqb|<`;YoJG8f09cUygwO|WEEri;UjnWRR0FwFKl z_^Ic~L@$*tL=6a}?R?yi`%u)5PJx(}`Gn3B2KC?o^FV(t>RAa6f)8TW!o)F^GGq4k z(gKoEfXe!YNQSpwlt7?Hq~@Eno14C_4(fOQYdE_1L207aNKJu8#w|*$1cmAY+N|oN zdL$ZAs1U(`F%U4NoQVYRc#M{zoL!wd?Ya6?o7SC%gaT^MZG+Zkxe-b$Z;+iFDk(U4 zwAM2w;2tHjWw_5+XM;ToXf~Y`NJ6}uX8b>K2zRz+W2Ahu^>Fr8RiDVxGqi64M@Z>L z!%}`E+#@S(kWD2dgIlGSimUA3D_JR}inC&R=cM$Jyh|;j5KfAVdCv!1J&xWjA;}YC zA2_7)&+8}C1U4a-J=sQJ4OpGP!>f+6Rr5-1+XlQB+SM748!TxB$ z27TUF$_!IiC?`sk=#^O0$m4&dKu0OqqaQE+U;Rs{I`QZ3vrV}~=YZaGZps!$KA2styE;=W-O)K-!O)su za3UgNERp3}d#h3TExo z1Ay`G>cGPBZ;2teTZp99=aj2GDFN4#DJTCUf4vn!wXk}-s^F2fw&D8~MkUtGG9n`6 zgszD>F#sB zAblCjH7$g}-dLZpj^QFaL`uO^j^Qc7@YZ1o#pb(2g>c=z+LUBnzYWg%w@h<<1}V>k zXIBbfC9UqD54yq^QSsz)Ec}Yg#VIMXxXZQjLNsww^a&BaSGIJQD$N}5XZu1Kn*#nxGgVN z@=LsXe3agU#T)SBP12NtU1g6FW-&7|d=s2Sa2sT`#cy^3Ej5=aDKB1S4zFit4xFE& zYcHeRc(zrbJz6}!rMr2Jr{5Cn@(nY?%SFdU#H&_AILBxlZoc*M4ek3;;R`I?GuB@S z*M|1z$sfC{#k$f`;;kY^iBRj5^!-6ys4hj^@Q51pgAFLal@X`{x~h^y7|hP#VlYW? zAp3+ibYMulGscc-9A0EUO$qV)P~;nDRuqWuxa$sEM?^Yp6Y5*mW&>_x#j>lP75*U{ zH*%oOgtHcEC|iyWoQ6Xv_V>#13z*?a-b(oFQ5ox|90>n42IZvcwmjvG_|J33Fn`Ly z_X5W|oZZt#ydtVKVtSRo^POA1VKAu4+7Ty|X9uzV>>O-b3NRi!P8Q-LR*di?XW zi-dw_Z&m;Hj-x$M!Oy5|>d6#kz)@>R=LHSmh7m-T5_$j|ONt z3YUXuvXQ(#cs#B7ZNQ+A%NyvX%#Y=WH6IbYwf@4zAAcLz9tiS2{QCn@Hep`|0OZAg z?*eSHrOwB!3k!P@Ql5PPW1gzabzFCNue&6JA&A=bIXLqKo%FEAti%7691TPY|G=-I zZ(>m%npQwn!JoNbiOAj;$@}tzxi(jSBbBdRjD7luZabb^3bPM>^XZAahHxGGRl_ck z*EnPSvCcXENuSX;@U(RiZq;0>0*MVaQnN5B+95)|obm#8{wnvMdBUklRJ5c%nk5;s zDp5@Q%WUc}hhLY_dOPL-enjrIRvLMH(e^Q)jfvx4ejFL<^Z#&Eqxs3b;V7(eFp~a- z;;vb(qsGRfTH7j&6)9()x^-Jv7S^PLOY_h6@o?4z0wWomv3I~-=zqN=YVG>D%?EAHb~IB!l)rq>h;uS3>*t%pKI+7O^$HQ}D4+m) z@m^E8+i~u(-uQJL@S!=;w60szH;Y{>dNTz9g)Jw`>K~HlaJU}vhS{+X6Pohp-7HmVqF8!C0Kl3zz0Gq7!?IV{f)X-3otDj|1G6rpwe zfZpzN(LoMG;d8pmo$ zM`F5I^692`c{kk^)MG5WA`^)CZxuqL>!;q`2U7zJT;S~wa53a?`B8ty zH_)xYz*Gl~r_85Kes5aNmMP@kGo}zt0cY;%z!}hzI=LiP^5-7F%z3_E+mCw?a~o-e zy8LqDmAzU57NXGtTK{BGQ^&nK zdAa2R{*t~iF2myJ(Ed*V@JE-5J^YimX+dLMCvuxjX|X%*uj4aW95TOLWSG@#NVudU zM@ioBn3P7c^a8}%wsCID-uT5p)sZ`Md2|+GSk|sP(H34$*xW+~QIrWuthOm0gS0f& sE(Xk!XnG;Ljoo&#@}4lb=LtPHEs=*1`+gho$`T+its?bZ;^XK42gy{Ep#T5? diff --git a/icons/obj/smooth_structures/rice_window.png b/icons/obj/smooth_structures/rice_window.png new file mode 100644 index 0000000000000000000000000000000000000000..61645b22d964a22d7e13c6e0d7d061bb3e279e75 GIT binary patch literal 15418 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 Ba{mAT literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/rice_window.png.toml b/icons/obj/smooth_structures/rice_window.png.toml new file mode 100644 index 000000000000..52f1aae1b2ea --- /dev/null +++ b/icons/obj/smooth_structures/rice_window.png.toml @@ -0,0 +1,2 @@ +output_name = "rice_window" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/rollingtable.dmi b/icons/obj/smooth_structures/rollingtable.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9e559a75d94cf5c127e12642041e61b078c9203d GIT binary patch literal 406 zcmV;H0crk;P)*L_t(YiS5)e4#F@H1i(#48Jrhfs zp-t=Am>S`Hf9GaubbR8dM#o2vYD_$s)a8Qnz}0ZRhOWlKgGF5~?2!6C)WTPVzjz-G z{z!v}-0+^Rb3|^;mmv)za${b3unxJ)pD6w06Xk>dW0p0T-T(jq07*qoM6N<$g8ccb AYybcN literal 0 HcmV?d00001 diff --git a/icons/obj/smooth_structures/rplasma_window.dmi b/icons/obj/smooth_structures/rplasma_window.dmi index c64f42c7f5a3b491bff07a96ad6f8a40e2c5d577..1952a0a8200a25edd81c5078845b8612fc67b118 100644 GIT binary patch literal 16158 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 literal 9413 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

    + . = ..() + GLOB.hhmysteryRoomNumber = rand(1, SHORT_REAL_LIMIT) + info = {"

    Research Logs

    I might just be onto something here!
    The strange space-warping properties of bluespace have been known about for awhile now, but I might be on the verge of discovering a new way of harnessing it.
    It's too soon to say for sure, but this might be the start of something quite important!
    - I'll be sure to log any major future breakthroughs. This might be a lot more than I can manage on my own, perhaps I should hire that secretary after all...
    + I'll be sure to log any major future breakthroughs. This might be a lot more than I can manage on my own, perhaps I should hire that secretary after all...

    Breakthrough!

    I can't believe it, but I did it! Just when I was certain it couldn't be done, I made the final necessary breakthrough.
    - Exploiting the effects of space dilation caused by specific bluespace structures combined with a precise use of geometric calculus, I've discovered a way to correlate an infinite amount of space within a finite area!
    - While the potential applications are endless, I utilized it in quite a nifty way so far by designing a system that recursively constructs subspace rooms and spatially links them to any of the infinite infinitesimally distinct points on the spheres surface.
    - I call it: Hilbert's Hotel!
    + Exploiting the effects of space dilation caused by specific bluespace structures combined with a precise use of geometric calculus, I've discovered a way to correlate an infinite amount of space within a finite area!
    + While the potential applications are endless, I utilized it in quite a nifty way so far by designing a system that recursively constructs subspace rooms and spatially links them to any of the infinite infinitesimally distinct points on the spheres surface.
    + I call it: Hilbert's Hotel!

    Goodbye

    I can't take this anymore. I know what happens next, and the fear of what is coming leaves me unable to continue working.
    - Any fool in my field has heard the stories. It's not that I didn't believe them, it's just... I guess I underestimated the importance of my own research...
    - Robert has reported a further increase in frequency of the strange, prying visitors who ask questions they have no business asking. I've requested him to keep everything on strict lockdown and have permanently dismissed all other assistants.
    - I've also instructed him to use the encryption method we discussed for any important quantitative data. The poor lad... I don't think he truly understands what he's gotten himself into...
    - It's clear what happens now. One day they'll show up uninvited, and claim my research as their own, leaving me as nothing more than a bullet ridden corpse floating in space.
    - I can't stick around to the let that happen.
    - I'm escaping into the very thing that brought all this trouble to my doorstep in the first place - my hotel.
    - I'll be in [uppertext(num2hex(GLOB.hhmysteryRoomNumber, 0))] (That will make sense to anyone who should know)
    - I'm sorry that I must go like this. Maybe one day things will be different and it will be safe to return... maybe...
    - Goodbye
    + Any fool in my field has heard the stories. It's not that I didn't believe them, it's just... I guess I underestimated the importance of my own research...
    + Robert has reported a further increase in frequency of the strange, prying visitors who ask questions they have no business asking. I've requested him to keep everything on strict lockdown and have permanently dismissed all other assistants.
    + I've also instructed him to use the encryption method we discussed for any important quantitative data. The poor lad... I don't think he truly understands what he's gotten himself into...
    + It's clear what happens now. One day they'll show up uninvited, and claim my research as their own, leaving me as nothing more than a bullet ridden corpse floating in space.
    + I can't stick around to the let that happen.
    + I'm escaping into the very thing that brought all this trouble to my doorstep in the first place - my hotel.
    + I'll be in [uppertext(num2hex(GLOB.hhmysteryRoomNumber, 0))] (That will make sense to anyone who should know)
    + I'm sorry that I must go like this. Maybe one day things will be different and it will be safe to return... maybe...
    + Goodbye

    Doctor Hilbert"} /obj/item/paper/crumpled/robertsworkjournal - name = "Work Journal" - info = {"

    First Week!

    + name = "Work Journal" + info = {"

    First Week!

    First week on the new job. It's a secretarial position, but hey, whatever pays the bills. Plus it seems like some interesting stuff goes on here.
    Doc says its best that I don't openly talk about his research with others, I guess he doesn't want it getting out or something. I've caught myself slipping a few times when talking to others, it's hard not to brag about something this cool!
    I'm not really sure why I'm choosing to journal this. Doc seems to log everything. He says it's incase he discovers anything important.
    - I guess that's why I'm doing it too, I've always wanted to be a part of something important.
    - Here's to a new job and to becoming a part of something important!
    + I guess that's why I'm doing it too, I've always wanted to be a part of something important.
    + Here's to a new job and to becoming a part of something important!

    Weird times...

    Things are starting to get a little strange around here. Just weeks after Doc's amazing breakthrough, weird visitors have began showing up unannounced, asking strange things about Doc's work.
    - I knew Doc wasn't a big fan of company, but even he seemed strangely unnerved when I told him about the visitors.
    - He said it's important that from here on out we keep tight security on everything, even other staff members.
    - He also said something about securing data, something about hexes. What's that mean? Some sort of curse? Doc never struck me as the magic type...
    - He often uses a lot of big sciencey words that I don't really understand, but I kinda dig it, it makes me feel like I'm witnessing something big.
    - I hope things go back to normal soon, but I guess that's the price you pay for being a part of something important.
    + I knew Doc wasn't a big fan of company, but even he seemed strangely unnerved when I told him about the visitors.
    + He said it's important that from here on out we keep tight security on everything, even other staff members.
    + He also said something about securing data, something about hexes. What's that mean? Some sort of curse? Doc never struck me as the magic type...
    + He often uses a lot of big sciencey words that I don't really understand, but I kinda dig it, it makes me feel like I'm witnessing something big.
    + I hope things go back to normal soon, but I guess that's the price you pay for being a part of something important.

    Last day I guess?

    Things are officially starting to get too strange for me.
    - The visitors have been coming a lot more often, and they all seem increasingly aggressive and nosey. I'm starting to see why they made Doc so nervous, they're certainly starting to creep me out too.
    - Awhile ago Doc started having me keep the place on strict lockdown and requested I refuse entry to anyone else, including previous staff.
    - But the weirdest part?
    - I haven't seen Doc in days. It's not unusual for him to work continuously for long periods of time in the lab, but when I took a peak in their yesterday - he was nowhere to be seen! I didn't risk prying much further, Doc had a habit of leaving the defense systems on these last few weeks.
    - I'm thinking it might be time to call it quits. Can't work much without a boss, plus things are starting to get kind of shady. I wanted to be a part of something important, but you gotta know when to play it safe.
    - As my dad always said, "The smart get famous, but the wise survive..."
    + The visitors have been coming a lot more often, and they all seem increasingly aggressive and nosey. I'm starting to see why they made Doc so nervous, they're certainly starting to creep me out too.
    + Awhile ago Doc started having me keep the place on strict lockdown and requested I refuse entry to anyone else, including previous staff.
    + But the weirdest part?
    + I haven't seen Doc in days. It's not unusual for him to work continuously for long periods of time in the lab, but when I took a peak in their yesterday - he was nowhere to be seen! I didn't risk prying much further, Doc had a habit of leaving the defense systems on these last few weeks.
    + I'm thinking it might be time to call it quits. Can't work much without a boss, plus things are starting to get kind of shady. I wanted to be a part of something important, but you gotta know when to play it safe.
    + As my dad always said, "The smart get famous, but the wise survive..."

    Robert P."} /obj/item/paper/crumpled/bloody/docsdeathnote - name = "note" - info = {"This is it isn't it?
    - No one's coming to help, that much has become clear.
    - Sure, it's lonely, but do I have much choice? At least I brought the analyzer with me, they shouldn't be able to find me without it.
    - Who knows who's waiting for me out there. Its either die out there in their hands, or die a slower, slightly more comfortable death in here.
    - Everyday I can feel myself slipping away more and more, both physically and mentally. Who knows what happens now...
    - Heh, so it's true then, this must be the inescapable path of all great minds... so be it then.
    -
    -
    -
    - Choose a room, and enter the sphere
    - Lay your head to rest, it soon becomes clear
    - There's always more room around every bend
    - Not all that's countable has an end..."} + name = "note" + info = {"This is it isn't it?
    + No one's coming to help, that much has become clear.
    + Sure, it's lonely, but do I have much choice? At least I brought the analyzer with me, they shouldn't be able to find me without it.
    + Who knows who's waiting for me out there. Its either die out there in their hands, or die a slower, slightly more comfortable death in here.
    + Everyday I can feel myself slipping away more and more, both physically and mentally. Who knows what happens now...
    + Heh, so it's true then, this must be the inescapable path of all great minds... so be it then.
    +
    +
    +
    + Choose a room, and enter the sphere
    + Lay your head to rest, it soon becomes clear
    + There's always more room around every bend
    + Not all that's countable has an end..."} diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index be8b4a8edfd7..7c9413135eb9 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -624,9 +624,6 @@ /obj/docking_port/mobile/emergency/backup name = "backup shuttle" id = "backup" - dwidth = 2 - width = 8 - height = 8 dir = EAST /obj/docking_port/mobile/emergency/backup/Initialize(mapload) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 9e66a3efc677..b500bcd2aaca 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -59,6 +59,7 @@ All ShuttleMove procs go here CRASH("A turf queued to move via shuttle somehow had no skipover in baseturfs. [src]([type]):[loc]") var/depth = baseturfs.len - shuttle_depth + 1 newT.CopyOnTop(src, 1, depth, TRUE, CHANGETURF_DEFER_CHANGE) + blocks_air = TRUE SEND_SIGNAL(src, COMSIG_TURF_ON_SHUTTLE_MOVE, newT) return TRUE diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index e6976918ae5d..f60e3ed63f85 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -34,6 +34,9 @@ ///Delete this port after ship fly off. var/delete_after = FALSE + ///are we registered in SSshuttles? + var/registered = FALSE + //these objects are indestructible /obj/docking_port/Destroy(force) // unless you assert that you know what you're doing. Horrible things @@ -57,7 +60,7 @@ /obj/docking_port/shuttleRotate() return //we don't rotate with shuttles via this code. -//returns a list(x0,y0, x1,y1) where points 0 and 1 are bounding corners of the projected rectangle +///returns a list(x0,y0, x1,y1) where points 0 and 1 are bounding corners of the projected rectangle /obj/docking_port/proc/return_coords(_x, _y, _dir) if(_dir == null) _dir = dir @@ -84,8 +87,8 @@ _x + (-dwidth*cos) - (-dheight*sin), _y + (-dwidth*sin) + (-dheight*cos), _x + (-dwidth+width-1)*cos - (-dheight+height-1)*sin, - _y + (-dwidth+width-1)*sin + (-dheight+height-1)*cos - ) + _y + (-dwidth+width-1)*sin + (-dheight+height-1)*cos, + ) //returns turfs within our projected rectangle in no particular order /obj/docking_port/proc/return_turfs() @@ -94,8 +97,7 @@ var/turf/T1 = locate(L[3],L[4],z) return block(T0,T1) -//returns turfs within our projected rectangle in a specific order. -//this ensures that turfs are copied over in the same order, regardless of any rotation +///returns turfs within our projected rectangle in a specific order.this ensures that turfs are copied over in the same order, regardless of any rotation /obj/docking_port/proc/return_ordered_turfs(_x, _y, _z, _dir) var/cos = 1 var/sin = 0 @@ -188,10 +190,10 @@ if(mapload) for(var/turf/T in return_turfs()) - T.flags_1 |= NO_RUINS_1 + T.flags_1 |= NO_RUINS - // if(SSshuttle.initialized) - // INVOKE_ASYNC(SSshuttle, TYPE_PROC_REF(/datum/controller/subsystem/shuttle, setup_shuttles), list(src)) + if(SSshuttle.initialized) + INVOKE_ASYNC(SSshuttle, TYPE_PROC_REF(/datum/controller/subsystem/shuttle, setup_shuttles), list(src)) #ifdef DOCKING_PORT_HIGHLIGHT highlight("#f00") @@ -305,6 +307,69 @@ var/can_move_docking_ports = FALSE var/list/hidden_turfs = list() +#define WORLDMAXX_CUTOFF (world.maxx + 1) +#define WORLDMAXY_CUTOFF (world.maxx + 1) +/** + * Calculated and populates the information used for docking and some internal vars. + * This can also be used to calculate from shuttle_areas so that you can expand/shrink shuttles! + * + * Arguments: + * * loading_from - The template that the shuttle was loaded from, if not given we iterate shuttle_areas to calculate information instead + */ +/obj/docking_port/mobile/proc/calculate_docking_port_information(datum/map_template/shuttle/loading_from) + var/port_x_offset = loading_from?.port_x_offset + var/port_y_offset = loading_from?.port_y_offset + var/width = loading_from?.width + var/height = loading_from?.height + if(!loading_from) + if(!length(shuttle_areas)) + CRASH("Attempted to calculate a docking port's information without a template before it was assigned any areas!") + // no template given, use shuttle_areas to calculate width and height + var/min_x = -1 + var/min_y = -1 + var/max_x = WORLDMAXX_CUTOFF + var/max_y = WORLDMAXY_CUTOFF + for(var/area/area as anything in shuttle_areas) + for(var/turf/turf as anything in area.get_contained_turfs()) + min_x = max(turf.x, min_x) + max_x = min(turf.x, max_x) + min_y = max(turf.y, min_y) + max_y = min(turf.y, max_y) + CHECK_TICK + + if(min_x == -1 || max_x == WORLDMAXX_CUTOFF) + CRASH("Failed to locate shuttle boundaries when iterating through shuttle areas, somehow.") + if(min_y == -1 || max_y == WORLDMAXY_CUTOFF) + CRASH("Failed to locate shuttle boundaries when iterating through shuttle areas, somehow.") + + width = (max_x - min_x) + 1 + height = (max_y - min_y) + 1 + port_x_offset = min_x - x + port_y_offset = min_y - y + + if(dir in list(EAST, WEST)) + src.width = height + src.height = width + else + src.width = width + src.height = height + + switch(dir) + if(NORTH) + dwidth = port_x_offset - 1 + dheight = port_y_offset - 1 + if(EAST) + dwidth = height - port_y_offset + dheight = port_x_offset - 1 + if(SOUTH) + dwidth = width - port_x_offset + dheight = height - port_y_offset + if(WEST) + dwidth = port_y_offset - 1 + dheight = width - port_x_offset +#undef WORLDMAXX_CUTOFF +#undef WORLDMAXY_CUTOFF + /obj/docking_port/mobile/proc/register() SSshuttle.mobile += src diff --git a/config/maps.txt b/config/maps.txt index 8710bdc5b147..25c97d18a0fd 100644 --- a/config/maps.txt +++ b/config/maps.txt @@ -11,8 +11,12 @@ Format: voteweight [number] (How much to count each player vote as, defaults to 1, setting to 0.5 counts each vote as half a vote, 2 as double, etc, Setting to 0 disables the map but allows players to still pick it) disabled (disables the map) votable (is this map votable) +endmap + +# Production-level maps. map yogstation + #default voteweight 0.7 votable endmap @@ -37,11 +41,13 @@ map donutstation votable endmap -map runtimestation +# Debug-only maps. + +map multiz_debug disabled endmap -map multiz_debug +map runtimestation disabled endmap diff --git a/yogstation.dme b/yogstation.dme index c44c92ec14d2..65e12ae6fa2f 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -1599,6 +1599,7 @@ #include "code\game\turfs\open\floor\plating\dirt.dm" #include "code\game\turfs\open\floor\plating\misc_plating.dm" #include "code\game\turfs\open\space\space.dm" +#include "code\game\turfs\open\space\space_EXPENSIVE.dm" #include "code\game\turfs\open\space\transit.dm" #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_investigate.dm" diff --git a/yogstation/code/datums/components/walks.dm b/yogstation/code/datums/components/walks.dm index 8fb01a6a05fb..b72b3c9c5eb8 100644 --- a/yogstation/code/datums/components/walks.dm +++ b/yogstation/code/datums/components/walks.dm @@ -82,7 +82,7 @@ R.reveal(20) R.stun(20) return MOVE_NOT_ALLOWED - if(destination.flags_1 & NOJAUNT_1 || is_secret_level(destination.z)) + if(destination.flags_1 & NOJAUNT || is_secret_level(destination.z)) to_chat(user, span_warning("Some strange aura is blocking the way.")) return MOVE_NOT_ALLOWED if (locate(/obj/effect/blessing, destination)) diff --git a/yogstation/code/datums/ruins/jungle.dm b/yogstation/code/datums/ruins/jungle.dm index cdec1a7c0af5..f0b77263e4c6 100644 --- a/yogstation/code/datums/ruins/jungle.dm +++ b/yogstation/code/datums/ruins/jungle.dm @@ -4,7 +4,7 @@ cost = 5 /datum/map_template/ruin/jungle/all - place_on_top = FALSE + should_place_on_top = FALSE /datum/map_template/ruin/jungle/dying/crashed_ship name = "Crashed Ship" diff --git a/yogstation/code/modules/guardian/abilities/special/pocket.dm b/yogstation/code/modules/guardian/abilities/special/pocket.dm index e98154ac2949..dd06e2af5925 100644 --- a/yogstation/code/modules/guardian/abilities/special/pocket.dm +++ b/yogstation/code/modules/guardian/abilities/special/pocket.dm @@ -430,7 +430,7 @@ GLOBAL_LIST_EMPTY(pocket_mirrors) icon_state = "0" appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE planetary_atmos = TRUE - flags_1 = NOJAUNT_1 + flags_1 = NOJAUNT var/next_animate = 0 /turf/open/indestructible/pocketspace/Initialize(mapload) From e84597a1f76fab011c0daef5487fac09d3d89a5b Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Mon, 15 Jan 2024 11:59:31 -0800 Subject: [PATCH 193/281] fix wood walls and other walls --- code/game/turfs/closed/indestructible.dm | 25 ++++++++++++++++------ icons/turf/walls/abductor_wall.dmi | Bin 4519 -> 3924 bytes icons/turf/walls/bamboo_wall.dmi | Bin 4667 -> 10637 bytes icons/turf/walls/bananium_wall.dmi | Bin 2613 -> 4150 bytes icons/turf/walls/clockwork_wall.dmi | Bin 3276 -> 5140 bytes icons/turf/walls/cult_wall.dmi | Bin 2898 -> 4211 bytes icons/turf/walls/diamond_wall.dmi | Bin 2552 -> 4215 bytes icons/turf/walls/false_walls.dmi | Bin 0 -> 51319 bytes icons/turf/walls/gold_wall.dmi | Bin 2568 -> 4192 bytes icons/turf/walls/hierophant_wall_temp.dmi | Bin 3547 -> 3322 bytes icons/turf/walls/icerock_wall.dmi | Bin 2451 -> 10417 bytes icons/turf/walls/iron_wall.dmi | Bin 2568 -> 4109 bytes icons/turf/walls/material_wall.dmi | Bin 0 -> 1783 bytes icons/turf/walls/materialwall.dmi | Bin 1188 -> 0 bytes icons/turf/walls/meat.dmi | Bin 17694 -> 0 bytes icons/turf/walls/meat_wall.dmi | Bin 0 -> 12436 bytes icons/turf/walls/mountain_wall.dmi | Bin 2532 -> 8292 bytes icons/turf/walls/plasma_wall.dmi | Bin 8763 -> 23848 bytes icons/turf/walls/plastinum_wall.dmi | Bin 4799 -> 4213 bytes icons/turf/walls/plastitanium_wall.dmi | Bin 5728 -> 4285 bytes icons/turf/walls/red_wall.dmi | Bin 3787 -> 16894 bytes icons/turf/walls/reinforced_rock.dmi | Bin 5077 -> 12605 bytes icons/turf/walls/reinforced_wall.dmi | Bin 15211 -> 5060 bytes icons/turf/walls/sandstone_wall.dmi | Bin 2576 -> 4130 bytes icons/turf/walls/shuttle_wall.dmi | Bin 5329 -> 4622 bytes icons/turf/walls/silver_wall.dmi | Bin 2570 -> 4069 bytes icons/turf/walls/uranium_wall.dmi | Bin 38601 -> 29440 bytes icons/turf/walls/wall.dmi | Bin 2871 -> 4024 bytes icons/turf/walls/wood_wall.dmi | Bin 2666 -> 3832 bytes 29 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 icons/turf/walls/false_walls.dmi create mode 100644 icons/turf/walls/material_wall.dmi delete mode 100644 icons/turf/walls/materialwall.dmi delete mode 100644 icons/turf/walls/meat.dmi create mode 100644 icons/turf/walls/meat_wall.dmi diff --git a/code/game/turfs/closed/indestructible.dm b/code/game/turfs/closed/indestructible.dm index 429d692ba0fb..b233e45ad9cd 100644 --- a/code/game/turfs/closed/indestructible.dm +++ b/code/game/turfs/closed/indestructible.dm @@ -100,6 +100,25 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) base_icon_state = "uranium_wall" smoothing_flags = SMOOTH_BITMASK +/turf/closed/indestructible/wood + icon = 'icons/turf/walls/wood_wall.dmi' + icon_state = "wood_wall-0" + base_icon_state = "wood_wall" + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WOOD_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_WOOD_WALLS + + +/turf/closed/indestructible/alien + name = "alien wall" + desc = "A wall with alien alloy plating." + icon = 'icons/turf/walls/abductor_wall.dmi' + icon_state = "abductor_wall-0" + base_icon_state = "abductor_wall" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS + smoothing_groups = SMOOTH_GROUP_ABDUCTOR_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_ABDUCTOR_WALLS + /turf/closed/indestructible/abductor icon_state = "alien1" @@ -177,12 +196,6 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) pixel_x = -4 pixel_y = -4 -/turf/closed/indestructible/rock/wood - name = "wooden wall" - desc = "A wall with wooden plating. Stiff." - icon = 'icons/turf/walls/wood_wall.dmi' - icon_state = "wood" - /turf/closed/indestructible/paper name = "thick paper wall" desc = "A wall layered with impenetrable sheets of paper." diff --git a/icons/turf/walls/abductor_wall.dmi b/icons/turf/walls/abductor_wall.dmi index d1d7d66cf0f418a0a53ff0ee7518492d724a3a1a..4f731d99f4cd24ff6a24b4b23fdce5c71f9a61a6 100644 GIT binary patch literal 3924 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 z zn9)xZXtGvwns6(2lM8|*;jk$WHZ{VHgF}@Wx`H=iJf90y%L>Qj#K#!nCcvT8HCMsk z>=+Y6%Bd&k(0PORK7e(E?!x_W5%=BKEaC3O3TqOAhaC``lj7VS@y)^TS*3MKq3RsZ zUZ~e5jm|M{14;LUZDU0 literal 4519 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 diff --git a/icons/turf/walls/bamboo_wall.dmi b/icons/turf/walls/bamboo_wall.dmi index 4eafc79ad48b7ce46d289df915fdb24e4f50b5ac..44c5824397e5a9f0fc3f138faf2abf0d1325606e 100644 GIT binary patch literal 10637 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 E57dW<`~Uy| literal 2613 zcmV-53d;3~P)N2u{{X^zkqKp-V ztSDuT+nRdN6r7BJrP33aE`1$So1_Md*+D6MNjQ{`$n@L1LRCt{2Tv2wTI1uCrOA-zc zzs&*s@_YdACjZOW-2W2uw#Il?nG@cuZ)-H!0F0B3kE;E-5& zFA@w7;iE_3Om927Og1s&yA<%XWRWkzfx`_x?SEBRfrY=Nfv*)3`JxHZ;Wq6SR$$@# z)blC{d=dB#-U0DW!&pIS;72FqmNX9eumwKhj_?i{zbJ(Qus|!mg8<*H5*4QTI|#5< zi2Mcu9{vb+AfN<{6{h&R2*3)NfYmR-?jAvA0od(WH+*;tqy;`ez{V|rgAE&e?jt}O zZWF_AqhXeYJ0ipJ;BX*5jTNexr9QugHJ6OJV9X_BE?Vr8NvD%Jq0A{|PAWL1!tGAE z;qIkFEc|{r&`n3TTm~M9j}QkSCIUpD0)Yv%7Z1f)Xod+xH4M!HtzGmB7=uw3oZ^AO zs0dD(fC?)#3J~EshUaWPzakh!i~RviP&ik7D=o$~!6*QyU{HW~1WZ8i(x{kCO0k!c z3JAK5j@kYJIzPbX_b+uCv;6~Xetj+dnW}o>;%O9StydH+DVJS8|4-6qhxX#YT>y!Md(02+?)f+hP0QssF8)O3z% z+5Um)^3+G53?6LqdhX=3DDR-o4>WT494=nCe_*OSmxLYA9Ee+5ynkS#yia|8U^;EI ze_+0VjTWse0yfz{FyD{gX#c=(^$2z#;Qspu4DtL%`v-orNAM>Ku-Ji3_77xlfxQX9 z;nO03%>`&>t9Af!P+`gr;CuqZodD*NL4`@|=L_azU4U4WG6?YV1@o~kK)TTe0ddK+5-+DYEh0+ZhxVCwm) zazdU8xWkf7lBWXJFIuJf8IPc9CYSBBbwlfCza|0d_Xbdb{ln*Ug7(|u)9=~$zi9EA z@n!+^`vT+s1N_u0W!l($fRWfRbPG&JausNXPSR zK0xMI`Ex=*I-Y0q0g7OSzrG~|q~m!uA0YE9e0lty7C_>8HXk7JYy9EgW?Dd^FjWA{ zul@M)-jsh$2w?F%oe#jI@nuQ?Nq2F<&hOKY;HL2uwa=^am&;D|Dy_Q`voQv1Sa&;?y!P8EY*t8Y|h8+(*o>^)hgNwkJAIkHe`}Hm0|2*(`Iw~Ge zi(x#);T19F$MT$j_qQ*f&M)on!KvqC)MD@`(7`~A`LR5=lj{Ae>;GRbgQfGQ9Uq~h zxPniGE*4_UkL7s*-(9WOQNT44a1Aa%r;Z80{8(NrU>I)wX>h@4IMA_2KOZsX$MT#d z+))cW1q^QYb?7KD>Iw|I6~_CBF+Y~)?ZBQ|;HL|C+JRgGvJOVshvV!HNp_bkzf+ps zEzcg9WDm`n+`;J%1jH4BpknKkT>!px_)=~zKy*9kmJbs!7#=W8n+rhGi>7&V0XX>J z;Iz2_G5o^tytx2$K+r+iT!3)Fz(sqIfNLb+8-IL+fWZ(!obWIKLkmEh@OS~a9>ER- zl$wA?b;I#yalYW;0)Fm0@U#P&A3?^!DEn}n-67eFOP0?m&F+?G4@~lhX1RmY+yedw X1_}*z4$(P300000NkvXXu0mjfo%`=w diff --git a/icons/turf/walls/clockwork_wall.dmi b/icons/turf/walls/clockwork_wall.dmi index d6f1872d7c0b38d5c573eb40c4ab2387c4f2d083..8785209409b288a1298a90129d2cd075e30637f8 100644 GIT binary patch literal 5140 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 literal 3276 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 K?pU=mFyX)TPx$Hp literal 2898 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®Aq61_=o0t@ZKqfcEdU4Z|~Zd3=QEh%wLF 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 literal 0 HcmV?d00001 diff --git a/icons/turf/walls/gold_wall.dmi b/icons/turf/walls/gold_wall.dmi index 7012124c271c2cdcb282a54869f226657865c00d..283dd437646d5bb0cade4d2589e5e32122e15a74 100644 GIT binary patch literal 4192 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 DEK+7D literal 2568 zcmV+j3itJiP)fFDZ*Bkpc$}SymylxX0T000PUNklQ@;(f$6 ze-!Zc@53qm{X?r@JReiee@ocr!?9aDd_ARy*sY)f4R&I++v7oKohbqEm`) zH)19L-EPEr{<~IS8JGyn?7&M|p}@IaX$6*{84JY_W9UUfF&UcmTDwRSF%wY!UWv>6 zJH%@XI3NyL<}Q|pe(vDA11ey=5O9EB=-|@<{EqQKJVQUg)cW|QH zcJSSAEV~`yO99dFw9jQf_web+_&ZHN$rraEn%<_lA8caAcPZodl0`n`14kTuj{p43 zEAa5Abm6}#B=R92I^*yg|II7#@aJ^qH4gcZ`3}heNlrswLF3?iC*+hg4*Agb>G5pY zvI<%UKPlw`us|=qf`HVmj0$c33Ico;BENuu)o;ND1T=uLLW{qO0IZM+nEeoJ?iN%Q zfZdLD!_`~B7Px|dg7hd`g0I$g)4?s5frk-@G#X|CFi?TO1lo&- zVk|VngrORSW+M6pjKL@iPFXN2f>S17hZQ;nh;SXlb2gv9BN#-B{Q-1-fK8F4bI@F3fc* z=Q_24uJ^NepFV`PTOa6pKa2ON9k2r%+&|zBt>%Vy`SSgw;Bszo%LLHynh9Xxz3>Ob z1^qE?|G;p0=@4T9HW8b$aZJgK6CfTMct+j(2ki2c;8b)QW7=-i{sE)B<01V4VK}l2 zChZ?E%1Z*M>Fm?A{R6}0skcBGJlN#**vV;8-h(zjpbekrG?aq5T8n1uV2^bIG7W6Q}ut@mLoi7Nr~l(tN>q ztP7BCv_rsM>%k`hG@j22pc|b~u!&CsNN83Tz_#_gH4dx`&=#l13pnf?SQnrz&pQMh z9Jmv};&~{*v;$)*6arX04+Szzn_LKB@w`s}f9Qk&9?yFOV18D862Rj5tUzW5Mi?F; zfW`Agf%8nUE`Y`J9sy$pA0dFn^Bw_XhF>9o#q&_185fLkK!gC60V=fcq;wPD6R_~U zVlJS13)}?Q?;BJRFt`5qCSc+BjJSY>-!t+HSh)ojnyhBE+SB#w9s}jtL7oaA3l{48 z1!rF0eE=I8nSd)S*_b>PFn`g?=0`k)#gN*CjxG-+(P#vW?9oLHjN7>i6j1 zKWXur@ooY1{Q~Fy1ANuXGHq-=K+7-qDB@Sh5?o-#vur*<%P)8$z>MeFe1MW)^2f(; zX9zHg0L&ODKAr9C;3)}?E z>xQ!*f-SVbhZk_O16vc|m|}PD7toRzjhxExJza1j{uLwVwJ!P#lzOLW9Ap5pL|81rL!;)BWAY2r(C#Nbh&gMk?H zV|ntE(fw)17bt{R@Tt(nLX7#bJo(Y={`7LeYjy!TbxZ)}$MWQN%lp&pg5GeTV~>75 zV$6@_$?uj|ZGoGBi`)Hr=_n=Y3e39|#`}mdKb9x{enIUP_~-&|cA%Dks)JGW;kdd( zQr#u1@03<|%c}<_)kCwkc5u1@0cC|CC@h_-3&4jCAIilAh;9enay0=L!vltCaRF$0 z(KIhE00$o&oE8^=!!Hiciwi&p1Ra#c1qc@mT(p%0ycPnU@ITiOa4|#>C#)vm(gF}C ztS_L}E!cp7Mia1BH|&2b&KImM;Nw06H#<=I7E~OJst?E29g^xUS#_thx?5g7FsUD! e)ecT;3-}*T3zK8@kp>_D0000WUQ6HW&7FQD? zRd^)z?AGslTv3tPyfXL&5;(S#LIDa2oM+Wv2|^_#c0d2k@r38C(v`BoqUoN!PP$35 z3;L_$Gq)-Z?Z+4x7|R+i{9)sFT#ga!cHz#uhg+%icxnUF7D_O^eWd$M%(}kwqjq+? z)cnUa9!pe6E6nK^H43*^xtpyMH1scMbF>+H235aut%dNiXX98VNaVXoT8)iJPedSA5~6+iTnfA;Gecc zWBh|uax6OH-E;~nQ4so}a3aXR!MU6UB^PfzTQ5GHFYM-to`0sP9gj`V*~O3H)+8LKL6sqy6OF;th?ar%(35uMUIiQs(!v7PSOh zv(i$@*Mc1+bk&s{WTmB)?f?Lo|1q6g0o2WxSIHE$veiXe>%qVPkus@wBGe%P+gq<~ z;5)y=u3#Lysqt4)&n0eRdlBpgq9WFmGCA3~c?+Z&ry?4_=p2q?@~O8eTNHN@_}j1a z?g|EbzO-{H_`@3Min(NtDx6c5nIB+x#%3;?6pqXszl=h?q3!2aOL2}TZ zaQ!5r+!(hml^5M+Et*qriqVWR7H(Dan2DX2!NL)i|L=ns5lX&2W+H~f!Be2VptHQ|+3M%C?-|7EqqprKQy-B?y$mKj}*&ODI(} z=pwm^&JB;;i7R^ zrGwsFiTzds6x zO^w*DXdY^6O);zk?gM6zEXm`Hd(AJ07zeCiwqqDx`$2H(7 z-r8$`&CA#7qqxWxW-f5DcX=^1Ec*ZA=?~gI%O1iu2YT6cCebpsR{1@R?+IYI8%hXm z_FL-qZFmNopyY)fjiTfEJN``_8Xc|sV&gfr&ysrdU7D>Q)iDUF9mP)xs#dirUcP9n zpdR{nU(Hb}hmzO90zh4Y-%+w_34$|uQy31mE6SY--?1K*Q(MhZEPpnoYOBL~epO!%?qQH1cZbbYDI|6ay!lch04!i#3Pi zMR|2$qIL2sC1XLl9#4UR*{%WTbx7;@e_`mKTJ9*C!8EF3#B+jpI@Td!;$&5$-0oTy zOz&v97bK*BANd~~3JFR38!xsSo-=R0!3;~O!-GTYfAS(8qO|9s{zc^?lt+_sZoBCm zy;8tog4zJ%tdZm;h#8IodI=zLJ2n_wZKE@%@fl*( zEp1G`%$a&#&Eer6^0#sZ48ILRFTSnMx8ffR58H`qK7D(I*w5e)(Ta=gAp5;_HzCtz zV?3nS+G?yv!VVR~{K<>K8QklIKA!hkOotsTVZ68&|?n!WrJu7!}^Wt)*=(lH&iMCYYFWgNWslxI13)pD^Bc;GRfxj-NFH94+$h}&niCb#GSnLnS& zDK3ry%ohgFCl!fya!OROrdb zE;(I-1yDRiy3Fk5f4i+^faWjS*J+J57XkqYOPZ-SrjB(=rwS!k8|zr5thr&qMRdup zdgqpOTmFhuI%q`#P*aS2Ie^#LuL_f07^VEZ($T>u?>TEo+F0m1R$Mg9vL%>DLJou* xO=VOKF*0#LS54(hi#h5LtAD0cBA^M})9BE)W7Jn+g$UR2D-RWXpgGil9K!h$t#ZVB8T1 z5S6PAgiTNaL~&45Fl-WV42zDKkU#_yLOSX0ubuC?|9tL`>aM5iyr)igSG`qzac_{H zzOI=r27}QL@ZY%)y^ntr>=N{9X8-#H2BW5t{%c6e&X^O2k5iITD94UsFsDjNud)j| z91VR$i*~+y&pJ1q4JcZoRlV;iuH4@=@!}2R1O;UOpBo=jl9TV;`rwlG6C2_tU4ixAy#R=I6D}ANg^p zm6J2$CCjFS<0Tdrj9ebCw;)TQC5X#9vE(K>OYtZv=yPYzZJmwGWoH{3@%+94vm=56 zeSVQyjeYfaacYu2P|#UT?5RWKfA3p(838_zgfY-{f4)oH#W4(K>6L(;Uca6ynJ#^H z+Wd)ePPj4; zNFJnIIJ*Ae#Co^kK8vq9j#q#V;LOrzμHQdM3cxx4$)A`{QPKpTD-eEyg<(hlRc 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 literal 2451 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 diff --git a/icons/turf/walls/iron_wall.dmi b/icons/turf/walls/iron_wall.dmi index 351109bdd3fa74ce67e1d1d8d2634c6331a1be6e..d2d723adb28b0b87e5db18f6027057b0d564afe6 100644 GIT binary patch literal 4109 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 literal 2568 zcmV+j3itJiP)fFDZ*Bkpc$}SKnq1%r)a$nA|18C|_^R%C;F*jeg z^26^ZMK0w$chpBN!+(!js?Bcw^Xv2t&LXJYzV1gC000PUNklQ@;(f$6 ze-!Zc@53qm{X?r@JReiee@ocr!?9aDd_ARy*sY)f4R&I++v7oKohbqEm`) zH)19L-EPEr{<~IS8JGyn?7&M|p}@IaX$6*{84JY_W9UUfF&UcmTDwRSF%wY!UWv>6 zJH%@XI3NyL<}Q|pe(vDA11ey=5O9EB=-|@<{EqQKJVQUg)cW|QH zcJSSAEV~`yO99dFw9jQf_web+_&ZHN$rraEn%<_lA8caAcPZodl0`n`14kTuj{p43 zEAa5Abm6}#B=R92I^*yg|II7#@aJ^qH4gcZ`3}heNlrswLF3?iC*+hg4*Agb>G5pY zvI<%UKPlw`us|=qf`HVmj0$c33Ico;BENuu)o;ND1T=uLLW{qO0IZM+nEeoJ?iN%Q zfZdLD!_`~B7Px|dg7hd`g0I$g)4?s5frk-@G#X|CFi?TO1lo&- zVk|VngrORSW+M6pjKL@iPFXN2f>S17hZQ;nh;SXlb2gv9BN#-B{Q-1-fK8F4bI@F3fc* z=Q_24uJ^NepFV`PTOa6pKa2ON9k2r%+&|zBt>%Vy`SSgw;Bszo%LLHynh9Xxz3>Ob z1^qE?|G;p0=@4T9HW8b$aZJgK6CfTMct+j(2ki2c;8b)QW7=-i{sE)B<01V4VK}l2 zChZ?E%1Z*M>Fm?A{R6}0skcBGJlN#**vV;8-h(zjpbekrG?aq5T8n1uV2^bIG7W6Q}ut@mLoi7Nr~l(tN>q ztP7BCv_rsM>%k`hG@j22pc|b~u!&CsNN83Tz_#_gH4dx`&=#l13pnf?SQnrz&pQMh z9Jmv};&~{*v;$)*6arX04+Szzn_LKB@w`s}f9Qk&9?yFOV18D862Rj5tUzW5Mi?F; zfW`Agf%8nUE`Y`J9sy$pA0dFn^Bw_XhF>9o#q&_185fLkK!gC60V=fcq;wPD6R_~U zVlJS13)}?Q?;BJRFt`5qCSc+BjJSY>-!t+HSh)ojnyhBE+SB#w9s}jtL7oaA3l{48 z1!rF0eE=I8nSd)S*_b>PFn`g?=0`k)#gN*CjxG-+(P#vW?9oLHjN7>i6j1 zKWXur@ooY1{Q~Fy1ANuXGHq-=K+7-qDB@Sh5?o-#vur*<%P)8$z>MeFe1MW)^2f(; zX9zHg0L&ODKAr9C;3)}?E z>xQ!*f-SVbhZk_O16vc|m|}PD7toRzjhxExJza1j{uLwVwJ!P#lzOLW9Ap5pL|81rL!;)BWAY2r(C#Nbh&gMk?H zV|ntE(fw)17bt{R@Tt(nLX7#bJo(Y={`7LeYjy!TbxZ)}$MWQN%lp&pg5GeTV~>75 zV$6@_$?uj|ZGoGBi`)Hr=_n=Y3e39|#`}mdKb9x{enIUP_~-&|cA%Dks)JGW;kdd( zQr#u1@03<|%c}<_)kCwkc5u1@0cC|CC@h_-3&4jCAIilAh;9enay0=L!vltCaRF$0 z(KIhE00$o&oE8^=!!Hiciwi&p1Ra#c1qc@mT(p%0ycPnU@ITiOa4|#>C#)vm(gF}C ztS_L}E!cp7Mia1BH|&2b&KImM;Nw06H#<=I7E~OJst?E29g^xUS#_thx?5g7FsUD! e)ecT;3-}*T3zK8@kp>_D0000U1Gt z9Bi~(tUk14DXhgdLhD#V<~L{i&2}dBzy5gN_xU{U`*}X!=lgu0=e-mXbyNM=Q4ag#x=qp5d-e9g69 z%jn2Dy{$e+*N&U(>1+!0FtM2hjY};GLWky@(Jn$-c{1Qe`EY?goCZ7u*HL5S_jvH| zKGWK!Qp3TTnupA0ixQ?|ahyBSg-4a%IXxZ9B~dc({=H?6iLu?1H5Y$q8@Pt%K|7bV z8ZekNsX=(q^5wSu)kWr7`*c=&+ZQ#3bbD^L8XoLFe`mzr;rZ+Ee_A&9=6Cd+@SDjz zU{EE!QN0n(>IgO1?BK8TgIa5vk`601x(H18j|J5$K)*)A;fpuk@4J#(^Q^ypwBu4~ zIbh12tZP%?0%M&1qxo2dkP{$~m1KXfy%N&tB`@hBwP{ zb1gSN(y=T$y!LIYyRZzz@*c!uk_xs*kK<)h@euLXPa+O6pF*K9lt~fA%#H4FxDpV= z&@pZbg-qh8A!JO+3fXka2?Zm#oe#b6CmpKWOu!%HuM)L$L?uEzuFMUm^_T=$ByQ+s zOv_Gn3F~|DT#nll{CW@VO1+tPNR6w#GC_tiayKVijKU$HZZGZ=Y8pn%$e)La4j$S% zMxGjZ*CFdREYGyltV4*#?&1c!>ocbp@b!h+HAIHFI_ed>NiyxM)k^JkP*1-cqb!3) z{+6{#zZ`KMSYTXh?&k=G&hqb5e<J_kq*-I$+cwJaX3E7J=-jn=1Zn&5s|*A1ui>gs8<{nvWVUVcKatv zI~y-LtCKR0xK)oV7vUA=M~Ibu0blOFCp&d4w0$ynE3`lnxGU{RHYS?Y%^{pCxou=@ zlea?qj{TGUQiw0ty8>lk34dzvULMcOwx%1rPcrB9QTmHp(DVD_LuEHGP8BFIc z5@>8gjV1D)ef95Qx03}KKdUh;(fb9?GR&$OK3hJMYF-h?je||8a4CV<1^KBMR(s+z|5199tEh681VD+seM#3;G*P>BeZb9LED{8rZq=u}g%>nw1pnZWp9 zeQ`<36VO3IAA;rM5igZ+lx|NaQMV(=P#5(RDQGw1i#M9Y(#btI)pS#ErlOUEefn;P z#7Cf=kfCBHl>)5{EWKFZM#wZbU22Y&o|$=^RQ9{_!JN~)-gj4_(;~V&BfBt4qXMh> zN=wkztN-y2YwS|%g_w};hZScRusWtZyP!75_ZT(59=uI$FY&;?lidjfDkz^$i z8gUvu=4k-{yb?w|#M??f={}jFuzJx3BGDO0W;n)HCG($9G$2Xdm z-RCV=sg;K){W2sF+98s#8+jk?7PYSyTOwE5M`E)Cku)}m3o7nbWQP(MN~KyfbtZum zzwJ}IYkLu$+(Up&G|iZm6X$f?Ec=((@+?2T5NxRWOkz;pq? lg4r+f1K@&9U{1PnrQ@#fGo$9cZ1qnD@%Ik$YVeHB{U5K9H8cPK literal 0 HcmV?d00001 diff --git a/icons/turf/walls/materialwall.dmi b/icons/turf/walls/materialwall.dmi deleted file mode 100644 index c81fd64c21b778dd262f641f35c0223f1e9b85ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1188 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%0A037@!LJ^!jgHQ@ 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 IU5DrY2bc$;hX4Qo literal 0 HcmV?d00001 diff --git a/icons/turf/walls/mountain_wall.dmi b/icons/turf/walls/mountain_wall.dmi index 574b35b7f1b7ed6dba397cb814106ef422a165b5..31ca67dc40bf253161e7bacdc06ccb4bb036a5a1 100644 GIT binary patch literal 8292 zcmb7qc|4Tu+x{R8+1f10QkFc)zJ)9;wkQf?XH>{OREimHBvdq#tXWD~$5OT-F_uai zyO1SgXK2jW2Q&Qc(er%Y=l#8(_mB4v!)LDhy6^Kkm*YInTzp)E^*O?{hqp zA)$JI+~BDH8{7$24A&}?PX!K9xgdwGWv>aZNl!IN@(k6=D4qAyXd!1Wgbe3rlr2c0 z_lNRKZz%M;j%T^1aEE-mq?i=*F+}y`M!U~9jAx?E#N1*n@F`v$c`wNE%37?`Yo|+f z;Yg0P(?1ZeM=#L%=9Ry5u;f096yy7D^Owt;m#QLO^A{}qqN-fx{yH}FA_wnGRC^bw zeHvXnO3g=-4WW(07nHrUUkzq2ZIAH%0kcES`qE`w11f)asWjss7{eyu-@a z=eD)rr!sv@NGd%|hw9kmzIoGB3IY+8xU6@~aQCO>o z?2QsJR}yt#(uDBw3f~vf-*~Cb{(kr4&>fY2ysrJ9&a1k@efTpNJn z9M7Mv25yaQJ^L`QR*O7m^f+g3Wi~66ThcWUfm@>&fh*w)XTQn}kmn^0E}GAial1~m ze(1XpyRe*T_W6W%)8CK(zUImR8EUdf8pbAzhSHXniM@FoA-mwc>dD*GrOD~g-EG1& zmH=$anPlw?O&)d$)VYAh^u7tXCo_=@2R6scPTm9TMOX$9T6ASNt~iynMSng0*D`K* z2Nkq3(=Hj&L0J1{~DQ`ob*Jg za&b5Nvy~RJ=~90+cd`H>Kqo6F9TwjwF8lItV{%wxamTJ+Y3A5~VGU&obe3aF~~q`{u$d171iTu`Vz&pQs#H zN7Gi4$rJa9@m^3f)@S z5|6Ax!gh7_#4i z2?CVzp5Z2Pb2QK55jkq*wxcatDP1#IOe5P+PWl3PnWIi;v?%S!#PTkreJ2LnSLsy&vpg0DMT+tiZxOnUNZ!t=Fk8uJ%>(ny0DL+hhC){CcDO zXcCD-)M7>Ru+U$c=goMfBQQ3j!BA?WS#D)w7L<0=_^O0miUD-KpoFLnuMfW5e790Y zkjT!sFFzCRKJJV9qxiw}(F>{b?_ISGm_e81WvLz&1?WJhS^SjC>1RTKLylnw3qXk= zDAJ8h+}ubwPTR=BcV6^F(Co$WfpQ5+S}?BfmZv9zXe53|i11>mr_xu4+DLW+4pHoV zJ8jx?(f!fSD=ce@UUZ7vFL44CJX&#rkrKKOggD15iFO!=zIi(dZe1!2&4jC=l{lSP z{MpL=^J!8dfB1&Jxb|MMij57-U_HhBPavmYyu^Z@56|n_RBXO6Y>ozxx<%ttO_{%Y zPxf=hdF{EFgOw-8vHJn+T1*%rtqrkc6&|k_WFM1%_Tn|O$Drjh$;C7kN_hcQ*1)1i z3O8_Her}(~P>t%)3Nz@O*s~q`0M!wHh4eu)GqV`BI+#?PjP}9|N|-l!X=LmPVV5^G+B0b;$3E;=``n9j1coEsXE= z$c245DUyvIdXgtCLgeLWNgfS6fFT9-TsQydREL=0`AdDWnJESd`E%#E*4*wT#zKGj z3Hb7u2Omq~17;GtTu0o|->=i;j@;dct6SNa1Cm<3|cAmT^|UF^NA+h9uR+n zs*A=Tl74?x7u$owJ`D#^PDk%d#D%!+xpQ?T;bVr89|uO~Ta(Ax7vkRr2Y-v>!!CLc zf4s!=H(uFW*xeh9fKJ&YV5B{4Ze;5}dr}I=0mHrW$Wk8K7`Bq|dskQh1HKE?;4sIERF&mjtavXLCPtD~}*_Nia*lvmKFq|L*lf^QNNx_?g()aHXX zk-~0l!BW3~7-e(!&|in_M9f4%h^p>;HM_owFYKa3Wbv+B0laR@_C@Y3>|IO+^AaYf zO3aC>>UC;+Ahct(zKXGYGyWi)V8FNzRnqv)+RRhqA;$cpF>i6EB<4mp2vpNdx?t)H z0G;IAq!0zA>^_|Zk0VIEQftc3-cltZnEb=vOPj6$7#)Grs>>G_jf}+Nt{2<^bAxgY zO}Hr`pE#;?5&y*FlX}_P%hrSLb^Wn*^fEO~&<#28uiik6sgq!$d$CK-xfp3ZlG@^x zB+|vC&Y#0(JnSG0QOM03wcjIs^P5}dPZSENi)o%tb&@0HHmiMBKlr(`=vi$9}=!eu3;X#EWg zh>C!Jk{zB^i)VA1eaNB@oh!KLYKaL$ZM&{0f>yEP0Q55XQn|ZWcaw(ZHM4-LEt|{J zCW1Pcq@b31EL`mvH$XwPgW-+wSE%@DiHVKW5zyZ0Z%zsb+#Ey}p|)VdbDDBsf8fAn z-XaklS4J3fyYw%v)XF?oODcYW^Cn8p{L*jm)Tw%yZJ?v}2_MqV>veQt}?E z4=Nhal-ySCwlp4e%8G@h>AP#l`z}OA5;PsD#o+|a4AiD$-T9FZ3BvDrWxZtegcKv- zIUyj-`AqXGz9JMp`5c~Kj*;%M&w0CQZy=%&1`U~I~lZ~`lEd=oZtu$(IEsZdwy zJ!bk^#K71hPL^KiGr~rFwvUq8QWl{^{3Mb(QZpepXg*|X7Vv1F{UDKi6oMt*Nonz z1lY?Dp?APo%un^v6>PWLhGru>GxMycHrDY@USMhyRTuzwtb8*u_rRQI!U%%2Vmkj! z@vwq1{!fpfwfQS_*Lnt=cDw8+c>VG>OF|3>&Q%a>ABSinQ*pna-B&&zqjW^2A-XVP z^|GqGo#(@P3q#enuY$Gydfe=XN}RyIzsCvmK8&>wS|I!eM0J8wG~;e>44(^)o7wQw z5TNlG)%!+1mvWDczcCH$$Tlw{c8Yc;wI7NKux!9z5#At-bS~3>9hf8y+#p&+V?JwV zGgb&&>VhLLAz|&+RxIdP?|qQpc&A<97jx7jo2SF@_;;LS61JWN;@c^+3zRzDl#s|- zHGjAjc1JFOvw7FwA*5{Z2@_-}g-9qJBwn)U_sC?@F3BdZY94tg8bEZqjghj8nmzI( zu5D^k9#DzuFotZUk_hB^(Uk!Z%3LG-1w@`tUKPamyl?u1+K`iRc3XejmJ`DR_CV$h zIF1mz>7^E5c<1Qi(vp8=U7A7XQU7CzQ@Xb8kKnagykO(#BzQ@@4z{3xlV7drl)xA4r2YulXE?!yKIC$&=9YbTAB zQ}}tIX_?D}bfQy4uUE6b&?b?Da8=W-`@u?+8(-%H*)l0Db!9-txk9KBcG@xLsa55R zzW44p>$T;SZnJtMKR^NwgDj{$4L2aOhi&D1*p|{BH-szW;>4-xa?yrpZXE;+Z+K2s z;7P0;X-ZKVR$@!9PCJ0RJ45~rl+Tb0!{QIw$$k17BYrOJUgERuTXT>nAf>Ui-Hb(7w@!S9tol^p&RC|(8DjfP9=}O6!3Ih3GC{1E*Cz*yg!ljxbS7@!qOK^uGg$ucq1H9aH%f*4E>^lu(JTOvX4nBg zhCaVj())XUio~E{gB&$$E31!F>Fzf~LB?y_5=Hp1GT09?*bsp zj)9((sNU^J#O34}Ax$quiqtr*uTL6AI<*KgfViz~bD;z(eym*xUD`|X;pmvlYZ130 zHkaROmciFKRE<#UzG6b?F5SLT3dvC>JzoUSnEe2G zijz=ZTqB+TZUxP;&p8vsFC1zQzuML)aLWg_oc@_S}&5-(lm2PPQ7Z9Yy zPGdN;fcazlsSW$>PYGoP%myAoZFBrweNkC;1Qsy6%V$b8xKAOii{-w^u$ziYv!~9Z z{Kv6ZKy*9zkPtEYym+qitnzj@{LrHJTP7n*#~iaQ{KYfRx;MQ3&RZO!j4$3}+{AF9g@AEE{+upC;3OIA)Vl(|C6-XB<%ADrM?CAA7dl8{!D(?vFfJo!o1->URRz4{m?bZI1*ZYp3a+V(%Wn)gcvSKE6! z_yDAF({I3<0a{cWVZB5aLp>?UUd%f#U0v-nK2zjPkh5)oK7EeY`rea|95beRrX}|9 z0{%$BDRK?Xy{0oi;ei@%HqU6))+1t`#Ui_ZEW^qUv2%d3%`=7IrX{s_ep$Jj?3J&B z%F_!NPW&Q%>`VsV7}gXD$PahSTOV^jn~-&mzrfWyEKx(7)R6Sz2;e2AJB6s{0hX$~ z;nbA0fts=N-Au^BYsdPePta&8Z*Pf(u1tzF%D>`Kc}2*6qQ^1o{vmVz9eQONpR5vW zCA)&=!hPIxz@SUZAdQclT+`=m5p*po`si&bYg@`JGwu}V!5~`M19dQv45AiQE>>xU zK~5pV;hc=1Y^G*>vU6LV(x^AZVrAKMx781QBiyCBiU-|ZvDePcT~A6nCTnZE$VY5K z)YS1(WwBVL2>1`Zw04B*D@{Ami#_IBUNxgQp?!PFIZMH7f;;y(+N)pE?P3)U_`9oY zAf~UK-grV7tAIEP=IKNDSf(plT9A&tR2P{_+d%T@rXY zck1PM9lig-d!BD_Kb|(`D1>@YFENL*$|X7b@tXoow59Lt-TRXdha+gL8%+-3nYj+V zS}bX`7YW1w{?9FOqFL5lv;2ieXpX)K9HA+mQ*SkMFc7G`*0Nvyeo7<^&6)8TP zJs{%pH*rFK2Z@uV({aXdg)r59(0b+a{|__Z0JSnn8lSCyHFUTOS3JFBH)9g$^~h@0 z#$A*;?axrDwjxW>iAqQYvfw9)e~_j81Z^y@xe39IGe7c#+XyCQtK^?(T-r$dTb;r( z<4mfB0eSzaJgg{yT{)u~{~vC|n(#L_3S$UOoH#GOZqKZ>3U=-6fir>NNKbjy+v(_M zY~WlV>-4SIX!x0>C9aOmvfw_bjGs+9 zmD4imY*i{t496HT(7^?^V8!UL&zNwp!wUZ3!t?)z3uD+gc#xbqzWl+$)c+jetdUpR z!?Rgd84L$@p1SGLR4Ph+)(8+?3}yQ*9DDuC`0p&t5)UyHt(mnmSMPhrFHIO-P9wjL zmR+DMm#^6{R%o|=^_Gr6#h)CGlW?WUM#^tv@Sl2T_!1n(?ulNrX1bN3g7~M_701qg_1Z8IwTSC7 zpRhuGlBA%R0IxA@X_nk;E7rE&UJHR6FS}P6|#FRz1?v0ej4~Oho6vW_x=L{;Gdjzn*A3`SeYP!zlt=2Z~%Qv_IPYFB}@p>W04faYam~9 z_7$P_0l5k7&p4fYifT%sP$Vii*ukeX_r}#j17z5f3DUSV6Qf8%9mJXF!*(L2uJwRA5RYP%@!>f9T6>Dbk@v@fO1jD_85yF)gfF<_qefP=I7AB|ZE2V)W!uSie%&qTA* zw&lFOj%NVFMiW@JR%JaI`n=iqk8c>@@1Ml?*5^MT9G2g!Yz_?b*Z+t$BB99`-}X6v zCXfYC2h#`1e;4&jk+_H@P2|QpD9`k*+Vwml*rZX8o0R{6_A*Z2hVGol%pj9u^DfTS5K>MmcJ-+~y zB>vQQ_0z=m2S0~P52M2fnpdf7cP()h3D~@kxsxvPQ%Rk@<*jH?zhQtJ>Lh8Z_+^@v zP>{mkg-)|2MRfaez)XU*Np_5$w zAB@Y{WM{wl)V-(J=W*av!Oy$$46*saZx^VyKHiSwko6XPeKlq;J`c}vM`_w)z%H+8 z42M6$A_%$uV5WRNIR@38QQZ!>djH485%wPu^=y4=E}xSCECifi5V5GO0A2;F>`%q| zKaQXLsrj?x?uV*hO^BlmbX8m=J|I0g+HF38EG>%t$%wRk1ESq)1sqKnf->Qcplmmw zEC?;f!uQk0&NdA)nnGrK`hRK49ZvRTdy7yUzp(}Dy~@jr*!3W(wXXu~0y+N(jWg;g zbB>iCkCscQKg*YJDI|Z1Bq(u#erE%Ckl~?l$Kwg;BF?tp2|1(D9&MnYneo)SO&-=13Z9_mIL?xjn1xH-a$w3$A2CW zZ~jiF*+)$iXssT%ODnXQtAVjhAkQSyr zGO@=iZq4<5;1f?c$^@Cc+1I+gwlIJgbQX$&P6a0Lm8%pf48BN3ZP$Sk$!~#ZLJj@= zaW}5qw3>f(ktkLDPi2zD17F>1Ek0tlM^cOa>Gj{$2Qjxc)-lYuyW8P{i!O%R z{NYOBpd6C=vOVOv<$<`OCly#YD>Y-7=Z7MwZYvZbzrV=9yhC!CmU6W*Iy~ImLySZO z@h91DyPJMqxIC;o)x-~GX?^)Etk^|WZHNqW)CN&Nn|?myeS$TvR}KGOWOad8I$>fD zTfpaPVwerw=K18O`a@+I(uWnuSj=?0zJi(ufACZj%HPE>qhz@U`3W2mMuB6Lb68RL zTd)S3Gq%Kzssq<+lTjYQjRevBaXtlEVJEAZ)rzyiEaL^MG`qd^=o? zA#K!0y~|l0NIm|gT{8%jF2nXR>4s?R*`KXjUI*VOZ&*zp1o4m`@Tyv7(O6VZaX*=pS@nmCGsJMAPXWeXaoPp0|I9(0_{xuk{j~KZ79W})6C~_eAjlFL4F1)>X`;8yVLJ)x)KlQU4L~mIo9dNZbbk2%0Htau AI{*Lx literal 2532 zcmai0c{tST9-nd^B1@|!;ylN3%dup*WgDZyRS}NFaExuTMPwqHh6%?gGSxjyLgaLi zr9r~A&LEWGiiwe>Da*(*!`Q}*rThLyr|#{!_ql)kp5Obv-_Q1azrSamx#eJIEhBY6 z3I>D8oIYjg2!m}?gr4ujz)8fTB`SFBajEn*d~D zVaP>7P%~cf79EsL0?|V^{{VBdj{_HzN}mwC6hD6stZ&4s9G6g5BrX$9#`yh z4Qpegj@(B&uhcYYm>bRVEuQaJD+UrvzUl93 zv%TdmGgD&Y*Wb{Q8o%)jpVcN32vd$b;M26$ZDV%l_fp%`oIkDftGAucv9GSBWE7bk zofKYZ3rbL{w_$LB{^3mJz=`Eb!G{z<9ArXkKrqbfoH9FflXo)cix0-G%m80 zCUbYwKSBYd<&iQYSZ0KU76fSyG-(oYbz)K!bTvWE89h13Wsd8zW>X=PgMEy%KYSVz z*{`k|a%zy#*CBh*bR)9L<=w5P>A5Q6nb}t75(@j>Ivr%=TPKqQ`;>b%&~&g#xVWkx zTDt0l+hdU0;>9rYq43ZUD1m;HSoqQzT6QVqSh7Z^3VlI#K7CB$+FOhvcvMv)1IO`I2cM*TBZ9+GEv>n!2Nt z?7?IA+kApo*`_%ewHLXBnJdwsF#5;b7ti;^^@SaeAZ#yFQl1vXR7a7O#d+F>w?|z= z6x%9>^_I$moWYcLD}e=c^Y^N3CGfKum0+5G=!oHiVKFWp4kWMDf%ytnpMI)33VF5b z0Jzu%xENl0zRnTAFyaE#`$#b0o6>@TGC!z`rup&@{?uaM!`6EEU{pmFXi~(y2$<}l zrjB-sE0~$JuK4N}Go5>u{;_?nO#+Irl_d#ep%^eEtLDqSyC7cN1cq6%+aMK#$c$Mj zr_G%K09mhbOe`x6sPB*e9H&#EVF|mk)z!UH16uobsusxc)1M(x!TvMPH}{ zjgE1=URY4zo<-)*z!yPsl3v&X?kg?_Vh@STor>tRHg&5lV8Ye@M{#iHE5u?si99zoV($6q|G0^olA9e~{bV2<8 zS{09;tr#u~GV?ro<>_Rx-)E{wmx*h<2+A3`VH%3yH<9>N`P*{(7rvfH(D8Jho7m`n zg4=p1Lhs<#IMe27c(_EAmkDW}7OwIkR-nU3*Q<0v-E54Wm;{i7RGY*x#GR}5gRx1!_nO*(|6;JyR(6(@lU{NE0>^zPF8}}l diff --git a/icons/turf/walls/plasma_wall.dmi b/icons/turf/walls/plasma_wall.dmi index c2f10843c6ddcfa50b909b179e8dc44250ec716a..f7219ed1edcdc67702dfddc3c7cad1aac0abad78 100644 GIT binary patch literal 23848 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 z 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 literal 8763 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 literal 4799 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 diff --git a/icons/turf/walls/red_wall.dmi b/icons/turf/walls/red_wall.dmi index 5eb26cf6a30e80e6db004fd6f49f2f7693af88c6..8dc959f36cb3357d19d9a854f4535094cbae629d 100644 GIT binary patch literal 16894 zcma*Pby!tf_s2^JN_Urpba$7ebhk7}w+hnTDP7VHk_sXqAYGCYN`sViY}l~x+MpiK z`+MJe?;pqWJm+!EHRhaSj`>;N@7O0oRaq7dnHU)c1_n)DPD&jH29^-|&jUo@zl6nZ zMFao3^3v3Gm$Gy-ceQbLw{dcWfq9vgoFai9$c`yJ;~Xh7LtM2z_`mch8r{#MJ*j{ECVHeUwf+2`>#!u{Z7LYoA~-&`)LpZmc?j z-Y!c`AdN*xnALeRAKLe4$VF_veo4!a7+skhyqkPaShXNV`oT8D?W1Pz%E9%MR@hM_ zgR}+enFla1;%)L$5}Gfw_OeBssQah(qi|23RLfBBAq$bu*EgAVu;a&qiE<9CNC*$m zNF7#G-cp#TlkjEsjqo`;S}SJ}vGX=?d@x_gCQ_x2p-~@~dn`W+;@OFp{Y;zrTHCDR z91I&t_2I+zqS5d~iE?(Tj59xJtbwG+5K->TPHMZ6VJm8^-KUzx;iZ{M4m)}uy=V+NIGIZnKmttIXK{KT$qKDOeoihfW~Sf-wBn|KyX zQC%InnXP;=feIhgy-KEzK`#6tEG%p}CW|@u(*%d)zG%nqz*bL5yf1tnq$+tD%MpW@ zf-pL(<8`03i6zg}wZ^VD;`aotvK1Z|6cl`Vk!tFWyV!5{=q8u1Z)6no4WZoyt_Nfk zXKWQDQDiISYJFtOO&mlfn6MC7YPh-4ak{>~>w_&I@;wnH!LVw2v$kPU%;O{I2gFYb zd;U5*_xJ;oucx!`%w{T5+S9B|m$9=RnfI-`abmeUr)^{xh8z0Yf;l-k=r_iAT1*(} zCxf7zsDm%E6sHg|p~3HQtGt(f@w@xrtVN^4!Jy+0qV1LEDi+F!)0W@Q3^yF&VKJpe z^kc_kW$+2E>YJ03lMUupIUz+^5{g^RaK9-}{Z@nELR^kvN%m@o6pgfZucpiWLMCO(mqlG~ za~ryrkJ@oZ_AkNPrR7m-MRknmJtUK*bVm)fYctcAR+JmokuRDgC<7&}is*9Hrluc@ zR;nStwNil$O+lB@&KG}V-wM1<(HFp^rq8n?WJOX)mguCC!|UEifx$2OGt-T8ry=WJ zo$F`J_VDd#dF~s3gvXkuY&}o29y7+**A)6qKHJ;`|IEk@IsQP@?iB{glzX`0QZ8xQ zE%9-szB+fcqrS1xW8H+gPp)xzc-UUK#1?;hDn+-R1*y&E(2&kj9w`0kO>&I^Y}QSn5pZHY-|OiwlN!oSmKF zVGBE;uR^??9%cM2+F5iOY8sS7Z;XD#?4^mfE0<%KLMr}qd3qu8nqAh~_r`Q><*#H> z?C`!gFqQF#rx<|1z<)_BeKP%af&)^46z<6JK;nTG3O7}M%-A~bD3fuzQkPn; zX5V{Ik4+MW`aN*Ev_6fuobFNLiS!SWK<8ZvLG0N#_*+~yvNH=}_()G6gRZ9R`aFt| zyR&&0+FZFEGyMHDSNdi$bWX1}V=h*5jab!Bl8h zB$pY<)?K^&Q25q#a-U%B?XjEhi+;A-jGBY!>AnYRPLfX2PUh-gIQmx_#NAWPi%-E{ zF!Vy&KIa$i7(Zn6)H=L#=E7j5%c-=PiTlOP<;(QDH z@Xhh1f~J-G%Cd+Di({nM>G$~0u!9*<(C2>@6`fv*P1L}A^^bAKe9Yr7f7VJRZ+MD- z773p=ixw$Q+-k!xgUg^^6>YW1@_xDB&r9MNaalxHeCha$bDFH=>?f=|^s^prMl~u|e?6SKCBl;M)SyT0 zK9AhTQ_a&_nF5!X@@;oUY;;f~%%FGE!`U!-OYxD0Cl&y{kiOqgo`OWcs z>dpHu*Q{4%6UuWD*_(NS9;@;ar)z68+)7{ho?9!QFq6+j(S24ZGM#SMQ-_Z6J9Iy0 z3sJ0Oq(t7>JUoqUQ)w&F7v%4XT;qH0AKMA&rF2#1$#Xq})qlz4lb7;EhdKwBjR`HT zFxwcJ0vj88c+Rn1uL~;%2!w zsN3}%N?7OZS9=pj6m`_c-ynq=;5K5U|A6Mvk-{?Av4<^_O5#bTU`+WWlL#y*OImY4 zRF0i_)K32X(7NjA!+|du`4~Y7tWFF+=#&f#T+j?rFJ&3Jk}&@sqvksHfC(WqD9i#F<}@!!4grtISETYo%A_Jb{&%XowE zk+%8i%#$!&63SkWHT@q@3=-vDIWtgm$eekI4;Yz7Q zII6+?cu%dInh}$14ml_N_=e;{Nx(54y2#NrMX&I;pCn?v!%OGJJU`nbEc|pTjK~M& zeV7TXjFk`4#+=jJMbNK7`Z}WRulK}KQQUDMCDH4}yX~Pt%0CorH+=8s=eS@s`&)Bj zdQ4BPe!eOpJ;q3X97?42+&4D!(|-GvA7ofDgY=E@U<5>pb*!F)PD#R%@!X*wMWqWO z^TPb&d$v_Cf!ua*>?7A%kbom%JLD$;xOdf=-x2L}DeXay++P6cyjZjNani&WN{_5N zS37lzO^@)wH6Ok)BfumS5l)>+0i1Pz`w{&7YY^9nDdBvMRyX=8K%ECWd?G)|mPb=l zx-Aw_#F7GvmUvA*8|!Snu>5udkRr9+shFYBu;B!RyQ|}%dnsGu5ik7A4xej%>HTdV z+v^)cVAhDG667Cfi{}d5UVD5c~FNoS(NUVx3U?6x%jeeE$5;!XtB8m*MgtKC! z1#3MUC+^$LKpY2S?8=fOMR)NEu)mt$)$Vn<+Bx`U@*UikVA*dRHO=Q(4ZU(5j+i9V zFQ(KG2$UG)5pEffYPjm)%UgSc{0^%q{|CtF$vNIKS|mD8$BB!IKMRAFkHsMvz^!+@ z*em6Gim}#_OkYKONLH_;O)X8cm?P)bG8cDW^#`%Vw2c6g#d;)V_3{QC?F1;0vixnQ zy^|tbmP;C+SPpzmAp{<%5a4r;1mllE*U~hY&k42i*jFq-OlHa`ZyDy_H8oY|gvX1Q zJ2*O`C(go5R~7;B)1&HNbNhR|$&eqM*u)+K>QR$$Q}qWIO; ztn})o9P-!HxX)E)y~%I3pl|_W3oP;JQPA z-omI79(DxC(fJ2Fix|?kvS!MiyeIXJF!*5uk=-2c9R^ajrd_$H4^kdl^5!-c57G=} zQe0a*C}e)q9|ndJTK_fFFA&7!e2>RPr;!<*@k-mwyp@>NK%keBMXeD=%KaJl=nvD~ zN`g>Nd03yVHlh2gL$;5hqv6c9*hib(aV6F37-L!!_Ir&Xgk;piUM{oxQ}j*d7kUvf z*2&8j6n2w(iX>A>*z%WDCukDfD$af3Igcy2mmTbRTmZ2o;*VZI1C}fh zB1(HW2qi)6f0H1S@d(CWB-msEcSnNxw<8Fp+!z!J;g)hwYr?521Z-t=N zP4n^I7{0xvk~(}WqCk-aODRTgU`iE3$jUU=H@zrt1Wh8@|>T`(-YA6$? z-@y%jolHl_;ZPpQygk|J_)}PvT?>(ts{e-yDGyRghu({hzS`Dbz&*9~RvW4SlKZk3 zcBca*AO`WlJ*t4nv2GB-$!M0JyWI3dV&}YKRx9!(j}OuRjBXxRZqc$Il;*$D_a1|7 zDhzMuWp7!p%+q||?BFeSC*L_piTOeS@V#{<3K3PGOm||9+8D05(2f&c8 zLWc=^WI*{*D)H;x7SMa~a@^yM)U(^qRp6A*URZjmC=|}5xHLRQQ+E>4@~Qmt%&?$b zFgr5%@r~(&x&j%ZA`x*|@jC{S@#*cb8@nJDaX##^!?mx-i0yyE>0cn*S1dYdoROiMKPMhlR-NLn38xA&bX4yEr(#eCyRinMo(rqX3)4&sM zO~CA*L_2NI%AI+zJFd8f+#((`z*HKXB^Wnft7R7rSCA)_F}&g54V%-+nYxpKqn;Jc zm}8Wm30m8qwi-sKolI+8hPB7=;hdRVlZsZz|`g*jh z>2buqZmZ*R5kUh372^HyQ~jCoD)$MV3+A7cz9sS@C7)VBN-ZGZHoIzrh%!f3$vo;N z=$U1Ai^i^K^1`-q96I`DQ;8I$R`G~{t^x-q6eKmM22M9Tg8gvtfpz`jj6JXJcYd*5}S3X=f z)!H9~Q<5%qS%=!PmN?4jEPO%yC!0w|Ah3E9#E^AN4V=r_Z1K~eD}esw5s%vhyc$Jw zxM2quQMlmF&Ed+mMl2}oYiVaRz0e(ua)lzh!P1WMVH-DJ-Hg5 z`VEbnJ9VgykMMs$p)okS&n{Zh!f+p8Mw0FfPDocXlKB^|chvl(d@||2?bOEJZ4ETE zn@=y&F$>=Cm`EGxe0pJN1il5v)v)Y#Q3Vr zTbug&$GOn>0f7#VzU3#C50X?YW8L}!+Lom5w9POs!gia)!U*mkzrh)QN@mZDlTW{> zWe(pNmsGwQ*}sW%ngu0$c+1+e^RJYakpGZ!eNQ^?owLJ{YMtOm*=yiRnK;p>aEfb) zG?5n#R+Tqx0KQ8;k9LBz?7U^~4W0G$JPel)%7$U>)fTj!W_n{uqhT@5w)u)RFy*aq zRDX4BmpeUm`_ruX&R&p~llS0A&Cse4l}XNEtI~hNL?IK=@S#_;ju>qPJ~UgN^fE*s zAMBuB=lJDyhZt+8iZ=O0t@XRNQKWU0?^!i5As@Bi1WLj2txWf*?LmCm*)l%Km$v$KeYOjmi z5BHZxVbRE#M8#n$6h}z!1hjGI(Y~vNv7k4%zh_88*M0i$qsimG)GrQ)e*fpuX zSj&KguBv9dNHrN>vG_KkuX}qAn>wGMfp9_tkr0GMl~S;%=A5teR>#5oW`-F!W>sl3 zA5Oz3xfnRy&vm|9nDThV&Oy{pDODaw9E=bg_`Z-Ae{DXY+=}*4mg1(n?N5Nt4sFxy z*N4vIQ%dz=s9O4pJcTjLtv|94T_OEYIR7TlSAl5g>+6@gE{d4qn`L}@I}_nHYB)rj z>8Qb{~{Eq@Jiw>T^Qt@g!YyJHXZ#of$vzD*se zNnAC!O{gy>vI$m=Sutd*g#{@#DJ>(CqVCFJwx={Fo6g%X7AUk2WfL0gA&gJPpi^n- z3FL3LI|LMsDdNS2XWP5t1(JERWw5eAS?YE8lVRo(gVV1kPG58ws=`;&J4DQR(9BbW znZ1so0CD(Y-H$628mZC0eKW-(7AzONiU~5W-r&i|h%!B#k()acw%klFXfnoeN=cQ*X9xO+6^lh>wCmPV2d^Ltt01hQY=s)XL+`7-Qs3J`y08 zovI7SY~#Il%C^m8WLAl_rnWR`NRKcc$3IG@Efh%W++Pwsu!}fZ$TXTg5vlAO+8im!cs(FNJOd&?=hMxp`Yq~h6WJ0G zKy)rofwklL^*k1PiCVH(5#7Vw`tT=|vG=-;T2tIR46Df}&RiObe{`9=4vl*(a4Y9! zGjy&G_F&*8x20w+HeLYE0FZWAumw^SpU*?SQjW)DXPV-6)0Yke2TvGc&C2(m56zF? z>lUQ5k7P`3*UycsJG2|{m8HE({cHXAbxBZ--pH)uX-X<*_wIcy=aGTsQHH1q$RwU2?pc!#^zB1w?(BN2C-fNQ&kfQ;_4$v2 zmtlkrFZV8q5T?jgQ9-9VvQW`-K9f{(OPCGAay^XB@|E8r$S5hd6Y9I^_42hJWVCAk zVzT3u(vw1F-T!1VNg|L)Qb}Lp@dsWp6zI%{@z{5)tVzzQiqPUChBvfcxi>ZCG)!Ra zG*%ZGY!%xb=q)@3D<>hV1l1kAA`WRkuGqK$bT^{j7jxW%u|x+UE}>Gx-P_eUvFVwO z-Y^s>P8Rk<~&bw1F4b=J6s_+TVeVGvjUGs19;LNvYY6K6WJQXfJ zg5|#VW56PKX!xR*CcZRmOCrhHe?Pm}KU`gg4)Vrz^5rQ_$g?+?<4-9WdzcX4iVpfB zpNZm<8wzd@fBf1T()+Xq8#){@FkIAyQPp!#X1={%*VTQE%YZSjbciUR-8uf!?kGB- z5cbA`)}ZSX!%1%UP&S6t$936Gj5S5yXC7eemAKVh*C8(ISmK^goi?OvYU-eM z0?9AK)a0ev!N?oz%z&L!l4iZ8739wvx!S%p%jb*sgz=Vom@}E&tcgn{M$K|I0kqy| zZwFT2aP=dEuO5nwEit^gLB_v8Ua{77hi!kK;XDXZ>L2ZWM+}yP?FBRudv>U3=W@K< zSD54V2B&}7)&AJCy4NsA`X+?bsXs(cnVM}%!}*co{Y^e0F^a|Qg8~R7L95PL<-!uK zxTMix-RG6LIc9g^CuNva^Q)7IN*(b*x#GS;`D+Ez|jT6Qu#BgvmIcu7&id{XMS^f}k zoQVcRymB7H90k#D7Vl(sG*9T#;sy!b5F0?EZmMC9MSLIW)jZ0 zJKV-c3w&Jjw{L+!7usAhR zux}k(2~HA!uf|8y77B0-vz*i09!Uo>k5;)uYO)sX!QS2#pD`SQIYd$^PR|JE0V2QE z>oB$%((v``zJB{g26nQ7A@faV31)|z>-%B?Y%UHvMWmD&{C%oy z7{vTXoPOz{mEJo4m)nMi7vhri(IeREL6tm4w4Xr3BS3Bof`5qF8O-f&Oj0tEv@3Ri zjZ!MUcC^N1V!kumun@G?aT|SNAFb16!L-R=_^2G;KRl;pLqa-nT#pU)xESto+~);) zPkL48KUqgt=QT@cIyeNxMHo0&7Z96Z_3?dWnJw--2e`7kr+&b>E{-QsFO^&fMJloF zfzM;iSP?l{D<|6o(WK|@!`G|y5_JCr=cjk?zRXpR$Wm&f){HJ5I;M^G;8v-5mir{< zu)0ngDcQ)DYE@3~4XHAjzx}6sYxIdJd&bg8f=Itl(F^A5cXIa`^*_sx;Fj5gx7Ttn zq<2ZDWP}!vmJ z$xe4*Sq_22h%dI6dl1*YVKKx6EOOL#pHiQ9grwFVt*-o+gZoRX8~LTxwd7|5trtPL zaZVl=U&PSu@1F-7U&|gXN0X@j((2&vv^q{etFy%TKU&@CtyWiktJN+2PC=+**GV$a zQ#0aiqnBgvkX~YK_w`6jK`Cy<%PZp$S>U;2;N~uAtWUjHBh_-{uBL05ME@mOG)mzU zApP#r*al*``P;|ELiyw4HmHS^E0<7xj5j6>WGfdZMs_&%F!a zct;seL)IHiF+t8$#WjK2R zqzjB=dsyHXh(usHcLkK2!D2b@GNo*p(+w@~Lh`7dRMBqGU+l-}`kVbGR5IQJTr8*& zJSg;QQWV!*HlHTWphb&sJ&GEKzld+8;GzvvNUG(F7FTp2A%a$VymJNuv@ssjVOB>>U5ulM{%3?3Ffmys+$ty2A>{I=EHFB+-gWXAHqs^Qi>m8rX9owo2a| zm*3#gxIOQE8uSC2GWzA(i1O}}v?7NVR~sQM%) zs8wJe>T>2ofrM>iqq8cYy;=Joey;K^d=ijich#xkke=>~rr!UXPA81#Lalv3;l}Iw zM3w0$11w-k|&a|}2NLklc1K4e7F%MgGt95H_m%TN0MF3M5p0iI>_=Xt?L4A)Z zA^#2ukJRswFc;0K^M`-&aVykKhMqda_9~<~1tJjIy&*2ofwF)HMDK~&nzD^;n)|<} z@rR!nq%`wm8FAKMu;<(fb%Dp3*|&!ckm~~8MT4s=B}8I6?Y`~WceOSCW$fZ$lhr=m z(Qok){6XxEe~#HcQP>ISVMcMl!#o#C*sPYTI`&hpKh%8g)pqk#jZ3=AgJ;jur!&^oLv_bE-rlA6Fx+qWQK$cdgzH6r&^X)ot_?eyvqzR zq3FI8v_ReOhZy5Cr{V>W)G!P_fH96)dhc;@A@~!S8vX_}K5qHrv~zT==YJ?v zL4c(h(}ffB!clMqA1YDt)qBB+o)#S&gv8aXvT|^KH8xawmW&{_H=vY)|BUKcio-W2KQb>GOnWv}GMk5y3tXD7?p6ZFOJ z@gvR{pLf0t zB0iNWOc+kgGo5Yf4jRUX#lq!e5&=b*^HvL&@H|mMxeZJJw5%Zw(VIuJl)b&q`zrht&zU|qSZ zX=xx?e?+U#)!CEWKFft^gFM1tJ34636C5!nlY>P`Yap%M-^Zm$KvSA=m16U%bx&JDlJ` z@ia2!$L>o{s2>>mi!ttk+=EQK^!~|+{hKKw;We*UYO=d(owRGT|LF|7b_vkDO^T~7 zwmq?#FX;aRB)CmSpr+rizj|lTERbZO?ss{h&O4o1Y@>`D=wOupvsT{CQ|6SC(D+9 zGwHEt_#ZlWJWCuu(#3vjg$;IS+ylZ! zMCvWgm^z{!wXnKpLt}9b-f5&2$5P3GUWr3j+~g~tmzU!o(h<(AJBY19`#hkf6lm>| z#E}_KrpO3NP^=7DWv$eWW!tbidv#-wEI^`Q&?h4D==8F_ag{vdY({ZNN?)52<5$G5 zSf3N_7;_Ov;i|yRhV|w?$`dc2g<4dS*LR@1Zq4afmqR+olgOZ8N%U+hU_?Ds#*)XX&dyH|O}7m_%SOtU;{< zWdOYHed)ed9En7{LITrHO)I5)JwjN7-eGTFhV?r9K!FvdkY3J1G^!hSP$22eM?k~Y z>)*l5d*r~{?L*8zvm8&i2>J4ijq<&}3qNDj;*@P_?@<9n_g=4Pk!;@?+gWOFo|Dto zz-DUQ^(K{g>3;Q+-NOwI>sTv(bOV6%K@5YVR;7Zqiww*o-Q z1^M!^*Y%Md7OEH)?2&!6>P6+3_ujHAj-EX0r;CKFZ#p+EPb!v=QzLp3I}xIxDi3#H z7r-{y|6&_LEcV|h@m!D^Aw!p`w>&y%gofZ@to5E@P>Fwxhw2hjX+o|F-Ph2K;eDHc zZv)VC#wX=yDSJ8zpDl-;YMwdjCbDtFe8jf)Qh`;FOQ{RiRbNUXByiGO| zGpP=HCwtVuH14lRORo0yqR;-r;OhQHNSb*=SHzdY*G_f2lc7L#qvz-M|C^jbhDjOl zm$$XsPU+*zD-)Ie_p^mpQ_)&BFJEfVi z%@jSD2e|pt&VXqRLQBZ4ru=`wisCN5Z;lrpHGI?fT)&?=<=~}byKQ&MSNh6~OPu1M zK>yVq3sZu!emrTk)OK~iSib=G%`WVBWE>xT#EcwoP&7cN1x*$hEIhP~ z-edOX((TXozck2BS#tTGr@qWhZurG?D%PfR&5Zk~ zxaa;5MGbf-W!ZD;`CVgXrMOgQUkSqhHHORjpE!Xn1F*yBcW*krZ8HDAThlcuw1Zd4 zO30zT=^lwEkS)UV)qh^Ophc6?LjL*mq%rHiQ^)Zs$8~DVuLRM#`T$o*@ju)uVh0S@ z>ESJi;w5CB@ZFDp-tiZCNc|LRn+C5Hn2MP)T6o)>sPlMzthy1(|7YAcq7;iZEX zJT;Tl1>{!YujH#z^m3|Rj@@<^MS6wm_eekMPFk@nT25#4(`rjes&Yt?!ZO*PjJMt%ufbB`v`_)9$GxEQihzyi3{aAW^n6P4;1159MrE}ToDE-K|3(BjAQ-( ze_B#5MmfIER@IdA%jyn(CvQUZgRl(~8XUXj_b5y$t5MDA*EtYv%aNXOd{>nZ>NR2p zLO=6t{D!*~A9Cal3Ogohd}#&!-mhoO>I+D}NyLaoAMv(5h(UnGsF^X5Gugq(^+8^a zgVNa3fsS7#l=29rrr(a|r~RgmzGEF9tup;}iY2SERO%43DC#v%V=r*X+j|IK4tD-i zbB9`HXG4ALY~U@->OH5(v#YA;_T0O@s_eG3Tekj)3?_-r4Di2hu}k_U;$%!?LhG&} z4wcHeZTYljj=>itwX~=*RVjv9mCA~Q8#tEp>foFUG&8)7}%$MJMk3R4b7P6HcQ~Jt^~k(g4^3}>!`_HWp%E(fAykqZoPJ)fnqSGUBw2W z9IFp}ID*o zH&kGGb}tOzlSfcWB7KKQzzzs8)9h3xZSOP27*TxZ_S|KVxtCEsmBXS7CK>wklP^9% z%YoyamI$bMBjYQYZ9Q5+rGy zWE6V3j2l4$R$bx#o^9=7;l?I!)Yy2A`Gej-ogRc;6N7^jIiZJ=fz~~P&tDyo?H$ty z#$EFjj*j*`<2c^Xxpx;MFgv;P3ZjbfgPmewHSX}p4u&&o=W>mBvrjbW9{=r2=S#<15)O?#4mFvFhDA=QH4UZU^{kD(>lh>zwXhASU*0OiZ39LX=Ub` z3$7s(4n5V2!S!_Ajo|&Hy4UM~+k%+xVeAN(!!s1>vBYBtS+m!5SJxVCSO_pt42;_KX8OC1IN%N*p)%*-GQUYJvN1#S4< zhexk%i0mLO@-GWi@N=FBR|$@fG^1Xgr8S@4mKEr(Zv7im7H=_SYodUTugA}VM?9DG z8I7=IA1FfbNg&lurZ`auS~KO-ehqoMEvjd80*1G@bIlx>wBFQ$+d+oYcMWK~xsn?D zIO(?(Guz{zSdY`lTfs;W%D9`b@W4W>eyO>ZjZcc{EC>zpYA{TIc<8pyK-YyAiYh`K z9ZgbJoB*o4;K}2#C!8c40~8VbB%+{JtV<>s;p8+SHx1^nZh{5xVpf#9R_iQ5rhg?s z{LlB6TqRSM5?q~ z{f;9C@#7EqGF$pkUQ}yT_Mil<&?KKqHG3Du0^x|K!EKaiz4SS(L%vh_ezbd~qn*7+ z_wpf@&9&(A?+9gpp9}!V3*9BOf={tW+@0Vl#5?2I8~Yo zmy1c6j5RRxe{IBcF)zdp*ACi!Q-0TdV~2RaqE_{#J>Yzj=L5s`)~g9I^yjNX4*z;r z{2DXf3aAg;ID;<8Izk(^Teq083fg*e0JPrB0IfHl#lE{l)+JPw*3ijAa${WdZ<{EgLyVv5R^&0R=N1;GVNxt2e>hA^NkWJm#BXv z)ADGL;gc4mFZaqBzzN*EAIdFMTK47aVeh{G?*{3=-tr4vEWnku65A)Q(G#=j3cSpk zH;YY5Bd(uiy!DKBTA;T+ z7OWew)|X!dQ^t894EuJ$T(KU$+c3?O3x4=Z#tLST0kQ9Bd`W~KH*0Wa#EqKmVfWCh z;@i)H-(^-U9YWt$kjQBwO!l=oec}NJdAaLR@R%XVtP}=GUtS6M8agsW-#gK)hRcI z$#hDW_AhZ{?&F?5w+lQ|NBnb`K_N41jZpg}*S2{Cuut*;`vj>O%f0_gAa2+K{Tbn@ z-o*?dyp!JVLgED!`eJ&oT8FQ#DWOa0<21K!Ed wZ>+gZ5R7-W0#K7=X2|`YYx|dfazmgOBQ`Xo40{gz4;^6SrIn?sB~1eVANF`9vj6}9 literal 3787 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 diff --git a/icons/turf/walls/reinforced_rock.dmi b/icons/turf/walls/reinforced_rock.dmi index f2621f5a86382e552a724f090fed08574cc47b34..e00e51482049ef1ea1efada2ae66e637506429d8 100644 GIT binary patch literal 12605 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 XUNgKMpiKKe1f8j&<*jo4=WqWD))3lg literal 5077 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 literal 15211 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 RY@!7{dZ?*fp=1&Ce*g-YlT82s diff --git a/icons/turf/walls/sandstone_wall.dmi b/icons/turf/walls/sandstone_wall.dmi index d53e686ee507f140e102a9029b9b2853a8ebc078..46c5b0af1c0a3aa2fb5239b9bfd1d0bfd13fa70c 100644 GIT binary patch literal 4130 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 literal 2576 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 XH)Ly_4o0%SXMmNtt=X$np7;I-ECj}M literal 5329 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 diff --git a/icons/turf/walls/silver_wall.dmi b/icons/turf/walls/silver_wall.dmi index f0f170fdfe3bf1481adff15a28c1552268954fe7..66d337ef59d211a0c26eeecc1b1e6c6ad503675b 100644 GIT binary patch literal 4069 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 T^85Jz?GRf_dy5M5%W?k)4iY6f literal 2570 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 diff --git a/icons/turf/walls/uranium_wall.dmi b/icons/turf/walls/uranium_wall.dmi index c03886e0087060b581f281bb1ac51d321944a2e8..b64d270b3bdacb1d776e364451ae128177bbeef5 100644 GIT binary patch literal 29440 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 literal 38601 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 Y?-OC8AwiS<2f$B9Q(vP{{a)bz0Je#dFaQ7m diff --git a/icons/turf/walls/wall.dmi b/icons/turf/walls/wall.dmi index 651227fe8de21c4cbc5c30a99b9be907371bb5bb..6cdd342fd9edfa0658b88cf90e36ddd84cf565f1 100644 GIT binary patch literal 4024 zcmZu!XIN9&)=oeKVK7*Lv0%hPm0$%aCiJQSDS}803P=$Ir7IywlNl+3REdU&6bT(c z2$Cp{AOt~r6GA5h0!Sd31afZt=6-YU%yWO7v(Gwvt-bg2K5M=2+P_&NO(n(mi-SNQ zNpmwJ8^JjK^AX!Fc<)#9o)8SI`*x0jM(zQw_q_ZAz5MQgK%uzA^va!4C-)kAaHS>N z_g}wO@(XPH&0nXXW_t4amvU2RnV+X!?$y@Tw?4qkjcIhvt=jaF>aH+GFR@ncGoA+X z?2M^j<03{K^Inn6vcB2UIg5BOR)I^e*tf?rAo(=el*|)BX!#@hY zP_i(wsf$DJTo8xsM(#E`A|o-MH}097)Od@R zI`YISQtZOR7;3N*`l@49i8sG$f!Du!ICv9Pd^A@J)fM^lQYrluGR1LgKR$Fbo+d0Dw4 z0s)8iY-;9c{XjQB7h{@TkO`bSu=M5kz(%@|yVlug>lrLFVMLC;I{8vNloz~`3E8=` zxN%OWkHZNI3JcSs>vWjFLJkW9Ej&c;@;A?n#%{n%!m}CJS|MF6id4rTGI)#Gq2zjb^B9g29jn^UP9X&u1#C1@4jOZz!g9 zwxPXp1sevqN_7M7CbqUbbja3Gx0ajjl@$~?yT$tVEs_vu-?qb%QbJOCVqmeuF`#Wy z1|T7^?CrT<=na{>0uM3fy_%c*`}>KV=NnF4xpJO|8OQ1ZkED74f?#_qVZmXrT+%A7n zHXM7Xp`qy^GdWCb+%v&oc-ySpx$FCR%X6etZOr#JVr*jKM!H1h0ybf*SIxhjyX;Dm zYpv})Z$JYtEiEZX5Bq?Vl9Fz*Zz?l0k&COHqvTXC*|o{Zn^m{Em}a#)-L6eCdcKsv zn;C%0phIQXdUEdVU8dh!ZAOwg;kDvyG^VgSb(qZHgy%)=i%a;mta_{49K~-J77~*O zfn%g1K?e7QE1o0r5`9}~V`DGKk4yxs#bp4bVTdsv`W&b)G+RTAKSIU z!jS7qMeOzFRr=fNGjIFf+TXN#1qpXnOTKhxqp<_Knf2;HfW|DL7Om~tMyZbvYgbj| zovPg4G^5~4E&zuHg=v{z^p5rCd@E^CUu(?xR0YYAw2T`5dDi9(;7OmknX+m$YU{kym|R~u#dYJzJ|ZJY^rh@|79ZBye{H?TZ*N_PL1-JI*hqH zbfjQ{(ZryAxjOXbk}@~Oq@DZLwSMlBrV{;0SrspKFQ+D!T_(~0$1P~KAFbTa7 z@Q*ef4ukc2xv8JELI?yfmnA3b?peu1qPRX}a9#V|*?CrM6+&inVA#rdU>$z~)UY;W z0Hr*JVaSeiXVR>ne#qw`GVJ&vD4^AXVrg1h{^JqyDVNUTFd8^jG*>7v@TlzG5-LIN z_ran3@HLLjwA{QZRm$C#1l0G;x$eg3oy(um{J>|tk8=je|F5#>67?aM?=cjF4mw;W z0a~_35_RI-@Keg808aS`NOpct^R0OJjf>Wg+A@#)aTN#8oq+_Er}4h_vgOggdxHDa zKx$Hfr+mQ!9FE?FiWtn5=-}_g5^eF)dfHi{f7ag5%saN@{a~18c;KV~E+=`b^bk)u z_%V@54CpR0Pfcx#Kd$NSB@?~|#&l9g_&7@aAD;QpkH zRLPAbm|$9lvH7xZcSZOb(T*3?;;GtKrOjDU`yrcY>xOPP6OY4P9J8{rQWf#$5z3kjRvo3(I-*je_FONePB72p3ULM*5}V zRmFevhM3+zGALZXG`X&Wn?Q`D4vx1W`gBi##a7z+eEyn8jte$4)a>4wV;~|zb#-IE z*AImUlPXHT5s5_e@%m4Fui4SNBm3}7rMbDe9-8eKnBXJ!Ue?FsO=)|G&Sa@^yYKTO zB~W9f=_L7}kw*~?GWMK3k=YO7c^SPkR$5r5y{$b>$0d`jx5WZ^2${4{s?@@e$J8PJG!(*YP}M^;|iVYo-6(0NO$C7WHv( z@#gt10<|ZU`$dRHYT;9ky#x4X+UaoTOt?#Np8|@VgTn&w)`Xh&eWh*Q*^b-qzf#3b#;k_StVA_X+*r;;%uJ&ea$|%d&rYdlf9sODYJaoo>DFaH`S|Ift{{ zA{NS6$s8u94Y$VWUH5ylzRNI!(nrZ}csr%7(=RllW#*w| zA3}Ea6eTbYUK!#K9>S3}W}b-Ts)A~C?dQ2M4Ax3t;hRrVwb}QJkoX=@peBNI#w9%- zhJml`s5yFX;U(n!^m&cWkr&=Jy#He+PH$S7RZ&^8wJYRt(v;heZ+1@&%aR?Bzx>Hd zgI^UBlAZACG4Poq&*2Ttcdl;_^2xVl6%?{5XF!J6H;;Qtu~Vwy1nuQZ@wZ)5koem( zivi5^lggXRL}~}fIZ--kL1G4)gsV9;^hDw>+5Ugg`k8#?!G?#;UOrq+Ha#O3+gMv$ zTb#D$E}1J5Q!_XB@uOQ;a1!^xw!RK`=%fTxa6P-!-NWoyXoL<{qj-|ZL| z>xUg|qkvbh==!LMd=clI?kxvH2{VcFEFEyROc+RIZAU;=c|jo1_u0}p-zw`d=3G9n z++>Vq{n$0FNMi7nVCJHeUM&1tPA&YJSsb19=?x{mn~JD~6XXgTCC28D7QeRar&B+K zv{8J#(HIT1#lT$NCba;D!dpqspfzglSHE=n^D{^cQ){nRDm)+}_#d=Gbu56LvWmu5 zT~Cm#SjvTnJyHH2oG-xiNHqMgUV#9dl%c_IxU2DZ)ZZS6`9&9$Qs2-(3=Rn)K7amv zp301UC9*C4BHln9EGCsrR`dABVyVYKywylug+VnG2}4&fO4?7IBQ-Xn66LQ-gl?r~ z)g*rT%>`-~*hjU#*xtmJ1BabP!$Q$>Uc*Ih~m;Vd#@iB zZy|TDrj7sDY)NLUj5e4bnTmW-xr1_Ymj;4itP6(P5Kl!y zTD;0AJZ9H#-?dCqL2qt|#x7m&Ay@mNl6p~kHCx^DJ&JZT(Bm;kQGcN!)XH+_40_S# z?0~QJD7cSpshGK{t^n%e2GXazT5C2R@6fA(%W*@U?x_Jc%i>@dlHFs%Pq%?ptKE@| z^+VnmQuq4z-f3rkYk@py{G9F+&|lryf3d3BvoO8j2;ufvnZLKL=G8K3&RL)Ug2;d5 z^k-f(N?#n@2f4|7w|7kv61$3+(>>`8*bXimMr?KVoT$D`rLft>)@y1;tUeDGYW5cQ zj;{gF?+172Q!x+W7o!`u1+#GmFulHCs=}lvEomrZBl2u4U{c17^ae)Oq0|W3*PF{P zk-jI-k^>T6&nh(t^x033xJ0?1u7VEPfPhJ6}Ch0?CZRZ2_B{fG*YbF3}Ue zuI*UQg*X<$q1>3TNVto9u2q&IU06m)U`7ed?i=(yvpcwvB9ZVLWIR`aRC%$Ge9I^6Hyde`wA9? z(Av5JQBVW|2?B1Y{i z0RVJ7+@1XZfYc@guxPc4z8U1NR*t^k`MX$ISp@_H*xK6K+uM`LWD14i;qLD2?Cjv+ zu!%%+b#)C640LyQcXV{Lv$Jz|b8~WXqEe|lckZ;Yu~Fx$SJ>)|`i0twe%`wP^-a$K zwM|I%4@z{7Oo)g-9G7@F_9y_fiON@9?KxoCuAM z7`9rRaQ=a3gRs6|h9F(*VN$tsChqdR>v<>YmXs6NQP!F6$HTA|4a%`{gtUV}8bwD=N@aU8u9Hi3ky z^nQVjSGa06Z}K}d20wo$c?H$Okm=bA~!hMj2}e9eTmkdM=BW&XK**jNgD5*4h^c(sFtYd6l}RyfTI8p%mx|v{*G19{{^( zu;2evEJ%*ij1{$Qj@1sAx@cUzALhl{KtyGO)x6i}I`fJ#Xicdhujik5`0%`Udg|gg zR@U$fV(F~Hk^_x zG{V9h6v5zDg+rQ_l3k&b5&#xtGR8e3VsrAM2sC^XwD(Z$8&Rw~7+L^0bOaI>v$FVa zOt(@zpu##_hfj27v4qXdA3qqt+^NLtXWJVMy^cPf`pSWv5d{mSP%^#f8?!nvf&1m0 zU{icFYDo`#iF0k8b)7{T>d)cxB^Qk;^7$CL36b=Vh+@6pi_U}F9-E}b zN!!DAP^RUTL^i!aR~^i<%MioCuf%RA^Cf-jkewA9BD%i6MQ8m|6Uha%h!FZD z;=oBlwYF5Z`^3dD^vd+YXAHhkm)M9@xT}EO=aSOj= zH6b_z8#Vt2Qb5bKJxxo?EIzo;OIMonL{pdlDoVykAX7(Vzg*BO4jc%yz?-yp;lT(x z2=Ye;{~lgznXIBLvLRBdKnG)X>PHo&-s8H`LWZ`1o?HsjceXD<3J5<%A%QZq>Bo%f z4+weLmvpr={Q+1ZrEPu6XC$Ut=7MN^_=L)dc}J6-jI8GMp@SNba~+M5&2Nxu`65(Y z@5@cobC8cQuWu=}ia2>0qNAaE3c8WV8AO9*m4mhwQkLV%tS@Lzn#V(31l~f;m~=8~ zY9ts^caZK!SvB~tJJnS`m7Ey}zMFrpuj#zcsHPkfG!Urq=u#xcxBvK*hmx5X(zh3i zzrCd?!;trS1Ys`7YLx?t`3Zmd&E-oB!QAXk5H;^D{E3X8l7_@+j;=Nm;2cWvB`E7%~Kk6DiNql9kLfz6pe}VYH7@$y24Flp!JPL52Jo z%9CMiZzVwF>sX*&6xNW=8ywbWj-UyyBpLd;twqHvZS@R(dL;cuteC zORRNhZJNEBFE)OVOxR;KUMTp8Q(&P&Zl&hWsQi$C7jnJH;+64%GKjt2I@jw_lmcrC z;sbX-C56Wo+<@1PR)9UsAV?H}S;Yu-!9mFlq1)0m48Vu6ji<4bQ+{WOFKsq8UI#L{ z-q&N?8!T;e9VO-Q_Rd?X1~P9A>aFK8*gNqiQi*401J|~lt)F(N0nBnFH^s!Ri_xvw zUInE1<^S0MlaY&H@3*g~gKFZ*tUZq^#x?z;Z9kHpn)`Zgg9=*Ki#{0Cc#Eo9q!dI+;4=SjTgdW4Q;To_7_f9yAZyp?g6C5@LAesue!kOuvJ@v)ZgVbd0?@@GdMMXWZsiL4?`QPSJYDS5>CE%*ijl%l=nheY(sq z;G)RPA5WkYFutnoV@S))33y70x!shp8oc9Ht0*y|rDYs0^|^JBgw8w9>T+AguN9`N zEpGXmFTKD*UD8Em8Zsp&;zX7XmgO%X4vv*sFlSWRu;RX8X}FX`^~B8$Jl@3eh@~lfuZf;Xb|fqIdW6O8ii(3$vSCYi5UK)n8ewTlIT#@;&{c zS(E9yBk)UwW22#O1DUDcGOvHTiT7G@e^CIibnTf_Y>ZM@LhXr&IgxI7XG}fj9i35< z57$D8JlvrI5|VbZ4cGLj`GEG+RmMcb!~6HdNk{Vpy0sj;3`b5U*Foi7w`~)rxdXNp z{}$Nm$az6o#<*g?(nvV;M!xb`+gQwU;W#m$yXyyOj`clTvYQ%f^m0PgEZ^R?EsT~` zBCc+I91?>gOyeI|aF_U0rkwM+mnZn@+t^#{Y0tS1>1NbeY+;;!+4=**{hpIo8EJ~o zqoP*q@c51d`h73@uf-{6%$xsEO~9Ve2EkUo$w2GDybHBGU)hg}2wa2zhw-&^QFLSL z=Ij#rrp;2LkW4pa|8T))rtUYQ9_v^t9QunE4Xi>kHI-TLm6G4ZPDa-JkyAO=J!?3F z>Py}>7oIumbf#oDq4oZX7(L;8Vm?KNnX}#v{$6Ot>F(YwoL)6<+1irY2UfA?jtU9f zFi>4L!%W8v>7DP&IGQ4Jo7?P#oGVA zm;>twc8|HSU+>?Om!(x*6_Q&VATDoF%y;RLsHy`d);kIrBD>a_Ek00TTECs+!gr(R zE_h1^3rU|dVCvKm6&w1{-Kh~_7wbr-hd**%D`@Iu;{Fsfbw3@Vt zh={D6t(CK|pZwXR)(fv{hJl}i-D;$Z`xUEmm;EjUgk1>;y&xhIk##?<=C>$gC2JgC zS++~f`&7k-9qZ3-n%cMlwOwmFN^Xr1TX7((Qak)f%Vmb6CZWg3x~w)RZ=&1eYMTS4 zZmd(!y*cv2aQq%U|IBawJ!9uG%9}jMpLTBGhLrJ%8)NiJpI-E&$4P(l;|4b@qbo%! zMLlKee)Ct%H4~|n9M$YAj$S8b^9p6D8=Wl|afqd=2`Sd!=?BQkmV5yJp4UZ-A-HVUZPu&fT`KoD2Q=HmtZSVYU-=BI}51^tm z=We@a2*%WBTe@gQWb`(jOD)H0>^=xTO^cnCrAtKCLiYIM@!blyvJ+A?P8^mM-`Le9 z)3vVm+2FF0sc6`9tg;d+1|l8%9@|LPa%gCFb7-aMJtA4*%d}S~9vgC{eV|33MHOQT z5o(-{p)d?6f`bMOm>0P=&n$VnJacAkyQ!CVEAi>|Wq5q)bAj&LcpSFed~td)G(DX< zVJLv-*V=F&$6LK=g0%%rM;T*cE6+_Jo%yXUC zF(;uei_@y6@r-Ac#z+us(@A$UcY)3b0Or1_G+s!P05qH*E1?k#pYzT!v2c@)&2rvW z@I!pb`l+wmLdIrx8$9DpGaD_cfIGa@GS$#1?GNS>)f<@UvB0e_4+=lq&jxjX6jE9J zJT*Kt4U4R;7D)o|(%2GtW^MD(J!0@O1?z3FozTJ9hd{XTvUbKJsxr8uaWq&C^J!%p z(e?UIkf!^-PQ57`tPR(uwgXr>XH^3+HpuFdugYx#djGOgecOebDp#5qk zweMCMU48VB;*DDjPu(~l&0Yl$@Rm*rjPlZm4J?Ot5Rui?nA&;N;tiP8@dZcdm6~{=S zU9ppzuJvB0s*m$5rC*-6n#^^K(6>Es~~wyDv73kFI>3;S8+)b`~05QQzdv|tPlF$IzX0#J z_-wD=>XO^j0rPx<#{8mal|h~=NSTvlTZb{xcf@9m8oeV}p`Y~m37Bx0GkFH}$ZoFS zYye2>eLg|hLv`Fl?by+kXXZdz1iLvVz5_1FK>pc>*8qP$f#HHH+mv$=2&)t z-OCI!bm>g*5Y=(E_7W1o4)Cc;ybbu+QP^`AIwl(XpCIuFsntZ$mO80f)Lq@g{QVup z219_omLyx^is`503YOhjh}|5XjOli|ei9+!`j_s%bz=6$d@Z<5Tjlk?Yu8zkJMsow zndS+ay8uPp)=qNq-W|yj_r5y?fX9+09% zE~b+-=Lv;0%*T_hML=#SAt-FO)IThfQoJj-?RS((3YlS>6Ta(P2K(EZ`vUqyTp{HY zwhyj&Z?m9UpAYE&%qV$t&GgKxf~Oi5kuoI5_*Wgv1J5`!x}e%dLk*E5B+&qSS`{%N~!Y8U}ot2j|7I%OBlO zH)>6p`Cd4v@B$O&^FXDNnz)A$0$NJ&S2=LK9s!nIM1m*IBtAe-dAHem3!Xm(GFP)VaU`!NoTo&E zgAKeow^0mRs*rXY$UO(!20|dbJX`tZe6TQ1J^*ajyvtWx4)p+1HVeFMisBH`1U%9Z z(SpebCMBJjM&op0Iw3M=jkG*5W`eXT`bVC_%AXOdxMlBD2{S>#Y0w$oAPn(r9PVBZ zi_Rsp^#6+jXT<&wCw>lS+49=#uF>+iHtffl?=Pdx1PT&=fKMjy2HM=9K)mfYRqlMR zyG$ffB$a}MwYD&{xJ(>Ic{-U>UEUA8HJHG&*3z|Xf3$g-y}L7n8K+<1AO$l%8M&X( z;X|0?r@%#WsaJ~Md9Xu%#)s)bv{-9+6 z?Kf-h;6OnNa<`lu5Yj0Blw&lorFqjg6)Wh+ikiFL`YmKJ-LiomcT2nPm0wuV z!U}?kjTCDze^dVoYB&1E1y*(!h)t^-?OSb@g@kyqSBO6cWAbhj`ktcB=kwE>Jn`!{G-W z1j!)Pmy|G9@L9n{uXMPSXC3~ci?#p53tQo0zPP;$KQ-#A<*x$s&(Z%?aboo=76@GU zNy-!Eo7d7P0`i|^nMB>0s5c&{LZMnZ$vSxT<1&AMFPu1`kI$)qBKyJm>uGJuyMdubH4t{EEtx&wl3pxc&cNfpUsQgp!>HY}2^y z`#(4&OK`re+4Qzv^na+2YA1@86J~M@e~%c}z51>vRVm-0Pi?UYeU4d*<&-_tv}<1! zB||fXMiz_w!mfVEwqQw4C$d{(p{ivr)wD^xt<@oF-oaT57A@Mo^)*>Jz6^VO>Wj9{ zQDV=i?faWIc;dw^tle*K;)iv~cHOZ$cUMVc3nn$L02dY43glmrpR$>di{JTUls8Hj znGkxCAJKg~qBe}9nB$x8zK$tLf8PDDLEc@gYF}PyeBV>^Yv|F*BW9wrG8TmaY+Wl* z^b!45%cayY#RJRyjyJrg6R4x0DZ_me7~Yw@LXNBV5zpne`h`GVIg(cN^^-wT25B9P zlVZit>~6ZCk3Ugkg6N^#muvIt><)jQ}bx8b-z6O=}MCHS? zEON|CKCeyTI8#0>5y+l$H1T8{)Jy=b>t`tWg9rG`GpgsHlG9Q7`iV6Is%gm`l>dU{ zyQ#2>e$0{7Y8UHT{~zXS(`yH`V+f@A@}1ZLM74Fx;d*j*-^77B;FMt{o2=kw$l~=6 zQ|=K<**4`PCy6S;30WKyqtT$&$1b1(c5v7fS%;7#z0mu2`+HtxXSl=xB8RJ6iLpog zi&EPS??L@_(1<5cj)QQJs457+3Tne(>|K53{=wrrPo|s|I*#eyA-=}|8}rGGXn6QU z;vC(|cCDc3k&WGr6`X^HGX16diCm_Q517F}BRq?V4ZxTaUiK2RA* z^$2+AU>_!oEe@j=EI|v&6<>~SoeV6x^)%_%jcyDQ-H-=NwxcyzSbq#({FpS1>J)CK zcnExP(bwzvzd`s%!#I*!5>oI_+Z?=2;(t}`=tGj`HT6rwaiPWVx{4J7zTpmONY~Gp zt5DbR!*R)Uiznp+j*ow)DcCnFVKJvT_RQYdKdt>B6T2_fyhf%%>(=@G-!Iv1Si5}L zpKx}g8&$*EJ1j%@ML)k?eFsB4UuN*J@eU86v%;fI7JRnVnb+K!%Qj}kQ(oJAywFzd gd({52(vsxSy=q1#=f$#xzp^5B*2k=>4*5p?3xu$}a{vGU literal 2666 zcmXw5c{~&RAK&KMG|ZLTkjO*1qtdoQ&RpeqiY&)gJdO%sj%_4Ycycs1sr-c5+$EW# zlp{%=rsYUUwYjsEnLX3*_5AhueBbZ)_jA3zpV#Y~;pSo|A+9VA001N$>}@;%0HDAH z0)&MGhV0wsDKP48&S!0DG}>`pnUngm2wiELgYwSC3T9d`Gfhc-Whns_9)wBVy%*)- zat46Nl?_bfi9s1QA_112vKRNfDLRUX~@!dBS8nzCazMuFL0056V z*qk^UTejp!y$A!`%NVb`-|zYPS3lq`H`+8pd7wGQ z*b}k#q2{Bp@?(FC8qY~o*UXH64{zsf`)pET@?{q$3mei@Qu~(78_rkL!1NG#L##

    i(I3tWOX+Zbq^2;HYRayl!RvS>rSm6oA$^FC+1*#gd{f1| z6$ZozDF7G^E!)e_Rk8%LYyo};uXT^eo4zyfyHb-f`tq4aYP^r5x>VL&isdL?yh9RW zTGiK>;u$N-5|`0Iku)xXL_{(Qd~c=P7v7-U_LcOKfl_rHi^0Kn3o_0gbZlf{OjM1B zmY+cF%4G82zM4jkzC@owZ8n9bc=Aj0NtgPp73 zB64{P;gPp{U+n2H*lvy->1z=mte8WCQXw)rZf<%1i^r#U9;fvlcto<9xIH3W?wo4k zK4kN7@BR3;f)}ek;g^DszF0TTg)@PBt+fIuWHGw8{n_=542Q#U#X08AlSbw$s&Bg0 z@rwE5#h;_t^7-yXWhL!#iRiG#JLP#(dIZ_tzmjRP^iexhQy$u@ARz0u3@Ka%-ogX6 zB524@R+t+O42qir*qJ;r*kI_ln;ARQa-t3!~{N$K6`VU50CXn%crMhimuFB4OpgYmA0zWS&}6`zDZS8FaomS;JB&hZ%IA z(f6jow89%6NgRC76WaI`H$_!I47Nw{X&++46KS%r!1Irj(cw?BEQBrx|IEVt+9ABq zin0xwEn0!E4sI}oHo|HKV+75jvT34Rv7JEENZ3yR=Y_sbYbW|$7#%nCAEwWN3&RKol5K` zprZ$iTmT2jK)j?Pxhgo0UJ&^6dYqTk>ehMgBg7*3vxnaA0}cnrfP*#!Oyt%v_TnOx zkboHb4s=N#O!}p7tx-AF5|3Y6nMzK0345`)(V&jz;@Iz?gwJ(g0%~W4aURr?lm2-Z z-|AwIKq+iRr6iaoxIvrpRDE?T_^@&jjGibe2~vSYcAP6L3{fb=ND$8i0))%<)QRRGGSBOjXADKYr2;8eI5^5WIU(>uVP;vXOWaa%sk20+Nce9cCk6MfT9fZtA9rK&&4M7pj36b zPO1F^L44tg1|}%urP)K)0-`el-Y| zi=IWRAk()m^hVJc^50XOQUUD2wUHGCmP`(3uXZOAZB?e2Tt3eckx3ZgNIc&$n%TJ< zmHekwm=k0HH`#ycnW4xe-R8t7~MxOv2XFd)qzI#w!+0uncgqmUn2VMBE41-IIjoEBTU$!$U&Bgk zbF$T#BBio)zk=mM!&G(rZb()|$;IP<-|(^He1-jK?R^IB$F2yzga8Ly7aQ_PH1S{S C=J^-^ From 40c923afdeae329132caed9b76044ab2f8f4ddd8 Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Mon, 15 Jan 2024 12:00:50 -0800 Subject: [PATCH 194/281] fix stairs --- code/game/objects/structures/stairs.dm | 4 +- .../game/turfs/simulated/floor/fancy_floor.dm | 46 +++++++++++++------ 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm index 5498d3f67231..8d4a9892d4bd 100644 --- a/code/game/objects/structures/stairs.dm +++ b/code/game/objects/structures/stairs.dm @@ -22,14 +22,13 @@ if(force_open_above) force_open_above() build_signal_listener() - + update_surrounding() var/static/list/loc_connections = list( COMSIG_ATOM_EXIT = PROC_REF(on_exit), ) AddElement(/datum/element/connect_loc, loc_connections) - update_surrounding() return ..() /obj/structure/stairs/Destroy() @@ -83,7 +82,6 @@ for(var/mob/living/buckled as anything in climber.buckled_mobs) buckled.pulling?.move_from_pull(buckled, loc, buckled.glide_size) - /obj/structure/stairs/update_icon_state() . = ..() if(isTerminator()) diff --git a/yogstation/code/game/turfs/simulated/floor/fancy_floor.dm b/yogstation/code/game/turfs/simulated/floor/fancy_floor.dm index d2f8995a431c..da2aae573894 100644 --- a/yogstation/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/yogstation/code/game/turfs/simulated/floor/fancy_floor.dm @@ -12,56 +12,72 @@ /turf/open/floor/plasteel/stairs/goon/stairs_alone icon_state = "stairs_alone" + base_icon_state = "stairs_alone" /turf/open/floor/plasteel/stairs/goon/stairs_wide - icon_state ="stairs_wide" + icon_state = "stairs_wide" + base_icon_state = "stairs_wide" /turf/open/floor/plasteel/stairs/goon/stairs2_wide - icon_state ="stairs2_wide" + icon_state = "stairs2_wide" + base_icon_state = "stairs2_wide" /turf/open/floor/plasteel/stairs/goon/stairs_middle - icon_state ="stairs_middle" + icon_state = "stairs_middle" + base_icon_state = "stairs_middle" /turf/open/floor/plasteel/stairs/goon/white_stairs_alone - icon_state ="medstairs_alone" + icon_state = "medstairs_alone" + base_icon_state = "medstairs_alone" /turf/open/floor/plasteel/stairs/goon/white_stairs_wide - icon_state ="medstairs_wide" + icon_state = "medstairs_wide" + base_icon_state = "medstairs_wide" /turf/open/floor/plasteel/stairs/goon/white_stairs_wide2 - icon_state ="medstairs2_wide" + icon_state = "medstairs2_wide" + base_icon_state = "medstairs2_wide" /turf/open/floor/plasteel/stairs/goon/white_stairs_middle - icon_state ="medstairs_middle" + icon_state = "medstairs_middle" + base_icon_state = "medstairs_middle" /turf/open/floor/plasteel/stairs/goon/wood_stairs_alone - icon_state ="woodstairs_alone" + icon_state = "woodstairs_alone" + base_icon_state = "woodstairs_alone" /turf/open/floor/plasteel/stairs/goon/wood_stairs_middle - icon_state ="woodstairs_middle" + icon_state = "woodstairs_middle" + base_icon_state = "woodstairs_middle" /turf/open/floor/plasteel/stairs/goon/wood_stairs_wide - icon_state ="woodstairs_wide" + icon_state = "woodstairs_wide" + base_icon_state = "woodstairs_wide" /turf/open/floor/plasteel/stairs/goon/wood_stairs_wide2 - icon_state ="woodstairs2_wide" + icon_state = "woodstairs2_wide" + base_icon_state = "woodstairs2_wide" /turf/open/floor/plasteel/stairs/goon/dark_stairs_alone - icon_state ="darkstairs_alone" + icon_state = "darkstairs_alone" + base_icon_state = "darkstairs_alone" /turf/open/floor/plasteel/stairs/goon/dark_stairs_wide - icon_state ="darkstairs_wide" + icon_state = "darkstairs_wide" + base_icon_state = "darkstairs_wide" /turf/open/floor/plasteel/stairs/goon/dark_stairs_wide2 - icon_state ="darkstairs2_wide" + icon_state = "darkstairs2_wide" + base_icon_state = "darkstairs2_wide" /turf/open/floor/plasteel/stairs/goon/dark_stairs_middle - icon_state ="darkstairs_middle" + icon_state = "darkstairs_middle" + base_icon_state = "darkstairs_middle" /turf/open/floor/wood/jungle initial_gas_mix = JUNGLELAND_DEFAULT_ATMOS From bda4ee77d9f3cd8ef01b7fa35156844d488c1a6f Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Tue, 16 Jan 2024 17:27:38 -0800 Subject: [PATCH 195/281] that might have fixed shittles --- .../jungleland_jungle_ivymen_nest.dmm | 2 +- .../JungleRuins/jungleland_jungle_xenos.dmm | 6 +- .../jungleland_swamp_syndicatestation.dmm | 2 +- _maps/RandomRuins/JungleRuins/miningbase.dmm | 2 +- .../lavaland_surface_syndicate_base1.dmm | 4 +- _maps/RandomRuins/LavaRuins/miningbase.dmm | 2 +- _maps/RandomRuins/SpaceRuins/TheDerelict.dmm | 2 +- _maps/RandomRuins/SpaceRuins/asteroid2.dmm | 2 +- _maps/RandomRuins/SpaceRuins/asteroid5.dmm | 2 +- .../RandomRuins/SpaceRuins/caravanambush.dmm | 8 +- .../SpaceRuins/freeminer_asteroid.dmm | 2 +- .../SpaceRuins/listeningstation.dmm | 2 +- _maps/RandomRuins/SpaceRuins/spacebar.dmm | 2 +- .../RandomRuins/SpaceRuins/whiteshipdock.dmm | 2 +- .../StationRuins/GaxStation/ai_whale.dmm | 2 +- _maps/RandomZLevels/VR/snowdin_VR.dmm | 8 +- _maps/RandomZLevels/snowdin.dmm | 8 +- _maps/asteroidstation.dm | 2 +- _maps/donutstation.dm | 2 +- _maps/gaxstation.dm | 2 +- _maps/icemeta.dm | 2 +- .../AsteroidStation/AsteroidStation.dmm | 22 +- _maps/map_files/DonutStation/DonutStation.dmm | 22 +- _maps/map_files/GaxStation/GaxStation.dmm | 20 +- _maps/map_files/IceMeta/IceMeta.dmm | 26 +- _maps/map_files/YogStation/YogStation.dmm | 36 +- _maps/map_files/debug/runtimestation.dmm | 16 +- _maps/map_files/generic/CentCom.dmm | 38 +- _maps/map_files/mining/Jungleland.dmm | 4 +- _maps/map_files/mining/Lavaland.dmm | 4 +- _maps/multiz_debug.dm | 2 +- _maps/runtimestation.dm | 2 +- _maps/shuttles/ai_gax.dmm | 2 +- _maps/shuttles/escape_pod_2.dmm | 2 +- _maps/shuttles/escape_pod_3.dmm | 2 +- _maps/shuttles/escape_pod_4.dmm | 2 +- _maps/shuttles/ferry_base.dmm | 2 +- _maps/shuttles/ferry_fancy.dmm | 2 +- _maps/shuttles/ferry_kilo.dmm | 2 +- _maps/shuttles/ferry_lighthouse.dmm | 2 +- _maps/shuttles/ferry_meat.dmm | 2 +- _maps/shuttles/hunter_russian.dmm | 4 +- _maps/shuttles/hunter_space_cop.dmm | 4 +- _maps/shuttles/infiltrator_basic.dmm | 2 +- _maps/shuttles/infiltrator_cutter.dmm | 2 +- _maps/shuttles/labour_box.dmm | 2 +- _maps/shuttles/labour_delta.dmm | 2 +- _maps/shuttles/labour_gax.dmm | 2 +- _maps/shuttles/labour_kilo.dmm | 2 +- _maps/shuttles/mining_box.dmm | 2 +- _maps/shuttles/mining_delta.dmm | 2 +- _maps/shuttles/mining_kilo.dmm | 2 +- _maps/shuttles/pirate_default.dmm | 4 +- _maps/shuttles/ruin_caravan_victim.dmm | 2 +- _maps/shuttles/ruin_pirate_cutter.dmm | 2 +- _maps/shuttles/ruin_syndicate_dropship.dmm | 2 +- .../shuttles/ruin_syndicate_fighter_shiv.dmm | 2 +- _maps/shuttles/snowdin_excavation.dmm | 2 +- _maps/shuttles/snowdin_mining.dmm | 2 +- _maps/shuttles/whiteship_1.dmm | 2 +- _maps/shuttles/whiteship_2.dmm | 2 +- _maps/shuttles/whiteship_3.dmm | 2 +- _maps/shuttles/whiteship_4.dmm | 2 +- _maps/shuttles/whiteship_5.dmm | 2 +- _maps/shuttles/whiteship_miner.dmm | 2 +- _maps/templates/infiltrator_base.dmm | 2 +- _maps/yogstation.dm | 2 +- code/__DEFINES/logging.dm | 161 ++++++- code/__DEFINES/multiz.dm | 13 +- code/__HELPERS/logging/_logging.dm | 14 +- code/__HELPERS/logging/shuttle.dm | 3 + code/__HELPERS/string_lists.dm | 2 +- code/_compile_options.dm | 2 +- code/_globalvars/configuration.dm | 1 + code/_globalvars/lists/objects.dm | 1 - .../configuration/configuration.dm | 3 +- .../configuration/entries/general.dm | 2 +- code/controllers/subsystem/machines.dm | 97 ++-- code/controllers/subsystem/mapping.dm | 23 +- code/controllers/subsystem/shuttle.dm | 352 +++++++++------ code/controllers/subsystem/ticker.dm | 13 +- code/controllers/subsystem/title.dm | 4 +- code/datums/map_config.dm | 3 +- code/datums/shuttles/_shuttles.dm | 351 +++++++++++++++ .../shuttles/{shuttles.dm => emergency.dm} | 415 +++--------------- code/datums/station_traits/positive_traits.dm | 8 + code/game/area/areas.dm | 28 +- code/game/atom/_atom.dm | 4 +- code/game/gamemodes/game_mode.dm | 2 +- code/game/gamemodes/zombie/zombie.dm | 2 +- code/game/machinery/_machinery.dm | 2 + .../machinery/computer/camera_advanced.dm | 8 +- .../game/machinery/computer/communications.dm | 50 ++- code/game/machinery/status_display.dm | 4 +- code/game/objects/items/devices/PDA/cart.dm | 4 +- .../objects/items/stacks/tiles/tile_types.dm | 9 + code/game/turfs/baseturfs.dm | 4 +- code/game/turfs/change_turf.dm | 116 +++-- code/game/turfs/closed/indestructible.dm | 1 + code/game/turfs/closed/wall/mineral_walls.dm | 33 +- code/game/turfs/closed/wall/misc_walls.dm | 2 +- code/game/turfs/open/floor.dm | 5 +- code/game/turfs/open/floor/hull.dm | 20 + code/game/turfs/open/floor/misc_floor.dm | 2 +- code/game/turfs/open/floor/plating.dm | 10 +- code/game/turfs/open/floor/reinf_floor.dm | 5 +- code/game/turfs/open/openspace.dm | 41 +- code/game/turfs/open/space/space.dm | 11 +- code/game/turfs/turf.dm | 18 +- code/game/world.dm | 4 + code/modules/admin/fun_balloon.dm | 4 +- code/modules/admin/verbs/shuttlepanel.dm | 14 +- code/modules/antagonists/cult/cult_items.dm | 2 +- code/modules/cargo/console.dm | 32 +- code/modules/cargo/expressconsole.dm | 2 +- code/modules/cargo/order.dm | 2 +- code/modules/events/pirates.dm | 2 +- .../holodeck/holodeck_map_templates.dm | 183 ++++++++ code/modules/holodeck/turfs.dm | 7 +- code/modules/mapping/map_template.dm | 12 +- .../space_management/space_reservation.dm | 2 +- code/modules/mining/aux_base.dm | 44 +- .../modules/mob/dead/new_player/new_player.dm | 2 +- .../mob/living/simple_animal/bot/floorbot.dm | 15 +- .../programs/supply/budgetordering.dm | 32 +- .../research/designs/machine_designs.dm | 2 +- .../ruins/spaceruin_code/caravanambush.dm | 10 +- code/modules/shuttle/arrivals.dm | 5 +- code/modules/shuttle/assault_pod.dm | 7 +- code/modules/shuttle/computer.dm | 107 ++++- code/modules/shuttle/custom_shuttle.dm | 22 +- code/modules/shuttle/docking.dm | 44 +- code/modules/shuttle/elevator.dm | 2 +- code/modules/shuttle/emergency.dm | 100 +++-- code/modules/shuttle/navigation_computer.dm | 104 +++-- code/modules/shuttle/on_move.dm | 58 ++- code/modules/shuttle/shuttle.dm | 387 ++++++++++++---- .../shuttle_creation/shuttle_creator.dm | 4 +- .../shuttle/spaceship_navigation_beacon.dm | 4 +- code/modules/shuttle/supply.dm | 10 +- code/modules/shuttle/syndicate.dm | 2 +- code/modules/shuttle/white_ship.dm | 4 +- code/modules/vending/autodrobe.dm | 2 + code/ze_genesis_call/genesis_call.dm | 53 +++ .../tgui/interfaces/CommunicationsConsole.js | 22 +- yogstation.dme | 9 +- yogstation/code/datums/ruins/free_miners.dm | 6 +- .../code/game/gamemodes/gangs/gangtool.dm | 2 +- yogstation/code/game/turfs/change_turf.dm | 10 - .../code/modules/admin/verbs/shuttle_verbs.dm | 4 +- .../shadowling/shadowling_abilities.dm | 2 +- .../special_shadowling_abilities.dm | 4 +- yogstation/code/modules/vending/fishing.dm | 2 +- yogstation/code/modules/vending/gift.dm | 2 +- yogstation/icons/obj/vending.dmi | Bin 10218 -> 13072 bytes 155 files changed, 2285 insertions(+), 1247 deletions(-) create mode 100644 code/__HELPERS/logging/shuttle.dm create mode 100644 code/datums/shuttles/_shuttles.dm rename code/datums/shuttles/{shuttles.dm => emergency.dm} (63%) create mode 100644 code/game/turfs/open/floor/hull.dm create mode 100644 code/modules/holodeck/holodeck_map_templates.dm create mode 100644 code/ze_genesis_call/genesis_call.dm diff --git a/_maps/RandomRuins/JungleRuins/jungleland_jungle_ivymen_nest.dmm b/_maps/RandomRuins/JungleRuins/jungleland_jungle_ivymen_nest.dmm index e0ebbdf78fd6..35ac6987805e 100644 --- a/_maps/RandomRuins/JungleRuins/jungleland_jungle_ivymen_nest.dmm +++ b/_maps/RandomRuins/JungleRuins/jungleland_jungle_ivymen_nest.dmm @@ -50,7 +50,7 @@ /turf/open/floor/plating/dirt/jungleland/jungle, /area/ruin/unpowered/ivymen) "al" = ( -/turf/closed/indestructible/rock/wood, +/turf/closed/indestructible/wood, /area/ruin/unpowered/ivymen) "am" = ( /obj/machinery/iv_drip, diff --git a/_maps/RandomRuins/JungleRuins/jungleland_jungle_xenos.dmm b/_maps/RandomRuins/JungleRuins/jungleland_jungle_xenos.dmm index 4d7270c069ad..2a984a8ac17d 100644 --- a/_maps/RandomRuins/JungleRuins/jungleland_jungle_xenos.dmm +++ b/_maps/RandomRuins/JungleRuins/jungleland_jungle_xenos.dmm @@ -164,7 +164,7 @@ /turf/open/floor/plating/dirt/jungleland/jungle, /area/template_noop) "aV" = ( -/turf/closed/indestructible/rock/wood, +/turf/closed/indestructible/wood, /area/ruin/unpowered) "aW" = ( /obj/structure/flora/grass/jungle/b, @@ -218,7 +218,7 @@ /turf/open/floor/plating/dirt/jungleland/jungle, /area/ruin/unpowered) "uP" = ( -/turf/closed/indestructible/rock/wood, +/turf/closed/indestructible/wood, /area/template_noop) "vl" = ( /obj/structure/mineral_door/wood, @@ -275,7 +275,7 @@ /obj/structure/sign/warning{ desc = "A warning sign denoting landmines ahead." }, -/turf/closed/indestructible/rock/wood, +/turf/closed/indestructible/wood, /area/template_noop) "Ou" = ( /obj/structure/alien/weeds, diff --git a/_maps/RandomRuins/JungleRuins/jungleland_swamp_syndicatestation.dmm b/_maps/RandomRuins/JungleRuins/jungleland_swamp_syndicatestation.dmm index 8b7c44c748e1..1749811714ca 100644 --- a/_maps/RandomRuins/JungleRuins/jungleland_swamp_syndicatestation.dmm +++ b/_maps/RandomRuins/JungleRuins/jungleland_swamp_syndicatestation.dmm @@ -3752,7 +3752,7 @@ dir = 4; dwidth = 5; height = 5; - id = "syndicatelavalandbase_cargo"; + shuttle_id = "syndicatelavalandbase_cargo"; name = "Syndicate Jungle Base: Cargo Bay Dock"; width = 11 }, diff --git a/_maps/RandomRuins/JungleRuins/miningbase.dmm b/_maps/RandomRuins/JungleRuins/miningbase.dmm index 6bccf1409812..7905a01df67f 100644 --- a/_maps/RandomRuins/JungleRuins/miningbase.dmm +++ b/_maps/RandomRuins/JungleRuins/miningbase.dmm @@ -2271,7 +2271,7 @@ dir = 8; dwidth = 3; height = 5; - id = "mining_away"; + shuttle_id = "mining_away"; name = "lavaland mine"; width = 7 }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 50102c206904..782895e35ae8 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -3602,7 +3602,7 @@ dir = 8; dwidth = 5; height = 5; - id = "syndicatelavalandbase_cargo"; + shuttle_id = "syndicatelavalandbase_cargo"; name = "Syndicate Lavaland Base: Cargo Bay Dock"; width = 11 }, @@ -4370,7 +4370,7 @@ dir = 2; dwidth = 6; height = 6; - id = "syndicatelavalandbase_arivals"; + shuttle_id = "syndicatelavalandbase_arivals"; name = "Syndicate Lavaland Base: Arivals Dock"; width = 13 }, diff --git a/_maps/RandomRuins/LavaRuins/miningbase.dmm b/_maps/RandomRuins/LavaRuins/miningbase.dmm index 341b60bbe66a..07f81b825a05 100644 --- a/_maps/RandomRuins/LavaRuins/miningbase.dmm +++ b/_maps/RandomRuins/LavaRuins/miningbase.dmm @@ -2260,7 +2260,7 @@ dir = 8; dwidth = 3; height = 5; - id = "mining_away"; + shuttle_id = "mining_away"; name = "lavaland mine"; width = 7 }, diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm index b4b66e4ac0cb..73459817374f 100644 --- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm @@ -4099,7 +4099,7 @@ dir = 2; dwidth = 11; height = 22; - id = "whiteship_z4"; + shuttle_id = "whiteship_z4"; name = "KSS13: Derelict"; width = 35 }, diff --git a/_maps/RandomRuins/SpaceRuins/asteroid2.dmm b/_maps/RandomRuins/SpaceRuins/asteroid2.dmm index b1eb5cfa3941..631dde48894f 100644 --- a/_maps/RandomRuins/SpaceRuins/asteroid2.dmm +++ b/_maps/RandomRuins/SpaceRuins/asteroid2.dmm @@ -14,7 +14,7 @@ dir = 2; dwidth = 11; height = 22; - id = "whiteship_mining2"; + shuttle_id = "whiteship_mining2"; name = "Medium Asteroid"; width = 35 }, diff --git a/_maps/RandomRuins/SpaceRuins/asteroid5.dmm b/_maps/RandomRuins/SpaceRuins/asteroid5.dmm index 4974a247c571..3fd34e8b3e6d 100644 --- a/_maps/RandomRuins/SpaceRuins/asteroid5.dmm +++ b/_maps/RandomRuins/SpaceRuins/asteroid5.dmm @@ -13,7 +13,7 @@ dir = 2; dwidth = 11; height = 22; - id = "whiteship_mining1"; + shuttle_id = "whiteship_mining1"; name = "Small Asteroid"; width = 35 }, diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index a171a8caf1d5..a903817bd476 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -45,7 +45,7 @@ dir = 2; dwidth = 14; height = 13; - id = "caravanpirate_ambush"; + shuttle_id = "caravanpirate_ambush"; name = "Trade Route"; roundstart_template = /datum/map_template/shuttle/ruin/pirate_cutter; width = 22 @@ -1144,7 +1144,7 @@ dir = 2; dwidth = 6; height = 7; - id = "caravansyndicate3_ambush"; + shuttle_id = "caravansyndicate3_ambush"; name = "Trade Route"; roundstart_template = /datum/map_template/shuttle/ruin/syndicate_dropship; width = 15 @@ -1156,7 +1156,7 @@ dir = 4; dwidth = 4; height = 5; - id = "caravansyndicate1_ambush"; + shuttle_id = "caravansyndicate1_ambush"; name = "Trade Route"; roundstart_template = /datum/map_template/shuttle/ruin/syndicate_fighter_shiv; width = 9 @@ -1168,7 +1168,7 @@ dir = 2; dwidth = 11; height = 11; - id = "caravantrade1_ambush"; + shuttle_id = "caravantrade1_ambush"; name = "Trade Route"; roundstart_template = /datum/map_template/shuttle/ruin/caravan_victim; width = 27 diff --git a/_maps/RandomRuins/SpaceRuins/freeminer_asteroid.dmm b/_maps/RandomRuins/SpaceRuins/freeminer_asteroid.dmm index d28868ba8e6a..ad25557b7a2e 100644 --- a/_maps/RandomRuins/SpaceRuins/freeminer_asteroid.dmm +++ b/_maps/RandomRuins/SpaceRuins/freeminer_asteroid.dmm @@ -32,7 +32,7 @@ dir = 2; dwidth = 11; height = 22; - id = "whiteship_mining0"; + shuttle_id = "whiteship_mining0"; name = "Free Miner Asteroid"; width = 35 }, diff --git a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm index 80088bb7e673..809d3f90f335 100644 --- a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm @@ -2407,7 +2407,7 @@ /obj/docking_port/stationary{ dwidth = 6; height = 7; - id = "listeningpost"; + shuttle_id = "listeningpost"; name = "Listening Post Dock"; width = 15 }, diff --git a/_maps/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/RandomRuins/SpaceRuins/spacebar.dmm index a2972a4b4ff4..de7e58f48f39 100644 --- a/_maps/RandomRuins/SpaceRuins/spacebar.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacebar.dmm @@ -926,7 +926,7 @@ dir = 8; dwidth = 11; height = 22; - id = "spacebar"; + shuttle_id = "spacebar"; name = "Space Bar"; width = 35 }, diff --git a/_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm b/_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm index b5f2fb223762..f653171b1dca 100644 --- a/_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm +++ b/_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm @@ -8,7 +8,7 @@ dir = 2; dwidth = 11; height = 22; - id = "whiteship_away"; + shuttle_id = "whiteship_away"; json_key = "whiteship"; name = "Deep Space"; width = 35 diff --git a/_maps/RandomRuins/StationRuins/GaxStation/ai_whale.dmm b/_maps/RandomRuins/StationRuins/GaxStation/ai_whale.dmm index c9855d2fd277..056d37ad637a 100644 --- a/_maps/RandomRuins/StationRuins/GaxStation/ai_whale.dmm +++ b/_maps/RandomRuins/StationRuins/GaxStation/ai_whale.dmm @@ -1478,7 +1478,7 @@ dir = 2; dwidth = 2; height = 6; - id = "ai_ship"; + shuttle_id = "ai_ship"; name = "ai ship bay"; width = 5 }, diff --git a/_maps/RandomZLevels/VR/snowdin_VR.dmm b/_maps/RandomZLevels/VR/snowdin_VR.dmm index e2fde393e1fa..f872be190442 100644 --- a/_maps/RandomZLevels/VR/snowdin_VR.dmm +++ b/_maps/RandomZLevels/VR/snowdin_VR.dmm @@ -10294,7 +10294,7 @@ dir = 4; dwidth = 3; height = 6; - id = "snowdin_excavation_top"; + shuttle_id = "snowdin_excavation_top"; name = "snowdin excavation top"; roundstart_template = /datum/map_template/shuttle/snowdin/excavation; width = 6 @@ -10337,7 +10337,7 @@ dir = 4; dwidth = 3; height = 6; - id = "snowdin_excavation_down"; + shuttle_id = "snowdin_excavation_down"; name = "snowdin excavation down"; width = 6 }, @@ -15219,7 +15219,7 @@ dir = 4; dwidth = 2; height = 5; - id = "snowdin_mining_top"; + shuttle_id = "snowdin_mining_top"; name = "snowdin mining top"; roundstart_template = /datum/map_template/shuttle/snowdin/mining; width = 5 @@ -15277,7 +15277,7 @@ dir = 4; dwidth = 2; height = 5; - id = "snowdin_mining_down"; + shuttle_id = "snowdin_mining_down"; name = "snowdin mining bottom"; width = 5 }, diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 2dc1373ad4e2..06790c21b9f7 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -10420,7 +10420,7 @@ dir = 4; dwidth = 3; height = 6; - id = "snowdin_excavation_top"; + shuttle_id = "snowdin_excavation_top"; name = "snowdin excavation top"; roundstart_template = /datum/map_template/shuttle/snowdin/excavation; width = 6 @@ -10462,7 +10462,7 @@ dir = 4; dwidth = 3; height = 6; - id = "snowdin_excavation_down"; + shuttle_id = "snowdin_excavation_down"; name = "snowdin excavation down"; width = 6 }, @@ -15386,7 +15386,7 @@ dir = 4; dwidth = 2; height = 5; - id = "snowdin_mining_top"; + shuttle_id = "snowdin_mining_top"; name = "snowdin mining top"; roundstart_template = /datum/map_template/shuttle/snowdin/mining; width = 5 @@ -15443,7 +15443,7 @@ dir = 4; dwidth = 2; height = 5; - id = "snowdin_mining_down"; + shuttle_id = "snowdin_mining_down"; name = "snowdin mining bottom"; width = 5 }, diff --git a/_maps/asteroidstation.dm b/_maps/asteroidstation.dm index 48d46c1df8a9..a42370be2879 100644 --- a/_maps/asteroidstation.dm +++ b/_maps/asteroidstation.dm @@ -1 +1 @@ -#define FORCE_MAP "_maps/asteroidstation.json" \ No newline at end of file +#define FORCE_MAP "asteroidstation" diff --git a/_maps/donutstation.dm b/_maps/donutstation.dm index e8919e20da46..a1e03d2afde5 100644 --- a/_maps/donutstation.dm +++ b/_maps/donutstation.dm @@ -1 +1 @@ -#define FORCE_MAP "_maps/donutstation.json" +#define FORCE_MAP "donutstation" diff --git a/_maps/gaxstation.dm b/_maps/gaxstation.dm index 176146c9e4b0..f4bd47380abc 100644 --- a/_maps/gaxstation.dm +++ b/_maps/gaxstation.dm @@ -1 +1 @@ -#define FORCE_MAP "_maps/gaxstation.json" +#define FORCE_MAP "gaxstation" diff --git a/_maps/icemeta.dm b/_maps/icemeta.dm index ab185b18d948..9869d2e83d3f 100644 --- a/_maps/icemeta.dm +++ b/_maps/icemeta.dm @@ -1 +1 @@ -#define FORCE_MAP "_maps/icemeta.json" \ No newline at end of file +#define FORCE_MAP "icemeta" diff --git a/_maps/map_files/AsteroidStation/AsteroidStation.dmm b/_maps/map_files/AsteroidStation/AsteroidStation.dmm index e1c2a9d410d9..247c5413f0a3 100644 --- a/_maps/map_files/AsteroidStation/AsteroidStation.dmm +++ b/_maps/map_files/AsteroidStation/AsteroidStation.dmm @@ -990,7 +990,7 @@ dir = 2; dwidth = 3; height = 5; - id = "mining_home"; + shuttle_id = "mining_home"; name = "mining shuttle bay"; roundstart_template = /datum/map_template/shuttle/mining/box; width = 7 @@ -1317,7 +1317,7 @@ "alS" = ( /obj/docking_port/stationary/random{ dir = 2; - id = "pod_lavaland4"; + shuttle_id = "pod_lavaland4"; name = "lavaland" }, /turf/open/space/basic, @@ -2870,7 +2870,7 @@ dir = 8; dwidth = 11; height = 22; - id = "whiteship_home"; + shuttle_id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; width = 35 }, @@ -3170,7 +3170,7 @@ dir = 2; dwidth = 3; height = 15; - id = "arrivals_stationary"; + shuttle_id = "arrivals_stationary"; name = "arrivals"; roundstart_template = /datum/map_template/shuttle/arrival/box; width = 7 @@ -3434,7 +3434,7 @@ dir = 2; dwidth = 5; height = 7; - id = "supply_home"; + shuttle_id = "supply_home"; name = "Cargo Bay"; width = 12 }, @@ -3463,7 +3463,7 @@ dir = 4; dwidth = 12; height = 18; - id = "emergency_home"; + shuttle_id = "emergency_home"; name = "BoxStation emergency evac bay"; width = 32 }, @@ -4262,7 +4262,7 @@ /area/crew_quarters/dorms) "aKW" = ( /obj/docking_port/stationary/random{ - id = "pod_lavaland1"; + shuttle_id = "pod_lavaland1"; name = "lavaland" }, /turf/open/space/basic, @@ -4695,7 +4695,7 @@ dir = 2; dwidth = 2; height = 13; - id = "ferry_home"; + shuttle_id = "ferry_home"; name = "port bay 2"; width = 5 }, @@ -4898,7 +4898,7 @@ /area/space/nearstation) "aSm" = ( /obj/docking_port/stationary/random{ - id = "pod_lavaland2"; + shuttle_id = "pod_lavaland2"; name = "lavaland" }, /turf/open/space/basic, @@ -5599,7 +5599,7 @@ dir = 8; dwidth = 2; height = 5; - id = "laborcamp_home"; + shuttle_id = "laborcamp_home"; name = "fore bay 1"; roundstart_template = /datum/map_template/shuttle/labour/box; width = 9 @@ -29490,7 +29490,7 @@ /area/ai_monitored/security/armory) "iBd" = ( /obj/docking_port/stationary/random{ - id = "pod_lavaland3"; + shuttle_id = "pod_lavaland3"; name = "lavaland" }, /turf/open/space/basic, diff --git a/_maps/map_files/DonutStation/DonutStation.dmm b/_maps/map_files/DonutStation/DonutStation.dmm index a2eedd44da66..f1c2780d5272 100644 --- a/_maps/map_files/DonutStation/DonutStation.dmm +++ b/_maps/map_files/DonutStation/DonutStation.dmm @@ -10345,7 +10345,7 @@ dir = 1; dwidth = 5; height = 7; - id = "supply_home"; + shuttle_id = "supply_home"; name = "Cargo Bay"; width = 12 }, @@ -12414,7 +12414,7 @@ dir = 2; dwidth = 11; height = 22; - id = "whiteship_home"; + shuttle_id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; width = 35 }, @@ -30217,7 +30217,7 @@ "naS" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_lavaland2"; + shuttle_id = "pod_lavaland2"; name = "lavaland" }, /turf/open/space/basic, @@ -31165,7 +31165,7 @@ dir = 8; dwidth = 4; height = 9; - id = "aux_base_zone"; + shuttle_id = "aux_base_zone"; name = "aux base zone"; roundstart_template = /datum/map_template/shuttle/aux_base/default; width = 9 @@ -34694,7 +34694,7 @@ "oWP" = ( /obj/docking_port/stationary/random{ dir = 1; - id = "pod_lavaland2"; + shuttle_id = "pod_lavaland2"; name = "lavaland" }, /turf/open/space, @@ -40293,7 +40293,7 @@ dir = 2; dwidth = 3; height = 13; - id = "arrivals_stationary"; + shuttle_id = "arrivals_stationary"; name = "donut arrivals"; roundstart_template = /datum/map_template/shuttle/arrival/donut; width = 7 @@ -50654,7 +50654,7 @@ "vRn" = ( /obj/docking_port/stationary/random{ dir = 2; - id = "pod_lavaland2"; + shuttle_id = "pod_lavaland2"; name = "lavaland" }, /turf/open/space/basic, @@ -53210,7 +53210,7 @@ /obj/docking_port/stationary{ dwidth = 12; height = 18; - id = "emergency_home"; + shuttle_id = "emergency_home"; name = "BoxStation emergency evac bay"; width = 32 }, @@ -53681,7 +53681,7 @@ dir = 1; dwidth = 3; height = 5; - id = "mining_home"; + shuttle_id = "mining_home"; name = "mining shuttle bay"; roundstart_template = /datum/map_template/shuttle/mining/box; width = 7 @@ -54035,7 +54035,7 @@ dir = 2; dwidth = 2; height = 5; - id = "laborcamp_home"; + shuttle_id = "laborcamp_home"; name = "fore bay 1"; roundstart_template = /datum/map_template/shuttle/labour/box; width = 9 @@ -54209,7 +54209,7 @@ dir = 8; dwidth = 2; height = 13; - id = "ferry_home"; + shuttle_id = "ferry_home"; name = "port bay 2"; width = 5 }, diff --git a/_maps/map_files/GaxStation/GaxStation.dmm b/_maps/map_files/GaxStation/GaxStation.dmm index e75906b2c856..96c80ea5676e 100644 --- a/_maps/map_files/GaxStation/GaxStation.dmm +++ b/_maps/map_files/GaxStation/GaxStation.dmm @@ -8691,7 +8691,7 @@ /area/medical/genetics) "ekt" = ( /obj/docking_port/stationary/random{ - id = "pod_lavaland3"; + shuttle_id = "pod_lavaland3"; name = "lavaland" }, /turf/open/space/basic, @@ -13175,7 +13175,7 @@ dir = 2; dwidth = 3; height = 5; - id = "mining_home"; + shuttle_id = "mining_home"; name = "mining shuttle bay"; roundstart_template = /datum/map_template/shuttle/mining/box; width = 7 @@ -15291,7 +15291,7 @@ dir = 8; dwidth = 2; height = 6; - id = "ai_station"; + shuttle_id = "ai_station"; name = "ai station bay"; roundstart_template = /datum/map_template/shuttle/ai/gax; width = 5 @@ -15849,7 +15849,7 @@ dir = 2; dwidth = 2; height = 13; - id = "ferry_home"; + shuttle_id = "ferry_home"; name = "port bay 2"; width = 5 }, @@ -18625,7 +18625,7 @@ dir = 4; dwidth = 11; height = 22; - id = "whiteship_home"; + shuttle_id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; width = 35 }, @@ -19679,7 +19679,7 @@ /obj/docking_port/stationary{ dwidth = 12; height = 18; - id = "emergency_home"; + shuttle_id = "emergency_home"; name = "BoxStation emergency evac bay"; width = 32 }, @@ -22390,7 +22390,7 @@ "kUf" = ( /obj/docking_port/stationary/random{ dir = 2; - id = "pod_lavaland3"; + shuttle_id = "pod_lavaland3"; name = "lavaland" }, /turf/open/space/basic, @@ -36911,7 +36911,7 @@ /obj/docking_port/stationary{ dwidth = 2; height = 5; - id = "laborcamp_home"; + shuttle_id = "laborcamp_home"; name = "fore bay 1"; roundstart_template = /datum/map_template/shuttle/labour/gax; width = 9 @@ -44585,7 +44585,7 @@ dir = 2; dwidth = 4; height = 7; - id = "supply_home"; + shuttle_id = "supply_home"; name = "Cargo Bay"; width = 12 }, @@ -48372,7 +48372,7 @@ "xMI" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_lavaland2"; + shuttle_id = "pod_lavaland2"; name = "lavaland" }, /turf/open/space/basic, diff --git a/_maps/map_files/IceMeta/IceMeta.dmm b/_maps/map_files/IceMeta/IceMeta.dmm index 8eeea6a17b18..1429765d4170 100644 --- a/_maps/map_files/IceMeta/IceMeta.dmm +++ b/_maps/map_files/IceMeta/IceMeta.dmm @@ -6681,7 +6681,7 @@ dir = 8; dwidth = 12; height = 17; - id = "syndicate_nw"; + shuttle_id = "syndicate_nw"; name = "northwest of station"; width = 23 }, @@ -8878,7 +8878,7 @@ dheight = 4; dwidth = 4; height = 9; - id = "aux_base_zone"; + shuttle_id = "aux_base_zone"; name = "aux base zone"; roundstart_template = /datum/map_template/shuttle/aux_base/default; width = 9 @@ -22384,7 +22384,7 @@ dir = 8; dwidth = 2; height = 13; - id = "ferry_home"; + shuttle_id = "ferry_home"; name = "port bay 2"; width = 5 }, @@ -25179,7 +25179,7 @@ area_type = /area/icemoon/underground/explored/laborcamp; dwidth = 2; height = 5; - id = "laborcamp_away"; + shuttle_id = "laborcamp_away"; name = "labor camp"; width = 9 }, @@ -27540,7 +27540,7 @@ dir = 2; dwidth = 11; height = 22; - id = "whiteship_home"; + shuttle_id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; width = 35 }, @@ -28440,7 +28440,7 @@ dir = 8; dwidth = 5; height = 7; - id = "supply_home"; + shuttle_id = "supply_home"; name = "Cargo Bay"; width = 12 }, @@ -31472,7 +31472,7 @@ dir = 2; dwidth = 9; height = 25; - id = "emergency_home"; + shuttle_id = "emergency_home"; name = "MetaStation emergency evac bay"; width = 29 }, @@ -50391,7 +50391,7 @@ /area/security/brig) "oAG" = ( /obj/docking_port/stationary/random/icemoon{ - id = "pod_icemoon1" + shuttle_id = "pod_icemoon1" }, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, /area/icemoon/top_layer/outdoors) @@ -52196,7 +52196,7 @@ /area/medical/virology) "phC" = ( /obj/docking_port/stationary/random/icemoon{ - id = "pod_icemoon2" + shuttle_id = "pod_icemoon2" }, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, /area/icemoon/top_layer/outdoors) @@ -58232,7 +58232,7 @@ "qSS" = ( /obj/docking_port/stationary/random/icemoon{ dir = 4; - id = "pod_icemoon4" + shuttle_id = "pod_icemoon4" }, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, /area/icemoon/top_layer/outdoors) @@ -67375,7 +67375,7 @@ dir = 8; dwidth = 3; height = 15; - id = "arrivals_stationary"; + shuttle_id = "arrivals_stationary"; name = "arrivals"; roundstart_template = /datum/map_template/shuttle/arrival/box; width = 7 @@ -80648,7 +80648,7 @@ dir = 8; dwidth = 2; height = 5; - id = "laborcamp_home"; + shuttle_id = "laborcamp_home"; name = "fore bay 1"; roundstart_template = /datum/map_template/shuttle/labour/box; width = 9 @@ -81707,7 +81707,7 @@ "xzn" = ( /obj/docking_port/stationary/random/icemoon{ dir = 4; - id = "pod_icemoon3" + shuttle_id = "pod_icemoon3" }, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, /area/icemoon/top_layer/outdoors) diff --git a/_maps/map_files/YogStation/YogStation.dmm b/_maps/map_files/YogStation/YogStation.dmm index 3ddf97f237cb..0e0ca6c6d250 100644 --- a/_maps/map_files/YogStation/YogStation.dmm +++ b/_maps/map_files/YogStation/YogStation.dmm @@ -779,7 +779,7 @@ dir = 4; dwidth = 12; height = 18; - id = "emergency_home"; + shuttle_id = "emergency_home"; name = "BoxStation emergency evac bay"; width = 32 }, @@ -2912,7 +2912,7 @@ /obj/docking_port/stationary{ dwidth = 8; height = 11; - id = "auxiliary_construction"; + shuttle_id = "auxiliary_construction"; name = "SS13: Auxiliary Construction Dock"; width = 17 }, @@ -4971,7 +4971,7 @@ dir = 8; dwidth = 2; height = 5; - id = "laborcamp_home"; + shuttle_id = "laborcamp_home"; name = "fore bay 1"; roundstart_template = /datum/map_template/shuttle/labour/box; width = 9 @@ -6277,7 +6277,7 @@ dir = 8; dwidth = 4; height = 9; - id = "aux_base_zone"; + shuttle_id = "aux_base_zone"; name = "aux base zone"; roundstart_template = /datum/map_template/shuttle/aux_base/default; width = 9 @@ -8747,7 +8747,7 @@ "boS" = ( /obj/docking_port/stationary/random{ dir = 8; - id = "pod_lavaland2"; + shuttle_id = "pod_lavaland2"; name = "lavaland" }, /turf/open/space, @@ -13242,7 +13242,7 @@ dir = 8; dwidth = 3; height = 15; - id = "arrivals_stationary"; + shuttle_id = "arrivals_stationary"; name = "arrivals"; roundstart_template = /datum/map_template/shuttle/arrival/box; width = 7 @@ -22400,7 +22400,7 @@ "fhN" = ( /obj/docking_port/stationary/random{ dir = 8; - id = "pod_lavaland1"; + shuttle_id = "pod_lavaland1"; name = "lavaland" }, /turf/open/space, @@ -27727,7 +27727,7 @@ dir = 8; dwidth = 2; height = 13; - id = "ferry_home"; + shuttle_id = "ferry_home"; name = "port bay 2"; width = 5 }, @@ -42324,7 +42324,7 @@ dir = 2; dwidth = 11; height = 22; - id = "whiteship_home"; + shuttle_id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; width = 35 }, @@ -48387,7 +48387,7 @@ "oIO" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_lavaland4"; + shuttle_id = "pod_lavaland4"; name = "lavaland" }, /turf/open/space, @@ -51145,7 +51145,7 @@ "pFB" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_lavaland3"; + shuttle_id = "pod_lavaland3"; name = "lavaland" }, /turf/open/space, @@ -53677,7 +53677,7 @@ dir = 8; dwidth = 5; height = 7; - id = "supply_home"; + shuttle_id = "supply_home"; name = "Cargo Bay"; width = 12 }, @@ -64177,16 +64177,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"uAs" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - dir = 1; - name = "Prison Monitor"; - network = list("prison"); - pixel_y = 6 - }, -/turf/closed/wall, -/area/lawoffice) "uAL" = ( /obj/structure/sign/departments/minsky/medical/medical1, /turf/closed/wall, @@ -67615,7 +67605,7 @@ dir = 8; dwidth = 3; height = 5; - id = "mining_home"; + shuttle_id = "mining_home"; name = "mining shuttle bay"; roundstart_template = /datum/map_template/shuttle/mining/box; width = 7 diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index d8da4d5dc777..1aef97c19d73 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -1384,7 +1384,7 @@ dir = 8; dwidth = 2; height = 5; - id = "laborcamp_home"; + shuttle_id = "laborcamp_home"; name = "fore bay 1"; roundstart_template = /datum/map_template/shuttle/labour/box; width = 9 @@ -1396,7 +1396,7 @@ dir = 8; dwidth = 3; height = 15; - id = "arrivals_stationary"; + shuttle_id = "arrivals_stationary"; name = "arrivals"; roundstart_template = /datum/map_template/shuttle/arrival/box; width = 7 @@ -1450,7 +1450,7 @@ /area/hallway/secondary/entry) "el" = ( /obj/docking_port/stationary/random{ - id = "pod_lavaland1"; + shuttle_id = "pod_lavaland1"; name = "lavaland" }, /turf/open/space, @@ -1573,7 +1573,7 @@ dir = 8; dwidth = 2; height = 13; - id = "ferry_home"; + shuttle_id = "ferry_home"; name = "port bay 2"; width = 5 }, @@ -1610,7 +1610,7 @@ dir = 4; dwidth = 4; height = 7; - id = "supply_home"; + shuttle_id = "supply_home"; name = "Cargo Bay"; width = 12 }, @@ -1797,7 +1797,7 @@ dir = 2; dwidth = 11; height = 15; - id = "whiteship_home"; + shuttle_id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; width = 28 }, @@ -1856,7 +1856,7 @@ dir = 2; dwidth = 9; height = 25; - id = "emergency_home"; + shuttle_id = "emergency_home"; name = "Runtimestation emergency evac bay"; width = 29 }, @@ -2277,7 +2277,7 @@ dir = 8; dwidth = 3; height = 5; - id = "mining_home"; + shuttle_id = "mining_home"; name = "mining shuttle bay"; roundstart_template = /datum/map_template/shuttle/mining/box; width = 7 diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 42ecfd88cc34..5ecaf712b614 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -3746,7 +3746,7 @@ dir = 8; dwidth = 8; height = 7; - id = "supply_away"; + shuttle_id = "supply_away"; json_key = "cargo"; name = "CentCom"; width = 20 @@ -4114,7 +4114,7 @@ area_type = /area/syndicate_mothership; dwidth = 25; height = 50; - id = "emergency_syndicate"; + shuttle_id = "emergency_syndicate"; name = "Syndicate Auxillary Shuttle Dock"; width = 50 }, @@ -6860,7 +6860,7 @@ /area/centcom/testchamber) "apy" = ( /obj/machinery/smartfridge, -/turf/closed/indestructible/rock/wood, +/turf/closed/indestructible/wood, /area/centcom/holding) "apz" = ( /obj/structure/rack, @@ -9230,7 +9230,7 @@ dir = 2; dwidth = 14; height = 13; - id = "syndicatecutter_home"; + shuttle_id = "syndicatecutter_home"; name = "Syndicate Home Outpost"; roundstart_template = /datum/map_template/shuttle/infiltrator/cutter; width = 22 @@ -9872,7 +9872,7 @@ dir = 4; dwidth = 25; height = 50; - id = "emergency_away"; + shuttle_id = "emergency_away"; json_key = "emergency"; name = "CentCom Emergency Shuttle Dock"; width = 50 @@ -10672,7 +10672,7 @@ /obj/docking_port/stationary{ dwidth = 1; height = 4; - id = "pod2_away"; + shuttle_id = "pod2_away"; name = "recovery ship"; width = 3 }, @@ -10759,7 +10759,7 @@ dir = 8; dwidth = 2; height = 13; - id = "ferry_away"; + shuttle_id = "ferry_away"; json_key = "ferry"; name = "CentCom Ferry Dock"; width = 5 @@ -12828,7 +12828,7 @@ /obj/docking_port/stationary{ dwidth = 1; height = 4; - id = "pod3_away"; + shuttle_id = "pod3_away"; name = "recovery ship"; width = 3 }, @@ -13113,7 +13113,7 @@ /area/yogs/infiltrator_base/outside) "aBV" = ( /obj/machinery/chem_dispenser/drinks/beer, -/turf/closed/indestructible/rock/wood, +/turf/closed/indestructible/wood, /area/centcom/holding) "aBW" = ( /obj/machinery/atmospherics/components/binary/pump/on{ @@ -13979,7 +13979,7 @@ dir = 8; dwidth = 2; height = 7; - id = "pod_away"; + shuttle_id = "pod_away"; name = "recovery ship"; width = 5 }, @@ -14642,7 +14642,7 @@ /area/wizard_station) "aED" = ( /obj/machinery/vending/boozeomat, -/turf/closed/indestructible/rock/wood, +/turf/closed/indestructible/wood, /area/centcom/holding) "aEE" = ( /obj/structure/closet/crate/bin, @@ -17597,7 +17597,7 @@ height = 8; name = "Backup Shuttle Dock"; roundstart_template = /datum/map_template/shuttle/emergency/backup; - id = "backup_away"; + shuttle_id = "backup_away"; width = 8 }, /turf/open/space/basic, @@ -18825,7 +18825,7 @@ dir = 8; dwidth = 12; height = 17; - id = "syndicate_away"; + shuttle_id = "syndicate_away"; name = "syndicate recon outpost"; roundstart_template = /datum/map_template/shuttle/infiltrator/basic; width = 23 @@ -19133,7 +19133,7 @@ }, /area/holodeck/rec_center/medical) "aNd" = ( -/turf/closed/indestructible/rock/wood, +/turf/closed/indestructible/wood, /area/centcom/holding) "aNe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -20984,7 +20984,7 @@ /area/centcom/testchamber) "aQT" = ( /obj/machinery/chem_dispenser/drinks, -/turf/closed/indestructible/rock/wood, +/turf/closed/indestructible/wood, /area/centcom/holding) "aQU" = ( /obj/structure/table/reinforced, @@ -22157,7 +22157,7 @@ dir = 4; dwidth = 1; height = 4; - id = "pod4_away"; + shuttle_id = "pod4_away"; name = "recovery ship"; width = 3 }, @@ -23480,10 +23480,6 @@ /obj/item/clothing/head/peaceflower, /turf/open/floor/plasteel/bluespace, /area/centcom/testchamber) -"aVX" = ( -/obj/effect/landmark/shuttle_import, -/turf/open/space/basic, -/area/space) "aVY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -50119,7 +50115,7 @@ aaa aaa aaa aaa -aVX +aaa aaa aaa aaa diff --git a/_maps/map_files/mining/Jungleland.dmm b/_maps/map_files/mining/Jungleland.dmm index cd2cf4d3423c..c721ec19cbc0 100644 --- a/_maps/map_files/mining/Jungleland.dmm +++ b/_maps/map_files/mining/Jungleland.dmm @@ -9,7 +9,7 @@ dir = 8; dwidth = 2; height = 5; - id = "laborcamp_away"; + shuttle_id = "laborcamp_away"; name = "labor camp"; width = 9 }, @@ -203,7 +203,7 @@ dir = 2; dwidth = 11; height = 22; - id = "whiteship_mining"; + shuttle_id = "whiteship_mining"; name = "jungleland pits"; width = 35 }, diff --git a/_maps/map_files/mining/Lavaland.dmm b/_maps/map_files/mining/Lavaland.dmm index eb53289a0134..c38f625319df 100644 --- a/_maps/map_files/mining/Lavaland.dmm +++ b/_maps/map_files/mining/Lavaland.dmm @@ -500,7 +500,7 @@ dir = 8; dwidth = 2; height = 5; - id = "laborcamp_away"; + shuttle_id = "laborcamp_away"; name = "labor camp"; width = 9 }, @@ -3197,7 +3197,7 @@ dir = 2; dwidth = 11; height = 22; - id = "whiteship_mining"; + shuttle_id = "whiteship_mining"; name = "lavaland wastes"; width = 35 }, diff --git a/_maps/multiz_debug.dm b/_maps/multiz_debug.dm index 0521fef59d30..113e16fbebd3 100644 --- a/_maps/multiz_debug.dm +++ b/_maps/multiz_debug.dm @@ -1 +1 @@ -#define FORCE_MAP "_maps/multiz_debug.json" \ No newline at end of file +#define FORCE_MAP "multiz_debug" diff --git a/_maps/runtimestation.dm b/_maps/runtimestation.dm index 352d4c1afcdc..350091aa84e2 100644 --- a/_maps/runtimestation.dm +++ b/_maps/runtimestation.dm @@ -1 +1 @@ -#define FORCE_MAP "_maps/runtimestation.json" +#define FORCE_MAP "runtimestation" diff --git a/_maps/shuttles/ai_gax.dmm b/_maps/shuttles/ai_gax.dmm index d0dd9db796c3..5497d5579e72 100644 --- a/_maps/shuttles/ai_gax.dmm +++ b/_maps/shuttles/ai_gax.dmm @@ -84,7 +84,7 @@ dir = 2; dwidth = 2; height = 6; - id = "ai_ship"; + shuttle_id = "ai_ship"; name = "ai ship shuttle"; port_direction = 4; width = 5 diff --git a/_maps/shuttles/escape_pod_2.dmm b/_maps/shuttles/escape_pod_2.dmm index 25af76887bd0..aeb4217fbdec 100644 --- a/_maps/shuttles/escape_pod_2.dmm +++ b/_maps/shuttles/escape_pod_2.dmm @@ -6,7 +6,7 @@ /obj/docking_port/mobile/pod{ dwidth = 1; height = 4; - id = "pod2"; + shuttle_id = "pod2"; port_direction = 2; width = 3 }, diff --git a/_maps/shuttles/escape_pod_3.dmm b/_maps/shuttles/escape_pod_3.dmm index 8eaa817ec58b..6a71d4f30974 100644 --- a/_maps/shuttles/escape_pod_3.dmm +++ b/_maps/shuttles/escape_pod_3.dmm @@ -6,7 +6,7 @@ /obj/docking_port/mobile/pod{ dwidth = 1; height = 4; - id = "pod3"; + shuttle_id = "pod3"; port_direction = 2; width = 3 }, diff --git a/_maps/shuttles/escape_pod_4.dmm b/_maps/shuttles/escape_pod_4.dmm index 157499a587eb..7c35d695d8e8 100644 --- a/_maps/shuttles/escape_pod_4.dmm +++ b/_maps/shuttles/escape_pod_4.dmm @@ -6,7 +6,7 @@ /obj/docking_port/mobile/pod{ dwidth = 1; height = 4; - id = "pod4"; + shuttle_id = "pod4"; port_direction = 2; width = 3 }, diff --git a/_maps/shuttles/ferry_base.dmm b/_maps/shuttles/ferry_base.dmm index 149bc65b89f8..5237d60f099c 100644 --- a/_maps/shuttles/ferry_base.dmm +++ b/_maps/shuttles/ferry_base.dmm @@ -31,7 +31,7 @@ dir = 8; dwidth = 2; height = 12; - id = "ferry"; + shuttle_id = "ferry"; name = "ferry shuttle"; port_direction = 2; width = 5 diff --git a/_maps/shuttles/ferry_fancy.dmm b/_maps/shuttles/ferry_fancy.dmm index fdfb2ffc7b9b..ad16c6d386bd 100644 --- a/_maps/shuttles/ferry_fancy.dmm +++ b/_maps/shuttles/ferry_fancy.dmm @@ -81,7 +81,7 @@ dir = 8; dwidth = 2; height = 13; - id = "ferry"; + shuttle_id = "ferry"; name = "ferry shuttle"; port_direction = 1; preferred_direction = 4; diff --git a/_maps/shuttles/ferry_kilo.dmm b/_maps/shuttles/ferry_kilo.dmm index 708cf5696d59..92bbbe4faeb0 100644 --- a/_maps/shuttles/ferry_kilo.dmm +++ b/_maps/shuttles/ferry_kilo.dmm @@ -160,7 +160,7 @@ dir = 8; dwidth = 2; height = 11; - id = "ferry"; + shuttle_id = "ferry"; name = "ferry shuttle"; port_direction = 1; preferred_direction = 4; diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm index 09dada7dbeb3..30b1bd4f25a7 100644 --- a/_maps/shuttles/ferry_lighthouse.dmm +++ b/_maps/shuttles/ferry_lighthouse.dmm @@ -219,7 +219,7 @@ dir = 8; dwidth = 8; height = 27; - id = "ferry"; + shuttle_id = "ferry"; name = "The Lighthouse"; port_direction = 2; width = 16 diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry_meat.dmm index 8330391ecdf3..3a5be5bebf01 100644 --- a/_maps/shuttles/ferry_meat.dmm +++ b/_maps/shuttles/ferry_meat.dmm @@ -135,7 +135,7 @@ dir = 8; dwidth = 2; height = 12; - id = "ferry"; + shuttle_id = "ferry"; name = "ferry shuttle"; port_direction = 2; width = 5 diff --git a/_maps/shuttles/hunter_russian.dmm b/_maps/shuttles/hunter_russian.dmm index 5c4d481ae461..b0201b7d114c 100644 --- a/_maps/shuttles/hunter_russian.dmm +++ b/_maps/shuttles/hunter_russian.dmm @@ -212,7 +212,7 @@ dir = 1; dwidth = 11; height = 16; - id = "pirateship_home"; + shuttle_id = "pirateship_home"; name = "Deep Space"; width = 17 }, @@ -221,7 +221,7 @@ dir = 1; dwidth = 3; height = 13; - id = "huntership"; + shuttle_id = "huntership"; movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "hunter shuttle"; rechargeTime = 1800; diff --git a/_maps/shuttles/hunter_space_cop.dmm b/_maps/shuttles/hunter_space_cop.dmm index 1d55af6ae97f..a84dc794f8a2 100644 --- a/_maps/shuttles/hunter_space_cop.dmm +++ b/_maps/shuttles/hunter_space_cop.dmm @@ -76,7 +76,7 @@ dir = 4; dwidth = 3; height = 12; - id = "pirateship_home"; + shuttle_id = "pirateship_home"; name = "Deep Space"; width = 7 }, @@ -85,7 +85,7 @@ dir = 4; dwidth = 3; height = 12; - id = "huntership"; + shuttle_id = "huntership"; name = "hunter shuttle"; rechargeTime = 1800; width = 7 diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index d6896a153c58..722d9d907760 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -470,7 +470,7 @@ dwidth = 12; height = 17; hidden = 1; - id = "syndicate"; + shuttle_id = "syndicate"; movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "syndicate infiltrator"; port_direction = 4; diff --git a/_maps/shuttles/infiltrator_cutter.dmm b/_maps/shuttles/infiltrator_cutter.dmm index e6508b1cc270..121e92899a85 100644 --- a/_maps/shuttles/infiltrator_cutter.dmm +++ b/_maps/shuttles/infiltrator_cutter.dmm @@ -15,7 +15,7 @@ dir = 2; dwidth = 14; height = 13; - id = "syndicatecutter"; + shuttle_id = "syndicatecutter"; movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "Syndicate Cutter"; port_direction = 8; diff --git a/_maps/shuttles/labour_box.dmm b/_maps/shuttles/labour_box.dmm index b2f5bda204f2..07fb01ece3cc 100644 --- a/_maps/shuttles/labour_box.dmm +++ b/_maps/shuttles/labour_box.dmm @@ -121,7 +121,7 @@ dir = 8; dwidth = 2; height = 5; - id = "laborcamp"; + shuttle_id = "laborcamp"; name = "labor camp shuttle"; port_direction = 4; width = 9 diff --git a/_maps/shuttles/labour_delta.dmm b/_maps/shuttles/labour_delta.dmm index 5b148d4ee86d..b716eaa6a5a2 100644 --- a/_maps/shuttles/labour_delta.dmm +++ b/_maps/shuttles/labour_delta.dmm @@ -256,7 +256,7 @@ dir = 8; dwidth = 2; height = 5; - id = "laborcamp"; + shuttle_id = "laborcamp"; name = "labor camp shuttle"; port_direction = 4; width = 9 diff --git a/_maps/shuttles/labour_gax.dmm b/_maps/shuttles/labour_gax.dmm index 96223410c2ad..ca30244c7d31 100644 --- a/_maps/shuttles/labour_gax.dmm +++ b/_maps/shuttles/labour_gax.dmm @@ -63,7 +63,7 @@ dir = 4; dwidth = 2; height = 5; - id = "laborcamp"; + shuttle_id = "laborcamp"; name = "labor camp shuttle"; port_direction = 4; width = 9 diff --git a/_maps/shuttles/labour_kilo.dmm b/_maps/shuttles/labour_kilo.dmm index 412816506024..bd52a4808cc9 100644 --- a/_maps/shuttles/labour_kilo.dmm +++ b/_maps/shuttles/labour_kilo.dmm @@ -221,7 +221,7 @@ dir = 8; dwidth = 2; height = 5; - id = "laborcamp"; + shuttle_id = "laborcamp"; name = "labor camp shuttle"; port_direction = 4; width = 9 diff --git a/_maps/shuttles/mining_box.dmm b/_maps/shuttles/mining_box.dmm index 511bb23d0e9a..9a73fa3f3bc2 100644 --- a/_maps/shuttles/mining_box.dmm +++ b/_maps/shuttles/mining_box.dmm @@ -34,7 +34,7 @@ dir = 8; dwidth = 3; height = 5; - id = "mining"; + shuttle_id = "mining"; name = "mining shuttle"; port_direction = 4; width = 7 diff --git a/_maps/shuttles/mining_delta.dmm b/_maps/shuttles/mining_delta.dmm index 98cea361922b..c7a3040e362c 100644 --- a/_maps/shuttles/mining_delta.dmm +++ b/_maps/shuttles/mining_delta.dmm @@ -289,7 +289,7 @@ dir = 4; dwidth = 3; height = 5; - id = "mining"; + shuttle_id = "mining"; name = "mining shuttle"; port_direction = 8; width = 7 diff --git a/_maps/shuttles/mining_kilo.dmm b/_maps/shuttles/mining_kilo.dmm index 2a0e93776f22..f995701da92a 100644 --- a/_maps/shuttles/mining_kilo.dmm +++ b/_maps/shuttles/mining_kilo.dmm @@ -70,7 +70,7 @@ dir = 8; dwidth = 3; height = 5; - id = "mining"; + shuttle_id = "mining"; name = "mining shuttle"; port_direction = 4; width = 7 diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index 871010061277..532cdd90b8ef 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -855,7 +855,7 @@ dir = 1; dwidth = 11; height = 16; - id = "pirateship"; + shuttle_id = "pirateship"; launch_status = 0; movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "Pirate Ship"; @@ -867,7 +867,7 @@ dir = 1; dwidth = 11; height = 16; - id = "pirateship_home"; + shuttle_id = "pirateship_home"; name = "Deep Space"; width = 17 }, diff --git a/_maps/shuttles/ruin_caravan_victim.dmm b/_maps/shuttles/ruin_caravan_victim.dmm index 9c22f9a0e6db..5806b7c86cda 100644 --- a/_maps/shuttles/ruin_caravan_victim.dmm +++ b/_maps/shuttles/ruin_caravan_victim.dmm @@ -1171,7 +1171,7 @@ dir = 2; dwidth = 5; height = 11; - id = "caravantrade1"; + shuttle_id = "caravantrade1"; movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "Small Freighter"; port_direction = 8; diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin_pirate_cutter.dmm index 7570ff1fc97a..cc14c92574ba 100644 --- a/_maps/shuttles/ruin_pirate_cutter.dmm +++ b/_maps/shuttles/ruin_pirate_cutter.dmm @@ -932,7 +932,7 @@ dir = 2; dwidth = 14; height = 13; - id = "caravanpirate"; + shuttle_id = "caravanpirate"; movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "Pirate Cutter"; port_direction = 8; diff --git a/_maps/shuttles/ruin_syndicate_dropship.dmm b/_maps/shuttles/ruin_syndicate_dropship.dmm index 6315d683c319..af55602c4901 100644 --- a/_maps/shuttles/ruin_syndicate_dropship.dmm +++ b/_maps/shuttles/ruin_syndicate_dropship.dmm @@ -149,7 +149,7 @@ dir = 2; dwidth = 6; height = 7; - id = "caravansyndicate3"; + shuttle_id = "caravansyndicate3"; name = "Syndicate Drop Ship"; port_direction = 8; preferred_direction = 4; diff --git a/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm b/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm index ebf7c128d3cc..91766c07c474 100644 --- a/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm +++ b/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm @@ -51,7 +51,7 @@ dir = 4; dwidth = 4; height = 5; - id = "caravansyndicate1"; + shuttle_id = "caravansyndicate1"; ignitionTime = 25; name = "Syndicate Fighter"; port_direction = 2; diff --git a/_maps/shuttles/snowdin_excavation.dmm b/_maps/shuttles/snowdin_excavation.dmm index dc4c032f5951..5857e0ad375b 100644 --- a/_maps/shuttles/snowdin_excavation.dmm +++ b/_maps/shuttles/snowdin_excavation.dmm @@ -64,7 +64,7 @@ /obj/docking_port/mobile/elevator{ dir = 4; height = 6; - id = "snowdin_excavation"; + shuttle_id = "snowdin_excavation"; name = "excavation elevator"; width = 6 }, diff --git a/_maps/shuttles/snowdin_mining.dmm b/_maps/shuttles/snowdin_mining.dmm index 1522e63af6ce..fe746be73d18 100644 --- a/_maps/shuttles/snowdin_mining.dmm +++ b/_maps/shuttles/snowdin_mining.dmm @@ -7,7 +7,7 @@ dir = 4; dwidth = 2; height = 5; - id = "snowdin_mining"; + shuttle_id = "snowdin_mining"; name = "mining elevator"; width = 5 }, diff --git a/_maps/shuttles/whiteship_1.dmm b/_maps/shuttles/whiteship_1.dmm index 7fd08d0e5769..e5faf996c973 100644 --- a/_maps/shuttles/whiteship_1.dmm +++ b/_maps/shuttles/whiteship_1.dmm @@ -1006,7 +1006,7 @@ dir = 2; dwidth = 11; height = 17; - id = "whiteship"; + shuttle_id = "whiteship"; launch_status = 0; movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "Hospital Ship"; diff --git a/_maps/shuttles/whiteship_2.dmm b/_maps/shuttles/whiteship_2.dmm index 2152370cab10..9a69b0e1a29c 100644 --- a/_maps/shuttles/whiteship_2.dmm +++ b/_maps/shuttles/whiteship_2.dmm @@ -517,7 +517,7 @@ dir = 2; dwidth = 8; height = 16; - id = "whiteship"; + shuttle_id = "whiteship"; launch_status = 0; name = "NT Recovery White-Ship"; port_direction = 8; diff --git a/_maps/shuttles/whiteship_3.dmm b/_maps/shuttles/whiteship_3.dmm index 1ff39ce07afb..48ee607eafcd 100644 --- a/_maps/shuttles/whiteship_3.dmm +++ b/_maps/shuttles/whiteship_3.dmm @@ -1448,7 +1448,7 @@ dir = 2; dwidth = 11; height = 17; - id = "whiteship"; + shuttle_id = "whiteship"; launch_status = 0; movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "NT Frigate"; diff --git a/_maps/shuttles/whiteship_4.dmm b/_maps/shuttles/whiteship_4.dmm index 5036275297d7..b7ac65b8a846 100644 --- a/_maps/shuttles/whiteship_4.dmm +++ b/_maps/shuttles/whiteship_4.dmm @@ -2658,7 +2658,7 @@ dir = 2; dwidth = 11; height = 17; - id = "whiteship"; + shuttle_id = "whiteship"; launch_status = 0; movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "Salvage Ship"; diff --git a/_maps/shuttles/whiteship_5.dmm b/_maps/shuttles/whiteship_5.dmm index 2f67ea6d2951..5140907bfc7e 100644 --- a/_maps/shuttles/whiteship_5.dmm +++ b/_maps/shuttles/whiteship_5.dmm @@ -82,7 +82,7 @@ dir = 8; dwidth = 4; height = 9; - id = "whiteship"; + shuttle_id = "whiteship"; launch_status = 0; name = "White Ship"; port_direction = 4; diff --git a/_maps/shuttles/whiteship_miner.dmm b/_maps/shuttles/whiteship_miner.dmm index 249354cae2f8..02a05cc6a6f1 100644 --- a/_maps/shuttles/whiteship_miner.dmm +++ b/_maps/shuttles/whiteship_miner.dmm @@ -115,7 +115,7 @@ dir = 2; dwidth = 11; height = 15; - id = "whiteship"; + shuttle_id = "whiteship"; launch_status = 0; movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "Free Miner Ship"; diff --git a/_maps/templates/infiltrator_base.dmm b/_maps/templates/infiltrator_base.dmm index 05443db1b198..4624825e6751 100644 --- a/_maps/templates/infiltrator_base.dmm +++ b/_maps/templates/infiltrator_base.dmm @@ -1619,7 +1619,7 @@ dir = 2; dwidth = 14; height = 13; - id = "syndicatecutter_home"; + shuttle_id = "syndicatecutter_home"; name = "Syndicate Home Outpost"; roundstart_template = /datum/map_template/shuttle/infiltrator/cutter; width = 22 diff --git a/_maps/yogstation.dm b/_maps/yogstation.dm index 040cec03d858..c7814194e035 100644 --- a/_maps/yogstation.dm +++ b/_maps/yogstation.dm @@ -1 +1 @@ -#define FORCE_MAP "_maps/yogstation.json" \ No newline at end of file +#define FORCE_MAP "yogstation" diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 9456a9000ea2..d62b88203d66 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -24,25 +24,33 @@ #define INVESTIGATE_REACTOR "reactor" // Logging types for log_message() -#define LOG_ATTACK (1 << 0) -#define LOG_SAY (1 << 1) -#define LOG_WHISPER (1 << 2) -#define LOG_EMOTE (1 << 3) -#define LOG_DSAY (1 << 4) -#define LOG_PDA (1 << 5) -#define LOG_CHAT (1 << 6) -#define LOG_COMMENT (1 << 7) -#define LOG_TELECOMMS (1 << 8) -#define LOG_NTSL (1 << 9) -#define LOG_OOC (1 << 10) -#define LOG_ADMIN (1 << 11) -#define LOG_OWNERSHIP (1 << 12) -#define LOG_GAME (1 << 13) -#define LOG_ADMIN_PRIVATE (1 << 14) -#define LOG_ASAY (1 << 15) -#define LOG_MECHA (1 << 16) -#define LOG_VIRUS (1 << 17) -#define LOG_CLONING (1 << 18) +#define LOG_ATTACK (1 << 0) +#define LOG_SAY (1 << 1) +#define LOG_WHISPER (1 << 2) +#define LOG_EMOTE (1 << 3) +#define LOG_DSAY (1 << 4) +#define LOG_PDA (1 << 5) +#define LOG_CHAT (1 << 6) +#define LOG_COMMENT (1 << 7) +#define LOG_TELECOMMS (1 << 8) +#define LOG_OOC (1 << 9) +#define LOG_ADMIN (1 << 10) +#define LOG_OWNERSHIP (1 << 11) +#define LOG_GAME (1 << 12) +#define LOG_ADMIN_PRIVATE (1 << 13) +#define LOG_ASAY (1 << 14) +#define LOG_MECHA (1 << 15) +#define LOG_VIRUS (1 << 16) +#define LOG_SHUTTLE (1 << 17) +#define LOG_ECON (1 << 18) +#define LOG_VICTIM (1 << 19) +#define LOG_RADIO_EMOTE (1 << 20) +#define LOG_SPEECH_INDICATORS (1 << 21) +#define LOG_TRANSPORT (1 << 22) + +//Yogger's Loggers +#define LOG_NTSL (1 << 23) +#define LOG_CLONING (1 << 24) //Individual logging panel pages #define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK) @@ -51,11 +59,124 @@ #define INDIVIDUAL_COMMS_LOG (LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS) #define INDIVIDUAL_OOC_LOG (LOG_OOC | LOG_ADMIN) #define INDIVIDUAL_OWNERSHIP_LOG (LOG_OWNERSHIP) -#define INDIVIDUAL_SHOW_ALL_LOG (LOG_ATTACK | LOG_SAY | LOG_WHISPER | LOG_EMOTE | LOG_DSAY | LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS | LOG_NTSL | LOG_OOC | LOG_ADMIN | LOG_OWNERSHIP | LOG_GAME) +#define INDIVIDUAL_SHOW_ALL_LOG (LOG_ATTACK | LOG_SAY | LOG_WHISPER | LOG_EMOTE | LOG_RADIO_EMOTE | LOG_DSAY | LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS | LOG_OOC | LOG_ADMIN | LOG_OWNERSHIP | LOG_GAME | LOG_ADMIN_PRIVATE | LOG_ASAY | LOG_MECHA | LOG_VIRUS | LOG_SHUTTLE | LOG_ECON | LOG_VICTIM | LOG_SPEECH_INDICATORS) #define LOGSRC_CLIENT "Client" +#define LOGSRC_CKEY "Ckey" #define LOGSRC_MOB "Mob" +// Log header keys +#define LOG_HEADER_CATEGORY "cat" +#define LOG_HEADER_CATEGORY_LIST "cat-list" +#define LOG_HEADER_INIT_TIMESTAMP "ts" +#define LOG_HEADER_ROUND_ID "round-id" +#define LOG_HEADER_SECRET "secret" + +// Log json keys +#define LOG_JSON_CATEGORY "cat" +#define LOG_JSON_ENTRIES "entries" +#define LOG_JSON_LOGGING_START "log-start" + +// Log entry keys +#define LOG_ENTRY_KEY_TIMESTAMP "ts" +#define LOG_ENTRY_KEY_CATEGORY "cat" +#define LOG_ENTRY_KEY_MESSAGE "msg" +#define LOG_ENTRY_KEY_DATA "data" +#define LOG_ENTRY_KEY_WORLD_STATE "w-state" +#define LOG_ENTRY_KEY_SEMVER_STORE "s-store" +#define LOG_ENTRY_KEY_ID "id" +#define LOG_ENTRY_KEY_SCHEMA_VERSION "s-ver" + +// Internal categories +#define LOG_CATEGORY_INTERNAL_CATEGORY_NOT_FOUND "internal-category-not-found" +#define LOG_CATEGORY_INTERNAL_ERROR "internal-error" + +// Misc categories +#define LOG_CATEGORY_ATTACK "attack" +#define LOG_CATEGORY_CONFIG "config" +#define LOG_CATEGORY_DYNAMIC "dynamic" +#define LOG_CATEGORY_ECONOMY "economy" +#define LOG_CATEGORY_FILTER "filter" +#define LOG_CATEGORY_MANIFEST "manifest" +#define LOG_CATEGORY_MECHA "mecha" +#define LOG_CATEGORY_PAPER "paper" +#define LOG_CATEGORY_QDEL "qdel" +#define LOG_CATEGORY_RUNTIME "runtime" +#define LOG_CATEGORY_SHUTTLE "shuttle" +#define LOG_CATEGORY_SILICON "silicon" +#define LOG_CATEGORY_SILO "silo" +#define LOG_CATEGORY_SIGNAL "signal" +#define LOG_CATEGORY_SPEECH_INDICATOR "speech-indiciator" +// Leave the underscore, it's there for backwards compatibility reasons +#define LOG_CATEGORY_SUSPICIOUS_LOGIN "suspicious_logins" +#define LOG_CATEGORY_TARGET_ZONE_SWITCH "target-zone-switch" +#define LOG_CATEGORY_TELECOMMS "telecomms" +#define LOG_CATEGORY_TOOL "tool" +#define LOG_CATEGORY_TRANSPORT "transport" +#define LOG_CATEGORY_VIRUS "virus" + +// Admin categories +#define LOG_CATEGORY_ADMIN "admin" +#define LOG_CATEGORY_ADMIN_CIRCUIT "admin-circuit" +#define LOG_CATEGORY_ADMIN_DSAY "admin-dsay" + +// Admin private categories +#define LOG_CATEGORY_ADMIN_PRIVATE "adminprivate" +#define LOG_CATEGORY_ADMIN_PRIVATE_ASAY "adminprivate-asay" + +// Debug categories +#define LOG_CATEGORY_DEBUG "debug" +#define LOG_CATEGORY_DEBUG_ASSET "debug-asset" +#define LOG_CATEGORY_DEBUG_JOB "debug-job" +#define LOG_CATEGORY_DEBUG_LUA "debug-lua" +#define LOG_CATEGORY_DEBUG_MAPPING "debug-mapping" +#define LOG_CATEGORY_DEBUG_MOBTAG "debug-mobtag" +#define LOG_CATEGORY_DEBUG_SQL "debug-sql" + +// Compatibility categories, for when stuff is changed and you need existing functionality to work +#define LOG_CATEGORY_COMPAT_GAME "game-compat" + +// Game categories +#define LOG_CATEGORY_GAME "game" +#define LOG_CATEGORY_GAME_ACCESS "game-access" +#define LOG_CATEGORY_GAME_EMOTE "game-emote" +#define LOG_CATEGORY_GAME_INTERNET_REQUEST "game-internet-request" +#define LOG_CATEGORY_GAME_OOC "game-ooc" +#define LOG_CATEGORY_GAME_PRAYER "game-prayer" +#define LOG_CATEGORY_GAME_RADIO_EMOTE "game-radio-emote" +#define LOG_CATEGORY_GAME_SAY "game-say" +#define LOG_CATEGORY_GAME_TOPIC "game-topic" +#define LOG_CATEGORY_GAME_TRAITOR "game-traitor" +#define LOG_CATEGORY_GAME_VOTE "game-vote" +#define LOG_CATEGORY_GAME_WHISPER "game-whisper" + +// HREF categories +#define LOG_CATEGORY_HREF "href" +#define LOG_CATEGORY_HREF_TGUI "href-tgui" + +// Uplink categories +#define LOG_CATEGORY_UPLINK "uplink" +#define LOG_CATEGORY_UPLINK_CHANGELING "uplink-changeling" +#define LOG_CATEGORY_UPLINK_HERETIC "uplink-heretic" +#define LOG_CATEGORY_UPLINK_MALF "uplink-malf" +#define LOG_CATEGORY_UPLINK_SPELL "uplink-spell" + +// PDA categories +#define LOG_CATEGORY_PDA "pda" +#define LOG_CATEGORY_PDA_CHAT "pda-chat" +#define LOG_CATEGORY_PDA_COMMENT "pda-comment" + +// Flags that apply to the entry_flags var on logging categories +// These effect how entry datums process the inputs passed into them +/// Enables data list usage for readable log entries +/// You'll likely want to disable internal formatting to make this work properly +#define ENTRY_USE_DATA_W_READABLE (1<<0) + +#define SCHEMA_VERSION "schema-version" + +// Default log schema version +#define LOG_CATEGORY_SCHEMA_VERSION_NOT_SET "0.0.1" + //wrapper macros for easier grepping #define DIRECT_OUTPUT(A, B) A << B #define DIRECT_INPUT(A, B) A >> B diff --git a/code/__DEFINES/multiz.dm b/code/__DEFINES/multiz.dm index 9d167495fa88..8574b9628a6e 100644 --- a/code/__DEFINES/multiz.dm +++ b/code/__DEFINES/multiz.dm @@ -1,4 +1,13 @@ /// Attempt to get the turf below the provided one according to Z traits -#define GET_TURF_BELOW(turf) ((!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_DOWN]) ? null : get_step((turf), DOWN)) +#define GET_TURF_BELOW(turf) ( \ + (turf.turf_flags & RESERVATION_TURF) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_below(turf) : \ + (!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_DOWN]) ? null : get_step((turf), DOWN)) /// Attempt to get the turf above the provided one according to Z traits -#define GET_TURF_ABOVE(turf) ((!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_UP]) ? null : get_step((turf), UP)) +#define GET_TURF_ABOVE(turf) ( \ + (turf.turf_flags & RESERVATION_TURF) ? SSmapping.get_reservation_from_turf(turf)?.get_turf_above(turf) : \ + (!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_UP]) ? null : get_step((turf), UP)) + +/// Attempt to get the turf below the provided one according to Z traits +//#define GET_TURF_BELOW(turf) ((!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_DOWN]) ? null : get_step((turf), DOWN)) +/// Attempt to get the turf above the provided one according to Z traits +//#define GET_TURF_ABOVE(turf) ((!(turf) || !length(SSmapping.multiz_levels) || !SSmapping.multiz_levels[(turf).z][Z_LEVEL_UP]) ? null : get_step((turf), UP)) diff --git a/code/__HELPERS/logging/_logging.dm b/code/__HELPERS/logging/_logging.dm index be71df957ae3..203f7145731e 100644 --- a/code/__HELPERS/logging/_logging.dm +++ b/code/__HELPERS/logging/_logging.dm @@ -364,14 +364,8 @@ log_comment(log_text) if(LOG_TELECOMMS) log_telecomms(log_text) - if(LOG_NTSL) - log_ntsl(log_text) if(LOG_OOC) log_ooc(log_text) - if(LOG_LOOC) // yogs - LOOC log - log_looc(log_text) // yogs - LOOC log - if(LOG_DONATOR) // yogs - Donator log - log_donator(log_text) // yogs - Donator log if(LOG_ADMIN) log_admin(log_text) if(LOG_ADMIN_PRIVATE) @@ -384,6 +378,14 @@ log_game(log_text) if(LOG_MECHA) log_mecha(log_text) + if(LOG_SHUTTLE) + log_shuttle(log_text) + if(LOG_NTSL) // yogs - NTSL log + log_ntsl(log_text) + if(LOG_LOOC) // yogs - LOOC log + log_looc(log_text) // yogs - LOOC log + if(LOG_DONATOR) // yogs - Donator log + log_donator(log_text) // yogs - Donator log else stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).") log_game(log_text) diff --git a/code/__HELPERS/logging/shuttle.dm b/code/__HELPERS/logging/shuttle.dm new file mode 100644 index 000000000000..4c3cc29ff30e --- /dev/null +++ b/code/__HELPERS/logging/shuttle.dm @@ -0,0 +1,3 @@ +/// Logging for shuttle actions +/proc/log_shuttle(text) + WRITE_LOG(GLOB.world_game_log, "SHUTTLE: [text]") diff --git a/code/__HELPERS/string_lists.dm b/code/__HELPERS/string_lists.dm index 99ce28fba1df..9be0a3a7a7c0 100644 --- a/code/__HELPERS/string_lists.dm +++ b/code/__HELPERS/string_lists.dm @@ -20,7 +20,7 @@ GLOBAL_LIST_EMPTY(string_lists) // return values if(length(values) > 10) stack_trace("The baseturfs list of [baseturf_holder] at [baseturf_holder.x], [baseturf_holder.y], [baseturf_holder.x] is [length(values)], it should never be this long, investigate. I've set baseturfs to a flashing wall as a visual queue") - baseturf_holder.ChangeTurf(/turf/closed/indestructible/baseturfs_ded, list(/turf/closed/indestructible/baseturfs_ded), flags = CHANGETURF_FORCEOP) + //baseturf_holder.ChangeTurf(/turf/closed/indestructible/baseturfs_ded, list(/turf/closed/indestructible/baseturfs_ded), flags = CHANGETURF_FORCEOP) return string_list(list(/turf/closed/indestructible/baseturfs_ded)) //I want this reported god damn it return string_list(values) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index f3722cbd26e3..d036b262f9c3 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -32,7 +32,7 @@ // 2 for preloading absolutely everything; #ifdef LOWMEMORYMODE -#define FORCE_MAP "_maps/runtimestation.json" +#define FORCE_MAP "runtimestation" #define FORCE_MAP_DIRECTORY "_maps" #endif diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index b28143130361..9456aca25ba9 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -1,3 +1,4 @@ +// See initialization order in /code/game/world.dm GLOBAL_REAL(config, /datum/controller/configuration) GLOBAL_DATUM(revdata, /datum/getrev) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index f74abfebfac9..05ab047dc869 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -5,7 +5,6 @@ GLOBAL_LIST_EMPTY(mechas_list) //list of all mechs. Used by hostile m GLOBAL_LIST_EMPTY(shuttle_caller_list) //list of all communication consoles and AIs, for automatic shuttle calls when there are none. GLOBAL_LIST_EMPTY(machines) //NOTE: this is a list of ALL machines now. The processing machines list is SSmachine.processing ! GLOBAL_LIST_EMPTY(lights) //list of all light bulbs -GLOBAL_LIST_EMPTY(navigation_computers) //list of all /obj/machinery/computer/camera_advanced/shuttle_docker GLOBAL_LIST_EMPTY(syndicate_shuttle_boards) //important to keep track of for managing nukeops war declarations. GLOBAL_LIST_EMPTY(navbeacons) //list of all bot nagivation beacons, used for patrolling. GLOBAL_LIST_EMPTY(teleportbeacons) //list of all tracking beacons used by teleporters diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index df1098fb86e7..77bf8d822173 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -20,7 +20,8 @@ var/motd var/policy - + + /// If the configuration is loaded var/load_complete = FALSE /datum/controller/configuration/proc/admin_reload() diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 476b3510839d..aeb1b8f3a445 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -297,7 +297,7 @@ /datum/config_entry/flag/maprotation -/datum/config_entry/number/maprotatechancedelta +/datum/config_entry/number/maprotationchancedelta config_entry_value = 0.75 min_val = 0 max_val = 1 diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm index 461fc395dae7..da3f04dcb275 100644 --- a/code/controllers/subsystem/machines.dm +++ b/code/controllers/subsystem/machines.dm @@ -3,27 +3,71 @@ SUBSYSTEM_DEF(machines) init_order = INIT_ORDER_MACHINES flags = SS_KEEP_TIMING wait = 2 SECONDS + + /// Assosciative list of all machines that exist. + VAR_PRIVATE/list/machines_by_type = list() + /// All machines, not just those that are processing. + VAR_PRIVATE/list/all_machines = list() + var/list/processing = list() var/list/currentrun = list() + ///List of all powernets on the server. var/list/powernets = list() - /// Assosciative list of all machines that exist. - VAR_PRIVATE/list/machines_by_type = list() /datum/controller/subsystem/machines/Initialize() makepowernets() fire() return SS_INIT_SUCCESS +/// Registers a machine with the machine subsystem; should only be called by the machine itself during its creation. +/datum/controller/subsystem/machines/proc/register_machine(obj/machinery/machine) + LAZYADD(machines_by_type[machine.type], machine) + all_machines |= machine + +/// Removes a machine from the machine subsystem; should only be called by the machine itself inside Destroy. +/datum/controller/subsystem/machines/proc/unregister_machine(obj/machinery/machine) + var/list/existing = machines_by_type[machine.type] + existing -= machine + if(!length(existing)) + machines_by_type -= machine.type + all_machines -= machine + +/// Gets a list of all machines that are either the passed type or a subtype. +/datum/controller/subsystem/machines/proc/get_machines_by_type_and_subtypes(obj/machinery/machine_type) + if(!ispath(machine_type)) + machine_type = machine_type.type + if(!ispath(machine_type, /obj/machinery)) + CRASH("called get_machines_by_type_and_subtypes with a non-machine type [machine_type]") + var/list/machines = list() + for(var/next_type in typesof(machine_type)) + var/list/found_machines = machines_by_type[next_type] + if(found_machines) + machines += found_machines + return machines + +/// Gets a list of all machines that are the exact passed type. +/datum/controller/subsystem/machines/proc/get_machines_by_type(obj/machinery/machine_type) + if(!ispath(machine_type)) + machine_type = machine_type.type + if(!ispath(machine_type, /obj/machinery)) + CRASH("called get_machines_by_type with a non-machine type [machine_type]") + + var/list/machines = machines_by_type[machine_type] + return machines?.Copy() || list() + +/datum/controller/subsystem/machines/proc/get_all_machines() + return all_machines.Copy() + /datum/controller/subsystem/machines/proc/makepowernets() - for(var/datum/powernet/PN in powernets) - qdel(PN) + for(var/datum/powernet/power_network as anything in powernets) + qdel(power_network) powernets.Cut() - for(var/obj/structure/cable/PC in GLOB.cable_list) - if(!PC.powernet) - var/datum/powernet/NewPN = new(PC.loc.z) - NewPN.add_cable(PC) - propagate_network(PC,PC.powernet) + for(var/obj/structure/cable/power_cable as anything in GLOB.cable_list) + if(!power_cable.powernet) + var/datum/powernet/new_powernet = new() + new_powernet.add_cable(power_cable) + propagate_network(power_cable, power_cable.powernet) /datum/controller/subsystem/machines/stat_entry(msg) msg = "M:[length(processing)]|PN:[length(powernets)]" @@ -34,10 +78,10 @@ SUBSYSTEM_DEF(machines) .["machines"] = length(processing) .["powernets"] = length(powernets) -/datum/controller/subsystem/machines/fire(resumed = 0) +/datum/controller/subsystem/machines/fire(resumed = FALSE) if (!resumed) - for(var/datum/powernet/Powernet in powernets) - Powernet.reset() //reset the power state. + for(var/datum/powernet/powernet as anything in powernets) + powernet.reset() //reset the power state. src.currentrun = processing.Copy() //cache for sanic speed (lists are references anyways) @@ -46,13 +90,9 @@ SUBSYSTEM_DEF(machines) while(currentrun.len) var/obj/machinery/thing = currentrun[currentrun.len] currentrun.len-- - if(!QDELETED(thing) && thing.process(wait * 0.1) != PROCESS_KILL) - if(thing.use_power) - thing.auto_use_power() //add back the power state - else + if(QDELETED(thing) || thing.process(wait * 0.1) == PROCESS_KILL) processing -= thing - if (!QDELETED(thing)) - thing.datum_flags &= ~DF_ISPROCESSING + thing.datum_flags &= ~DF_ISPROCESSING if (MC_TICK_CHECK) return @@ -65,20 +105,11 @@ SUBSYSTEM_DEF(machines) propagate_network(PC,PC.powernet) /datum/controller/subsystem/machines/Recover() - if (istype(SSmachines.processing)) + if(islist(SSmachines.processing)) processing = SSmachines.processing - if (istype(SSmachines.powernets)) + if(islist(SSmachines.powernets)) powernets = SSmachines.powernets - -/// Gets a list of all machines that are either the passed type or a subtype. -/datum/controller/subsystem/machines/proc/get_machines_by_type_and_subtypes(obj/machinery/machine_type) - if(!ispath(machine_type)) - machine_type = machine_type.type - if(!ispath(machine_type, /obj/machinery)) - CRASH("called get_machines_by_type_and_subtypes with a non-machine type [machine_type]") - var/list/machines = list() - for(var/next_type in typesof(machine_type)) - var/list/found_machines = machines_by_type[next_type] - if(found_machines) - machines += found_machines - return machines + if(islist(SSmachines.all_machines)) + all_machines = SSmachines.all_machines + if(islist(SSmachines.machines_by_type)) + machines_by_type = SSmachines.machines_by_type diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index f7bc7edc665c..f3dc0e0d338d 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -102,7 +102,6 @@ SUBSYSTEM_DEF(mapping) /// list of lazy templates that have been loaded var/list/loaded_lazy_templates -//dlete dis once #39770 is resolved /datum/controller/subsystem/mapping/PreInit() ..() #ifdef FORCE_MAP @@ -112,6 +111,7 @@ SUBSYSTEM_DEF(mapping) #endif /datum/controller/subsystem/mapping/Initialize(timeofday) + //HACK_LoadMapConfig() if(initialized) return SS_INIT_SUCCESS if(config.defaulted) @@ -302,7 +302,7 @@ SUBSYSTEM_DEF(mapping) SSshuttle.transit_requesters.Cut() message_admins("Clearing dynamic reservation space.") var/list/obj/docking_port/mobile/in_transit = list() - for(var/i in SSshuttle.transit) + for(var/i in SSshuttle.transit_docking_ports) var/obj/docking_port/stationary/transit/T = i if(!istype(T)) continue @@ -569,13 +569,21 @@ GLOBAL_LIST_EMPTY(the_station_areas) if (. && VM.map_name != config.map_name) to_chat(world, span_boldannounce("Map rotation has chosen [VM.map_name] for next round!")) -/datum/controller/subsystem/mapping/proc/changemap(datum/map_config/VM) - if(!VM.MakeNextMap()) - next_map_config = load_map_config() - message_admins("Failed to set new map with next_map.json for [VM.map_name]! Using default as backup!") +/datum/controller/subsystem/mapping/proc/changemap(datum/map_config/change_to) + if(!change_to.MakeNextMap()) + next_map_config = load_default_map_config() + message_admins("Failed to set new map with next_map.json for [change_to.map_name]! Using default as backup!") return - next_map_config = VM + var/filter_threshold = get_active_player_count(alive_check = FALSE, afk_check = TRUE, human_check = FALSE) + if (change_to.config_min_users > 0 && filter_threshold != 0 && filter_threshold < change_to.config_min_users) + message_admins("[change_to.map_name] was chosen for the next map, despite there being less current players than its set minimum population range!") + log_game("[change_to.map_name] was chosen for the next map, despite there being less current players than its set minimum population range!") + if (change_to.config_max_users > 0 && filter_threshold > change_to.config_max_users) + message_admins("[change_to.map_name] was chosen for the next map, despite there being more current players than its set maximum population range!") + log_game("[change_to.map_name] was chosen for the next map, despite there being more current players than its set maximum population range!") + + next_map_config = change_to return TRUE /datum/controller/subsystem/mapping/proc/preloadTemplates(path = "_maps/templates/") //see master controller setup @@ -643,6 +651,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) var/datum/map_template/shuttle/S = new shuttle_type() if(unbuyable.Find(S.mappath)) S.credit_cost = INFINITY + S.who_can_purchase = null shuttle_templates[S.shuttle_id] = S map_templates[S.shuttle_id] = S diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 951abc6c5269..477b0d4a7970 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -14,55 +14,114 @@ SUBSYSTEM_DEF(shuttle) runlevels = RUNLEVEL_SETUP | RUNLEVEL_GAME loading_points = 4.9 SECONDS // Yogs -- loading times - - var/list/mobile = list() + + /// A list of all the mobile docking ports. + var/list/mobile_docking_ports = list() /// A list of all the stationary docking ports. - var/list/stationary = list() - var/list/beacons = list() - var/list/transit = list() - + var/list/stationary_docking_ports = list() + /// A list of all the beacons that can be docked to. + var/list/beacon_list = list() + /// A list of all the transit docking ports. + var/list/transit_docking_ports = list() + + /// Now it's only for ID generation in /obj/docking_port/mobile/register() + var/list/assoc_mobile = list() + /// Now it's only for ID generation in /obj/docking_port/stationary/register() + var/list/assoc_stationary = list() + + /// A list of all the mobile docking ports currently requesting a spot in hyperspace. var/list/transit_requesters = list() + /// An associative list of the mobile docking ports that have failed a transit request, with the amount of times they've actually failed that transit request, up to MAX_TRANSIT_REQUEST_RETRIES var/list/transit_request_failures = list() - /// How many turfs our shuttles are currently utilizing in reservation space var/transit_utilized = 0 - //emergency shuttle stuff + /** + * Emergency shuttle stuff + */ + + /// The mobile docking port of the emergency shuttle. var/obj/docking_port/mobile/emergency/emergency + /// The mobile docking port of the arrivals shuttle. var/obj/docking_port/mobile/arrivals/arrivals + /// The mobile docking port of the backup emergency shuttle. var/obj/docking_port/mobile/emergency/backup/backup_shuttle - var/emergencyCallTime = 6000 //time taken for emergency shuttle to reach the station when called (in deciseconds) - var/emergencyDockTime = 1800 //time taken for emergency shuttle to leave again once it has docked (in deciseconds) - var/emergencyEscapeTime = 1200 //time taken for emergency shuttle to reach a safe distance after leaving station (in deciseconds) - var/area/emergencyLastCallLoc - var/emergencyCallAmount = 0 //how many times the escape shuttle was called - var/emergencyNoEscape - var/emergencyNoRecall = FALSE - var/list/hostileEnvironments = list() //Things blocking escape shuttle from leaving - var/list/tradeBlockade = list() //Things blocking cargo from leaving. - var/supplyBlocked = FALSE - - //supply shuttle stuff + /// Time taken for emergency shuttle to reach the station when called (in deciseconds). + var/emergency_call_time = 10 MINUTES + /// Time taken for emergency shuttle to leave again once it has docked (in deciseconds). + var/emergency_dock_time = 3 MINUTES + /// Time taken for emergency shuttle to reach a safe distance after leaving station (in deciseconds). + var/emergency_escape_time = 2 MINUTES + /// Where was the emergency shuttle last called from? + var/area/emergency_last_call_loc + /// How many times was the escape shuttle called? + var/emergencyCallAmount = 0 + /// Is the departure of the shuttle currently prevented? FALSE for no, any other number for yes (thanks shuttle code). + var/emergency_no_escape = FALSE + /// Do we prevent the recall of the shuttle? + var/emergency_no_recall = FALSE + /// Did admins force-prevent the recall of the shuttle? + var/admin_emergency_no_recall = FALSE + + /// Things blocking escape shuttle from leaving. + var/list/hostile_environments = list() + + /** + * Supply shuttle stuff + */ + + /// The current cargo shuttle's mobile docking port. var/obj/docking_port/mobile/supply/supply - var/ordernum = 1 //order number given to next order - var/points = 5000 //number of trade-points we have - var/centcom_message = "" //Remarks from CentCom on how well you checked the last order. - var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentCom, associated with their potencies - + /// Order number given to next order. + var/order_number = 1 + /// Number of trade-points we have (basically money). + var/points = 5000 + /// Remarks from CentCom on how well you checked the last order. + var/centcom_message = "" + /// Typepaths for unusual plants we've already sent CentCom, associated with their potencies. + var/list/discovered_plants = list() + + /// Things blocking the cargo shuttle from leaving. + var/list/trade_blockade = list() + /// Is the cargo shuttle currently blocked from leaving? + var/supply_blocked = FALSE + + /// All of the possible supply packs that can be purchased by cargo. var/list/supply_packs = list() - var/list/shoppinglist = list() - var/list/requestlist = list() - var/list/orderhistory = list() - var/list/hidden_shuttle_turfs = list() //all turfs hidden from navigation computers associated with a list containing the image hiding them and the type of the turf they are pretending to be - var/list/hidden_shuttle_turf_images = list() //only the images from the above list + /// Queued supplies to be purchased for the chef. + var/list/chef_groceries = list() - var/datum/round_event/shuttle_loan/shuttle_loan + /// Queued supply packs to be purchased. + var/list/shopping_list = list() + + /// Wishlist items made by crew for cargo to purchase at their leisure. + var/list/request_list = list() + + var/list/order_history = list() - var/shuttle_purchased = SHUTTLEPURCHASE_PURCHASABLE //If the station has purchased a replacement escape shuttle this round - var/emag_shuttle_purchased = FALSE //If the traitors have purchased a replacement escape shuttle this round + /// A list of job accesses that are able to purchase any shuttles. + var/list/has_purchase_shuttle_access - var/lockdown = FALSE //disallow transit after nuke goes off + /// All turfs hidden from navigation computers associated with a list containing the image hiding them and the type of the turf they are pretending to be + var/list/hidden_shuttle_turfs = list() + /// Only the images from the [/datum/controller/subsystem/shuttle/hidden_shuttle_turfs] list. + var/list/hidden_shuttle_turf_images = list() + + /// The current shuttle loan event, if any. + var/datum/round_event/shuttle_loan/shuttle_loan + + /// If the event happens where the crew can purchase shuttle insurance, catastrophe can't run. + var/shuttle_insurance = FALSE + // If the station has purchased a replacement escape shuttle this round. + var/shuttle_purchased = SHUTTLEPURCHASE_PURCHASABLE + /// For keeping track of ingame events that would unlock new shuttles, such as defeating a boss or discovering a secret item. + var/list/shuttle_purchase_requirements_met = list() + // If the traitors have purchased a replacement escape shuttle this round + var/emag_shuttle_purchased = FALSE + + //disallow transit after nuke goes off + var/lockdown = FALSE /// The currently selected shuttle map_template in the shuttle manipulator's template viewer. var/datum/map_template/shuttle/selected @@ -83,7 +142,7 @@ SUBSYSTEM_DEF(shuttle) var/supermatter_cascade = FALSE /datum/controller/subsystem/shuttle/Initialize(timeofday) - ordernum = rand(1, 9000) + order_number = rand(1, 9000) for(var/pack in subtypesof(/datum/supply_pack)) var/datum/supply_pack/P = new pack() @@ -91,7 +150,8 @@ SUBSYSTEM_DEF(shuttle) continue supply_packs[P.type] = P - setup_shuttles(stationary) + setup_shuttles(stationary_docking_ports) + has_purchase_shuttle_access = init_has_purchase_shuttle_access() if(!arrivals) WARNING("No /obj/docking_port/mobile/arrivals placed on the map!") @@ -103,19 +163,19 @@ SUBSYSTEM_DEF(shuttle) WARNING("No /obj/docking_port/mobile/supply placed on the map!") return SS_INIT_SUCCESS -/datum/controller/subsystem/shuttle/proc/setup_shuttles(list/ports) - for(var/obj/docking_port/stationary/port as anything in ports) +/datum/controller/subsystem/shuttle/proc/setup_shuttles(list/stationary) + for(var/obj/docking_port/stationary/port as anything in stationary) port.load_roundstart() CHECK_TICK /datum/controller/subsystem/shuttle/fire() - for(var/thing in mobile) + for(var/thing in mobile_docking_ports) if(!thing) - mobile.Remove(thing) + mobile_docking_ports.Remove(thing) continue var/obj/docking_port/mobile/port = thing port.check() - for(var/thing in transit) + for(var/thing in transit_docking_ports) var/obj/docking_port/stationary/transit/T = thing if(!T.owner) qdel(T, force=TRUE) @@ -154,7 +214,7 @@ SUBSYSTEM_DEF(shuttle) break /datum/controller/subsystem/shuttle/proc/CheckAutoEvac() - if(emergencyNoEscape || emergencyNoRecall || !emergency || !SSticker.HasRoundStarted()) + if(emergency_no_escape || admin_emergency_no_recall || emergency_no_recall || !emergency || !SSticker.HasRoundStarted()) return var/threshold = CONFIG_GET(number/emergency_shuttle_autocall_threshold) @@ -168,32 +228,36 @@ SUBSYSTEM_DEF(shuttle) ++alive var/total = GLOB.joined_player_list.len + if(total <= 0) + return //no players no autoevac if(alive / total <= threshold) var/msg = "Automatically dispatching shuttle due to crew death." message_admins(msg) log_game("[msg] Alive: [alive], Roundstart: [total], Threshold: [threshold]") - emergencyNoRecall = TRUE + emergency_no_recall = TRUE priority_announce("Catastrophic casualties detected: crisis shuttle protocols activated - jamming recall signals across all frequencies.") - if(emergency.timeLeft(1) > emergencyCallTime * 0.4) + if(emergency.timeLeft(1) > emergency_no_recall * 0.4) emergency.request(null, set_coefficient = 0.4) /datum/controller/subsystem/shuttle/proc/block_recall(lockout_timer) - emergencyNoRecall = TRUE + if(isnull(lockout_timer)) + CRASH("Emergency shuttle block was called, but missing a value for the lockout duration") + emergency_no_recall = TRUE addtimer(CALLBACK(src, PROC_REF(unblock_recall)), lockout_timer) /datum/controller/subsystem/shuttle/proc/unblock_recall() - emergencyNoRecall = FALSE + emergency_no_recall = FALSE /datum/controller/subsystem/shuttle/proc/getShuttle(id) - for(var/obj/docking_port/mobile/M in mobile) - if(M.id == id) + for(var/obj/docking_port/mobile/M in mobile_docking_ports) + if(M.shuttle_id == id) return M WARNING("couldn't find shuttle with id: [id]") /datum/controller/subsystem/shuttle/proc/getDock(id) - for(var/obj/docking_port/stationary/S in stationary) - if(S.id == id) + for(var/obj/docking_port/stationary/S in stationary_docking_ports) + if(S.shuttle_id == id) return S WARNING("couldn't find dock with id: [id]") @@ -330,18 +394,18 @@ SUBSYSTEM_DEF(shuttle) return 1 /datum/controller/subsystem/shuttle/proc/canRecall() - if(!emergency || emergency.mode != SHUTTLE_CALL || emergencyNoRecall || SSticker.mode.name == "meteor") + if(!emergency || emergency.mode != SHUTTLE_CALL || admin_emergency_no_recall || emergency_no_recall) return var/security_num = seclevel2num(get_security_level()) switch(security_num) if(SEC_LEVEL_GREEN) - if(emergency.timeLeft(1) < emergencyCallTime) + if(emergency.timeLeft(1) < emergency_call_time) return if(SEC_LEVEL_BLUE) - if(emergency.timeLeft(1) < emergencyCallTime * 0.5) + if(emergency.timeLeft(1) < emergency_call_time * 0.5) return else - if(emergency.timeLeft(1) < emergencyCallTime * 0.25) + if(emergency.timeLeft(1) < emergency_call_time * 0.25) return return 1 @@ -375,53 +439,53 @@ SUBSYSTEM_DEF(shuttle) message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.") /datum/controller/subsystem/shuttle/proc/registerHostileEnvironment(datum/bad) - hostileEnvironments[bad] = TRUE + hostile_environments[bad] = TRUE checkHostileEnvironment() /datum/controller/subsystem/shuttle/proc/clearHostileEnvironment(datum/bad) - hostileEnvironments -= bad + hostile_environments -= bad checkHostileEnvironment() /datum/controller/subsystem/shuttle/proc/registerTradeBlockade(datum/bad) - tradeBlockade[bad] = TRUE + trade_blockade[bad] = TRUE checkTradeBlockade() /datum/controller/subsystem/shuttle/proc/clearTradeBlockade(datum/bad) - tradeBlockade -= bad + trade_blockade -= bad checkTradeBlockade() /datum/controller/subsystem/shuttle/proc/checkTradeBlockade() - for(var/datum/d in tradeBlockade) + for(var/datum/d in trade_blockade) if(!istype(d) || QDELETED(d)) - tradeBlockade -= d - supplyBlocked = tradeBlockade.len + trade_blockade -= d + supply_blocked = trade_blockade.len - if(supplyBlocked && (supply.mode == SHUTTLE_IGNITING)) + if(supply_blocked && (supply.mode == SHUTTLE_IGNITING)) supply.mode = SHUTTLE_STRANDED supply.timer = null //Make all cargo consoles speak up - if(!supplyBlocked && (supply.mode == SHUTTLE_STRANDED)) + if(!supply_blocked && (supply.mode == SHUTTLE_STRANDED)) supply.mode = SHUTTLE_DOCKED //Make all cargo consoles speak up /datum/controller/subsystem/shuttle/proc/checkHostileEnvironment() - for(var/datum/d in hostileEnvironments) - if(!istype(d) || QDELETED(d)) - hostileEnvironments -= d - emergencyNoEscape = hostileEnvironments.len + for(var/datum/hostile_environment_source in hostile_environments) + if(!istype(hostile_environment_source) || QDELETED(hostile_environment_source)) + hostile_environments -= hostile_environment_source + emergency_no_escape = hostile_environments.len - if(emergencyNoEscape && (emergency.mode == SHUTTLE_IGNITING)) + if(emergency_no_escape && (emergency.mode == SHUTTLE_IGNITING)) emergency.mode = SHUTTLE_STRANDED emergency.timer = null emergency.sound_played = FALSE priority_announce("Hostile environment detected. \ Departure has been postponed indefinitely pending \ conflict resolution.", null, 'sound/misc/notice1.ogg', "Priority") - if(!emergencyNoEscape && (emergency.mode == SHUTTLE_STRANDED)) + if(!emergency_no_escape && (emergency.mode == SHUTTLE_STRANDED)) emergency.mode = SHUTTLE_DOCKED - emergency.setTimer(emergencyDockTime) + emergency.setTimer(emergency_dock_time) priority_announce("Hostile environment resolved. \ You have 3 minutes to board the Emergency Shuttle.", null, ANNOUNCER_SHUTTLEDOCK, "Priority") @@ -433,7 +497,7 @@ SUBSYSTEM_DEF(shuttle) return 1 var/obj/docking_port/stationary/dockedAt = M.get_docked() var/destination = dockHome - if(dockedAt && dockedAt.id == dockHome) + if(dockedAt && dockedAt.shuttle_id == dockHome) destination = dockAway if(timed) if(M.request(getDock(destination))) @@ -444,19 +508,27 @@ SUBSYSTEM_DEF(shuttle) return 0 //dock successful -/datum/controller/subsystem/shuttle/proc/moveShuttle(shuttleId, dockId, timed) - var/obj/docking_port/mobile/M = getShuttle(shuttleId) - var/obj/docking_port/stationary/D = getDock(dockId) +/** + * Moves a shuttle to a new location + * + * Arguments: + * * shuttle_id - The ID of the shuttle (mobile docking port) to move + * * dock_id - The ID of the destination (stationary docking port) to move to + * * timed - If true, have the shuttle follow normal spool-up, jump, dock process. If false, immediately move to the new location. + */ +/datum/controller/subsystem/shuttle/proc/moveShuttle(shuttle_id, dock_id, timed) + var/obj/docking_port/mobile/shuttle_port = getShuttle(shuttle_id) + var/obj/docking_port/stationary/docking_target = getDock(dock_id) - if(!M) - return 1 + if(!shuttle_port) + return DOCKING_NULL_SOURCE if(timed) - if(M.request(D)) - return 2 + if(shuttle_port.request(docking_target)) + return DOCKING_IMMOBILIZED else - if(M.initiate_docking(D) != DOCKING_SUCCESS) - return 2 - return 0 //dock successful + if(shuttle_port.initiate_docking(docking_target) != DOCKING_SUCCESS) + return DOCKING_IMMOBILIZED + return DOCKING_SUCCESS //dock successful /datum/controller/subsystem/shuttle/proc/request_transit_dock(obj/docking_port/mobile/M) if(!istype(M)) @@ -552,7 +624,7 @@ SUBSYSTEM_DEF(shuttle) A.contained_turfs = proposal.reserved_turfs var/obj/docking_port/stationary/transit/new_transit_dock = new(midpoint) new_transit_dock.reserved_area = proposal - new_transit_dock.name = "Transit for [M.id]/[M.name]" + new_transit_dock.name = "Transit for [M.shuttle_id]/[M.name]" new_transit_dock.owner = M new_transit_dock.assigned_area = A @@ -572,12 +644,13 @@ SUBSYSTEM_DEF(shuttle) transit_utilized -= (source.width + 2) * (source.height + 2) /datum/controller/subsystem/shuttle/Recover() - if (istype(SSshuttle.mobile)) - mobile = SSshuttle.mobile - if (istype(SSshuttle.stationary)) - stationary = SSshuttle.stationary - if (istype(SSshuttle.transit)) - transit = SSshuttle.transit + initialized = SSshuttle.initialized + if (istype(SSshuttle.mobile_docking_ports)) + mobile_docking_ports = SSshuttle.mobile_docking_ports + if (istype(SSshuttle.stationary_docking_ports)) + stationary_docking_ports = SSshuttle.stationary_docking_ports + if (istype(SSshuttle.transit_docking_ports)) + transit_docking_ports = SSshuttle.transit_docking_ports if (istype(SSshuttle.transit_requesters)) transit_requesters = SSshuttle.transit_requesters if (istype(SSshuttle.transit_request_failures)) @@ -590,33 +663,39 @@ SUBSYSTEM_DEF(shuttle) if (istype(SSshuttle.backup_shuttle)) backup_shuttle = SSshuttle.backup_shuttle - if (istype(SSshuttle.emergencyLastCallLoc)) - emergencyLastCallLoc = SSshuttle.emergencyLastCallLoc + if (istype(SSshuttle.emergency_last_call_loc)) + emergency_last_call_loc = SSshuttle.emergency_last_call_loc - if (istype(SSshuttle.hostileEnvironments)) - hostileEnvironments = SSshuttle.hostileEnvironments + if (istype(SSshuttle.hostile_environments)) + hostile_environments = SSshuttle.hostile_environments if (istype(SSshuttle.supply)) supply = SSshuttle.supply - if (istype(SSshuttle.discoveredPlants)) - discoveredPlants = SSshuttle.discoveredPlants + if (istype(SSshuttle.discovered_plants)) + discovered_plants = SSshuttle.discovered_plants + + if (istype(SSshuttle.shopping_list)) + shopping_list = SSshuttle.shopping_list + if (istype(SSshuttle.request_list)) + request_list = SSshuttle.request_list + if (istype(SSshuttle.order_history)) + order_history = SSshuttle.order_history + + if (istype(SSshuttle.shuttle_loan)) + shuttle_loan = SSshuttle.shuttle_loan - if (istype(SSshuttle.shoppinglist)) - shoppinglist = SSshuttle.shoppinglist - if (istype(SSshuttle.requestlist)) - requestlist = SSshuttle.requestlist - if (istype(SSshuttle.orderhistory)) - orderhistory = SSshuttle.orderhistory + if (istype(SSshuttle.shuttle_purchase_requirements_met)) + shuttle_purchase_requirements_met = SSshuttle.shuttle_purchase_requirements_met if (istype(SSshuttle.shuttle_loan)) shuttle_loan = SSshuttle.shuttle_loan var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) centcom_message = SSshuttle.centcom_message - ordernum = SSshuttle.ordernum + order_number = SSshuttle.order_number points = D.account_balance - emergencyNoEscape = SSshuttle.emergencyNoEscape + emergency_no_escape = SSshuttle.emergency_no_escape emergencyCallAmount = SSshuttle.emergencyCallAmount shuttle_purchased = SSshuttle.shuttle_purchased lockdown = SSshuttle.lockdown @@ -634,12 +713,12 @@ SUBSYSTEM_DEF(shuttle) var/area/current = get_area(A) if(istype(current, /area/shuttle) && !istype(current, /area/shuttle/transit)) return TRUE - for(var/obj/docking_port/mobile/M in mobile) + for(var/obj/docking_port/mobile/M in mobile_docking_ports) if(M.is_in_shuttle_bounds(A)) return TRUE /datum/controller/subsystem/shuttle/proc/get_containing_shuttle(atom/A) - var/list/mobile_cache = mobile + var/list/mobile_cache = mobile_docking_ports for(var/i in 1 to mobile_cache.len) var/obj/docking_port/port = mobile_cache[i] if(port.is_in_shuttle_bounds(A)) @@ -647,7 +726,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/get_containing_dock(atom/A) . = list() - var/list/stationary_cache = stationary + var/list/stationary_cache = stationary_docking_ports for(var/i in 1 to stationary_cache.len) var/obj/docking_port/port = stationary_cache[i] if(port.is_in_shuttle_bounds(A)) @@ -655,7 +734,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/get_dock_overlap(x0, y0, x1, y1, z) . = list() - var/list/stationary_cache = stationary + var/list/stationary_cache = stationary_docking_ports for(var/i in 1 to stationary_cache.len) var/obj/docking_port/port = stationary_cache[i] if(!port || port.z != z) @@ -697,9 +776,9 @@ SUBSYSTEM_DEF(shuttle) hidden_shuttle_turf_images -= remove_images hidden_shuttle_turf_images += add_images - for(var/V in GLOB.navigation_computers) - var/obj/machinery/computer/camera_advanced/shuttle_docker/C = V - C.update_hidden_docking_ports(remove_images, add_images) + for(var/obj/machinery/computer/camera_advanced/shuttle_docker/docking_computer \ + as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/computer/camera_advanced/shuttle_docker)) + docking_computer.update_hidden_docking_ports(remove_images, add_images) QDEL_LIST(remove_images) @@ -720,39 +799,42 @@ SUBSYSTEM_DEF(shuttle) QDEL_NULL(preview_reservation) if(!preview_shuttle) - if(load_template(loading_template)) - preview_shuttle.linkup(loading_template, destination_port) + load_template(loading_template) preview_template = loading_template // get the existing shuttle information, if any var/timer = 0 var/mode = SHUTTLE_IDLE - var/obj/docking_port/stationary/D + var/obj/docking_port/stationary/dest_dock if(istype(destination_port)) - D = destination_port - else if(existing_shuttle) + dest_dock = destination_port + else if(existing_shuttle && replace) timer = existing_shuttle.timer mode = existing_shuttle.mode - D = existing_shuttle.get_docked() + dest_dock = existing_shuttle.get_docked() - if(!D) + if(!dest_dock) + dest_dock = generate_transit_dock(preview_shuttle) + + if(!dest_dock) CRASH("No dock found for preview shuttle ([preview_template.name]), aborting.") - var/result = preview_shuttle.canDock(D) + var/result = preview_shuttle.canDock(dest_dock) // truthy value means that it cannot dock for some reason // but we can ignore the someone else docked error because we'll // be moving into their place shortly if((result != SHUTTLE_CAN_DOCK) && (result != SHUTTLE_SOMEONE_ELSE_DOCKED)) - WARNING("Template shuttle [preview_shuttle] cannot dock at [D] ([result]).") - return + CRASH("Template shuttle [preview_shuttle] cannot dock at [dest_dock] ([result]).") - if(existing_shuttle) + if(existing_shuttle && replace) existing_shuttle.jumpToNullSpace() + preview_shuttle.register(replace) var/list/force_memory = preview_shuttle.movement_force preview_shuttle.movement_force = list("KNOCKDOWN" = 0, "THROW" = 0) - preview_shuttle.initiate_docking(D) + preview_shuttle.mode = SHUTTLE_PREARRIVAL//No idle shuttle moving. Transit dock get removed if shuttle moves too long. + preview_shuttle.initiate_docking(dest_dock) preview_shuttle.movement_force = force_memory . = preview_shuttle @@ -762,7 +844,7 @@ SUBSYSTEM_DEF(shuttle) preview_shuttle.timer = timer preview_shuttle.mode = mode - preview_shuttle.register() + preview_shuttle.postregister(replace) // TODO indicate to the user that success happened, rather than just // blanking the modification tab @@ -903,12 +985,12 @@ SUBSYSTEM_DEF(shuttle) // Status panel data["shuttles"] = list() - for(var/i in mobile) + for(var/i in mobile_docking_ports) var/obj/docking_port/mobile/M = i var/timeleft = M.timeLeft(1) var/list/L = list() L["name"] = M.name - L["id"] = M.id + L["id"] = M.shuttle_id L["timer"] = M.timer L["timeleft"] = M.getTimerStr() if (timeleft > 1 HOURS) @@ -947,25 +1029,25 @@ SUBSYSTEM_DEF(shuttle) . = TRUE if("jump_to") if(params["type"] == "mobile") - for(var/i in mobile) + for(var/i in mobile_docking_ports) var/obj/docking_port/mobile/M = i - if(M.id == params["id"]) + if(M.shuttle_id == params["id"]) user.forceMove(get_turf(M)) . = TRUE break if("fly") - for(var/i in mobile) + for(var/i in mobile_docking_ports) var/obj/docking_port/mobile/M = i - if(M.id == params["id"]) + if(M.shuttle_id == params["id"]) . = TRUE M.admin_fly_shuttle(user) break if("fast_travel") - for(var/i in mobile) + for(var/i in mobile_docking_ports) var/obj/docking_port/mobile/M = i - if(M.id == params["id"] && M.timer && M.timeLeft(1) >= 50) + if(M.shuttle_id == params["id"] && M.timer && M.timeLeft(1) >= 50) M.setTimer(50) . = TRUE message_admins("[key_name_admin(usr)] fast travelled [M]") @@ -997,6 +1079,16 @@ SUBSYSTEM_DEF(shuttle) log_admin("[key_name(usr)] loaded [mdp] with the shuttle manipulator.") SSblackbox.record_feedback("text", "shuttle_manipulator", 1, "[mdp.name]") +/datum/controller/subsystem/shuttle/proc/init_has_purchase_shuttle_access() + var/list/has_purchase_shuttle_access = list() + + for (var/shuttle_id in SSmapping.shuttle_templates) + var/datum/map_template/shuttle/shuttle_template = SSmapping.shuttle_templates[shuttle_id] + if (!isnull(shuttle_template.who_can_purchase)) + has_purchase_shuttle_access |= shuttle_template.who_can_purchase + + return has_purchase_shuttle_access + #undef MAX_TRANSIT_REQUEST_RETRIES #undef MAX_TRANSIT_TILE_COUNT #undef SOFT_TRANSIT_RESERVATION_THRESHOLD diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 42c5db7c79ec..819b07a5fd29 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -207,7 +207,6 @@ SUBSYSTEM_DEF(ticker) if(GAME_STATE_PLAYING) mode.process(wait * 0.1) check_queue() - check_maprotate() if(!roundend_check_paused && mode.check_finished(force_ending) || force_ending) current_state = GAME_STATE_FINISHED @@ -215,6 +214,7 @@ SUBSYSTEM_DEF(ticker) toggle_dooc(TRUE) toggle_looc(TRUE) // yogs - turn LOOC on at roundend declare_completion(force_ending) + check_maprotate() Master.SetRunLevel(RUNLEVEL_POSTGAME) @@ -545,17 +545,10 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/check_maprotate() if (!CONFIG_GET(flag/maprotation)) return - if (SSshuttle.emergency && SSshuttle.emergency.mode != SHUTTLE_ESCAPE || SSshuttle.canRecall()) - return - if (maprotatechecked) - return - - maprotatechecked = 1 - //map rotate chance defaults to 75% of the length of the round (in minutes) - if (!prob((world.time/600)*CONFIG_GET(number/maprotatechancedelta))) + if (!prob((world.time/600)*CONFIG_GET(number/maprotationchancedelta))) return - INVOKE_ASYNC(SSmapping, TYPE_PROC_REF(/datum/controller/subsystem/mapping, maprotate)) + INVOKE_ASYNC(SSmapping, TYPE_PROC_REF(/datum/controller/subsystem/mapping/, maprotate)) /datum/controller/subsystem/ticker/proc/HasRoundStarted() return current_state >= GAME_STATE_PLAYING diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index 780109ff0717..32a302b7e0a8 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -11,7 +11,7 @@ SUBSYSTEM_DEF(title) /datum/controller/subsystem/title/Initialize() if(file_path && icon) - return SS_INIT_NO_NEED + return SS_INIT_SUCCESS if(fexists("data/previous_title.dat")) var/previous_path = file2text("data/previous_title.dat") @@ -25,7 +25,7 @@ SUBSYSTEM_DEF(title) for(var/S in provisional_title_screens) var/list/L = splittext(S,"+") - if((L.len == 1 && L[1] != "blank.png")|| (L.len > 1 && ((use_rare_screens && lowertext(L[1]) == "rare") || (lowertext(L[1]) == lowertext(SSmapping.config.map_name))))) + if((L.len == 1 && (L[1] != "exclude" && L[1] != "blank.png"))|| (L.len > 1 && ((use_rare_screens && lowertext(L[1]) == "rare") || (lowertext(L[1]) == lowertext(SSmapping.config.map_name))))) title_screens += S if(length(title_screens)) diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index ffd18e3cc588..c512248ae694 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -73,11 +73,10 @@ else filename = PATH_TO_NEXT_MAP_JSON + if (!config.LoadConfig(filename, error_if_missing)) qdel(config) return load_default_map_config() - if (delete_after) - fdel(filename) return config #define CHECK_EXISTS(X) if(!istext(json[X])) { log_world("[##X] missing from json!"); return; } diff --git a/code/datums/shuttles/_shuttles.dm b/code/datums/shuttles/_shuttles.dm new file mode 100644 index 000000000000..f4e4b688ff68 --- /dev/null +++ b/code/datums/shuttles/_shuttles.dm @@ -0,0 +1,351 @@ +/datum/map_template/shuttle + name = "Base Shuttle Template" + var/prefix = "_maps/shuttles/" + var/suffix + /** + * Port ID is the place this template should be docking at, set on '/obj/docking_port/stationary' + * Because getShuttle() compares port_id to shuttle_id to find an already existing shuttle, + * you should set shuttle_id to be the same as port_id if you want them to be replacable. + */ + var/port_id + /// ID of the shuttle, make sure it matches port_id if necessary. + var/shuttle_id + /// Information to display on communication console about the shuttle + var/description + /// The recommended occupancy limit for the shuttle (count chairs, beds, and benches then round to 5) + var/occupancy_limit + /// Description of the prerequisition that has to be achieved for the shuttle to be purchased + var/prerequisites + /// Shuttle warnings and hazards to the admin who spawns the shuttle + var/admin_notes + /// How much does this shuttle cost the cargo budget to purchase? Put in terms of CARGO_CRATE_VALUE to properly scale the cost with the current balance of cargo's income. + var/credit_cost = INFINITY + /// What job accesses can buy this shuttle? If null, this shuttle cannot be bought. + var/list/who_can_purchase = list(ACCESS_CAPTAIN) + /// Whether or not this shuttle is locked to emags only. + var/emag_only = FALSE + /// If set, overrides default movement_force on shuttle + var/list/movement_force + + var/port_x_offset + var/port_y_offset + var/extra_desc = "" + +/datum/map_template/shuttle/proc/prerequisites_met() + return TRUE + +/datum/map_template/shuttle/New() + shuttle_id = "[port_id]_[suffix]" + mappath = "[prefix][shuttle_id].dmm" + . = ..() + +/datum/map_template/shuttle/preload_size(path, cache) + . = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map + if(!cached_map) + return + + var/offset = discover_offset(/obj/docking_port/mobile) + + port_x_offset = offset[1] + port_y_offset = offset[2] + + if(!cache) + cached_map = null + +/datum/map_template/shuttle/load(turf/T, centered, register=TRUE) + . = ..() + if(!.) + return + var/list/turfs = block( locate(.[MAP_MINX], .[MAP_MINY], .[MAP_MINZ]), + locate(.[MAP_MAXX], .[MAP_MAXY], .[MAP_MAXZ])) + for(var/i in 1 to turfs.len) + var/turf/place = turfs[i] + if(isspaceturf(place)) // This assumes all shuttles are loaded in a single spot then moved to their real destination. + continue + + if (place.count_baseturfs() < 2) // Some snowflake shuttle shit + continue + + place.insert_baseturf(3, /turf/baseturf_skipover/shuttle) + + for(var/obj/docking_port/mobile/port in place) + port.calculate_docking_port_information(src) + // initTemplateBounds explicitly ignores the shuttle's docking port, to ensure that it calculates the bounds of the shuttle correctly + // so we need to manually initialize it here + SSatoms.InitializeAtoms(list(port)) + if(register) + port.register() + +//Whatever special stuff you want +/datum/map_template/shuttle/post_load(obj/docking_port/mobile/M) + if(movement_force) + M.movement_force = movement_force.Copy() + M.linkup() + +/datum/map_template/shuttle/cargo + port_id = "cargo" + name = "Base Shuttle Template (Cargo)" + who_can_purchase = null + +/datum/map_template/shuttle/ferry + port_id = "ferry" + name = "Base Shuttle Template (Ferry)" + +/datum/map_template/shuttle/whiteship + port_id = "whiteship" + who_can_purchase = null + +/datum/map_template/shuttle/labour + port_id = "labour" + who_can_purchase = null + +/datum/map_template/shuttle/mining + port_id = "mining" + who_can_purchase = null + +/datum/map_template/shuttle/arrival + port_id = "arrival" + who_can_purchase = null + +/datum/map_template/shuttle/infiltrator + port_id = "infiltrator" + +/datum/map_template/shuttle/aux_base + port_id = "aux_base" + +/datum/map_template/shuttle/escape_pod/ + port_id = "escape_pod" + suffix = "1" + who_can_purchase = null + +/datum/map_template/shuttle/escape_pod/two + suffix = "2" + +/datum/map_template/shuttle/escape_pod/three + suffix = "3" + +/datum/map_template/shuttle/escape_pod/four + suffix = "4" + +/datum/map_template/shuttle/assault_pod + port_id = "assault_pod" + who_can_purchase = null + +/datum/map_template/shuttle/pirate + port_id = "pirate" + who_can_purchase = null + +/datum/map_template/shuttle/hunter + port_id = "hunter" + who_can_purchase = null + +/datum/map_template/shuttle/ruin //For random shuttles in ruins + port_id = "ruin" + who_can_purchase = null + +/datum/map_template/shuttle/snowdin + port_id = "snowdin" + who_can_purchase = null + +// Shuttles start here: + +/datum/map_template/shuttle/ferry/base + suffix = "base" + name = "transport ferry" + description = "Standard issue Box/Metastation CentCom ferry." + +/datum/map_template/shuttle/ferry/meat + suffix = "meat" + name = "\"meat\" ferry" + description = "Ahoy! We got all kinds o' meat aft here. Meat from plant people, people who be dark, not in a racist way, just they're dark black. \ + Oh and lizard meat too,mighty popular that is. Definitely 100% fresh, just ask this guy here. *person on meatspike moans* See? \ + Definitely high quality meat, nothin' wrong with it, nothin' added, definitely no zombifyin' reagents!" + admin_notes = "Meat currently contains no zombifying reagents, lizard on meatspike must be spawned in." + +/datum/map_template/shuttle/ferry/lighthouse + suffix = "lighthouse" + name = "The Lighthouse(?)" + description = "*static*... part of a much larger vessel, possibly military in origin. \ + The weapon markings aren't anything we've seen ...static... by almost never the same person twice, possible use of unknown storage ...static... \ + seeing ERT officers onboard, but no missions are on file for ...static...static...annoying jingle... only at The LIGHTHOUSE! \ + Fulfilling needs you didn't even know you had. We've got EVERYTHING, and something else!" + admin_notes = "Currently larger than ferry docking port on Box, will not hit anything, but must be force docked. Trader and ERT bodyguards are not included." + +/datum/map_template/shuttle/ferry/fancy + suffix = "fancy" + name = "fancy transport ferry" + description = "At some point, someone upgraded the ferry to have fancier flooring... and fewer seats." + +/datum/map_template/shuttle/ferry/kilo + suffix = "kilo" + name = "kilo transport ferry" + description = "Standard issue CentCom Ferry for Kilo pattern stations. Includes additional equipment and rechargers." + +/datum/map_template/shuttle/whiteship/box + suffix = "1" + name = "Hospital Ship" + +/datum/map_template/shuttle/whiteship/meta + suffix = "2" + name = "Salvage Ship" + +/datum/map_template/shuttle/whiteship/pubby + suffix = "3" + name = "NT White UFO" + +/datum/map_template/shuttle/whiteship/cere + suffix = "4" + name = "NT Construction Vessel" + +/datum/map_template/shuttle/whiteship/delta + suffix = "5" + name = "NT Frigate" + +/datum/map_template/shuttle/whiteship/pod + suffix = "whiteship_pod" + name = "Salvage Pod" + +/datum/map_template/shuttle/cargo/box + suffix = "box" + name = "supply shuttle (Box)" + +/datum/map_template/shuttle/cargo/birdboat + suffix = "birdboat" + name = "supply shuttle (Birdboat)" + +/datum/map_template/shuttle/cargo/kilo + suffix = "kilo" + name = "supply shuttle (Kilo)" + +/datum/map_template/shuttle/cargo/gax + suffix = "gax" + name = "supply shuttle (Gax)" + +/datum/map_template/shuttle/arrival/box + suffix = "box" + name = "arrival shuttle (Box)" + +/datum/map_template/shuttle/cargo/box + suffix = "box" + name = "cargo ferry (Box)" + +/datum/map_template/shuttle/mining/box + suffix = "box" + name = "mining shuttle (Box)" + +/datum/map_template/shuttle/mining/kilo + suffix = "kilo" + name = "mining shuttle (Kilo)" + +/datum/map_template/shuttle/labour/box + suffix = "box" + name = "labour shuttle (Box)" + +/datum/map_template/shuttle/labour/kilo + suffix = "kilo" + name = "labour shuttle (Kilo)" + +/datum/map_template/shuttle/labour/gax + suffix = "gax" + name = "labour shuttle (Gax)" + +/datum/map_template/shuttle/infiltrator/basic + suffix = "basic" + name = "basic syndicate infiltrator" + +/datum/map_template/shuttle/cargo/delta + suffix = "delta" + name = "cargo ferry (Delta)" + +/datum/map_template/shuttle/mining/delta + suffix = "delta" + name = "mining shuttle (Delta)" + +/datum/map_template/shuttle/labour/delta + suffix = "delta" + name = "labour shuttle (Delta)" + +/datum/map_template/shuttle/arrival/delta + suffix = "delta" + name = "arrival shuttle (Delta)" + +/datum/map_template/shuttle/arrival/omega + suffix = "omega" + name = "arrival shuttle (Omega)" + +/datum/map_template/shuttle/arrival/kilo + suffix = "kilo" + name = "arrival shuttle (Kilo)" + +/datum/map_template/shuttle/aux_base + port_id = "aux_base" + who_can_purchase = null + +/datum/map_template/shuttle/aux_base/default + suffix = "default" + name = "auxilliary base (Default)" + +/datum/map_template/shuttle/aux_base/small + suffix = "small" + name = "auxilliary base (Small)" + +/datum/map_template/shuttle/escape_pod/default + suffix = "default" + name = "escape pod (Default)" + +/datum/map_template/shuttle/escape_pod/large + suffix = "large" + name = "escape pod (Large)" + +/datum/map_template/shuttle/assault_pod/default + suffix = "default" + name = "assault pod (Default)" + +/datum/map_template/shuttle/pirate/default + suffix = "default" + name = "pirate ship (Default)" + +/datum/map_template/shuttle/hunter/space_cop + suffix = "space_cop" + name = "Police Spacevan" + +/datum/map_template/shuttle/hunter/russian + suffix = "russian" + name = "Russian Cargo Ship" + +/datum/map_template/shuttle/ruin/caravan_victim + suffix = "caravan_victim" + name = "Small Freighter" + +/datum/map_template/shuttle/ruin/pirate_cutter + suffix = "pirate_cutter" + name = "Pirate Cutter" + +/datum/map_template/shuttle/ruin/syndicate_dropship + suffix = "syndicate_dropship" + name = "Syndicate Dropship" + +/datum/map_template/shuttle/ruin/syndicate_fighter_shiv + suffix = "syndicate_fighter_shiv" + name = "Syndicate Fighter" + +/datum/map_template/shuttle/snowdin/mining + suffix = "mining" + name = "Snowdin Mining Elevator" + +/datum/map_template/shuttle/snowdin/excavation + suffix = "excavation" + name = "Snowdin Excavation Elevator" + +/datum/map_template/shuttle/arrival/gax + suffix = "gax" + name = "arrival shuttle (Gax)" + +/datum/map_template/shuttle/ai/gax + port_id = "ai" + suffix = "gax" + name = "ai ship shuttle (Gax)" + +/datum/map_template/shuttle/arrival/donut + suffix = "donut" + name = "arrival shuttle (Donut)" diff --git a/code/datums/shuttles/shuttles.dm b/code/datums/shuttles/emergency.dm similarity index 63% rename from code/datums/shuttles/shuttles.dm rename to code/datums/shuttles/emergency.dm index e7b782b84507..e2d7fb4d5fa0 100644 --- a/code/datums/shuttles/shuttles.dm +++ b/code/datums/shuttles/emergency.dm @@ -1,171 +1,51 @@ -/datum/map_template/shuttle - name = "Base Shuttle Template" - var/prefix = "_maps/shuttles/" - var/suffix - /** - * Port ID is the place this template should be docking at, set on '/obj/docking_port/stationary' - * Because getShuttle() compares port_id to shuttle_id to find an already existing shuttle, - * you should set shuttle_id to be the same as port_id if you want them to be replacable. - */ - var/port_id - /// ID of the shuttle, make sure it matches port_id if necessary. - var/shuttle_id - /// Information to display on communication console about the shuttle - var/description - /// Description of the prerequisition that has to be achieved for the shuttle to be purchased - var/prerequisites - /// Shuttle warnings and hazards to the admin who spawns the shuttle - var/admin_notes - /// How much does this shuttle cost the cargo budget to purchase? Put in terms of CARGO_CRATE_VALUE to properly scale the cost with the current balance of cargo's income. - var/credit_cost = INFINITY - /// Whether or not this shuttle is locked to emags only. - var/emag_buy = FALSE - /// If set, overrides default movement_force on shuttle - var/list/movement_force - - var/port_x_offset - var/port_y_offset - var/extra_desc = "" - -/datum/map_template/shuttle/proc/prerequisites_met() - return TRUE - -/datum/map_template/shuttle/New() - shuttle_id = "[port_id]_[suffix]" - mappath = "[prefix][shuttle_id].dmm" - . = ..() - -/datum/map_template/shuttle/preload_size(path, cache) - . = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map - if(!cached_map) - return - - var/offset = discover_offset(/obj/docking_port/mobile) - - port_x_offset = offset[1] - port_y_offset = offset[2] - - if(!cache) - cached_map = null - -/datum/map_template/shuttle/load(turf/T, centered, register=TRUE) - . = ..() - if(!.) - return - var/list/turfs = block( locate(.[MAP_MINX], .[MAP_MINY], .[MAP_MINZ]), - locate(.[MAP_MAXX], .[MAP_MAXY], .[MAP_MAXZ])) - for(var/i in 1 to turfs.len) - var/turf/place = turfs[i] - if(isspaceturf(place)) // This assumes all shuttles are loaded in a single spot then moved to their real destination. - continue - - if (place.count_baseturfs() < 2) // Some snowflake shuttle shit - continue - - place.baseturfs.Insert(3, /turf/baseturf_skipover/shuttle) - - for(var/obj/docking_port/mobile/port in place) - // initTemplateBounds explicitly ignores the shuttle's docking port, to ensure that it calculates the bounds of the shuttle correctly - // so we need to manually initialize it here - SSatoms.InitializeAtoms(list(port)) - if(register) - port.register() - if(isnull(port_x_offset)) - continue - switch(port.dir) // Yeah this looks a little ugly but mappers had to do this in their head before - if(NORTH) - port.width = width - port.height = height - port.dwidth = port_x_offset - 1 - port.dheight = port_y_offset - 1 - if(EAST) - port.width = height - port.height = width - port.dwidth = height - port_y_offset - port.dheight = port_x_offset - 1 - if(SOUTH) - port.width = width - port.height = height - port.dwidth = width - port_x_offset - port.dheight = height - port_y_offset - if(WEST) - port.width = height - port.height = width - port.dwidth = port_y_offset - 1 - port.dheight = width - port_x_offset - -//Whatever special stuff you want -/datum/map_template/shuttle/post_load(obj/docking_port/mobile/M) - if(movement_force) - M.movement_force = movement_force.Copy() - //M.linkup() +#define EMAG_LOCKED_SHUTTLE_COST (CARGO_CRATE_VALUE * 50) /datum/map_template/shuttle/emergency port_id = "emergency" name = "Base Shuttle Template (Emergency)" - -/datum/map_template/shuttle/cargo - port_id = "cargo" - name = "Base Shuttle Template (Cargo)" - -/datum/map_template/shuttle/ferry - port_id = "ferry" - name = "Base Shuttle Template (Ferry)" - -/datum/map_template/shuttle/whiteship - port_id = "whiteship" - -/datum/map_template/shuttle/labour - port_id = "labour" - -/datum/map_template/shuttle/mining - port_id = "mining" - -/datum/map_template/shuttle/cargo - port_id = "cargo" - -/datum/map_template/shuttle/arrival - port_id = "arrival" - -/datum/map_template/shuttle/infiltrator - port_id = "infiltrator" - -/datum/map_template/shuttle/aux_base - port_id = "aux_base" - -/datum/map_template/shuttle/escape_pod/ - port_id = "escape_pod" - suffix = "1" - -/datum/map_template/shuttle/escape_pod/two - suffix = "2" - -/datum/map_template/shuttle/escape_pod/three - suffix = "3" - -/datum/map_template/shuttle/escape_pod/four - suffix = "4" - -/datum/map_template/shuttle/assault_pod - port_id = "assault_pod" - -/datum/map_template/shuttle/pirate - port_id = "pirate" - -/datum/map_template/shuttle/hunter - port_id = "hunter" - -/datum/map_template/shuttle/ruin //For random shuttles in ruins - port_id = "ruin" - -/datum/map_template/shuttle/snowdin - port_id = "snowdin" - -// Shuttles start here: + ///assoc list of shuttle events to add to this shuttle on spawn (typepath = weight) + var/list/events + ///pick all events instead of random + var/use_all_events = FALSE + ///how many do we pick + var/event_amount = 1 + ///do we empty the event list before adding our events + var/events_override = FALSE + + // Yog code: we haven't completely revamped shuttles yet so to avoid doing a lot more work i'm just adding a placeholder value + occupancy_limit = "FLEXIBLE" + +/datum/map_template/shuttle/emergency/New() + . = ..() + if(!occupancy_limit && who_can_purchase) + CRASH("The [name] needs an occupancy limit!") + if(HAS_TRAIT(SSstation, STATION_TRAIT_SHUTTLE_SALE) && credit_cost > 0 && prob(15)) + var/discount_amount = round(rand(25, 80), 5) + name += " ([discount_amount]% Discount!)" + var/discount_multiplier = 100 - discount_amount + credit_cost = ((credit_cost * discount_multiplier) / 100) + +///on post_load use our variables to change shuttle events +/datum/map_template/shuttle/emergency/post_load(obj/docking_port/mobile/mobile) + . = ..() + if(!events) + return + // if(events_override) + // mobile.event_list.Cut() + // if(use_all_events) + // for(var/path in events) + // mobile.event_list.Add(new path(mobile)) + // events -= path + // else + // for(var/i in 1 to event_amount) + // var/path = pick_weight(events) + // events -= path + // mobile.event_list.Add(new path(mobile)) /datum/map_template/shuttle/emergency/backup suffix = "backup" name = "Backup Shuttle" + who_can_purchase = null /datum/map_template/shuttle/emergency/construction suffix = "construction" @@ -243,7 +123,7 @@ description = "Dis is a high-quality shuttle, da. Many seats, lots of space, all equipment! Even includes entertainment! Such as lots to drink, and a fighting arena for drunk crew to have fun! If arena not fun enough, simply press button of releasing bears. Do not worry, bears trained not to break out of fighting pit, so totally safe so long as nobody stupid or drunk enough to leave door open. Try not to let asimov babycons ruin fun!" admin_notes = "Includes a small variety of weapons. And bears. Only captain-access can release the bears. Bears won't smash the windows themselves, but they can escape if someone lets them." credit_cost = 5000 // While the shuttle is rusted and poorly maintained, trained bears are costly. - emag_buy = TRUE + emag_only = TRUE /datum/map_template/shuttle/emergency/meteor suffix = "meteor" @@ -252,7 +132,7 @@ admin_notes = "This shuttle will likely crush escape, killing anyone there." credit_cost = 15000 movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) - emag_buy = TRUE + emag_only = TRUE /datum/map_template/shuttle/emergency/luxury suffix = "luxury" @@ -268,7 +148,7 @@ description = "The glorious results of centuries of plasma research done by Nanotrasen employees. This is the reason why you are here. Get on and dance like you're on fire, burn baby burn!" admin_notes = "Flaming hot. The main area has a dance machine as well as plasma floor tiles that will be ignited by players every single time." credit_cost = 10000 - emag_buy = TRUE + emag_only = TRUE /datum/map_template/shuttle/emergency/arena suffix = "arena" @@ -276,7 +156,7 @@ description = "The crew must pass through an otherworldly arena to board this shuttle. Expect massive casualties. The source of the Bloody Signal must be tracked down and eliminated to unlock this shuttle." admin_notes = "RIP AND TEAR." credit_cost = 10000 - emag_buy = TRUE + emag_only = TRUE /datum/map_template/shuttle/emergency/arena/prerequisites_met() return GLOB.bubblegum_dead @@ -338,7 +218,7 @@ description = "Due to a lack of functional emergency shuttles, we bought this second hand from a scrapyard and pressed it into service. Please do not lean too heavily on the exterior windows, they are fragile." admin_notes = "An abomination with no functional medbay, sections missing, and some very fragile windows. Surprisingly airtight." movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) - emag_buy = TRUE + emag_only = TRUE /datum/map_template/shuttle/emergency/narnar suffix = "narnar" @@ -394,7 +274,7 @@ description = "I'm gonna make you an offer you can't refuse, the drone mafia has offered their 'services' to shuttle the crew. \ Just be careful, if you don't show class they might heckle you. Canoli not incuded." admin_notes = "has 5 mafia drones that are pacified. By drone law they should only stun people if provoked. Has a pair of sentient barstaff also." - emag_buy = TRUE + emag_only = TRUE credit_cost = 100000//service fee /datum/map_template/shuttle/emergency/supermatter @@ -409,7 +289,7 @@ It does, however, still dust anything on contact, emits high levels of radiation, and induce hallucinations in anyone looking at it without protective goggles. \ Emitters spawn powered on, expect admin notices, they are harmless." credit_cost = 100000 - emag_buy = TRUE + emag_only = TRUE movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) /datum/map_template/shuttle/emergency/imfedupwiththisworld @@ -419,7 +299,7 @@ Aw, come space on. Why not? No, I can't. Anyway, how is your space roleplay life?" admin_notes = "Tiny, with a single airlock and wooden walls. What could go wrong?" credit_cost = 7500 - emag_buy = TRUE + emag_only = TRUE movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) /datum/map_template/shuttle/emergency/goon @@ -450,7 +330,7 @@ Needless to say, no engineering team wanted to go near the thing, and it's only being used as an Emergency Escape Shuttle because there is literally nothing else available." admin_notes = "If the crew can solve the puzzle, they will wake the wabbajack statue. It will likely not end well. There's a reason it's boarded up. Maybe they should have just left it alone." credit_cost = 15000 - emag_buy = TRUE + emag_only = TRUE /datum/map_template/shuttle/emergency/omega suffix = "omega" @@ -458,78 +338,6 @@ description = "On the smaller size with a modern design, this shuttle is for the crew who like the cosier things, while still being able to stretch their legs." credit_cost = 1000 -/datum/map_template/shuttle/ferry/base - suffix = "base" - name = "transport ferry" - description = "Standard issue Box/Metastation CentCom ferry." - -/datum/map_template/shuttle/ferry/meat - suffix = "meat" - name = "\"meat\" ferry" - description = "Ahoy! We got all kinds o' meat aft here. Meat from plant people, people who be dark, not in a racist way, just they're dark black. \ - Oh and lizard meat too,mighty popular that is. Definitely 100% fresh, just ask this guy here. *person on meatspike moans* See? \ - Definitely high quality meat, nothin' wrong with it, nothin' added, definitely no zombifyin' reagents!" - admin_notes = "Meat currently contains no zombifying reagents, lizard on meatspike must be spawned in." - -/datum/map_template/shuttle/ferry/lighthouse - suffix = "lighthouse" - name = "The Lighthouse(?)" - description = "*static*... part of a much larger vessel, possibly military in origin. \ - The weapon markings aren't anything we've seen ...static... by almost never the same person twice, possible use of unknown storage ...static... \ - seeing ERT officers onboard, but no missions are on file for ...static...static...annoying jingle... only at The LIGHTHOUSE! \ - Fulfilling needs you didn't even know you had. We've got EVERYTHING, and something else!" - admin_notes = "Currently larger than ferry docking port on Box, will not hit anything, but must be force docked. Trader and ERT bodyguards are not included." - -/datum/map_template/shuttle/ferry/fancy - suffix = "fancy" - name = "fancy transport ferry" - description = "At some point, someone upgraded the ferry to have fancier flooring... and fewer seats." - -/datum/map_template/shuttle/ferry/kilo - suffix = "kilo" - name = "kilo transport ferry" - description = "Standard issue CentCom Ferry for Kilo pattern stations. Includes additional equipment and rechargers." - -/datum/map_template/shuttle/whiteship/box - suffix = "1" - name = "Hospital Ship" - -/datum/map_template/shuttle/whiteship/meta - suffix = "2" - name = "Salvage Ship" - -/datum/map_template/shuttle/whiteship/pubby - suffix = "3" - name = "NT White UFO" - -/datum/map_template/shuttle/whiteship/cere - suffix = "4" - name = "NT Construction Vessel" - -/datum/map_template/shuttle/whiteship/delta - suffix = "5" - name = "NT Frigate" - -/datum/map_template/shuttle/whiteship/pod - suffix = "whiteship_pod" - name = "Salvage Pod" - -/datum/map_template/shuttle/cargo/box - suffix = "box" - name = "supply shuttle (Box)" - -/datum/map_template/shuttle/cargo/birdboat - suffix = "birdboat" - name = "supply shuttle (Birdboat)" - -/datum/map_template/shuttle/cargo/kilo - suffix = "kilo" - name = "supply shuttle (Kilo)" - -/datum/map_template/shuttle/cargo/gax - suffix = "gax" - name = "supply shuttle (Gax)" - /datum/map_template/shuttle/emergency/delta suffix = "delta" name = "Delta Station Emergency Shuttle" @@ -547,128 +355,3 @@ admin_notes = "Comes with turrets that will target anything without the neutral faction (nuke ops, xenos etc, but not pets)." credit_cost = 30000 */ - -/datum/map_template/shuttle/arrival/box - suffix = "box" - name = "arrival shuttle (Box)" - -/datum/map_template/shuttle/cargo/box - suffix = "box" - name = "cargo ferry (Box)" - -/datum/map_template/shuttle/mining/box - suffix = "box" - name = "mining shuttle (Box)" - -/datum/map_template/shuttle/mining/kilo - suffix = "kilo" - name = "mining shuttle (Kilo)" - -/datum/map_template/shuttle/labour/box - suffix = "box" - name = "labour shuttle (Box)" - -/datum/map_template/shuttle/labour/kilo - suffix = "kilo" - name = "labour shuttle (Kilo)" - -/datum/map_template/shuttle/labour/gax - suffix = "gax" - name = "labour shuttle (Gax)" - -/datum/map_template/shuttle/infiltrator/basic - suffix = "basic" - name = "basic syndicate infiltrator" - -/datum/map_template/shuttle/cargo/delta - suffix = "delta" - name = "cargo ferry (Delta)" - -/datum/map_template/shuttle/mining/delta - suffix = "delta" - name = "mining shuttle (Delta)" - -/datum/map_template/shuttle/labour/delta - suffix = "delta" - name = "labour shuttle (Delta)" - -/datum/map_template/shuttle/arrival/delta - suffix = "delta" - name = "arrival shuttle (Delta)" - -/datum/map_template/shuttle/arrival/omega - suffix = "omega" - name = "arrival shuttle (Omega)" - -/datum/map_template/shuttle/arrival/kilo - suffix = "kilo" - name = "arrival shuttle (Kilo)" - -/datum/map_template/shuttle/aux_base/default - suffix = "default" - name = "auxilliary base (Default)" - -/datum/map_template/shuttle/aux_base/small - suffix = "small" - name = "auxilliary base (Small)" - -/datum/map_template/shuttle/escape_pod/default - suffix = "default" - name = "escape pod (Default)" - -/datum/map_template/shuttle/escape_pod/large - suffix = "large" - name = "escape pod (Large)" - -/datum/map_template/shuttle/assault_pod/default - suffix = "default" - name = "assault pod (Default)" - -/datum/map_template/shuttle/pirate/default - suffix = "default" - name = "pirate ship (Default)" - -/datum/map_template/shuttle/hunter/space_cop - suffix = "space_cop" - name = "Police Spacevan" - -/datum/map_template/shuttle/hunter/russian - suffix = "russian" - name = "Russian Cargo Ship" - -/datum/map_template/shuttle/ruin/caravan_victim - suffix = "caravan_victim" - name = "Small Freighter" - -/datum/map_template/shuttle/ruin/pirate_cutter - suffix = "pirate_cutter" - name = "Pirate Cutter" - -/datum/map_template/shuttle/ruin/syndicate_dropship - suffix = "syndicate_dropship" - name = "Syndicate Dropship" - -/datum/map_template/shuttle/ruin/syndicate_fighter_shiv - suffix = "syndicate_fighter_shiv" - name = "Syndicate Fighter" - -/datum/map_template/shuttle/snowdin/mining - suffix = "mining" - name = "Snowdin Mining Elevator" - -/datum/map_template/shuttle/snowdin/excavation - suffix = "excavation" - name = "Snowdin Excavation Elevator" - -/datum/map_template/shuttle/arrival/gax - suffix = "gax" - name = "arrival shuttle (Gax)" - -/datum/map_template/shuttle/ai/gax - port_id = "ai" - suffix = "gax" - name = "ai ship shuttle (Gax)" - -/datum/map_template/shuttle/arrival/donut - suffix = "donut" - name = "arrival shuttle (Donut)" diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index 52145534ab87..664372db8b69 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -122,3 +122,11 @@ /datum/station_trait/quick_shuttle/on_round_start() . = ..() SSshuttle.supply.callTime *= 0.5 + +/datum/station_trait/shuttle_sale + name = "Shuttle Firesale" + report_message = "The Nanotrasen Emergency Dispatch team is celebrating a record number of shuttle calls in the recent quarter. Some of your emergency shuttle options have been discounted!" + trait_type = STATION_TRAIT_POSITIVE + weight = 4 + trait_to_give = STATION_TRAIT_SHUTTLE_SALE + show_in_report = TRUE diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 2773c2fb10f0..f185e6a4fd74 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -196,8 +196,6 @@ GLOBAL_LIST_EMPTY(teleportlocs) */ /area/Initialize(mapload) icon_state = "" - layer = AREA_LAYER - uid = ++global_uid map_name = name // Save the initial (the name set in the map) name of the area. add_delta_areas() @@ -225,7 +223,8 @@ GLOBAL_LIST_EMPTY(teleportlocs) . = ..() - blend_mode = BLEND_MULTIPLY // Putting this in the constructor so that it stops the icons being screwed up in the map editor. + if(!static_lighting) + blend_mode = BLEND_MULTIPLY if(!IS_DYNAMIC_LIGHTING(src)) add_overlay(/obj/effect/fullbright) @@ -803,3 +802,26 @@ GLOBAL_LIST_EMPTY(teleportlocs) /// A hook so areas can modify the incoming args (of what??) /area/proc/PlaceOnTopReact(list/new_baseturfs, turf/fake_turf_type, flags) return flags + +/// Called when a living mob that spawned here, joining the round, receives the player client. +/area/proc/on_joining_game(mob/living/boarder) + return + +/** + * Returns the name of an area, with the original name if the area name has been changed. + * + * If an area has not been renamed, returns the area name. If it has been modified (by blueprints or other means) + * returns the current name, as well as the initial value, in the format of [Current Location Name (Original Name)] + */ + +/area/proc/get_original_area_name() + if(name == initial(name)) + return name + return "[name] ([initial(name)])" + +/** + * A blank area subtype solely used by the golem area editor for the purpose of + * allowing golems to create new areas without suffering from the hazard_area debuffs. + */ +/area/golem + name = "Golem Territory" diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index 0cbfa33a0e2a..35c399a8a300 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -216,7 +216,7 @@ return FALSE if(is_reserved_level(T.z)) - for(var/A in SSshuttle.mobile) + for(var/A in SSshuttle.mobile_docking_ports) var/obj/docking_port/mobile/M = A if(M.launch_status == ENDGAME_TRANSIT) for(var/place in M.shuttle_areas) @@ -232,7 +232,7 @@ return TRUE //Check for centcom shuttles - for(var/A in SSshuttle.mobile) + for(var/A in SSshuttle.mobile_docking_ports) var/obj/docking_port/mobile/M = A if(M.launch_status == ENDGAME_LAUNCHED) for(var/place in M.shuttle_areas) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 2862e01c87ae..f194b119758a 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -172,7 +172,7 @@ if(SHUTTLE_STRANDED, SHUTTLE_ESCAPE) return TRUE if(SHUTTLE_CALL) - if(SSshuttle.emergency.timeLeft(1) < initial(SSshuttle.emergencyCallTime)*0.5) + if(SSshuttle.emergency.timeLeft(1) < initial(SSshuttle.emergency_call_time)*0.5) return TRUE var/matc = CONFIG_GET(number/midround_antag_time_check) diff --git a/code/game/gamemodes/zombie/zombie.dm b/code/game/gamemodes/zombie/zombie.dm index 0e3ca3d87003..2c0a7df3962b 100644 --- a/code/game/gamemodes/zombie/zombie.dm +++ b/code/game/gamemodes/zombie/zombie.dm @@ -98,7 +98,7 @@ GLOBAL_LIST_EMPTY(zombies) /datum/game_mode/zombie/proc/call_shuttle() priority_announce("Foreign Biosignatures present onboard station. Activating automatic evacuation system...") - SSshuttle.emergencyNoRecall = TRUE + SSshuttle.emergency_no_recall = TRUE if(EMERGENCY_IDLE_OR_RECALLED) SSshuttle.emergency.request(null, set_coefficient=0.5) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 0fff2e989d26..9b18a2a89e93 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -145,6 +145,7 @@ Class Procs: if(!armor) armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70) . = ..() + SSmachines.register_machine(src) GLOB.machines += src if(ispath(circuit, /obj/item/circuitboard)) @@ -170,6 +171,7 @@ Class Procs: /obj/machinery/Destroy(force=FALSE) disconnect_from_network() + SSmachines.unregister_machine(src) GLOB.machines.Remove(src) if(!speed_process) STOP_PROCESSING(SSmachines, src) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 1f9204c829bd..c3eafc315953 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -50,10 +50,10 @@ if(move_down_action) actions += new move_down_action(src) -// /obj/machinery/computer/camera_advanced/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) -// for(var/i in networks) -// networks -= i -// networks += "[port.shuttle_id]_[i]" +/obj/machinery/computer/camera_advanced/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) + for(var/i in networks) + networks -= i + networks += "[port.shuttle_id]_[i]" /obj/machinery/computer/camera_advanced/syndie icon_keyboard = "syndie_key" diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index a530eb86b0aa..035ab275133c 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -218,11 +218,11 @@ var/datum/map_template/shuttle/shuttle = locate(params["shuttle"]) in shuttles if (!istype(shuttle)) return + if (!can_purchase_this_shuttle(shuttle)) + return if (!shuttle.prerequisites_met()) to_chat(usr, span_alert("You have not met the requirements for purchasing this shuttle.")) return - if(shuttle.emag_buy && !(obj_flags & EMAGGED)) - return //return silently, only way this could happen is an attempted href exploit var/datum/bank_account/bank_account = SSeconomy.get_dep_account(ACCOUNT_CAR) if (bank_account.account_balance < shuttle.credit_cost) return @@ -406,6 +406,7 @@ data["importantActionReady"] = COOLDOWN_FINISHED(src, important_action_cooldown) data["shuttleCalled"] = FALSE data["shuttleLastCalled"] = FALSE + data["aprilFools"] = check_holidays(APRIL_FOOLS) data["canPrintIdAndCode"] = FALSE data["alertLevel"] = get_security_level() @@ -448,8 +449,8 @@ if (SSshuttle.emergencyCallAmount) data["shuttleCalledPreviously"] = TRUE - if (SSshuttle.emergencyLastCallLoc) - data["shuttleLastCalled"] = format_text(SSshuttle.emergencyLastCallLoc.name) + if (SSshuttle.emergency_last_call_loc) + data["shuttleLastCalled"] = format_text(SSshuttle.emergency_last_call_loc.name) if (STATE_MESSAGES) data["messages"] = list() @@ -468,15 +469,20 @@ for (var/shuttle_id in SSmapping.shuttle_templates) var/datum/map_template/shuttle/shuttle_template = SSmapping.shuttle_templates[shuttle_id] + if (shuttle_template.credit_cost == INFINITY) continue - if(shuttle_template.emag_buy) - if(!(obj_flags & EMAGGED)) - continue + + if (!can_purchase_this_shuttle(shuttle_template)) + continue + shuttles += list(list( "name" = shuttle_template.name, "description" = shuttle_template.description, + "occupancy_limit" = shuttle_template.occupancy_limit, "creditCost" = shuttle_template.credit_cost, + "initial_cost" = initial(shuttle_template.credit_cost), + "emagOnly" = shuttle_template.emag_only, "prerequisites" = shuttle_template.prerequisites, "ref" = REF(shuttle_template), )) @@ -514,16 +520,42 @@ /obj/machinery/computer/communications/proc/can_buy_shuttles(mob/user) if (!SSmapping.config.allow_custom_shuttles) return FALSE - if (!authenticated_as_non_silicon_captain(user)) + if (issilicon(user)) + return FALSE + + var/has_access = FALSE + + for (var/access in SSshuttle.has_purchase_shuttle_access) + if (access in authorize_access) + has_access = TRUE + break + + if (!has_access) return FALSE + if (SSshuttle.emergency.mode != SHUTTLE_RECALL && SSshuttle.emergency.mode != SHUTTLE_IDLE) return "The shuttle is already in transit." - if (SSshuttle.shuttle_purchased == SHUTTLEPURCHASE_PURCHASED && (SSshuttle.emag_shuttle_purchased || !(obj_flags & EMAGGED))) + if (SSshuttle.shuttle_purchased == SHUTTLEPURCHASE_PURCHASED) return "A replacement shuttle has already been purchased." if (SSshuttle.shuttle_purchased == SHUTTLEPURCHASE_FORCED) return "Due to unforseen circumstances, shuttle purchasing is no longer available." return TRUE +/// Returns whether we are authorized to buy this specific shuttle. +/// Does not handle prerequisite checks, as those should still *show*. +/obj/machinery/computer/communications/proc/can_purchase_this_shuttle(datum/map_template/shuttle/shuttle_template) + if (isnull(shuttle_template.who_can_purchase)) + return FALSE + + if (shuttle_template.emag_only) + return !!(obj_flags & EMAGGED) + + for (var/access in authorize_access) + if (access in shuttle_template.who_can_purchase) + return TRUE + + return FALSE + /obj/machinery/computer/communications/proc/can_send_messages_to_other_sectors(mob/user) if (!authenticated_as_non_silicon_captain(user)) return diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 2f0e935e630e..1c7c0fddd862 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -303,9 +303,9 @@ if("shuttle_id") update() -/obj/machinery/status_display/shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override) +/obj/machinery/status_display/shuttle/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override) if (port && (shuttle_id == initial(shuttle_id) || override)) - shuttle_id = port.id + shuttle_id = port.shuttle_id update() diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 025c0bcd1640..6203c7ce1c86 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -435,13 +435,13 @@ Code: else menu += "station" menu += "
    Current approved orders:

      " - for(var/S in SSshuttle.shoppinglist) + for(var/S in SSshuttle.shopping_list) var/datum/supply_order/SO = S menu += "
    1. #[SO.id] - [SO.pack.name] approved by [SO.orderer] [SO.reason ? "([SO.reason])":""]
    2. " menu += "
    " menu += "Current requests:
      " - for(var/S in SSshuttle.requestlist) + for(var/S in SSshuttle.request_list) var/datum/supply_order/SO = S menu += "
    1. #[SO.id] - [SO.pack.name] requested by [SO.orderer]
    2. " menu += "
    Upgrade NOW to Space Parts & Space Vendors PLUS for full remote order control and inventory management." diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 0eb26edb2a64..db82eced86df 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -12,7 +12,16 @@ throw_range = 7 max_amount = 60 mats_per_stack = 500 + /// What type of turf does this tile produce. var/turf_type = null + /// What dir will the turf have? + var/turf_dir = SOUTH + /// Cached associative lazy list to hold the radial options for tile reskinning. See tile_reskinning.dm for more information. Pattern: list[type] -> image + var/list/tile_reskin_types + /// Cached associative lazy list to hold the radial options for tile dirs. See tile_reskinning.dm for more information. + var/list/tile_rotate_dirs + /// Allows us to replace the plating we are attacking if our baseturfs are the same. + var/replace_plating = FALSE var/mineralType = null novariants = TRUE diff --git a/code/game/turfs/baseturfs.dm b/code/game/turfs/baseturfs.dm index 6a0fdfd04be5..ad016b634477 100644 --- a/code/game/turfs/baseturfs.dm +++ b/code/game/turfs/baseturfs.dm @@ -66,7 +66,7 @@ // Copy an existing turf and put it on top // Returns the new turf -/turf/proc/CopyOnTop(turf/copytarget, ignore_bottom=1, depth=INFINITY, copy_air = FALSE, flags) +/turf/proc/CopyOnTop(turf/copytarget, ignore_bottom=1, depth=INFINITY, copy_air = FALSE) var/list/new_baseturfs = list() new_baseturfs += baseturfs new_baseturfs += type @@ -83,7 +83,7 @@ target_baseturfs -= new_baseturfs & GLOB.blacklisted_automated_baseturfs new_baseturfs += target_baseturfs - var/turf/newT = copytarget.copyTurf(src, copy_air, flags) + var/turf/newT = copytarget.copyTurf(src, copy_air) newT.baseturfs = baseturfs_string_list(new_baseturfs, newT) return newT diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 9f390e3bdca2..7167c0c9d9dd 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -2,7 +2,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( /turf/open/space, /turf/baseturf_bottom, -))) + ))) /turf/proc/empty(turf_type=/turf/open/space, baseturf_type, list/ignore_typecache, flags) // Remove all atoms except observers, landmarks, docking ports @@ -15,31 +15,33 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(turf_type) ChangeTurf(turf_type, baseturf_type, flags) - -/turf/proc/copyTurf(turf/T, copy_air, flags) - if(T.type != type) - T.ChangeTurf(type, null, flags) - if(T.icon_state != icon_state) - T.icon_state = icon_state - if(T.icon != icon) - T.icon = icon + // var/turf/new_turf = ChangeTurf(turf_type, baseturf_type, flags) + // SSair.remove_from_active(new_turf) + // CALCULATE_ADJACENT_TURFS(new_turf, KILL_EXCITED) + +/turf/proc/copyTurf(turf/copy_to_turf) + if(copy_to_turf.type != type) + copy_to_turf.ChangeTurf(type) + if(copy_to_turf.icon_state != icon_state) + copy_to_turf.icon_state = icon_state + if(copy_to_turf.icon != icon) + copy_to_turf.icon = icon if(color) - T.atom_colours = atom_colours.Copy() - T.update_atom_colour() - if(T.dir != dir) - T.setDir(dir) - return T + copy_to_turf.atom_colours = atom_colours.Copy() + copy_to_turf.update_atom_colour() + if(copy_to_turf.dir != dir) + copy_to_turf.setDir(dir) + return copy_to_turf -/turf/open/copyTurf(turf/T, copy_air = FALSE) +/turf/open/copyTurf(turf/open/copy_to_turf, copy_air = FALSE) . = ..() - if (isopenturf(T)) - var/datum/component/wet_floor/slip = GetComponent(/datum/component/wet_floor) - if(slip) - var/datum/component/wet_floor/WF = T.AddComponent(/datum/component/wet_floor) - WF.InheritComponent(slip) - if (copy_air) - var/turf/open/openTurf = T - openTurf.air.copy_from(air) + ASSERT(istype(copy_to_turf, /turf/open)) + var/datum/component/wet_floor/slip = GetComponent(/datum/component/wet_floor) + if(slip) + var/datum/component/wet_floor/new_wet_floor_component = copy_to_turf.AddComponent(/datum/component/wet_floor) + new_wet_floor_component.InheritComponent(slip) + if (copy_air) + copy_to_turf.air.copy_from(air) //wrapper for ChangeTurf()s that you want to prevent/affect without overriding ChangeTurf() itself /turf/proc/TerraformTurf(path, new_baseturf, flags) @@ -83,13 +85,24 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/old_lighting_corner_SW = lighting_corner_SW var/old_lighting_corner_NW = lighting_corner_NW var/old_directional_opacity = directional_opacity + var/old_dynamic_lumcount = dynamic_lumcount + var/old_rcd_memory = rcd_memory + var/old_explosion_throw_details = explosion_throw_details + var/old_opacity = opacity + // I'm so sorry brother + // This is used for a starlight optimization + var/old_light_range = light_range + // We get just the bits of explosive_resistance that aren't the turf + //var/old_explosive_resistance = explosive_resistance - get_explosive_block() + var/old_lattice_underneath = lattice_underneath var/old_exl = explosion_level - var/old_exi = explosion_id + var/old_bp = blueprint_data blueprint_data = null var/list/old_baseturfs = baseturfs + var/old_type = type var/list/post_change_callbacks = list() SEND_SIGNAL(src, COMSIG_TURF_CHANGE, path, new_baseturfs, flags, post_change_callbacks) @@ -119,19 +132,25 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( else new_turf.baseturfs = baseturfs_string_list(old_baseturfs, new_turf) //Just to be safe - new_turf.explosion_id = old_exi - new_turf.explosion_level = old_exl - if(!(flags & CHANGETURF_DEFER_CHANGE)) - new_turf.AfterChange(flags) + new_turf.AfterChange(flags, old_type) new_turf.blueprint_data = old_bp + new_turf.rcd_memory = old_rcd_memory + new_turf.explosion_throw_details = old_explosion_throw_details + //new_turf.explosive_resistance += old_explosive_resistance lighting_corner_NE = old_lighting_corner_NE lighting_corner_SE = old_lighting_corner_SE lighting_corner_SW = old_lighting_corner_SW lighting_corner_NW = old_lighting_corner_NW + dynamic_lumcount = old_dynamic_lumcount + + lattice_underneath = old_lattice_underneath + + new_turf.explosion_level = old_exl + if(SSlighting.initialized) lighting_object = old_lighting_object directional_opacity = old_directional_opacity @@ -148,6 +167,32 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( for(var/turf/open/space/S in RANGE_TURFS(1, src)) //RANGE_TURFS is in code\__HELPERS\game.dm S.update_starlight() +// If we're space, then we're either lit, or not, and impacting our neighbors, or not + if(isspaceturf(src)) + var/turf/open/space/lit_turf = src + // This also counts as a removal, so we need to do a full rebuild + if(!ispath(old_type, /turf/open/space)) + lit_turf.update_starlight() + for(var/turf/open/space/space_tile in RANGE_TURFS(1, src) - src) + space_tile.update_starlight() + else if(old_light_range) + lit_turf.enable_starlight() + + // If we're a cordon we count against a light, but also don't produce any ourselves + else if (istype(src, /turf/cordon)) + // This counts as removing a source of starlight, so we need to update the space tile to inform it + if(!ispath(old_type, /turf/open/space)) + for(var/turf/open/space/space_tile in RANGE_TURFS(1, src)) + space_tile.update_starlight() + + // If we're not either, but were formerly a space turf, then we want light + else if(ispath(old_type, /turf/open/space)) + for(var/turf/open/space/space_tile in RANGE_TURFS(1, src)) + space_tile.enable_starlight() + + if(old_opacity != opacity && SSticker) + GLOB.cameranet.bareMajorChunkChange(src) + // only queue for smoothing if SSatom initialized us, and we'd be changing smoothing state if(flags_1 & INITIALIZED_1) QUEUE_SMOOTH_NEIGHBORS(src) @@ -197,7 +242,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( Initalize_Atmos(0) //If you modify this function, ensure it works correctly with lateloaded map templates. -/turf/proc/AfterChange(flags) //called after a turf has been replaced in ChangeTurf() +/turf/proc/AfterChange(flags, oldType) //called after a turf has been replaced in ChangeTurf() levelupdate() if(flags & CHANGETURF_RECALC_ADJACENT) ImmediateCalculateAdjacentTurfs() @@ -209,7 +254,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( for(var/obj/machinery/door/firedoor/FD in T) FD.CalculateAffectingAreas() -/turf/open/AfterChange(flags) +/turf/open/AfterChange(flags, oldType) ..() RemoveLattice() if(!(flags & (CHANGETURF_IGNORE_AIR | CHANGETURF_INHERIT_AIR))) @@ -231,6 +276,11 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( air.copy_from(total.remove_ratio(1/turf_count)) -/turf/proc/ReplaceWithLattice() - ScrapeToBottom(flags = CHANGETURF_INHERIT_AIR) // Yogs -- fixes this not actually replacing the turf with a lattice, lmao (ScrapeToBottom defined in yogs file) - new /obj/structure/lattice(locate(x, y, z)) +/// Attempts to replace a tile with lattice. Amount is the amount of tiles to scrape away. +/turf/proc/attempt_lattice_replacement(amount = 2) + if(lattice_underneath) + var/turf/new_turf = ScrapeAway(amount, flags = CHANGETURF_INHERIT_AIR) + if(!istype(new_turf, /turf/open/floor)) + new /obj/structure/lattice(src) + else + ScrapeAway(amount, flags = CHANGETURF_INHERIT_AIR) diff --git a/code/game/turfs/closed/indestructible.dm b/code/game/turfs/closed/indestructible.dm index b233e45ad9cd..ca2da9ff812f 100644 --- a/code/game/turfs/closed/indestructible.dm +++ b/code/game/turfs/closed/indestructible.dm @@ -1,5 +1,6 @@ /turf/closed/indestructible name = "wall" + desc = "Effectively impervious to conventional methods of destruction." icon = 'icons/turf/walls.dmi' explosion_block = 50 flags_1 = NOJAUNT | NO_RUST diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index 3154254003e4..7f953a948754 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -261,21 +261,8 @@ //sub-type to be used for interior shuttle walls //won't get an underlay of the destination turf on shuttle move /turf/closed/wall/mineral/titanium/interior/copyTurf(turf/T) - if(T.type != type) - T.ChangeTurf(type) - if(underlays.len) - T.underlays = underlays - if(T.icon_state != icon_state) - T.icon_state = icon_state - if(T.icon != icon) - T.icon = icon - if(color) - T.atom_colours = atom_colours.Copy() - T.update_atom_colour() - if(T.dir != dir) - T.setDir(dir) + . = ..() T.transform = transform - return T /turf/closed/wall/mineral/titanium/copyTurf(turf/T) . = ..() @@ -331,24 +318,6 @@ bombcore.detonate() ..() -//have to copypaste this code -/turf/closed/wall/mineral/plastitanium/interior/copyTurf(turf/T) - if(T.type != type) - T.ChangeTurf(type) - if(underlays.len) - T.underlays = underlays - if(T.icon_state != icon_state) - T.icon_state = icon_state - if(T.icon != icon) - T.icon = icon - if(color) - T.atom_colours = atom_colours.Copy() - T.update_atom_colour() - if(T.dir != dir) - T.setDir(dir) - T.transform = transform - return T - /turf/closed/wall/mineral/plastitanium/copyTurf(turf/T) . = ..() T.transform = transform diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm index 607365fb3bcf..3a19bf56f924 100644 --- a/code/game/turfs/closed/wall/misc_walls.dm +++ b/code/game/turfs/closed/wall/misc_walls.dm @@ -83,7 +83,7 @@ return ..() -/turf/closed/wall/clockwork/ReplaceWithLattice() +/turf/closed/wall/clockwork/attempt_lattice_replacement() ..() for(var/obj/structure/lattice/L in src) L.ratvar_act() diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index d4adf74c0532..80706649c786 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -94,8 +94,7 @@ switch(pick(1,2;75,3)) if(1) if (!ispath(baseturf_at_depth(2), /turf/open/floor)) - ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - ReplaceWithLattice() + attempt_lattice_replacement() else ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) if(prob(33)) @@ -217,7 +216,7 @@ new floor_tile(src) make_plating() else if(prob(50)) - ReplaceWithLattice() + attempt_lattice_replacement() /turf/open/floor/narsie_act(force, ignore_mobs, probability = 20) . = ..() diff --git a/code/game/turfs/open/floor/hull.dm b/code/game/turfs/open/floor/hull.dm new file mode 100644 index 000000000000..4c9c356fd2dd --- /dev/null +++ b/code/game/turfs/open/floor/hull.dm @@ -0,0 +1,20 @@ + +/turf/open/floor/engine/hull + name = "exterior hull plating" + desc = "Sturdy exterior hull plating that separates you from the uncaring vacuum of space." + icon_state = "regular_hull" + initial_gas_mix = AIRLESS_ATMOS + +/turf/open/floor/engine/hull/ceiling + name = "shuttle ceiling plating" + var/old_turf_type + +/turf/open/floor/engine/hull/ceiling/AfterChange(flags, oldType) + . = ..() + old_turf_type = oldType + +/turf/open/floor/engine/hull/reinforced + name = "exterior reinforced hull plating" + desc = "Extremely sturdy exterior hull plating that separates you from the uncaring vacuum of space." + icon_state = "reinforced_hull" + heat_capacity = INFINITY diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index 7b7f150458f7..b97558ede3e1 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -187,7 +187,7 @@ QDEL_NULL(realappearence) return ..() -/turf/open/floor/clockwork/ReplaceWithLattice() +/turf/open/floor/clockwork/attempt_lattice_replacement(amount = 2) . = ..() for(var/obj/structure/lattice/L in src) L.ratvar_act() diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 6ea3bdc0b73e..2c6a8bbd0005 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -21,9 +21,17 @@ FASTDMM_PROP(\ pipe_astar_cost = 1\ ) - + //Can this plating have reinforced floors placed ontop of it var/attachment_holes = TRUE + //Used for upgrading this into R-Plating + var/upgradable = TRUE + + /// If true, will allow tiles to replace us if the tile [wants to] [/obj/item/stack/tile/var/replace_plating]. + /// And if our baseturfs are compatible. + /// See [/obj/item/stack/tile/proc/place_tile]. + var/allow_replacement = TRUE + /turf/open/floor/plating/broken_states() return list("damaged1", "damaged2", "damaged4") diff --git a/code/game/turfs/open/floor/reinf_floor.dm b/code/game/turfs/open/floor/reinf_floor.dm index be42663a18c6..ddea103a57f7 100644 --- a/code/game/turfs/open/floor/reinf_floor.dm +++ b/code/game/turfs/open/floor/reinf_floor.dm @@ -72,8 +72,7 @@ if(1) if(prob(80)) if(!length(baseturfs) || !ispath(baseturfs[baseturfs.len-1], /turf/open/floor)) - ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - ReplaceWithLattice() + attempt_lattice_replacement() else ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) else if(prob(50)) @@ -91,7 +90,7 @@ new floor_tile(src) make_plating(TRUE) else if(prob(30)) - ReplaceWithLattice() + attempt_lattice_replacement() /turf/open/floor/engine/attack_paw(mob/user) return attack_hand(user) diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index bffbe0735aa0..36f2d7733483 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -124,27 +124,7 @@ if(!CanBuildHere()) return if(istype(C, /obj/item/stack/rods)) - var/obj/item/stack/rods/R = C - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - var/obj/structure/lattice/catwalk/W = locate(/obj/structure/lattice/catwalk, src) - if(W) - to_chat(user, span_warning("There is already a catwalk here!")) - return - if(L) - if(R.use(1)) - to_chat(user, span_notice("You construct a catwalk.")) - playsound(src, 'sound/weapons/genhit.ogg', 50, 1) - new/obj/structure/lattice/catwalk(src) - else - to_chat(user, span_warning("You need two rods to build a catwalk!")) - return - if(R.use(1)) - to_chat(user, span_notice("You construct a lattice.")) - playsound(src, 'sound/weapons/genhit.ogg', 50, 1) - ReplaceWithLattice() - else - to_chat(user, span_warning("You need one rod to build a lattice.")) - return + build_with_rods(C, user) if(istype(C, /obj/item/stack/tile/plasteel)) if(!CanCoverUp()) return @@ -161,6 +141,25 @@ else to_chat(user, span_warning("The plating is going to need some support! Place metal rods first.")) +/turf/open/openspace/build_with_floor_tiles(obj/item/stack/tile/plasteel/used_tiles) + if(!CanCoverUp()) + return + return ..() + +/turf/open/openspace/rust_heretic_act() + return FALSE + +/turf/open/openspace/replace_floor(turf/open/new_floor_path, flags) + if (!initial(new_floor_path.overfloor_placed)) + ChangeTurf(new_floor_path, flags = flags) + return + // Create plating under tiled floor we try to create directly onto the air + place_on_top(/turf/open/floor/plating, flags = flags) + place_on_top(new_floor_path, flags = flags) + +/turf/open/openspace/can_cross_safely(atom/movable/crossing) + return HAS_TRAIT(crossing, TRAIT_MOVE_FLYING) + /turf/open/openspace/icemoon name = "ice chasm" baseturfs = /turf/open/openspace/icemoon diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 8f36c0ed3b91..21f4af13d576 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -53,10 +53,6 @@ GLOBAL_LIST_EMPTY(starlight) thermal_conductivity = 0 heat_capacity = 700000 - FASTDMM_PROP(\ - pipe_astar_cost = 3\ - ) - var/starlight_source_count = 0 var/destination_z @@ -78,6 +74,10 @@ GLOBAL_LIST_EMPTY(starlight) force_no_gravity = TRUE + FASTDMM_PROP(\ + pipe_astar_cost = 3\ + ) + /turf/open/space/basic/New() //Do not convert to Initialize SHOULD_CALL_PARENT(FALSE) //This is used to optimize the map loader @@ -322,6 +322,3 @@ GLOBAL_LIST_EMPTY(starlight) // Create plating under tiled floor we try to create directly onto space place_on_top(/turf/open/floor/plating, flags = flags) place_on_top(new_floor_path, flags = flags) - -/turf/open/openspace/can_cross_safely(atom/movable/crossing) - return HAS_TRAIT(crossing, TRAIT_MOVE_FLYING) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index f0543f653fbb..50237f4c7b67 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -38,7 +38,6 @@ GLOBAL_LIST_EMPTY(station_turfs) var/list/image/blueprint_data //for the station blueprints, images of objects eg: pipes var/explosion_level = 0 //for preventing explosion dodging - var/explosion_id = 0 var/list/explosion_throw_details var/requires_activation //add to air processing after initialize? @@ -189,20 +188,19 @@ GLOBAL_LIST_EMPTY(station_turfs) if(!changing_turf) stack_trace("Incorrect turf deletion") changing_turf = FALSE - var/turf/T = GET_TURF_ABOVE(src) - if(T) - T.multiz_turf_del(src, DOWN) - T = GET_TURF_BELOW(src) - if(T) - T.multiz_turf_del(src, UP) + if(GET_LOWEST_STACK_OFFSET(z)) + var/turf/T = GET_TURF_ABOVE(src) + if(T) + T.multiz_turf_del(src, DOWN) + T = GET_TURF_BELOW(src) + if(T) + T.multiz_turf_del(src, UP) if(force) ..() //this will completely wipe turf state var/turf/B = new world.turf(src) for(var/A in B.contents) qdel(A) - for(var/I in B.vars) - B.vars[I] = null return visibilityChanged() QDEL_LIST(blueprint_data) @@ -590,8 +588,6 @@ GLOBAL_LIST_EMPTY(station_turfs) var/atom/movable/movable_thing = thing if(QDELETED(movable_thing)) continue - if(!movable_thing.ex_check(explosion_id)) - continue switch(severity) if(EXPLODE_DEVASTATE) SSexplosions.high_mov_atom += movable_thing diff --git a/code/game/world.dm b/code/game/world.dm index c51f2fbe2b37..fe894bcb0cdf 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -410,3 +410,7 @@ GLOBAL_VAR(restart_counter) SStimer?.reset_buckets() /world/proc/refresh_atmos_grid() + +#undef NO_INIT_PARAMETER +#undef OVERRIDE_LOG_DIRECTORY_PARAMETER +#undef RESTART_COUNTER_PATH diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index c444519e7ae1..a1adbb7c803f 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -94,9 +94,9 @@ /obj/effect/station_crash/Initialize(mapload) ..() - for(var/S in SSshuttle.stationary) + for(var/S in SSshuttle.stationary_docking_ports) var/obj/docking_port/stationary/SM = S - if(SM.id == "emergency_home") + if(SM.shuttle_id == "emergency_home") var/new_dir = turn(SM.dir, 180) SM.forceMove(get_ranged_target_turf(SM, new_dir, rand(3,15))) break diff --git a/code/modules/admin/verbs/shuttlepanel.dm b/code/modules/admin/verbs/shuttlepanel.dm index e0922ac662cd..955024ac3b7c 100644 --- a/code/modules/admin/verbs/shuttlepanel.dm +++ b/code/modules/admin/verbs/shuttlepanel.dm @@ -12,19 +12,19 @@ /obj/docking_port/mobile/proc/admin_fly_shuttle(mob/user) var/list/options = list() - for(var/port in SSshuttle.stationary) + for(var/port in SSshuttle.stationary_docking_ports) if (istype(port, /obj/docking_port/stationary/transit)) continue // please don't do this var/obj/docking_port/stationary/S = port if (canDock(S) == SHUTTLE_CAN_DOCK) - options[S.name || S.id] = S + options[S.name || S.shuttle_id] = S options += "--------" options += "Infinite Transit" options += "Delete Shuttle" options += "Into The Sunset (delete & greentext 'escape')" - var/selection = input(user, "Select where to fly [name || id]:", "Fly Shuttle") as null|anything in options + var/selection = input(user, "Select where to fly [name || shuttle_id]:", "Fly Shuttle") as null|anything in options if(!selection) return @@ -35,12 +35,12 @@ setTimer(ignitionTime) if("Delete Shuttle") - if(tgui_alert(user, "Really delete [name || id]?", "Delete Shuttle", list("Cancel", "Really!")) != "Really!") + if(tgui_alert(user, "Really delete [name || shuttle_id]?", "Delete Shuttle", list("Cancel", "Really!")) != "Really!") return jumpToNullSpace() if("Into The Sunset (delete & greentext 'escape')") - if(tgui_alert(user, "Really delete [name || id] and greentext escape objectives?", "Delete Shuttle", list("Cancel", "Really!")) != "Really!") + if(tgui_alert(user, "Really delete [name || shuttle_id] and greentext escape objectives?", "Delete Shuttle", list("Cancel", "Really!")) != "Really!") return intoTheSunset() @@ -60,12 +60,12 @@ var/list/options = list() - for(var/port in SSshuttle.stationary) + for(var/port in SSshuttle.stationary_docking_ports) if (istype(port, /obj/docking_port/stationary/transit)) continue // please don't do this var/obj/docking_port/stationary/S = port if (canDock(S) == SHUTTLE_CAN_DOCK) - options[S.name || S.id] = S + options[S.name || S.shuttle_id] = S var/selection = input(user, "Select the new arrivals destination:", "Fly Shuttle") as null|anything in options if(!selection) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 59c13677286a..58fe2c768ffa 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -543,7 +543,7 @@ GLOBAL_VAR_INIT(curselimit, 0) set_coefficient = 1 else set_coefficient = 0.5 - var/surplus = timer - (SSshuttle.emergencyCallTime * set_coefficient) + var/surplus = timer - (SSshuttle.emergency_call_time * set_coefficient) SSshuttle.emergency.setTimer(timer) if(surplus > 0) SSshuttle.block_recall(surplus) diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index a55fd9d6da86..490b2057bbf5 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -80,11 +80,11 @@ var/message = "Remember to stamp and send back the supply manifests." if(SSshuttle.centcom_message) message = SSshuttle.centcom_message - if(SSshuttle.supplyBlocked) + if(SSshuttle.supply_blocked) message = blockade_warning data["message"] = message data["cart"] = list() - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) + for(var/datum/supply_order/SO in SSshuttle.shopping_list) data["cart"] += list(list( "object" = SO.pack.name, "cost" = SO.pack.get_cost(), @@ -95,7 +95,7 @@ )) data["requests"] = list() - for(var/datum/supply_order/SO in SSshuttle.requestlist) + for(var/datum/supply_order/SO in SSshuttle.request_list) data["requests"] += list(list( "object" = SO.pack.name, "cost" = SO.pack.get_cost(), @@ -138,7 +138,7 @@ if(!SSshuttle.supply.canMove()) say(safety_warning) return - if(SSshuttle.supplyBlocked) + if(SSshuttle.supply_blocked) say(blockade_warning) return if(SSshuttle.supply.getDockedId() == "supply_home") @@ -154,7 +154,7 @@ if("loan") if(!SSshuttle.shuttle_loan) return - if(SSshuttle.supplyBlocked) + if(SSshuttle.supply_blocked) say(blockade_warning) return else if(SSshuttle.supply.mode != SHUTTLE_IDLE) @@ -207,39 +207,39 @@ var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account) SO.generateRequisition(T) if(requestonly && !self_paid) - SSshuttle.requestlist += SO + SSshuttle.request_list += SO else - SSshuttle.shoppinglist += SO + SSshuttle.shopping_list += SO if(self_paid) say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.") . = TRUE if("remove") var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) + for(var/datum/supply_order/SO in SSshuttle.shopping_list) if(SO.id == id) - SSshuttle.shoppinglist -= SO + SSshuttle.shopping_list -= SO . = TRUE break if("clear") - SSshuttle.shoppinglist.Cut() + SSshuttle.shopping_list.Cut() . = TRUE if("approve") var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.requestlist) + for(var/datum/supply_order/SO in SSshuttle.request_list) if(SO.id == id) - SSshuttle.requestlist -= SO - SSshuttle.shoppinglist += SO + SSshuttle.request_list -= SO + SSshuttle.shopping_list += SO . = TRUE break if("deny") var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.requestlist) + for(var/datum/supply_order/SO in SSshuttle.request_list) if(SO.id == id) - SSshuttle.requestlist -= SO + SSshuttle.request_list -= SO . = TRUE break if("denyall") - SSshuttle.requestlist.Cut() + SSshuttle.request_list.Cut() . = TRUE if("toggleprivate") self_paid = !self_paid diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index ca3636f094a0..391945664105 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -109,7 +109,7 @@ data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons data["supplies"] = list() message = "Sales are near-instantaneous - please choose carefully." - if(SSshuttle.supplyBlocked) + if(SSshuttle.supply_blocked) message = blockade_warning if(usingBeacon && !beacon) message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm index 6afc883649fe..e0301895cd36 100644 --- a/code/modules/cargo/order.dm +++ b/code/modules/cargo/order.dm @@ -32,7 +32,7 @@ var/datum/bank_account/paying_account /datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason, paying_account, budget) - id = SSshuttle.ordernum++ + id = SSshuttle.order_number++ src.pack = pack src.orderer = orderer src.orderer_rank = orderer_rank diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index ae2b3031707c..ec256c848395 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -231,7 +231,7 @@ /obj/docking_port/mobile/pirate name = "pirate shuttle" - id = "pirateship" + shuttle_id = "pirateship" rechargeTime = 3 MINUTES /obj/machinery/suit_storage_unit/pirate diff --git a/code/modules/holodeck/holodeck_map_templates.dm b/code/modules/holodeck/holodeck_map_templates.dm new file mode 100644 index 000000000000..e7354ceb70f4 --- /dev/null +++ b/code/modules/holodeck/holodeck_map_templates.dm @@ -0,0 +1,183 @@ + +/datum/map_template/holodeck + var/template_id + var/description + var/restricted = FALSE + var/datum/parsed_map/lastparsed + + should_place_on_top = FALSE + returns_created_atoms = TRUE + keep_cached_map = TRUE + + var/obj/machinery/computer/holodeck/linked + +/datum/map_template/holodeck/offline + name = "Holodeck - Offline" + template_id = "holodeck_offline" + description = "benis" + mappath = "_maps/templates/holodeck_offline.dmm" + +/datum/map_template/holodeck/emptycourt + name = "Holodeck - Empty Court" + template_id = "holodeck_emptycourt" + description = "benis" + mappath = "_maps/templates/holodeck_emptycourt.dmm" + +/datum/map_template/holodeck/dodgeball + name = "Holodeck - Dodgeball Court" + template_id = "holodeck_dodgeball" + description = "benis" + mappath = "_maps/templates/holodeck_dodgeball.dmm" + +/datum/map_template/holodeck/basketball + name = "Holodeck - Basketball Court" + template_id = "holodeck_basketball" + description = "benis" + mappath = "_maps/templates/holodeck_basketball.dmm" + +/datum/map_template/holodeck/thunderdome + name = "Holodeck - Thunderdome Arena" + template_id = "holodeck_thunderdome" + description = "benis" + mappath = "_maps/templates/holodeck_thunderdome.dmm" + +/datum/map_template/holodeck/beach + name = "Holodeck - Beach" + template_id = "holodeck_beach" + description = "benis" + mappath = "_maps/templates/holodeck_beach.dmm" + +/datum/map_template/holodeck/lounge + name = "Holodeck - Lounge" + template_id = "holodeck_lounge" + description = "benis" + mappath = "_maps/templates/holodeck_lounge.dmm" + +/datum/map_template/holodeck/petpark + name = "Holodeck - Pet Park" + template_id = "holodeck_petpark" + description = "benis" + mappath = "_maps/templates/holodeck_petpark.dmm" + +/datum/map_template/holodeck/firingrange + name = "Holodeck - Firing Range" + template_id = "holodeck_firingrange" + description = "benis" + mappath = "_maps/templates/holodeck_firingrange.dmm" + +/datum/map_template/holodeck/anime_school + name = "Holodeck - Anime School" + template_id = "holodeck_animeschool" + description = "benis" + mappath = "_maps/templates/holodeck_animeschool.dmm" + +/datum/map_template/holodeck/chapelcourt + name = "Holodeck - Chapel Courtroom" + template_id = "holodeck_chapelcourt" + description = "benis" + mappath = "_maps/templates/holodeck_chapelcourt.dmm" + +/datum/map_template/holodeck/spacechess + name = "Holodeck - Space Chess" + template_id = "holodeck_spacechess" + description = "benis" + mappath = "_maps/templates/holodeck_spacechess.dmm" + +/datum/map_template/holodeck/spacecheckers + name = "Holodeck - Space Checkers" + template_id = "holodeck_spacecheckers" + description = "benis" + mappath = "_maps/templates/holodeck_spacecheckers.dmm" + +/datum/map_template/holodeck/kobayashi + name = "Holodeck - Kobayashi Maru" + template_id = "holodeck_kobayashi" + description = "benis" + mappath = "_maps/templates/holodeck_kobayashi.dmm" + +/datum/map_template/holodeck/winterwonderland + name = "Holodeck - Winter Wonderland" + template_id = "holodeck_winterwonderland" + description = "benis" + mappath = "_maps/templates/holodeck_winterwonderland.dmm" + +/datum/map_template/holodeck/photobooth + name = "Holodeck - Photobooth" + template_id = "holodeck_photobooth" + description = "benis" + mappath = "_maps/templates/holodeck_photobooth.dmm" + +/datum/map_template/holodeck/skatepark + name = "Holodeck - Skatepark" + template_id = "holodeck_skatepark" + description = "benis" + mappath = "_maps/templates/holodeck_skatepark.dmm" + +/datum/map_template/holodeck/microwave + name = "Holodeck - Microwave Paradise" + template_id = "holodeck_microwave" + description = "benis" + mappath = "_maps/templates/holodeck_microwave.dmm" + +/datum/map_template/holodeck/baseball + name = "Holodeck - Baseball Field" + template_id = "holodeck_baseball" + description = "benis" + mappath = "_maps/templates/holodeck_baseball.dmm" + +/datum/map_template/holodeck/card_battle + name = "Holodeck - TGC Battle Arena" + template_id = "holodeck_card_battle" + description = "An arena for playing Tactical Game Cards." + mappath = "_maps/templates/holodeck_card_battle.dmm" + +//bad evil no good programs + +/datum/map_template/holodeck/medicalsim + name = "Holodeck - Emergency Medical" + template_id = "holodeck_medicalsim" + description = "benis" + mappath = "_maps/templates/holodeck_medicalsim.dmm" + restricted = TRUE + +/datum/map_template/holodeck/thunderdome1218 + name = "Holodeck - 1218 AD" + template_id = "holodeck_thunderdome1218" + description = "benis" + mappath = "_maps/templates/holodeck_thunderdome1218.dmm" + restricted = TRUE + +/datum/map_template/holodeck/burntest + name = "Holodeck - Atmospheric Burn Test" + template_id = "holodeck_burntest" + description = "benis" + mappath = "_maps/templates/holodeck_burntest.dmm" + restricted = TRUE + +/datum/map_template/holodeck/wildlifesim + name = "Holodeck - Wildlife Simulation" + template_id = "holodeck_wildlifesim" + description = "benis" + mappath = "_maps/templates/holodeck_wildlifesim.dmm" + restricted = TRUE + +/datum/map_template/holodeck/holdoutbunker + name = "Holodeck - Holdout Bunker" + template_id = "holodeck_holdoutbunker" + description = "benis" + mappath = "_maps/templates/holodeck_holdoutbunker.dmm" + restricted = TRUE + +/datum/map_template/holodeck/anthophillia + name = "Holodeck - Anthophillia" + template_id = "holodeck_anthophillia" + description = "benis" + mappath = "_maps/templates/holodeck_anthophillia.dmm" + restricted = TRUE + +/datum/map_template/holodeck/refuelingstation + name = "Holodeck - Refueling Station" + template_id = "holodeck_refuelingstation" + description = "benis" + mappath = "_maps/templates/holodeck_refuelingstation.dmm" + restricted = TRUE diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index c8194c73af82..dbcdde5169c5 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -108,7 +108,8 @@ name = "carpet" desc = "Electrically inviting." icon = 'icons/turf/floors/carpet.dmi' - icon_state = "carpet" + icon_state = "carpet-255" + base_icon_state = "carpet" floor_tile = /obj/item/stack/tile/carpet smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET @@ -118,12 +119,10 @@ /turf/open/floor/holofloor/carpet/Initialize(mapload) . = ..() - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, update_icon)), 1) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, update_appearance)), 1) /turf/open/floor/holofloor/carpet/update_icon(updates=ALL) . = ..() - if(!.) - return FALSE if((updates & UPDATE_SMOOTHING) && overfloor_placed && smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) QUEUE_SMOOTH(src) diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 33132f7f232a..e5a25d297f46 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -126,7 +126,7 @@ ) ) for(var/turf/affected_turf as anything in template_and_bordering_turfs) - affected_turf.ImmediateCalculateAdjacentTurfs() + affected_turf.air_update_turf(TRUE, TRUE) affected_turf.levelupdate() /datum/map_template/proc/load_new_z(secret = FALSE) @@ -165,6 +165,16 @@ if((T.y+height) - 1 > world.maxy) return + // // Cache for sonic speed + // var/list/to_rebuild = SSair.adjacent_rebuild + // // iterate over turfs in the border and clear them from active atmos processing + // for(var/turf/border_turf as anything in CORNER_BLOCK_OFFSET(T, width + 2, height + 2, -1, -1)) + // SSair.remove_from_active(border_turf) + // to_rebuild -= border_turf + // for(var/turf/sub_turf as anything in border_turf.atmos_adjacent_turfs) + // sub_turf.atmos_adjacent_turfs?.Remove(border_turf) + // border_turf.atmos_adjacent_turfs?.Cut() + // Accept cached maps, but don't save them automatically - we don't want // ruins clogging up memory for the whole round. var/datum/parsed_map/parsed = cached_map || new(file(mappath)) diff --git a/code/modules/mapping/space_management/space_reservation.dm b/code/modules/mapping/space_management/space_reservation.dm index 2073e322c103..2809ae65e6c2 100644 --- a/code/modules/mapping/space_management/space_reservation.dm +++ b/code/modules/mapping/space_management/space_reservation.dm @@ -84,9 +84,9 @@ old_area.turfs_to_uncontain += cordon_turf cordon_area.contained_turfs += cordon_turf cordon_area.contents += cordon_turf - cordon_turf.ChangeTurf(/turf/cordon, /turf/cordon) // Its no longer unused, but its also not "used" cordon_turf.turf_flags &= ~UNUSED_RESERVATION_TURF + cordon_turf.ChangeTurf(/turf/cordon, /turf/cordon) SSmapping.unused_turfs["[cordon_turf.z]"] -= cordon_turf // still gets linked to us though SSmapping.used_turfs[cordon_turf] = src diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm index 0a00d28ff7fd..93e0322adc10 100644 --- a/code/modules/mining/aux_base.dm +++ b/code/modules/mining/aux_base.dm @@ -5,6 +5,7 @@ #define BAD_AREA 2 #define BAD_COORDS 3 #define BAD_TURF 4 +#define BAD_LAYER 5 #define SCIENCE_AMOUNT 500 // How much science to generate per minute @@ -108,13 +109,13 @@ data["status"] = "Recharging" else data["status"] = "In Transit" - for(var/obj/docking_port/stationary/S in SSshuttle.stationary) - if(!options.Find(S.id)) + for(var/obj/docking_port/stationary/S in SSshuttle.stationary_docking_ports) + if(!options.Find(S.port_destinations)) continue if(!M.check_dock(S, silent=TRUE)) continue var/list/location_data = list( - id = S.id, + id = S.shuttle_id, name = S.name ) data["locations"] += list(location_data) @@ -217,7 +218,7 @@ possible_destinations = "mining_home;mining_away;landing_zone_dock;mining_public;auxiliary_construction" /obj/machinery/computer/auxiliary_base/proc/set_landing_zone(turf/T, mob/user, no_restrictions) - var/obj/docking_port/mobile/auxiliary_base/base_dock = locate(/obj/docking_port/mobile/auxiliary_base) in SSshuttle.mobile + var/obj/docking_port/mobile/auxiliary_base/base_dock = locate(/obj/docking_port/mobile/auxiliary_base) in SSshuttle.mobile_docking_ports if(!base_dock) //Not all maps have an Aux base. This object is useless in that case. to_chat(user, span_warning("This station is not equipped with an auxiliary base. Please contact your Nanotrasen contractor.")) return @@ -242,7 +243,9 @@ var/turf/place = colony_turfs[i] if(!place) return BAD_COORDS - if(!istype(place.loc, /area/lavaland/surface) && !istype(place.loc, /area/icemoon/surface) && !istype(place.loc, /area/icemoon/underground) && !(istype(place.loc, /area/jungleland) && !istype(place.loc, /area/jungleland/explored)) ) + if(istype(place.loc, /area/icemoon/surface)) + return BAD_LAYER + if(!istype(place.loc, /area/lavaland/surface) && !istype(place.loc, /area/icemoon/underground) && !(istype(place.loc, /area/jungleland) && !istype(place.loc, /area/jungleland/explored)) ) return BAD_AREA if(disallowed_turf_types[place.type]) return BAD_TURF @@ -251,7 +254,8 @@ var/area/A = get_area(T) var/obj/docking_port/stationary/landing_zone = new /obj/docking_port/stationary(T) - landing_zone.id = "colony_drop([REF(src)])" + landing_zone.shuttle_id = "colony_drop([REF(src)])" + landing_zone.port_destinations = "colony_drop([REF(src)])" landing_zone.name = "Landing Zone ([T.x], [T.y])" landing_zone.dwidth = base_dock.dwidth landing_zone.dheight = base_dock.dheight @@ -260,7 +264,7 @@ landing_zone.setDir(base_dock.dir) landing_zone.area_type = A.type - possible_destinations += "[landing_zone.id];" + possible_destinations += "[landing_zone.shuttle_id];" //Serves as a nice mechanic to people get ready for the launch. minor_announce("Auxiliary base landing zone coordinates locked in for [A]. Launch command now available!") @@ -322,7 +326,7 @@ /obj/docking_port/mobile/auxiliary_base name = "auxiliary base" - id = "colony_drop" + shuttle_id = "colony_drop" //Reminder to map-makers to set these values equal to the size of your base. dheight = 4 dwidth = 4 @@ -332,13 +336,13 @@ /obj/docking_port/mobile/auxiliary_base/takeoff(list/old_turfs, list/new_turfs, list/moved_atoms, rotation, movement_direction, old_dock, area/underlying_old_area) for(var/i in new_turfs) var/turf/place = i - if(istype(place, /turf/closed/mineral)) + if(ismineralturf(place)) place.ScrapeAway() return ..() /obj/docking_port/stationary/public_mining_dock name = "public mining base dock" - id = "disabled" //The Aux Base has to leave before this can be used as a dock. + shuttle_id = "disabled" //The Aux Base has to leave before this can be used as a dock. //Should be checked on the map to ensure it matchs the mining shuttle dimensions. dwidth = 3 width = 7 @@ -388,14 +392,15 @@ return //Mining shuttles may not be created equal, so we find the map's shuttle dock and size accordingly. - for(var/S in SSshuttle.stationary) + for(var/S in SSshuttle.stationary_docking_ports) var/obj/docking_port/stationary/SM = S //SM is declared outside so it can be checked for null - if(SM.id == "mining_home" || SM.id == "mining_away") + if(SM.shuttle_id == "mining_home" || SM.shuttle_id == "mining_away") var/area/A = get_area(landing_spot) Mport = new(landing_spot) - Mport.id = "landing_zone_dock" + Mport.shuttle_id = "landing_zone_dock" + Mport.port_destinations = "landing_zone_dock" Mport.name = "auxiliary base landing site" Mport.dwidth = SM.dwidth Mport.dheight = SM.dheight @@ -411,9 +416,8 @@ var/obj/docking_port/mobile/mining_shuttle var/list/landing_turfs = list() //List of turfs where the mining shuttle may land. - for(var/S in SSshuttle.mobile) - var/obj/docking_port/mobile/MS = S - if(MS.id != "mining") + for(var/obj/docking_port/mobile/MS as anything in SSshuttle.mobile_docking_ports) + if(MS.shuttle_id != "mining") continue mining_shuttle = MS landing_turfs = mining_shuttle.return_ordered_turfs(x,y,z,dir) @@ -421,7 +425,7 @@ if(!mining_shuttle) //Not having a mining shuttle is a map issue to_chat(user, span_warning("No mining shuttle signal detected. Please contact Nanotrasen Support.")) - SSshuttle.stationary.Remove(Mport) + SSshuttle.stationary_docking_ports.Remove(Mport) qdel(Mport) return @@ -429,18 +433,18 @@ var/turf/L = landing_turfs[i] if(!L) //This happens at map edges to_chat(user, span_warning("Unable to secure a valid docking zone. Please try again in an open area near, but not within the auxiliary mining base.")) - SSshuttle.stationary.Remove(Mport) + SSshuttle.stationary_docking_ports.Remove(Mport) qdel(Mport) return if(istype(get_area(L), /area/shuttle/auxiliary_base)) to_chat(user, span_warning("The mining shuttle must not land within the mining base itself.")) - SSshuttle.stationary.Remove(Mport) + SSshuttle.stationary_docking_ports.Remove(Mport) qdel(Mport) return if(mining_shuttle.canDock(Mport) != SHUTTLE_CAN_DOCK) to_chat(user, span_warning("Unable to secure a valid docking zone. Please try again in an open area near, but not within the auxiliary mining base.")) - SSshuttle.stationary.Remove(Mport) + SSshuttle.stationary_docking_ports.Remove(Mport) qdel(Mport) return diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 9e1d99726651..5e96066ab7da 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -421,7 +421,7 @@ if(SHUTTLE_RECALL, SHUTTLE_IDLE) SSticker.mode.make_antag_chance(humanc) if(SHUTTLE_CALL) - if(SSshuttle.emergency.timeLeft(1) > initial(SSshuttle.emergencyCallTime)*0.5) + if(SSshuttle.emergency.timeLeft(1) > initial(SSshuttle.emergency_call_time)*0.5) SSticker.mode.make_antag_chance(humanc) if(humanc && CONFIG_GET(flag/roundstart_traits)) diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index f09a96c64678..7798c48e080d 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -237,12 +237,12 @@ var/turf/open/floor/F = target anchored = TRUE mode = BOT_REPAIRING - F.ReplaceWithLattice() + if(isplatingturf(F)) + F.attempt_lattice_replacement() + else + F.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) audible_message(span_danger("[src] makes an excited booping sound.")) - spawn(5) - anchored = FALSE - mode = BOT_IDLE - target = null + addtimer(CALLBACK(src, PROC_REF(go_idle)), 0.5 SECONDS) path = list() return if(path.len == 0) @@ -266,6 +266,11 @@ oldloc = loc +/mob/living/simple_animal/bot/floorbot/proc/go_idle() + anchored = FALSE + mode = BOT_IDLE + target = null + /mob/living/simple_animal/bot/floorbot/proc/is_hull_breach(turf/t) //Ignore space tiles not considered part of a structure, also ignores shuttle docking areas. var/area/t_area = get_area(t) if(istype(t_area, /area/space) || istype(t_area, /area/solar) || istype(t_area, /area/asteroid)) diff --git a/code/modules/modular_computers/file_system/programs/supply/budgetordering.dm b/code/modules/modular_computers/file_system/programs/supply/budgetordering.dm index c9f3ac343a79..205e006f48bd 100644 --- a/code/modules/modular_computers/file_system/programs/supply/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/supply/budgetordering.dm @@ -130,11 +130,11 @@ var/message = "Remember to stamp and send back the supply manifests." if(SSshuttle.centcom_message) message = SSshuttle.centcom_message - if(SSshuttle.supplyBlocked) + if(SSshuttle.supply_blocked) message = blockade_warning data["message"] = message data["cart"] = list() - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) + for(var/datum/supply_order/SO in SSshuttle.shopping_list) data["cart"] += list(list( "object" = SO.pack.name, "cost" = SO.pack.get_cost(), @@ -145,7 +145,7 @@ )) data["requests"] = list() - for(var/datum/supply_order/SO in SSshuttle.requestlist) + for(var/datum/supply_order/SO in SSshuttle.request_list) data["requests"] += list(list( "object" = SO.pack.name, "cost" = SO.pack.get_cost(), @@ -166,7 +166,7 @@ if(!SSshuttle.supply.canMove()) computer.say(safety_warning) return - if(SSshuttle.supplyBlocked) + if(SSshuttle.supply_blocked) computer.say(blockade_warning) return if(SSshuttle.supply.getDockedId() == "supply_home") @@ -182,7 +182,7 @@ if("loan") if(!SSshuttle.shuttle_loan) return - if(SSshuttle.supplyBlocked) + if(SSshuttle.supply_blocked) computer.say(blockade_warning) return else if(SSshuttle.supply.mode != SHUTTLE_IDLE) @@ -246,39 +246,39 @@ var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account, account?.account_holder) SO.generateRequisition(T) if((requestonly && !self_paid) || !(card_slot?.GetID())) - SSshuttle.requestlist += SO + SSshuttle.request_list += SO else - SSshuttle.shoppinglist += SO + SSshuttle.shopping_list += SO if(self_paid || budget_order) computer.say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.") . = TRUE if("remove") var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) + for(var/datum/supply_order/SO in SSshuttle.shopping_list) if(SO.id == id) - SSshuttle.shoppinglist -= SO + SSshuttle.shopping_list -= SO . = TRUE break if("clear") - SSshuttle.shoppinglist.Cut() + SSshuttle.shopping_list.Cut() . = TRUE if("approve") var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.requestlist) + for(var/datum/supply_order/SO in SSshuttle.request_list) if(SO.id == id) - SSshuttle.requestlist -= SO - SSshuttle.shoppinglist += SO + SSshuttle.request_list -= SO + SSshuttle.shopping_list += SO . = TRUE break if("deny") var/id = text2num(params["id"]) - for(var/datum/supply_order/SO in SSshuttle.requestlist) + for(var/datum/supply_order/SO in SSshuttle.request_list) if(SO.id == id) - SSshuttle.requestlist -= SO + SSshuttle.request_list -= SO . = TRUE break if("denyall") - SSshuttle.requestlist.Cut() + SSshuttle.request_list.Cut() . = TRUE if("toggleprivate") self_paid = !self_paid diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 2bd439510abd..d395137c6a94 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -793,4 +793,4 @@ id = "mindmachine_pod" build_path = /obj/item/circuitboard/machine/mindmachine_pod category = list("Medical Machinery") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL \ No newline at end of file + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL diff --git a/code/modules/ruins/spaceruin_code/caravanambush.dm b/code/modules/ruins/spaceruin_code/caravanambush.dm index 273e918598fa..d71ee0b2108b 100644 --- a/code/modules/ruins/spaceruin_code/caravanambush.dm +++ b/code/modules/ruins/spaceruin_code/caravanambush.dm @@ -83,7 +83,7 @@ shuttleId = "caravantrade1" lock_override = NONE shuttlePortId = "caravantrade1_custom" - jumpto_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1, "caravantrade1_ambush" = 1) + jump_to_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1, "caravantrade1_ambush" = 1) view_range = 6.5 x_offset = -5 y_offset = -5 @@ -107,7 +107,7 @@ shuttleId = "caravanpirate" lock_override = NONE shuttlePortId = "caravanpirate_custom" - jumpto_ports = list("caravanpirate_ambush" = 1) + jump_to_ports = list("caravanpirate_ambush" = 1) view_range = 6.5 x_offset = 3 y_offset = -6 @@ -131,7 +131,7 @@ shuttleId = "caravansyndicate1" lock_override = NONE shuttlePortId = "caravansyndicate1_custom" - jumpto_ports = list("caravansyndicate1_ambush" = 1, "listeningpost" = 1) + jump_to_ports = list("caravansyndicate1_ambush" = 1, "listeningpost" = 1) view_range = 0 x_offset = 2 y_offset = 0 @@ -155,7 +155,7 @@ shuttleId = "caravansyndicate2" lock_override = NONE shuttlePortId = "caravansyndicate2_custom" - jumpto_ports = list("caravansyndicate2_ambush" = 1, "listeningpost" = 1) + jump_to_ports = list("caravansyndicate2_ambush" = 1, "listeningpost" = 1) view_range = 0 x_offset = 0 y_offset = 2 @@ -179,7 +179,7 @@ shuttleId = "caravansyndicate3" lock_override = NONE shuttlePortId = "caravansyndicate3_custom" - jumpto_ports = list("caravansyndicate3_ambush" = 1, "listeningpost" = 1) + jump_to_ports = list("caravansyndicate3_ambush" = 1, "listeningpost" = 1) view_range = 2.5 x_offset = -1 y_offset = -3 diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index 64fe1af62370..48f78a7e59d4 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -1,10 +1,7 @@ /obj/docking_port/mobile/arrivals name = "arrivals shuttle" - id = "arrivals" + shuttle_id = "arrivals" - dwidth = 3 - width = 7 - height = 15 dir = WEST port_direction = SOUTH diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index 68dfb9704089..b569ec22bfdf 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -1,6 +1,6 @@ /obj/docking_port/mobile/assault_pod name = "assault pod" - id = "steel_rain" + shuttle_id = "steel_rain" dwidth = 3 width = 7 height = 7 @@ -46,7 +46,8 @@ if(!T) return var/obj/docking_port/stationary/landing_zone = new /obj/docking_port/stationary(T) - landing_zone.id = "assault_pod([REF(src)])" + landing_zone.shuttle_id = "assault_pod([REF(src)])" + landing_zone.port_destinations = "assault_pod([REF(src)])" landing_zone.name = "Landing Zone" landing_zone.dwidth = dwidth landing_zone.dheight = dheight @@ -56,7 +57,7 @@ for(var/obj/machinery/computer/shuttle/S in GLOB.machines) if(S.shuttleId == shuttle_id) - S.possible_destinations = "[landing_zone.id]" + S.possible_destinations = "[landing_zone.shuttle_id]" to_chat(user, "Landing zone set.") diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index b924566f58c3..19dcfd4ee5cd 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -1,3 +1,11 @@ +#define SHUTTLE_CONSOLE_ACCESSDENIED "accessdenied" +#define SHUTTLE_CONSOLE_ENDGAME "endgame" +#define SHUTTLE_CONSOLE_RECHARGING "recharging" +#define SHUTTLE_CONSOLE_INTRANSIT "intransit" +#define SHUTTLE_CONSOLE_DESTINVALID "destinvalid" +#define SHUTTLE_CONSOLE_SUCCESS "success" +#define SHUTTLE_CONSOLE_ERROR "error" + /obj/machinery/computer/shuttle name = "shuttle console" desc = "A shuttle control computer." @@ -15,9 +23,17 @@ var/no_destination_swap = FALSE /// ID of the currently selected destination of the attached shuttle var/destination + /// If the console controls are locked + var/locked = FALSE + /// List of head revs who have already clicked through the warning about not using the console + var/static/list/dumb_rev_heads = list() /// Authorization request cooldown to prevent request spam to admin staff COOLDOWN_DECLARE(request_cooldown) +/obj/machinery/computer/shuttle/Initialize(mapload) + . = ..() + connect_to_shuttle(mapload, SSshuttle.get_containing_shuttle(src)) + /obj/machinery/computer/shuttle/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -49,13 +65,13 @@ data["status"] = "Recharging" else data["status"] = "In Transit" - for(var/obj/docking_port/stationary/S in SSshuttle.stationary) - if(!options.Find(S.id)) + for(var/obj/docking_port/stationary/S in SSshuttle.stationary_docking_ports) + if(!options.Find(S.port_destinations)) continue if(!M.check_dock(S, silent = TRUE)) continue var/list/location_data = list( - id = S.id, + id = S.shuttle_id, name = S.name ) data["locations"] += list(location_data) @@ -77,6 +93,69 @@ /obj/machinery/computer/shuttle/proc/launch_check(mob/user) return TRUE +/** + * Returns a list of currently valid destinations for this shuttle console, + * taking into account its list of allowed destinations, their current state, and the shuttle's current location +**/ +/obj/machinery/computer/shuttle/proc/get_valid_destinations() + var/list/destination_list = params2list(possible_destinations) + var/obj/docking_port/mobile/mobile_docking_port = SSshuttle.getShuttle(shuttleId) + var/obj/docking_port/stationary/current_destination = mobile_docking_port.destination + var/list/valid_destinations = list() + for(var/obj/docking_port/stationary/stationary_docking_port in SSshuttle.stationary_docking_ports) + if(!destination_list.Find(stationary_docking_port.port_destinations)) + continue + if(!mobile_docking_port.check_dock(stationary_docking_port, silent = TRUE)) + continue + if(stationary_docking_port == current_destination) + continue + var/list/location_data = list( + id = stationary_docking_port.shuttle_id, + name = stationary_docking_port.name + ) + valid_destinations += list(location_data) + return valid_destinations + +/** + * Attempts to send the linked shuttle to dest_id, checking various sanity checks to see if it can move or not + * + * Arguments: + * * dest_id - The ID of the stationary docking port to send the shuttle to + * * user - The mob that used the console + */ +/obj/machinery/computer/shuttle/proc/send_shuttle(dest_id, mob/user) + if(!launch_check(user)) + return SHUTTLE_CONSOLE_ACCESSDENIED + var/obj/docking_port/mobile/shuttle_port = SSshuttle.getShuttle(shuttleId) + if(shuttle_port.launch_status == ENDGAME_LAUNCHED) + return SHUTTLE_CONSOLE_ENDGAME + if(no_destination_swap) + if(shuttle_port.mode == SHUTTLE_RECHARGING) + return SHUTTLE_CONSOLE_RECHARGING + if(shuttle_port.mode != SHUTTLE_IDLE) + return SHUTTLE_CONSOLE_INTRANSIT + //check to see if the dest_id passed from tgui is actually a valid destination + var/list/dest_list = get_valid_destinations() + var/validdest = FALSE + for(var/list/dest_data in dest_list) + if(dest_data["id"] == dest_id) + validdest = TRUE //Found our destination, we can skip ahead now + break + if(!validdest) //Didn't find our destination in the list of valid destinations, something bad happening + if(!isnull(user.client)) + log_admin("Warning: possible href exploit by [key_name(user)] - Attempted to dock [src] to illegal target location \"[url_encode(dest_id)]\"") + message_admins("Warning: possible href exploit by [key_name_admin(user)] [ADMIN_FLW(user)] - Attempted to dock [src] to illegal target location \"[url_encode(dest_id)]\"") + else + stack_trace("[user] ([user.type]) tried to send the shuttle [src] to the target location [dest_id], but the target location was not found in the list of valid destinations.") + return SHUTTLE_CONSOLE_DESTINVALID + switch(SSshuttle.moveShuttle(shuttleId, dest_id, TRUE)) + if(DOCKING_SUCCESS) + say("Shuttle departing. Please stand away from the doors.") + log_shuttle("[key_name(user)] has sent shuttle \"[shuttleId]\" towards \"[dest_id]\", using [src].") + return SHUTTLE_CONSOLE_SUCCESS + else + return SHUTTLE_CONSOLE_ERROR + /obj/machinery/computer/shuttle/ui_act(action, params) . = ..() if(.) @@ -135,6 +214,22 @@ to_chat(user, span_notice("You fried the consoles ID checking system.")) return TRUE -/obj/machinery/computer/shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) - if(port && (shuttleId == initial(shuttleId) || override)) - shuttleId = port.id +/obj/machinery/computer/shuttle/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) + if(!mapload) + return + if(!port) + return + //Remove old custom port id and ";;" + var/find_old = findtextEx(possible_destinations, "[shuttleId]_custom") + if(find_old) + possible_destinations = replacetext(replacetextEx(possible_destinations, "[shuttleId]_custom", ""), ";;", ";") + shuttleId = port.shuttle_id + possible_destinations += ";[port.shuttle_id]_custom" + +#undef SHUTTLE_CONSOLE_ACCESSDENIED +#undef SHUTTLE_CONSOLE_ENDGAME +#undef SHUTTLE_CONSOLE_RECHARGING +#undef SHUTTLE_CONSOLE_INTRANSIT +#undef SHUTTLE_CONSOLE_DESTINVALID +#undef SHUTTLE_CONSOLE_SUCCESS +#undef SHUTTLE_CONSOLE_ERROR diff --git a/code/modules/shuttle/custom_shuttle.dm b/code/modules/shuttle/custom_shuttle.dm index 014edf3e363a..23559483ed53 100644 --- a/code/modules/shuttle/custom_shuttle.dm +++ b/code/modules/shuttle/custom_shuttle.dm @@ -50,8 +50,8 @@ dat += "Fuel Consumption: [calculated_consumption]units per distance
    " dat += "Engine Cooldown: [calculated_cooldown]s
    " var/destination_found - for(var/obj/docking_port/stationary/S in SSshuttle.stationary) - if(!options.Find(S.id)) + for(var/obj/docking_port/stationary/S in SSshuttle.stationary_docking_ports) + if(!options.Find(S.port_destinations)) continue if(!M.check_dock(S, silent=TRUE)) continue @@ -59,7 +59,7 @@ break destination_found = TRUE var/dist = round(calculateDistance(S)) - dat += "
    Target [S.name] (Dist: [dist] | Fuel Cost: [round(dist * calculated_consumption)] | Time: [round(dist / calculated_speed)])
    " + dat += "Target [S.name] (Dist: [dist] | Fuel Cost: [round(dist * calculated_consumption)] | Time: [round(dist / calculated_speed)])
    " if(!destination_found) dat += "No valid destinations
    " dat += "
    [targetLocation ? "Target Location : [targetLocation]" : "No Target Location"]" @@ -218,9 +218,17 @@ to_chat(usr, "Unable to comply.") return -/obj/machinery/computer/custom_shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) - if(port && (shuttleId == initial(shuttleId) || override)) - linkShuttle(port.id) +/obj/machinery/computer/custom_shuttle/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) + if(!mapload) + return + if(!port) + return + //Remove old custom port id and ";;" + var/find_old = findtextEx(possible_destinations, "[shuttleId]_custom") + if(find_old) + possible_destinations = replacetext(replacetextEx(possible_destinations, "[shuttleId]_custom", ""), ";;", ";") + shuttleId = port.shuttle_id + possible_destinations += ";[port.shuttle_id]_custom" //Custom shuttle docker locations /obj/machinery/computer/camera_advanced/shuttle_docker/custom @@ -233,7 +241,7 @@ /turf/open/floor/plating/ashplanet, /turf/open/floor/plating/asteroid, /turf/open/floor/plating/lavaland_baseturf) - jumpto_ports = list("whiteship_home" = 1) + jump_to_ports = list("whiteship_home" = 1) view_range = 12 designate_time = 100 circuit = /obj/item/circuitboard/computer/shuttle/docker diff --git a/code/modules/shuttle/docking.dm b/code/modules/shuttle/docking.dm index e84290558d5a..ecae0cbe6b69 100644 --- a/code/modules/shuttle/docking.dm +++ b/code/modules/shuttle/docking.dm @@ -46,11 +46,11 @@ rotation = SIMPLIFY_DEGREES(rotation) if(!movement_direction) - movement_direction = turn(preferred_direction, 180) + movement_direction = REVERSE_DIR(preferred_direction) var/list/moved_atoms = list() //Everything not a turf that gets moved in the shuttle var/list/areas_to_move = list() //unique assoc list of areas on turfs being moved - + //log_world("preflight_check arguments [length(old_turfs)], [length(new_turfs)], [areas_to_move], [rotation]") . = preflight_check(old_turfs, new_turfs, areas_to_move, rotation) if(.) remove_ripples() @@ -103,7 +103,7 @@ return DOCKING_SUCCESS /obj/docking_port/mobile/proc/preflight_check(list/old_turfs, list/new_turfs, list/areas_to_move, rotation) - for(var/i in 1 to old_turfs.len) + for(var/i in 1 to length(old_turfs)) CHECK_TICK var/turf/oldT = old_turfs[i] var/turf/newT = new_turfs[i] @@ -121,7 +121,6 @@ continue move_mode = moving_atom.beforeShuttleMove(newT, rotation, move_mode, src) //atoms - oldT.beforeShuttleMove(newT) move_mode = oldT.fromShuttleMove(newT, move_mode) //turfs move_mode = newT.toShuttleMove(oldT, move_mode, src) //turfs @@ -131,25 +130,26 @@ old_turfs[oldT] = move_mode /obj/docking_port/mobile/proc/takeoff(list/old_turfs, list/new_turfs, list/moved_atoms, rotation, movement_direction, old_dock, area/underlying_old_area) - for(var/i in 1 to old_turfs.len) var/turf/oldT = old_turfs[i] var/turf/newT = new_turfs[i] var/move_mode = old_turfs[oldT] + + if(move_mode & MOVE_TURF) + oldT.onShuttleMove(newT, movement_force, movement_direction) //turfs + + if(move_mode & MOVE_AREA) + var/area/shuttle_area = oldT.loc + shuttle_area.onShuttleMove(oldT, newT, underlying_old_area) //areas + if(move_mode & MOVE_CONTENTS) for(var/k in oldT) var/atom/movable/moving_atom = k if(moving_atom.loc != oldT) //fix for multi-tile objects continue - moving_atom.onShuttleMove(newT, oldT, movement_force, movement_direction, old_dock, src) //atoms + moving_atom.onShuttleMove(newT, oldT, movement_force, movement_direction, old_dock, src) //atoms moved_atoms[moving_atom] = oldT - if(move_mode & MOVE_TURF) - oldT.onShuttleMove(newT, movement_force, movement_direction) //turfs - - if(move_mode & MOVE_AREA) - var/area/shuttle_area = oldT.loc - shuttle_area.onShuttleMove(oldT, newT, underlying_old_area) //areas /obj/docking_port/mobile/proc/cleanup_runway(obj/docking_port/stationary/new_dock, list/old_turfs, list/new_turfs, list/areas_to_move, list/moved_atoms, rotation, movement_direction, area/underlying_old_area) underlying_old_area.afterShuttleMove(0) @@ -162,15 +162,27 @@ for(var/i in 1 to areas_to_move.len) CHECK_TICK var/area/internal_area = areas_to_move[i] - internal_area.afterShuttleMove(new_parallax_dir) //areas + internal_area.afterShuttleMove(new_parallax_dir) //areas for(var/i in 1 to old_turfs.len) CHECK_TICK if(!(old_turfs[old_turfs[i]] & MOVE_TURF)) continue - var/turf/oldT = old_turfs[i] - var/turf/newT = new_turfs[i] - newT.afterShuttleMove(oldT, rotation) //turfs + var/turf/old_turf = old_turfs[i] + var/turf/new_turf = new_turfs[i] + new_turf.afterShuttleMove(old_turf, rotation) //turfs + var/turf/new_ceiling = get_step_multiz(new_turf, UP) // check if a ceiling is needed + if(new_ceiling) + // generate ceiling + if(istype(new_ceiling, /turf/open/openspace)) // why is this needed? because we have 2 different typepaths for openspace + new_ceiling.ChangeTurf(/turf/open/floor/engine/hull/ceiling, list(/turf/open/openspace)) + else if (istype(new_ceiling, /turf/open/space/openspace)) + new_ceiling.ChangeTurf(/turf/open/floor/engine/hull/ceiling, list(/turf/open/space/openspace)) + var/turf/old_ceiling = get_step_multiz(old_turf, UP) + if(old_ceiling && istype(old_ceiling, /turf/open/floor/engine/hull/ceiling)) // check if a ceiling was generated previously + // remove old ceiling + var/turf/open/floor/engine/hull/ceiling/old_shuttle_ceiling = old_ceiling + old_shuttle_ceiling.ChangeTurf(old_shuttle_ceiling.old_turf_type) for(var/i in 1 to moved_atoms.len) CHECK_TICK diff --git a/code/modules/shuttle/elevator.dm b/code/modules/shuttle/elevator.dm index de5d88ee17c9..73d16d11708e 100644 --- a/code/modules/shuttle/elevator.dm +++ b/code/modules/shuttle/elevator.dm @@ -1,6 +1,6 @@ /obj/docking_port/mobile/elevator name = "elevator" - id = "elevator" + shuttle_id = "elevator" dwidth = 3 width = 7 height = 7 diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 7c9413135eb9..81351e5cc145 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -199,15 +199,16 @@ /obj/docking_port/mobile/emergency name = "emergency shuttle" - id = "emergency" - - dwidth = 9 - width = 22 - height = 11 + shuttle_id = "emergency" dir = EAST port_direction = WEST var/sound_played = 0 //If the launch sound has been sent to all players on the shuttle itself +/obj/docking_port/mobile/emergency/Initialize(mapload) + . = ..() + + //setup_shuttle_events() + /obj/docking_port/mobile/emergency/canDock(obj/docking_port/stationary/S) return SHUTTLE_CAN_DOCK //If the emergency shuttle can't move, the whole game breaks, so it will force itself to land even if it has to crush a few departments in the process @@ -234,7 +235,7 @@ set_coefficient = 1 else set_coefficient = 0.5 - var/call_time = SSshuttle.emergencyCallTime * set_coefficient * engine_coeff + var/call_time = SSshuttle.emergency_call_time * set_coefficient * engine_coeff switch(mode) // The shuttle can not normally be called while "recalling", so // if this proc is called, it's via admin fiat @@ -247,28 +248,28 @@ SSshuttle.emergencyCallAmount++ if(prob(70)) - SSshuttle.emergencyLastCallLoc = signalOrigin + SSshuttle.emergency_last_call_loc = signalOrigin else - SSshuttle.emergencyLastCallLoc = null + SSshuttle.emergency_last_call_loc = null var/emergency_reason = "\nNature of emergency:\n\n[reason]" - priority_announce("The emergency shuttle has been called. [GLOB.security_level >= SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[html_decode(emergency_reason)][SSshuttle.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, ANNOUNCER_SHUTTLECALLED, "Priority") + priority_announce("The emergency shuttle has been called. [GLOB.security_level >= SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[html_decode(emergency_reason)][SSshuttle.emergency_last_call_loc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, ANNOUNCER_SHUTTLECALLED, "Priority") /obj/docking_port/mobile/emergency/cancel(area/signalOrigin) if(mode != SHUTTLE_CALL) return - if(SSshuttle.emergencyNoRecall) + if(SSshuttle.emergency_no_recall) return invertTimer() mode = SHUTTLE_RECALL if(prob(70)) - SSshuttle.emergencyLastCallLoc = signalOrigin + SSshuttle.emergency_last_call_loc = signalOrigin else - SSshuttle.emergencyLastCallLoc = null + SSshuttle.emergency_last_call_loc = null - priority_announce("The emergency shuttle has been recalled.[SSshuttle.emergencyLastCallLoc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]", null, ANNOUNCER_SHUTTLERECALLED, "Priority") + priority_announce("The emergency shuttle has been recalled.[SSshuttle.emergency_last_call_loc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]", null, ANNOUNCER_SHUTTLERECALLED, "Priority") /obj/docking_port/mobile/emergency/proc/is_hijacked() var/has_people = FALSE @@ -360,7 +361,7 @@ setTimer(20) return mode = SHUTTLE_DOCKED - setTimer(SSshuttle.emergencyDockTime) + setTimer(SSshuttle.emergency_dock_time) send2irc("Server", "The Emergency Shuttle ([name]) has docked with the station.") // yogs - make it say the name of the shuttle priority_announce("[SSshuttle.emergency] has docked with the station. You have [timeLeft(600)] minutes to board the Emergency Shuttle.", null, ANNOUNCER_SHUTTLEDOCK, "Priority") ShuttleDBStuff() @@ -372,7 +373,7 @@ SSshuttle.checkHostileEnvironment() if(mode == SHUTTLE_STRANDED) return - for(var/A in SSshuttle.mobile) + for(var/A in SSshuttle.mobile_docking_ports) var/obj/docking_port/mobile/M = A if(M.launch_status == UNLAUNCHED) //Pods will not launch from the mine/planet, and other ships won't launch unless we tell them to. M.check_transit_zone() @@ -384,7 +385,7 @@ return success &= (check_transit_zone() == TRANSIT_READY) - for(var/A in SSshuttle.mobile) + for(var/A in SSshuttle.mobile_docking_ports) var/obj/docking_port/mobile/M = A if(M.launch_status == UNLAUNCHED) success &= (M.check_transit_zone() == TRANSIT_READY) @@ -398,9 +399,9 @@ areas += E hyperspace_sound(HYPERSPACE_WARMUP, areas) - if(time_left <= 0 && !SSshuttle.emergencyNoEscape) + if(time_left <= 0 && !SSshuttle.emergency_no_escape) //move each escape pod (or applicable spaceship) to its corresponding transit dock - for(var/A in SSshuttle.mobile) + for(var/A in SSshuttle.mobile_docking_ports) var/obj/docking_port/mobile/M = A M.on_emergency_launch() @@ -412,7 +413,7 @@ enterTransit() mode = SHUTTLE_ESCAPE launch_status = ENDGAME_LAUNCHED - setTimer(SSshuttle.emergencyEscapeTime * engine_coeff) + setTimer(SSshuttle.emergency_escape_time * engine_coeff) priority_announce("The Emergency Shuttle has left the station. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.", null, null, "Priority") if(SHUTTLE_STRANDED) @@ -433,7 +434,7 @@ break if(area_parallax) parallax_slowdown() - for(var/A in SSshuttle.mobile) + for(var/A in SSshuttle.mobile_docking_ports) var/obj/docking_port/mobile/M = A if(M.launch_status == ENDGAME_LAUNCHED) if(istype(M, /obj/docking_port/mobile/pod)) @@ -441,7 +442,7 @@ if(time_left <= 0) //move each escape pod to its corresponding escape dock - for(var/A in SSshuttle.mobile) + for(var/A in SSshuttle.mobile_docking_ports) var/obj/docking_port/mobile/M = A M.on_emergency_dock() @@ -465,16 +466,13 @@ mode = SHUTTLE_ESCAPE launch_status = ENDGAME_LAUNCHED - setTimer(SSshuttle.emergencyEscapeTime) + setTimer(SSshuttle.emergency_escape_time) priority_announce("The Emergency Shuttle preparing for direct jump. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.", null, null, "Priority") /obj/docking_port/mobile/pod name = "escape pod" - id = "pod" - dwidth = 1 - width = 3 - height = 4 + shuttle_id = "pod" launch_status = UNLAUNCHED /obj/docking_port/mobile/pod/request(obj/docking_port/stationary/S) @@ -512,30 +510,40 @@ ENABLE_BITFIELD(obj_flags, EMAGGED) to_chat(user, span_warning("You fry the pod's alert level checking system.")) -/obj/machinery/computer/shuttle/pod/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) +/obj/machinery/computer/shuttle/pod/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) . = ..() - if(possible_destinations == initial(possible_destinations) || override) - possible_destinations = "pod_lavaland[idnum]" + if(port) + //Checks if the computer has already added the shuttle destination with the initial id + //This has to be done because connect_to_shuttle is called again after its ID is updated + //due to conflicting id names + var/base_shuttle_destination = ";[initial(port.shuttle_id)]_lavaland" + var/shuttle_destination = ";[port.shuttle_id]_lavaland" + + var/position = findtext(possible_destinations, base_shuttle_destination) + if(position) + if(base_shuttle_destination == shuttle_destination) + return + possible_destinations = splicetext(possible_destinations, position, position + length(base_shuttle_destination), shuttle_destination) + return + + possible_destinations += shuttle_destination /obj/docking_port/stationary/random name = "escape pod" - id = "pod" - dwidth = 1 - width = 3 - height = 4 - var/areacheck = /area/lavaland/surface/outdoors + shuttle_id = "pod" + hidden = TRUE + override_can_dock_checks = TRUE + /// The area the pod tries to land at + var/target_area = /area/lavaland/surface/outdoors + /// Minimal distance from the map edge, setting this too low can result in shuttle landing on the edge and getting "sliced" var/edge_distance = 16 - // Minimal distance from the map edge, setting this too low can result in shuttle landing on the edge and getting "sliced" - -/obj/docking_port/stationary/random/icemoon - areacheck = /area/icemoon/surface/outdoors/unexplored/danger /obj/docking_port/stationary/random/Initialize(mapload) . = ..() if(!mapload) return - var/list/turfs = get_area_turfs(areacheck) + var/list/turfs = get_area_turfs(target_area) var/original_len = turfs.len //YOGS EDIT if(!original_len) @@ -550,9 +558,12 @@ return // Fallback: couldn't find anything - WARNING("docking port '[id]' could not be randomly placed in [areacheck]: of [original_len] turfs, none were suitable") + WARNING("docking port '[shuttle_id]' could not be randomly placed in [target_area]: of [original_len] turfs, none were suitable") return INITIALIZE_HINT_QDEL + +/obj/docking_port/stationary/random/icemoon + target_area = /area/icemoon/surface/outdoors/unexplored/danger //Pod suits/pickaxes @@ -623,7 +634,7 @@ /obj/docking_port/mobile/emergency/backup name = "backup shuttle" - id = "backup" + shuttle_id = "backup" dir = EAST /obj/docking_port/mobile/emergency/backup/Initialize(mapload) @@ -636,7 +647,12 @@ SSshuttle.emergency = current_emergency SSshuttle.backup_shuttle = src -/obj/docking_port/mobile/emergency/shuttle_build/register() +/obj/docking_port/mobile/emergency/backup/Destroy(force) + if(SSshuttle.backup_shuttle == src) + SSshuttle.backup_shuttle = null + return ..() + +/obj/docking_port/mobile/emergency/shuttle_build/postregister() . = ..() initiate_docking(SSshuttle.getDock("emergency_home")) diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index ab2f851020b4..fa1d3ea51e40 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -3,14 +3,21 @@ desc = "Used to designate a precise transit location for a spacecraft." jump_action = null should_supress_view_changes = FALSE - var/datum/action/innate/shuttledocker_rotate/rotate_action = new - var/datum/action/innate/shuttledocker_place/place_action = new + + // Docking cameras should only interact with their current z-level. + move_up_action = null + move_down_action = null + var/shuttleId = "" var/shuttlePortId = "" var/shuttlePortName = "custom location" - var/list/jumpto_ports = list() //hashset of ports to jump to and ignore for collision purposes - var/obj/docking_port/stationary/my_port //the custom docking port placed by this console - var/obj/docking_port/mobile/shuttle_port //the mobile docking port of the connected shuttle + /// Hashset of ports to jump to and ignore for collision purposes + var/list/jump_to_ports = list() + /// The custom docking port placed by this console + var/obj/docking_port/stationary/my_port + /// The mobile docking port of the connected shuttle + var/obj/docking_port/mobile/shuttle_port + // Traits forbided for custom docking var/list/locked_traits = list(ZTRAIT_RESERVED, ZTRAIT_CENTCOM, ZTRAIT_AWAY, ZTRAIT_REEBE) //traits forbided for custom docking var/view_range = 0 var/x_offset = 0 @@ -24,18 +31,51 @@ /obj/machinery/computer/camera_advanced/shuttle_docker/Initialize(mapload) . = ..() - GLOB.navigation_computers += src - for(var/V in SSshuttle.stationary) - if(!V) + actions += new /datum/action/innate/shuttledocker_rotate(src) + actions += new /datum/action/innate/shuttledocker_place(src) + + set_init_ports() + + if(connect_to_shuttle(mapload, SSshuttle.get_containing_shuttle(src))) + for(var/obj/docking_port/stationary/port as anything in SSshuttle.stationary_docking_ports) + if(port.shuttle_id == shuttleId) + add_jumpable_port(port.shuttle_id) + + for(var/obj/docking_port/stationary/port as anything in SSshuttle.stationary_docking_ports) + if(!port) continue - var/obj/docking_port/stationary/S = V - if(jumpto_ports[S.id]) - z_lock |= S.z + if(jump_to_ports[port.shuttle_id]) + z_lock |= port.z whitelist_turfs = typecacheof(whitelist_turfs) /obj/machinery/computer/camera_advanced/shuttle_docker/Destroy() . = ..() - GLOB.navigation_computers -= src + if(my_port?.get_docked()) + my_port.delete_after = TRUE + my_port.shuttle_id = null + my_port.name = "Old [my_port.name]" + my_port = null + else + QDEL_NULL(my_port) + +/// "Initializes" any default port ids we have, done so add_jumpable_port can be a proper setter +/obj/machinery/computer/camera_advanced/shuttle_docker/proc/set_init_ports() + var/list/init_ports = jump_to_ports.Copy() + jump_to_ports = list() //Reset it so we don't get dupes + for(var/port_id in init_ports) + add_jumpable_port(port_id) + +/obj/machinery/computer/camera_advanced/shuttle_docker/proc/add_jumpable_port(port_id) + if(!length(jump_to_ports)) + actions += new /datum/action/innate/camera_jump/shuttle_docker(src) + jump_to_ports[port_id] = TRUE + +/obj/machinery/computer/camera_advanced/shuttle_docker/proc/remove_jumpable_port(port_id) + jump_to_ports -= port_id + if(!length(jump_to_ports)) + var/datum/action/to_remove = locate(/datum/action/innate/camera_jump/shuttle_docker) in actions + actions -= to_remove + qdel(to_remove) /obj/machinery/computer/camera_advanced/shuttle_docker/attack_hand(mob/user) if(jammed) @@ -46,21 +86,6 @@ return return ..() -/obj/machinery/computer/camera_advanced/shuttle_docker/GrantActions(mob/living/user) - if(jumpto_ports.len) - jump_action = new /datum/action/innate/camera_jump/shuttle_docker - ..() - - if(rotate_action) - rotate_action.target = user - rotate_action.Grant(user) - actions += rotate_action - - if(place_action) - place_action.target = user - place_action.Grant(user) - actions += place_action - /obj/machinery/computer/camera_advanced/shuttle_docker/CreateEye() shuttle_port = SSshuttle.getShuttle(shuttleId) if(QDELETED(shuttle_port)) @@ -140,7 +165,7 @@ if(!my_port) my_port = new() my_port.name = shuttlePortName - my_port.id = shuttlePortId + my_port.shuttle_id = shuttlePortId my_port.height = shuttle_port.height my_port.width = shuttle_port.width my_port.dheight = shuttle_port.dheight @@ -262,12 +287,15 @@ current_user.client.images -= remove_images current_user.client.images += add_images -/obj/machinery/computer/camera_advanced/shuttle_docker/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) - if(port && (shuttleId == initial(shuttleId) || override)) - shuttleId = port.id - shuttlePortId = "[port.id]_custom" +/obj/machinery/computer/camera_advanced/shuttle_docker/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) + if(!mapload) + return FALSE + if(port) + shuttleId = port.shuttle_id + shuttlePortId = "[port.shuttle_id]_custom" if(dock) - jumpto_ports[dock.id] = TRUE + add_jumpable_port(dock.shuttle_id) + return TRUE /mob/camera/aiEye/remote/shuttle_docker visible_icon = FALSE @@ -331,19 +359,19 @@ playsound(console, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) var/list/L = list() - for(var/V in SSshuttle.stationary) + for(var/V in SSshuttle.stationary_docking_ports) if(!V) - stack_trace("SSshuttle.stationary have null entry!") + stack_trace("SSshuttle.stationary_docking_ports have null entry!") continue var/obj/docking_port/stationary/S = V if(console.z_lock.len && !(S.z in console.z_lock)) continue - if(console.jumpto_ports[S.id]) + if(console.jump_to_ports[S.shuttle_id]) L["([L.len])[S.name]"] = S - for(var/V in SSshuttle.beacons) + for(var/V in SSshuttle.beacon_list) if(!V) - stack_trace("SSshuttle.beacons have null entry!") + stack_trace("SSshuttle.beacon_list have null entry!") continue var/obj/machinery/spaceship_navigation_beacon/nav_beacon = V if(!nav_beacon.z || SSmapping.level_has_any_trait(nav_beacon.z, console.locked_traits)) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index b500bcd2aaca..cd4bb9fc0425 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -4,16 +4,19 @@ All ShuttleMove procs go here /************************************Base procs************************************/ -/turf/proc/beforeShuttleMove(turf/newT) - clear_adjacencies() - newT.clear_adjacencies() +// Called on every turf in the shuttle region, returns a bitflag for allowed movements of that turf +// returns the new move_mode (based on the old) +// /turf/proc/beforeShuttleMove(turf/newT) +// clear_adjacencies() +// newT.clear_adjacencies() // Called on every turf in the shuttle region, returns a bitflag for allowed movements of that turf // returns the new move_mode (based on the old) /turf/proc/fromShuttleMove(turf/newT, move_mode) if(!(move_mode & MOVE_AREA) || !isshuttleturf(src)) return move_mode - + + //newT.clear_adjacencies() return move_mode | MOVE_TURF | MOVE_CONTENTS // Called from the new turf before anything has been moved @@ -23,7 +26,7 @@ All ShuttleMove procs go here . = move_mode if(!(. & MOVE_TURF)) return - + //clear_adjacencies() var/shuttle_dir = shuttle.dir for(var/i in contents) var/atom/movable/thing = i @@ -57,9 +60,13 @@ All ShuttleMove procs go here if(!shuttle_depth) CRASH("A turf queued to move via shuttle somehow had no skipover in baseturfs. [src]([type]):[loc]") - var/depth = baseturfs.len - shuttle_depth + 1 - newT.CopyOnTop(src, 1, depth, TRUE, CHANGETURF_DEFER_CHANGE) + newT.CopyOnTop(src, 1, shuttle_depth, TRUE) + newT.blocks_air = TRUE + newT.air_update_turf(TRUE, FALSE) blocks_air = TRUE + if(isopenturf(newT)) + var/turf/open/new_open = newT + new_open.copy_air_with_tile(src) SEND_SIGNAL(src, COMSIG_TURF_ON_SHUTTLE_MOVE, newT) return TRUE @@ -68,6 +75,7 @@ All ShuttleMove procs go here /turf/proc/afterShuttleMove(turf/oldT, rotation) //Dealing with the turf we left behind oldT.TransferComponents(src) + SSexplosions.wipe_turf(src) var/shuttle_depth = depth_to_find_baseturf(/turf/baseturf_skipover/shuttle) @@ -99,7 +107,7 @@ All ShuttleMove procs go here if(loc != oldT) // This is for multi tile objects return - loc = newT + abstract_move(newT) SSdemo.mark_dirty(src) @@ -116,10 +124,10 @@ All ShuttleMove procs go here update_parallax_contents() - //Yog code: i'm not sure if this is actually still needed but taking a closer look will be another PR having to do with shuttles - var/turf/newT = get_turf(src) - if (newT.z != oldT.z) - on_changed_z_level(oldT, newT) + // //Yog code: i'm not sure if this is actually still needed but taking a closer look will be another PR having to do with shuttles + // var/turf/newT = get_turf(src) + // if (newT.z != oldT.z) + // on_changed_z_level(oldT, newT) return TRUE @@ -258,7 +266,7 @@ All ShuttleMove procs go here SSair.add_to_rebuild_queue(src) else // atmosinit() calls update_appearance(UPDATE_ICON), so we don't need to call it - update_appearance(UPDATE_ICON) + update_appearance() /obj/machinery/navbeacon/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() @@ -358,13 +366,31 @@ All ShuttleMove procs go here if(moving_dock == src) . |= MOVE_CONTENTS -/obj/docking_port/stationary/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) +// Never move the stationary docking port, otherwise things get WEIRD +/obj/docking_port/stationary/onShuttleMove() + return FALSE + +// Holy shit go away +/obj/effect/abstract/z_holder/onShuttleMove() + return FALSE + +// Special movable stationary port, for your mothership shenanigans +/obj/docking_port/stationary/movable/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) if(!moving_dock.can_move_docking_ports || old_dock == src) return FALSE - . = ..() + + if(newT == oldT) // In case of in place shuttle rotation shenanigans. + return + + if(loc != oldT) // This is for multi tile objects + return + + abstract_move(newT) + + return TRUE /obj/docking_port/stationary/public_mining_dock/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) - id = "mining_public" //It will not move with the base, but will become enabled as a docking point. + shuttle_id = "mining_public" //It will not move with the base, but will become enabled as a docking point. /obj/effect/abstract/proximity_checker/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) //timer so it only happens once diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index f60e3ed63f85..fca1d34132b1 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -11,13 +11,15 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF anchored = TRUE + ///Common standard is for this to point -away- from the dockingport door, ie towards the ship + dir = NORTH /// The identifier of the port or ship. /// This will be used in numerous other places like the console, /// stationary ports and whatnot to tell them your ship's mobile /// port can be used in these places, or the docking port is compatible, etc. - var/id - ///Common standard is for this to point -away- from the dockingport door, ie towards the ship - dir = NORTH + var/shuttle_id + /// Possible destinations + var/port_destinations ///size of covered area, perpendicular to dir. You shouldn't modify this for mobile dockingports, set automatically. var/width = 0 ///size of covered area, parallel to dir. You shouldn't modify this for mobile dockingports, set automatically. @@ -37,7 +39,25 @@ ///are we registered in SSshuttles? var/registered = FALSE - //these objects are indestructible +///register to SSshuttles +/obj/docking_port/proc/register() + if(registered) + WARNING("docking_port registered multiple times") + unregister() + registered = TRUE + return + +///unregister from SSshuttles +/obj/docking_port/proc/unregister() + if(!registered) + WARNING("docking_port unregistered multiple times") + registered = FALSE + return + +/obj/docking_port/proc/Check_id() + return + +//these objects are indestructible /obj/docking_port/Destroy(force) // unless you assert that you know what you're doing. Horrible things // may result. @@ -55,8 +75,10 @@ /obj/docking_port/singularity_pull() return + /obj/docking_port/singularity_act() - return 0 + return FALSE + /obj/docking_port/shuttleRotate() return //we don't rotate with shuttles via this code. @@ -126,7 +148,9 @@ #ifdef DOCKING_PORT_HIGHLIGHT //Debug proc used to highlight bounding area -/obj/docking_port/proc/highlight(_color) +/obj/docking_port/proc/highlight(_color = "#f00") + SetInvisibility(INVISIBILITY_NONE) + SET_PLANE_IMPLICIT(src, GHOST_PLANE) var/list/L = return_coords() var/turf/T0 = locate(L[1],L[2],z) var/turf/T1 = locate(L[3],L[4],z) @@ -145,11 +169,13 @@ /obj/docking_port/proc/get_docked() return locate(/obj/docking_port/stationary) in loc +// Return id of the docked docking_port /obj/docking_port/proc/getDockedId() var/obj/docking_port/P = get_docked() if(P) - return P.id + return P.shuttle_id +// Say that A in the absolute (rectangular) bounds of this shuttle or no. /obj/docking_port/proc/is_in_shuttle_bounds(atom/A) var/turf/T = get_turf(A) if(T.z != z) @@ -177,13 +203,34 @@ ///If true, the shuttle can always dock at this docking port, despite its area checks, or if something is already docked var/override_can_dock_checks = FALSE +/obj/docking_port/stationary/register(replace = FALSE) + . = ..() + if(!shuttle_id) + shuttle_id = "dock" + else + port_destinations = shuttle_id + + if(!name) + name = "dock" + + var/counter = SSshuttle.assoc_stationary[shuttle_id] + if(!replace || !counter) + if(counter) + counter++ + SSshuttle.assoc_stationary[shuttle_id] = counter + shuttle_id = "[shuttle_id]_[counter]" + name = "[name] [counter]" + else + SSshuttle.assoc_stationary[shuttle_id] = 1 + + if(!port_destinations) + port_destinations = shuttle_id + + SSshuttle.stationary_docking_ports += src + /obj/docking_port/stationary/Initialize(mapload) . = ..() - SSshuttle.stationary += src - if(!id) - id = "[SSshuttle.stationary.len]" - if(name == "dock") - name = "dock[SSshuttle.stationary.len]" + register() if(!area_type) var/area/place = get_area(src) area_type = place?.type // We might be created in nullspace @@ -199,9 +246,13 @@ highlight("#f00") #endif +/obj/docking_port/stationary/unregister() + . = ..() + SSshuttle.stationary_docking_ports -= src + /obj/docking_port/stationary/Destroy(force) if(force) - SSshuttle.stationary -= src + unregister() . = ..() /obj/docking_port/stationary/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) @@ -231,6 +282,44 @@ /obj/docking_port/stationary/get_docked() . = locate(/obj/docking_port/mobile) in loc +/// Subtype for escape pod ports so that we can give them trait behaviour +/obj/docking_port/stationary/escape_pod + name = "escape pod loader" + height = 5 + width = 3 + dwidth = 1 + roundstart_template = /datum/map_template/shuttle/escape_pod/default + /// Set to true if you have a snowflake escape pod dock which needs to always have the normal pod or some other one + var/enforce_specific_pod = FALSE + +/obj/docking_port/stationary/escape_pod/Initialize(mapload) + . = ..() + if (enforce_specific_pod) + return + + // if (HAS_TRAIT(SSstation, STATION_TRAIT_SMALLER_PODS)) + // roundstart_template = /datum/map_template/shuttle/escape_pod/cramped + // return + if (HAS_TRAIT(SSstation, STATION_TRAIT_BIGGER_PODS)) + roundstart_template = /datum/map_template/shuttle/escape_pod/large + +// should fit the syndicate infiltrator, and smaller ships like the battlecruiser corvettes and fighters +/obj/docking_port/stationary/syndicate + name = "near the station" + dheight = 1 + dwidth = 12 + height = 17 + width = 23 + shuttle_id = "syndicate_nearby" + +/obj/docking_port/stationary/syndicate/northwest + name = "northwest of station" + shuttle_id = "syndicate_nw" + +/obj/docking_port/stationary/syndicate/northeast + name = "northeast of station" + shuttle_id = "syndicate_ne" + /obj/docking_port/stationary/transit name = "In Transit" override_can_dock_checks = TRUE @@ -243,13 +332,13 @@ /obj/docking_port/stationary/transit/Initialize(mapload) . = ..() - SSshuttle.transit += src + SSshuttle.transit_docking_ports += src /obj/docking_port/stationary/transit/Destroy(force=FALSE) if(force) if(get_docked()) log_world("A transit dock was destroyed while something was docked to it.") - SSshuttle.transit -= src + SSshuttle.transit_docking_ports -= src if(owner) if(owner.assigned_transit == src) owner.assigned_transit = null @@ -259,14 +348,111 @@ reserved_area = null return ..() +/obj/docking_port/stationary/picked + ///Holds a list of map name strings for the port to pick from + var/list/shuttlekeys + +/obj/docking_port/stationary/picked/Initialize(mapload) + . = ..() + if(!LAZYLEN(shuttlekeys)) + WARNING("Random docking port [shuttle_id] loaded with no shuttle keys") + return + var/selectedid = pick(shuttlekeys) + roundstart_template = SSmapping.shuttle_templates[selectedid] + +/obj/docking_port/stationary/picked/whiteship + name = "Deep Space" + shuttle_id = "whiteship_away" + height = 45 //Width and height need to remain in sync with the size of whiteshipdock.dmm, otherwise we'll get overflow + width = 44 + dheight = 18 + dwidth = 18 + dir = 2 + shuttlekeys = list( + "whiteship_meta", + "whiteship_pubby", + "whiteship_box", + "whiteship_cere", + "whiteship_kilo", + "whiteship_donut", + "whiteship_delta", + "whiteship_tram", + "whiteship_personalshuttle", + "whiteship_obelisk", + ) + +/// Helper proc that tests to ensure all whiteship templates can spawn at their docking port, and logs their sizes +/// This should be a unit test, but too much of our other code breaks during shuttle movement, so not yet, not yet. +/proc/test_whiteship_sizes() + var/obj/docking_port/stationary/port_type = /obj/docking_port/stationary/picked/whiteship + var/datum/turf_reservation/docking_yard = SSmapping.request_turf_block_reservation( + initial(port_type.width), + initial(port_type.height), + 1, + ) + var/turf/bottom_left = docking_yard.bottom_left_turfs[1] + var/turf/spawnpoint = locate( + bottom_left.x + initial(port_type.dwidth), + bottom_left.y + initial(port_type.dheight), + bottom_left.z, + ) + + var/obj/docking_port/stationary/picked/whiteship/port = new(spawnpoint) + var/list/ids = port.shuttlekeys + var/height = 0 + var/width = 0 + var/dheight = 0 + var/dwidth = 0 + var/delta_height = 0 + var/delta_width = 0 + for(var/id in ids) + var/datum/map_template/shuttle/our_template = SSmapping.shuttle_templates[id] + // We do a standard load here so any errors will properly runtimes + var/obj/docking_port/mobile/ship = SSshuttle.action_load(our_template, port) + if(ship) + ship.jumpToNullSpace() + ship = null + // Yes this is very hacky, but we need to both allow loading a template that's too big to be an error state + // And actually get the sizing information from every shuttle + SSshuttle.load_template(our_template) + var/obj/docking_port/mobile/theoretical_ship = SSshuttle.preview_shuttle + if(theoretical_ship) + height = max(theoretical_ship.height, height) + width = max(theoretical_ship.width, width) + dheight = max(theoretical_ship.dheight, dheight) + dwidth = max(theoretical_ship.dwidth, dwidth) + delta_height = max(theoretical_ship.height - theoretical_ship.dheight, delta_height) + delta_width = max(theoretical_ship.width - theoretical_ship.dwidth, delta_width) + theoretical_ship.jumpToNullSpace() + qdel(port, TRUE) + log_world("Whiteship sizing information. Use this to set the docking port, and the map size\n\ + Max Height: [height] \n\ + Max Width: [width] \n\ + Max DHeight: [dheight] \n\ + Max DWidth: [dwidth] \n\ + The following are the safest bet for map sizing. Anything smaller then this could in the worst case not fit in the docking port\n\ + Max Combined Width: [height + dheight] \n\ + Max Combinded Height [width + dwidth]") + /obj/docking_port/mobile name = "shuttle" icon_state = "pinonclose" area_type = SHUTTLE_DEFAULT_SHUTTLE_AREA_TYPE - var/list/shuttle_areas + ///List of all areas our shuttle holds. + var/list/shuttle_areas = list() + ///List of all currently used engines that propels us. + var/list/obj/structure/shuttle/engine/engine_list = list() + ///How fast the shuttle should be, taking engine thrust into account. + var/engine_coeff = 1 + ///How many engines the shuttle currently has. + var/current_engines = 0 + ///How many engines the shuttle starts with at mapload. + var/initial_engines = 0 + ///Speed multiplier based on station alert level + var/alert_coeff = ALERT_COEFF_BLUE ///used as a timer (if you want time left to complete move, use timeLeft proc) var/timer var/last_timer_length @@ -294,18 +480,16 @@ var/obj/docking_port/stationary/transit/assigned_transit var/launch_status = NOLAUNCH - + + var/list/ripples = list() ///Whether or not you want your ship to knock people down, and also whether it will throw them several tiles upon launching. var/list/movement_force = list("KNOCKDOWN" = 3, "THROW" = 0) - var/list/ripples = list() - var/engine_coeff = 1 - var/current_engines = 0 - var/initial_engines = 0 - var/list/engine_list = list() ///if this shuttle can move docking ports other than the one it is docked at var/can_move_docking_ports = FALSE var/list/hidden_turfs = list() + ///List of shuttle events that can run or are running + //var/list/datum/shuttle_event/event_list = list() #define WORLDMAXX_CUTOFF (world.maxx + 1) #define WORLDMAXY_CUTOFF (world.maxx + 1) @@ -370,11 +554,46 @@ #undef WORLDMAXX_CUTOFF #undef WORLDMAXY_CUTOFF -/obj/docking_port/mobile/proc/register() - SSshuttle.mobile += src +/** + * Actions to be taken after shuttle is loaded but before it has been moved out of transit z-level to its final location + * + * Arguments: + * * replace - TRUE if this shuttle is replacing an existing one. FALSE by default. + */ +/obj/docking_port/mobile/register(replace = FALSE) + . = ..() + if(!shuttle_id) + shuttle_id = "shuttle" + + if(!name) + name = "shuttle" + + var/counter = SSshuttle.assoc_mobile[shuttle_id] + if(!replace || !counter) + if(counter) + counter++ + SSshuttle.assoc_mobile[shuttle_id] = counter + shuttle_id = "[shuttle_id]_[counter]" + name = "[name] [counter]" + //Re link machinery to new shuttle id + linkup() + else + SSshuttle.assoc_mobile[shuttle_id] = 1 + + SSshuttle.mobile_docking_ports += src -/obj/docking_port/mobile/proc/unregister() - SSshuttle.mobile -= src +/** + * Actions to be taken after shuttle is loaded and has been moved to its final location + * + * Arguments: + * * replace - TRUE if this shuttle is replacing an existing one. FALSE by default. + */ +/obj/docking_port/mobile/proc/postregister(replace = FALSE) + return + +/obj/docking_port/mobile/unregister() + . = ..() + SSshuttle.mobile_docking_ports -= src /obj/docking_port/mobile/Destroy(force) unregister() @@ -390,12 +609,18 @@ /obj/docking_port/mobile/Initialize(mapload) . = ..() - if(!id) - id = "[SSshuttle.mobile.len]" - if(name == "shuttle") - name = "shuttle[SSshuttle.mobile.len]" + if(!shuttle_id) + shuttle_id = "shuttle" + if(!name) + name = "shuttle" + var/counter = 1 + var/tmp_id = shuttle_id + var/tmp_name = name + while(Check_id(shuttle_id)) + counter++ + shuttle_id = "[tmp_id]_[counter]" + name = "[tmp_name] [counter]" - shuttle_areas = list() var/list/all_turfs = return_ordered_turfs(x, y, z, dir) for(var/i in 1 to all_turfs.len) var/turf/curT = all_turfs[i] @@ -403,28 +628,16 @@ if(istype(cur_area, area_type)) shuttle_areas[cur_area] = TRUE - initial_engines = count_engines() - current_engines = initial_engines - #ifdef DOCKING_PORT_HIGHLIGHT highlight("#0f0") #endif -// Called after the shuttle is loaded from template -/obj/docking_port/mobile/proc/linkup(datum/map_template/shuttle/template, obj/docking_port/stationary/dock) - var/list/static/shuttle_id = list() - var/idnum = ++shuttle_id[template] - if(idnum > 1) - if(id == initial(id)) - id = "[id][idnum]" - if(name == initial(name)) - name = "[name] [idnum]" - for(var/place in shuttle_areas) - var/area/area = place - area.connect_to_shuttle(src, dock, idnum, FALSE) - for(var/each in place) - var/atom/atom = each - atom.connect_to_shuttle(src, dock, idnum, FALSE) +// Called after the shuttle is loaded from template, so we make sure they know it's from mapload. +/obj/docking_port/mobile/proc/linkup(obj/docking_port/stationary/dock) + for(var/area/place as anything in shuttle_areas) + place.connect_to_shuttle(TRUE, src, dock) + for(var/atom/individual_atoms in place) + individual_atoms.connect_to_shuttle(TRUE, src, dock) //this is a hook for custom behaviour. Maybe at some point we could add checks to see if engines are intact @@ -530,14 +743,14 @@ var/obj/docking_port/stationary/S1 = assigned_transit if(S1) if(initiate_docking(S1) != DOCKING_SUCCESS) - WARNING("shuttle \"[id]\" could not enter transit space. Docked at [S0 ? S0.id : "null"]. Transit dock [S1 ? S1.id : "null"].") + WARNING("shuttle \"[shuttle_id]\" could not enter transit space. Docked at [S0 ? S0.shuttle_id : "null"]. Transit dock [S1 ? S1.shuttle_id : "null"].") else if(S0) if(S0.delete_after) qdel(S0, TRUE) else previous = S0 else - WARNING("shuttle \"[id]\" could not enter transit space. S0=[S0 ? S0.id : "null"] S1=[S1 ? S1.id : "null"]") + WARNING("shuttle \"[shuttle_id]\" could not enter transit space. S0=[S0 ? S0.shuttle_id : "null"] S1=[S1 ? S1.shuttle_id : "null"]") /obj/docking_port/mobile/proc/jumpToNullSpace() @@ -561,19 +774,13 @@ var/turf/oldT = old_turfs[i] if(!oldT || !istype(oldT.loc, area_type)) continue - var/area/old_area = oldT.loc - old_area.turfs_to_uncontain += oldT - underlying_area.contents += oldT - underlying_area.contained_turfs += oldT - oldT.change_area(old_area, underlying_area) + oldT.change_area(oldT.loc, underlying_area) oldT.empty(FALSE) - // Here we locate the bottomost shuttle boundary and remove all turfs above it - var/list/baseturf_cache = oldT.baseturfs - for(var/k in 1 to length(baseturf_cache)) - if(ispath(baseturf_cache[k], /turf/baseturf_skipover/shuttle)) - oldT.ScrapeAway(baseturf_cache.len - k + 1) - break + // Here we locate the bottommost shuttle boundary and remove all turfs above it + var/shuttle_tile_depth = oldT.depth_to_find_baseturf(/turf/baseturf_skipover/shuttle) + if (!isnull(shuttle_tile_depth)) + oldT.ScrapeAway(shuttle_tile_depth) qdel(src, force=TRUE) @@ -631,13 +838,6 @@ else . = null -/obj/effect/landmark/shuttle_import - name = "Shuttle Import" - -// Never move the shuttle import landmark, otherwise things get WEIRD -/obj/effect/landmark/shuttle_import/onShuttleMove() - return FALSE - //used by shuttle subsystem to check timers /obj/docking_port/mobile/proc/check() check_effects() @@ -832,11 +1032,11 @@ else dst = destination if(dst) - . = "(transit to) [dst.name || dst.id]" + . = "(transit to) [dst.name || dst.shuttle_id]" else . = "(transit to) nowhere" else if(dockedAt) - . = dockedAt.name || dockedAt.id + . = dockedAt.name || dockedAt.shuttle_id else . = "unknown" @@ -846,7 +1046,7 @@ for(var/place in shuttle_areas) var/area/shuttle/shuttle_area = place for(var/obj/machinery/computer/shuttle/S in shuttle_area) - if(S.shuttleId == id) + if(S.shuttleId == shuttle_id) return S return null @@ -867,31 +1067,32 @@ var/range = (engine_coeff * max(width, height)) var/long_range = range * 2.5 var/atom/distant_source - if(engine_list[1]) + if(engine_list.len) distant_source = engine_list[1] else - for(var/A in areas) - distant_source = locate(/obj/machinery/door) in A + for(var/our_area in areas) + distant_source = locate(/obj/machinery/door) in our_area if(distant_source) break - if(distant_source) - for(var/mob/M in SSmobs.clients_by_zlevel[z]) - var/dist_far = get_dist(M, distant_source) - if(dist_far <= long_range && dist_far > range) - M.playsound_local(distant_source, "sound/effects/[selected_sound]_distance.ogg", 100, falloff_exponent = 20) - else if(dist_far <= range) - var/source - if(engine_list.len == 0) - source = distant_source - else - var/closest_dist = 10000 - for(var/obj/O in engine_list) - var/dist_near = get_dist(M, O) - if(dist_near < closest_dist) - source = O - closest_dist = dist_near - M.playsound_local(source, "sound/effects/[selected_sound].ogg", 100, falloff_exponent = range / 2) + if(!distant_source) + return + for(var/mob/M in SSmobs.clients_by_zlevel[z]) + var/dist_far = get_dist(M, distant_source) + if(dist_far <= long_range && dist_far > range) + M.playsound_local(distant_source, "sound/effects/[selected_sound]_distance.ogg", 100, falloff_exponent = 20) + else if(dist_far <= range) + var/source + if(engine_list.len == 0) + source = distant_source + else + var/closest_dist = 10000 + for(var/obj/O in engine_list) + var/dist_near = get_dist(M, O) + if(dist_near < closest_dist) + source = O + closest_dist = dist_near + M.playsound_local(source, "sound/effects/[selected_sound].ogg", 100, falloff_exponent = range / 2) // Losing all initial engines should get you 2 // Adding another set of engines at 0.5 time @@ -976,7 +1177,7 @@ /obj/docking_port/mobile/pod/on_emergency_dock() if(launch_status == ENDGAME_LAUNCHED) - initiate_docking(SSshuttle.getDock("[id]_away")) //Escape pods dock at centcom + initiate_docking(SSshuttle.getDock("[shuttle_id]_away")) //Escape pods dock at centcom mode = SHUTTLE_ENDGAME /obj/docking_port/mobile/emergency/on_emergency_dock() diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm index 002da36e162c..15c2dd117d5a 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm @@ -188,8 +188,8 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He stationary_port.name = "[recorded_shuttle_area.name] Custom Shuttle construction site" port.callTime = 50 port.dir = 1 //Point away from space. - port.id = "custom_[GLOB.custom_shuttle_count]" - linkedShuttleId = port.id + port.shuttle_id = "custom_[GLOB.custom_shuttle_count]" + linkedShuttleId = port.shuttle_id port.ignitionTime = 25 port.port_direction = 2 port.preferred_direction = EAST diff --git a/code/modules/shuttle/spaceship_navigation_beacon.dm b/code/modules/shuttle/spaceship_navigation_beacon.dm index ce10314952b8..17c10dba487e 100644 --- a/code/modules/shuttle/spaceship_navigation_beacon.dm +++ b/code/modules/shuttle/spaceship_navigation_beacon.dm @@ -19,13 +19,13 @@ /obj/machinery/spaceship_navigation_beacon/Initialize(mapload) . = ..() - SSshuttle.beacons |= src + SSshuttle.beacon_list |= src obj/machinery/spaceship_navigation_beacon/emp_act() locked = TRUE /obj/machinery/spaceship_navigation_beacon/Destroy() - SSshuttle.beacons -= src + SSshuttle.beacon_list -= src return ..() // update the icon_state diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 3eb91bd880c1..da9319e85371 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -31,7 +31,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/docking_port/mobile/supply name = "supply shuttle" - id = "supply" + shuttle_id = "supply" callTime = 30 SECONDS dir = WEST @@ -86,7 +86,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( var/list/obj/miscboxes = list() //miscboxes are combo boxes that contain all small_item orders grouped var/list/misc_order_num = list() //list of strings of order numbers, so that the manifest can show all orders in a box var/list/misc_contents = list() //list of lists of items that each box will contain - if(!SSshuttle.shoppinglist.len) + if(!SSshuttle.shopping_list.len) return var/list/empty_turfs = list() @@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( var/value = 0 var/purchases = 0 - for(var/datum/supply_order/SO in SSshuttle.shoppinglist) + for(var/datum/supply_order/SO in SSshuttle.shopping_list) if(!empty_turfs.len) break var/price = SO.pack.get_cost() @@ -120,8 +120,8 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( var/datum/bank_account/department/cargo = SSeconomy.get_dep_account(ACCOUNT_CAR) cargo.adjust_money(price - SO.pack.get_cost()) //Cargo gets the handling fee value += SO.pack.get_cost() - SSshuttle.shoppinglist -= SO - SSshuttle.orderhistory += SO + SSshuttle.shopping_list -= SO + SSshuttle.order_history += SO if(SO.pack.small_item) //small_item means it gets piled in the miscbox if(SO.paying_account) diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index b56aa88e3db4..ee5988dc6cbc 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -62,7 +62,7 @@ shuttleId = "syndicate" lock_override = CAMERA_LOCK_STATION shuttlePortId = "syndicate_custom" - jumpto_ports = list("syndicate_ne" = 1, "syndicate_nw" = 1, "syndicate_n" = 1, "syndicate_se" = 1, "syndicate_sw" = 1, "syndicate_s" = 1) + jump_to_ports = list("syndicate_ne" = 1, "syndicate_nw" = 1, "syndicate_n" = 1, "syndicate_se" = 1, "syndicate_sw" = 1, "syndicate_s" = 1) view_range = 5.5 x_offset = -7 y_offset = -1 diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm index d11d136ec2f2..79f346401e6f 100644 --- a/code/modules/shuttle/white_ship.dm +++ b/code/modules/shuttle/white_ship.dm @@ -24,7 +24,7 @@ shuttleId = "whiteship" lock_override = NONE shuttlePortId = "whiteship_custom" - jumpto_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1) + jump_to_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1) view_range = 10 x_offset = -6 y_offset = -10 @@ -35,7 +35,7 @@ desc = "Used to designate a precise transit location for the Salvage Pod." shuttleId = "whiteship_pod" shuttlePortId = "whiteship_pod_custom" - jumpto_ports = list("whiteship_pod_home" = 1) + jump_to_ports = list("whiteship_pod_home" = 1) view_range = 0 x_offset = -2 y_offset = 0 diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index fa02a0ddcc88..e1bf57931370 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -251,8 +251,10 @@ /obj/machinery/vending/autodrobe/capdrobe name = "\improper CapDrobe" desc = "A vending machine for captain outfits." + icon = 'yogstation/icons/obj/vending.dmi' icon_state = "capdrobe" icon_deny = "capdrobe-deny" + panel_type = "panel-capdrobe" req_access = list(ACCESS_CAPTAIN) product_slogans = "Dress for success!;Suited and booted!;It's show time!;Why leave style up to fate? Use the Captain's Autodrobe!" vend_reply = "Thank you for using the Captain's Autodrobe!" diff --git a/code/ze_genesis_call/genesis_call.dm b/code/ze_genesis_call/genesis_call.dm new file mode 100644 index 000000000000..c50abf2b22c8 --- /dev/null +++ b/code/ze_genesis_call/genesis_call.dm @@ -0,0 +1,53 @@ +/* + + You look around. + + There is nothing but naught about you. + + You've come to the end of the world. + + You get a feeling that you really shouldn't be here. + + Ever. + + But with all ends come beginnings. + + As you turn to leave, you spot it out of the corner of your eye. + + Your eye widen in wonder as you look upon the the legendary treasure. + + After all these years of pouring through shitcode + your endevours have brought you to... + +*/ + +/** + * THE GENESIS CALL + * + * THE VERY FIRST LINE OF DM CODE TO EXECUTE + * Ong this must be done after !!!EVERYTHING!!! else + * NO IFS ANDS OR BUTS + * it's a hack, not an example of any sort, and DEFINITELY should NOT be emulated + * IT JUST HAS TO BE LAST!!!!!! + * If you want to do something in the initialization pipeline + * FIRST RTFM IN /code/game/world.dm + * AND THEN NEVER RETURN TO THIS PLACE + * + * + * + * If you're still here, here's an explanation: + * BYOND loves to tell you about its loving spouse /global + * But it's actually having a sexy an affair with /static + * Specifically statics in procs + * Priority is given to these lines of code in REVERSE order of declaration in the .dme + * Which is why this file has a funky name + * So this is what we use to call world.Genesis() + * It's a nameless, no-op function, because it does absolutely nothing + * It exists to hold a static var which is initialized to null + * It's on /world to hide it from reflection + * Painful right? Good, now you share my suffering + * Please lock the door on your way out + */ +//Yogstation is not yet ready for the birth of something new and beautiful +// /world/proc/_() +// var/static/_ = world.Genesis() diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole.js b/tgui/packages/tgui/interfaces/CommunicationsConsole.js index b0682bc35b6a..5e4686639706 100644 --- a/tgui/packages/tgui/interfaces/CommunicationsConsole.js +++ b/tgui/packages/tgui/interfaces/CommunicationsConsole.js @@ -13,7 +13,13 @@ const STATE_MESSAGES = "messages"; // Used for whether or not you need to swipe to confirm an alert level change const SWIPE_NEEDED = "SWIPE_NEEDED"; -const sortByCreditCost = sortBy(shuttle => shuttle.creditCost); +const EMAG_SHUTTLE_NOTICE = + 'This shuttle is deemed significantly dangerous to the crew, and is only supplied by the Syndicate.'; + +const sortShuttles = sortBy( + (shuttle) => !shuttle.emagOnly, + (shuttle) => shuttle.initial_cost, +); const AlertButton = (props, context) => { const { act, data } = useBackend(context); @@ -123,17 +129,18 @@ const PageBuyingShuttle = (props, context) => { Budget: {data.budget.toLocaleString()} credits - {sortByCreditCost(data.shuttles).map(shuttle => ( + {sortShuttles(data.shuttles).map(shuttle => (
    + display: 'inline-block', + width: '70%', + }} + > {shuttle.name} - )} + } key={shuttle.ref} buttons={(

    >6ECjys7wktvJyr>F)nkF;Jkm)~uc=cJxnoUx4>=%xmKzdzzm%>^wd(N!H0Hr5$J1!grLhu0GQEV@LG^Z5OLU zp}RbFOk#ytRqkf01ueSI2A_vW>F>c>rkLL11J7da?mqT^;zzATi%*)oUNF!cQ6|$B zq#pzl+ZIIAt_HcDm8j~0j-4uhTdWB1bL=Pvh_^A`0HlOI9wvjX%QgIasrTF#r z;E){MixR_H9_?a$E=s=9v~QDIzr^zleYY=U9G1kbAy`}z$$q$(2IuA&OhYD{@rulT z9wuY&B|&Hl+InB~_m~zmaDjoQsgt!`MMOsWQNtE$Eiqt|eEajOgOxNb(n60@s-B+O z;tI`AGm@a8u@o!iSDxFUF_Vi++oAbr4i=ctKkxpGyw=pG)|(SzRCOW ztb~DTSTtq zUjRPOQ*f&H9KAr+`Bc})OjU12@*FPPX!n~{dZCU~qTYNQRLLI*x;soFds zyt?9Pc%tmtuK3fQfYe9k`3$AsdcY(ngJrX!r6vxa>K z`y5WrbQmS1oi+3_wnJA;xY#Gz8|LxM(rq^{m+Ol6gXRC1pat`lZGW}EE7+3@=Z;b1 z{Wn)eR0zV9s2=~u^Ij6Vq$MVcc8|sw;cy8SXX_VMdiypi0%ON$ErKHPX0^O8TvPYm z6gz+#2Jr%~-^D+8B2{F3vOP``f?<_Hid_DuP1jQy@KP;vC>)>eG%tp0;~B}miOHQclTRKfT6Cjpy6 zm6IDU*0*(c&X2md~B3&G!L7L?x*BXypKEj;wk>*Vj_rK-9&C%{7&jGvnF zZ5HUwHeG5L7aT$FvM})knL*ci{Wi|8$a-F+7YpM1s6JAdk!2_&Z*{id8K1fvqN{Lp zdR4Z%3Plb&e^qTfcciem2j~zne)OiJ2*z6DH!Vh58(n7BJ=z4Z3>xJsa_H9Rzebwf z6jeW4F(H!H8iQ^ffxp}T^Rzd34=$3kW`<;ZzM5d{BX1;-Na`=BB=ZC88*26)wwGNsU<)NgSK)RJDRw{5Os*KS)M|4HQ-;b&h1 z-D8ePx|^k1zC91!bL)4PzJ6PJw6;ciTSVcyC_ImXs6zav8Mu)P+y2{8=1EXw+pzno z`e?YHqt77q%3B*JqYhjVL5zJtovbajb@v847A3uXbD#eb_tox>w)#`GY8C6S{{g4* BcO?J- diff --git a/icons/turf/floors/carpet_royalblue.dmi b/icons/turf/floors/carpet_royalblue.dmi index 841e49e957b69b02f0e7853edfe0f6679a8327cc..1027b0e19f58e736b3df8cdd71fe0af5ddc4a246 100644 GIT binary patch literal 3133 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 diff --git a/icons/turf/floors/carpet_stellar.dmi b/icons/turf/floors/carpet_stellar.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6ba816784261c0920a47e8ff19776980ca3bcd05 GIT binary patch literal 3176 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 literal 0 HcmV?d00001 diff --git a/icons/turf/floors/catwalk_plating.dmi b/icons/turf/floors/catwalk_plating.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b49c46564de508d0ddc8fd050c50655d6ffe6352 GIT binary patch literal 4353 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 qg;w^;-I5+q8oTZz8c0T}3+=oafZhWsB3o^Wdb literal 0 HcmV?d00001 diff --git a/icons/turf/floors/glass.dmi b/icons/turf/floors/glass.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ef9da477681ed2c69e460516cb7e36b22db55490 GIT binary patch literal 8083 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 AmjD0& literal 0 HcmV?d00001 diff --git a/icons/turf/floors/ice_turf.dmi b/icons/turf/floors/ice_turf.dmi index 8751a37216260e4efe32f76f51969bceb941b569..61574645759c989ad26e6403f2332562da1558f2 100644 GIT binary patch literal 4712 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 literal 3120 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 literal 3080 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 CDr5Wr literal 0 HcmV?d00001 diff --git a/icons/turf/floors/lava.dmi b/icons/turf/floors/lava.dmi index e4a276c001d9462cf9d32a12423169e8ad2f8e9d..3b889c9a5f68c17e0ada49b6699e95d3a6bc37d8 100644 GIT binary patch literal 9697 zcmcI~c~lcwx37wtRvV(Cq9DXMP6&#Kj3wHNBT*U^nF5UnLTjJ}k*U&%N;@DZ3MfOI zLFPd~nF699Qz9UViVzS;fCzzvKq{$Jy%X*J*89GD?_2kuw-!`Y_WteZz=Q0nG9-2ra;hY#BC2KU*sXD?j1aMh|+W@cuJ zQ+m}q*79wqqe=G2<$3X|Nodg-V~sfu3+Edc7>w9;^ZB6*fwSO zXYUQKXHL5wyL!6*^517g9Qes)QS^%EpXTpfy02s23*CJkaqbf*?;kj6{e&Hnr@Qxa z#JFj!)$vtlA~fD@jNP&3=JS@%qv>a3zLotFn2>&U>k7N&xQX}F#bTd$ebSrz%CPJ*GU6U?_a#NwR+K}o$i16k6o+2erx^Pju|t1U%zE_ z&+>nG*9TJx9e0 zH@e1PBRXEG!)0>j@e9hb_Ofp;<42U)w=?kh+g&Vw`hC*iuBTj|!^op&?#Jo!BJKdh zS(Gbe5^l0IzM+FP@Lplbv!38*gW8a@L|e$55igu+?H1nXTcq4)xsza@pOn&&M4ru!ohEh13*p z|L|y^EOOBVrR_a2pd-j^p)3AzB$#Hw-O_c`E>OOqKQ&J+_-;oo<2b#b*ywYMkCPLL zTa%k1m2;0&RD>`8;6RX$c)JCU97#K^{M0r?Z7uB&7#E02S@iRdw1t(q9khyHahsI( zYl^tKvNGQoa>sG4ag)-5VykOI%@6f~e4xW*veq%7r;SN!PVR7PsR#NkxtuPLR>t^b z2|2#>_mj?oM3ww!Cda3!#h|8*sPGsbV};n`e3M-FXesr|#EYCOfi)N0oh&P%<}y_A(@?Jwp-aSH6oH0!y-E7Royp$2<;kGu6tgl^c$xNxkXf zZc|IYns$BpdY8x2$55qVcIAjE7tDz0m2&OR#V!n$g0Z+xWj&|kO5m9LK^}FdD~%-8 zRhT``uQc{nw1qrr$NislRA24#gN|KLvIVKWdKbc#kH7>`>W5!G{p!pQC(h_Eb$J!9 z_!g48pZTy{Z|Ei_w|JfpdnzVQ+sEk9lx^oI;dPSo>kVevCG>9thZ+Y0%(ms`S4zvy zc8nXla8G2HLbE=#1$YyGR+7)q6T%O850_=9P9C!JNWrdbKWiWJdU&d(VY|M7aK>Ke za*{sV6RwkO02+qdNXw)Oj*(;L2xY>is6L(~^BO5(9@`T)E3-tut@Hz<^Nlg5WS}lK zN2#96t$Q40TNNO${dLxf3irgOT=R#h%)`PFx9s>ovG}6QCq5sM5ets*2(zxA*kjM zSDKQuB<#b0VpBG0sMIsLsQLQoXz8JerH@S3mOrB)g?ociM??i7iY;Oto(*uW^cK(T zRMA(gZ^NNX%htiVHlqV+j6=JQ(R&7?yPo#y+WKZeeuH%#IighFBZI!&n>jc3nqYS7 z%xBU(EhLnF%_oa$dW(m|1h|aGbs8}Bl%fN<{Y&J`=1KjF5WrJDPI!Q7z@kVWGbR-CKG; zejoJ7J0`fIr+mn4_z4(jTC%))SiS=5+zbhUL;6w&xsV@~eI5J45n zVb}$>utfvpz@$oj-H{j$$LGj!Ysp=Y!ycA--?~wa@TvH~B>yTapd+OCSv%K;Rz}d1 zl(BqWJ(MMF@r`H%{eH%ExS-Gm!Vc>eNSCwZ>>4^|@)K z!f_7MvEx%{cj~|*sjzkf(BN*EH>m6B=CmhclYB690FJIOPBFdPN%qiB=F~m~yF*DS zCq+IDi>?Z>d{BCJDVOPr?+!MP6X{l#x)mUAE~< z_T{pk7g$XazQ`vFGD9$1Wf$fjc+xBllSC$THSXV@(NcP5Yc^CF%nOFH^I0$yV=E8A z7lH4zr8lMG+Oce>yQ9?c$3FTwy7nHO?DwK!BAICWCBi+pf)%BlhnMjqx`s?sj*D_0 zYYTPsFJLRf@%oktEKz0k3|b@z@*=E1*Xv*@VW!acV`9(dKGjJ zDZ~q9OEpD@1Qr?j*kq-GqxatHb0APqe=>aBGcX+eNKVK;4@{rn&OUK3dQ? zV|_X7TmG$NaQNorq18w6W}g?IhT|2#s_ZK3nUxtiEw11A8QY%cmUa<~tgmC!ZzOoJ zN=UEgWjm3_$?rqyr!C6(#vJ8TkTI z<*8>|)P~y}gIu>OSsU2F;Vj>*j`5>+DrddK1_LuT$q*f7$o7Y{{hwJUK}tEwZLg0P zULcz(bql2pzhv4L2R=U6-NM_A_T$Yo;OIn-JG zxa)D@p2p$9^KL^So+<4Wn##L^`)AnKeX`8eI^0HU1KR?tDaYQ4T-$=KXm zV(dqbInasaOken;mdpk0@<(G7j6Frp^n(5HWWL=zS?6whk8lo@(Jzlvh|9v|4Fu$i zQrIWgB3XU2hP|j%(bIuK?1(;>@g;$GI#f!GWw*$++Z|$rpQIEB{;-Vc>+0;iPM*co zZMRd_ha;W2pE<^T=S)6Nm}cdteyEqSH*JD1qa&@wG`sN=_@>++mXfG6IKz(GB)XW? zt>eghB788DE3zu2En}L84$lPo=#s53`{k1&%1E>5>_zBkI;~bTO%gSGI4(ybcXEvs z3eOt-iL%``!czgFHh+ejEj8QB^gxGeC!+(x-zi@dcS{FDQ`8XMaD%PDYr34{ zUOz#e><>D~Tq3hkLG`^)uz!_iTPGnjv|GO%o||YB%e!|<5e&RxcdbA9Los1^!n#Sc zm~NyKZSq`xci4!&1B$5@CRzJUL0mev@|uME=<*q~b|(x|7Ig>RJX>L*hO$PJClgM~@9<9K z@If@bfUA zd=FJ0wG`8`O?Xz0dF(`_#9wz5QYjO7!ME#q^D6~Q2cFH5F~(|rg}@?y zVqCLOf0!WXHS4B-fzrtT!0KGDs8!(~8(-YZut8%g4iZ{nKdT%ytWJ3@MSok23G{=9$e&PserT!xAN-V6C|juOd|u;h%PVGkyOS8}3%iv%%6u0i?L(U= z1v01CljRBHz0A9#Ojc-QrG4iku*f%Ms;>8h9~`}{P;kg{9m ze$C39*=fdGbpm)B95~VRv2EKCrQt4ihLN&6?2z!K9RbZ1TJ(eUE@8-{?wZwqr5UA` zSn&(c@Rq6b94%>*p`uR zWsXzY4|hji9yOQaFP1T$NM|+SPX{7*%T}+u&$}F_uPLtgE9ks}FoVN4I9#IMeuQ*B zf!nWy{b5Ji=7!N+nOn4a5>{!!CZ9AV;d4Gb&UV)l*S8eYXG-Yjaj;^2Uz}A%!esy_4jv~Up2z4b8bzCOf}+w)#*yvKl23v%*vK&ED@x*=IK!JB z`Er8NF^%!!zWQ=JN?NsT27Irb@lIUkMJj=}PV2ZP3C}es#=jW3kXg99a=e%0G?5_O zj(fEnu(ldZjE}`@N-4Zm%a~0=l#@sb?BBoHk~JATkynHIV?^P|+q*3A5YzP{IF{0y zRI1U0yLUdNjmA<>Ny!Ch&N;IW_w)pcF5~bRq!)NJIMtaSBcbbZ-!Er`rA=BS0`*?z zoBj^^+>H{Aw%#yCi}{vB2)NVv$IL~NIs~fo-X2TQuBe9TfJKgAfUipfP5u$rP1r-n zYZ=dmIi@@SM#xNATT=Gl;j+(|x~TQ3>D=_^s3F!_NtNvZJ77Z_NRU(oH52!XORlu} z>&6nl>4*Z<`Uv@5#TFgYkZKF%w=0X~kI@IK=te)+8SSvj;~JS+#**HY_BxcRi6c$r zro8FcY54GM<_VWV%l2Ts_oluk&tO-Nl<>pJ@?QgI{mX!f;BD27@wFsx^ox%Twify; zP;PDd7b#!#9}~R{4=&fc`Yla5fTyGM!O$@j2u|?IMjezkwQw4Pz#l z$*~-p;2oHW!w6{X%Ekk3{fpmBY!I8oSW#YCH51NTki`^9qyu+QlBi%(xCs*!gx>^I z>=&CTpY-^J-zSV~$Y)N1E~6~F_^q;J;D916>>QubPgsp4o$)cC4n>_!2EFWO#bj5$ zo`8_AH{FpbO6|}o8MrPliXs~<=Y80w(KQFLK7lRr4*eV{+TfT>*m_zyQ1+zOEYl>l zE5~4n@d3};RcZPhPb2pcJdutb_~r53OQHUHql?=eAohDLDR)hb^E(sYID>%Y(Aq{G zr{?p8pgVn2kGmYNxuq{|zO_Lm=hTB5CR;3!tqGsEKpa_sW_!bXsrzsZWKA|*OA>ke zJAv*=+F7|zsD6jEF`lRYo*~)y9)J6yRz5}C*n~XFKsu)>O&Qabrp#oJ$xN9|$p#ts zdHSu4vArMhi(ChayzqY3HQp?wa)!@^@Y5+J{U3)owHfkv`QW4;Ce z>^oK~dWKXkVJ3l{$w~+{8j$QU~BHGtz z=*}!)<{!=+Bq{nzw`fA)poLERch-LuN*XIU4I5r(c6LC`gf*za*BA$ijKl{q&*J+U zVcVLC!0}K;8d7x$-wpN?M4rFQ%-byrDxB3@y%`^4li=4p7Y&y_|hrNf=Vi)xT z#ZKn9j3p{h0$M#%wFF>I#4V^SUe_dQ>ZYB*9wE#3_4qQYP`5?&MzK~iao=oe$0gMW z#`hcCC!G>ox1$;?lfaN@jV~nc@*(Dd7B2}!|M9RV@^lhx6z1D`9|FwOUqX3j%7tkI zg-BXNe^DXYssQUvw~6c+@>pGR{U(?8WS|gzBr0y+2!Ui>9rmdAzEzWfc1Xwm7B6J? zdCHxB@@|Q_d*yT8pD!sRaz5>Ei9^!HnI~YotxQdR(zbBwN7BcltOb_$==-TY1?UrR znA~I%?p_4YkU4o>$QFFO2zn=udxWIKQnn_mEoXi->UuJ8m6vb(1Kp>oTQgUDeNS$} zBQo6R|AUxBZTc?qJG{A(a*ZEUfV}hWjZY4rorQubo=heY4jvMAzuSwREgrpGgG1Uqt@}n zOK40#K@d=dJHUrIxxhwWqy_0G8Hr6~foV`DiEM@6N^F*s`j8z}_yyPxEIKHabVmy0 zXCvKPN!xqrZD@D0UKRQviz-ErL=eSc%ev`x;N0v`;t$;4c0}7jpFF1t%&Vhp(n8s? zM#4^P@(k$KH2DNir7EC}*i1>p!6?MKmS;C^or*b65}%EkBoa@WH4(R9+j7Yut)Z_* zNC$gqv7*hoVyKqKmtMmAd)R@vn>IZ%EM_nk-;8ZbQ^OLXAf7UE9eU^;!OrC!vGmj& z;ZE3)K(AB~ew8J~5}%aDlD;`E;#@}EG_WvWXVhdlX>Z_iNLG06BDf_+LR@9!Y4lKc zsJ)hq%Dxa87=ib9|1hK}(`%oBd5woS0G7sgH(A8Hee{C=d}I^v_Wq!DSwb%s!-*oS z+FTH|sD^m16H43+y_gFp3bE=N$iugzH5QY^Q%ywuDy(i}Y@+@(68|NAbOd>L8)2?S+;bEJ zQ7UQuJ=`f?rE!#nJUqake1bgmvoe~CP&*E`R3o3XF0he@jr_@zfLtjk)gNU-A!o0p zCgbnaTlv?Yv578QnB+#{Wl0gsIRZ~{9$FXj2WHK+O)|J|1_gXVQ!VHRSvDfE#XJ09 zNJsJ`Hj9mYxW9$Em4`fRMdu~Qbgf(*i?@_L>naCbOs7d&lU8#OoW2oSFtPH!K2Z!+ zgty+~R%3769;7vEH3!1!TcJyec?4U~Ddc(v{5pP;{)mo)e_?Y~rb56Z;DMa4>9mhPk{qs$|%_DO3er*5$QWQX_Pl(B*$;&lMTn zKziQlD>Nis^mGg8uSp%2Z28Ba^gn)}X#mX+w9f=gE9kEYom%w$tHco#`*QqnI6QaQ z1k7m9l6OLl&trJuxm_DdoQ6mt^Ba<@Wj%b0#k@c)^x?K@)D zzYshKN>sz+K2u*l!7-$Isf_Ufd%aqDI?V7m=9Tmn-dUnQV(`YSqQzP_yz(W;~y z8ekVXkU2akQHx$ajQ*nrQ)!(5{KG}xjVS@cei#To@KGr~ssIw{pMgf}_WuVIiU^Bt zp1g!cH{);2`e-d^%NFDl`s*#~{3@<2j8esup_D8&Y*8~wKMsF&b`Bg*njRL-o}7+G zvw=i6Ee!K|j%FJjA1y?eb^C@@l2s%!XDYo{0yXw|z0i;c!*j*P+jyE{lWn-BFqWB; zHn3a1gmDQ@C0+VAkQ{(gFt;&D-t<5virPHW<(xdNG6FhYG=T3q() z0TfgNZ%8V^ax}Lv{4_=yo5V? zMZEij)qsWdqSt6XNz$j?&s*CT-rWeV*HMG z_y?;_@w3fmJ)JuR#omWhb-%g*Z(K^YzkEcS`~FoVlL zW8(<4ssL3VNG48$1W^tI%qpeT{N}cB6*JnI4N>-jF~l+Mo#?lxUv7j;(63O^%LsFa42K zZ_tab52I*n%^`nyaID5OTvI?0jZmt>4qGuan~41qb3x!%{9J=zsK_u&bUJA>Gl@gY z2XD(>F5<`O9Upp)wx)q)(Lg*kPIj|e%V5vqM~RUXiCoPc7TjQG$DC+d-4g_+qaYm! z9DAK_$h^aKpfBqq6v{OXNq5+S>5^Rt%39!($Xg5_d+SIsJjr_CaJ2JhI;90y01 zn*cV4(j9hq8$**tl!902Nq%tJMrI_}3)%4z2Q_r%EJ@_Ou)~SOjCSUHe$*agP8{;^ zMSOqIsC*;oCj|){zR)9(>VsBmn+VxiQLoYW;QiH_WZt?)QMdGj)!Ydj9BrzU%o($; zfK1Q-B@==7psus&PH%EA;+|4+V(u(d zy0R!hDg8fw-v$eKkM()^NcV_;@TM9kgAF zIiAX2jG1wr)U`r#29oj(WNGL~v*_fcR)hSi4@@ot`J7@eG5-WoH2mm3uYSbfjx=E% zlzs_{|8ZRprC)^N|EKE)DE&_;{`(bX5y4-4GU!l2eINluB8(&OsOD$rog~5yBeRLW>8cpjl+*Y!HsK<|00mp1As#0n zK+lztU|I<11dNpO=ZrfjScDh~sKV^`MFaQ7m literal 7740 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 KH4(S%BmN7FG)6}N diff --git a/icons/turf/floors/lava_mask.dmi b/icons/turf/floors/lava_mask.dmi new file mode 100644 index 0000000000000000000000000000000000000000..aaefebe39deb36acecd43ae4a39f52a9ea381e49 GIT binary patch literal 1628 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 M9@zKL<;1050lw*GEdT%j literal 0 HcmV?d00001 diff --git a/icons/turf/floors/reinf_glass.dmi b/icons/turf/floors/reinf_glass.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a7607cada6a7f69478bb9928ea624775472df96f GIT binary patch literal 4257 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 q+k6pU4kZW9-uYkprWarU literal 0 HcmV?d00001 diff --git a/icons/turf/floors/reinf_plasma_glass.dmi b/icons/turf/floors/reinf_plasma_glass.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1bf4dd41734c898e93a643c642d01df27ca829ca GIT binary patch literal 4047 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 A3;+NC diff --git a/icons/turf/floors/snow_turf.dmi b/icons/turf/floors/snow_turf.dmi index e7fef38602b2aed43320cd9bb5f7c5ecfd5a3592..8b70aa44896fe2d2a90cc83a4d0f6969b253ad55 100644 GIT binary patch literal 5159 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 literal 10907 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 From ee2d847dc4579d318e7803606728912e7e69dc08 Mon Sep 17 00:00:00 2001 From: cowbot92 <75333826+cowbot92@users.noreply.github.com> Date: Wed, 6 Dec 2023 12:21:34 -0500 Subject: [PATCH 132/281] more barsigns for later --- code/game/machinery/barsigns.dm | 18 ++++++++++++++++++ icons/obj/barsigns.dmi | Bin 210663 -> 268262 bytes 2 files changed, 18 insertions(+) diff --git a/code/game/machinery/barsigns.dm b/code/game/machinery/barsigns.dm index b3172c518943..53edc780a79c 100644 --- a/code/game/machinery/barsigns.dm +++ b/code/game/machinery/barsigns.dm @@ -427,6 +427,24 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) desc = "The warehouse yearns for a higher calling... so Supply has declared BARGONIA!" neon_color = COLOR_WHITE +/datum/barsign/cult_cove + name = "Cult Cove" + icon_state = "cult-cove" + desc = "Nar'Sie's favourite retreat" + neon_color = COLOR_RED + +/datum/barsign/neon_flamingo + name = "Neon Flamingo" + icon_state = "neon-flamingo" + desc = "A bus for all but the flamboyantly challenged." + neon_color = COLOR_PINK + +/datum/barsign/slowdive + name = "Slowdive" + icon_state = "slowdive" + desc = "First stop out of hell, last stop before heaven." + neon_color = COLOR_RED + // Hidden signs list below this point /datum/barsign/hiddensigns diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi index 5b0e52673269849c0a11032032bbb0c997b15471..584395f14644a3fd50776ca3357f1c082e268229 100644 GIT binary patch literal 268262 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 literal 210663 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%0D*}k~J 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%0AdSKB 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�)3B&)+j1wXF<+1+7S(x5 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

  • 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