From b96909fb024157e8836b0928733eac97f155a18e Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Tue, 29 Sep 2020 23:55:58 +0200
Subject: [PATCH] [MIRROR] [READY] Refactor icon smoothing to use 8-bit
bitmasking (#1053)
* Merge pull request #53906 from Rohesie/smoothing
[READY] Refactor icon smoothing to use 8-bit bitmasking
* [READY] Refactor icon smoothing to use 8-bit bitmasking
Co-authored-by: nemvar <47324920+nemvar@users.noreply.github.com>
---
.../LavaRuins/lavaland_surface_greed.dmm | 24 +-
_maps/RandomRuins/SpaceRuins/spacehotel.dmm | 4 +-
_maps/RandomZLevels/Academy.dmm | 8 +-
.../map_files/IceBoxStation/IceBoxStation.dmm | 4 +-
_maps/map_files/PubbyStation/PubbyStation.dmm | 48 +--
code/__DEFINES/icon_smoothing.dm | 37 +-
code/__HELPERS/icon_smoothing.dm | 319 ++++++++++++------
code/_globalvars/bitfields.dm | 7 -
code/game/atoms.dm | 2 +
code/game/machinery/deployable.dm | 5 +-
code/game/objects/effects/contraband.dm | 2 +-
.../objects/effects/decals/cleanable/misc.dm | 12 +-
code/game/objects/effects/decals/misc.dm | 2 +-
code/game/objects/structures.dm | 7 +-
code/game/objects/structures/aliens.dm | 58 +++-
.../structures/beds_chairs/alien_nest.dm | 8 +-
code/game/objects/structures/false_walls.dm | 64 ++--
code/game/objects/structures/fluff.dm | 5 +-
code/game/objects/structures/grille.dm | 2 +-
.../objects/structures/industrial_lift.dm | 7 +-
code/game/objects/structures/lattice.dm | 21 +-
code/game/objects/structures/mineral_doors.dm | 6 +-
code/game/objects/structures/tables_racks.dm | 39 ++-
code/game/objects/structures/window.dm | 67 ++--
code/game/turfs/change_turf.dm | 3 +-
code/game/turfs/closed/_closed.dm | 63 ++--
code/game/turfs/closed/minerals.dm | 45 ++-
code/game/turfs/closed/wall/material_walls.dm | 5 +-
code/game/turfs/closed/wall/mineral_walls.dm | 78 +++--
code/game/turfs/closed/wall/misc_walls.dm | 19 +-
code/game/turfs/closed/wall/reinf_walls.dm | 28 +-
code/game/turfs/closed/walls.dm | 19 +-
code/game/turfs/open/chasm.dm | 9 +-
code/game/turfs/open/floor.dm | 11 +-
code/game/turfs/open/floor/fancy_floor.dm | 38 ++-
.../turfs/open/floor/plating/misc_plating.dm | 34 +-
code/game/turfs/open/floor/plating/planet.dm | 1 +
code/game/turfs/open/transparent.dm | 7 +-
code/game/turfs/turf.dm | 2 +-
.../abductor/equipment/abduction_gear.dm | 6 +-
code/modules/awaymissions/away_props.dm | 2 +-
code/modules/flufftext/Hallucination.dm | 3 +-
code/modules/holodeck/turfs.dm | 4 +-
code/modules/mining/equipment/survival_pod.dm | 5 +-
.../hostile/megafauna/bubblegum.dm | 2 +-
.../hostile/megafauna/hierophant.dm | 15 +-
.../hostile/megafauna/swarmer.dm | 3 +-
.../hostile/megafauna/wendigo.dm | 2 +-
.../hostile/mining_mobs/elites/elite.dm | 15 +-
.../lavalandruin_code/elephantgraveyard.dm | 2 +
code/modules/shuttle/shuttle_rotate.dm | 4 +-
icons/effects/dirt.dmi | Bin 5046 -> 11514 bytes
icons/effects/effects.dmi | Bin 906461 -> 905213 bytes
icons/mob/alien.dmi | Bin 84220 -> 62178 bytes
icons/obj/smooth_structures/alien/nest.dmi | Bin 2052 -> 17540 bytes
.../alien/resin_membrane.dmi | Bin 9121 -> 22335 bytes
.../smooth_structures/alien/resin_wall.dmi | Bin 2442 -> 18050 bytes
.../obj/smooth_structures/alien/weednode.dmi | Bin 2064 -> 19241 bytes
icons/obj/smooth_structures/alien/weeds1.dmi | Bin 1657 -> 16205 bytes
icons/obj/smooth_structures/alien/weeds2.dmi | Bin 1657 -> 16123 bytes
icons/obj/smooth_structures/alien/weeds3.dmi | Bin 1658 -> 16070 bytes
icons/obj/smooth_structures/alien_table.dmi | Bin 1578 -> 12430 bytes
icons/obj/smooth_structures/brass_table.dmi | Bin 882 -> 6540 bytes
icons/obj/smooth_structures/catwalk.dmi | Bin 2149 -> 6057 bytes
.../smooth_structures/clockwork_window.dmi | Bin 3573 -> 5101 bytes
icons/obj/smooth_structures/fancy_table.dmi | Bin 3437 -> 8743 bytes
.../smooth_structures/fancy_table_black.dmi | Bin 3295 -> 8715 bytes
.../smooth_structures/fancy_table_blue.dmi | Bin 3400 -> 8673 bytes
.../smooth_structures/fancy_table_cyan.dmi | Bin 3545 -> 8849 bytes
.../smooth_structures/fancy_table_green.dmi | Bin 3266 -> 8621 bytes
.../smooth_structures/fancy_table_orange.dmi | Bin 3208 -> 8597 bytes
.../smooth_structures/fancy_table_purple.dmi | Bin 3185 -> 8643 bytes
.../obj/smooth_structures/fancy_table_red.dmi | Bin 3195 -> 8703 bytes
.../fancy_table_royalblack.dmi | Bin 3252 -> 8663 bytes
.../fancy_table_royalblue.dmi | Bin 3296 -> 8641 bytes
icons/obj/smooth_structures/glass_table.dmi | Bin 2643 -> 10930 bytes
icons/obj/smooth_structures/hedge.dmi | Bin 2659 -> 25161 bytes
icons/obj/smooth_structures/lattice.dmi | Bin 1104 -> 8326 bytes
icons/obj/smooth_structures/paperframes.dmi | Bin 725 -> 1086 bytes
icons/obj/smooth_structures/plasma_window.dmi | Bin 6337 -> 18020 bytes
.../smooth_structures/plastitanium_window.dmi | Bin 2401 -> 6406 bytes
icons/obj/smooth_structures/pod_window.dmi | Bin 3723 -> 12817 bytes
icons/obj/smooth_structures/poker_table.dmi | Bin 2024 -> 6347 bytes
.../smooth_structures/reinforced_table.dmi | Bin 842 -> 5753 bytes
.../smooth_structures/reinforced_window.dmi | Bin 9138 -> 13410 bytes
icons/obj/smooth_structures/rice_window.dmi | Bin 9440 -> 27072 bytes
.../obj/smooth_structures/rplasma_window.dmi | Bin 9413 -> 26454 bytes
icons/obj/smooth_structures/sandbags.dmi | Bin 993 -> 9208 bytes
.../obj/smooth_structures/shuttle_window.dmi | Bin 3623 -> 12228 bytes
.../obj/smooth_structures/swarmer_catwalk.dmi | Bin 2491 -> 7875 bytes
icons/obj/smooth_structures/table.dmi | Bin 767 -> 4452 bytes
.../obj/smooth_structures/table_greyscale.dmi | Bin 764 -> 4385 bytes
icons/obj/smooth_structures/tinted_window.dmi | Bin 7301 -> 12099 bytes
icons/obj/smooth_structures/window.dmi | Bin 5063 -> 9728 bytes
icons/obj/smooth_structures/wood_table.dmi | Bin 1602 -> 4508 bytes
icons/turf/floors/ash.dmi | Bin 2721 -> 22984 bytes
icons/turf/floors/carpet.dmi | Bin 3405 -> 4517 bytes
icons/turf/floors/carpet_black.dmi | Bin 1828 -> 2688 bytes
icons/turf/floors/carpet_blue.dmi | Bin 7368 -> 11918 bytes
icons/turf/floors/carpet_cyan.dmi | Bin 2675 -> 4507 bytes
icons/turf/floors/carpet_green.dmi | Bin 8705 -> 15358 bytes
icons/turf/floors/carpet_orange.dmi | Bin 7950 -> 14181 bytes
icons/turf/floors/carpet_purple.dmi | Bin 6957 -> 9802 bytes
icons/turf/floors/carpet_red.dmi | Bin 8171 -> 12565 bytes
icons/turf/floors/carpet_royalblack.dmi | Bin 7139 -> 10077 bytes
icons/turf/floors/carpet_royalblue.dmi | Bin 3522 -> 5559 bytes
icons/turf/floors/chasms.dmi | Bin 2078 -> 16647 bytes
icons/turf/floors/glass.dmi | Bin 3463 -> 7789 bytes
icons/turf/floors/grass.dmi | Bin 2165 -> 22085 bytes
icons/turf/floors/ice_turf.dmi | Bin 3120 -> 19639 bytes
icons/turf/floors/icechasms.dmi | Bin 3080 -> 14214 bytes
icons/turf/floors/junglechasm.dmi | Bin 2461 -> 19555 bytes
icons/turf/floors/junglegrass.dmi | Bin 2165 -> 22085 bytes
icons/turf/floors/reinf_glass.dmi | Bin 2961 -> 10490 bytes
icons/turf/floors/rocky_ash.dmi | Bin 3004 -> 26229 bytes
icons/turf/floors/snow_turf.dmi | Bin 10907 -> 20733 bytes
icons/turf/smoothrocks.dmi | Bin 5125 -> 3876 bytes
icons/turf/walls/abductor_wall.dmi | Bin 2606 -> 4515 bytes
icons/turf/walls/bananium_wall.dmi | Bin 1406 -> 2608 bytes
icons/turf/walls/boss_wall.dmi | Bin 2444 -> 16295 bytes
icons/turf/walls/clockwork_wall.dmi | Bin 2773 -> 3276 bytes
icons/turf/walls/cult_wall.dmi | Bin 1338 -> 10266 bytes
icons/turf/walls/diamond_wall.dmi | Bin 1358 -> 2548 bytes
icons/turf/walls/gold_wall.dmi | Bin 1384 -> 2564 bytes
icons/turf/walls/hierophant_wall_temp.dmi | Bin 1715 -> 6782 bytes
icons/turf/walls/icedmetal_wall.dmi | Bin 1990 -> 11107 bytes
icons/turf/walls/icerock_wall.dmi | Bin 1740 -> 15560 bytes
icons/turf/walls/iron_wall.dmi | Bin 1381 -> 2563 bytes
icons/turf/walls/materialwall.dmi | Bin 507 -> 960 bytes
icons/turf/walls/mountain_wall.dmi | Bin 1565 -> 11091 bytes
icons/turf/walls/plasma_wall.dmi | Bin 6426 -> 8758 bytes
icons/turf/walls/plastinum_wall.dmi | Bin 2763 -> 4795 bytes
icons/turf/walls/plastitanium_wall.dmi | Bin 3811 -> 5609 bytes
icons/turf/walls/reinforced_wall.dmi | Bin 2730 -> 3960 bytes
icons/turf/walls/riveted.dmi | Bin 1252 -> 10756 bytes
icons/turf/walls/rock_wall.dmi | Bin 1727 -> 15241 bytes
icons/turf/walls/rusty_reinforced_wall.dmi | Bin 15740 -> 34674 bytes
icons/turf/walls/rusty_wall.dmi | Bin 11825 -> 25769 bytes
icons/turf/walls/sandstone_wall.dmi | Bin 1387 -> 2572 bytes
icons/turf/walls/shuttle_wall.dmi | Bin 10028 -> 5326 bytes
icons/turf/walls/silver_wall.dmi | Bin 1386 -> 2565 bytes
icons/turf/walls/snow_wall.dmi | Bin 1016 -> 9707 bytes
icons/turf/walls/survival_pod_walls.dmi | Bin 3054 -> 6024 bytes
icons/turf/walls/uranium_wall.dmi | Bin 16177 -> 38596 bytes
icons/turf/walls/wall.dmi | Bin 1694 -> 5586 bytes
icons/turf/walls/wood_wall.dmi | Bin 1520 -> 2662 bytes
146 files changed, 760 insertions(+), 423 deletions(-)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm
index df450b9803c..c140f4d827f 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm
@@ -14,15 +14,11 @@
/obj/machinery/light/small{
dir = 1
},
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/ruin/powered/greed)
"f" = (
/obj/structure/cursed_slot_machine,
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/ruin/powered/greed)
"g" = (
/obj/structure/table/wood/poker,
@@ -30,28 +26,20 @@
/obj/machinery/light/small{
dir = 1
},
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/ruin/powered/greed)
"h" = (
/obj/structure/table/wood/poker,
/obj/item/coin/diamond,
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/ruin/powered/greed)
"i" = (
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/ruin/powered/greed)
"j" = (
/obj/structure/table/wood/poker,
/obj/item/coin/adamantine,
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/ruin/powered/greed)
"k" = (
/obj/machinery/computer/arcade/battle{
diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
index e1591c74277..67cd6eb95d8 100644
--- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
@@ -1828,9 +1828,7 @@
/turf/open/floor/carpet,
/area/ruin/space/has_grav/hotel/dock)
"gg" = (
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/ruin/space/has_grav/hotel/dock)
"gh" = (
/obj/item/kirbyplants{
diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm
index 6043b0ea763..e8bc0fa0bce 100644
--- a/_maps/RandomZLevels/Academy.dmm
+++ b/_maps/RandomZLevels/Academy.dmm
@@ -560,9 +560,7 @@
/turf/open/floor/plasteel,
/area/awaymission/academy/headmaster)
"cu" = (
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/awaymission/academy/headmaster)
"cv" = (
/obj/machinery/door/window{
@@ -2669,9 +2667,7 @@
},
/area/awaymission/academy/headmaster)
"kx" = (
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/awaymission/academy/academygate)
"ky" = (
/obj/machinery/door/poddoor/shutters{
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index 090eaae844b..56adeb3baa1 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -22767,9 +22767,7 @@
/turf/open/floor/plasteel/dark,
/area/chapel/main)
"baA" = (
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/chapel/main)
"baB" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 5dbe6e08a02..b6e12653db1 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -19878,27 +19878,21 @@
/obj/item/radio/intercom{
pixel_y = 26
},
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/crew_quarters/bar)
"bap" = (
/obj/machinery/computer/slot_machine,
/obj/machinery/airalarm{
pixel_y = 24
},
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/crew_quarters/bar)
"baq" = (
/obj/effect/spawner/randomarcade,
/obj/structure/noticeboard{
pixel_y = 32
},
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/crew_quarters/bar)
"bar" = (
/obj/structure/extinguisher_cabinet{
@@ -20284,17 +20278,13 @@
/area/crew_quarters/bar)
"bbo" = (
/obj/structure/table/wood/fancy,
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/crew_quarters/bar)
"bbp" = (
/obj/structure/chair/wood{
dir = 8
},
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/crew_quarters/bar)
"bbq" = (
/obj/effect/turf_decal/tile/neutral{
@@ -20314,17 +20304,13 @@
/obj/structure/chair/wood{
dir = 4
},
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/crew_quarters/bar)
"bbs" = (
/obj/item/cane,
/obj/item/clothing/head/that,
/obj/structure/table/wood/fancy,
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/crew_quarters/bar)
"bbt" = (
/obj/structure/disposalpipe/segment,
@@ -20342,22 +20328,16 @@
"bbv" = (
/obj/structure/chair/stool,
/obj/item/trash/can,
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/crew_quarters/bar)
"bbw" = (
/obj/effect/landmark/start/assistant,
/obj/structure/chair/stool,
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/crew_quarters/bar)
"bbx" = (
/obj/structure/chair/stool,
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/crew_quarters/bar)
"bby" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -20621,17 +20601,13 @@
pixel_x = -3;
pixel_y = 5
},
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/crew_quarters/bar)
"bcq" = (
/obj/item/clothing/glasses/monocle,
/obj/item/instrument/recorder,
/obj/structure/table/wood/fancy,
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
- },
+/turf/open/floor/carpet/lone,
/area/crew_quarters/bar)
"bcr" = (
/obj/structure/disposalpipe/segment,
diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm
index 5e903e50669..aceea54b704 100644
--- a/code/__DEFINES/icon_smoothing.dm
+++ b/code/__DEFINES/icon_smoothing.dm
@@ -1,14 +1,30 @@
/* smoothing_flags */
-#define SMOOTH_CORNERS (1<<0) //Smoothing system in where adjacencies are calculated and used to build an image by mounting each corner at runtime.
-#define SMOOTH_DIAGONAL (1<<2) //if atom should smooth diagonally, this should be present in 'smoothing_flags' 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 SMOOTH_OBJ (1<<5) //smooths with objects, and will thus need to scan turfs for contents.
+/// 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)
+
+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,
+))
/*smoothing macros*/
-#define QUEUE_SMOOTH(thing_to_queue) if(thing_to_queue.smoothing_flags) {SSicon_smooth.add_to_queue(thing_to_queue)}
+#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/neighbor in orange(1, thing_to_queue)) {var/atom/atom_neighbor = neighbor; QUEUE_SMOOTH(atom_neighbor)}
@@ -74,10 +90,14 @@
#define SMOOTH_GROUP_TITANIUM_WALLS S_OBJ(11) ///turf/closed/wall/mineral/titanium, /obj/structure/falsewall/titanium
#define SMOOTH_GROUP_PLASTITANIUM_WALLS S_OBJ(13) ///turf/closed/wall/mineral/plastitanium, /obj/structure/falsewall/plastitanium
#define SMOOTH_GROUP_SURVIVAL_TIANIUM_POD S_OBJ(14) ///turf/closed/wall/mineral/titanium/survival/pod, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod
+#define SMOOTH_GROUP_HIERO_WALL S_OBJ(15) ///obj/effect/temp_visual/elite_tumor_wall, /obj/effect/temp_visual/hierophant/wall
#define SMOOTH_GROUP_PAPERFRAME S_OBJ(20) ///obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe
-#define SMOOTH_GROUP_WINDOW_FULLTILE S_OBJ(21) ///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
+#define SMOOTH_GROUP_WINDOW_FULLTILE S_OBJ(21) ///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/plasma/reinforced/fulltile
+#define SMOOTH_GROUP_WINDOW_FULLTILE_BRONZE S_OBJ(22) ///obj/structure/window/bronze/fulltile
+#define SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM S_OBJ(23) ///turf/closed/indestructible/opsglass, /obj/structure/window/plasma/reinforced/plastitanium
+#define SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE S_OBJ(24) ///obj/structure/window/shuttle
#define SMOOTH_GROUP_LATTICE S_OBJ(30) ///obj/structure/lattice
@@ -87,7 +107,10 @@
#define SMOOTH_GROUP_WOOD_TABLES S_OBJ(51) ///obj/structure/table/wood
#define SMOOTH_GROUP_FANCY_WOOD_TABLES S_OBJ(52) ///obj/structure/table/wood/fancy
#define SMOOTH_GROUP_BRONZE_TABLES S_OBJ(53) ///obj/structure/table/bronze
+#define SMOOTH_GROUP_ABDUCTOR_TABLES S_OBJ(54) ///obj/structure/table/abductor
+#define SMOOTH_GROUP_GLASS_TABLES S_OBJ(55) ///obj/structure/table/glass
+#define SMOOTH_GROUP_ALIEN_NEST S_OBJ(59) ///obj/structure/bed/nest
#define SMOOTH_GROUP_ALIEN_RESIN S_OBJ(60) ///obj/structure/alien/resin
#define SMOOTH_GROUP_ALIEN_WALLS S_OBJ(61) ///obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane
#define SMOOTH_GROUP_ALIEN_WEEDS S_OBJ(62) ///obj/structure/alien/weeds
diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm
index 776f069a3e1..b4b9e8e8f42 100644
--- a/code/__HELPERS/icon_smoothing.dm
+++ b/code/__HELPERS/icon_smoothing.dm
@@ -11,7 +11,7 @@
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 smoothing_flags 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.
@@ -25,14 +25,26 @@
*/
//Redefinitions of the diagonal directions so they can be stored in one var without conflicts
-#define N_NORTH NORTH //(1<<0)
-#define N_SOUTH SOUTH //(1<<1)
-#define N_EAST EAST //(1<<2)
-#define N_WEST WEST //(1<<3)
-#define N_NORTHEAST (1<<4)
-#define N_NORTHWEST (1<<5)
-#define N_SOUTHEAST (1<<6)
-#define N_SOUTHWEST (1<<7)
+#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,
+))
+
#define NO_ADJ_FOUND 0
#define ADJ_FOUND 1
@@ -42,6 +54,45 @@
#define DEFAULT_UNDERLAY_ICON_STATE "plating"
+#define SET_ADJ_IN_DIR(source, junction, direction, direction_flag) \
+ do { \
+ var/turf/neighbor = get_step(source, direction); \
+ if(!neighbor) { \
+ if(source.smoothing_flags & SMOOTH_BORDER) { \
+ junction |= direction_flag; \
+ }; \
+ }; \
+ else { \
+ if(!isnull(neighbor.smoothing_groups)) { \
+ for(var/target in source.canSmoothWith) { \
+ if(!(source.canSmoothWith[target] & neighbor.smoothing_groups[target])) { \
+ continue; \
+ }; \
+ junction |= direction_flag; \
+ break; \
+ }; \
+ }; \
+ if(!(junction & direction_flag) && source.smoothing_flags & SMOOTH_OBJ) { \
+ for(var/obj/thing in neighbor) { \
+ if(!thing.anchored || isnull(thing.smoothing_groups)) { \
+ continue; \
+ }; \
+ for(var/target in source.canSmoothWith) { \
+ if(!(source.canSmoothWith[target] & thing.smoothing_groups[target])) { \
+ continue; \
+ }; \
+ junction |= direction_flag; \
+ break; \
+ }; \
+ if(junction & direction_flag) { \
+ break; \
+ }; \
+ }; \
+ }; \
+ }; \
+ } while(FALSE)
+
+
///Scans all adjacent turfs to find targets to smooth with.
/atom/proc/calculate_adjacencies()
. = NONE
@@ -57,39 +108,39 @@
if(ADJ_FOUND)
. |= direction //BYOND and smooth dirs are the same for cardinals
- if(. & N_NORTH)
- if(. & N_WEST)
+ if(. & NORTH_JUNCTION)
+ if(. & WEST_JUNCTION)
switch(find_type_in_direction(NORTHWEST))
if(NULLTURF_BORDER)
if((smoothing_flags & SMOOTH_BORDER))
- . |= N_NORTHWEST
+ . |= NORTHWEST_JUNCTION
if(ADJ_FOUND)
- . |= N_NORTHWEST
+ . |= NORTHWEST_JUNCTION
- if(. & N_EAST)
+ if(. & EAST_JUNCTION)
switch(find_type_in_direction(NORTHEAST))
if(NULLTURF_BORDER)
if((smoothing_flags & SMOOTH_BORDER))
- . |= N_NORTHEAST
+ . |= NORTHEAST_JUNCTION
if(ADJ_FOUND)
- . |= N_NORTHEAST
+ . |= NORTHEAST_JUNCTION
- if(. & N_SOUTH)
- if(. & N_WEST)
+ if(. & SOUTH_JUNCTION)
+ if(. & WEST_JUNCTION)
switch(find_type_in_direction(SOUTHWEST))
if(NULLTURF_BORDER)
if((smoothing_flags & SMOOTH_BORDER))
- . |= N_SOUTHWEST
+ . |= SOUTHWEST_JUNCTION
if(ADJ_FOUND)
- . |= N_SOUTHWEST
+ . |= SOUTHWEST_JUNCTION
- if(. & N_EAST)
+ if(. & EAST_JUNCTION)
switch(find_type_in_direction(SOUTHEAST))
if(NULLTURF_BORDER)
if((smoothing_flags & SMOOTH_BORDER))
- . |= N_SOUTHEAST
+ . |= SOUTHEAST_JUNCTION
if(ADJ_FOUND)
- . |= N_SOUTHEAST
+ . |= SOUTHEAST_JUNCTION
/atom/movable/calculate_adjacencies()
@@ -104,30 +155,34 @@
if (!z)
CRASH("[type] called smooth_icon() without being on a z-level")
if(smoothing_flags & SMOOTH_CORNERS)
- if(smoothing_flags & SMOOTH_DIAGONAL)
+ if(smoothing_flags & SMOOTH_DIAGONAL_CORNERS)
corners_diagonal_smooth(calculate_adjacencies())
else
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]")
/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
@@ -138,93 +193,57 @@
return TRUE
-//only walls should have a need to handle underlays
-/turf/closed/wall/corners_diagonal_smooth(adjacencies)
- . = ..()
- if(!.)
- return
- adjacencies = reverse_ndir(adjacencies)
- if(adjacencies == NONE)
- return
- 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/neighbor_turf = get_step(src, turned_adjacency)
- if(!neighbor_turf.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency))
- neighbor_turf = get_step(src, turn(adjacencies, 135))
- if(!neighbor_turf.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency))
- neighbor_turf = get_step(src, turn(adjacencies, 225))
- //if all else fails, ask our own turf
- if(!neighbor_turf.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/wall_poster in src)
- wall_poster.roll_and_drop(src)
-
-
/atom/proc/corners_cardinal_smooth(adjacencies)
//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"
//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"
//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"
//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"
var/list/new_overlays
@@ -289,19 +308,95 @@
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
+
+ for(var/direction in GLOB.cardinals) //Cardinal case first.
+ SET_ADJ_IN_DIR(src, new_junction, direction, direction)
+
+ 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(src, new_junction, NORTHWEST, NORTHWEST_JUNCTION)
+
+ if(new_junction & EAST_JUNCTION)
+ SET_ADJ_IN_DIR(src, new_junction, NORTHEAST, NORTHEAST_JUNCTION)
+
+ if(new_junction & SOUTH_JUNCTION)
+ if(new_junction & WEST_JUNCTION)
+ SET_ADJ_IN_DIR(src, new_junction, SOUTHWEST, SOUTHWEST_JUNCTION)
+
+ if(new_junction & EAST_JUNCTION)
+ SET_ADJ_IN_DIR(src, new_junction, SOUTHEAST, SOUTHEAST_JUNCTION)
+
+ set_smoothed_icon_state(new_junction)
+
+
+///Changes the icon state based on the new junction bitmask.
+/atom/proc/set_smoothed_icon_state(new_junction)
+ smoothing_junction = new_junction
+ icon_state = "[base_icon_state]-[smoothing_junction]"
+
+
+/turf/closed/set_smoothed_icon_state(new_junction)
+ if(smoothing_flags & SMOOTH_DIAGONAL_CORNERS && new_junction != smoothing_junction)
+ switch(smoothing_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(!fixed_underlay) // Mutable underlays?
+ 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)
+ 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 = list(underlay_appearance)
+ return ..()
+
+
+/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.smoothing_flags)
+ if(T.smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
if(now)
T.smooth_icon()
else
QUEUE_SMOOTH(T)
for(var/R in T)
var/atom/A = R
- if(A.smoothing_flags)
+ if(A.smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
if(now)
A.smooth_icon()
else
@@ -335,37 +430,37 @@
/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 NONE
@@ -376,18 +471,18 @@
name = "smooth wall"
icon = 'icons/turf/smooth_wall.dmi'
icon_state = "smooth"
- smoothing_flags = SMOOTH_CORNERS|SMOOTH_DIAGONAL|SMOOTH_BORDER
+ smoothing_flags = SMOOTH_CORNERS|SMOOTH_DIAGONAL_CORNERS|SMOOTH_BORDER
smoothing_groups = null
canSmoothWith = null
-#undef N_NORTH
-#undef N_SOUTH
-#undef N_EAST
-#undef N_WEST
-#undef N_NORTHEAST
-#undef N_NORTHWEST
-#undef N_SOUTHEAST
-#undef N_SOUTHWEST
+#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
@@ -395,3 +490,5 @@
#undef DEFAULT_UNDERLAY_ICON
#undef DEFAULT_UNDERLAY_ICON_STATE
+
+#undef SET_ADJ_IN_DIR
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index e98f2f73f13..6be57f7c127 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -260,13 +260,6 @@ DEFINE_BITFIELD(sight, list(
"SEE_TURFS" = SEE_TURFS,
))
-DEFINE_BITFIELD(smooth, list(
- "SMOOTH_CORNERS" = SMOOTH_CORNERS,
- "SMOOTH_DIAGONAL" = SMOOTH_DIAGONAL,
- "SMOOTH_BORDER" = SMOOTH_BORDER,
- "SMOOTH_QUEUED" = SMOOTH_QUEUED,
-))
-
DEFINE_BITFIELD(vis_flags, list(
"VIS_HIDE" = VIS_HIDE,
"VIS_INHERIT_DIR" = VIS_INHERIT_DIR,
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 83a6cd03704..1d29e89dafb 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -124,6 +124,8 @@
///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 = NONE
///Smoothing variable
var/top_left_corner
///Smoothing variable
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index 23213318ce0..8b4a36cf52f 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -101,13 +101,14 @@
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
climbable = TRUE
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_SANDBAGS)
canSmoothWith = list(SMOOTH_GROUP_SANDBAGS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SECURITY_BARRICADE)
diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm
index 77d3ce0fb43..85e77345134 100644
--- a/code/game/objects/effects/contraband.dm
+++ b/code/game/objects/effects/contraband.dm
@@ -129,7 +129,7 @@
return
// Deny placing posters on currently-diagonal walls, although the wall may change in the future.
- if (smoothing_flags & 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
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index 55e2fef54cb..6cdbf09145e 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -52,7 +52,9 @@
/obj/effect/decal/cleanable/dirt
name = "dirt"
desc = "Someone should clean that up."
+ icon = 'icons/effects/dirt.dmi'
icon_state = "dirt"
+ base_icon_state = "dirt"
smoothing_flags = NONE
smoothing_groups = list(SMOOTH_GROUP_CLEANABLE_DIRT)
canSmoothWith = list(SMOOTH_GROUP_CLEANABLE_DIRT, SMOOTH_GROUP_WALLS)
@@ -63,14 +65,14 @@
. = ..()
var/turf/T = get_turf(src)
if(T.tiled_dirt)
- smoothing_flags = SMOOTH_CORNERS
- icon = 'icons/effects/dirt.dmi'
- icon_state = ""
+ smoothing_flags = SMOOTH_BITMASK
QUEUE_SMOOTH(src)
- QUEUE_SMOOTH_NEIGHBORS(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
diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm
index 8f46d5cc463..1f262f2b466 100644
--- a/code/game/objects/effects/decals/misc.dm
+++ b/code/game/objects/effects/decals/misc.dm
@@ -27,5 +27,5 @@
name = "lattice"
desc = "A lightweight support lattice."
icon = 'icons/obj/smooth_structures/lattice.dmi'
- icon_state = "lattice"
+ icon_state = "lattice-255"
density = TRUE
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 6011a426d6b..c7c33d9f242 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -18,15 +18,16 @@
if (!armor)
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50)
. = ..()
- if(smoothing_flags)
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH(src)
QUEUE_SMOOTH_NEIGHBORS(src)
- icon_state = ""
+ if(smoothing_flags & SMOOTH_CORNERS)
+ icon_state = ""
GLOB.cameranet.updateVisibility(src)
/obj/structure/Destroy()
GLOB.cameranet.updateVisibility(src)
- if(smoothing_flags)
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH_NEIGHBORS(src)
return ..()
diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm
index 90ce3eac648..2512ea324ec 100644
--- a/code/game/objects/structures/aliens.dm
+++ b/code/game/objects/structures/aliens.dm
@@ -53,11 +53,12 @@
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
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN)
canSmoothWith = list(SMOOTH_GROUP_ALIEN_RESIN)
max_integrity = 200
@@ -78,7 +79,8 @@
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"
smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN, SMOOTH_GROUP_ALIEN_WALLS)
canSmoothWith = list(SMOOTH_GROUP_ALIEN_WALLS)
@@ -90,7 +92,8 @@
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"
@@ -114,9 +117,11 @@
density = FALSE
layer = TURF_LAYER
plane = FLOOR_PLANE
- icon_state = "weeds"
+ icon = 'icons/obj/smooth_structures/alien/weeds1.dmi'
+ icon_state = "weeds1-0"
+ base_icon_state = "weeds1"
max_integrity = 15
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN, SMOOTH_GROUP_ALIEN_WEEDS)
canSmoothWith = list(SMOOTH_GROUP_ALIEN_WEEDS, SMOOTH_GROUP_WALLS)
var/last_expand = 0 //last world.time this weed expanded
@@ -124,9 +129,11 @@
var/growth_cooldown_high = 200
var/static/list/blacklisted_turfs
+
/obj/structure/alien/weeds/Initialize()
pixel_x = -4
pixel_y = -4 //so the sprites line up right in the map editor
+
. = ..()
if(!blacklisted_turfs)
@@ -135,16 +142,26 @@
/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/proc/expand()
var/turf/U = get_turf(src)
@@ -170,14 +187,16 @@
/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()
- 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
@@ -185,16 +204,23 @@
qdel(W)
START_PROCESSING(SSobj, src)
+
/obj/structure/alien/weeds/node/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
+
/obj/structure/alien/weeds/node/process()
for(var/obj/structure/alien/weeds/W in range(node_range, src))
if(W.last_expand <= world.time)
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 5389ab9de00..80cd0f3f25b 100644
--- a/code/game/objects/structures/beds_chairs/alien_nest.dm
+++ b/code/game/objects/structures/beds_chairs/alien_nest.dm
@@ -4,11 +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
can_be_unanchored = FALSE
- smoothing_flags = SMOOTH_CORNERS
- canSmoothWith = null
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_ALIEN_NEST)
+ canSmoothWith = list(SMOOTH_GROUP_ALIEN_NEST)
buildstacktype = null
flags_1 = NODECONSTRUCT_1
bolts = FALSE
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 3716bd9416f..891b0ba31d5 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -6,12 +6,13 @@
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 = LOW_OBJ_LAYER
density = TRUE
opacity = TRUE
max_integrity = 100
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS)
canSmoothWith = list(SMOOTH_GROUP_WALLS)
can_be_unanchored = FALSE
@@ -63,8 +64,8 @@
icon_state = "fwall_closing"
else
if(density)
- icon_state = initial(icon_state)
- smoothing_flags = SMOOTH_CORNERS
+ icon_state = "[base_icon_state]-[smoothing_junction]"
+ smoothing_flags = SMOOTH_BITMASK
QUEUE_SMOOTH(src)
else
icon_state = "fwall_open"
@@ -133,9 +134,11 @@
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
+ smoothing_flags = SMOOTH_BITMASK
/obj/structure/falsewall/reinforced/examine_status(mob/user)
to_chat(user, "The outer grille is fully intact.")
@@ -154,9 +157,11 @@
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_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_URANIUM_WALLS)
canSmoothWith = list(SMOOTH_GROUP_URANIUM_WALLS)
var/active = null
@@ -189,9 +194,11 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_GOLD_WALLS)
canSmoothWith = list(SMOOTH_GROUP_GOLD_WALLS)
@@ -199,9 +206,11 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SILVER_WALLS)
canSmoothWith = list(SMOOTH_GROUP_SILVER_WALLS)
@@ -209,9 +218,11 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_DIAMOND_WALLS)
canSmoothWith = list(SMOOTH_GROUP_DIAMOND_WALLS)
max_integrity = 800
@@ -220,9 +231,11 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASMA_WALLS)
canSmoothWith = list(SMOOTH_GROUP_PLASMA_WALLS)
@@ -249,9 +262,11 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_BANANIUM_WALLS)
canSmoothWith = list(SMOOTH_GROUP_BANANIUM_WALLS)
@@ -260,9 +275,11 @@
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"
mineral = /obj/item/stack/sheet/mineral/sandstone
walltype = /turf/closed/wall/mineral/sandstone
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SANDSTONE_WALLS)
canSmoothWith = list(SMOOTH_GROUP_SANDSTONE_WALLS)
@@ -270,9 +287,11 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WOOD_WALLS)
canSmoothWith = list(SMOOTH_GROUP_WOOD_WALLS)
@@ -280,10 +299,13 @@
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 = 5
walltype = /turf/closed/wall/mineral/iron
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_IRON_WALLS)
canSmoothWith = list(SMOOTH_GROUP_IRON_WALLS)
@@ -291,9 +313,11 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_ABDUCTOR_WALLS)
canSmoothWith = list(SMOOTH_GROUP_ABDUCTOR_WALLS)
@@ -301,10 +325,11 @@
name = "wall"
desc = "A light-weight titanium wall used in shuttles."
icon = 'icons/turf/walls/shuttle_wall.dmi'
- icon_state = "shuttle"
+ icon_state = "shuttle_wall-0"
+ base_icon_state = "shuttle_wall"
mineral = /obj/item/stack/sheet/mineral/titanium
walltype = /turf/closed/wall/mineral/titanium
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_TITANIUM_WALLS)
canSmoothWith = list(SMOOTH_GROUP_TITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS)
@@ -312,9 +337,10 @@
name = "wall"
desc = "An evil wall of plasma and titanium."
icon = 'icons/turf/walls/plastitanium_wall.dmi'
- icon_state = "shuttle"
+ icon_state = "plastitanium_wall-0"
+ base_icon_state = "plastitanium_wall"
mineral = /obj/item/stack/sheet/mineral/plastitanium
walltype = /turf/closed/wall/mineral/plastitanium
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS)
canSmoothWith = list(SMOOTH_GROUP_PLASTITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS)
diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm
index 4ea4c5a35fb..f4849995a8b 100644
--- a/code/game/objects/structures/fluff.dm
+++ b/code/game/objects/structures/fluff.dm
@@ -252,8 +252,9 @@
name = "hedge"
desc = "A large bushy hedge."
icon = 'icons/obj/smooth_structures/hedge.dmi'
- icon_state = "hedge"
- smoothing_flags = SMOOTH_CORNERS
+ icon_state = "hedge-0"
+ base_icon_state = "hedge"
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_HEDGE_FLUFF)
canSmoothWith = list(SMOOTH_GROUP_HEDGE_FLUFF)
density = TRUE
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index b3fc1d503b6..fc5b4818163 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -31,7 +31,7 @@
var/ratio = obj_integrity / max_integrity
ratio = CEILING(ratio*4, 1) * 25
- if(smoothing_flags)
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH(src)
if(ratio > 50)
diff --git a/code/game/objects/structures/industrial_lift.dm b/code/game/objects/structures/industrial_lift.dm
index 5727bf7237d..adcc13270fd 100644
--- a/code/game/objects/structures/industrial_lift.dm
+++ b/code/game/objects/structures/industrial_lift.dm
@@ -135,16 +135,17 @@ GLOBAL_LIST_EMPTY(lifts)
name = "lift platform"
desc = "A lightweight lift platform. It moves up and down."
icon = 'icons/obj/smooth_structures/catwalk.dmi'
- icon_state = "catwalk"
+ icon_state = "catwalk-0"
+ base_icon_state = "catwalk"
density = FALSE
anchored = TRUE
armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50)
max_integrity = 50
layer = LATTICE_LAYER //under pipes
plane = FLOOR_PLANE
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_INDUSTRIAL_LIFT)
- canSmoothWith = null
+ canSmoothWith = list(SMOOTH_GROUP_INDUSTRIAL_LIFT)
obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN
var/id = null //ONLY SET THIS TO ONE OF THE LIFT'S PARTS. THEY'RE CONNECTED! ONLY ONE NEEDS THE SIGNAL!
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index b0f731e4df9..eacfe6142e7 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)
@@ -10,7 +11,7 @@
layer = LATTICE_LAYER //under pipes
plane = FLOOR_PLANE
obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_LATTICE)
canSmoothWith = list(SMOOTH_GROUP_LATTICE, SMOOTH_GROUP_OPEN_FLOOR, SMOOTH_GROUP_WALLS)
var/number_of_mats = 1
@@ -72,11 +73,12 @@
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_mats = 2
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_LATTICE, SMOOTH_GROUP_OPEN_FLOOR)
- canSmoothWith = null
+ canSmoothWith = list(SMOOTH_GROUP_LATTICE)
obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP
/obj/structure/lattice/catwalk/deconstruction_hints(mob/user)
@@ -98,12 +100,13 @@
name = "heatproof support lattice"
desc = "A specialized support beam for building across lava. Watch your step."
icon = 'icons/obj/smooth_structures/catwalk.dmi'
- icon_state = "catwalk"
+ icon_state = "catwalk-0"
+ base_icon_state = "catwalk"
number_of_mats = 1
color = "#5286b9ff"
- smoothing_flags = SMOOTH_CORNERS
- smoothing_groups = null
- canSmoothWith = null
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_LATTICE, SMOOTH_GROUP_OPEN_FLOOR)
+ canSmoothWith = list(SMOOTH_GROUP_LATTICE)
obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP
resistance_flags = FIRE_PROOF | LAVA_PROOF
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index a399427fe10..4d629b85d5e 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -311,7 +311,8 @@
/obj/structure/mineral_door/paperframe/Initialize()
. = ..()
- QUEUE_SMOOTH_NEIGHBORS(src)
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
+ QUEUE_SMOOTH_NEIGHBORS(src)
/obj/structure/mineral_door/paperframe/examine(mob/user)
. = ..()
@@ -346,5 +347,6 @@
return
/obj/structure/mineral_door/paperframe/Destroy()
- QUEUE_SMOOTH_NEIGHBORS(src)
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
+ QUEUE_SMOOTH_NEIGHBORS(src)
return ..()
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index c69100442d2..e2aa6ad4242 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
@@ -32,7 +33,7 @@
custom_materials = list(/datum/material/iron = 2000)
max_integrity = 100
integrity_failure = 0.33
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_TABLES)
canSmoothWith = list(SMOOTH_GROUP_TABLES)
@@ -44,7 +45,7 @@
return "The top is screwed on, but the main bolts are also visible."
/obj/structure/table/update_icon()
- if(smoothing_flags)
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH(src)
QUEUE_SMOOTH_NEIGHBORS(src)
@@ -257,7 +258,8 @@
/obj/structure/table/greyscale
icon = 'icons/obj/smooth_structures/table_greyscale.dmi'
- icon_state = "table"
+ icon_state = "table_greyscale-0"
+ base_icon_state = "table_greyscale"
material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
buildstack = null //No buildstack, so generate from mat datums
@@ -302,10 +304,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
- smoothing_groups = null
- canSmoothWith = null
+ smoothing_groups = list(SMOOTH_GROUP_GLASS_TABLES)
+ canSmoothWith = list(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)
@@ -381,7 +384,8 @@
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
@@ -398,7 +402,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()
@@ -409,6 +414,7 @@
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
@@ -426,46 +432,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
smooth_icon = 'icons/obj/smooth_structures/fancy_table_black.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
smooth_icon = 'icons/obj/smooth_structures/fancy_table_blue.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
smooth_icon = 'icons/obj/smooth_structures/fancy_table_cyan.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
smooth_icon = 'icons/obj/smooth_structures/fancy_table_green.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
smooth_icon = 'icons/obj/smooth_structures/fancy_table_orange.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
smooth_icon = 'icons/obj/smooth_structures/fancy_table_purple.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
smooth_icon = 'icons/obj/smooth_structures/fancy_table_red.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
smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblack.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
smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblue.dmi'
@@ -476,7 +491,8 @@
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
max_integrity = 200
@@ -511,7 +527,8 @@
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
smoothing_groups = list(SMOOTH_GROUP_BRONZE_TABLES) //Don't smooth with SMOOTH_GROUP_TABLES
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 3774a9c33d4..d66f3b97c45 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -317,7 +317,7 @@
//This proc is used to update the icons of nearby windows.
/obj/structure/window/proc/update_nearby_icons()
update_icon()
- if(smoothing_flags)
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH_NEIGHBORS(src)
//merges adjacent full-tile windows into one
@@ -330,7 +330,7 @@
var/ratio = obj_integrity / max_integrity
ratio = CEILING(ratio*4, 1) * 25
- if(smoothing_flags)
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH(src)
cut_overlay(crack_overlay)
@@ -598,12 +598,13 @@
/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
flags_1 = PREVENT_CLICK_UNDER_1
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE)
canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE)
glass_amount = 2
@@ -613,12 +614,13 @@
/obj/structure/window/plasma/fulltile
icon = 'icons/obj/smooth_structures/plasma_window.dmi'
- icon_state = "plasmawindow"
+ icon_state = "plasma_window-0"
+ base_icon_state = "plasma_window"
dir = FULLTILE_WINDOW_DIR
max_integrity = 300
fulltile = TRUE
flags_1 = PREVENT_CLICK_UNDER_1
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE)
canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE)
glass_amount = 2
@@ -628,13 +630,14 @@
/obj/structure/window/plasma/reinforced/fulltile
icon = 'icons/obj/smooth_structures/rplasma_window.dmi'
- icon_state = "rplasmawindow"
+ icon_state = "rplasma_window-0"
+ base_icon_state = "rplasma_window"
dir = FULLTILE_WINDOW_DIR
state = RWINDOW_SECURE
max_integrity = 1000
fulltile = TRUE
flags_1 = PREVENT_CLICK_UNDER_1
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE)
canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE)
glass_amount = 2
@@ -645,13 +648,14 @@
/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
state = RWINDOW_SECURE
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE)
canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE)
glass_amount = 2
@@ -662,18 +666,20 @@
/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
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE)
canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE)
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
glass_amount = 2
@@ -681,7 +687,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 = 150
wtype = "shuttle"
@@ -690,9 +697,9 @@
reinf = TRUE
heat_resistance = 1600
armor = list(MELEE = 90, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 100)
- smoothing_flags = SMOOTH_CORNERS
- smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS)
- canSmoothWith = null
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS, SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE)
+ canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE)
explosion_block = 3
glass_type = /obj/item/stack/sheet/titaniumglass
glass_amount = 2
@@ -711,7 +718,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"
@@ -719,9 +727,9 @@
flags_1 = PREVENT_CLICK_UNDER_1
heat_resistance = 1600
armor = list(MELEE = 95, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 100)
- smoothing_flags = SMOOTH_CORNERS
- smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS)
- canSmoothWith = null
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS, SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM)
+ canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM)
explosion_block = 3
damage_deflection = 21 //The same as reinforced plasma windows.3
glass_type = /obj/item/stack/sheet/plastitaniumglass
@@ -736,13 +744,14 @@
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 = "paperframes-0"
+ base_icon_state = "paperframes"
dir = FULLTILE_WINDOW_DIR
opacity = TRUE
max_integrity = 15
fulltile = TRUE
flags_1 = PREVENT_CLICK_UNDER_1
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_PAPERFRAME)
canSmoothWith = list(SMOOTH_GROUP_PAPERFRAME)
glass_amount = 2
@@ -791,7 +800,8 @@
cut_overlay(torn)
add_overlay(paper)
set_opacity(TRUE)
- QUEUE_SMOOTH(src)
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
+ QUEUE_SMOOTH(src)
/obj/structure/window/paperframe/attackby(obj/item/W, mob/user)
@@ -823,10 +833,11 @@
anchored = FALSE
/obj/structure/window/bronze/fulltile
- icon_state = "clockwork_window"
- smoothing_flags = SMOOTH_CORNERS
- smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE)
- canSmoothWith = null
+ icon_state = "clockwork_window-0"
+ base_icon_state = "clockwork_window"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_WINDOW_FULLTILE_BRONZE)
+ canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE_BRONZE)
fulltile = TRUE
flags_1 = PREVENT_CLICK_UNDER_1
dir = FULLTILE_WINDOW_DIR
diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm
index 3cf5b936584..b7776acb47c 100644
--- a/code/game/turfs/change_turf.dm
+++ b/code/game/turfs/change_turf.dm
@@ -285,7 +285,8 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list(
for(var/obj/machinery/door/firedoor/FD in T)
FD.CalculateAffectingAreas()
- QUEUE_SMOOTH_NEIGHBORS(src)
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
+ QUEUE_SMOOTH_NEIGHBORS(src)
HandleTurfChange(src)
diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm
index bb3a77d64d1..a6d2dda993a 100644
--- a/code/game/turfs/closed/_closed.dm
+++ b/code/game/turfs/closed/_closed.dm
@@ -48,9 +48,10 @@
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"
baseturfs = /turf/closed/indestructible/sandstone
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
/turf/closed/indestructible/oldshuttle/corner
icon_state = "corner"
@@ -78,30 +79,39 @@
/turf/closed/indestructible/riveted
icon = 'icons/turf/walls/riveted.dmi'
- icon_state = "riveted"
- smoothing_flags = SMOOTH_CORNERS
+ icon_state = "riveted-0"
+ base_icon_state = "riveted"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS)
+ canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS)
/turf/closed/indestructible/syndicate
icon = 'icons/turf/walls/plastitanium_wall.dmi'
- icon_state = "map-shuttle"
- smoothing_flags = SMOOTH_CORNERS
+ icon_state = "plastitanium_wall-0"
+ base_icon_state = "plastitanium_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SYNDICATE_WALLS)
canSmoothWith = list(SMOOTH_GROUP_SYNDICATE_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS)
/turf/closed/indestructible/riveted/uranium
icon = 'icons/turf/walls/uranium_wall.dmi'
- icon_state = "uranium"
+ icon_state = "uranium_wall-0"
+ base_icon_state = "uranium_wall"
+ smoothing_flags = SMOOTH_BITMASK
/turf/closed/indestructible/riveted/plastinum
name = "plastinum wall"
desc = "A luxurious wall made out of a plasma-platinum alloy. Effectively impervious to conventional methods of destruction."
icon = 'icons/turf/walls/plastinum_wall.dmi'
- icon_state = "shuttle"
+ icon_state = "plastinum_wall-0"
+ base_icon_state = "plastinum_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
/turf/closed/indestructible/wood
icon = 'icons/turf/walls/wood_wall.dmi'
- icon_state = "wood"
- smoothing_flags = SMOOTH_CORNERS
+ icon_state = "wood_wall-0"
+ base_icon_state = "wood_wall"
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WOOD_WALLS)
canSmoothWith = list(SMOOTH_GROUP_WOOD_WALLS)
@@ -111,27 +121,32 @@
/turf/closed/indestructible/opshuttle
icon_state = "wall3"
+
/turf/closed/indestructible/fakeglass
name = "window"
- icon_state = "fake_window"
- opacity = FALSE
- smoothing_flags = SMOOTH_CORNERS
icon = 'icons/obj/smooth_structures/reinforced_window.dmi'
+ icon_state = "fake_window"
+ base_icon_state = "reinforced_window"
+ opacity = FALSE
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE)
+ canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE)
/turf/closed/indestructible/fakeglass/Initialize()
. = ..()
- 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_state = "plastitanium_window"
- opacity = FALSE
- smoothing_flags = SMOOTH_CORNERS
- smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS)
- canSmoothWith = null
icon = 'icons/obj/smooth_structures/plastitanium_window.dmi'
+ icon_state = "plastitanium_window-0"
+ base_icon_state = "plastitanium_window"
+ opacity = FALSE
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS, SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM)
+ canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM)
/turf/closed/indestructible/opsglass/Initialize()
. = ..()
@@ -166,8 +181,9 @@
/turf/closed/indestructible/rock/snow/ice/ore
icon = 'icons/turf/walls/icerock_wall.dmi'
- icon_state = "icerock"
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER
+ icon_state = "icerock_wall-0"
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS)
pixel_x = -4
pixel_y = -4
@@ -196,7 +212,9 @@
name = "necropolis wall"
desc = "A thick, seemingly indestructible stone wall."
icon = 'icons/turf/walls/boss_wall.dmi'
- icon_state = "wall"
+ icon_state = "boss_wall-0"
+ base_icon_state = "boss_wall"
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_BOSS_WALLS)
canSmoothWith = list(SMOOTH_GROUP_BOSS_WALLS)
explosion_block = 50
@@ -215,3 +233,4 @@
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"
+ smoothing_flags = SMOOTH_CORNERS
diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm
index ed4577363a6..c36fbcbf4a3 100644
--- a/code/game/turfs/closed/minerals.dm
+++ b/code/game/turfs/closed/minerals.dm
@@ -4,8 +4,7 @@
name = "rock"
icon = 'icons/turf/mining.dmi'
icon_state = "rock"
- var/smooth_icon = 'icons/turf/smoothrocks.dmi'
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_MINERAL_WALLS)
canSmoothWith = list(SMOOTH_GROUP_MINERAL_WALLS)
baseturfs = /turf/open/floor/plating/asteroid/airless
@@ -14,6 +13,8 @@
density = TRUE
layer = EDGED_TURF_LAYER
temperature = TCMB
+ base_icon_state = "smoothrocks"
+ var/smooth_icon = 'icons/turf/smoothrocks.dmi'
var/environment_type = "asteroid"
var/turf/open/floor/plating/turf_type = /turf/open/floor/plating/asteroid/airless
var/obj/item/stack/ore/mineralType = null
@@ -254,7 +255,8 @@
icon = 'icons/turf/mining.dmi'
smooth_icon = 'icons/turf/walls/mountain_wall.dmi'
icon_state = "mountainrock"
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER
+ base_icon_state = "mountain_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS)
defer_change = TRUE
environment_type = "snow_cavern"
@@ -273,6 +275,9 @@
if(mineralType)
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
icon = 'icons/turf/walls/icerock_wall.dmi'
+ icon_state = "icerock_wall-0"
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
/turf/closed/mineral/random/snow/more_caves
mineralSpawnChanceList = list(
@@ -324,7 +329,8 @@
icon = 'icons/turf/mining.dmi'
smooth_icon = 'icons/turf/walls/mountain_wall.dmi'
icon_state = "mountainrock"
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER
+ base_icon_state = "mountain_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS)
defer_change = TRUE
environment_type = "snow"
@@ -353,6 +359,8 @@
environment_type = "snow_cavern"
icon_state = "icerock_iron"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
@@ -378,6 +386,8 @@
environment_type = "snow_cavern"
icon_state = "icerock_Uranium"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
@@ -403,6 +413,8 @@
environment_type = "snow_cavern"
icon_state = "icerock_diamond"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
@@ -428,6 +440,8 @@
environment_type = "snow_cavern"
icon_state = "icerock_gold"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
@@ -453,6 +467,8 @@
environment_type = "snow_cavern"
icon_state = "icerock_silver"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
@@ -478,6 +494,8 @@
environment_type = "snow_cavern"
icon_state = "icerock_titanium"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
@@ -503,6 +521,8 @@
environment_type = "snow_cavern"
icon_state = "icerock_plasma"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
@@ -522,6 +542,8 @@
environment_type = "snow_cavern"
icon_state = "icerock_Bananium"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
@@ -548,6 +570,8 @@
environment_type = "snow_cavern"
icon_state = "icerock_BScrystal"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
@@ -575,7 +599,8 @@
icon = 'icons/turf/mining.dmi'
smooth_icon = 'icons/turf/walls/rock_wall.dmi'
icon_state = "rock2"
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER
+ base_icon_state = "rock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS)
baseturfs = /turf/open/floor/plating/ashplanet/wateryrock
initial_gas_mix = OPENTURF_LOW_PRESSURE
@@ -588,7 +613,8 @@
icon = 'icons/turf/mining.dmi'
smooth_icon = 'icons/turf/walls/mountain_wall.dmi'
icon_state = "mountainrock"
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER
+ base_icon_state = "mountain_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS)
baseturfs = /turf/open/floor/plating/asteroid/snow
initial_gas_mix = FROZEN_ATMOS
@@ -606,7 +632,8 @@
icon = 'icons/turf/mining.dmi'
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
icon_state = "icerock"
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
environment_type = "snow_cavern"
turf_type = /turf/open/floor/plating/asteroid/snow/ice
@@ -716,6 +743,8 @@
environment_type = "snow_cavern"
icon_state = "icerock_Gibtonite"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = FROZEN_ATMOS
@@ -735,6 +764,8 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
smooth_icon = 'icons/turf/walls/rock_wall.dmi'
+ base_icon_state = "rock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
/turf/closed/mineral/strong/attackby(obj/item/I, mob/user, params)
if(!ishuman(user))
diff --git a/code/game/turfs/closed/wall/material_walls.dm b/code/game/turfs/closed/wall/material_walls.dm
index bb98ab34cf5..6dcfd6d221a 100644
--- a/code/game/turfs/closed/wall/material_walls.dm
+++ b/code/game/turfs/closed/wall/material_walls.dm
@@ -2,8 +2,9 @@
name = "wall"
desc = "A huge chunk of material used to separate rooms."
icon = 'icons/turf/walls/materialwall.dmi'
- icon_state = "wall"
- smoothing_flags = SMOOTH_CORNERS
+ icon_state = "materialwall-0"
+ base_icon_state = "materialwall"
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_MATERIAL_WALLS)
canSmoothWith = list(SMOOTH_GROUP_MATERIAL_WALLS)
material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm
index b306dad9397..a668d48d0ac 100644
--- a/code/game/turfs/closed/wall/mineral_walls.dm
+++ b/code/game/turfs/closed/wall/mineral_walls.dm
@@ -2,7 +2,7 @@
name = "mineral wall"
desc = "This shouldn't exist"
icon_state = ""
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
canSmoothWith = null
var/last_event = 0
var/active = null
@@ -21,8 +21,10 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SILVER_WALLS)
canSmoothWith = list(SMOOTH_GROUP_SILVER_WALLS)
@@ -30,10 +32,12 @@
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 = 200 //diamond wall takes twice as much time to slice
explosion_block = 3
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_DIAMOND_WALLS)
canSmoothWith = list(SMOOTH_GROUP_DIAMOND_WALLS)
@@ -44,8 +48,10 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_BANANIUM_WALLS)
canSmoothWith = list(SMOOTH_GROUP_BANANIUM_WALLS)
@@ -53,9 +59,11 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SANDSTONE_WALLS)
canSmoothWith = list(SMOOTH_GROUP_SANDSTONE_WALLS)
@@ -64,8 +72,10 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_URANIUM_WALLS)
canSmoothWith = list(SMOOTH_GROUP_URANIUM_WALLS)
@@ -100,9 +110,11 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASMA_WALLS)
canSmoothWith = list(SMOOTH_GROUP_PLASMA_WALLS)
@@ -139,10 +151,12 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WOOD_WALLS)
canSmoothWith = list(SMOOTH_GROUP_WOOD_WALLS)
@@ -168,8 +182,10 @@
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
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_IRON_WALLS)
canSmoothWith = list(SMOOTH_GROUP_IRON_WALLS)
@@ -177,7 +193,9 @@
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"
+ smoothing_flags = SMOOTH_BITMASK
hardness = 80
explosion_block = 0
slicing_duration = 30
@@ -194,11 +212,12 @@
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"
sheet_type = /obj/item/stack/sheet/mineral/abductor
slicing_duration = 200 //alien wall takes twice as much time to slice
explosion_block = 3
- smoothing_flags = SMOOTH_CORNERS|SMOOTH_DIAGONAL
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_ABDUCTOR_WALLS)
canSmoothWith = list(SMOOTH_GROUP_ABDUCTOR_WALLS)
@@ -208,12 +227,13 @@
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
flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD
sheet_type = /obj/item/stack/sheet/mineral/titanium
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_DIAGONAL
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_TITANIUM_WALLS)
canSmoothWith = list(SMOOTH_GROUP_TITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS)
@@ -221,8 +241,10 @@
return // titanium does not rust
/turf/closed/wall/mineral/titanium/nodiagonal
- smoothing_flags = SMOOTH_CORNERS
+ icon = 'icons/turf/walls/shuttle_wall.dmi'
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'
@@ -231,7 +253,8 @@
/turf/closed/wall/mineral/titanium/overspace
icon_state = "map-overspace"
- fixed_underlay = list("space"=1)
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
+ fixed_underlay = list("space" = TRUE)
//sub-type to be used for interior shuttle walls
//won't get an underlay of the destination turf on shuttle move
@@ -260,12 +283,16 @@
name = "pod wall"
desc = "An easily-compressable wall used for temporary shelter."
icon = 'icons/turf/walls/survival_pod_walls.dmi'
- icon_state = "smooth"
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_DIAGONAL
+ icon_state = "survival_pod_walls-0"
+ base_icon_state = "survival_pod_walls"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
canSmoothWith = list(SMOOTH_GROUP_TITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_SHUTTLE_PARTS)
/turf/closed/wall/mineral/titanium/survival/nodiagonal
- smoothing_flags = SMOOTH_CORNERS
+ icon = 'icons/turf/walls/survival_pod_walls.dmi'
+ icon_state = "survival_pod_walls-0"
+ base_icon_state = "survival_pod_walls"
+ smoothing_flags = SMOOTH_BITMASK
/turf/closed/wall/mineral/titanium/survival/pod
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_TITANIUM_WALLS, SMOOTH_GROUP_SURVIVAL_TIANIUM_POD)
@@ -277,10 +304,11 @@
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
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_DIAGONAL
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS)
canSmoothWith = list(SMOOTH_GROUP_PLASTITANIUM_WALLS, SMOOTH_GROUP_SYNDICATE_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS)
@@ -288,8 +316,10 @@
return // plastitanium does not rust
/turf/closed/wall/mineral/plastitanium/nodiagonal
- smoothing_flags = SMOOTH_CORNERS
+ icon = 'icons/turf/walls/plastitanium_wall.dmi'
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'
@@ -298,7 +328,9 @@
/turf/closed/wall/mineral/plastitanium/overspace
icon_state = "map-overspace"
- fixed_underlay = list("space"=1)
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
+ fixed_underlay = list("space" = TRUE)
+
/turf/closed/wall/mineral/plastitanium/explosive/ex_act(severity)
var/obj/item/bombcore/large/bombcore = new(get_turf(src))
diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm
index 22f8b8df858..f1d78e1ed03 100644
--- a/code/game/turfs/closed/wall/misc_walls.dm
+++ b/code/game/turfs/closed/wall/misc_walls.dm
@@ -2,8 +2,9 @@
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"
- smoothing_flags = SMOOTH_CORNERS
+ icon_state = "cult_wall-0"
+ base_icon_state = "cult_wall"
+ smoothing_flags = SMOOTH_BITMASK
canSmoothWith = null
sheet_type = /obj/item/stack/sheet/runed_metal
sheet_amount = 1
@@ -43,8 +44,10 @@
/turf/closed/wall/ice
icon = 'icons/turf/walls/icedmetal_wall.dmi'
- icon_state = "iced"
+ icon_state = "icedmetal_wall-0"
+ base_icon_state = "icedmetal_wall"
desc = "A wall covered in a thick sheet of ice."
+ smoothing_flags = SMOOTH_BITMASK
canSmoothWith = null
hardness = 35
slicing_duration = 150 //welding through the ice+metal
@@ -54,6 +57,9 @@
name = "rusted wall"
desc = "A rusted metal wall."
icon = 'icons/turf/walls/rusty_wall.dmi'
+ icon_state = "rusty_wall-0"
+ base_icon_state = "rusty_wall"
+ smoothing_flags = SMOOTH_BITMASK
hardness = 45
/turf/closed/wall/rust/rust_heretic_act()
@@ -63,6 +69,9 @@
name = "rusted reinforced wall"
desc = "A huge chunk of rusted reinforced metal."
icon = 'icons/turf/walls/rusty_reinforced_wall.dmi'
+ icon_state = "rusty_reinforced_wall-0"
+ base_icon_state = "rusty_reinforced_wall"
+ smoothing_flags = SMOOTH_BITMASK
hardness = 15
/turf/closed/wall/r_wall/rust/rust_heretic_act()
@@ -74,7 +83,9 @@
name = "clockwork wall"
desc = "A huge chunk of bronze, decorated like gears and cogs."
icon = 'icons/turf/walls/clockwork_wall.dmi'
- icon_state = "clockwork_wall"
+ icon_state = "clockwork_wall-0"
+ base_icon_state = "clockwork_wall"
+ smoothing_flags = SMOOTH_BITMASK
sheet_type = /obj/item/stack/tile/bronze
sheet_amount = 2
girder_type = /obj/structure/girder/bronze
diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm
index 0c48b1a5379..f1567fb2912 100644
--- a/code/game/turfs/closed/wall/reinf_walls.dm
+++ b/code/game/turfs/closed/wall/reinf_walls.dm
@@ -2,17 +2,20 @@
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
-
- var/d_state = INTACT
+ smoothing_flags = SMOOTH_BITMASK
hardness = 10
sheet_type = /obj/item/stack/sheet/plasteel
sheet_amount = 1
girder_type = /obj/structure/girder/reinforced
explosion_block = 2
rad_insulation = RAD_HEAVY_INSULATION
+ ///Dismantled state, related to deconstruction.
+ var/d_state = INTACT
+
/turf/closed/wall/r_wall/deconstruction_hints(mob/user)
switch(d_state)
@@ -197,9 +200,8 @@
. = ..()
if(d_state != INTACT)
smoothing_flags = NONE
- clear_smooth_overlays()
else
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
QUEUE_SMOOTH_NEIGHBORS(src)
QUEUE_SMOOTH(src)
@@ -207,7 +209,7 @@
if(d_state != INTACT)
icon_state = "r_wall-[d_state]"
else
- icon_state = "r_wall"
+ icon_state = "[base_icon_state]-[smoothing_junction]"
/turf/closed/wall/r_wall/wall_singularity_pull(current_size)
if(current_size >= STAGE_FIVE)
@@ -234,10 +236,11 @@
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
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_DIAGONAL
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SYNDICATE_WALLS)
canSmoothWith = list(SMOOTH_GROUP_SYNDICATE_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS)
@@ -245,8 +248,10 @@
return FALSE
/turf/closed/wall/r_wall/syndicate/nodiagonal
- smoothing_flags = SMOOTH_CORNERS
+ icon = 'icons/turf/walls/plastitanium_wall.dmi'
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'
@@ -255,6 +260,5 @@
/turf/closed/wall/r_wall/syndicate/overspace
icon_state = "map-overspace"
- fixed_underlay = list("space"=1)
-
-
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
+ fixed_underlay = list("space" = TRUE)
diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm
index 736b6fb2bb8..12af8b80852 100644
--- a/code/game/turfs/closed/walls.dm
+++ b/code/game/turfs/closed/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
@@ -14,7 +15,7 @@
flags_ricochet = RICOCHET_HARD
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS)
canSmoothWith = list(SMOOTH_GROUP_WALLS)
@@ -27,16 +28,30 @@
var/list/dent_decals
+
/turf/closed/wall/Initialize(mapload)
. = ..()
if(is_station_level(z))
GLOB.station_turfs += src
+ if(smoothing_flags & SMOOTH_DIAGONAL_CORNERS && fixed_underlay) //Set underlays for the diagonal walls.
+ var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, plane = FLOOR_PLANE)
+ 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"]
+ fixed_underlay = string_assoc_list(fixed_underlay)
+ underlays += underlay_appearance
+
/turf/closed/wall/Destroy()
if(is_station_level(z))
GLOB.station_turfs -= src
return ..()
+
/turf/closed/wall/examine(mob/user)
. += ..()
. += deconstruction_hints(user)
diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm
index 7775da838b7..453a329c860 100644
--- a/code/game/turfs/open/chasm.dm
+++ b/code/game/turfs/open/chasm.dm
@@ -4,8 +4,9 @@
desc = "Watch your step."
baseturfs = /turf/open/chasm
icon = 'icons/turf/floors/chasms.dmi'
- icon_state = "smooth"
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER
+ icon_state = "chasms-255"
+ base_icon_state = "chasms"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_TURF_CHASM)
canSmoothWith = list(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
@@ -94,6 +95,8 @@
// Chasms for Ice moon, with planetary atmos and glow
/turf/open/chasm/icemoon
icon = 'icons/turf/floors/icechasms.dmi'
+ icon_state = "icechasms-255"
+ base_icon_state = "icechasms"
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
planetary_atmos = TRUE
baseturfs = /turf/open/chasm/icemoon
@@ -104,6 +107,8 @@
// Chasms for the jungle, with planetary atmos and a different icon
/turf/open/chasm/jungle
icon = 'icons/turf/floors/junglechasm.dmi'
+ icon_state = "junglechasm-255"
+ base_icon_state = "junglechasm"
initial_gas_mix = OPENTURF_LOW_PRESSURE
planetary_atmos = TRUE
baseturfs = /turf/open/chasm/jungle
diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm
index dc325c53f3d..e8e4ebdd954 100644
--- a/code/game/turfs/open/floor.dm
+++ b/code/game/turfs/open/floor.dm
@@ -30,10 +30,11 @@
/turf/open/floor/Initialize(mapload)
if (!broken_states)
- broken_states = typelist("broken_states", list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5"))
+ broken_states = string_list(list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5"))
else
- broken_states = typelist("broken_states", broken_states)
- burnt_states = typelist("burnt_states", burnt_states)
+ broken_states = string_list(broken_states)
+ if(burnt_states)
+ burnt_states = string_list(burnt_states)
if(!broken && broken_states && (icon_state in broken_states))
broken = TRUE
if(!burnt && burnt_states && (icon_state in burnt_states))
@@ -52,7 +53,7 @@
"snow","snow_dug","ice",
"snow0","snow1","snow2","snow3","snow4",
"snow5","snow6","snow7","snow8","snow9","snow10","snow11","snow12",
- "oldburning","light-on-r","light-on-y","light-on-g","light-on-b", "wood", "carpetsymbol", "carpetstar",
+ "oldburning","light-on-r","light-on-y","light-on-g","light-on-b", "wood",
"carpetcorner", "carpetside", "carpet", "ironsand1", "ironsand2", "ironsand3", "ironsand4", "ironsand5",
"ironsand6", "ironsand7", "ironsand8", "ironsand9", "ironsand10", "ironsand11",
"ironsand12", "ironsand13", "ironsand14", "ironsand15")
@@ -139,7 +140,7 @@
/turf/open/floor/burn_tile()
if(broken || burnt)
return
- if(burnt_states.len)
+ if(LAZYLEN(burnt_states))
icon_state = pick(burnt_states)
else
icon_state = pick(broken_states)
diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm
index 71e60586287..9484be34503 100644
--- a/code/game/turfs/open/floor/fancy_floor.dm
+++ b/code/game/turfs/open/floor/fancy_floor.dm
@@ -179,10 +179,11 @@
name = "carpet"
desc = "Soft velvet carpeting. Feels good between your toes."
icon = 'icons/turf/floors/carpet.dmi'
- icon_state = "carpet"
+ icon_state = "carpet-255"
+ base_icon_state = "carpet"
floor_tile = /obj/item/stack/tile/carpet
broken_states = list("damaged")
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET)
canSmoothWith = list(SMOOTH_GROUP_CARPET)
flags_1 = NONE
@@ -206,63 +207,85 @@
if(!.)
return
if(!broken && !burnt)
- if(smoothing_flags)
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH(src)
else
make_plating()
- if(smoothing_flags)
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH_NEIGHBORS(src)
+///Carpet variant for mapping aid, functionally the same as parent after smoothing.
+/turf/open/floor/carpet/lone
+ icon_state = "carpet-0"
+
/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
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_BLACK)
canSmoothWith = list(SMOOTH_GROUP_CARPET_BLACK)
/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/blue
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_BLUE)
canSmoothWith = list(SMOOTH_GROUP_CARPET_BLUE)
/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
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_CYAN)
canSmoothWith = list(SMOOTH_GROUP_CARPET_CYAN)
/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/green
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_GREEN)
canSmoothWith = list(SMOOTH_GROUP_CARPET_GREEN)
/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
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_ORANGE)
canSmoothWith = list(SMOOTH_GROUP_CARPET_ORANGE)
/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/purple
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_PURPLE)
canSmoothWith = list(SMOOTH_GROUP_CARPET_PURPLE)
/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
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_RED)
canSmoothWith = list(SMOOTH_GROUP_CARPET_RED)
/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
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_ROYAL_BLACK)
canSmoothWith = list(SMOOTH_GROUP_CARPET_ROYAL_BLACK)
/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
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_ROYAL_BLUE)
canSmoothWith = list(SMOOTH_GROUP_CARPET_ROYAL_BLUE)
@@ -321,11 +344,12 @@
/turf/open/floor/fakepit
desc = "A clever illusion designed to look like a bottomless pit."
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER
+ icon = 'icons/turf/floors/chasms.dmi'
+ icon_state = "chasms-0"
+ base_icon_state = "chasms"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_TURF_CHASM)
canSmoothWith = list(SMOOTH_GROUP_TURF_CHASM)
- icon = 'icons/turf/floors/Chasms.dmi'
- icon_state = "smooth"
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/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm
index 475685e2a85..86fdde73219 100644
--- a/code/game/turfs/open/floor/plating/misc_plating.dm
+++ b/code/game/turfs/open/floor/plating/misc_plating.dm
@@ -40,8 +40,8 @@
gender = PLURAL
name = "ash"
icon_state = "ash"
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER
- var/smooth_icon = 'icons/turf/floors/ash.dmi'
+ base_icon_state = "ash"
+ 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,14 +52,18 @@
clawfootstep = FOOTSTEP_SAND
heavyfootstep = FOOTSTEP_GENERIC_HEAVY
tiled_dirt = FALSE
+ var/smooth_icon = 'icons/turf/floors/ash.dmi'
+
/turf/open/floor/plating/ashplanet/Initialize()
- if(smoothing_flags)
+ . = ..()
+ 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
@@ -80,6 +84,7 @@
gender = PLURAL
name = "rocky ground"
icon_state = "rockyash"
+ base_icon_state = "rocky_ash"
smooth_icon = 'icons/turf/floors/rocky_ash.dmi'
layer = MID_TURF_LAYER
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_ASH_ROCKY)
@@ -182,7 +187,7 @@
name = "ice sheet"
desc = "A sheet of solid ice. Looks slippery."
icon = 'icons/turf/floors/ice_turf.dmi'
- icon_state = "unsmooth"
+ icon_state = "ice_turf-0"
initial_gas_mix = FROZEN_ATMOS
temperature = 180
planetary_atmos = TRUE
@@ -203,8 +208,9 @@
return
/turf/open/floor/plating/ice/smooth
- icon_state = "smooth"
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER
+ icon_state = "ice_turf-255"
+ base_icon_state = "ice_turf"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_ICE)
canSmoothWith = list(SMOOTH_GROUP_FLOOR_ICE)
@@ -245,12 +251,13 @@
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
/turf/open/floor/plating/snowed/smoothed
- smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER
+ icon = 'icons/turf/floors/snow_turf.dmi'
+ icon_state = "snow_turf-0"
+ base_icon_state = "snow_turf"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_SNOWED)
canSmoothWith = list(SMOOTH_GROUP_FLOOR_SNOWED)
planetary_atmos = TRUE
- icon = 'icons/turf/floors/snow_turf.dmi'
- icon_state = "smooth"
/turf/open/floor/plating/snowed/colder
temperature = 140
@@ -265,14 +272,15 @@
name = "grass"
desc = "A patch of grass."
icon_state = "grass0"
+ base_icon_state = "grass"
bullet_bounce_sound = null
footstep = FOOTSTEP_GRASS
barefootstep = FOOTSTEP_GRASS
clawfootstep = FOOTSTEP_GRASS
heavyfootstep = FOOTSTEP_GENERIC_HEAVY
- smoothing_flags = SMOOTH_CORNERS
- smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN,SMOOTH_GROUP_FLOOR_GRASS)
- canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS,SMOOTH_GROUP_FLOOR_GRASS)
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_GRASS)
+ canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_FLOOR_GRASS)
layer = HIGH_TURF_LAYER
var/smooth_icon = 'icons/turf/floors/grass.dmi'
diff --git a/code/game/turfs/open/floor/plating/planet.dm b/code/game/turfs/open/floor/plating/planet.dm
index e23f0979f47..c9b0bcfb855 100644
--- a/code/game/turfs/open/floor/plating/planet.dm
+++ b/code/game/turfs/open/floor/plating/planet.dm
@@ -46,6 +46,7 @@
planetary_atmos = TRUE
desc = "Greener on the other side."
icon_state = "junglegrass"
+ base_icon_state = "junglegrass"
smooth_icon = 'icons/turf/floors/junglegrass.dmi'
/turf/closed/mineral/random/jungle
diff --git a/code/game/turfs/open/transparent.dm b/code/game/turfs/open/transparent.dm
index d49bba40a8e..28936789847 100644
--- a/code/game/turfs/open/transparent.dm
+++ b/code/game/turfs/open/transparent.dm
@@ -55,8 +55,9 @@
name = "Glass floor"
desc = "Dont jump on it, or do, I'm not your mom."
icon = 'icons/turf/floors/glass.dmi'
- icon_state = "floor_glass"
- smoothing_flags = SMOOTH_CORNERS
+ icon_state = "glass-0"
+ base_icon_state = "glass"
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_TRANSPARENT_GLASS)
canSmoothWith = list(SMOOTH_GROUP_FLOOR_TRANSPARENT_GLASS)
footstep = FOOTSTEP_PLATING
@@ -72,3 +73,5 @@
name = "Reinforced glass floor"
desc = "Do jump on it, it can take it."
icon = 'icons/turf/floors/reinf_glass.dmi'
+ icon_state = "reinf_glass-0"
+ base_icon_state = "reinf_glass"
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 3056729477d..d72618d9522 100755
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -89,7 +89,7 @@ GLOBAL_LIST_EMPTY(station_turfs)
if(canSmoothWith[length(canSmoothWith)] > MAX_S_TURF) //If the last element is higher than the maximum turf-only value, then it must scan turf contents for smoothing targets.
smoothing_flags |= SMOOTH_OBJ
SET_BITFLAG_LIST(canSmoothWith)
- if (smoothing_flags)
+ if (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH(src)
visibilityChanged()
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index 4d600d40cc9..d2994ab9c91 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -812,12 +812,14 @@ Congratulations! You are now trained for invasive xenobiology research!"}
name = "alien table"
desc = "Advanced flat surface technology at work!"
icon = 'icons/obj/smooth_structures/alien_table.dmi'
- icon_state = "alien_table"
+ icon_state = "alien_table-0"
+ base_icon_state = "alien_table"
buildstack = /obj/item/stack/sheet/mineral/abductor
framestack = /obj/item/stack/sheet/mineral/abductor
buildstackamount = 1
framestackamount = 1
- canSmoothWith = null
+ smoothing_groups = list(SMOOTH_GROUP_ABDUCTOR_TABLES)
+ canSmoothWith = list(SMOOTH_GROUP_ABDUCTOR_TABLES)
frame = /obj/structure/table_frame/abductor
/obj/structure/table/optable/abductor
diff --git a/code/modules/awaymissions/away_props.dm b/code/modules/awaymissions/away_props.dm
index b1d54686620..795798774e2 100644
--- a/code/modules/awaymissions/away_props.dm
+++ b/code/modules/awaymissions/away_props.dm
@@ -57,7 +57,7 @@
/obj/structure/pitgrate
name = "pit grate"
icon = 'icons/obj/smooth_structures/lattice.dmi'
- icon_state = "lattice"
+ icon_state = "lattice-255"
plane = FLOOR_PLANE
anchored = TRUE
obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index cac1daeb8f2..7599000a31d 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -1108,7 +1108,8 @@ 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)
+ var/turf/target_loc = get_turf(target)
+ image = image('icons/turf/floors/chasms.dmi', src, "chasms-[target_loc.smoothing_junction]", TURF_LAYER)
if(target.client)
target.client.images += image
diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm
index dd57d6d85a1..467292c7874 100644
--- a/code/modules/holodeck/turfs.dm
+++ b/code/modules/holodeck/turfs.dm
@@ -109,7 +109,7 @@
icon = 'icons/turf/floors/carpet.dmi'
icon_state = "carpet"
floor_tile = /obj/item/stack/tile/carpet
- smoothing_flags = SMOOTH_CORNERS
+ smoothing_flags = SMOOTH_BITMASK
canSmoothWith = null
bullet_bounce_sound = null
tiled_dirt = FALSE
@@ -120,7 +120,7 @@
/turf/open/floor/holofloor/carpet/update_icon()
. = ..()
- if(intact)
+ if(intact && smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH(src)
/turf/open/floor/holofloor/wood
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index 86d862a52b3..740049b47f6 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -86,8 +86,9 @@
/obj/structure/window/shuttle/survival_pod
name = "pod window"
icon = 'icons/obj/smooth_structures/pod_window.dmi'
- icon_state = "smooth"
- smoothing_flags = SMOOTH_CORNERS
+ icon_state = "pod_window-0"
+ base_icon_state = "pod_window"
+ smoothing_flags = SMOOTH_BITMASK
smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS, SMOOTH_GROUP_SURVIVAL_TIANIUM_POD)
canSmoothWith = list(SMOOTH_GROUP_SURVIVAL_TIANIUM_POD)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index a58103d97ac..041821d1088 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -93,7 +93,7 @@ Difficulty: Hard
/datum/action/innate/megafauna_attack/hallucination_surround
name = "Surround Target"
icon_icon = 'icons/turf/walls/wall.dmi'
- button_icon_state = "wall"
+ button_icon_state = "wall-0"
chosen_message = "You are now surrounding the target you click on with hallucinations."
chosen_attack_num = 3
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 959c6de311a..d6d819edb2d 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -516,18 +516,23 @@ Difficulty: Hard
/obj/effect/temp_visual/hierophant/wall //smoothing and pooling were not friends, but pooling is dead.
name = "vortex wall"
icon = 'icons/turf/walls/hierophant_wall_temp.dmi'
- icon_state = "wall"
+ icon_state = "hierophant_wall_temp-0"
+ base_icon_state = "hierophant_wall_temp"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_HIERO_WALL)
+ canSmoothWith = list(SMOOTH_GROUP_HIERO_WALL)
light_range = MINIMUM_USEFUL_LIGHT_RANGE
duration = 100
- smoothing_flags = SMOOTH_CORNERS
/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/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
index c0c9e3018d8..d05319814e9 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
@@ -285,4 +285,5 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
name = "swarmer catwalk"
desc = "A catwalk-like mesh, produced by swarmers to allow them to navigate hostile terrain."
icon = 'icons/obj/smooth_structures/swarmer_catwalk.dmi'
- icon_state = "swarmer_catwalk"
+ icon_state = "swarmer_catwalk-0"
+ base_icon_state = "swarmer_catwalk"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
index 22a934f11e0..07520712f57 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
@@ -73,7 +73,7 @@ Difficulty: Hard
/datum/action/innate/megafauna_attack/disorienting_scream
name = "Disorienting Scream"
icon_icon = 'icons/turf/walls/wall.dmi'
- button_icon_state = "wall"
+ button_icon_state = "wall-0"
chosen_message = "You are now screeching, disorienting targets around you."
chosen_attack_num = 3
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 36ca8608bc9..75eb7a945b8 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
@@ -302,9 +302,12 @@ While using this makes the system rely on OnFire, it still gives options for tim
/obj/effect/temp_visual/elite_tumor_wall
name = "magic wall"
icon = 'icons/turf/walls/hierophant_wall_temp.dmi'
- icon_state = "wall"
+ icon_state = "hierophant_wall_temp-0"
+ base_icon_state = "hierophant_wall_temp"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_HIERO_WALL)
+ canSmoothWith = list(SMOOTH_GROUP_HIERO_WALL)
duration = 50
- smoothing_flags = SMOOTH_CORNERS
layer = BELOW_MOB_LAYER
color = rgb(255,0,0)
light_range = MINIMUM_USEFUL_LIGHT_RANGE
@@ -314,11 +317,13 @@ While using this makes the system rely on OnFire, it still gives options for tim
/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/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
index 5b64d2ba115..74080b3644f 100644
--- a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
+++ b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
@@ -52,6 +52,8 @@
turf_type = /turf/open/floor/plating/asteroid/basalt/wasteland
baseturfs = /turf/open/floor/plating/asteroid/basalt/wasteland
smooth_icon = 'icons/turf/walls/rock_wall.dmi'
+ base_icon_state = "rock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
/turf/closed/mineral/strong/wasteland/drop_ores()
if(prob(10))
diff --git a/code/modules/shuttle/shuttle_rotate.dm b/code/modules/shuttle/shuttle_rotate.dm
index 9c950148d24..2f50ba92d68 100644
--- a/code/modules/shuttle/shuttle_rotate.dm
+++ b/code/modules/shuttle/shuttle_rotate.dm
@@ -12,7 +12,7 @@ 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(smoothing_flags && (params & ROTATE_SMOOTH))
+ if(params & ROTATE_SMOOTH && smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH(src)
//rotate the pixel offsets too.
@@ -30,7 +30,7 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate
/atom/movable/shuttleRotate(rotation, params)
. = ..()
//rotate the physical bounds and offsets for multitile atoms too. Owerride base "rotate the pixel offsets" for multitile atoms.
- //Owerride non zero bound_x, bound_y, pixel_x, pixel_y to zero.
+ //Owerride non zero bound_x, bound_y, pixel_x, pixel_y to zero.
//Dont take in account starting bound_x, bound_y, pixel_x, pixel_y.
//So it can unintentionally shift physical bounds of things that starts with non zero bound_x, bound_y.
if(((bound_height != world.icon_size) || (bound_width != world.icon_size)) && (bound_x==0) && (bound_y==0)) //Dont shift things that have non zero bound_x and bound_y, or it move somewhere. Now it BSA and Gateway.
diff --git a/icons/effects/dirt.dmi b/icons/effects/dirt.dmi
index cd673a949deddaf58e49f57ff9ec96e34e577bb5..3d63c60e90d26586253ef590e84cfca81da85316 100644
GIT binary patch
literal 11514
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
KRd&rG
literal 5046
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
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 706cad3f5c8178c066ce621c4619f74df63bcbdb..c32c136ef56cb2fcd3b048970202847ff7e736b0 100644
GIT binary patch
delta 762592
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∨dXpHLr+}rzdRVg2p^LRGNY;r
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