diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml
index f317e6b1a1a..e5a0995c812 100644
--- a/.github/workflows/ci_suite.yml
+++ b/.github/workflows/ci_suite.yml
@@ -54,6 +54,11 @@ jobs:
with:
path: ~/.cargo
key: ${{ runner.os }}-rust
+ - name: Restore Cutter cache
+ uses: actions/cache@v3
+ with:
+ path: tools/icon_cutter/cache
+ key: ${{ runner.os }}-cutter-${{ hashFiles('dependencies.sh') }}
- name: Install Tools
run: |
pip3 install setuptools
@@ -91,6 +96,9 @@ jobs:
run: |
tools/bootstrap/python -m mapmerge2.dmm_test
tools/bootstrap/python -m tools.maplint.source
+ - name: Check Cutter
+ if: steps.linter-setup.conclusion == 'success' && !cancelled()
+ run: tools/bootstrap/python -m tools.icon_cutter.check
- name: Run DMI Tests
if: steps.linter-setup.conclusion == 'success' && !cancelled()
run: tools/bootstrap/python -m dmi.test
@@ -111,7 +119,7 @@ jobs:
if: ( !contains(github.event.head_commit.message, '[ci skip]') )
name: Compile Maps
needs: [collect_data]
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
concurrency:
group: compile_all_maps-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
@@ -136,7 +144,7 @@ jobs:
collect_data:
if: ( !contains(github.event.head_commit.message, '[ci skip]') )
name: Collect data for other tasks
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
outputs:
maps: ${{ steps.map_finder.outputs.maps }}
alternate_tests: ${{ steps.alternate_test_finder.outputs.alternate_tests }}
@@ -202,7 +210,7 @@ jobs:
if: ( !contains(github.event.head_commit.message, '[ci skip]') && needs.find_all_maps.outputs.alternate_tests != '[]' )
name: Check Alternate Tests
needs: [run_alternate_tests]
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
steps:
- run: echo Alternate tests passed.
@@ -210,7 +218,7 @@ jobs:
if: ( !contains(github.event.head_commit.message, '[ci skip]') && (success() || failure()) )
needs: [run_all_tests, run_alternate_tests]
name: Compare Screenshot Tests
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
# If we ever add more artifacts, this is going to break, but it'll be obvious.
diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml
index 0cf6c6ee5e7..7983138649e 100644
--- a/.github/workflows/compile_changelogs.yml
+++ b/.github/workflows/compile_changelogs.yml
@@ -8,7 +8,7 @@ on:
jobs:
compile:
name: "Compile changelogs"
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
steps:
- name: "Check for ACTION_ENABLER secret and pass true to output if it exists to be checked by later steps"
id: value_holder
diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml
index 3f9d8338908..468eee78644 100644
--- a/.github/workflows/generate_documentation.yml
+++ b/.github/workflows/generate_documentation.yml
@@ -11,7 +11,7 @@ jobs:
permissions:
contents: write # for JamesIves/github-pages-deploy-action to push changes in repo
if: ( !contains(github.event.head_commit.message, '[ci skip]') )
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
concurrency: gen-docs
steps:
- uses: actions/checkout@v3
diff --git a/.github/workflows/pr_emoji.yml b/.github/workflows/pr_emoji.yml
index a9d35d2456f..a58e87fdb49 100644
--- a/.github/workflows/pr_emoji.yml
+++ b/.github/workflows/pr_emoji.yml
@@ -8,7 +8,7 @@ permissions:
jobs:
title_and_changelog:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
steps:
- uses: Wayland-Smithy/emoji-stripper-action@de0c1d158edee50700583d6454aa5f5117337599
with:
diff --git a/.github/workflows/round_id_linker.yml b/.github/workflows/round_id_linker.yml
index 5aede3503d1..fb4a202d179 100644
--- a/.github/workflows/round_id_linker.yml
+++ b/.github/workflows/round_id_linker.yml
@@ -5,7 +5,7 @@ on:
jobs:
link_rounds:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
steps:
- uses: tgstation/round_linker@master
with:
diff --git a/.github/workflows/show_screenshot_test_results.yml b/.github/workflows/show_screenshot_test_results.yml
index 32ea68476d2..f1f1dec2649 100644
--- a/.github/workflows/show_screenshot_test_results.yml
+++ b/.github/workflows/show_screenshot_test_results.yml
@@ -13,7 +13,7 @@ jobs:
show_screenshot_test_results:
if: ( !contains(github.event.head_commit.message, '[ci skip]') && github.event.workflow_run.run_attempt == 1 )
name: Show Screenshot Test Results
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
steps:
- name: "Check for ARTIFACTS_FILE_HOUSE_KEY"
id: secrets_set
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index 26999ca629b..e7e41eebbab 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -13,7 +13,7 @@ jobs:
permissions:
issues: write # for actions/stale to close stale issues
pull-requests: write # for actions/stale to close stale PRs
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
steps:
- uses: actions/stale@v4
diff --git a/.github/workflows/test_merge_bot.yml b/.github/workflows/test_merge_bot.yml
index ebf8928f435..4eb62752c06 100644
--- a/.github/workflows/test_merge_bot.yml
+++ b/.github/workflows/test_merge_bot.yml
@@ -11,7 +11,7 @@ on:
jobs:
test_merge_bot:
name: Test Merge Detector
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
steps:
- name: Check for GET_TEST_MERGES_URL
id: secrets_set
diff --git a/.github/workflows/update_tgs_dmapi.yml b/.github/workflows/update_tgs_dmapi.yml
index fe4a917dcfd..aae81f7e0d8 100644
--- a/.github/workflows/update_tgs_dmapi.yml
+++ b/.github/workflows/update_tgs_dmapi.yml
@@ -7,7 +7,7 @@ on:
jobs:
update-dmapi:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-22.04
name: Update the TGS DMAPI
steps:
- name: Clone
diff --git a/_maps/map_files/Mafia/mafia_spiderclan.dmm b/_maps/map_files/Mafia/mafia_spiderclan.dmm
index a00e373c1a4..aae3f9914f3 100644
--- a/_maps/map_files/Mafia/mafia_spiderclan.dmm
+++ b/_maps/map_files/Mafia/mafia_spiderclan.dmm
@@ -67,8 +67,8 @@
name = "Station Night Shutters"
},
/turf/closed/indestructible/fakeglass{
- icon = 'icons/obj/smooth_structures/paperframes.dmi';
- icon_state = "paper"
+ icon = 'icons/obj/smooth_structures/structure_variations.dmi';
+ icon_state = "paper-whole"
},
/area/centcom/mafia)
"q" = (
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 4f7b12e5303..921140f1db0 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -5,9 +5,8 @@
name = "wall"
desc = "A huge chunk of metal used to separate rooms."
anchored = TRUE
- //icon = 'icons/turf/walls/wall.dmi' //ORIGINAL
- icon = 'modular_skyrat/modules/aesthetics/walls/icons/wall.dmi' //SKYRAT EDIT CHANGE - AESTHETICS
- icon_state = "wall-0"
+ icon = 'icons/turf/walls/false_walls.dmi'
+ icon_state = "wall-open"
base_icon_state = "wall"
layer = LOW_OBJ_LAYER
density = TRUE
@@ -20,6 +19,8 @@
can_atmos_pass = ATMOS_PASS_DENSITY
rad_insulation = RAD_MEDIUM_INSULATION
material_flags = MATERIAL_EFFECTS
+ /// The icon this falsewall is faking being. we'll switch out our icon with this when we're in fake mode
+ var/fake_icon = 'icons/turf/walls/wall.dmi'
var/mineral = /obj/item/stack/sheet/iron
var/mineral_amount = 2
var/walltype = /turf/closed/wall
@@ -72,9 +73,15 @@
/obj/structure/falsewall/update_icon_state()
if(opening)
- icon_state = "fwall_[density ? "opening" : "closing"]"
+ icon = fake_icon
+ icon_state = "[base_icon_state]-[density ? "opening" : "closing"]"
return ..()
- icon_state = density ? "[base_icon_state]-[smoothing_junction]" : "fwall_open"
+ if(density)
+ icon = initial(icon)
+ icon_state = "[base_icon_state]-[smoothing_junction]"
+ else
+ icon = fake_icon
+ icon_state = "[base_icon_state]-open"
return ..()
/obj/structure/falsewall/proc/ChangeToWall(delete = 1)
@@ -149,9 +156,8 @@
/obj/structure/falsewall/reinforced
name = "reinforced wall"
desc = "A huge chunk of reinforced metal used to separate rooms."
- //icon = 'icons/turf/walls/reinforced_wall.dmi'
- icon = 'modular_skyrat/modules/aesthetics/walls/icons/reinforced_wall.dmi' //SKYRAT EDIT CHANGE - AESTHETICS
- icon_state = "reinforced_wall-0"
+ fake_icon = 'icons/turf/walls/reinforced_wall.dmi'
+ icon_state = "reinforced_wall-open"
base_icon_state = "reinforced_wall"
walltype = /turf/closed/wall/r_wall
mineral = /obj/item/stack/sheet/plasteel
@@ -173,8 +179,8 @@
/obj/structure/falsewall/uranium
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_wall-0"
+ fake_icon = 'icons/turf/walls/uranium_wall.dmi'
+ icon_state = "uranium_wall-open"
base_icon_state = "uranium_wall"
mineral = /obj/item/stack/sheet/mineral/uranium
walltype = /turf/closed/wall/mineral/uranium
@@ -224,8 +230,8 @@
/obj/structure/falsewall/gold
name = "gold wall"
desc = "A wall with gold plating. Swag!"
- icon = 'icons/turf/walls/gold_wall.dmi'
- icon_state = "gold_wall-0"
+ fake_icon = 'icons/turf/walls/gold_wall.dmi'
+ icon_state = "gold_wall-open"
base_icon_state = "gold_wall"
mineral = /obj/item/stack/sheet/mineral/gold
walltype = /turf/closed/wall/mineral/gold
@@ -236,8 +242,8 @@
/obj/structure/falsewall/silver
name = "silver wall"
desc = "A wall with silver plating. Shiny."
- icon = 'icons/turf/walls/silver_wall.dmi'
- icon_state = "silver_wall-0"
+ fake_icon = 'icons/turf/walls/silver_wall.dmi'
+ icon_state = "silver_wall-open"
base_icon_state = "silver_wall"
mineral = /obj/item/stack/sheet/mineral/silver
walltype = /turf/closed/wall/mineral/silver
@@ -248,8 +254,8 @@
/obj/structure/falsewall/diamond
name = "diamond wall"
desc = "A wall with diamond plating. You monster."
- icon = 'icons/turf/walls/diamond_wall.dmi'
- icon_state = "diamond_wall-0"
+ fake_icon = 'icons/turf/walls/diamond_wall.dmi'
+ icon_state = "diamond_wall-open"
base_icon_state = "diamond_wall"
mineral = /obj/item/stack/sheet/mineral/diamond
walltype = /turf/closed/wall/mineral/diamond
@@ -261,8 +267,8 @@
/obj/structure/falsewall/plasma
name = "plasma wall"
desc = "A wall with plasma plating. This is definitely a bad idea."
- icon = 'icons/turf/walls/plasma_wall.dmi'
- icon_state = "plasma_wall-0"
+ fake_icon = 'icons/turf/walls/plasma_wall.dmi'
+ icon_state = "plasma_wall-open"
base_icon_state = "plasma_wall"
mineral = /obj/item/stack/sheet/mineral/plasma
walltype = /turf/closed/wall/mineral/plasma
@@ -273,8 +279,8 @@
/obj/structure/falsewall/bananium
name = "bananium wall"
desc = "A wall with bananium plating. Honk!"
- icon = 'icons/turf/walls/bananium_wall.dmi'
- icon_state = "bananium_wall-0"
+ fake_icon = 'icons/turf/walls/bananium_wall.dmi'
+ icon_state = "bananium_wall-open"
base_icon_state = "bananium_wall"
mineral = /obj/item/stack/sheet/mineral/bananium
walltype = /turf/closed/wall/mineral/bananium
@@ -286,8 +292,8 @@
/obj/structure/falsewall/sandstone
name = "sandstone wall"
desc = "A wall with sandstone plating. Rough."
- icon = 'icons/turf/walls/sandstone_wall.dmi'
- icon_state = "sandstone_wall-0"
+ fake_icon = 'icons/turf/walls/sandstone_wall.dmi'
+ icon_state = "sandstone_wall-open"
base_icon_state = "sandstone_wall"
mineral = /obj/item/stack/sheet/mineral/sandstone
walltype = /turf/closed/wall/mineral/sandstone
@@ -298,8 +304,8 @@
/obj/structure/falsewall/wood
name = "wooden wall"
desc = "A wall with wooden plating. Stiff."
- icon = 'icons/turf/walls/wood_wall.dmi'
- icon_state = "wood_wall-0"
+ fake_icon = 'icons/turf/walls/wood_wall.dmi'
+ icon_state = "wood_wall-open"
base_icon_state = "wood_wall"
mineral = /obj/item/stack/sheet/mineral/wood
walltype = /turf/closed/wall/mineral/wood
@@ -310,7 +316,9 @@
/obj/structure/falsewall/bamboo
name = "bamboo wall"
desc = "A wall with bamboo finish. Zen."
- icon = 'icons/turf/walls/bamboo_wall.dmi'
+ fake_icon = 'icons/turf/walls/bamboo_wall.dmi'
+ icon_state = "bamboo_wall-open"
+ base_icon_state = "bamboo_wall"
mineral = /obj/item/stack/sheet/mineral/bamboo
walltype = /turf/closed/wall/mineral/bamboo
smoothing_flags = SMOOTH_BITMASK
@@ -320,8 +328,8 @@
/obj/structure/falsewall/iron
name = "rough iron wall"
desc = "A wall with rough metal plating."
- icon = 'icons/turf/walls/iron_wall.dmi'
- icon_state = "iron_wall-0"
+ fake_icon = 'icons/turf/walls/iron_wall.dmi'
+ icon_state = "iron_wall-open"
base_icon_state = "iron_wall"
mineral = /obj/item/stack/rods
mineral_amount = 5
@@ -334,8 +342,8 @@
/obj/structure/falsewall/abductor
name = "alien wall"
desc = "A wall with alien alloy plating."
- icon = 'icons/turf/walls/abductor_wall.dmi'
- icon_state = "abductor_wall-0"
+ fake_icon = 'icons/turf/walls/abductor_wall.dmi'
+ icon_state = "abductor_wall-open"
base_icon_state = "abductor_wall"
mineral = /obj/item/stack/sheet/mineral/abductor
walltype = /turf/closed/wall/mineral/abductor
@@ -346,8 +354,8 @@
/obj/structure/falsewall/titanium
name = "wall"
desc = "A light-weight titanium wall used in shuttles."
- icon = 'icons/turf/walls/shuttle_wall.dmi'
- icon_state = "shuttle_wall-0"
+ fake_icon = 'icons/turf/walls/shuttle_wall.dmi'
+ icon_state = "shuttle_wall-open"
base_icon_state = "shuttle_wall"
mineral = /obj/item/stack/sheet/mineral/titanium
walltype = /turf/closed/wall/mineral/titanium
@@ -358,8 +366,8 @@
/obj/structure/falsewall/plastitanium
name = "wall"
desc = "An evil wall of plasma and titanium."
- icon = 'icons/turf/walls/plastitanium_wall.dmi'
- icon_state = "plastitanium_wall-0"
+ fake_icon = 'icons/turf/walls/plastitanium_wall.dmi'
+ icon_state = "plastitanium_wall-open"
base_icon_state = "plastitanium_wall"
mineral = /obj/item/stack/sheet/mineral/plastitanium
walltype = /turf/closed/wall/mineral/plastitanium
@@ -370,9 +378,9 @@
/obj/structure/falsewall/material
name = "wall"
desc = "A huge chunk of material used to separate rooms."
- icon = 'icons/turf/walls/materialwall.dmi'
- icon_state = "materialwall-0"
- base_icon_state = "materialwall"
+ fake_icon = 'icons/turf/walls/material_wall.dmi'
+ icon_state = "material_wall-open"
+ base_icon_state = "material_wall"
walltype = /turf/closed/wall/material
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_MATERIAL_WALLS
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index a1676f0d39f..1c57ad51d39 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -867,8 +867,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw
bash_sound = 'sound/weapons/slashmiss.ogg'
break_sound = 'sound/items/poster_ripped.ogg'
hit_sound = 'sound/weapons/slashmiss.ogg'
- var/static/mutable_appearance/torn = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "torn", layer = ABOVE_OBJ_LAYER - 0.1)
- var/static/mutable_appearance/paper = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "paper", layer = ABOVE_OBJ_LAYER - 0.1)
+ var/static/mutable_appearance/torn = mutable_appearance('icons/obj/smooth_structures/structure_variations.dmi',icon_state = "paper-torn", layer = ABOVE_OBJ_LAYER - 0.1)
+ var/static/mutable_appearance/paper = mutable_appearance('icons/obj/smooth_structures/structure_variations.dmi',icon_state = "paper-whole", layer = ABOVE_OBJ_LAYER - 0.1)
/obj/structure/window/paperframe/Initialize(mapload)
. = ..()
@@ -927,14 +927,15 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw
/obj/structure/window/bronze
name = "brass window"
desc = "A paper-thin pane of translucent yet reinforced brass. Nevermind, this is just weak bronze!"
- icon = 'icons/obj/smooth_structures/clockwork_window.dmi'
- icon_state = "clockwork_window_single"
+ icon = 'icons/obj/smooth_structures/structure_variations.dmi'
+ icon_state = "clockwork_window-single"
glass_type = /obj/item/stack/sheet/bronze
/obj/structure/window/bronze/unanchored
anchored = FALSE
/obj/structure/window/bronze/fulltile
+ icon = 'icons/obj/smooth_structures/clockwork_window.dmi'
icon_state = "clockwork_window-0"
base_icon_state = "clockwork_window"
smoothing_flags = SMOOTH_BITMASK
diff --git a/code/game/turfs/closed/indestructible.dm b/code/game/turfs/closed/indestructible.dm
index 72dbf6dd6fa..b8c386ecf10 100644
--- a/code/game/turfs/closed/indestructible.dm
+++ b/code/game/turfs/closed/indestructible.dm
@@ -40,7 +40,7 @@
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = SMOOTH_GROUP_PAPERFRAME
canSmoothWith = SMOOTH_GROUP_PAPERFRAME
- var/static/mutable_appearance/indestructible_paper = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "paper", layer = CLOSED_TURF_LAYER - 0.1)
+ var/static/mutable_appearance/indestructible_paper = mutable_appearance('icons/obj/smooth_structures/structure_variations.dmi',icon_state = "paper-whole", layer = CLOSED_TURF_LAYER - 0.1)
/turf/closed/indestructible/weeb/Initialize(mapload)
. = ..()
@@ -198,8 +198,8 @@ SKYRAT EDIT REMOVAL END */
/turf/closed/indestructible/fakeglass
name = "window"
- icon = 'icons/obj/smooth_structures/reinforced_window.dmi'
- icon_state = "fake_window"
+ icon = MAP_SWITCH('icons/obj/smooth_structures/reinforced_window.dmi', 'icons/obj/smooth_structures/structure_variations.dmi')
+ icon_state = MAP_SWITCH("reinforced_window-0", "fake_window")
base_icon_state = "reinforced_window"
opacity = FALSE
smoothing_flags = SMOOTH_BITMASK
@@ -368,9 +368,9 @@ SKYRAT EDIT REMOVAL END */
/turf/closed/indestructible/meat
name = "dense meat wall"
desc = "A huge chunk of dense, packed meat. Effectively impervious to conventional methods of destruction."
- icon = 'icons/turf/walls/meat.dmi'
- icon_state = "meatwall-0"
- base_icon_state = "meatwall"
+ icon = 'icons/turf/walls/meat_wall.dmi'
+ icon_state = "meat_wall-0"
+ base_icon_state = "meat_wall"
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = SMOOTH_GROUP_WALLS
canSmoothWith = SMOOTH_GROUP_WALLS
diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm
index 47b08da3662..173033c01c9 100644
--- a/code/game/turfs/closed/minerals.dm
+++ b/code/game/turfs/closed/minerals.dm
@@ -663,7 +663,7 @@
/turf/closed/mineral/gibtonite
mineralAmt = 1
- icon_state = "rock_Gibtonite_inactive"
+ MAP_SWITCH(, icon_state = "rock_Gibtonite_inactive")
scan_state = "rock_Gibtonite"
var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it
var/stage = GIBTONITE_UNSTRUCK //How far into the lifecycle of gibtonite we are
@@ -688,7 +688,7 @@
/turf/closed/mineral/gibtonite/proc/explosive_reaction(mob/user = null)
if(stage == GIBTONITE_UNSTRUCK)
- activated_overlay = mutable_appearance('icons/turf/smoothrocks.dmi', "rock_Gibtonite_inactive", ON_EDGED_TURF_LAYER) //shows in gaps between pulses if there are any
+ activated_overlay = mutable_appearance('icons/turf/smoothrocks_overlays.dmi', "rock_Gibtonite_inactive", ON_EDGED_TURF_LAYER) //shows in gaps between pulses if there are any
SET_PLANE(activated_overlay, WALL_PLANE_UPPER, src)
add_overlay(activated_overlay)
name = "gibtonite deposit"
@@ -708,7 +708,7 @@
/turf/closed/mineral/gibtonite/proc/countdown(notify_admins = FALSE)
set waitfor = FALSE
while(istype(src, /turf/closed/mineral/gibtonite) && stage == GIBTONITE_ACTIVE && det_time > 0 && mineralAmt >= 1)
- flick_overlay_view(mutable_appearance('icons/turf/smoothrocks.dmi', "rock_Gibtonite_active", ON_EDGED_TURF_LAYER + 0.1), 0.5 SECONDS) //makes the animation pulse one time per tick
+ flick_overlay_view(mutable_appearance('icons/turf/smoothrocks_overlays.dmi', "rock_Gibtonite_active", ON_EDGED_TURF_LAYER + 0.1), 0.5 SECONDS) //makes the animation pulse one time per tick
det_time--
sleep(0.5 SECONDS)
if(istype(src, /turf/closed/mineral/gibtonite))
@@ -768,7 +768,7 @@
defer_change = TRUE
/turf/closed/mineral/gibtonite/ice
- icon_state = "icerock_Gibtonite_inactive"
+ MAP_SWITCH(, icon_state = "icerock_Gibtonite_inactive")
icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi')
base_icon_state = "icerock_wall"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
diff --git a/code/game/turfs/closed/wall/material_walls.dm b/code/game/turfs/closed/wall/material_walls.dm
index 22b85401523..e6250007222 100644
--- a/code/game/turfs/closed/wall/material_walls.dm
+++ b/code/game/turfs/closed/wall/material_walls.dm
@@ -1,9 +1,9 @@
/turf/closed/wall/material
name = "wall"
desc = "A huge chunk of material used to separate rooms."
- icon = 'icons/turf/walls/materialwall.dmi'
- icon_state = "materialwall-0"
- base_icon_state = "materialwall"
+ icon = 'icons/turf/walls/material_wall.dmi'
+ icon_state = "material_wall-0"
+ base_icon_state = "material_wall"
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_MATERIAL_WALLS
canSmoothWith = SMOOTH_GROUP_MATERIAL_WALLS
diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm
index 8678e77f520..23e9a2cf775 100644
--- a/code/game/turfs/closed/wall/mineral_walls.dm
+++ b/code/game/turfs/closed/wall/mineral_walls.dm
@@ -186,7 +186,8 @@
name = "bamboo wall"
desc = "A wall with a bamboo finish."
icon = 'icons/turf/walls/bamboo_wall.dmi'
- icon_state = "wall-0"
+ icon_state = "bamboo_wall-0"
+ base_icon_state = "bamboo_wall"
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_BAMBOO_WALLS + SMOOTH_GROUP_CLOSED_TURFS
canSmoothWith = SMOOTH_GROUP_BAMBOO_WALLS
diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm
index 9fbce09ace2..be4b6ca7ad2 100644
--- a/code/game/turfs/closed/wall/misc_walls.dm
+++ b/code/game/turfs/closed/wall/misc_walls.dm
@@ -45,21 +45,20 @@
/turf/closed/wall/rust
//SDMM supports colors, this is simply for easier mapping
//and should be removed on initialize
- color = COLOR_ORANGE_BROWN
+ color = MAP_SWITCH(null, COLOR_ORANGE_BROWN)
/turf/closed/wall/rust/Initialize(mapload)
. = ..()
- color = null
AddElement(/datum/element/rust)
/turf/closed/wall/r_wall/rust
//SDMM supports colors, this is simply for easier mapping
//and should be removed on initialize
- color = COLOR_ORANGE_BROWN
+ color = MAP_SWITCH(null, COLOR_ORANGE_BROWN)
+ base_decon_state = "rusty_r_wall"
/turf/closed/wall/r_wall/rust/Initialize(mapload)
. = ..()
- color = null
AddElement(/datum/element/rust)
/turf/closed/wall/mineral/bronze
diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm
index b49912af8e0..b9ea2bb186d 100644
--- a/code/game/turfs/closed/wall/reinf_walls.dm
+++ b/code/game/turfs/closed/wall/reinf_walls.dm
@@ -17,7 +17,8 @@
heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall. also indicates the temperature at wich the wall will melt (currently only able to melt with H/E pipes)
///Dismantled state, related to deconstruction.
var/d_state = INTACT
-
+ ///Base icon state to use for deconstruction
+ var/base_decon_state = "r_wall"
/turf/closed/wall/r_wall/deconstruction_hints(mob/user)
switch(d_state)
@@ -200,8 +201,10 @@
// We don't react to smoothing changing here because this else exists only to "revert" intact changes
/turf/closed/wall/r_wall/update_icon_state()
if(d_state != INTACT)
- icon_state = "r_wall-[d_state]"
+ icon = 'icons/turf/walls/reinforced_states.dmi'
+ icon_state = "[base_decon_state]-[d_state]"
else
+ icon = 'icons/turf/walls/reinforced_wall.dmi'
icon_state = "[base_icon_state]-[smoothing_junction]"
return ..()
diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm
index 32cd036fb5e..d498d47a6c8 100644
--- a/code/game/turfs/open/floor/fancy_floor.dm
+++ b/code/game/turfs/open/floor/fancy_floor.dm
@@ -118,19 +118,23 @@
/turf/open/floor/bamboo/tatami
desc = "A traditional Japanese floor mat."
- icon_state = "tatami_green"
+ icon = 'icons/turf/floors/floor_variations.dmi'
+ icon_state = "bamboo-green"
floor_tile = /obj/item/stack/tile/bamboo/tatami
smoothing_flags = NONE
/turf/open/floor/bamboo/tatami/broken_states()
+ // This state doesn't exist why is it here?
return list("tatami-damaged")
/turf/open/floor/bamboo/tatami/purple
- icon_state = "tatami_purple"
+ icon = 'icons/turf/floors/floor_variations.dmi'
+ icon_state = "bamboo-purple"
floor_tile = /obj/item/stack/tile/bamboo/tatami/purple
/turf/open/floor/bamboo/tatami/black
- icon_state = "tatami_black"
+ icon = 'icons/turf/floors/floor_variations.dmi'
+ icon_state = "bamboo-black"
floor_tile = /obj/item/stack/tile/bamboo/tatami/black
/turf/open/floor/grass
@@ -274,7 +278,8 @@
QUEUE_SMOOTH_NEIGHBORS(src)
/turf/open/floor/carpet/lone
- icon_state = "carpetsymbol"
+ icon = 'icons/turf/floors/floor_variations.dmi'
+ icon_state = "carpet-symbol"
smoothing_flags = NONE
floor_tile = /obj/item/stack/tile/carpet/symbol
@@ -282,7 +287,8 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
/turf/open/floor/carpet/lone/star
- icon_state = "carpetstar"
+ icon = 'icons/turf/floors/floor_variations.dmi'
+ icon_state = "carpet-star"
floor_tile = /obj/item/stack/tile/carpet/star
/turf/open/floor/carpet/black
@@ -480,17 +486,20 @@
/turf/open/floor/carpet/neon/simple
name = "simple neon carpet"
- icon = 'icons/turf/floors/carpet_neon_simple.dmi'
+ icon = 'icons/turf/floors/carpet_neon_base.dmi'
icon_state = "base-255"
base_icon_state = "base"
+ neon_icon = 'icons/turf/floors/carpet_neon_light.dmi'
neon_icon_state = "light"
floor_tile = /obj/item/stack/tile/carpet/neon/simple
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON
/turf/open/floor/carpet/neon/simple/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_light_nodots.dmi'
neon_icon_state = "light-nodots"
floor_tile = /obj/item/stack/tile/carpet/neon/simple/nodots
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_NODOTS
@@ -505,8 +514,10 @@
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE
/turf/open/floor/carpet/neon/simple/white/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_light_nodots.dmi'
neon_icon_state = "light-nodots"
floor_tile = /obj/item/stack/tile/carpet/neon/simple/white/nodots
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE_NODOTS
@@ -515,6 +526,7 @@
/turf/open/floor/carpet/neon/simple/black
name = "simple black neon carpet"
desc = "A rubbery mat with a inset pattern of black phosphorescent dye."
+ neon_icon = 'icons/turf/floors/carpet_neon_glow.dmi'
neon_icon_state = "glow" // This one also lights up the edges of the lines.
neon_color = COLOR_BLACK
floor_tile = /obj/item/stack/tile/carpet/neon/simple/black
@@ -522,8 +534,10 @@
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK
/turf/open/floor/carpet/neon/simple/black/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_glow_nodots.dmi'
neon_icon_state = "glow-nodots"
neon_color = COLOR_BLACK
floor_tile = /obj/item/stack/tile/carpet/neon/simple/black/nodots
@@ -539,8 +553,10 @@
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED
/turf/open/floor/carpet/neon/simple/red/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_light_nodots.dmi'
neon_icon_state = "light-nodots"
floor_tile = /obj/item/stack/tile/carpet/neon/simple/red/nodots
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED_NODOTS
@@ -555,8 +571,10 @@
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE
/turf/open/floor/carpet/neon/simple/orange/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_light_nodots.dmi'
neon_icon_state = "light-nodots"
floor_tile = /obj/item/stack/tile/carpet/neon/simple/orange/nodots
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE_NODOTS
@@ -571,8 +589,10 @@
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW
/turf/open/floor/carpet/neon/simple/yellow/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_light_nodots.dmi'
neon_icon_state = "light-nodots"
floor_tile = /obj/item/stack/tile/carpet/neon/simple/yellow/nodots
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW_NODOTS
@@ -587,8 +607,10 @@
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME
/turf/open/floor/carpet/neon/simple/lime/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_light_nodots.dmi'
neon_icon_state = "light-nodots"
floor_tile = /obj/item/stack/tile/carpet/neon/simple/lime/nodots
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME_NODOTS
@@ -603,8 +625,10 @@
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN
/turf/open/floor/carpet/neon/simple/green/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_light_nodots.dmi'
neon_icon_state = "light-nodots"
floor_tile = /obj/item/stack/tile/carpet/neon/simple/green/nodots
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN_NODOTS
@@ -619,8 +643,10 @@
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL
/turf/open/floor/carpet/neon/simple/teal/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_light_nodots.dmi'
neon_icon_state = "light-nodots"
floor_tile = /obj/item/stack/tile/carpet/neon/simple/teal/nodots
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL_NODOTS
@@ -635,8 +661,10 @@
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN
/turf/open/floor/carpet/neon/simple/cyan/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_light_nodots.dmi'
neon_icon_state = "light-nodots"
floor_tile = /obj/item/stack/tile/carpet/neon/simple/cyan/nodots
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN_NODOTS
@@ -651,8 +679,10 @@
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE
/turf/open/floor/carpet/neon/simple/blue/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_light_nodots.dmi'
neon_icon_state = "light-nodots"
floor_tile = /obj/item/stack/tile/carpet/neon/simple/blue/nodots
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE_NODOTS
@@ -667,8 +697,10 @@
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE
/turf/open/floor/carpet/neon/simple/purple/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_light_nodots.dmi'
neon_icon_state = "light-nodots"
floor_tile = /obj/item/stack/tile/carpet/neon/simple/purple/nodots
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE_NODOTS
@@ -683,8 +715,10 @@
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET
/turf/open/floor/carpet/neon/simple/violet/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_light_nodots.dmi'
neon_icon_state = "light-nodots"
floor_tile = /obj/item/stack/tile/carpet/neon/simple/violet/nodots
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET_NODOTS
@@ -699,8 +733,10 @@
canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK
/turf/open/floor/carpet/neon/simple/pink/nodots
+ icon = 'icons/turf/floors/carpet_neon_base_nodots.dmi'
icon_state = "base-nodots-255"
base_icon_state = "base-nodots"
+ neon_icon = 'icons/turf/floors/carpet_neon_light_nodots.dmi'
neon_icon_state = "light-nodots"
floor_tile = /obj/item/stack/tile/carpet/neon/simple/pink/nodots
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK_NODOTS
diff --git a/code/modules/transport/tram/tram_structures.dm b/code/modules/transport/tram/tram_structures.dm
index c6291f775b3..a7308189f67 100644
--- a/code/modules/transport/tram/tram_structures.dm
+++ b/code/modules/transport/tram/tram_structures.dm
@@ -422,7 +422,7 @@
name = "bamboo tram"
desc = "A tram with a bamboo framing."
icon = 'icons/turf/walls/bamboo_wall.dmi'
- icon_state = "wall-0"
+ icon_state = "bamboo_wall-0"
base_icon_state = "wall"
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_BAMBOO_WALLS + SMOOTH_GROUP_CLOSED_TURFS
diff --git a/cutter_templates/bitmask/cardinal_32x32.toml b/cutter_templates/bitmask/cardinal_32x32.toml
new file mode 100644
index 00000000000..9d3d4097e78
--- /dev/null
+++ b/cutter_templates/bitmask/cardinal_32x32.toml
@@ -0,0 +1,36 @@
+mode = "BitmaskSlice"
+
+# Don't try and put directions in our icon states
+produce_dirs = false
+# We smooth only with our cardinal neighbors, not the ones on the diagonal
+smooth_diagonally = false
+
+# Take as input a set of 32x32 blocks
+[icon_size]
+x = 32
+y = 32
+
+# Output our stuff at the same level as it's input
+[output_icon_pos]
+x = 0
+y = 0
+
+# And at the same width/height too
+[output_icon_size]
+x = 32
+y = 32
+
+# This defines where in our list of blocks we draw each "direction" from
+# no connections, east/west, north/south, and north/south/east/west
+# the 0-3 is the block to read from, starting at 0
+[positions]
+convex = 0
+horizontal = 1
+vertical = 2
+concave = 3
+
+# When we cut up our blockls, we're cutting "around" a central point
+# We typically want to cut around the center, so let's do that here
+[cut_pos]
+x = 16
+y = 16
diff --git a/cutter_templates/bitmask/diagonal_32x32.toml b/cutter_templates/bitmask/diagonal_32x32.toml
new file mode 100644
index 00000000000..1e80e3627e9
--- /dev/null
+++ b/cutter_templates/bitmask/diagonal_32x32.toml
@@ -0,0 +1,12 @@
+template = "bitmask/cardinal_32x32"
+
+# We're diagonal
+smooth_diagonally = true
+
+# And because of that we need a state for all directions
+[positions]
+convex = 0
+vertical = 1
+horizontal = 2
+concave = 3
+flat = 4
diff --git a/dependencies.sh b/dependencies.sh
index 597f90cd850..157afa16ef2 100644
--- a/dependencies.sh
+++ b/dependencies.sh
@@ -25,3 +25,9 @@ export AUXLUA_REPO=tgstation/auxlua
#auxlua git tag
export AUXLUA_VERSION=1.4.1
+
+#hypnagogic repo
+export CUTTER_REPO=actioninja/hypnagogic
+
+#hypnagogic git tag
+export CUTTER_VERSION=v3.0.1
diff --git a/icons/Cutter.md b/icons/Cutter.md
new file mode 100644
index 00000000000..0d04c622feb
--- /dev/null
+++ b/icons/Cutter.md
@@ -0,0 +1,76 @@
+## Guide to the icon cutter
+
+### What are cut icons?
+
+There are some icons in ss13 that are essentially stitched together from a smaller set of icon states.
+
+Smoothing is a prime example of this, though anything that takes a base image and operates on it fits the system nicely.
+
+### How does the cutter work?
+
+The cutter has a bunch of different modes, different ways to operate on images. They all take some sort of input, alongside a (.toml) config file that tells us what to DO with the input.
+
+The .toml file will know the cutter mode to use, alongside any config settings. Smoothing configs can use templates instead of copying out a bunch of information, templates are stored in the cutter_templates folder.
+
+The toml file will be named like this. `{name}.{input_extension}.toml`. So if I have a config mode that uses pngs as input (almost all of them) it'll look like `{name}.png.toml`
+
+It'll then use the `{name}.png` file to make `{name}.dmi` (or whatever the cutter mode outputs)
+
+You should NEVER modify the cutter's output, it'll be erased. You only want to modify the inputs (configs, pngs, etc).
+
+As I mentioned our cutter has several different modes that do different things with different inputs.
+
+Most cutter stuff in our repo uses the BitmaskSlice mode, you can find info about it [here](https://github.com/actioninja/hypnagogic/blob/master/examples/bitmask-slice.toml)
+
+## Bitmask Smoothing (BitmaskSlice)
+
+We use bitmask smoothing to make things in the world merge with each other, "smoothing" them together.
+
+This is done by checking around these objects for things that we want to smooth into, and then encoding that as a set of directions.
+Now, we need icon states for every possible combination of smoothing directions, but it would be impossible to make those manually.
+
+So instead we take a base set of directions, typically no connections, north/south, east/west, north/south/east/west, and all connections, and then slice them up and stitch them together.
+
+Looks something like this
+
+>Example: [Bamboo](turf/floors/bamboo_mat.png.toml)
+>
+> png of 32x32 blocks, representing connections.
+>
+> [None, North + South, East + West, North + South + East + West, All]
+>
+>[](turf/floors/bamboo_mat.png)
+>
+> And its output dmi
+>
+>[](turf/floors/bamboo_mat.dmi)
+
+### How do I modify a smoothed icon?
+
+Modify the png, then recompile the game/run build.bat, it will automatically generate the dmi output.
+
+### How do I make a smoothed icon?
+
+Make a png file called `{dmi_name}.png`. It should be 5 times as wide as the dmi's width, and as tall as the dmi's height
+
+Create a config file called `{dmi_name}.png.toml`, set its [template](../cutter_templates/bitmask) to the style you want. Don't forget to set the output_name var to the base icon state you're using.
+
+Once you're done, just run build.bat or recompile, and it'll generate your cut dmi files for you.
+
+If you want to make something with nonstandard bounds you'll need to set the relevant variables, you can read the examples found [here](https://github.com/actioninja/hypnagogic/tree/master/examples) to understand different mode's configs.
+
+> Example: [Grass (50x50)](turf/floors/grass.png.toml)
+>
+>[](turf/floors/grass.png)
+
+If you want to give a particular smoothing junction a unique icon state use the prefabs var, add a new "state" to the png, and modify the config so it knows how to use it.
+
+> Example: [Donk Carpets (Big Pocket)](turf/floors/carpet_donk.png.toml)
+>
+>[](turf/floors/carpet_donk.png)
+
+If you want to make the smoothed icon animated, add another row of states below your first one. Each new row is a new frame, you define delays inside the config file as deciseconds.
+
+> Example: [Lava (Animated, 4 Frames)](turf/floors/lava.png.toml)
+>
+>[](turf/floors/lava.png)
diff --git a/icons/obj/smooth_structures/alien/nest.dmi b/icons/obj/smooth_structures/alien/nest.dmi
index 6de377886f9..5f2c2503ba2 100644
Binary files a/icons/obj/smooth_structures/alien/nest.dmi and b/icons/obj/smooth_structures/alien/nest.dmi differ
diff --git a/icons/obj/smooth_structures/alien/nest.png b/icons/obj/smooth_structures/alien/nest.png
new file mode 100644
index 00000000000..65d06047e34
Binary files /dev/null and b/icons/obj/smooth_structures/alien/nest.png differ
diff --git a/icons/obj/smooth_structures/alien/nest.png.toml b/icons/obj/smooth_structures/alien/nest.png.toml
new file mode 100644
index 00000000000..0d2dedabe81
--- /dev/null
+++ b/icons/obj/smooth_structures/alien/nest.png.toml
@@ -0,0 +1,2 @@
+output_name = "nest"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/alien/resin_membrane.dmi b/icons/obj/smooth_structures/alien/resin_membrane.dmi
index 1ea306eaa66..f91125dceca 100644
Binary files a/icons/obj/smooth_structures/alien/resin_membrane.dmi and b/icons/obj/smooth_structures/alien/resin_membrane.dmi differ
diff --git a/icons/obj/smooth_structures/alien/resin_membrane.png b/icons/obj/smooth_structures/alien/resin_membrane.png
new file mode 100644
index 00000000000..3ea4dc33ecc
Binary files /dev/null and b/icons/obj/smooth_structures/alien/resin_membrane.png differ
diff --git a/icons/obj/smooth_structures/alien/resin_membrane.png.toml b/icons/obj/smooth_structures/alien/resin_membrane.png.toml
new file mode 100644
index 00000000000..be1ef95dde4
--- /dev/null
+++ b/icons/obj/smooth_structures/alien/resin_membrane.png.toml
@@ -0,0 +1,2 @@
+output_name = "resin_membrane"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/alien/resin_wall.dmi b/icons/obj/smooth_structures/alien/resin_wall.dmi
index 7d837172b8c..1c2be2e9076 100644
Binary files a/icons/obj/smooth_structures/alien/resin_wall.dmi and b/icons/obj/smooth_structures/alien/resin_wall.dmi differ
diff --git a/icons/obj/smooth_structures/alien/resin_wall.png b/icons/obj/smooth_structures/alien/resin_wall.png
new file mode 100644
index 00000000000..d42f25a43fd
Binary files /dev/null and b/icons/obj/smooth_structures/alien/resin_wall.png differ
diff --git a/icons/obj/smooth_structures/alien/resin_wall.png.toml b/icons/obj/smooth_structures/alien/resin_wall.png.toml
new file mode 100644
index 00000000000..d0ef4fffbde
--- /dev/null
+++ b/icons/obj/smooth_structures/alien/resin_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "resin_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/alien/weednode.dmi b/icons/obj/smooth_structures/alien/weednode.dmi
index e8a0e000e1b..926730d8991 100644
Binary files a/icons/obj/smooth_structures/alien/weednode.dmi and b/icons/obj/smooth_structures/alien/weednode.dmi differ
diff --git a/icons/obj/smooth_structures/alien/weednode.png b/icons/obj/smooth_structures/alien/weednode.png
new file mode 100644
index 00000000000..0a6992d4e8b
Binary files /dev/null and b/icons/obj/smooth_structures/alien/weednode.png differ
diff --git a/icons/obj/smooth_structures/alien/weednode.png.toml b/icons/obj/smooth_structures/alien/weednode.png.toml
new file mode 100644
index 00000000000..591ca723785
--- /dev/null
+++ b/icons/obj/smooth_structures/alien/weednode.png.toml
@@ -0,0 +1,14 @@
+output_name = "weednode"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 40
+y = 40
+
+[output_icon_size]
+x = 40
+y = 40
+
+[cut_pos]
+x = 20
+y = 20
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/alien/weeds1.dmi b/icons/obj/smooth_structures/alien/weeds1.dmi
index 0809848b55f..4ba1bafcfe5 100644
Binary files a/icons/obj/smooth_structures/alien/weeds1.dmi and b/icons/obj/smooth_structures/alien/weeds1.dmi differ
diff --git a/icons/obj/smooth_structures/alien/weeds1.png b/icons/obj/smooth_structures/alien/weeds1.png
new file mode 100644
index 00000000000..1275858dba8
Binary files /dev/null and b/icons/obj/smooth_structures/alien/weeds1.png differ
diff --git a/icons/obj/smooth_structures/alien/weeds1.png.toml b/icons/obj/smooth_structures/alien/weeds1.png.toml
new file mode 100644
index 00000000000..8dc62bea3cc
--- /dev/null
+++ b/icons/obj/smooth_structures/alien/weeds1.png.toml
@@ -0,0 +1,14 @@
+output_name = "weeds1"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 40
+y = 40
+
+[output_icon_size]
+x = 40
+y = 40
+
+[cut_pos]
+x = 20
+y = 20
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/alien/weeds2.dmi b/icons/obj/smooth_structures/alien/weeds2.dmi
index 567e9bfb715..12c3b37b0ad 100644
Binary files a/icons/obj/smooth_structures/alien/weeds2.dmi and b/icons/obj/smooth_structures/alien/weeds2.dmi differ
diff --git a/icons/obj/smooth_structures/alien/weeds2.png b/icons/obj/smooth_structures/alien/weeds2.png
new file mode 100644
index 00000000000..a3e0002774b
Binary files /dev/null and b/icons/obj/smooth_structures/alien/weeds2.png differ
diff --git a/icons/obj/smooth_structures/alien/weeds2.png.toml b/icons/obj/smooth_structures/alien/weeds2.png.toml
new file mode 100644
index 00000000000..a24f8c01759
--- /dev/null
+++ b/icons/obj/smooth_structures/alien/weeds2.png.toml
@@ -0,0 +1,14 @@
+output_name = "weeds2"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 40
+y = 40
+
+[output_icon_size]
+x = 40
+y = 40
+
+[cut_pos]
+x = 20
+y = 20
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/alien/weeds3.dmi b/icons/obj/smooth_structures/alien/weeds3.dmi
index 1903262a371..45665d8969e 100644
Binary files a/icons/obj/smooth_structures/alien/weeds3.dmi and b/icons/obj/smooth_structures/alien/weeds3.dmi differ
diff --git a/icons/obj/smooth_structures/alien/weeds3.png b/icons/obj/smooth_structures/alien/weeds3.png
new file mode 100644
index 00000000000..b9c0d444015
Binary files /dev/null and b/icons/obj/smooth_structures/alien/weeds3.png differ
diff --git a/icons/obj/smooth_structures/alien/weeds3.png.toml b/icons/obj/smooth_structures/alien/weeds3.png.toml
new file mode 100644
index 00000000000..19eb01420b4
--- /dev/null
+++ b/icons/obj/smooth_structures/alien/weeds3.png.toml
@@ -0,0 +1,14 @@
+output_name = "weeds3"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 40
+y = 40
+
+[output_icon_size]
+x = 40
+y = 40
+
+[cut_pos]
+x = 20
+y = 20
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/alien_table.dmi b/icons/obj/smooth_structures/alien_table.dmi
index 63492d241ba..865b7d3572f 100644
Binary files a/icons/obj/smooth_structures/alien_table.dmi and b/icons/obj/smooth_structures/alien_table.dmi differ
diff --git a/icons/obj/smooth_structures/alien_table.png b/icons/obj/smooth_structures/alien_table.png
new file mode 100644
index 00000000000..d9a5c3b73e4
Binary files /dev/null and b/icons/obj/smooth_structures/alien_table.png differ
diff --git a/icons/obj/smooth_structures/alien_table.png.toml b/icons/obj/smooth_structures/alien_table.png.toml
new file mode 100644
index 00000000000..8ae63217ae5
--- /dev/null
+++ b/icons/obj/smooth_structures/alien_table.png.toml
@@ -0,0 +1,2 @@
+output_name = "alien_table"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/brass_table.dmi b/icons/obj/smooth_structures/brass_table.dmi
index c48f99062e2..74417b815ab 100644
Binary files a/icons/obj/smooth_structures/brass_table.dmi and b/icons/obj/smooth_structures/brass_table.dmi differ
diff --git a/icons/obj/smooth_structures/brass_table.png b/icons/obj/smooth_structures/brass_table.png
new file mode 100644
index 00000000000..2552eb2f92b
Binary files /dev/null and b/icons/obj/smooth_structures/brass_table.png differ
diff --git a/icons/obj/smooth_structures/brass_table.png.toml b/icons/obj/smooth_structures/brass_table.png.toml
new file mode 100644
index 00000000000..d633747042d
--- /dev/null
+++ b/icons/obj/smooth_structures/brass_table.png.toml
@@ -0,0 +1,2 @@
+output_name = "brass_table"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/catwalk.dmi b/icons/obj/smooth_structures/catwalk.dmi
index 0920cc571f1..568afb15fea 100644
Binary files a/icons/obj/smooth_structures/catwalk.dmi and b/icons/obj/smooth_structures/catwalk.dmi differ
diff --git a/icons/obj/smooth_structures/catwalk.png b/icons/obj/smooth_structures/catwalk.png
new file mode 100644
index 00000000000..5d9cc940562
Binary files /dev/null and b/icons/obj/smooth_structures/catwalk.png differ
diff --git a/icons/obj/smooth_structures/catwalk.png.toml b/icons/obj/smooth_structures/catwalk.png.toml
new file mode 100644
index 00000000000..42610e2043b
--- /dev/null
+++ b/icons/obj/smooth_structures/catwalk.png.toml
@@ -0,0 +1,2 @@
+output_name = "catwalk"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/clockwork_window.dmi b/icons/obj/smooth_structures/clockwork_window.dmi
index 674a16d43e0..6676095e9fb 100644
Binary files a/icons/obj/smooth_structures/clockwork_window.dmi and b/icons/obj/smooth_structures/clockwork_window.dmi differ
diff --git a/icons/obj/smooth_structures/clockwork_window.png b/icons/obj/smooth_structures/clockwork_window.png
new file mode 100644
index 00000000000..a94b706447b
Binary files /dev/null and b/icons/obj/smooth_structures/clockwork_window.png differ
diff --git a/icons/obj/smooth_structures/clockwork_window.png.toml b/icons/obj/smooth_structures/clockwork_window.png.toml
new file mode 100644
index 00000000000..72375e77541
--- /dev/null
+++ b/icons/obj/smooth_structures/clockwork_window.png.toml
@@ -0,0 +1,2 @@
+output_name = "clockwork_window"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/fancy_table.dmi b/icons/obj/smooth_structures/fancy_table.dmi
index 475ca392ba0..c72e06d6798 100644
Binary files a/icons/obj/smooth_structures/fancy_table.dmi and b/icons/obj/smooth_structures/fancy_table.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table.png b/icons/obj/smooth_structures/fancy_table.png
new file mode 100644
index 00000000000..3ca279bbd72
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table.png differ
diff --git a/icons/obj/smooth_structures/fancy_table.png.toml b/icons/obj/smooth_structures/fancy_table.png.toml
new file mode 100644
index 00000000000..df9ca0016d7
--- /dev/null
+++ b/icons/obj/smooth_structures/fancy_table.png.toml
@@ -0,0 +1,14 @@
+output_name = "fancy_table"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 32
+y = 34
+
+[output_icon_size]
+x = 32
+y = 34
+
+[cut_pos]
+x = 16
+y = 17
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/fancy_table_black.dmi b/icons/obj/smooth_structures/fancy_table_black.dmi
index 86d4410533f..3be7232af5e 100644
Binary files a/icons/obj/smooth_structures/fancy_table_black.dmi and b/icons/obj/smooth_structures/fancy_table_black.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_black.png b/icons/obj/smooth_structures/fancy_table_black.png
new file mode 100644
index 00000000000..f7e2bfa810b
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_black.png differ
diff --git a/icons/obj/smooth_structures/fancy_table_black.png.toml b/icons/obj/smooth_structures/fancy_table_black.png.toml
new file mode 100644
index 00000000000..acf7a6b8213
--- /dev/null
+++ b/icons/obj/smooth_structures/fancy_table_black.png.toml
@@ -0,0 +1,14 @@
+output_name = "fancy_table_black"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 32
+y = 34
+
+[output_icon_size]
+x = 32
+y = 34
+
+[cut_pos]
+x = 16
+y = 17
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/fancy_table_blue.dmi b/icons/obj/smooth_structures/fancy_table_blue.dmi
index cb0fe3c8faf..26263e51491 100644
Binary files a/icons/obj/smooth_structures/fancy_table_blue.dmi and b/icons/obj/smooth_structures/fancy_table_blue.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_blue.png b/icons/obj/smooth_structures/fancy_table_blue.png
new file mode 100644
index 00000000000..ad2d4192c7f
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_blue.png differ
diff --git a/icons/obj/smooth_structures/fancy_table_blue.png.toml b/icons/obj/smooth_structures/fancy_table_blue.png.toml
new file mode 100644
index 00000000000..0a71213ab34
--- /dev/null
+++ b/icons/obj/smooth_structures/fancy_table_blue.png.toml
@@ -0,0 +1,14 @@
+output_name = "fancy_table_blue"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 32
+y = 34
+
+[output_icon_size]
+x = 32
+y = 34
+
+[cut_pos]
+x = 16
+y = 17
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/fancy_table_cyan.dmi b/icons/obj/smooth_structures/fancy_table_cyan.dmi
index 8343ae6761a..6da44a863cd 100644
Binary files a/icons/obj/smooth_structures/fancy_table_cyan.dmi and b/icons/obj/smooth_structures/fancy_table_cyan.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_cyan.png b/icons/obj/smooth_structures/fancy_table_cyan.png
new file mode 100644
index 00000000000..96a68b93617
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_cyan.png differ
diff --git a/icons/obj/smooth_structures/fancy_table_cyan.png.toml b/icons/obj/smooth_structures/fancy_table_cyan.png.toml
new file mode 100644
index 00000000000..6991b7ea524
--- /dev/null
+++ b/icons/obj/smooth_structures/fancy_table_cyan.png.toml
@@ -0,0 +1,14 @@
+output_name = "fancy_table_cyan"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 32
+y = 34
+
+[output_icon_size]
+x = 32
+y = 34
+
+[cut_pos]
+x = 16
+y = 17
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/fancy_table_green.dmi b/icons/obj/smooth_structures/fancy_table_green.dmi
index 86c1746a7df..dc6c7e4703c 100644
Binary files a/icons/obj/smooth_structures/fancy_table_green.dmi and b/icons/obj/smooth_structures/fancy_table_green.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_green.png b/icons/obj/smooth_structures/fancy_table_green.png
new file mode 100644
index 00000000000..616eeeaa6ec
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_green.png differ
diff --git a/icons/obj/smooth_structures/fancy_table_green.png.toml b/icons/obj/smooth_structures/fancy_table_green.png.toml
new file mode 100644
index 00000000000..a4486179c6a
--- /dev/null
+++ b/icons/obj/smooth_structures/fancy_table_green.png.toml
@@ -0,0 +1,14 @@
+output_name = "fancy_table_green"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 32
+y = 34
+
+[output_icon_size]
+x = 32
+y = 34
+
+[cut_pos]
+x = 16
+y = 17
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/fancy_table_orange.dmi b/icons/obj/smooth_structures/fancy_table_orange.dmi
index f55ef38ac55..91428a75253 100644
Binary files a/icons/obj/smooth_structures/fancy_table_orange.dmi and b/icons/obj/smooth_structures/fancy_table_orange.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_orange.png b/icons/obj/smooth_structures/fancy_table_orange.png
new file mode 100644
index 00000000000..d2aff0ff4c1
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_orange.png differ
diff --git a/icons/obj/smooth_structures/fancy_table_orange.png.toml b/icons/obj/smooth_structures/fancy_table_orange.png.toml
new file mode 100644
index 00000000000..fcca03afb5a
--- /dev/null
+++ b/icons/obj/smooth_structures/fancy_table_orange.png.toml
@@ -0,0 +1,14 @@
+output_name = "fancy_table_orange"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 32
+y = 34
+
+[output_icon_size]
+x = 32
+y = 34
+
+[cut_pos]
+x = 16
+y = 17
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/fancy_table_purple.dmi b/icons/obj/smooth_structures/fancy_table_purple.dmi
index 52bdb02980c..930b0556520 100644
Binary files a/icons/obj/smooth_structures/fancy_table_purple.dmi and b/icons/obj/smooth_structures/fancy_table_purple.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_purple.png b/icons/obj/smooth_structures/fancy_table_purple.png
new file mode 100644
index 00000000000..fad1b80c922
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_purple.png differ
diff --git a/icons/obj/smooth_structures/fancy_table_purple.png.toml b/icons/obj/smooth_structures/fancy_table_purple.png.toml
new file mode 100644
index 00000000000..2da707716ff
--- /dev/null
+++ b/icons/obj/smooth_structures/fancy_table_purple.png.toml
@@ -0,0 +1,14 @@
+output_name = "fancy_table_purple"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 32
+y = 34
+
+[output_icon_size]
+x = 32
+y = 34
+
+[cut_pos]
+x = 16
+y = 17
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/fancy_table_red.dmi b/icons/obj/smooth_structures/fancy_table_red.dmi
index eb84340873b..ceca04aeb06 100644
Binary files a/icons/obj/smooth_structures/fancy_table_red.dmi and b/icons/obj/smooth_structures/fancy_table_red.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_red.png b/icons/obj/smooth_structures/fancy_table_red.png
new file mode 100644
index 00000000000..f94307cb7d4
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_red.png differ
diff --git a/icons/obj/smooth_structures/fancy_table_red.png.toml b/icons/obj/smooth_structures/fancy_table_red.png.toml
new file mode 100644
index 00000000000..d3b99e80746
--- /dev/null
+++ b/icons/obj/smooth_structures/fancy_table_red.png.toml
@@ -0,0 +1,14 @@
+output_name = "fancy_table_red"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 32
+y = 34
+
+[output_icon_size]
+x = 32
+y = 34
+
+[cut_pos]
+x = 16
+y = 17
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/fancy_table_royalblack.dmi b/icons/obj/smooth_structures/fancy_table_royalblack.dmi
index 3fafd6b23c2..b7f6f6e284d 100644
Binary files a/icons/obj/smooth_structures/fancy_table_royalblack.dmi and b/icons/obj/smooth_structures/fancy_table_royalblack.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_royalblack.png b/icons/obj/smooth_structures/fancy_table_royalblack.png
new file mode 100644
index 00000000000..82913622d1e
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_royalblack.png differ
diff --git a/icons/obj/smooth_structures/fancy_table_royalblack.png.toml b/icons/obj/smooth_structures/fancy_table_royalblack.png.toml
new file mode 100644
index 00000000000..76a975938f8
--- /dev/null
+++ b/icons/obj/smooth_structures/fancy_table_royalblack.png.toml
@@ -0,0 +1,14 @@
+output_name = "fancy_table_royalblack"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 32
+y = 34
+
+[output_icon_size]
+x = 32
+y = 34
+
+[cut_pos]
+x = 16
+y = 17
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/fancy_table_royalblue.dmi b/icons/obj/smooth_structures/fancy_table_royalblue.dmi
index bd4400bfb0a..8f7a03ba5ad 100644
Binary files a/icons/obj/smooth_structures/fancy_table_royalblue.dmi and b/icons/obj/smooth_structures/fancy_table_royalblue.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_royalblue.png b/icons/obj/smooth_structures/fancy_table_royalblue.png
new file mode 100644
index 00000000000..6b1a2b2a813
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_royalblue.png differ
diff --git a/icons/obj/smooth_structures/fancy_table_royalblue.png.toml b/icons/obj/smooth_structures/fancy_table_royalblue.png.toml
new file mode 100644
index 00000000000..59987f0feb8
--- /dev/null
+++ b/icons/obj/smooth_structures/fancy_table_royalblue.png.toml
@@ -0,0 +1,14 @@
+output_name = "fancy_table_royalblue"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 32
+y = 34
+
+[output_icon_size]
+x = 32
+y = 34
+
+[cut_pos]
+x = 16
+y = 17
\ No newline at end of file
diff --git a/icons/obj/smooth_structures/glass_table.dmi b/icons/obj/smooth_structures/glass_table.dmi
index 09ecbc1bb44..56c43801832 100644
Binary files a/icons/obj/smooth_structures/glass_table.dmi and b/icons/obj/smooth_structures/glass_table.dmi differ
diff --git a/icons/obj/smooth_structures/glass_table.png b/icons/obj/smooth_structures/glass_table.png
new file mode 100644
index 00000000000..f61de10c507
Binary files /dev/null and b/icons/obj/smooth_structures/glass_table.png differ
diff --git a/icons/obj/smooth_structures/glass_table.png.toml b/icons/obj/smooth_structures/glass_table.png.toml
new file mode 100644
index 00000000000..91177545f2c
--- /dev/null
+++ b/icons/obj/smooth_structures/glass_table.png.toml
@@ -0,0 +1,2 @@
+output_name = "glass_table"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/hedge.dmi b/icons/obj/smooth_structures/hedge.dmi
index 9c38bc844f6..dea538dd752 100644
Binary files a/icons/obj/smooth_structures/hedge.dmi and b/icons/obj/smooth_structures/hedge.dmi differ
diff --git a/icons/obj/smooth_structures/hedge.png b/icons/obj/smooth_structures/hedge.png
new file mode 100644
index 00000000000..923c425cb32
Binary files /dev/null and b/icons/obj/smooth_structures/hedge.png differ
diff --git a/icons/obj/smooth_structures/hedge.png.toml b/icons/obj/smooth_structures/hedge.png.toml
new file mode 100644
index 00000000000..a03553bb326
--- /dev/null
+++ b/icons/obj/smooth_structures/hedge.png.toml
@@ -0,0 +1,2 @@
+output_name = "hedge"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/lattice.dmi b/icons/obj/smooth_structures/lattice.dmi
index d9223ded775..3ae4964a11f 100644
Binary files a/icons/obj/smooth_structures/lattice.dmi and b/icons/obj/smooth_structures/lattice.dmi differ
diff --git a/icons/obj/smooth_structures/lattice.png b/icons/obj/smooth_structures/lattice.png
new file mode 100644
index 00000000000..9d00f8dfe20
Binary files /dev/null and b/icons/obj/smooth_structures/lattice.png differ
diff --git a/icons/obj/smooth_structures/lattice.png.toml b/icons/obj/smooth_structures/lattice.png.toml
new file mode 100644
index 00000000000..63e711fce31
--- /dev/null
+++ b/icons/obj/smooth_structures/lattice.png.toml
@@ -0,0 +1,2 @@
+output_name = "lattice"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/paperframes.dmi b/icons/obj/smooth_structures/paperframes.dmi
index 9982db639cb..0adb2646b1c 100644
Binary files a/icons/obj/smooth_structures/paperframes.dmi and b/icons/obj/smooth_structures/paperframes.dmi differ
diff --git a/icons/obj/smooth_structures/paperframes.png b/icons/obj/smooth_structures/paperframes.png
new file mode 100644
index 00000000000..b6d10892ecc
Binary files /dev/null and b/icons/obj/smooth_structures/paperframes.png differ
diff --git a/icons/obj/smooth_structures/paperframes.png.toml b/icons/obj/smooth_structures/paperframes.png.toml
new file mode 100644
index 00000000000..5d3bbe12442
--- /dev/null
+++ b/icons/obj/smooth_structures/paperframes.png.toml
@@ -0,0 +1,2 @@
+output_name = "paperframes"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/plasma_window.dmi b/icons/obj/smooth_structures/plasma_window.dmi
index eaed6f219e0..bbfe7591777 100644
Binary files a/icons/obj/smooth_structures/plasma_window.dmi and b/icons/obj/smooth_structures/plasma_window.dmi differ
diff --git a/icons/obj/smooth_structures/plasma_window.png b/icons/obj/smooth_structures/plasma_window.png
new file mode 100644
index 00000000000..d38c888be9a
Binary files /dev/null and b/icons/obj/smooth_structures/plasma_window.png differ
diff --git a/icons/obj/smooth_structures/plasma_window.png.toml b/icons/obj/smooth_structures/plasma_window.png.toml
new file mode 100644
index 00000000000..2ed25c1b89c
--- /dev/null
+++ b/icons/obj/smooth_structures/plasma_window.png.toml
@@ -0,0 +1,2 @@
+output_name = "plasma_window"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/plasmaglass_table.dmi b/icons/obj/smooth_structures/plasmaglass_table.dmi
index 5dfe68d0673..7c90a489e82 100644
Binary files a/icons/obj/smooth_structures/plasmaglass_table.dmi and b/icons/obj/smooth_structures/plasmaglass_table.dmi differ
diff --git a/icons/obj/smooth_structures/plasmaglass_table.png b/icons/obj/smooth_structures/plasmaglass_table.png
new file mode 100644
index 00000000000..f3b062d6fdb
Binary files /dev/null and b/icons/obj/smooth_structures/plasmaglass_table.png differ
diff --git a/icons/obj/smooth_structures/plasmaglass_table.png.toml b/icons/obj/smooth_structures/plasmaglass_table.png.toml
new file mode 100644
index 00000000000..744e082acf6
--- /dev/null
+++ b/icons/obj/smooth_structures/plasmaglass_table.png.toml
@@ -0,0 +1,2 @@
+output_name = "plasmaglass_table"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/plastitanium_window.dmi b/icons/obj/smooth_structures/plastitanium_window.dmi
index 14ec56a59c4..85eae01e8cb 100644
Binary files a/icons/obj/smooth_structures/plastitanium_window.dmi and b/icons/obj/smooth_structures/plastitanium_window.dmi differ
diff --git a/icons/obj/smooth_structures/plastitanium_window.png b/icons/obj/smooth_structures/plastitanium_window.png
new file mode 100644
index 00000000000..114e5d7e021
Binary files /dev/null and b/icons/obj/smooth_structures/plastitanium_window.png differ
diff --git a/icons/obj/smooth_structures/plastitanium_window.png.toml b/icons/obj/smooth_structures/plastitanium_window.png.toml
new file mode 100644
index 00000000000..fe2fcaada1d
--- /dev/null
+++ b/icons/obj/smooth_structures/plastitanium_window.png.toml
@@ -0,0 +1,2 @@
+output_name = "plastitanium_window"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/plastitaniumglass_table.dmi b/icons/obj/smooth_structures/plastitaniumglass_table.dmi
index 4c4a6438690..78b6af93ba2 100644
Binary files a/icons/obj/smooth_structures/plastitaniumglass_table.dmi and b/icons/obj/smooth_structures/plastitaniumglass_table.dmi differ
diff --git a/icons/obj/smooth_structures/plastitaniumglass_table.png b/icons/obj/smooth_structures/plastitaniumglass_table.png
new file mode 100644
index 00000000000..b9619645bdf
Binary files /dev/null and b/icons/obj/smooth_structures/plastitaniumglass_table.png differ
diff --git a/icons/obj/smooth_structures/plastitaniumglass_table.png.toml b/icons/obj/smooth_structures/plastitaniumglass_table.png.toml
new file mode 100644
index 00000000000..b1db1da55fc
--- /dev/null
+++ b/icons/obj/smooth_structures/plastitaniumglass_table.png.toml
@@ -0,0 +1,2 @@
+output_name = "plastitaniumglass_table"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/pod_window.dmi b/icons/obj/smooth_structures/pod_window.dmi
index 46d4208b4b5..f179cea280f 100644
Binary files a/icons/obj/smooth_structures/pod_window.dmi and b/icons/obj/smooth_structures/pod_window.dmi differ
diff --git a/icons/obj/smooth_structures/pod_window.png b/icons/obj/smooth_structures/pod_window.png
new file mode 100644
index 00000000000..3bc31691919
Binary files /dev/null and b/icons/obj/smooth_structures/pod_window.png differ
diff --git a/icons/obj/smooth_structures/pod_window.png.toml b/icons/obj/smooth_structures/pod_window.png.toml
new file mode 100644
index 00000000000..f23c6e7a3ae
--- /dev/null
+++ b/icons/obj/smooth_structures/pod_window.png.toml
@@ -0,0 +1,2 @@
+output_name = "pod_window"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/poker_table.dmi b/icons/obj/smooth_structures/poker_table.dmi
index d0b70822771..3dbc230ad0b 100644
Binary files a/icons/obj/smooth_structures/poker_table.dmi and b/icons/obj/smooth_structures/poker_table.dmi differ
diff --git a/icons/obj/smooth_structures/poker_table.png b/icons/obj/smooth_structures/poker_table.png
new file mode 100644
index 00000000000..1be2da65196
Binary files /dev/null and b/icons/obj/smooth_structures/poker_table.png differ
diff --git a/icons/obj/smooth_structures/poker_table.png.toml b/icons/obj/smooth_structures/poker_table.png.toml
new file mode 100644
index 00000000000..b12426f9236
--- /dev/null
+++ b/icons/obj/smooth_structures/poker_table.png.toml
@@ -0,0 +1,2 @@
+output_name = "poker_table"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/reinforced_table.dmi b/icons/obj/smooth_structures/reinforced_table.dmi
index b2867b57994..5053deff017 100644
Binary files a/icons/obj/smooth_structures/reinforced_table.dmi and b/icons/obj/smooth_structures/reinforced_table.dmi differ
diff --git a/icons/obj/smooth_structures/reinforced_table.png b/icons/obj/smooth_structures/reinforced_table.png
new file mode 100644
index 00000000000..0f9ae450e56
Binary files /dev/null and b/icons/obj/smooth_structures/reinforced_table.png differ
diff --git a/icons/obj/smooth_structures/reinforced_table.png.toml b/icons/obj/smooth_structures/reinforced_table.png.toml
new file mode 100644
index 00000000000..f7143356b4c
--- /dev/null
+++ b/icons/obj/smooth_structures/reinforced_table.png.toml
@@ -0,0 +1,2 @@
+output_name = "reinforced_table"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/reinforced_window.dmi b/icons/obj/smooth_structures/reinforced_window.dmi
index a66b648786d..5506e827416 100644
Binary files a/icons/obj/smooth_structures/reinforced_window.dmi and b/icons/obj/smooth_structures/reinforced_window.dmi differ
diff --git a/icons/obj/smooth_structures/reinforced_window.png b/icons/obj/smooth_structures/reinforced_window.png
new file mode 100644
index 00000000000..d7a4f76654d
Binary files /dev/null and b/icons/obj/smooth_structures/reinforced_window.png differ
diff --git a/icons/obj/smooth_structures/reinforced_window.png.toml b/icons/obj/smooth_structures/reinforced_window.png.toml
new file mode 100644
index 00000000000..686fd268e3b
--- /dev/null
+++ b/icons/obj/smooth_structures/reinforced_window.png.toml
@@ -0,0 +1,2 @@
+output_name = "reinforced_window"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/rglass_table.dmi b/icons/obj/smooth_structures/rglass_table.dmi
index 3b645c72ad3..fd0bb83c2ee 100644
Binary files a/icons/obj/smooth_structures/rglass_table.dmi and b/icons/obj/smooth_structures/rglass_table.dmi differ
diff --git a/icons/obj/smooth_structures/rglass_table.png b/icons/obj/smooth_structures/rglass_table.png
new file mode 100644
index 00000000000..970fc7d7770
Binary files /dev/null and b/icons/obj/smooth_structures/rglass_table.png differ
diff --git a/icons/obj/smooth_structures/rglass_table.png.toml b/icons/obj/smooth_structures/rglass_table.png.toml
new file mode 100644
index 00000000000..c4cca008bbd
--- /dev/null
+++ b/icons/obj/smooth_structures/rglass_table.png.toml
@@ -0,0 +1,2 @@
+output_name = "rglass_table"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/rice_window.dmi b/icons/obj/smooth_structures/rice_window.dmi
index 3680926e7fa..b418cd87cfd 100644
Binary files a/icons/obj/smooth_structures/rice_window.dmi and b/icons/obj/smooth_structures/rice_window.dmi differ
diff --git a/icons/obj/smooth_structures/rice_window.png b/icons/obj/smooth_structures/rice_window.png
new file mode 100644
index 00000000000..61645b22d96
Binary files /dev/null and b/icons/obj/smooth_structures/rice_window.png differ
diff --git a/icons/obj/smooth_structures/rice_window.png.toml b/icons/obj/smooth_structures/rice_window.png.toml
new file mode 100644
index 00000000000..52f1aae1b2e
--- /dev/null
+++ b/icons/obj/smooth_structures/rice_window.png.toml
@@ -0,0 +1,2 @@
+output_name = "rice_window"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/rplasma_window.dmi b/icons/obj/smooth_structures/rplasma_window.dmi
index 173b8d53766..1952a0a8200 100644
Binary files a/icons/obj/smooth_structures/rplasma_window.dmi and b/icons/obj/smooth_structures/rplasma_window.dmi differ
diff --git a/icons/obj/smooth_structures/rplasma_window.png b/icons/obj/smooth_structures/rplasma_window.png
new file mode 100644
index 00000000000..9ea53c9b540
Binary files /dev/null and b/icons/obj/smooth_structures/rplasma_window.png differ
diff --git a/icons/obj/smooth_structures/rplasma_window.png.toml b/icons/obj/smooth_structures/rplasma_window.png.toml
new file mode 100644
index 00000000000..791b3779245
--- /dev/null
+++ b/icons/obj/smooth_structures/rplasma_window.png.toml
@@ -0,0 +1,2 @@
+output_name = "rplasma_window"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/rplasmaglass_table.dmi b/icons/obj/smooth_structures/rplasmaglass_table.dmi
index 4e812c79c7a..db65243ab7c 100644
Binary files a/icons/obj/smooth_structures/rplasmaglass_table.dmi and b/icons/obj/smooth_structures/rplasmaglass_table.dmi differ
diff --git a/icons/obj/smooth_structures/rplasmaglass_table.png b/icons/obj/smooth_structures/rplasmaglass_table.png
new file mode 100644
index 00000000000..4752df63b82
Binary files /dev/null and b/icons/obj/smooth_structures/rplasmaglass_table.png differ
diff --git a/icons/obj/smooth_structures/rplasmaglass_table.png.toml b/icons/obj/smooth_structures/rplasmaglass_table.png.toml
new file mode 100644
index 00000000000..29f4f3408cb
--- /dev/null
+++ b/icons/obj/smooth_structures/rplasmaglass_table.png.toml
@@ -0,0 +1,2 @@
+output_name = "rplasmaglass_table"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/sandbags.dmi b/icons/obj/smooth_structures/sandbags.dmi
index 6ff5bfbd7eb..d5e1d1877da 100644
Binary files a/icons/obj/smooth_structures/sandbags.dmi and b/icons/obj/smooth_structures/sandbags.dmi differ
diff --git a/icons/obj/smooth_structures/sandbags.png b/icons/obj/smooth_structures/sandbags.png
new file mode 100644
index 00000000000..ed0308c854f
Binary files /dev/null and b/icons/obj/smooth_structures/sandbags.png differ
diff --git a/icons/obj/smooth_structures/sandbags.png.toml b/icons/obj/smooth_structures/sandbags.png.toml
new file mode 100644
index 00000000000..146b6d42589
--- /dev/null
+++ b/icons/obj/smooth_structures/sandbags.png.toml
@@ -0,0 +1,2 @@
+output_name = "sandbags"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/shuttle_window.dmi b/icons/obj/smooth_structures/shuttle_window.dmi
index 9b9891e9d2c..68ca36d3778 100644
Binary files a/icons/obj/smooth_structures/shuttle_window.dmi and b/icons/obj/smooth_structures/shuttle_window.dmi differ
diff --git a/icons/obj/smooth_structures/shuttle_window.png b/icons/obj/smooth_structures/shuttle_window.png
new file mode 100644
index 00000000000..a5312cb8ae7
Binary files /dev/null and b/icons/obj/smooth_structures/shuttle_window.png differ
diff --git a/icons/obj/smooth_structures/shuttle_window.png.toml b/icons/obj/smooth_structures/shuttle_window.png.toml
new file mode 100644
index 00000000000..1c26ec4d86f
--- /dev/null
+++ b/icons/obj/smooth_structures/shuttle_window.png.toml
@@ -0,0 +1,2 @@
+output_name = "shuttle_window"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/structure_variations.dmi b/icons/obj/smooth_structures/structure_variations.dmi
new file mode 100644
index 00000000000..afabd8f4f2e
Binary files /dev/null and b/icons/obj/smooth_structures/structure_variations.dmi differ
diff --git a/icons/obj/smooth_structures/table.dmi b/icons/obj/smooth_structures/table.dmi
index 3b15d2a27dd..225f0950b95 100644
Binary files a/icons/obj/smooth_structures/table.dmi and b/icons/obj/smooth_structures/table.dmi differ
diff --git a/icons/obj/smooth_structures/table.png b/icons/obj/smooth_structures/table.png
new file mode 100644
index 00000000000..b5acd10b4b8
Binary files /dev/null and b/icons/obj/smooth_structures/table.png differ
diff --git a/icons/obj/smooth_structures/table.png.toml b/icons/obj/smooth_structures/table.png.toml
new file mode 100644
index 00000000000..3700febbed5
--- /dev/null
+++ b/icons/obj/smooth_structures/table.png.toml
@@ -0,0 +1,2 @@
+output_name = "table"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/table_greyscale.dmi b/icons/obj/smooth_structures/table_greyscale.dmi
index 2c3acf69bfe..0c3513c58d1 100644
Binary files a/icons/obj/smooth_structures/table_greyscale.dmi and b/icons/obj/smooth_structures/table_greyscale.dmi differ
diff --git a/icons/obj/smooth_structures/table_greyscale.png b/icons/obj/smooth_structures/table_greyscale.png
new file mode 100644
index 00000000000..535a535d03c
Binary files /dev/null and b/icons/obj/smooth_structures/table_greyscale.png differ
diff --git a/icons/obj/smooth_structures/table_greyscale.png.toml b/icons/obj/smooth_structures/table_greyscale.png.toml
new file mode 100644
index 00000000000..6a68ba8bc4d
--- /dev/null
+++ b/icons/obj/smooth_structures/table_greyscale.png.toml
@@ -0,0 +1,2 @@
+output_name = "table_greyscale"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/tinted_window.dmi b/icons/obj/smooth_structures/tinted_window.dmi
index 59b690110e5..53f803c3942 100644
Binary files a/icons/obj/smooth_structures/tinted_window.dmi and b/icons/obj/smooth_structures/tinted_window.dmi differ
diff --git a/icons/obj/smooth_structures/tinted_window.png b/icons/obj/smooth_structures/tinted_window.png
new file mode 100644
index 00000000000..6601e8c231f
Binary files /dev/null and b/icons/obj/smooth_structures/tinted_window.png differ
diff --git a/icons/obj/smooth_structures/tinted_window.png.toml b/icons/obj/smooth_structures/tinted_window.png.toml
new file mode 100644
index 00000000000..9d8250aa81d
--- /dev/null
+++ b/icons/obj/smooth_structures/tinted_window.png.toml
@@ -0,0 +1,2 @@
+output_name = "tinted_window"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/titaniumglass_table.dmi b/icons/obj/smooth_structures/titaniumglass_table.dmi
index 76dc30163f0..43bf24b5afe 100644
Binary files a/icons/obj/smooth_structures/titaniumglass_table.dmi and b/icons/obj/smooth_structures/titaniumglass_table.dmi differ
diff --git a/icons/obj/smooth_structures/titaniumglass_table.png b/icons/obj/smooth_structures/titaniumglass_table.png
new file mode 100644
index 00000000000..8da5ba0849d
Binary files /dev/null and b/icons/obj/smooth_structures/titaniumglass_table.png differ
diff --git a/icons/obj/smooth_structures/titaniumglass_table.png.toml b/icons/obj/smooth_structures/titaniumglass_table.png.toml
new file mode 100644
index 00000000000..d77b867616c
--- /dev/null
+++ b/icons/obj/smooth_structures/titaniumglass_table.png.toml
@@ -0,0 +1,2 @@
+output_name = "titaniumglass_table"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/window.dmi b/icons/obj/smooth_structures/window.dmi
index 4b78390251e..6dab5136d41 100644
Binary files a/icons/obj/smooth_structures/window.dmi and b/icons/obj/smooth_structures/window.dmi differ
diff --git a/icons/obj/smooth_structures/window.png b/icons/obj/smooth_structures/window.png
new file mode 100644
index 00000000000..e06498a9e3a
Binary files /dev/null and b/icons/obj/smooth_structures/window.png differ
diff --git a/icons/obj/smooth_structures/window.png.toml b/icons/obj/smooth_structures/window.png.toml
new file mode 100644
index 00000000000..7ae19716bb6
--- /dev/null
+++ b/icons/obj/smooth_structures/window.png.toml
@@ -0,0 +1,2 @@
+output_name = "window"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/obj/smooth_structures/wood_table.dmi b/icons/obj/smooth_structures/wood_table.dmi
index 3c72c11c591..ddc65b0c739 100644
Binary files a/icons/obj/smooth_structures/wood_table.dmi and b/icons/obj/smooth_structures/wood_table.dmi differ
diff --git a/icons/obj/smooth_structures/wood_table.png b/icons/obj/smooth_structures/wood_table.png
new file mode 100644
index 00000000000..72dc68ce7c3
Binary files /dev/null and b/icons/obj/smooth_structures/wood_table.png differ
diff --git a/icons/obj/smooth_structures/wood_table.png.toml b/icons/obj/smooth_structures/wood_table.png.toml
new file mode 100644
index 00000000000..1c197d3d9f8
--- /dev/null
+++ b/icons/obj/smooth_structures/wood_table.png.toml
@@ -0,0 +1,2 @@
+output_name = "wood_table"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/cliff/icerock_cliff.dmi b/icons/turf/cliff/icerock_cliff.dmi
index 260a963a1ea..0bcef05b072 100644
Binary files a/icons/turf/cliff/icerock_cliff.dmi and b/icons/turf/cliff/icerock_cliff.dmi differ
diff --git a/icons/turf/cliff/icerock_cliff.png b/icons/turf/cliff/icerock_cliff.png
new file mode 100644
index 00000000000..962cceaa036
Binary files /dev/null and b/icons/turf/cliff/icerock_cliff.png differ
diff --git a/icons/turf/cliff/icerock_cliff.png.toml b/icons/turf/cliff/icerock_cliff.png.toml
new file mode 100644
index 00000000000..7d713818b56
--- /dev/null
+++ b/icons/turf/cliff/icerock_cliff.png.toml
@@ -0,0 +1,14 @@
+output_name = "icerock_wall"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 40
+y = 40
+
+[output_icon_size]
+x = 40
+y = 40
+
+[cut_pos]
+x = 20
+y = 20
\ No newline at end of file
diff --git a/icons/turf/floors/ash.dmi b/icons/turf/floors/ash.dmi
index 1ebe8d71397..e6d3ed666fb 100644
Binary files a/icons/turf/floors/ash.dmi and b/icons/turf/floors/ash.dmi differ
diff --git a/icons/turf/floors/ash.png b/icons/turf/floors/ash.png
new file mode 100644
index 00000000000..419dd49d9de
Binary files /dev/null and b/icons/turf/floors/ash.png differ
diff --git a/icons/turf/floors/ash.png.toml b/icons/turf/floors/ash.png.toml
new file mode 100644
index 00000000000..9bbdc460b4d
--- /dev/null
+++ b/icons/turf/floors/ash.png.toml
@@ -0,0 +1,14 @@
+output_name = "ash"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 40
+y = 40
+
+[output_icon_size]
+x = 40
+y = 40
+
+[cut_pos]
+x = 20
+y = 20
\ No newline at end of file
diff --git a/icons/turf/floors/bamboo_mat.dmi b/icons/turf/floors/bamboo_mat.dmi
index 1e0b04bc3aa..c2380c5b874 100644
Binary files a/icons/turf/floors/bamboo_mat.dmi and b/icons/turf/floors/bamboo_mat.dmi differ
diff --git a/icons/turf/floors/bamboo_mat.png b/icons/turf/floors/bamboo_mat.png
new file mode 100644
index 00000000000..f945572a8b7
Binary files /dev/null and b/icons/turf/floors/bamboo_mat.png differ
diff --git a/icons/turf/floors/bamboo_mat.png.toml b/icons/turf/floors/bamboo_mat.png.toml
new file mode 100644
index 00000000000..ce1ce14e259
--- /dev/null
+++ b/icons/turf/floors/bamboo_mat.png.toml
@@ -0,0 +1,2 @@
+output_name = "mat"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet.dmi b/icons/turf/floors/carpet.dmi
index 1af03a1df82..24d8c8b0dfd 100644
Binary files a/icons/turf/floors/carpet.dmi and b/icons/turf/floors/carpet.dmi differ
diff --git a/icons/turf/floors/carpet.png b/icons/turf/floors/carpet.png
new file mode 100644
index 00000000000..b69bf87a4d0
Binary files /dev/null and b/icons/turf/floors/carpet.png differ
diff --git a/icons/turf/floors/carpet.png.toml b/icons/turf/floors/carpet.png.toml
new file mode 100644
index 00000000000..13916473257
--- /dev/null
+++ b/icons/turf/floors/carpet.png.toml
@@ -0,0 +1,2 @@
+output_name = "carpet"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_black.dmi b/icons/turf/floors/carpet_black.dmi
index e2fea9085b2..7df942035ad 100644
Binary files a/icons/turf/floors/carpet_black.dmi and b/icons/turf/floors/carpet_black.dmi differ
diff --git a/icons/turf/floors/carpet_black.png b/icons/turf/floors/carpet_black.png
new file mode 100644
index 00000000000..57f7eaf8dd9
Binary files /dev/null and b/icons/turf/floors/carpet_black.png differ
diff --git a/icons/turf/floors/carpet_black.png.toml b/icons/turf/floors/carpet_black.png.toml
new file mode 100644
index 00000000000..a98d0e0bc60
--- /dev/null
+++ b/icons/turf/floors/carpet_black.png.toml
@@ -0,0 +1,2 @@
+output_name = "carpet_black"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_blue.dmi b/icons/turf/floors/carpet_blue.dmi
index b909b11f359..6eea31902c8 100644
Binary files a/icons/turf/floors/carpet_blue.dmi and b/icons/turf/floors/carpet_blue.dmi differ
diff --git a/icons/turf/floors/carpet_blue.png b/icons/turf/floors/carpet_blue.png
new file mode 100644
index 00000000000..e81e56cf7c2
Binary files /dev/null and b/icons/turf/floors/carpet_blue.png differ
diff --git a/icons/turf/floors/carpet_blue.png.toml b/icons/turf/floors/carpet_blue.png.toml
new file mode 100644
index 00000000000..1e1ebdb2201
--- /dev/null
+++ b/icons/turf/floors/carpet_blue.png.toml
@@ -0,0 +1,2 @@
+output_name = "carpet_blue"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_cyan.dmi b/icons/turf/floors/carpet_cyan.dmi
index 85e053a5a6d..fa38993c5ce 100644
Binary files a/icons/turf/floors/carpet_cyan.dmi and b/icons/turf/floors/carpet_cyan.dmi differ
diff --git a/icons/turf/floors/carpet_cyan.png b/icons/turf/floors/carpet_cyan.png
new file mode 100644
index 00000000000..f1dc7da076a
Binary files /dev/null and b/icons/turf/floors/carpet_cyan.png differ
diff --git a/icons/turf/floors/carpet_cyan.png.toml b/icons/turf/floors/carpet_cyan.png.toml
new file mode 100644
index 00000000000..8c93ad0baf3
--- /dev/null
+++ b/icons/turf/floors/carpet_cyan.png.toml
@@ -0,0 +1,2 @@
+output_name = "carpet_cyan"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_donk.dmi b/icons/turf/floors/carpet_donk.dmi
index 04c4148d2bc..1a8f5947024 100644
Binary files a/icons/turf/floors/carpet_donk.dmi and b/icons/turf/floors/carpet_donk.dmi differ
diff --git a/icons/turf/floors/carpet_donk.png b/icons/turf/floors/carpet_donk.png
new file mode 100644
index 00000000000..eb0243c4926
Binary files /dev/null and b/icons/turf/floors/carpet_donk.png differ
diff --git a/icons/turf/floors/carpet_donk.png.toml b/icons/turf/floors/carpet_donk.png.toml
new file mode 100644
index 00000000000..7e60d4272b8
--- /dev/null
+++ b/icons/turf/floors/carpet_donk.png.toml
@@ -0,0 +1,5 @@
+output_name = "donk_carpet"
+template = "bitmask/diagonal_32x32.toml"
+
+[prefabs]
+255 = 5
diff --git a/icons/turf/floors/carpet_executive.dmi b/icons/turf/floors/carpet_executive.dmi
index 2c17e542fcd..8c0528d8f28 100644
Binary files a/icons/turf/floors/carpet_executive.dmi and b/icons/turf/floors/carpet_executive.dmi differ
diff --git a/icons/turf/floors/carpet_executive.png b/icons/turf/floors/carpet_executive.png
new file mode 100644
index 00000000000..bf8a538b8f8
Binary files /dev/null and b/icons/turf/floors/carpet_executive.png differ
diff --git a/icons/turf/floors/carpet_executive.png.toml b/icons/turf/floors/carpet_executive.png.toml
new file mode 100644
index 00000000000..1322b9bd6d9
--- /dev/null
+++ b/icons/turf/floors/carpet_executive.png.toml
@@ -0,0 +1,6 @@
+output_name = "executive_carpet"
+template = "bitmask/diagonal_32x32.toml"
+
+[prefabs]
+255 = 5
+
diff --git a/icons/turf/floors/carpet_green.dmi b/icons/turf/floors/carpet_green.dmi
index 39ef0480874..49daef00acd 100644
Binary files a/icons/turf/floors/carpet_green.dmi and b/icons/turf/floors/carpet_green.dmi differ
diff --git a/icons/turf/floors/carpet_green.png b/icons/turf/floors/carpet_green.png
new file mode 100644
index 00000000000..ee059d755af
Binary files /dev/null and b/icons/turf/floors/carpet_green.png differ
diff --git a/icons/turf/floors/carpet_green.png.toml b/icons/turf/floors/carpet_green.png.toml
new file mode 100644
index 00000000000..88a2a120f28
--- /dev/null
+++ b/icons/turf/floors/carpet_green.png.toml
@@ -0,0 +1,2 @@
+output_name = "carpet_green"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_neon_base.dmi b/icons/turf/floors/carpet_neon_base.dmi
new file mode 100644
index 00000000000..342da153076
Binary files /dev/null and b/icons/turf/floors/carpet_neon_base.dmi differ
diff --git a/icons/turf/floors/carpet_neon_base.png b/icons/turf/floors/carpet_neon_base.png
new file mode 100644
index 00000000000..08b3ef22e15
Binary files /dev/null and b/icons/turf/floors/carpet_neon_base.png differ
diff --git a/icons/turf/floors/carpet_neon_base.png.toml b/icons/turf/floors/carpet_neon_base.png.toml
new file mode 100644
index 00000000000..723e73af9e9
--- /dev/null
+++ b/icons/turf/floors/carpet_neon_base.png.toml
@@ -0,0 +1,2 @@
+output_name = "base"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_neon_base_nodots.dmi b/icons/turf/floors/carpet_neon_base_nodots.dmi
new file mode 100644
index 00000000000..d5fa68a6a12
Binary files /dev/null and b/icons/turf/floors/carpet_neon_base_nodots.dmi differ
diff --git a/icons/turf/floors/carpet_neon_base_nodots.png b/icons/turf/floors/carpet_neon_base_nodots.png
new file mode 100644
index 00000000000..ae73004e95b
Binary files /dev/null and b/icons/turf/floors/carpet_neon_base_nodots.png differ
diff --git a/icons/turf/floors/carpet_neon_base_nodots.png.toml b/icons/turf/floors/carpet_neon_base_nodots.png.toml
new file mode 100644
index 00000000000..03b019890ed
--- /dev/null
+++ b/icons/turf/floors/carpet_neon_base_nodots.png.toml
@@ -0,0 +1,2 @@
+output_name = "base-nodots"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_neon_glow.dmi b/icons/turf/floors/carpet_neon_glow.dmi
new file mode 100644
index 00000000000..c1ab20145ac
Binary files /dev/null and b/icons/turf/floors/carpet_neon_glow.dmi differ
diff --git a/icons/turf/floors/carpet_neon_glow.png b/icons/turf/floors/carpet_neon_glow.png
new file mode 100644
index 00000000000..1087698ae60
Binary files /dev/null and b/icons/turf/floors/carpet_neon_glow.png differ
diff --git a/icons/turf/floors/carpet_neon_glow.png.toml b/icons/turf/floors/carpet_neon_glow.png.toml
new file mode 100644
index 00000000000..2af0ddb34bf
--- /dev/null
+++ b/icons/turf/floors/carpet_neon_glow.png.toml
@@ -0,0 +1,2 @@
+output_name = "glow"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_neon_glow_nodots.dmi b/icons/turf/floors/carpet_neon_glow_nodots.dmi
new file mode 100644
index 00000000000..72175d8b353
Binary files /dev/null and b/icons/turf/floors/carpet_neon_glow_nodots.dmi differ
diff --git a/icons/turf/floors/carpet_neon_glow_nodots.png b/icons/turf/floors/carpet_neon_glow_nodots.png
new file mode 100644
index 00000000000..19b9d311b13
Binary files /dev/null and b/icons/turf/floors/carpet_neon_glow_nodots.png differ
diff --git a/icons/turf/floors/carpet_neon_glow_nodots.png.toml b/icons/turf/floors/carpet_neon_glow_nodots.png.toml
new file mode 100644
index 00000000000..8d6e69b01c0
--- /dev/null
+++ b/icons/turf/floors/carpet_neon_glow_nodots.png.toml
@@ -0,0 +1,2 @@
+output_name = "glow-nodots"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_neon_light.dmi b/icons/turf/floors/carpet_neon_light.dmi
new file mode 100644
index 00000000000..38fe6ff2db5
Binary files /dev/null and b/icons/turf/floors/carpet_neon_light.dmi differ
diff --git a/icons/turf/floors/carpet_neon_light.png b/icons/turf/floors/carpet_neon_light.png
new file mode 100644
index 00000000000..9443c694290
Binary files /dev/null and b/icons/turf/floors/carpet_neon_light.png differ
diff --git a/icons/turf/floors/carpet_neon_light.png.toml b/icons/turf/floors/carpet_neon_light.png.toml
new file mode 100644
index 00000000000..6ea86ad1e65
--- /dev/null
+++ b/icons/turf/floors/carpet_neon_light.png.toml
@@ -0,0 +1,2 @@
+output_name = "light"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_neon_light_nodots.dmi b/icons/turf/floors/carpet_neon_light_nodots.dmi
new file mode 100644
index 00000000000..0cf86fecb67
Binary files /dev/null and b/icons/turf/floors/carpet_neon_light_nodots.dmi differ
diff --git a/icons/turf/floors/carpet_neon_light_nodots.png b/icons/turf/floors/carpet_neon_light_nodots.png
new file mode 100644
index 00000000000..fc82b593c07
Binary files /dev/null and b/icons/turf/floors/carpet_neon_light_nodots.png differ
diff --git a/icons/turf/floors/carpet_neon_light_nodots.png.toml b/icons/turf/floors/carpet_neon_light_nodots.png.toml
new file mode 100644
index 00000000000..20e0713c39f
--- /dev/null
+++ b/icons/turf/floors/carpet_neon_light_nodots.png.toml
@@ -0,0 +1,2 @@
+output_name = "light-nodots"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_neon_simple.dmi b/icons/turf/floors/carpet_neon_simple.dmi
deleted file mode 100644
index 62cb355a2db..00000000000
Binary files a/icons/turf/floors/carpet_neon_simple.dmi and /dev/null differ
diff --git a/icons/turf/floors/carpet_orange.dmi b/icons/turf/floors/carpet_orange.dmi
index 4f0b2078fca..0ee9b56e8b0 100644
Binary files a/icons/turf/floors/carpet_orange.dmi and b/icons/turf/floors/carpet_orange.dmi differ
diff --git a/icons/turf/floors/carpet_orange.png b/icons/turf/floors/carpet_orange.png
new file mode 100644
index 00000000000..c58cddcf0bc
Binary files /dev/null and b/icons/turf/floors/carpet_orange.png differ
diff --git a/icons/turf/floors/carpet_orange.png.toml b/icons/turf/floors/carpet_orange.png.toml
new file mode 100644
index 00000000000..4315d81da1d
--- /dev/null
+++ b/icons/turf/floors/carpet_orange.png.toml
@@ -0,0 +1,2 @@
+output_name = "carpet_orange"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_purple.dmi b/icons/turf/floors/carpet_purple.dmi
index f07ce75d334..a00c1621d38 100644
Binary files a/icons/turf/floors/carpet_purple.dmi and b/icons/turf/floors/carpet_purple.dmi differ
diff --git a/icons/turf/floors/carpet_purple.png b/icons/turf/floors/carpet_purple.png
new file mode 100644
index 00000000000..530534c5bca
Binary files /dev/null and b/icons/turf/floors/carpet_purple.png differ
diff --git a/icons/turf/floors/carpet_purple.png.toml b/icons/turf/floors/carpet_purple.png.toml
new file mode 100644
index 00000000000..708027cee78
--- /dev/null
+++ b/icons/turf/floors/carpet_purple.png.toml
@@ -0,0 +1,2 @@
+output_name = "carpet_purple"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_red.dmi b/icons/turf/floors/carpet_red.dmi
index eb0527f430d..dcba136f811 100644
Binary files a/icons/turf/floors/carpet_red.dmi and b/icons/turf/floors/carpet_red.dmi differ
diff --git a/icons/turf/floors/carpet_red.png b/icons/turf/floors/carpet_red.png
new file mode 100644
index 00000000000..3f7f190a126
Binary files /dev/null and b/icons/turf/floors/carpet_red.png differ
diff --git a/icons/turf/floors/carpet_red.png.toml b/icons/turf/floors/carpet_red.png.toml
new file mode 100644
index 00000000000..4bbd11bfb34
--- /dev/null
+++ b/icons/turf/floors/carpet_red.png.toml
@@ -0,0 +1,2 @@
+output_name = "carpet_red"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_royalblack.dmi b/icons/turf/floors/carpet_royalblack.dmi
index 0b848ac1afa..296b7b683fd 100644
Binary files a/icons/turf/floors/carpet_royalblack.dmi and b/icons/turf/floors/carpet_royalblack.dmi differ
diff --git a/icons/turf/floors/carpet_royalblack.png b/icons/turf/floors/carpet_royalblack.png
new file mode 100644
index 00000000000..b125c6111cd
Binary files /dev/null and b/icons/turf/floors/carpet_royalblack.png differ
diff --git a/icons/turf/floors/carpet_royalblack.png.toml b/icons/turf/floors/carpet_royalblack.png.toml
new file mode 100644
index 00000000000..eef2685abeb
--- /dev/null
+++ b/icons/turf/floors/carpet_royalblack.png.toml
@@ -0,0 +1,2 @@
+output_name = "carpet_royalblack"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_royalblue.dmi b/icons/turf/floors/carpet_royalblue.dmi
index 1027b0e19f5..9657d9c6704 100644
Binary files a/icons/turf/floors/carpet_royalblue.dmi and b/icons/turf/floors/carpet_royalblue.dmi differ
diff --git a/icons/turf/floors/carpet_royalblue.png b/icons/turf/floors/carpet_royalblue.png
new file mode 100644
index 00000000000..babf33777b7
Binary files /dev/null and b/icons/turf/floors/carpet_royalblue.png differ
diff --git a/icons/turf/floors/carpet_royalblue.png.toml b/icons/turf/floors/carpet_royalblue.png.toml
new file mode 100644
index 00000000000..9a11f2507b2
--- /dev/null
+++ b/icons/turf/floors/carpet_royalblue.png.toml
@@ -0,0 +1,2 @@
+output_name = "carpet_royalblue"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/carpet_stellar.dmi b/icons/turf/floors/carpet_stellar.dmi
index 6ba81678426..2e0eec615d8 100644
Binary files a/icons/turf/floors/carpet_stellar.dmi and b/icons/turf/floors/carpet_stellar.dmi differ
diff --git a/icons/turf/floors/carpet_stellar.png b/icons/turf/floors/carpet_stellar.png
new file mode 100644
index 00000000000..ab233965a6d
Binary files /dev/null and b/icons/turf/floors/carpet_stellar.png differ
diff --git a/icons/turf/floors/carpet_stellar.png.toml b/icons/turf/floors/carpet_stellar.png.toml
new file mode 100644
index 00000000000..817768bad5f
--- /dev/null
+++ b/icons/turf/floors/carpet_stellar.png.toml
@@ -0,0 +1,2 @@
+output_name = "stellar_carpet"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/chasms.dmi b/icons/turf/floors/chasms.dmi
index 2e93b539112..d37fa7d50c6 100644
Binary files a/icons/turf/floors/chasms.dmi and b/icons/turf/floors/chasms.dmi differ
diff --git a/icons/turf/floors/chasms.png b/icons/turf/floors/chasms.png
new file mode 100644
index 00000000000..2a856eb8aa4
Binary files /dev/null and b/icons/turf/floors/chasms.png differ
diff --git a/icons/turf/floors/chasms.png.toml b/icons/turf/floors/chasms.png.toml
new file mode 100644
index 00000000000..51e70389edd
--- /dev/null
+++ b/icons/turf/floors/chasms.png.toml
@@ -0,0 +1,2 @@
+output_name = "chasms"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/floor_variations.dmi b/icons/turf/floors/floor_variations.dmi
new file mode 100644
index 00000000000..81cff6d76e8
Binary files /dev/null and b/icons/turf/floors/floor_variations.dmi differ
diff --git a/icons/turf/floors/glass.dmi b/icons/turf/floors/glass.dmi
index ef9da477681..ae840919f6e 100644
Binary files a/icons/turf/floors/glass.dmi and b/icons/turf/floors/glass.dmi differ
diff --git a/icons/turf/floors/glass.png b/icons/turf/floors/glass.png
new file mode 100644
index 00000000000..b73fff06574
Binary files /dev/null and b/icons/turf/floors/glass.png differ
diff --git a/icons/turf/floors/glass.png.toml b/icons/turf/floors/glass.png.toml
new file mode 100644
index 00000000000..2e90c6298ca
--- /dev/null
+++ b/icons/turf/floors/glass.png.toml
@@ -0,0 +1,2 @@
+output_name = "glass"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/grass.dmi b/icons/turf/floors/grass.dmi
index 2ffb5242562..0b28bc9ccee 100644
Binary files a/icons/turf/floors/grass.dmi and b/icons/turf/floors/grass.dmi differ
diff --git a/icons/turf/floors/grass.png b/icons/turf/floors/grass.png
new file mode 100644
index 00000000000..82790712e30
Binary files /dev/null and b/icons/turf/floors/grass.png differ
diff --git a/icons/turf/floors/grass.png.toml b/icons/turf/floors/grass.png.toml
new file mode 100644
index 00000000000..e06f8518c7c
--- /dev/null
+++ b/icons/turf/floors/grass.png.toml
@@ -0,0 +1,14 @@
+output_name = "grass"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 50
+y = 50
+
+[output_icon_size]
+x = 50
+y = 50
+
+[cut_pos]
+x = 25
+y = 25
\ No newline at end of file
diff --git a/icons/turf/floors/ice_turf.dmi b/icons/turf/floors/ice_turf.dmi
index 61574645759..ccb528c872d 100644
Binary files a/icons/turf/floors/ice_turf.dmi and b/icons/turf/floors/ice_turf.dmi differ
diff --git a/icons/turf/floors/ice_turf.png b/icons/turf/floors/ice_turf.png
new file mode 100644
index 00000000000..26887f27853
Binary files /dev/null and b/icons/turf/floors/ice_turf.png differ
diff --git a/icons/turf/floors/ice_turf.png.toml b/icons/turf/floors/ice_turf.png.toml
new file mode 100644
index 00000000000..3aa5cdf4a36
--- /dev/null
+++ b/icons/turf/floors/ice_turf.png.toml
@@ -0,0 +1,2 @@
+output_name = "ice_turf"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/icechasms.dmi b/icons/turf/floors/icechasms.dmi
index 5585d792ef8..e01521e3441 100644
Binary files a/icons/turf/floors/icechasms.dmi and b/icons/turf/floors/icechasms.dmi differ
diff --git a/icons/turf/floors/icechasms.png b/icons/turf/floors/icechasms.png
new file mode 100644
index 00000000000..c47756629b5
Binary files /dev/null and b/icons/turf/floors/icechasms.png differ
diff --git a/icons/turf/floors/icechasms.png.toml b/icons/turf/floors/icechasms.png.toml
new file mode 100644
index 00000000000..6dde47bfeb2
--- /dev/null
+++ b/icons/turf/floors/icechasms.png.toml
@@ -0,0 +1,2 @@
+output_name = "icechasms"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/junglechasm.dmi b/icons/turf/floors/junglechasm.dmi
index d2ac198865c..c50775c91b1 100644
Binary files a/icons/turf/floors/junglechasm.dmi and b/icons/turf/floors/junglechasm.dmi differ
diff --git a/icons/turf/floors/junglechasm.png b/icons/turf/floors/junglechasm.png
new file mode 100644
index 00000000000..dc26f65e16c
Binary files /dev/null and b/icons/turf/floors/junglechasm.png differ
diff --git a/icons/turf/floors/junglechasm.png.toml b/icons/turf/floors/junglechasm.png.toml
new file mode 100644
index 00000000000..e210a9128bd
--- /dev/null
+++ b/icons/turf/floors/junglechasm.png.toml
@@ -0,0 +1,2 @@
+output_name = "junglechasm"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/junglegrass.dmi b/icons/turf/floors/junglegrass.dmi
index 80456e469b1..ef192232c3b 100644
Binary files a/icons/turf/floors/junglegrass.dmi and b/icons/turf/floors/junglegrass.dmi differ
diff --git a/icons/turf/floors/junglegrass.png b/icons/turf/floors/junglegrass.png
new file mode 100644
index 00000000000..c1d13d4f4f2
Binary files /dev/null and b/icons/turf/floors/junglegrass.png differ
diff --git a/icons/turf/floors/junglegrass.png.toml b/icons/turf/floors/junglegrass.png.toml
new file mode 100644
index 00000000000..0096e9bad74
--- /dev/null
+++ b/icons/turf/floors/junglegrass.png.toml
@@ -0,0 +1,14 @@
+output_name = "junglegrass"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 50
+y = 50
+
+[output_icon_size]
+x = 50
+y = 50
+
+[cut_pos]
+x = 25
+y = 25
\ No newline at end of file
diff --git a/icons/turf/floors/lava.dmi b/icons/turf/floors/lava.dmi
index 3b889c9a5f6..a2a06f34200 100644
Binary files a/icons/turf/floors/lava.dmi and b/icons/turf/floors/lava.dmi differ
diff --git a/icons/turf/floors/lava.png b/icons/turf/floors/lava.png
new file mode 100644
index 00000000000..ef826dee188
Binary files /dev/null and b/icons/turf/floors/lava.png differ
diff --git a/icons/turf/floors/lava.png.toml b/icons/turf/floors/lava.png.toml
new file mode 100644
index 00000000000..c4e36e85ab1
--- /dev/null
+++ b/icons/turf/floors/lava.png.toml
@@ -0,0 +1,5 @@
+output_name = "lava"
+template = "bitmask/diagonal_32x32.toml"
+
+[animation]
+delays = [20, 20, 20, 20]
diff --git a/icons/turf/floors/lava_mask.dmi b/icons/turf/floors/lava_mask.dmi
index aaefebe39de..3e77c406b26 100644
Binary files a/icons/turf/floors/lava_mask.dmi and b/icons/turf/floors/lava_mask.dmi differ
diff --git a/icons/turf/floors/lava_mask.png b/icons/turf/floors/lava_mask.png
new file mode 100644
index 00000000000..dfcd0dba4cb
Binary files /dev/null and b/icons/turf/floors/lava_mask.png differ
diff --git a/icons/turf/floors/lava_mask.png.toml b/icons/turf/floors/lava_mask.png.toml
new file mode 100644
index 00000000000..08d0173d5cd
--- /dev/null
+++ b/icons/turf/floors/lava_mask.png.toml
@@ -0,0 +1,2 @@
+output_name = "lava"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/plasma_glass.dmi b/icons/turf/floors/plasma_glass.dmi
index 83aa755b7bc..a0e2dd20b79 100644
Binary files a/icons/turf/floors/plasma_glass.dmi and b/icons/turf/floors/plasma_glass.dmi differ
diff --git a/icons/turf/floors/plasma_glass.png b/icons/turf/floors/plasma_glass.png
new file mode 100644
index 00000000000..06e8a79b567
Binary files /dev/null and b/icons/turf/floors/plasma_glass.png differ
diff --git a/icons/turf/floors/plasma_glass.png.toml b/icons/turf/floors/plasma_glass.png.toml
new file mode 100644
index 00000000000..0fb4b5fa276
--- /dev/null
+++ b/icons/turf/floors/plasma_glass.png.toml
@@ -0,0 +1,2 @@
+output_name = "plasma_glass"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/reinf_glass.dmi b/icons/turf/floors/reinf_glass.dmi
index a7607cada6a..0713375caa6 100644
Binary files a/icons/turf/floors/reinf_glass.dmi and b/icons/turf/floors/reinf_glass.dmi differ
diff --git a/icons/turf/floors/reinf_glass.png b/icons/turf/floors/reinf_glass.png
new file mode 100644
index 00000000000..9659f3e35c1
Binary files /dev/null and b/icons/turf/floors/reinf_glass.png differ
diff --git a/icons/turf/floors/reinf_glass.png.toml b/icons/turf/floors/reinf_glass.png.toml
new file mode 100644
index 00000000000..043b1d35435
--- /dev/null
+++ b/icons/turf/floors/reinf_glass.png.toml
@@ -0,0 +1,2 @@
+output_name = "reinf_glass"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/reinf_plasma_glass.dmi b/icons/turf/floors/reinf_plasma_glass.dmi
index 1bf4dd41734..31c1c339c37 100644
Binary files a/icons/turf/floors/reinf_plasma_glass.dmi and b/icons/turf/floors/reinf_plasma_glass.dmi differ
diff --git a/icons/turf/floors/reinf_plasma_glass.png b/icons/turf/floors/reinf_plasma_glass.png
new file mode 100644
index 00000000000..6c47f299723
Binary files /dev/null and b/icons/turf/floors/reinf_plasma_glass.png differ
diff --git a/icons/turf/floors/reinf_plasma_glass.png.toml b/icons/turf/floors/reinf_plasma_glass.png.toml
new file mode 100644
index 00000000000..1b3fbb05ef9
--- /dev/null
+++ b/icons/turf/floors/reinf_plasma_glass.png.toml
@@ -0,0 +1,2 @@
+output_name = "reinf_plasma_glass"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/floors/rocky_ash.dmi b/icons/turf/floors/rocky_ash.dmi
index cc6847dc588..758793cba42 100644
Binary files a/icons/turf/floors/rocky_ash.dmi and b/icons/turf/floors/rocky_ash.dmi differ
diff --git a/icons/turf/floors/rocky_ash.png b/icons/turf/floors/rocky_ash.png
new file mode 100644
index 00000000000..bdc8ee3615c
Binary files /dev/null and b/icons/turf/floors/rocky_ash.png differ
diff --git a/icons/turf/floors/rocky_ash.png.toml b/icons/turf/floors/rocky_ash.png.toml
new file mode 100644
index 00000000000..6e3f50e0542
--- /dev/null
+++ b/icons/turf/floors/rocky_ash.png.toml
@@ -0,0 +1,14 @@
+output_name = "rocky_ash"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 40
+y = 40
+
+[output_icon_size]
+x = 40
+y = 40
+
+[cut_pos]
+x = 20
+y = 20
\ No newline at end of file
diff --git a/icons/turf/floors/snow_turf.dmi b/icons/turf/floors/snow_turf.dmi
index 8b70aa44896..a150dfdc2db 100644
Binary files a/icons/turf/floors/snow_turf.dmi and b/icons/turf/floors/snow_turf.dmi differ
diff --git a/icons/turf/floors/snow_turf.png b/icons/turf/floors/snow_turf.png
new file mode 100644
index 00000000000..474a0f486e7
Binary files /dev/null and b/icons/turf/floors/snow_turf.png differ
diff --git a/icons/turf/floors/snow_turf.png.toml b/icons/turf/floors/snow_turf.png.toml
new file mode 100644
index 00000000000..cc50c9afda6
--- /dev/null
+++ b/icons/turf/floors/snow_turf.png.toml
@@ -0,0 +1,2 @@
+output_name = "snow_turf"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/smoothrocks.dmi b/icons/turf/smoothrocks.dmi
index 9a60937a219..e138e2af783 100644
Binary files a/icons/turf/smoothrocks.dmi and b/icons/turf/smoothrocks.dmi differ
diff --git a/icons/turf/smoothrocks.png b/icons/turf/smoothrocks.png
new file mode 100644
index 00000000000..dea84d594f6
Binary files /dev/null and b/icons/turf/smoothrocks.png differ
diff --git a/icons/turf/smoothrocks.png.toml b/icons/turf/smoothrocks.png.toml
new file mode 100644
index 00000000000..4466fbbf3c9
--- /dev/null
+++ b/icons/turf/smoothrocks.png.toml
@@ -0,0 +1,14 @@
+output_name = "smoothrocks"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 40
+y = 40
+
+[output_icon_size]
+x = 40
+y = 40
+
+[cut_pos]
+x = 20
+y = 20
\ No newline at end of file
diff --git a/icons/turf/smoothrocks_overlays.dmi b/icons/turf/smoothrocks_overlays.dmi
new file mode 100644
index 00000000000..e49a48ca09e
Binary files /dev/null and b/icons/turf/smoothrocks_overlays.dmi differ
diff --git a/icons/turf/walls/abductor_wall.dmi b/icons/turf/walls/abductor_wall.dmi
index d1d7d66cf0f..4f731d99f4c 100644
Binary files a/icons/turf/walls/abductor_wall.dmi and b/icons/turf/walls/abductor_wall.dmi differ
diff --git a/icons/turf/walls/bamboo_wall.dmi b/icons/turf/walls/bamboo_wall.dmi
index 4eafc79ad48..44c5824397e 100644
Binary files a/icons/turf/walls/bamboo_wall.dmi and b/icons/turf/walls/bamboo_wall.dmi differ
diff --git a/icons/turf/walls/bamboo_wall.png b/icons/turf/walls/bamboo_wall.png
new file mode 100644
index 00000000000..6869cb409b2
Binary files /dev/null and b/icons/turf/walls/bamboo_wall.png differ
diff --git a/icons/turf/walls/bamboo_wall.png.toml b/icons/turf/walls/bamboo_wall.png.toml
new file mode 100644
index 00000000000..69d9d905038
--- /dev/null
+++ b/icons/turf/walls/bamboo_wall.png.toml
@@ -0,0 +1,5 @@
+output_name = "bamboo_wall"
+template = "bitmask/diagonal_32x32.toml"
+
+[prefabs]
+0 = 5
diff --git a/icons/turf/walls/bananium_wall.dmi b/icons/turf/walls/bananium_wall.dmi
index abf70635337..7c563fca0d0 100644
Binary files a/icons/turf/walls/bananium_wall.dmi and b/icons/turf/walls/bananium_wall.dmi differ
diff --git a/icons/turf/walls/bananium_wall.png b/icons/turf/walls/bananium_wall.png
new file mode 100644
index 00000000000..52d4b2a5888
Binary files /dev/null and b/icons/turf/walls/bananium_wall.png differ
diff --git a/icons/turf/walls/bananium_wall.png.toml b/icons/turf/walls/bananium_wall.png.toml
new file mode 100644
index 00000000000..3225586db5c
--- /dev/null
+++ b/icons/turf/walls/bananium_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "bananium_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/boss_wall.dmi b/icons/turf/walls/boss_wall.dmi
index eb0992e86e0..6bc124b0778 100644
Binary files a/icons/turf/walls/boss_wall.dmi and b/icons/turf/walls/boss_wall.dmi differ
diff --git a/icons/turf/walls/boss_wall.png b/icons/turf/walls/boss_wall.png
new file mode 100644
index 00000000000..45d334f2576
Binary files /dev/null and b/icons/turf/walls/boss_wall.png differ
diff --git a/icons/turf/walls/boss_wall.png.toml b/icons/turf/walls/boss_wall.png.toml
new file mode 100644
index 00000000000..4d6797e1dda
--- /dev/null
+++ b/icons/turf/walls/boss_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "boss_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/clockwork_wall.dmi b/icons/turf/walls/clockwork_wall.dmi
index d6f1872d7c0..8785209409b 100644
Binary files a/icons/turf/walls/clockwork_wall.dmi and b/icons/turf/walls/clockwork_wall.dmi differ
diff --git a/icons/turf/walls/clockwork_wall.png b/icons/turf/walls/clockwork_wall.png
new file mode 100644
index 00000000000..7dcc7d6ea6a
Binary files /dev/null and b/icons/turf/walls/clockwork_wall.png differ
diff --git a/icons/turf/walls/clockwork_wall.png.toml b/icons/turf/walls/clockwork_wall.png.toml
new file mode 100644
index 00000000000..bfec1cdfd58
--- /dev/null
+++ b/icons/turf/walls/clockwork_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "clockwork_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/cult_wall.dmi b/icons/turf/walls/cult_wall.dmi
index d1ea0a85413..51e98161d6a 100644
Binary files a/icons/turf/walls/cult_wall.dmi and b/icons/turf/walls/cult_wall.dmi differ
diff --git a/icons/turf/walls/cult_wall.png b/icons/turf/walls/cult_wall.png
new file mode 100644
index 00000000000..c2005bdd60c
Binary files /dev/null and b/icons/turf/walls/cult_wall.png differ
diff --git a/icons/turf/walls/cult_wall.png.toml b/icons/turf/walls/cult_wall.png.toml
new file mode 100644
index 00000000000..8739156f9ac
--- /dev/null
+++ b/icons/turf/walls/cult_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "cult_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/diamond_wall.dmi b/icons/turf/walls/diamond_wall.dmi
index 1dd44ba283f..99149f0d43d 100644
Binary files a/icons/turf/walls/diamond_wall.dmi and b/icons/turf/walls/diamond_wall.dmi differ
diff --git a/icons/turf/walls/diamond_wall.png b/icons/turf/walls/diamond_wall.png
new file mode 100644
index 00000000000..75263ac97a9
Binary files /dev/null and b/icons/turf/walls/diamond_wall.png differ
diff --git a/icons/turf/walls/diamond_wall.png.toml b/icons/turf/walls/diamond_wall.png.toml
new file mode 100644
index 00000000000..e9565ac712b
--- /dev/null
+++ b/icons/turf/walls/diamond_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "diamond_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/false_walls.dmi b/icons/turf/walls/false_walls.dmi
new file mode 100644
index 00000000000..1b02b4bdbe6
Binary files /dev/null and b/icons/turf/walls/false_walls.dmi differ
diff --git a/icons/turf/walls/gold_wall.dmi b/icons/turf/walls/gold_wall.dmi
index 7012124c271..283dd437646 100644
Binary files a/icons/turf/walls/gold_wall.dmi and b/icons/turf/walls/gold_wall.dmi differ
diff --git a/icons/turf/walls/gold_wall.png b/icons/turf/walls/gold_wall.png
new file mode 100644
index 00000000000..13774d5d969
Binary files /dev/null and b/icons/turf/walls/gold_wall.png differ
diff --git a/icons/turf/walls/gold_wall.png.toml b/icons/turf/walls/gold_wall.png.toml
new file mode 100644
index 00000000000..c351a8eb43d
--- /dev/null
+++ b/icons/turf/walls/gold_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "gold_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/hierophant_wall_temp.dmi b/icons/turf/walls/hierophant_wall_temp.dmi
index 235f8347cee..3af6681157d 100644
Binary files a/icons/turf/walls/hierophant_wall_temp.dmi and b/icons/turf/walls/hierophant_wall_temp.dmi differ
diff --git a/icons/turf/walls/hierophant_wall_temp.png b/icons/turf/walls/hierophant_wall_temp.png
new file mode 100644
index 00000000000..ec8451a0d0a
Binary files /dev/null and b/icons/turf/walls/hierophant_wall_temp.png differ
diff --git a/icons/turf/walls/hierophant_wall_temp.png.toml b/icons/turf/walls/hierophant_wall_temp.png.toml
new file mode 100644
index 00000000000..02d429d8821
--- /dev/null
+++ b/icons/turf/walls/hierophant_wall_temp.png.toml
@@ -0,0 +1,2 @@
+output_name = "hierophant_wall_temp"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/icedmetal_wall.dmi b/icons/turf/walls/icedmetal_wall.dmi
index b069da4394d..8d63b19a8bf 100644
Binary files a/icons/turf/walls/icedmetal_wall.dmi and b/icons/turf/walls/icedmetal_wall.dmi differ
diff --git a/icons/turf/walls/icedmetal_wall.png b/icons/turf/walls/icedmetal_wall.png
new file mode 100644
index 00000000000..a8973a16b23
Binary files /dev/null and b/icons/turf/walls/icedmetal_wall.png differ
diff --git a/icons/turf/walls/icedmetal_wall.png.toml b/icons/turf/walls/icedmetal_wall.png.toml
new file mode 100644
index 00000000000..6aa236a0da3
--- /dev/null
+++ b/icons/turf/walls/icedmetal_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "icedmetal_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/icerock_wall.dmi b/icons/turf/walls/icerock_wall.dmi
index 0cc2b55bffa..652a2df113b 100644
Binary files a/icons/turf/walls/icerock_wall.dmi and b/icons/turf/walls/icerock_wall.dmi differ
diff --git a/icons/turf/walls/icerock_wall.png b/icons/turf/walls/icerock_wall.png
new file mode 100644
index 00000000000..08b0547a937
Binary files /dev/null and b/icons/turf/walls/icerock_wall.png differ
diff --git a/icons/turf/walls/icerock_wall.png.toml b/icons/turf/walls/icerock_wall.png.toml
new file mode 100644
index 00000000000..7d713818b56
--- /dev/null
+++ b/icons/turf/walls/icerock_wall.png.toml
@@ -0,0 +1,14 @@
+output_name = "icerock_wall"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 40
+y = 40
+
+[output_icon_size]
+x = 40
+y = 40
+
+[cut_pos]
+x = 20
+y = 20
\ No newline at end of file
diff --git a/icons/turf/walls/iron_wall.dmi b/icons/turf/walls/iron_wall.dmi
index 351109bdd3f..d2d723adb28 100644
Binary files a/icons/turf/walls/iron_wall.dmi and b/icons/turf/walls/iron_wall.dmi differ
diff --git a/icons/turf/walls/iron_wall.png b/icons/turf/walls/iron_wall.png
new file mode 100644
index 00000000000..ff71f25a0cb
Binary files /dev/null and b/icons/turf/walls/iron_wall.png differ
diff --git a/icons/turf/walls/iron_wall.png.toml b/icons/turf/walls/iron_wall.png.toml
new file mode 100644
index 00000000000..13708a21e29
--- /dev/null
+++ b/icons/turf/walls/iron_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "iron_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/material_wall.dmi b/icons/turf/walls/material_wall.dmi
new file mode 100644
index 00000000000..2bd844c0b13
Binary files /dev/null and b/icons/turf/walls/material_wall.dmi differ
diff --git a/icons/turf/walls/material_wall.png b/icons/turf/walls/material_wall.png
new file mode 100644
index 00000000000..1f636cb6db0
Binary files /dev/null and b/icons/turf/walls/material_wall.png differ
diff --git a/icons/turf/walls/material_wall.png.toml b/icons/turf/walls/material_wall.png.toml
new file mode 100644
index 00000000000..899ac0aec8b
--- /dev/null
+++ b/icons/turf/walls/material_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "material_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/materialwall.dmi b/icons/turf/walls/materialwall.dmi
deleted file mode 100644
index c81fd64c21b..00000000000
Binary files a/icons/turf/walls/materialwall.dmi and /dev/null differ
diff --git a/icons/turf/walls/meat.dmi b/icons/turf/walls/meat.dmi
deleted file mode 100644
index fbbeb8a9c3c..00000000000
Binary files a/icons/turf/walls/meat.dmi and /dev/null differ
diff --git a/icons/turf/walls/meat_wall.dmi b/icons/turf/walls/meat_wall.dmi
new file mode 100644
index 00000000000..b587dc8e1be
Binary files /dev/null and b/icons/turf/walls/meat_wall.dmi differ
diff --git a/icons/turf/walls/meat_wall.png b/icons/turf/walls/meat_wall.png
new file mode 100644
index 00000000000..8dfafa4b33e
Binary files /dev/null and b/icons/turf/walls/meat_wall.png differ
diff --git a/icons/turf/walls/meat_wall.png.toml b/icons/turf/walls/meat_wall.png.toml
new file mode 100644
index 00000000000..0d3c9a41a9f
--- /dev/null
+++ b/icons/turf/walls/meat_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "meat_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/mountain_wall.dmi b/icons/turf/walls/mountain_wall.dmi
index 574b35b7f1b..31ca67dc40b 100644
Binary files a/icons/turf/walls/mountain_wall.dmi and b/icons/turf/walls/mountain_wall.dmi differ
diff --git a/icons/turf/walls/mountain_wall.png b/icons/turf/walls/mountain_wall.png
new file mode 100644
index 00000000000..47565a687ea
Binary files /dev/null and b/icons/turf/walls/mountain_wall.png differ
diff --git a/icons/turf/walls/mountain_wall.png.toml b/icons/turf/walls/mountain_wall.png.toml
new file mode 100644
index 00000000000..f5f413ba121
--- /dev/null
+++ b/icons/turf/walls/mountain_wall.png.toml
@@ -0,0 +1,14 @@
+output_name = "mountain_wall"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 40
+y = 40
+
+[output_icon_size]
+x = 40
+y = 40
+
+[cut_pos]
+x = 20
+y = 20
\ No newline at end of file
diff --git a/icons/turf/walls/plasma_wall.dmi b/icons/turf/walls/plasma_wall.dmi
index c2f10843c6d..f7219ed1edc 100644
Binary files a/icons/turf/walls/plasma_wall.dmi and b/icons/turf/walls/plasma_wall.dmi differ
diff --git a/icons/turf/walls/plasma_wall.png b/icons/turf/walls/plasma_wall.png
new file mode 100644
index 00000000000..cdaeec65154
Binary files /dev/null and b/icons/turf/walls/plasma_wall.png differ
diff --git a/icons/turf/walls/plasma_wall.png.toml b/icons/turf/walls/plasma_wall.png.toml
new file mode 100644
index 00000000000..44251765575
--- /dev/null
+++ b/icons/turf/walls/plasma_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "plasma_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/plastinum_wall.dmi b/icons/turf/walls/plastinum_wall.dmi
index a53bd0fa062..30ea5dbf945 100644
Binary files a/icons/turf/walls/plastinum_wall.dmi and b/icons/turf/walls/plastinum_wall.dmi differ
diff --git a/icons/turf/walls/plastitanium_wall.dmi b/icons/turf/walls/plastitanium_wall.dmi
index b1af818a012..078d4642785 100644
Binary files a/icons/turf/walls/plastitanium_wall.dmi and b/icons/turf/walls/plastitanium_wall.dmi differ
diff --git a/icons/turf/walls/red_wall.dmi b/icons/turf/walls/red_wall.dmi
index 5eb26cf6a30..8dc959f36cb 100644
Binary files a/icons/turf/walls/red_wall.dmi and b/icons/turf/walls/red_wall.dmi differ
diff --git a/icons/turf/walls/red_wall.png b/icons/turf/walls/red_wall.png
new file mode 100644
index 00000000000..312386a5377
Binary files /dev/null and b/icons/turf/walls/red_wall.png differ
diff --git a/icons/turf/walls/red_wall.png.toml b/icons/turf/walls/red_wall.png.toml
new file mode 100644
index 00000000000..917dc8ee377
--- /dev/null
+++ b/icons/turf/walls/red_wall.png.toml
@@ -0,0 +1,14 @@
+output_name = "red_wall"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 40
+y = 40
+
+[output_icon_size]
+x = 40
+y = 40
+
+[cut_pos]
+x = 20
+y = 20
\ No newline at end of file
diff --git a/icons/turf/walls/reinforced_rock.dmi b/icons/turf/walls/reinforced_rock.dmi
index f2621f5a863..e00e5148204 100644
Binary files a/icons/turf/walls/reinforced_rock.dmi and b/icons/turf/walls/reinforced_rock.dmi differ
diff --git a/icons/turf/walls/reinforced_rock.png b/icons/turf/walls/reinforced_rock.png
new file mode 100644
index 00000000000..544a877ec1a
Binary files /dev/null and b/icons/turf/walls/reinforced_rock.png differ
diff --git a/icons/turf/walls/reinforced_rock.png.toml b/icons/turf/walls/reinforced_rock.png.toml
new file mode 100644
index 00000000000..7fcdd7f45b9
--- /dev/null
+++ b/icons/turf/walls/reinforced_rock.png.toml
@@ -0,0 +1,2 @@
+output_name = "porous_rock"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/reinforced_states.dmi b/icons/turf/walls/reinforced_states.dmi
new file mode 100644
index 00000000000..89c0114a8d6
Binary files /dev/null and b/icons/turf/walls/reinforced_states.dmi differ
diff --git a/icons/turf/walls/reinforced_wall.dmi b/icons/turf/walls/reinforced_wall.dmi
index 35d64734e14..65267a93b2d 100644
Binary files a/icons/turf/walls/reinforced_wall.dmi and b/icons/turf/walls/reinforced_wall.dmi differ
diff --git a/icons/turf/walls/reinforced_wall.png b/icons/turf/walls/reinforced_wall.png
new file mode 100644
index 00000000000..f8d07602c57
Binary files /dev/null and b/icons/turf/walls/reinforced_wall.png differ
diff --git a/icons/turf/walls/reinforced_wall.png.toml b/icons/turf/walls/reinforced_wall.png.toml
new file mode 100644
index 00000000000..cd86b1f36f6
--- /dev/null
+++ b/icons/turf/walls/reinforced_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "reinforced_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/riveted.dmi b/icons/turf/walls/riveted.dmi
index e3746885e48..08fa241e519 100644
Binary files a/icons/turf/walls/riveted.dmi and b/icons/turf/walls/riveted.dmi differ
diff --git a/icons/turf/walls/riveted.png b/icons/turf/walls/riveted.png
new file mode 100644
index 00000000000..f6b0369a7b4
Binary files /dev/null and b/icons/turf/walls/riveted.png differ
diff --git a/icons/turf/walls/riveted.png.toml b/icons/turf/walls/riveted.png.toml
new file mode 100644
index 00000000000..abc3f367d4f
--- /dev/null
+++ b/icons/turf/walls/riveted.png.toml
@@ -0,0 +1,2 @@
+output_name = "riveted"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/rock_wall.dmi b/icons/turf/walls/rock_wall.dmi
index b6f81475833..af1059489e5 100644
Binary files a/icons/turf/walls/rock_wall.dmi and b/icons/turf/walls/rock_wall.dmi differ
diff --git a/icons/turf/walls/rock_wall.png b/icons/turf/walls/rock_wall.png
new file mode 100644
index 00000000000..54288bd18a9
Binary files /dev/null and b/icons/turf/walls/rock_wall.png differ
diff --git a/icons/turf/walls/rock_wall.png.toml b/icons/turf/walls/rock_wall.png.toml
new file mode 100644
index 00000000000..320b6b7dafe
--- /dev/null
+++ b/icons/turf/walls/rock_wall.png.toml
@@ -0,0 +1,14 @@
+output_name = "rock_wall"
+template = "bitmask/diagonal_32x32.toml"
+
+[icon_size]
+x = 40
+y = 40
+
+[output_icon_size]
+x = 40
+y = 40
+
+[cut_pos]
+x = 20
+y = 20
\ No newline at end of file
diff --git a/icons/turf/walls/rusty_reinforced_wall.dmi b/icons/turf/walls/rusty_reinforced_wall.dmi
index e2636950d27..0e1e10b3dab 100644
Binary files a/icons/turf/walls/rusty_reinforced_wall.dmi and b/icons/turf/walls/rusty_reinforced_wall.dmi differ
diff --git a/icons/turf/walls/rusty_reinforced_wall.png b/icons/turf/walls/rusty_reinforced_wall.png
new file mode 100644
index 00000000000..7a1b3d4a178
Binary files /dev/null and b/icons/turf/walls/rusty_reinforced_wall.png differ
diff --git a/icons/turf/walls/rusty_reinforced_wall.png.toml b/icons/turf/walls/rusty_reinforced_wall.png.toml
new file mode 100644
index 00000000000..8bb07c3839a
--- /dev/null
+++ b/icons/turf/walls/rusty_reinforced_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "rusty_reinforced_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/rusty_wall.dmi b/icons/turf/walls/rusty_wall.dmi
index ca27a10fe07..6eea2a5eae0 100644
Binary files a/icons/turf/walls/rusty_wall.dmi and b/icons/turf/walls/rusty_wall.dmi differ
diff --git a/icons/turf/walls/rusty_wall.png b/icons/turf/walls/rusty_wall.png
new file mode 100644
index 00000000000..4e38523bbbb
Binary files /dev/null and b/icons/turf/walls/rusty_wall.png differ
diff --git a/icons/turf/walls/rusty_wall.png.toml b/icons/turf/walls/rusty_wall.png.toml
new file mode 100644
index 00000000000..358a6ccaa4d
--- /dev/null
+++ b/icons/turf/walls/rusty_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "rusty_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/sandstone_wall.dmi b/icons/turf/walls/sandstone_wall.dmi
index d53e686ee50..46c5b0af1c0 100644
Binary files a/icons/turf/walls/sandstone_wall.dmi and b/icons/turf/walls/sandstone_wall.dmi differ
diff --git a/icons/turf/walls/sandstone_wall.png b/icons/turf/walls/sandstone_wall.png
new file mode 100644
index 00000000000..a000f4e934e
Binary files /dev/null and b/icons/turf/walls/sandstone_wall.png differ
diff --git a/icons/turf/walls/sandstone_wall.png.toml b/icons/turf/walls/sandstone_wall.png.toml
new file mode 100644
index 00000000000..b9f06b895d1
--- /dev/null
+++ b/icons/turf/walls/sandstone_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "sandstone_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/shuttle_wall.dmi b/icons/turf/walls/shuttle_wall.dmi
index c96b087f77f..3d9374b4a30 100644
Binary files a/icons/turf/walls/shuttle_wall.dmi and b/icons/turf/walls/shuttle_wall.dmi differ
diff --git a/icons/turf/walls/silver_wall.dmi b/icons/turf/walls/silver_wall.dmi
index f0f170fdfe3..66d337ef59d 100644
Binary files a/icons/turf/walls/silver_wall.dmi and b/icons/turf/walls/silver_wall.dmi differ
diff --git a/icons/turf/walls/silver_wall.png b/icons/turf/walls/silver_wall.png
new file mode 100644
index 00000000000..1a731d9728f
Binary files /dev/null and b/icons/turf/walls/silver_wall.png differ
diff --git a/icons/turf/walls/silver_wall.png.toml b/icons/turf/walls/silver_wall.png.toml
new file mode 100644
index 00000000000..cdfb92592c4
--- /dev/null
+++ b/icons/turf/walls/silver_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "silver_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/snow_wall.dmi b/icons/turf/walls/snow_wall.dmi
index 833f7245e46..97f38eff13e 100644
Binary files a/icons/turf/walls/snow_wall.dmi and b/icons/turf/walls/snow_wall.dmi differ
diff --git a/icons/turf/walls/snow_wall.png b/icons/turf/walls/snow_wall.png
new file mode 100644
index 00000000000..ce6902fbab3
Binary files /dev/null and b/icons/turf/walls/snow_wall.png differ
diff --git a/icons/turf/walls/snow_wall.png.toml b/icons/turf/walls/snow_wall.png.toml
new file mode 100644
index 00000000000..79381bb6dcb
--- /dev/null
+++ b/icons/turf/walls/snow_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "snow_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/uranium_wall.dmi b/icons/turf/walls/uranium_wall.dmi
index c03886e0087..b64d270b3bd 100644
Binary files a/icons/turf/walls/uranium_wall.dmi and b/icons/turf/walls/uranium_wall.dmi differ
diff --git a/icons/turf/walls/uranium_wall.png b/icons/turf/walls/uranium_wall.png
new file mode 100644
index 00000000000..1f2c858d7c2
Binary files /dev/null and b/icons/turf/walls/uranium_wall.png differ
diff --git a/icons/turf/walls/uranium_wall.png.toml b/icons/turf/walls/uranium_wall.png.toml
new file mode 100644
index 00000000000..035bd1c2af7
--- /dev/null
+++ b/icons/turf/walls/uranium_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "uranium_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/wall.dmi b/icons/turf/walls/wall.dmi
index 651227fe8de..6cdd342fd9e 100644
Binary files a/icons/turf/walls/wall.dmi and b/icons/turf/walls/wall.dmi differ
diff --git a/icons/turf/walls/wall.png b/icons/turf/walls/wall.png
new file mode 100644
index 00000000000..8f95ca652cd
Binary files /dev/null and b/icons/turf/walls/wall.png differ
diff --git a/icons/turf/walls/wall.png.toml b/icons/turf/walls/wall.png.toml
new file mode 100644
index 00000000000..1264d5314a1
--- /dev/null
+++ b/icons/turf/walls/wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/icons/turf/walls/wood_wall.dmi b/icons/turf/walls/wood_wall.dmi
index 60b785c5030..5be00658fff 100644
Binary files a/icons/turf/walls/wood_wall.dmi and b/icons/turf/walls/wood_wall.dmi differ
diff --git a/icons/turf/walls/wood_wall.png b/icons/turf/walls/wood_wall.png
new file mode 100644
index 00000000000..dc9c53a0b70
Binary files /dev/null and b/icons/turf/walls/wood_wall.png differ
diff --git a/icons/turf/walls/wood_wall.png.toml b/icons/turf/walls/wood_wall.png.toml
new file mode 100644
index 00000000000..c40a9740a98
--- /dev/null
+++ b/icons/turf/walls/wood_wall.png.toml
@@ -0,0 +1,2 @@
+output_name = "wood_wall"
+template = "bitmask/diagonal_32x32.toml"
diff --git a/modular_skyrat/modules/aesthetics/walls/code/walls.dm b/modular_skyrat/modules/aesthetics/walls/code/walls.dm
index bef7c462262..98aa5c0e03a 100644
--- a/modular_skyrat/modules/aesthetics/walls/code/walls.dm
+++ b/modular_skyrat/modules/aesthetics/walls/code/walls.dm
@@ -15,12 +15,65 @@
icon_state = "reinforced_wall-0"
base_icon_state = "reinforced_wall"
-/obj/structure/falsewall/material
+/turf/closed/wall/material
icon = 'modular_skyrat/modules/aesthetics/walls/icons/material_wall.dmi'
icon_state = "wall-0"
base_icon_state = "wall"
-/turf/closed/wall/material
+// Modular false wall overrides
+/obj/structure/falsewall
+ icon = 'modular_skyrat/modules/aesthetics/walls/icons/wall.dmi'
+ fake_icon = 'modular_skyrat/modules/aesthetics/walls/icons/wall.dmi'
+
+/obj/structure/falsewall/reinforced
+ name = "reinforced wall"
+ desc = "A huge chunk of reinforced metal used to separate rooms."
+ icon = 'modular_skyrat/modules/aesthetics/walls/icons/reinforced_wall.dmi'
+ fake_icon = 'modular_skyrat/modules/aesthetics/walls/icons/reinforced_wall.dmi'
+
+/obj/structure/falsewall/material
icon = 'modular_skyrat/modules/aesthetics/walls/icons/material_wall.dmi'
- icon_state = "wall-0"
+ icon_state = "wall-open"
base_icon_state = "wall"
+ fake_icon = 'modular_skyrat/modules/aesthetics/walls/icons/material_wall.dmi'
+
+// TG false walls, overridden back to the TG file because we overrode the base falsewall with our aesthetic icon. New ones from TG will have to be added here.
+// Yes, this is dumb
+/obj/structure/falsewall/uranium
+ icon = 'icons/turf/walls/false_walls.dmi'
+
+/obj/structure/falsewall/gold
+ icon = 'icons/turf/walls/false_walls.dmi'
+
+/obj/structure/falsewall/silver
+ icon = 'icons/turf/walls/false_walls.dmi'
+
+/obj/structure/falsewall/diamond
+ icon = 'icons/turf/walls/false_walls.dmi'
+
+/obj/structure/falsewall/plasma
+ icon = 'icons/turf/walls/false_walls.dmi'
+
+/obj/structure/falsewall/bananium
+ icon = 'icons/turf/walls/false_walls.dmi'
+
+/obj/structure/falsewall/sandstone
+ icon = 'icons/turf/walls/false_walls.dmi'
+
+/obj/structure/falsewall/wood
+ icon = 'icons/turf/walls/false_walls.dmi'
+
+/obj/structure/falsewall/bamboo
+ icon = 'icons/turf/walls/false_walls.dmi'
+
+/obj/structure/falsewall/iron
+ icon = 'icons/turf/walls/false_walls.dmi'
+
+/obj/structure/falsewall/abductor
+ icon = 'icons/turf/walls/false_walls.dmi'
+
+/obj/structure/falsewall/titanium
+ icon = 'icons/turf/walls/false_walls.dmi'
+
+/obj/structure/falsewall/plastitanium
+ icon = 'icons/turf/walls/false_walls.dmi'
diff --git a/modular_skyrat/modules/aesthetics/walls/icons/material_wall.dmi b/modular_skyrat/modules/aesthetics/walls/icons/material_wall.dmi
index 781d0c30dc9..310fb694196 100644
Binary files a/modular_skyrat/modules/aesthetics/walls/icons/material_wall.dmi and b/modular_skyrat/modules/aesthetics/walls/icons/material_wall.dmi differ
diff --git a/modular_skyrat/modules/aesthetics/walls/icons/reinforced_wall.dmi b/modular_skyrat/modules/aesthetics/walls/icons/reinforced_wall.dmi
index 9f10b2bc427..27baa9b0889 100644
Binary files a/modular_skyrat/modules/aesthetics/walls/icons/reinforced_wall.dmi and b/modular_skyrat/modules/aesthetics/walls/icons/reinforced_wall.dmi differ
diff --git a/modular_skyrat/modules/aesthetics/walls/icons/wall.dmi b/modular_skyrat/modules/aesthetics/walls/icons/wall.dmi
index fd48b11b9b1..84ab853693d 100644
Binary files a/modular_skyrat/modules/aesthetics/walls/icons/wall.dmi and b/modular_skyrat/modules/aesthetics/walls/icons/wall.dmi differ
diff --git a/modular_skyrat/modules/stone/code/stone.dm b/modular_skyrat/modules/stone/code/stone.dm
index ad20bc39261..a1205e8d354 100644
--- a/modular_skyrat/modules/stone/code/stone.dm
+++ b/modular_skyrat/modules/stone/code/stone.dm
@@ -124,8 +124,9 @@ GLOBAL_LIST_INIT(stone_recipes, list ( \
name = "stone wall"
desc = "A wall made of solid stone bricks."
icon = 'modular_skyrat/modules/stone/icons/wall.dmi'
- icon_state = "wall-0"
+ icon_state = "wall-open"
base_icon_state = "wall"
+ fake_icon = 'modular_skyrat/modules/stone/icons/wall.dmi'
mineral = /obj/item/stack/sheet/mineral/stone
walltype = /turf/closed/wall/mineral/stone
smoothing_flags = SMOOTH_BITMASK
diff --git a/modular_skyrat/modules/stone/icons/wall.dmi b/modular_skyrat/modules/stone/icons/wall.dmi
index 853b753b622..1384db4a89a 100644
Binary files a/modular_skyrat/modules/stone/icons/wall.dmi and b/modular_skyrat/modules/stone/icons/wall.dmi differ
diff --git a/tools/build/build.js b/tools/build/build.js
index 50cb7b5aefb..92f1d9f1507 100644
--- a/tools/build/build.js
+++ b/tools/build/build.js
@@ -7,7 +7,7 @@
*/
import fs from 'fs';
-import { get } from 'http';
+import https from 'https';
import { env } from 'process';
import Juke from './juke/index.js';
import { DreamDaemon, DreamMaker, NamedVersionFile } from './lib/byond.js';
@@ -25,6 +25,29 @@ Juke.setup({ file: import.meta.url }).then((code) => {
});
const DME_NAME = 'tgstation';
+const CUTTER_SUFFIX = '.png.toml'
+
+// Stores the contents of dependencies.sh as a key value pair
+// Best way I could figure to get ahold of this stuff
+const dependencies = fs.readFileSync('dependencies.sh', 'utf8')
+ .split("\n")
+ .map((statement) => statement.replace("export", "").trim())
+ .filter((value) => !(value == "" || value.startsWith("#")))
+ .map((statement) => statement.split("="))
+ .reduce((acc, kv_pair) => {
+ acc[kv_pair[0]] = kv_pair[1];
+ return acc
+ }, {})
+
+// Canonical path for the cutter exe at this moment
+const getCutterPath = () => {
+ const ver = dependencies.CUTTER_VERSION;
+ const suffix = process.platform === 'win32' ? '.exe' : '';
+ const file_ver = ver.split('.').join('-');
+ return `tools/icon_cutter/cache/hypnagogic${file_ver}${suffix}`;
+};
+
+const cutter_path = getCutterPath();
export const DefineParameter = new Juke.Parameter({
type: 'string[]',
@@ -38,10 +61,15 @@ export const PortParameter = new Juke.Parameter({
export const DmVersionParameter = new Juke.Parameter({
type: 'string',
-})
+});
export const CiParameter = new Juke.Parameter({ type: 'boolean' });
+export const ForceRecutParameter = new Juke.Parameter({
+ type: 'boolean',
+ name: "force_recut",
+});
+
export const WarningParameter = new Juke.Parameter({
type: 'string[]',
alias: 'W',
@@ -52,6 +80,89 @@ export const NoWarningParameter = new Juke.Parameter({
alias: 'NW',
});
+export const CutterTarget = new Juke.Target({
+ onlyWhen: () => {
+ const files = Juke.glob(cutter_path);
+ return files.length == 0;
+ },
+ executes: async () => {
+ const repo = dependencies.CUTTER_REPO;
+ const ver = dependencies.CUTTER_VERSION;
+ const suffix = process.platform === 'win32' ? '.exe' : '';
+ const download_from = `https://github.com/${repo}/releases/download/${ver}/hypnagogic${suffix}`
+ await download_file(download_from, cutter_path);
+ if(process.platform !== 'win32') {
+ await Juke.exec("chmod", [
+ '+x',
+ cutter_path,
+ ]);
+ }
+ },
+});
+
+async function download_file(url, file) {
+ return new Promise((resolve, reject) => {
+ let file_stream = fs.createWriteStream(file);
+ https.get(url, function(response) {
+ if (response.statusCode === 302) {
+ file_stream.close();
+ download_file(response.headers.location, file)
+ .then((value) => resolve());
+ return;
+ }
+ if (response.statusCode !== 200) {
+ Juke.logger.error(`Failed to download ${url}: Status ${response.statusCode}`);
+ file_stream.close();
+ reject()
+ return
+ }
+ response.pipe(file_stream);
+
+ // after download completed close filestream
+ file_stream.on("finish", () => {
+ file_stream.close();
+ resolve()
+ });
+
+ }).on("error", (err) => {
+ file_stream.close();
+ Juke.rm(download_into);
+ Juke.logger.error(`Failed to download ${url}: ${err.message}`);
+ reject()
+ });
+ });
+}
+
+export const IconCutterTarget = new Juke.Target({
+ parameters: [ForceRecutParameter],
+ dependsOn: () => [
+ CutterTarget,
+ ],
+ inputs: [
+ 'icons/**/*.png',
+ `icons/**/*${CUTTER_SUFFIX}`,
+ `cutter_templates/**/*${CUTTER_SUFFIX}`,
+ cutter_path,
+ ],
+ outputs: ({ get }) => {
+ if(get(ForceRecutParameter))
+ return [];
+ const folders = [
+ ...Juke.glob(`icons/**/*${CUTTER_SUFFIX}`),
+ ];
+ return folders
+ .map((file) => file.replace(`${CUTTER_SUFFIX}`, '.dmi'));
+ },
+ executes: async () => {
+ await Juke.exec(cutter_path, [
+ '--dont-wait',
+ '--templates',
+ 'cutter_templates',
+ 'icons',
+ ]);
+ },
+});
+
export const DmMapsIncludeTarget = new Juke.Target({
executes: async () => {
const folders = [
@@ -73,6 +184,7 @@ export const DmTarget = new Juke.Target({
parameters: [DefineParameter, DmVersionParameter, WarningParameter, NoWarningParameter],
dependsOn: ({ get }) => [
get(DefineParameter).includes('ALL_MAPS') && DmMapsIncludeTarget,
+ IconCutterTarget,
],
inputs: [
'_maps/map_files/generic/**',
@@ -108,6 +220,7 @@ export const DmTestTarget = new Juke.Target({
parameters: [DefineParameter, DmVersionParameter, WarningParameter, NoWarningParameter],
dependsOn: ({ get }) => [
get(DefineParameter).includes('ALL_MAPS') && DmMapsIncludeTarget,
+ IconCutterTarget,
],
executes: async ({ get }) => {
fs.copyFileSync(`${DME_NAME}.dme`, `${DME_NAME}.test.dme`);
@@ -143,6 +256,7 @@ export const AutowikiTarget = new Juke.Target({
parameters: [DefineParameter, DmVersionParameter, WarningParameter, NoWarningParameter],
dependsOn: ({ get }) => [
get(DefineParameter).includes('ALL_MAPS') && DmMapsIncludeTarget,
+ IconCutterTarget,
],
outputs: [
'data/autowiki_edits.txt',
diff --git a/tools/icon_cutter/README.md b/tools/icon_cutter/README.md
new file mode 100644
index 00000000000..ce79a941fb6
--- /dev/null
+++ b/tools/icon_cutter/README.md
@@ -0,0 +1,23 @@
+# Hypnagogic
+
+## What is this?
+
+This folder holds a set of cached versions of hypnagogic, our icon cutter.
+
+## How is it used?
+
+The cutter works off 2 inputs. A file, typically a png, and a toml config file in the format `{filename}.{other input extension}.toml`
+
+The input resource is transformed by the cutter following a set of rules set out in the .toml file.
+Typically these are very basic. We have a set of templates in repo stored in [cutter_templates/](../../cutter_templates/) and most uses just copy from them.
+
+You can find more information about it in its repository, found [here](https://github.com/actioninja/hypnagogic), the examples subfolder in particular contains fully detailed explanations of all the config values for the different types of cutting (there are more then one)
+
+## How does it work?
+
+Anytime you build the game, CBT will check and see if any of the files that the cutter cares about have been modified
+If they have been, the cutter will perform a full runthrough, and compile all inputs down into typically dmis
+
+These dmis can then be committed, and badabing badaboom we have autocut sprites.
+
+If you want to change the cutter version we have a set of config values in [dependancies.sh](../../dependencies.sh) that control it.
diff --git a/tools/icon_cutter/cache/.gitignore b/tools/icon_cutter/cache/.gitignore
new file mode 100644
index 00000000000..038aa919d4a
--- /dev/null
+++ b/tools/icon_cutter/cache/.gitignore
@@ -0,0 +1 @@
+hypnagogic*
diff --git a/tools/icon_cutter/check.py b/tools/icon_cutter/check.py
new file mode 100644
index 00000000000..c6c269635ff
--- /dev/null
+++ b/tools/icon_cutter/check.py
@@ -0,0 +1,127 @@
+import glob
+import os
+import re
+import sys
+import hashlib
+import platform
+import subprocess
+from PIL import Image
+import numpy as np
+import difflib
+
+BUF_SIZE = 65536 # lets read stuff in 64kb chunks!
+chop_filename = re.compile(r"^.*(\..+?)$", re.M)
+chop_extension = re.compile(r"^(.*)\..+?$", re.M)
+
+def reshape_split(image: np.ndarray, cut_to: tuple):
+ img_height, img_width, channels = image.shape
+
+ tile_height, tile_width = cut_to
+
+ tiled_array = image.reshape(img_height // tile_height,
+ tile_height,
+ img_width // tile_width,
+ tile_width,
+ channels)
+ tiled_array = tiled_array.swapaxes(1, 2)
+ tiled_array = tiled_array.reshape(tile_height, -1, channels)
+ return tiled_array
+
+def get_file_hash(path):
+ path_suffix = re.sub(chop_filename, r"\1", path, count = 1)
+ if path_suffix == ".dmi" or path_suffix == ".png":
+ return hash_dmi(path)
+ else:
+ return hash_file(path)
+
+def hash_dmi(path):
+ md5 = hashlib.md5()
+
+ dmi = Image.open(path)
+ dmi = dmi.convert('RGBA')
+ dmi.load() # Needed only for .png EXIF data (see citation above)
+ dmi_metadata = dmi.info['Description']
+ md5.update(dmi_metadata.encode('utf-8'))
+
+ readable_metadata = dict(
+ map(lambda entry: (entry[0], entry[1]),
+ map(lambda entry : (entry[0].strip(), entry[1].strip()),
+ filter(lambda entry: entry[0].strip() == 'width' or entry[0].strip() == 'height',
+ map(lambda entry : entry.split("="), dmi_metadata.split("\n"))))))
+
+ icon_hash = hashlib.md5()
+ divided_dmi = reshape_split(np.asarray(dmi), (int(readable_metadata['height']), int(readable_metadata['width'])))
+ for i in range(divided_dmi.shape[0]):
+ bytes = divided_dmi[1].tobytes()
+ md5.update(bytes)
+ icon_hash.update(bytes)
+ return (md5.hexdigest(), dmi_metadata, icon_hash.hexdigest())
+
+def hash_file(path):
+ md5 = hashlib.md5()
+
+ with open(path, 'rb') as f:
+ while True:
+ data = f.read(BUF_SIZE)
+ if not data:
+ break
+ md5.update(data)
+
+ return (md5.hexdigest(), None, None)
+
+pass_count = 0
+fail_count = 0
+output_hash = {}
+for cutter_template in glob.glob("..\\..\\icons\\**\*.toml", recursive = True):
+ resource_name = re.sub(chop_extension, r"\1", cutter_template, count = 1)
+ if not os.path.isfile(resource_name):
+ print(f"::error template={cutter_template} exists but lacks a matching resource file ({resource_name})")
+ fail_count += 1
+ continue
+
+ output_name = re.sub(chop_extension, r"\1.dmi", resource_name, count = 1)
+ if not os.path.isfile(output_name):
+ print(f"::error template={cutter_template} and resource={resource_name} exist but they lack a matching output={output_name}. (Try rebuilding)")
+ fail_count += 1
+ continue
+
+ output_hash[output_name] = get_file_hash(output_name)
+
+# Execute cutter
+if platform.system() == "Windows":
+ subprocess.run("..\\build\\build.bat --force-recut --ci icon-cutter")
+else:
+ subprocess.run("../build/build --force-recut --ci icon-cutter", shell = True)
+
+for output_name in output_hash:
+ old_hash, old_metadata, old_icon_hash = output_hash[output_name]
+ new_hash, new_metadata, new_icon_hash = get_file_hash(output_name)
+ if old_hash == new_hash:
+ pass_count += 1
+ continue
+ if old_metadata != new_metadata:
+ print("Metadata differs!")
+ events = ""
+ current_op = None
+ working = ""
+ for index, op in enumerate(difflib.ndiff(old_metadata, new_metadata)):
+ in_nothing = False
+ if current_op == None:
+ current_op = op[0]
+ if current_op != op[0]:
+ events += f"{current_op*10}\n{working}\n"
+ current_op = op[0]
+ working = ""
+ if op[0]== ' ':
+ continue
+ working += f"{op[-1]}"
+ events += f"{current_op*10}\n{working}\n"
+ print(events, end="")
+ if old_icon_hash != new_icon_hash:
+ print("Icon hashes differ!")
+ fail_count += 1
+ print(f"::error output={output_name} and its templates all exist but were not comitted fully compiled")
+
+print(f"{len(output_hash)} templates checked, {pass_count} passed, {fail_count} failed", end="")
+if fail_count > 0:
+ sys.exit(1)
diff --git a/tools/requirements.txt b/tools/requirements.txt
index 06356594e1e..bceaed06581 100644
--- a/tools/requirements.txt
+++ b/tools/requirements.txt
@@ -8,3 +8,6 @@ beautifulsoup4==4.9.3
# ezdb
mysql-connector-python==8.0.33
+
+# icon cutter
+numpy==1.26.0