From b59132ad604d95ce223ff6647a396301295c20ff Mon Sep 17 00:00:00 2001 From: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Date: Wed, 19 Mar 2025 19:42:16 -0700 Subject: [PATCH] Removes Corner Smoothing (Mild Bitmask Improvements) (#90002) ## About The Pull Request [Removes all remaining users of SMOOTH_CORNER + dirt automation](https://github.com/tgstation/tgstation/commit/71d120511a372501ac546b2571ef570eb4426a56) Removes all remaining instances of overlay smoothing (the deprecated system that stitches corners together IN ENGINE) from the game. This amounts to: The test smoothing wall, which I converted to just bitmask + diagonals Stationary canisters, which I've done the same to (alongside adding all the states to gags, which around doubled their gags count). These autocut now. I've also given dirt icons autocutting, for spriter convieneince (I would have done this before but I didn't know they smoothed) [Removes corner smoothing from the codebase](https://github.com/tgstation/tgstation/commit/98ebe5815223a3078c2e591fd277b9418ed03278) This code is OLD, and has been functionally deprecated for as long as I've been here. It basically does what bitmask smoothing does, but instead of prebaking connections they're formed in engine with overlays. This is... fine, and does TECHNICALLY allow for unique effects, but none's gonna use it because the details are so niche, so it just becomes a risk factor for someone fucking up and using overlays for some reason. What it does do then is clutter up our smoothing code with 2 different async systems, one of which functions SLIGHTLY differently from its brother. IMO it just works to confuse people trying to read smoothing code (already quite confusing). I've removed it, alongside its bespoke code/variables, excluding area_limited_icon_smoothing, a var on areas that prevents smoothing out of network, which I have instead integrated into bitmask smoothing. I've updated snowflake's documentation to be more up to date with modern systems, and earmarked where explanations/automation for the more... underdeveloped bits of smoothing should go in the future. ## Why It's Good For The Game I relapsed and needed something to put that energy towards. We don't really want people to use this, and none knows enough about it to take advantage of its theoretical uses. Really its only purpose right now is making understanding diagonal smoothing easier, and that's not all that hard of a task. Better to remove and integrate then to let rot and confuse. ## Changelog :cl: add: Smoothed objects on shuttles now will only smooth with other shuttles (added support for extensions of this system) refactor: I've funked around with our smoothing system, cutting out some older code. Lemme know if anything is weird PLEASE /:cl: --- .../LavaRuins/lavaland_surface_gas.dmm | 2 - _maps/map_files/Birdshot/birdshot.dmm | 1 - _maps/map_files/MetaStation/MetaStation.dmm | 1 - .../map_files/NebulaStation/NebulaStation.dmm | 3 - _maps/map_files/wawastation/wawastation.dmm | 1 - code/__DEFINES/icon_smoothing.dm | 26 +- code/__HELPERS/icon_smoothing.dm | 325 +++--------------- .../greyscale_configs/greyscale_objects.dm | 5 + .../smooth_canister_stationary.json | 284 ++++++++++++--- .../smooth_canister_stationary_overlays.json | 18 + code/game/area/areas.dm | 2 +- code/game/atom/_atom.dm | 10 +- code/game/atoms_movable.dm | 3 - .../objects/effects/decals/cleanable/misc.dm | 4 +- code/game/objects/structures.dm | 2 - .../structures/beds_chairs/alien_nest.dm | 1 - code/game/objects/structures/false_walls.dm | 2 - code/game/objects/structures/window.dm | 1 - code/game/turfs/open/_open.dm | 1 - .../atmospherics/machinery/components/tank.dm | 19 +- .../modules/transport/tram/tram_structures.dm | 1 - icons/effects/dirt.dmi | Bin 22531 -> 10021 bytes icons/effects/dirt.png | Bin 0 -> 6234 bytes icons/effects/dirt.png.toml | 2 + icons/effects/dirt_misc.dmi | Bin 0 -> 10454 bytes .../pipes_n_cables/stationary_canisters.dmi | Bin 2635 -> 3287 bytes .../pipes_n_cables/stationary_canisters.png | Bin 0 -> 414 bytes .../stationary_canisters.png.toml | 2 + .../stationary_canisters_misc.dmi | Bin 0 -> 1447 bytes icons/turf/smooth_wall.dmi | Bin 952 -> 1516 bytes 30 files changed, 333 insertions(+), 383 deletions(-) create mode 100644 code/datums/greyscale/json_configs/smooth_canister_stationary_overlays.json create mode 100644 icons/effects/dirt.png create mode 100644 icons/effects/dirt.png.toml create mode 100644 icons/effects/dirt_misc.dmi create mode 100644 icons/obj/pipes_n_cables/stationary_canisters.png create mode 100644 icons/obj/pipes_n_cables/stationary_canisters.png.toml create mode 100644 icons/obj/pipes_n_cables/stationary_canisters_misc.dmi diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm index bcea9d1adbd..726a767d107 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_gas.dmm @@ -244,7 +244,6 @@ /obj/structure/sign/warning/fire/directional/north, /obj/structure/reagent_dispensers/fueltank/large{ anchored = 1; - can_be_unanchored = 1 }, /obj/structure/railing{ dir = 8 @@ -381,7 +380,6 @@ /obj/structure/sign/warning/fire/directional/south, /obj/structure/reagent_dispensers/fueltank/large{ anchored = 1; - can_be_unanchored = 1 }, /obj/structure/railing{ dir = 8 diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 45b856d792d..559250d954c 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -8447,7 +8447,6 @@ }, /obj/structure/closet{ anchored = 1; - can_be_unanchored = 1; name = "Cold protection gear" }, /obj/item/clothing/suit/hooded/wintercoat/science, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 4ba31f9a0e4..5b08ff2818e 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -3437,7 +3437,6 @@ "bjs" = ( /obj/structure/closet{ anchored = 1; - can_be_unanchored = 1; name = "Cold protection gear" }, /obj/item/clothing/shoes/winterboots, diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm index 117a0563d77..3557eb80fa9 100644 --- a/_maps/map_files/NebulaStation/NebulaStation.dmm +++ b/_maps/map_files/NebulaStation/NebulaStation.dmm @@ -7991,7 +7991,6 @@ "blI" = ( /obj/structure/guncase/shotgun{ anchored = 1; - can_be_unanchored = 1; open = 0 }, /obj/item/gun/ballistic/shotgun/doublebarrel, @@ -47611,7 +47610,6 @@ /obj/item/storage/bag/xeno, /obj/structure/closet{ anchored = 1; - can_be_unanchored = 1; name = "Cold protection gear" }, /turf/open/floor/iron/dark, @@ -137565,7 +137563,6 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/closet{ anchored = 1; - can_be_unanchored = 1; name = "Cold protection gear" }, /obj/effect/turf_decal/tile/purple/fourcorners, diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 91a0dc9b7f5..37d13a784e4 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -55155,7 +55155,6 @@ /obj/machinery/firealarm/directional/south, /obj/structure/closet{ anchored = 1; - can_be_unanchored = 1; name = "Cold protection gear" }, /obj/item/clothing/shoes/winterboots, diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index 3fb41443a73..33368636198 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -1,28 +1,25 @@ /* 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) +#define SMOOTH_BITMASK (1<<0) /// Limits SMOOTH_BITMASK to only cardinal directions, for use with cardinal smoothing -#define SMOOTH_BITMASK_CARDINALS (1<<2) +#define SMOOTH_BITMASK_CARDINALS (1<<1) /// Atom has diagonal corners, with underlays under them. -#define SMOOTH_DIAGONAL_CORNERS (1<<3) +#define SMOOTH_DIAGONAL_CORNERS (1<<2) /// Atom will smooth with the borders of the map. -#define SMOOTH_BORDER (1<<4) +#define SMOOTH_BORDER (1<<3) /// Atom is currently queued to smooth. -#define SMOOTH_QUEUED (1<<5) +#define SMOOTH_QUEUED (1<<4) /// Smooths with objects, and will thus need to scan turfs for contents. -#define SMOOTH_OBJ (1<<6) +#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<<7) +/// Is incompatible with SMOOTH_DIAGONAL_CORNERS because border objects don't have corners +#define SMOOTH_BORDER_OBJECT (1<<6) -#define USES_SMOOTHING (SMOOTH_CORNERS|SMOOTH_BITMASK|SMOOTH_BITMASK_CARDINALS) +#define USES_SMOOTHING (SMOOTH_BITMASK|SMOOTH_BITMASK_CARDINALS) DEFINE_BITFIELD(smoothing_flags, list( - "SMOOTH_CORNERS" = SMOOTH_CORNERS, "SMOOTH_BITMASK" = SMOOTH_BITMASK, "SMOOTH_BITMASK_CARDINALS" = SMOOTH_BITMASK_CARDINALS, "SMOOTH_DIAGONAL_CORNERS" = SMOOTH_DIAGONAL_CORNERS, @@ -207,8 +204,9 @@ DEFINE_BITFIELD(smoothing_junction, list( #define SMOOTH_GROUP_SPIDER_WEB_WALL_TOUGH S_OBJ(73) // /obj/structure/spider/stickyweb/sealed/thick #define SMOOTH_GROUP_SPIDER_WEB_WALL_MIRROR S_OBJ(74) // /obj/structure/spider/stickyweb/sealed/reflector -#define SMOOTH_GROUP_GRAV_FIELD S_OBJ(69) -#define SMOOTH_GROUP_GIRDER S_OBJ(75) +#define SMOOTH_GROUP_GRAV_FIELD S_OBJ(75) +#define SMOOTH_GROUP_GIRDER S_OBJ(76) +#define SMOOTH_GROUP_TEST_WALL S_OBJ(77) // I'm a lazy bum who doesn't want to increment all of these up by 1 ~Lemon /// Performs the work to set smoothing_groups and canSmoothWith. /// An inlined function used in both turf/Initialize and atom/Initialize. diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 88ca3dbe11c..3893ef04ce4 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -1,17 +1,29 @@ -//generic (by snowflake) tile smoothing code; smooth your icons with this! +//generic (by snowflake + others) 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 '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; + Smoothed atoms are displayed using prebaked icon states which have been "cut" from a template to match a set of possible smoothing directions. + This allows for a variety of effects, such as nice wall textures, gloopy slime, carpet that makes sense, etc etc etc + + To use this, just set your atom's 'smoothing_flags' var to SMOOTH_BITMASK. There are other smoothing strategies but that's all we need to worry about right now + If you don't want your atom's icon to smooth with anything but atoms of the same type, set the string 'canSmoothWith' to null; 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. + Each atom has its own icon file with all its icon states, this file is typically generated automatically from a png/toml using hypnagoic, our external cutter. + See `wall.dmi' 'wall.png' and 'wall.png.toml' for an example, alongside [the icon cutter documentation](../../icons/Cutter.md) 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_CORNERS' flag to the atom's smoothing_flags var (in addition to either SMOOTH_TRUE or SMOOTH_MORE). + To make your atom smooth diagonally you need all the proper icon states (hypnagoic does not support these currently, TODO) + They're constructed out of 12 "corners", 4 outer corners, 4 "outside" inner corners and 4 "inside" inner corners + - 5, 6, 9 and 10 get what you can think of as "outside" bars, they're corners with no inside, like below (smoothing from the POV of [X]). + - [X]X + - X + - 21, 38, 74, 137 get "inside" bars, still built with the same "outside" edges. + - [X]X + - X X + I shouldn't like, need to tell you this, ideally hypnagogic would just support it, but I haven't done that yet and I wanted to write this down for now. + + Then add the 'SMOOTH_DIAGONAL_CORNERS' flag to the atom's smoothing_flags var (in addition to SMOOTH_BITMASK). 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. @@ -19,14 +31,15 @@ If you wish to map a diagonal wall corner with a fixed underlay, you must configure the turf's 'fixed_underlay' list var, like so: fixed_underlay = list("icon"='icon_file.dmi', "icon_state"="iconstatename") A non null 'fixed_underlay' list var will skip copying the previous turf appearance and always use the list. If the list is - not set properly, the underlay will default to regular floor plating. + not set properly, the underlay will default to regular floor plating. + NOTE: a special case of this involves setting fixed_underlay to list("space" = TRUE), which will force it to draw space below the wall, no matter what To see an example of a diagonal wall, see '/turf/closed/wall/mineral/titanium' and its subtypes. -*/ -#define NO_ADJ_FOUND 0 -#define ADJ_FOUND 1 -#define NULLTURF_BORDER 2 + BORDER SMOOTHING INSTRUCTIONS + Ok so we have code to smooth border objects together, unfortunately for you I don't remember how they're supposed to be rendered (AND WE HAVE NO CUTTER SUPPORT) + I'll fill this in when/if I add proper cutting for these, they're so painful to put together by hand I don't really want to even describe it to you +*/ GLOBAL_LIST_INIT(adjacent_direction_lookup, generate_adjacent_directions()) @@ -104,66 +117,6 @@ xxx xxx xxx (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 - - 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() if(QDELETED(src)) @@ -172,12 +125,7 @@ xxx xxx xxx 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 - corners_cardinal_smooth(calculate_adjacencies()) - else if(smoothing_flags & (SMOOTH_BITMASK|SMOOTH_BITMASK_CARDINALS)) + if(smoothing_flags & (SMOOTH_BITMASK|SMOOTH_BITMASK_CARDINALS)) bitmask_smooth() else CRASH("smooth_icon called for [src] with smoothing_flags == [smoothing_flags]") @@ -189,157 +137,6 @@ xxx xxx xxx . = ..() update_appearance(~UPDATE_SMOOTHING) -/atom/proc/corners_diagonal_smooth(adjacencies) - switch(adjacencies) - if(NORTH_JUNCTION|WEST_JUNCTION) - replace_smooth_overlays("d-se","d-se-0") - if(NORTH_JUNCTION|EAST_JUNCTION) - replace_smooth_overlays("d-sw","d-sw-0") - if(SOUTH_JUNCTION|WEST_JUNCTION) - replace_smooth_overlays("d-ne","d-ne-0") - if(SOUTH_JUNCTION|EAST_JUNCTION) - replace_smooth_overlays("d-nw","d-nw-0") - - if(NORTH_JUNCTION|WEST_JUNCTION|NORTHWEST_JUNCTION) - replace_smooth_overlays("d-se","d-se-1") - if(NORTH_JUNCTION|EAST_JUNCTION|NORTHEAST_JUNCTION) - replace_smooth_overlays("d-sw","d-sw-1") - if(SOUTH_JUNCTION|WEST_JUNCTION|SOUTHWEST_JUNCTION) - replace_smooth_overlays("d-ne","d-ne-1") - if(SOUTH_JUNCTION|EAST_JUNCTION|SOUTHEAST_JUNCTION) - replace_smooth_overlays("d-nw","d-nw-1") - - else - corners_cardinal_smooth(adjacencies) - return FALSE - - icon_state = "" - return TRUE - - -/atom/proc/corners_cardinal_smooth(adjacencies) - var/mutable_appearance/temp_ma - - //NW CORNER - var/nw = "1-i" - if((adjacencies & NORTH_JUNCTION) && (adjacencies & WEST_JUNCTION)) - if(adjacencies & NORTHWEST_JUNCTION) - nw = "1-f" - else - nw = "1-nw" - else - if(adjacencies & NORTH_JUNCTION) - nw = "1-n" - 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 & NORTH_JUNCTION) && (adjacencies & EAST_JUNCTION)) - if(adjacencies & NORTHEAST_JUNCTION) - ne = "2-f" - else - ne = "2-ne" - else - if(adjacencies & NORTH_JUNCTION) - ne = "2-n" - 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 & SOUTH_JUNCTION) && (adjacencies & WEST_JUNCTION)) - if(adjacencies & SOUTHWEST_JUNCTION) - sw = "3-f" - else - sw = "3-sw" - else - if(adjacencies & SOUTH_JUNCTION) - sw = "3-s" - 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 & SOUTH_JUNCTION) && (adjacencies & EAST_JUNCTION)) - if(adjacencies & SOUTHEAST_JUNCTION) - se = "4-f" - else - se = "4-se" - else - if(adjacencies & SOUTH_JUNCTION) - se = "4-s" - else if(adjacencies & EAST_JUNCTION) - se = "4-e" - temp_ma = mutable_appearance(icon, se) - se = temp_ma.appearance - - var/list/new_overlays - - if(top_left_corner != nw) - cut_overlay(top_left_corner) - top_left_corner = nw - LAZYADD(new_overlays, nw) - - if(top_right_corner != ne) - cut_overlay(top_right_corner) - top_right_corner = ne - LAZYADD(new_overlays, ne) - - if(bottom_right_corner != sw) - cut_overlay(bottom_right_corner) - bottom_right_corner = sw - LAZYADD(new_overlays, sw) - - if(bottom_left_corner != se) - cut_overlay(bottom_left_corner) - bottom_left_corner = se - LAZYADD(new_overlays, se) - - if(new_overlays) - add_overlay(new_overlays) - - -///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(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. * @@ -351,6 +148,8 @@ xxx xxx xxx // cache for sanic speed var/canSmoothWith = src.canSmoothWith + var/area/home_base = get_area(src) + var/area_limited_icon_smoothing = home_base?.area_limited_icon_smoothing var/smooth_border = (smoothing_flags & SMOOTH_BORDER) var/smooth_obj = (smoothing_flags & SMOOTH_OBJ) @@ -360,7 +159,7 @@ xxx xxx xxx #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)) { \ + if(neighbor && ##BORDER_CHECK(neighbor, direction) && (!area_limited_icon_smoothing || istype(neighbor.loc, area_limited_icon_smoothing))) { \ var/neighbor_smoothing_groups = neighbor.smoothing_groups; \ if(neighbor_smoothing_groups) { \ for(var/target in canSmoothWith) { \ @@ -459,13 +258,16 @@ xxx xxx xxx #undef BITMASK_FOUND #undef SEARCH_ADJ_IN_DIR + +#define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi' +#define DEFAULT_UNDERLAY_ICON_STATE "plating" + ///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 @@ -513,6 +315,8 @@ xxx xxx xxx return return ..() +#undef DEFAULT_UNDERLAY_ICON +#undef DEFAULT_UNDERLAY_ICON_STATE //Icon smoothing helpers /proc/smooth_zlevel(zlevel, now = FALSE) @@ -530,50 +334,6 @@ xxx xxx xxx else QUEUE_SMOOTH(movable_to_smooth) - -/atom/proc/clear_smooth_overlays() - cut_overlay(top_left_corner) - top_left_corner = null - cut_overlay(top_right_corner) - top_right_corner = null - cut_overlay(bottom_right_corner) - bottom_right_corner = null - 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/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 - new_overlays += nw - - top_right_corner = ne - new_overlays += ne - - bottom_left_corner = sw - new_overlays += sw - - bottom_right_corner = se - 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 @@ -650,15 +410,10 @@ xxx xxx xxx /turf/closed/wall/smooth name = "smooth wall" icon = 'icons/turf/smooth_wall.dmi' - icon_state = "smooth" - smoothing_flags = SMOOTH_CORNERS|SMOOTH_DIAGONAL_CORNERS|SMOOTH_BORDER - smoothing_groups = null - canSmoothWith = null + icon_state = "smooth_wall-0" + base_icon_state = "smooth_wall" + smoothing_flags = SMOOTH_BITMASK|SMOOTH_DIAGONAL_CORNERS|SMOOTH_BORDER + smoothing_groups = SMOOTH_GROUP_TEST_WALL + canSmoothWith = SMOOTH_GROUP_TEST_WALL -#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/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm index 9556612be18..4f17ad5ae57 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm @@ -122,6 +122,11 @@ icon_file = 'icons/obj/pipes_n_cables/stationary_canisters.dmi' json_config = 'code/datums/greyscale/json_configs/smooth_canister_stationary.json' +/datum/greyscale_config/stationary_canister_overlays + name = "Stationary Canister" + icon_file = 'icons/obj/pipes_n_cables/stationary_canisters_misc.dmi' + json_config = 'code/datums/greyscale/json_configs/smooth_canister_stationary_overlays.json' + // MISC ATMOSPHERICS /datum/greyscale_config/meter name = "Meter" diff --git a/code/datums/greyscale/json_configs/smooth_canister_stationary.json b/code/datums/greyscale/json_configs/smooth_canister_stationary.json index df01ce1e6d2..62e97d22f76 100644 --- a/code/datums/greyscale/json_configs/smooth_canister_stationary.json +++ b/code/datums/greyscale/json_configs/smooth_canister_stationary.json @@ -1,184 +1,376 @@ { - "smooth": [ + "canister-0": [ { "type": "icon_state", - "icon_state": "smooth", + "icon_state": "canister-0", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "window-fg": [ + "canister-1": [ { "type": "icon_state", - "icon_state": "window-fg", + "icon_state": "canister-1", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "window-bg": [ + "canister-2": [ { "type": "icon_state", - "icon_state": "window-bg", + "icon_state": "canister-2", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "1-i": [ + "canister-3": [ { "type": "icon_state", - "icon_state": "1-i", + "icon_state": "canister-3", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "2-i": [ + "canister-4": [ { "type": "icon_state", - "icon_state": "2-i", + "icon_state": "canister-4", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "3-i": [ + "canister-5": [ { "type": "icon_state", - "icon_state": "3-i", + "icon_state": "canister-5", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "4-i": [ + "canister-6": [ { "type": "icon_state", - "icon_state": "4-i", + "icon_state": "canister-6", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "1-n": [ + "canister-7": [ { "type": "icon_state", - "icon_state": "1-n", + "icon_state": "canister-7", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "2-n": [ + "canister-8": [ { "type": "icon_state", - "icon_state": "2-n", + "icon_state": "canister-8", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "3-s": [ + "canister-9": [ { "type": "icon_state", - "icon_state": "3-s", + "icon_state": "canister-9", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "4-s": [ + "canister-10": [ { "type": "icon_state", - "icon_state": "4-s", + "icon_state": "canister-10", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "1-w": [ + "canister-11": [ { "type": "icon_state", - "icon_state": "1-w", + "icon_state": "canister-11", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "2-e": [ + "canister-12": [ { "type": "icon_state", - "icon_state": "2-e", + "icon_state": "canister-12", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "3-w": [ + "canister-13": [ { "type": "icon_state", - "icon_state": "3-w", + "icon_state": "canister-13", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "4-e": [ + "canister-14": [ { "type": "icon_state", - "icon_state": "4-e", + "icon_state": "canister-14", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "1-nw": [ + "canister-15": [ { "type": "icon_state", - "icon_state": "1-nw", + "icon_state": "canister-15", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "2-ne": [ + "canister-21": [ { "type": "icon_state", - "icon_state": "2-ne", + "icon_state": "canister-21", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "3-sw": [ + "canister-23": [ { "type": "icon_state", - "icon_state": "3-sw", + "icon_state": "canister-23", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "4-se": [ + "canister-29": [ { "type": "icon_state", - "icon_state": "4-se", + "icon_state": "canister-29", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "1-f": [ + "canister-31": [ { "type": "icon_state", - "icon_state": "1-f", + "icon_state": "canister-31", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "2-f": [ + "canister-38": [ { "type": "icon_state", - "icon_state": "2-f", + "icon_state": "canister-38", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "3-f": [ + "canister-39": [ { "type": "icon_state", - "icon_state": "3-f", + "icon_state": "canister-39", "blend_mode": "overlay", "color_ids": [ 1 ] } ], - "4-f": [ + "canister-46": [ { "type": "icon_state", - "icon_state": "4-f", + "icon_state": "canister-46", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-47": [ + { + "type": "icon_state", + "icon_state": "canister-47", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-55": [ + { + "type": "icon_state", + "icon_state": "canister-55", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-63": [ + { + "type": "icon_state", + "icon_state": "canister-63", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-74": [ + { + "type": "icon_state", + "icon_state": "canister-74", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-75": [ + { + "type": "icon_state", + "icon_state": "canister-75", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-78": [ + { + "type": "icon_state", + "icon_state": "canister-78", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-79": [ + { + "type": "icon_state", + "icon_state": "canister-79", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-95": [ + { + "type": "icon_state", + "icon_state": "canister-95", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-110": [ + { + "type": "icon_state", + "icon_state": "canister-110", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-111": [ + { + "type": "icon_state", + "icon_state": "canister-111", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-127": [ + { + "type": "icon_state", + "icon_state": "canister-127", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-137": [ + { + "type": "icon_state", + "icon_state": "canister-137", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-139": [ + { + "type": "icon_state", + "icon_state": "canister-139", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-141": [ + { + "type": "icon_state", + "icon_state": "canister-141", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-143": [ + { + "type": "icon_state", + "icon_state": "canister-143", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-157": [ + { + "type": "icon_state", + "icon_state": "canister-157", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-159": [ + { + "type": "icon_state", + "icon_state": "canister-159", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-175": [ + { + "type": "icon_state", + "icon_state": "canister-175", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-191": [ + { + "type": "icon_state", + "icon_state": "canister-191", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-203": [ + { + "type": "icon_state", + "icon_state": "canister-203", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-207": [ + { + "type": "icon_state", + "icon_state": "canister-207", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-223": [ + { + "type": "icon_state", + "icon_state": "canister-223", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-239": [ + { + "type": "icon_state", + "icon_state": "canister-239", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "canister-255": [ + { + "type": "icon_state", + "icon_state": "canister-255", "blend_mode": "overlay", "color_ids": [ 1 ] } diff --git a/code/datums/greyscale/json_configs/smooth_canister_stationary_overlays.json b/code/datums/greyscale/json_configs/smooth_canister_stationary_overlays.json new file mode 100644 index 00000000000..6dc7e73c32b --- /dev/null +++ b/code/datums/greyscale/json_configs/smooth_canister_stationary_overlays.json @@ -0,0 +1,18 @@ +{ + "window-fg": [ + { + "type": "icon_state", + "icon_state": "window-fg", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "window-bg": [ + { + "type": "icon_state", + "icon_state": "window-bg", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index a68c70c37cd..cbe227905f3 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -103,7 +103,7 @@ var/list/cameras - ///Typepath to limit the areas (subtypes included) that atoms in this area can smooth with. Used for shuttles. + /// Typepath to limit the areas (subtypes included) that atoms in this area can smooth with. Used for shuttles. var/area/area_limited_icon_smoothing /// The energy usage of the area in the last machines SS tick. diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index 4905d11ced2..88ce25b4e2d 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -111,15 +111,7 @@ ///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 + var/smoothing_junction = null ///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. diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 13cc9d35d7c..9f3299d95b4 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -87,9 +87,6 @@ ///Internal holder for emissive blocker object, do not use directly use blocks_emissive var/atom/movable/render_step/emissive_blocker/em_block - ///Used for the calculate_adjacencies proc for icon smoothing. - var/can_be_unanchored = FALSE - ///Lazylist to keep track on the sources of illumination. var/list/affected_dynamic_lights ///Highest-intensity light affecting us, which determines our visibility. diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 916192e74a4..0bf7cdff576 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -64,7 +64,7 @@ /obj/effect/decal/cleanable/dirt name = "dirt" desc = "Someone should clean that up." - icon = 'icons/effects/dirt.dmi' + icon = 'icons/effects/dirt_misc.dmi' icon_state = "dirt-flat-0" base_icon_state = "dirt" smoothing_flags = NONE @@ -83,6 +83,8 @@ return var/turf/T = get_turf(src) if(T.tiled_dirt && is_tileable) + icon = 'icons/effects/dirt.dmi' + icon_state = "dirt-0" smoothing_flags = SMOOTH_BITMASK QUEUE_SMOOTH(src) if(smoothing_flags & USES_SMOOTHING) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 7f5e4c6b76d..193a5c8b669 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -22,8 +22,6 @@ if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH(src) QUEUE_SMOOTH_NEIGHBORS(src) - if(smoothing_flags & SMOOTH_CORNERS) - icon_state = "" GLOB.cameranet.updateVisibility(src) /obj/structure/Destroy(force) diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index b0de02fef48..47b1ab530d9 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -7,7 +7,6 @@ icon_state = "nest-0" base_icon_state = "nest" max_integrity = 120 - can_be_unanchored = FALSE smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_ALIEN_NEST canSmoothWith = SMOOTH_GROUP_ALIEN_NEST diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 22c18a15212..f473294b71e 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -15,7 +15,6 @@ smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS canSmoothWith = SMOOTH_GROUP_WALLS - can_be_unanchored = FALSE can_atmos_pass = ATMOS_PASS_DENSITY rad_insulation = RAD_MEDIUM_INSULATION material_flags = MATERIAL_EFFECTS @@ -66,7 +65,6 @@ if(opening) smoothing_flags = NONE - clear_smooth_overlays() else smoothing_flags = SMOOTH_BITMASK QUEUE_SMOOTH(src) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index bf80ed8f6d7..7ac5a3eec03 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -9,7 +9,6 @@ flags_1 = ON_BORDER_1 obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION_DIR | IGNORE_DENSITY max_integrity = 50 - can_be_unanchored = TRUE resistance_flags = ACID_PROOF armor_type = /datum/armor/structure_window can_atmos_pass = ATMOS_PASS_PROC diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 991e98b6eb9..e2aac7afa98 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -235,7 +235,6 @@ planetary_atmos = TRUE initial_gas_mix = LAVALAND_DEFAULT_ATMOS baseturfs = /turf/open/indestructible/hierophant - smoothing_flags = SMOOTH_CORNERS smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_HIEROPHANT canSmoothWith = SMOOTH_GROUP_HIEROPHANT diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index 118e1444ad6..57960bc9ec2 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -2,7 +2,8 @@ /obj/machinery/atmospherics/components/tank icon = 'icons/obj/pipes_n_cables/stationary_canisters.dmi' - icon_state = "smooth" + icon_state = "canister-0" + base_icon_state = "canister" name = "pressure tank" desc = "A large vessel containing pressurized gas." @@ -20,13 +21,14 @@ initialize_directions = NONE custom_reconcilation = TRUE - smoothing_flags = SMOOTH_CORNERS | SMOOTH_OBJ + smoothing_flags = SMOOTH_BITMASK | SMOOTH_OBJ smoothing_groups = SMOOTH_GROUP_GAS_TANK canSmoothWith = SMOOTH_GROUP_GAS_TANK appearance_flags = KEEP_TOGETHER|LONG_GLIDE greyscale_config = /datum/greyscale_config/stationary_canister greyscale_colors = "#ffffff" + var/overlay_greyscale_config = /datum/greyscale_config/stationary_canister_overlays ///The image showing the gases inside of the tank var/image/window @@ -69,7 +71,7 @@ if(!knob_overlays) knob_overlays = list() for(var/dir in GLOB.cardinals) - knob_overlays["[dir]"] = image('icons/obj/pipes_n_cables/stationary_canisters.dmi', icon_state = "knob", dir = dir, layer = FLOAT_LAYER) + knob_overlays["[dir]"] = image('icons/obj/pipes_n_cables/stationary_canisters_misc.dmi', icon_state = "knob", dir = dir, layer = FLOAT_LAYER) if(!crack_states) crack_states = list() @@ -81,7 +83,7 @@ AddComponent(/datum/component/gas_leaker, leak_rate = 0.05) AddElement(/datum/element/volatile_gas_storage) - AddElement(/datum/element/crackable, 'icons/obj/pipes_n_cables/stationary_canisters.dmi', crack_states) + AddElement(/datum/element/crackable, 'icons/obj/pipes_n_cables/stationary_canisters_misc.dmi', crack_states) RegisterSignal(src, COMSIG_MERGER_ADDING, PROC_REF(merger_adding)) RegisterSignal(src, COMSIG_MERGER_REMOVING, PROC_REF(merger_removing)) @@ -318,12 +320,13 @@ if(!air_contents) window = null return + var/icon/greyscaled_icon = SSgreyscale.GetColoredIconByType(overlay_greyscale_config, greyscale_colors) - window = image(icon, icon_state = "window-bg", layer = FLOAT_LAYER) + window = image(greyscaled_icon, icon_state = "window-bg", layer = FLOAT_LAYER) var/static/alpha_filter if(!alpha_filter) // Gotta do this separate since the icon may not be correct at world init - alpha_filter = filter(type="alpha", icon = icon('icons/obj/pipes_n_cables/stationary_canisters.dmi', "window-bg")) + alpha_filter = filter(type="alpha", icon = icon('icons/obj/pipes_n_cables/stationary_canisters_misc.dmi', "window-bg")) var/list/new_underlays = list() for(var/obj/effect/overlay/gas/gas as anything in air_contents.return_visuals(get_turf(src))) @@ -331,7 +334,7 @@ new_underlay.filters = alpha_filter new_underlays += new_underlay - var/image/foreground = image(icon, icon_state = "window-fg", layer = FLOAT_LAYER) + var/image/foreground = image(greyscaled_icon, icon_state = "window-fg", layer = FLOAT_LAYER) foreground.underlays = new_underlays window.overlays = list(foreground) @@ -500,7 +503,7 @@ // Tank Frame Structure /obj/structure/tank_frame - icon = 'icons/obj/pipes_n_cables/stationary_canisters.dmi' + icon = 'icons/obj/pipes_n_cables/stationary_canisters_misc.dmi' icon_state = "frame" anchored = FALSE density = TRUE diff --git a/code/modules/transport/tram/tram_structures.dm b/code/modules/transport/tram/tram_structures.dm index 6f8251c7966..abfca37fb56 100644 --- a/code/modules/transport/tram/tram_structures.dm +++ b/code/modules/transport/tram/tram_structures.dm @@ -36,7 +36,6 @@ smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_TRAM_STRUCTURE canSmoothWith = SMOOTH_GROUP_TRAM_STRUCTURE - can_be_unanchored = FALSE can_atmos_pass = ATMOS_PASS_DENSITY explosion_block = 3 receive_ricochet_chance_mod = 1.2 diff --git a/icons/effects/dirt.dmi b/icons/effects/dirt.dmi index c3eeae8a9c554a2cdb076a3c2c1bb7e9bd5b5d8a..5d5334f7bc9a41f0ac4c11f9ba5d66185c3668b1 100644 GIT binary patch literal 10021 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 VgZs7F|9j)OU~$R3@~rFQ{|D$K%K`uZ literal 22531 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 VCK*dwF zGLX6HM-aX7a7|hu^Wd@Hve2c$63x_DAj0wN2_kD@c&8Zt1oC3@4zreXmt4qA;n1JV zZqY7Ov6Wa^++exG!a;`Ez@J}&aA3L6|Jh^G8OHu`p%c$9UIZ7TMq5t_#@v#-CQKe? zg$fVu%gF-46?~NLZ{zVJd~~^<1rE_A6R6U=t{6N0EzlPGQ3{%_I~fTYb`pTJJ%&Ls z0#2HdI7AAxJ>WY}!@s%n6c!(>z|&_C{@wD5l0g6~SLld@KWv%- zS3zqB(&XNCH34Xf^orn#@U83kZqDrNNgDIt{L+_RhcA8U*Wk-v{=Bd;U|RkmRbUmb zV;my;g01Q}3*8Y!W2Z5{9`{$FdOPX~-w%7je-vYDu+LkeBZ+0THYp$3;GV!o#(G?# zGAzjB`p+PI>n#X>`W|aWyq2ai(lMByU!&$54>bl+@%^hI1h;TB{vi>6&T&R^%n{lw z5%5L}AN7$3lLd6O0)4gU$=icH%=KI-(AohJKW!0ol_df^=R^3SL-n_#4F=4krO&0> zCZz~v4#E0RV(_0l0ssDe!D<2|o|3N7f33(jPz4@eP%_=?%-4hr#%A&B; zZv=<_lj=FxN360<+ipLMJRAo@^{y2ZW`xZU;VPXky92?^0S0{W0a$O{WtQ6X4=*3X zKiv6x0sQ~7Fe+39#JIjf2|Tb!l)ikq!I4LtY1ju2NZ)#gP$Z9-5NQX6wvfg4Mw~y+ zF?WQP0(D=`Y1%+eY`QoM(4|_g@ajL|Sl#ov(^vJwa=8lras@{%KCeuj76wE~Ea5p{ z%wt&e{ig-+e-S}&6K(;wegZJ?5%Ad~_7^XWf{js{>Bx}*5tdg=0UYiL$3sFC zR+@k<#e5>B2M>TBB6XfV#E`B$xZV%rGpH_c|9#{{AM0lrup$y5O%?Rzq(x(>aCpcA zZ-jGqFAtayLXaa=kobKh@Ni{C=sQ4e6~f^w5azBRQ>seBCTW1)kxUUi1tfk~xM~$- zc)tnREG($0yS?~-Z=*T#7C|r%B7RWo_sH-bojW&6V)~%!p&!l6oL*B;a#%1$Isw;z z<2QZfxE@SZU=ftt zE#YAcyYaQu~}&9xw8xGLksFARfLX;yByz(I!+my$~gkcow?ExkrMB;becmtO8 zd(e{LUc+E^FZ>EEUlKzgbLCIy9#ycx-s&p5>^PTU=;vk`4y-Fs(U}$=J z@(GU9J(Wj;OD{S>1|ZCWL!%n73N}dvwedYNfZ>>#FgSN^8vgvx{~UhsgCArj!MZs7 Y|3K^LhDG%#8UO$Q07*qoM6N<$g1X9a(f|Me diff --git a/icons/effects/dirt.png b/icons/effects/dirt.png new file mode 100644 index 0000000000000000000000000000000000000000..bee5b205ac1ba689ed76a1b49a6b1ddca3f438fa GIT binary patch literal 6234 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 M07*qoM6N<$f)8E%Qvd(} literal 0 HcmV?d00001 diff --git a/icons/obj/pipes_n_cables/stationary_canisters.dmi b/icons/obj/pipes_n_cables/stationary_canisters.dmi index 4f87a50845b056903f88618824300e2de38143ee..062ee812d405bd1b144d44a3ce1da268384552bb 100644 GIT binary patch literal 3287 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 ITT>MF-}c0F&;S4c literal 2635 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 DH%;Dp diff --git a/icons/obj/pipes_n_cables/stationary_canisters.png b/icons/obj/pipes_n_cables/stationary_canisters.png new file mode 100644 index 0000000000000000000000000000000000000000..d25fc52caa2b529ad574878c80042efb0423ffe6 GIT binary patch literal 414 zcmV;P0b%}$P)001Ba0{{R3XHjm(0000OP)t-sz`(%W z-QDWy>i_@$$jHc+mX?5kfU>f(%IEc?00001bW%=J06^y0W&i*IG)Y83R7i>K)M8!IaMAmTs4T&0)Kc1muA+uwoN_GC^)ov=gL~-4F zsJ)2e+(%{JAoFsIpK^c>bC(0e8LFUzlAsgCKqtW)Y`#kX*^(8IciSM(HIRLx`LpmI zmn>8H5KQoT5w$q15SX!fH=$n zwm3|A%KzZsgC`vBa)7uuNl@&DE#_4QaEJNH$3@g(duM`s2UD#0cDsVC1lUF8IH>H{ zUB7joRq!0*J_#&dw;PUw0`|v{FP%0>do7RA`Enidaek$M57V%m;KlT!fb;b_ zoblt*$Dgux&=(gkyb<8-V*o!tWUhebUy&h1g_8dUyqd@07lqI-0>h!6Q~&?~07*qo IM6N<$f`YoeL;wH) literal 0 HcmV?d00001 diff --git a/icons/obj/pipes_n_cables/stationary_canisters.png.toml b/icons/obj/pipes_n_cables/stationary_canisters.png.toml new file mode 100644 index 00000000000..1832dd37a82 --- /dev/null +++ b/icons/obj/pipes_n_cables/stationary_canisters.png.toml @@ -0,0 +1,2 @@ +output_name = "canister" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/pipes_n_cables/stationary_canisters_misc.dmi b/icons/obj/pipes_n_cables/stationary_canisters_misc.dmi new file mode 100644 index 0000000000000000000000000000000000000000..857b5a816b40c8857d65a667c3e36705d22e72f9 GIT binary patch literal 1447 zcmZ{kdpOez7{`AuV-}iDSS~Fkx0ZA&v&OItD^|H|BHAIhYHk^ltsT}`&5BdhVXdK~ zw7Fy=8S})cJ(SGJC1!3X9YoWTIGHtDJ~%(>1F}4+u*3h&&sS6q}G78y^P%X}7M(#E>ip7-$4_jt%F9 zG=6eCX?rkHMzZO$vU;pBtW6eAbc(l{*zA*>sMmNe^b~T`DmvXIu#zUPs z;XT{~(r(Qtn*65RV9!2`zp&kDzGIS?9E{fJ8?E1oB*#)>XM(ncX>-CfB618P@cdUW zEtKZR>b8$@s#WTgg*ca$dfitP?ZEFeFH(6a)aFdpm>d6tllvJ%qtgjUuJ6M9{Ec*_ zKb0@o%E&cIFfzNR5FmL3?RH7GJ7Dn?s%xtb{-68JxRtI1CxlDaj%}Ah*Kd&#!^Ul$kO)F2spBO&@D{1=+eCSK|NJi_ZLudu@C5jZQP1oMFJVcnJ zFu^D4%&{@j@$vB-K1$0&7*$ii?TC`|bHa3f0(-_RN*T>zY+;i6HJ!w*e%4H8C#Di~ zfF0rHZSWO_4Mv<*>iCVceRgEf(Bj;}!hnm5%j33_W8ri=-zxx?eL2SasG0>1_y&>h zgJ&}^@pGcyG-ph@f~cSm|JJZUblg7V@!dkpwkOasxpLbtWbXpg%)WQjJFVUEfpJY? z;?B;_!R8AY8F{CaV`F2|P7;Y!8a7M~aPuw@GJ1KpZwtgSTPuw(D%CZ#51mHKALyl% zVd|90IcRw$acW+kj7+DMsTwFi)90hBENhxSmBmU~o7I~(VVv#b-U}P)XwB$%b?21+ z!u9=m=5%qdWFIy2X1`X#1%+d&TprTDmveDGJMH-3APejkSUfPKm5|!u_=mee%bAJw zJ#QTuN~Q88>UJVdV$~vX(J3I@(`Yf~mqY4$h!d1TuC_B8{oIAH-_>j4lX#byvVLHzewXHh>Dj*8d2##TZgQEt`kE!`%c9_8g0;1E?Lt;-$$f^! zL#lKSdrzQRb9~_8o6jRn7V17BGNg4}%eF1Me&=>rdArt|uUh+eGEWu?0&uC4hGooT z4^;QO57F)Kl`3qc&}+I%nQdc7&gU5?v4nEvk2QwSWhf5hk@|JWU-yQPqWs7$Y<5L6 zjcCK5U=~Ou#4@6_{rssC_(j$Tf=R@14q#ntbKd6f*Lsms{&Y+5yTdlbA(H>H4Q+!c zBosk+3N5D-hprdo8z9Vo2!^F_r?c{B$L}wWS2^p|pv_1M&tqcBF_i9uS0}q?%h2F7O+Htq1#pQ k5o0MM+)P6q`_08yfqE-wRiB-~v9-?&;Bf?xN-R0^U#>2SZ~y=R literal 0 HcmV?d00001 diff --git a/icons/turf/smooth_wall.dmi b/icons/turf/smooth_wall.dmi index afb5f9536aa69d4d6a387c323e26c72895ce4176..e46ea0ae7789b5c1bf1a0841d8d2ebc3e14587e9 100644 GIT binary patch literal 1516 zcmXw(c~Fvh7{`CSFNmZlX(^^5R3^2Uxlq0*8SP`zLwH*Odq5L|x~V8s zknS6u7L^*Gk{+L&1VCohsj{mkdCWzAvGa?Io>a6b1XdA+f3Sue$!2_iU$eOWS-Wc^ zDT=Zxm+|Q{-6bPF!VSBpCsM=4MdYq;mu6oj7Y5WSetUXX7-kpr#;f9XLWiJ3w5zG3 zX*?>e^3h;gV%X}-uOh3IM*}|iX#ajZZ|_i`D99+7DR@S{*F;iAyLfm~MfpQjf67xO zsa7Jdzk+4Q?n@WNTx8lgWM@ImFRsNnm_N8Wvh;*z47pysZCv|#X0$aXQ0ibEii8<# zX*;sbR$&@co;lywYz%sCYArR|H30xNjqA$^jgyRNIT?LSV*^Av%JMJXLy2y$oz%k~se_6Z{=&`jeGG}lpfA4F`)hW>^l zxVd5IG>uBrNb-#uec0Y|*v&GNh#|C^M0nPeQ%NPHPNQ9BQc7Gc9X^S=mz|-fI;yZ@#0Nn$E7IqvNBTlRvcKhl;W1;8%N&h@}X+{8Dx8UhE3&Qx@Iw zCOe!-6dzX78ECD@8t4NB-j{w}@w=#0R&PU6?Mff)Dg%zr6jBPk`+C$O0mplN{s62vBW13ISw>>w>u zS)iffXi(;1Lp* zO+=0+V1gQC5jfRK&&p{S`}2E)>ASVV7u@>n8-{m&7fuD|i(4?joRPh|s1-0bS`suE zA1LEtsrX*Jzp7hdqYJb_*@;q((z8fsM_Ql{A>%T+C!xD8&p;Bb6(p@{14(P!LDKq7 zAcw;RIo!=4CpZY?Y|o{TT`UGAoV{tNgrjm`{}QsRtWFYq)E)b5omM7Y>u#%<^FeN? znRJ#@b@SfkreMl_nRxIg#9{}}Yi9Z!U2Mej&=)|r=qW@fruR7R$qRcUS$ntz^Rbdq z5{aq6BZMkEvalMDSc~ya3BG!ea2TZn1wX<5Fhh(HC-oo(L;uUeHy!=P>cpaF;LX4& zDyGlD9j%)Tt~hvTeU0|w>3=@!_JN4Xd#A30i(}W-n3ONuGC=V#G7l!weh1Dq5n`(s zYgDg8QC?EmK@5~clqQsM6O|nquM4SyQ@AfNw_TDk*VJ;beMBH;C>ZRr0|tl@50=|C zV>IWxK!SF>5N?`~1MR#(oY2BxD{?bzN{ICsjfDnm3Sv>hb)!zI`mYae6vcbK6$X6W zPlP|QOuDTz;ba~0uEb4$7P|e#RCRm!Te!;2JnNm)vHQv|=$QswKb~)sHR9SVUM#zuxyfo`p2)@yd~QIZp+qG++W|mwxZ{Jrr6=^N6W1>-UQxh-B~*4X~Jav z-glOt_4d^6lJfE{TADM3hd13!CdBIK%_^PQyI;v)X6|8=U^eh_JFxs*hG&ES+(08{ zJH8Jq=O;H5pZcrdBxtDQ(kZZ9G+>pnR07X|3)|kG3^$D4bdv9|NQ+{?F}Jjwl)tRG zH(4`Mjs!8y4pq=eJreZq{*SPp&maDNw-ZqdaS$>6f02QKsn*lQF(jk$?evYMuMK!y z6~*;zn%q8!#3`MXZwyXhxxO;!$8(n%pMs4X1Pu}!)O+js;+@?tZN1;^!PK^0N8xI5 zn3K!A=Py51Br-7nuyy#(%q(%>KX=9P|K}N}O#5(iGmzWOe2=gCM*}0zgYOLd$N$T7 z{wdwRQ2N8RCk$*KtROm0Gu(Ulr}#l{%jvy4IJ&z(GTUSy)ZZic!FM}f&05}?2U8pT zca=WM&Q*BW+EBi$^jWrV!`muBt^;LzIam{R$F(qRh}AzNH|tH6U|9nS@$LJ8b8``D zoEUGsb7tAADtSS^{@|5yXG0>(cm1Y>`8x$H(ssa}TT)-|>xUx?e)0 z--B!1F}e-?)x0sU?1TQ@`70f?*@rXXTz0wadC7?9?|B_^&L`iKeO+N*Z zcH)kMyRwfJa4&b>;k$^haj)VAbCz#y2kr?-@EAs#`*`m?@Wx(g>L2%(WodJ(7bWW( zd}n%lDLcDr)2UgHgv7+ePj1-3<9@W&PA5fG9kMR$45zj$^ So(;fU#^CAd=d#Wzp$Pzys-D{b