diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm
index 699e9c3d31..c3161a58e5 100644
--- a/code/game/objects/items/devices/floor_painter.dm
+++ b/code/game/objects/items/devices/floor_painter.dm
@@ -4,215 +4,100 @@
icon_state = "labeler1"
item_state = "flight"
- var/mode_nice = "standard"
- var/mode = "floor"
- var/tile_dir_mode = 0
+ var/list/decals = list(
+ "white square" = /obj/effect/floor_decal/corner,
+ "blue square" = /obj/effect/floor_decal/corner/blue,
+ "pale blue square" = /obj/effect/floor_decal/corner/paleblue,
+ "green square" = /obj/effect/floor_decal/corner/green,
+ "lime square" = /obj/effect/floor_decal/corner/lime,
+ "yellow square" = /obj/effect/floor_decal/corner/yellow,
+ "beige square" = /obj/effect/floor_decal/corner/beige,
+ "red square" = /obj/effect/floor_decal/corner/red,
+ "pink square" = /obj/effect/floor_decal/corner/pink,
+ "purple square" = /obj/effect/floor_decal/corner/purple,
+ "mauve square" = /obj/effect/floor_decal/corner/mauve,
+ "orange square" = /obj/effect/floor_decal/corner/orange,
+ "brown square" = /obj/effect/floor_decal/corner/brown,
+ "grey square" = /obj/effect/floor_decal/corner/grey,
+ "hazard stripes" = /obj/effect/floor_decal/industrial/warning,
+ "corner, hazard" = /obj/effect/floor_decal/industrial/warning/corner,
+ "hatched marking" = /obj/effect/floor_decal/industrial/hatch,
+ "white outline" = /obj/effect/floor_decal/industrial/outline,
+ "blue outline" = /obj/effect/floor_decal/industrial/outline/blue,
+ "yellow outline" = /obj/effect/floor_decal/industrial/outline/yellow,
+ "grey outline" = /obj/effect/floor_decal/industrial/outline/grey,
+ "loading sign" = /obj/effect/floor_decal/industrial/loading,
+ "1" = /obj/effect/floor_decal/sign,
+ "2" = /obj/effect/floor_decal/sign/two,
+ "A" = /obj/effect/floor_decal/sign/a,
+ "B" = /obj/effect/floor_decal/sign/b,
+ "C" = /obj/effect/floor_decal/sign/c,
+ "D" = /obj/effect/floor_decal/sign/d,
+ "Ex" = /obj/effect/floor_decal/sign/ex,
+ "M" = /obj/effect/floor_decal/sign/m,
+ "CMO" = /obj/effect/floor_decal/sign/cmo,
+ "V" = /obj/effect/floor_decal/sign/v,
+ "Psy" = /obj/effect/floor_decal/sign/p,
+ "remove all decals" = /obj/effect/floor_decal/reset
+ )
+ var/decal = "remove all decals"
- // mode 0 ignore direction; sets dir=0
- // mode 1 all-direction
- // mode 2 corner selecting the side CW from the selected corner
- // mode 3 cardinal
- // mode 4 warningcorner and warnwhitecorner direction fix
- // mode 5 Opposite corner tiles where the second icon_state is "[mode]_inv"
-/obj/item/device/floor_painter/afterattack(atom/A, mob/user as mob, proximity)
+ var/list/paint_dirs = list(
+ "north" = NORTH,
+ "northwest" = NORTHWEST,
+ "west" = WEST,
+ "southwest" = SOUTHWEST,
+ "south" = SOUTH,
+ "southeast" = SOUTHEAST,
+ "east" = EAST,
+ "northeast" = NORTHEAST,
+ "user-facing" = 0
+ )
+ var/paint_dir = "user-facing"
+
+/obj/item/device/floor_painter/afterattack(var/atom/A, var/mob/user, proximity)
if(!proximity)
return
- if(istype(A, /turf/simulated/floor))
- var/turf/simulated/floor/F = A
+ var/turf/simulated/floor/F = A
+ if(!istype(F))
+ user << "\The [src] can only be used on station flooring."
+ return
- if(F.flooring && F.flooring.name == "floor") // only tiled floors
- if(F.broken || F.burnt)
- usr << "\The [F] is too damaged to repaint."
- return
- if(tile_dir_mode)
- var/D = get_dir(usr, F)
- if(usr.loc == F)
- D = usr.dir
+ if(!F.flooring || !F.flooring.can_paint || F.broken || F.burnt)
+ user << "\The [src] cannot paint broken or missing tiles."
+ return
- switch(tile_dir_mode)
- if(1) // All directions accepted
- F.set_dir(D)
- F.icon_state = mode
- if(2) // Corner mode - diagonal directions converted CW around.
- switch(D)
- if(NORTHEAST)
- D = EAST
- if(SOUTHEAST)
- D = SOUTH
- if(SOUTHWEST)
- D = WEST
- if(NORTHWEST)
- D = NORTH
- F.set_dir(D)
- F.icon_state = mode
- if(3) // cardinal directions only. I've adjusted diagonals the same way the facing code does.
- switch(D)
- if(NORTHEAST)
- D = EAST
- if(SOUTHEAST)
- D = EAST
- if(SOUTHWEST)
- D = WEST
- if(NORTHWEST)
- D = WEST
- F.set_dir(D)
- F.icon_state = mode
- if(4) // floors.dmi icon_states "warningcorner" and "warnwhitecorner" are incorrect, this fixes it
- var/D2
- switch(D)
- if(NORTHEAST)
- D2 = WEST
- if(SOUTHEAST)
- D2 = SOUTH
- if(SOUTHWEST)
- D2 = NORTH
- if(NORTHWEST)
- D2 = EAST
- F.set_dir(D2)
- F.icon_state = mode
- if(5)
- F.set_dir(0)
- if(D == NORTH || D == SOUTH || D == NORTHEAST || D == SOUTHWEST)
- F.icon_state = mode
- else
- F.icon_state = "[mode]_inv"
- else
- F.set_dir(0)
- F.icon_state = mode
- else
- usr << "You can't paint that!"
+ if(F.decals && F.decals.len > 5)
+ user << "\The [F] has been painted too much; you need to clear it off."
+ return
+
+ var/painting_decal = decals[decal]
+ if(!ispath(painting_decal))
+ user << "\The [src] flashes an error light. You might need to reconfigure it."
+ return
+
+ var/painting_dir = 0
+ if(paint_dir == "user-facing")
+ painting_dir = user.dir
+ else if(paint_dirs[paint_dir])
+ painting_dir = paint_dirs[paint_dir]
+ new painting_decal(F, painting_dir)
/obj/item/device/floor_painter/attack_self(mob/user as mob)
- var/type = input("What type of floor?", "Floor painter", "solid") in list("solid", "corner", "opposite corners", "side/three corners", "special", "letters")
- tile_dir_mode = 0
-
- switch(type)
- if("solid")
- tile_dir_mode = 0
- var/design = input("Which color?", "Floor painter") in list("standard", "dark", "red", "blue", "green", "yellow", "purple", "neutral", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple", "freezer", "hydro", "showroom")
- if(design == "standard")
- mode = "floor"
- mode_nice = "standard"
- return
- if(design == "white")
- mode = "white"
- mode_nice = "white"
- return
- if(design == "dark")
- mode = "dark"
- mode_nice = "dark"
- return
- if(design == "showroom" || design == "hydro" || design == "freezer")
- mode = "[design]floor"
- mode_nice = design
- return
- mode_nice = design
- mode = "[replacetext(design, "-", "")]full"
- if("corner")
- var/design = input("Which design?", "Floor painter") in list("black", "red", "blue", "green", "yellow", "purple", "neutral", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple")
- mode_nice = "[design] corner"
- mode = "[replacetext(design, "-", "")]corner"
- tile_dir_mode = 2
- if("opposite corners")
- var/design = input("Which design?", "Floor painter") in list("bar", "cmo", "yellowpatch", "cafeteria", "red-yellow", "red-blue", "red-green", "green-yellow", "green-blue", "blue-yellow")
- mode_nice = design
- if(design == "bar" || design == "cmo" || design == "yellowpatch" || design == "cafeteria")
- mode = design
- else
- mode = "[replacetext(design, "-", "")]full"
- if(design == "yellowpatch")
- tile_dir_mode = 5
- else
- tile_dir_mode = 0
- if("side/three corners")
- var/design = input("Which design?", "Floor painter") in list("black", "red", "blue", "green", "yellow", "purple", "neutral", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple", "red-yellow", "red-blue", "blue-red", "red-green", "green-yellow", "green-blue", "blue-yellow")
- if(design == "white")
- mode = "whitehall"
- mode_nice = "white side"
- else if(design == "black") // because SOMEONE made the black/grey side/corner sprite have the same name as the 'empty space' sprite :(
- mode = "blackfloor"
- mode_nice = design
- else
- mode_nice = design
- mode = replacetext(design, "-", "")
- tile_dir_mode = 1
- if("special")
- var/design = input("Which design?", "Floor painter") in list("arrival", "escape", "caution", "warning", "white-warning", "white-blue-green", "loadingarea", "delivery", "bot", "white-delivery", "white-bot")
- if(design == "white-blue-green")
- mode_nice = design
- mode = "whitebluegreencorners"
- tile_dir_mode = 2
- else if(design == "delivery" || design == "bot" || design == "white-delivery" || design == "white-bot")
- mode_nice = design
- mode = replacetext(design, "-", "")
- tile_dir_mode = 0
- else if(design == "loadingarea")
- mode_nice = design
- mode = design
- tile_dir_mode = 3
- else
- if(design == "white-warning")
- mode_nice = design
- design = "warnwhite"
- var/s_corner = alert("Do you want to paint a single corner of the tile?", "Floor painter","Yes","No") == "Yes"
- if(s_corner)
- mode_nice = "[design] corner"
- mode = "[design]corner"
- if(design == "warning" || design == "white-warning") // sprites for these are weird, need to fix dirs (icons/turf/floors.dmi, "warningcorner" and "warnwhitecorner")
- tile_dir_mode = 4
- else
- tile_dir_mode = 2
- else
- mode_nice = design
- mode = design
- tile_dir_mode = 1
- if("letters")
- var/which = input("Which letters/design?", "Floor painter") in list("A1", "A2", "DI", "SA", "SA (red)", "SB", "SB (red)", "SC", "SC (red)", "W (red)", "V (green)", "Psy", "Ex", "Ex (blue)", "CMO", "O (OP)", "P (OP)")
- mode_nice = which
- switch(which)
- if("A1")
- mode = "white_1"
- if("A2")
- mode = "white_2"
- if("DI")
- mode = "white_d"
- if("SA")
- mode = "white_a"
- if("SA (red)")
- mode = "whitered_a"
- tile_dir_mode = 3
- if("SB")
- mode = "white_b"
- if("SB (red)")
- mode = "whitered_b"
- tile_dir_mode = 3
- if("SC")
- mode = "white_c"
- if("SC (red)")
- mode = "whitered_c"
- tile_dir_mode = 3
- if("W (red)")
- mode = "whitered_w"
- tile_dir_mode = 3
- if("V (green)")
- mode = "whitegreen_v"
- tile_dir_mode = 3
- if("Psy")
- mode = "white_p"
- if("Ex")
- mode = "white_ex"
- if("Ex (blue)")
- mode = "whiteblue_ex"
- tile_dir_mode = 3
- if("CMO") // yes this is also in "opposite corners" choices, but it's a different icon_state (!!)
- mode = "white_cmo"
- if("O (OP)")
- mode = "white_halfo"
- if("P (OP)")
- mode = "white_halfp"
+ var/choice = input("Do you wish to change the decal type or the paint direction?") as null|anything in list("Decal","Direction")
+ if(choice == "Decal")
+ var/new_decal = input("Select a decal.") as null|anything in decals
+ if(new_decal && !isnull(decals[new_decal]))
+ decal = new_decal
+ user << "You set \the [src] decal to '[decal]'."
+ else if(choice == "Direction")
+ var/new_dir = input("Select a direction.") as null|anything in paint_dirs
+ if(new_dir && !isnull(paint_dirs[new_dir]))
+ paint_dir = new_dir
+ user << "You set \the [src] direction to '[paint_dir]'."
/obj/item/device/floor_painter/examine(mob/user)
..(user)
- user << "It is in [mode_nice] mode."
+ user << "It is configured to paint the '[decal]' decal with a direction of '[paint_dir]'."
diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm
index 8daef81186..319b34fa43 100644
--- a/code/game/turfs/flooring/flooring.dm
+++ b/code/game/turfs/flooring/flooring.dm
@@ -36,6 +36,7 @@ var/list/flooring_types
var/descriptor = "tiles"
var/flags
+ var/can_paint
/decl/flooring/grass
name = "grass"
@@ -79,12 +80,14 @@ var/list/flooring_types
damage_temperature = T0C+1400
flags = TURF_REMOVE_CROWBAR | TURF_CAN_BREAK | TURF_CAN_BURN
build_type = /obj/item/stack/tile/floor
+ can_paint = 1
/decl/flooring/linoleum
name = "linoleum"
desc = "It's like the 2390's all over again."
icon = 'icons/turf/flooring/linoleum.dmi'
icon_base = "lino"
+ can_paint = 1
/decl/flooring/tiling/red
name = "floor"
@@ -153,6 +156,7 @@ var/list/flooring_types
build_time = 30
apply_thermal_conductivity = 0.025
apply_heat_capacity = 325000
+ can_paint = 1
/decl/flooring/reinforced/circuit
name = "processing strata"
@@ -160,6 +164,7 @@ var/list/flooring_types
icon_base = "bcircuit"
build_type = null
flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK
+ can_paint = 1
/decl/flooring/reinforced/circuit/green
name = "processing strata"
@@ -172,4 +177,5 @@ var/list/flooring_types
icon_base = "cult"
build_type = null
has_damage_range = 6
- flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK
\ No newline at end of file
+ flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK
+ can_paint = null
\ No newline at end of file
diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm
index 05e06c41e1..e596b04dcf 100644
--- a/code/game/turfs/flooring/flooring_decals.dm
+++ b/code/game/turfs/flooring/flooring_decals.dm
@@ -7,8 +7,14 @@ var/list/floor_decals = list()
name = "floor decal"
icon = 'icons/turf/flooring/decals.dmi'
layer = TURF_LAYER + 0.01
+ var/supplied_dir
+
+/obj/effect/floor_decal/New(var/newloc, var/newdir)
+ supplied_dir = newdir
+ ..(newloc)
/obj/effect/floor_decal/initialize()
+ if(supplied_dir) set_dir(supplied_dir)
var/turf/T = get_turf(src)
if(istype(T, /turf/simulated/floor) || istype(T, /turf/unsimulated/floor))
var/cache_key = "[alpha]-[color]-[dir]-[icon_state]-[layer]"
@@ -24,6 +30,16 @@ var/list/floor_decals = list()
qdel(src)
return
+/obj/effect/floor_decal/reset
+ name = "reset marker"
+
+/obj/effect/floor_decal/reset/initialize()
+ var/turf/T = get_turf(src)
+ if(T.decals && T.decals.len)
+ T.decals.Cut()
+ T.update_icon()
+ return
+
/obj/effect/floor_decal/corner
icon_state = "corner_white"
@@ -292,3 +308,37 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/ss13/l16
name = "L16"
icon_state = "L16"
+
+/obj/effect/floor_decal/sign
+ name = "floor sign"
+ icon_state = "white_1"
+
+/obj/effect/floor_decal/sign/two
+ icon_state = "white_2"
+
+/obj/effect/floor_decal/sign/a
+ icon_state = "white_a"
+
+/obj/effect/floor_decal/sign/b
+ icon_state = "white_b"
+
+/obj/effect/floor_decal/sign/c
+ icon_state = "white_c"
+
+/obj/effect/floor_decal/sign/d
+ icon_state = "white_d"
+
+/obj/effect/floor_decal/sign/ex
+ icon_state = "white_ex"
+
+/obj/effect/floor_decal/sign/m
+ icon_state = "white_m"
+
+/obj/effect/floor_decal/sign/cmo
+ icon_state = "white_cmo"
+
+/obj/effect/floor_decal/sign/v
+ icon_state = "white_v"
+
+/obj/effect/floor_decal/sign/p
+ icon_state = "white_p"
\ No newline at end of file
diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm
index 12e0eea904..cdde744bd4 100644
--- a/code/game/turfs/simulated/floor_icon.dm
+++ b/code/game/turfs/simulated/floor_icon.dm
@@ -1,6 +1,6 @@
var/list/flooring_cache = list()
-/turf/simulated/floor/proc/update_icon(var/update_neighbors)
+/turf/simulated/floor/update_icon(var/update_neighbors)
if(lava)
return
diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm
index 4fcc6da93b..dc7874b2aa 100644
--- a/code/game/turfs/simulated/wall_icon.dm
+++ b/code/game/turfs/simulated/wall_icon.dm
@@ -35,7 +35,7 @@
reinf_material = newrmaterial
update_material()
-/turf/simulated/wall/proc/update_icon()
+/turf/simulated/wall/update_icon()
if(!material)
return
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index f1e6d17768..165840b0b6 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -33,6 +33,9 @@
return
turfs |= src
+/turf/proc/update_icon()
+ return
+
/turf/Destroy()
turfs -= src
..()
diff --git a/html/changelogs/Zuhayr-flooring.yml b/html/changelogs/Zuhayr-flooring.yml
index a746f24999..f7a584be9b 100644
--- a/html/changelogs/Zuhayr-flooring.yml
+++ b/html/changelogs/Zuhayr-flooring.yml
@@ -3,4 +3,5 @@ delete-after: True
changes:
- tweak: "Rewrote tiling. White floors, dark floors and freezer floors now have associated tiles."
- tweak: "Changed how decals work in the mapper. floor_decal is now used instead of an icon in floors.dmi."
+ - tweak: "The floor painter has been rewritten to use decals. Click it in-hand to set direction and decal."
- tweak: "Floor lights are now built from the autholathe, secured with a screwdriver, activated by clicking them with an empty hand, and repaired with a welding torch."
diff --git a/icons/turf/flooring/decals.dmi b/icons/turf/flooring/decals.dmi
index 957582e23f..b903a6f881 100644
Binary files a/icons/turf/flooring/decals.dmi and b/icons/turf/flooring/decals.dmi differ