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