diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
index 03b20c16953..6e9ed7b2770 100644
--- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
@@ -3601,7 +3601,7 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/obj/structure/sign/plaques/atmos{
+/obj/structure/plaque/static_plaque/atmos{
pixel_y = 32
},
/turf/open/floor/plating,
@@ -3626,7 +3626,7 @@
"lb" = (
/obj/structure/table,
/obj/machinery/recharger,
-/obj/structure/sign/plaques/golden{
+/obj/structure/plaque/static_plaque/golden{
pixel_x = -32
},
/obj/effect/turf_decal/tile/red{
diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm
index b351d0db90b..fc3fc6913af 100644
--- a/_maps/RandomZLevels/SnowCabin.dmm
+++ b/_maps/RandomZLevels/SnowCabin.dmm
@@ -1830,7 +1830,7 @@
id = "TheRealSecretPlace";
name = "\improper Tear In The Fabric of Reality"
},
-/obj/structure/sign/plaques/golden{
+/obj/structure/plaque/static_plaque/golden{
desc = "Holding the record for about 500 years now.";
name = "The Most Annoying Organization Ever";
pixel_y = 32
@@ -3940,7 +3940,7 @@
/turf/open/floor/wood,
/area/awaymission/cabin/caves)
"kn" = (
-/obj/structure/sign/basic{
+/obj/structure/sign{
pixel_x = 32
},
/turf/open/floor/plating/asteroid/snow{
diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm
index 53efc47ff0f..92b1bfd60e5 100644
--- a/_maps/RandomZLevels/research.dmm
+++ b/_maps/RandomZLevels/research.dmm
@@ -2375,7 +2375,7 @@
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/security)
"fv" = (
-/obj/structure/sign/plaques/golden{
+/obj/structure/plaque/static_plaque/golden{
pixel_x = 32
},
/obj/effect/turf_decal/tile/red{
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 8b988e00647..33a7c0a8022 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -3717,7 +3717,7 @@
/turf/open/floor/plasteel,
/area/security/brig)
"ajd" = (
-/obj/structure/sign/plaques/golden{
+/obj/structure/plaque/static_plaque/golden{
pixel_y = 32
},
/obj/effect/turf_decal/tile/red{
@@ -35049,7 +35049,7 @@
/turf/open/floor/plating,
/area/engine/atmos)
"bSD" = (
-/obj/structure/sign/plaques/atmos{
+/obj/structure/plaque/static_plaque/atmos{
pixel_y = -32
},
/obj/structure/table,
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 274d32c0a61..ec3c357b55a 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -28561,7 +28561,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"beE" = (
-/obj/structure/sign/plaques/atmos,
+/obj/structure/plaque/static_plaque/atmos,
/turf/closed/wall,
/area/engine/atmos)
"beF" = (
@@ -38381,7 +38381,7 @@
/turf/open/floor/plasteel,
/area/security/main)
"bwh" = (
-/obj/structure/sign/plaques/golden{
+/obj/structure/plaque/static_plaque/golden{
pixel_y = -32
},
/obj/effect/turf_decal/tile/red,
@@ -50796,7 +50796,7 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
"bQW" = (
-/obj/structure/sign/plaques/golden/captain{
+/obj/structure/plaque/static_plaque/golden/captain{
pixel_x = 32
},
/turf/open/floor/wood,
diff --git a/_maps/map_files/Donutstation/Donutstation.dmm b/_maps/map_files/Donutstation/Donutstation.dmm
index 2058585ef3d..f8a8703deb0 100644
--- a/_maps/map_files/Donutstation/Donutstation.dmm
+++ b/_maps/map_files/Donutstation/Donutstation.dmm
@@ -12120,7 +12120,7 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"aBK" = (
-/obj/structure/sign/plaques/atmos{
+/obj/structure/plaque/static_plaque/atmos{
pixel_y = 32
},
/obj/effect/turf_decal/trimline/yellow/filled/line{
@@ -27048,7 +27048,7 @@
},
/obj/effect/turf_decal/tile/red,
/obj/effect/landmark/start/security_officer,
-/obj/structure/sign/plaques/golden{
+/obj/structure/plaque/static_plaque/golden{
pixel_y = -32
},
/turf/open/floor/plasteel,
@@ -50075,7 +50075,7 @@
/turf/open/space/basic,
/area/space/nearstation)
"rhZ" = (
-/obj/structure/sign/plaques/golden/captain{
+/obj/structure/plaque/static_plaque/golden/captain{
pixel_y = 32
},
/obj/machinery/camera{
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 8d81ef68e8c..c097ac56ddd 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -11015,7 +11015,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/structure/sign/plaques/golden/captain{
+/obj/structure/plaque/static_plaque/golden/captain{
pixel_y = -32
},
/obj/effect/turf_decal/bot,
@@ -18365,7 +18365,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
dir = 4
},
-/obj/structure/sign/plaques/atmos,
+/obj/structure/plaque/static_plaque/atmos,
/turf/closed/wall/rust,
/area/engine/atmos)
"aCV" = (
@@ -49913,7 +49913,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"bxm" = (
-/obj/structure/sign/plaques/atmos,
+/obj/structure/plaque/static_plaque/atmos,
/turf/closed/wall/rust,
/area/engine/atmos)
"bxn" = (
@@ -60418,7 +60418,7 @@
/obj/machinery/light{
dir = 8
},
-/obj/structure/sign/plaques/golden{
+/obj/structure/plaque/static_plaque/golden{
pixel_x = -32
},
/turf/open/floor/plasteel,
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 823120bd1f6..42e7bdbe95d 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -34499,7 +34499,7 @@
},
/area/engine/atmos)
"bAF" = (
-/obj/structure/sign/plaques/atmos{
+/obj/structure/plaque/static_plaque/atmos{
pixel_y = 32
},
/obj/item/phone{
@@ -49759,7 +49759,7 @@
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
"cjK" = (
-/obj/structure/sign/plaques/golden{
+/obj/structure/plaque/static_plaque/golden{
desc = "A golden plaque commemorating excellence in medical care. God only knows how this ended up in this medbay.";
name = "The Hippocratic Award for Excellence in Medicine";
pixel_x = -32
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 961a26631c1..27481527c0d 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -3240,7 +3240,7 @@
/area/security/main)
"ajn" = (
/obj/structure/table,
-/obj/structure/sign/plaques/golden{
+/obj/structure/plaque/static_plaque/golden{
pixel_y = 32
},
/obj/machinery/light{
@@ -39463,7 +39463,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 4
},
-/obj/structure/sign/plaques/atmos{
+/obj/structure/plaque/static_plaque/atmos{
pixel_y = 32
},
/obj/machinery/light{
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index 31983c3892b..98a3d01bafc 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -7248,7 +7248,7 @@
/area/centcom/ferry)
"ql" = (
/obj/structure/dresser,
-/obj/structure/sign/plaques/golden/captain{
+/obj/structure/plaque/static_plaque/golden/captain{
pixel_x = 32
},
/obj/effect/turf_decal/tile/neutral{
@@ -14518,7 +14518,7 @@
/area/tdome/tdomeobserve)
"GL" = (
/obj/structure/table/wood,
-/obj/structure/sign/plaques/golden{
+/obj/structure/plaque/static_plaque/golden{
pixel_y = 32
},
/obj/item/clothing/accessory/lawyers_badge{
@@ -14542,7 +14542,7 @@
/area/tdome/tdomeobserve)
"GO" = (
/obj/structure/table/wood,
-/obj/structure/sign/plaques/golden{
+/obj/structure/plaque/static_plaque/golden{
pixel_y = 32
},
/obj/item/clothing/accessory/medal/silver{
@@ -14817,7 +14817,7 @@
/area/tdome/tdomeobserve)
"Hr" = (
/obj/structure/table/wood,
-/obj/structure/sign/plaques/thunderdome{
+/obj/structure/plaque/static_plaque/thunderdome{
pixel_y = -32
},
/obj/item/clothing/accessory/medal/gold{
@@ -14843,7 +14843,7 @@
/area/tdome/tdomeobserve)
"Ht" = (
/obj/structure/table/wood,
-/obj/structure/sign/plaques/thunderdome{
+/obj/structure/plaque/static_plaque/thunderdome{
pixel_y = -32
},
/obj/item/clothing/accessory/medal{
diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm
index 2b38f09db6a..e881e56aabb 100644
--- a/_maps/shuttles/whiteship_kilo.dmm
+++ b/_maps/shuttles/whiteship_kilo.dmm
@@ -1158,7 +1158,7 @@
/obj/machinery/status_display/evac{
pixel_y = 32
},
-/obj/structure/sign/plaques/golden/captain{
+/obj/structure/plaque/static_plaque/golden/captain{
pixel_x = 32
},
/obj/item/gun/energy/laser/retro,
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index 6fba8782ca7..9559552a71b 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -106,6 +106,7 @@ GLOBAL_LIST_INIT(common_loot, list( //common: basic items
/obj/item/stack/rods/twentyfive = 1,
/obj/item/stack/sheet/metal/twenty = 1,
/obj/item/stack/sheet/mineral/plasma = 1,
+ /obj/item/sign = 1,
//assemblies
/obj/item/assembly/infra = 1,
@@ -192,7 +193,8 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items
/obj/item/stack/sheet/mineral/wood/fifty = 1,
/obj/item/beacon = 1,
/obj/item/weaponcrafting/receiver = 1,
- /obj/item/paper/fluff/stations/soap =1, //recipes count as crafting.
+ /obj/item/paper/fluff/stations/soap = 1, //recipes count as crafting.
+ /obj/item/plaque = 1,
) = 8,
list(//medical and chemicals
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 6dcc6225799..08cac62460e 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -32,6 +32,8 @@ GLOBAL_LIST_EMPTY(meteor_list) // List of all meteors.
GLOBAL_LIST_EMPTY(active_jammers) // List of active radio jammers
GLOBAL_LIST_EMPTY(ladders)
GLOBAL_LIST_EMPTY(trophy_cases)
+///This is a global list of all signs you can change an existing sign or new sign backing to, when using a pen on them.
+GLOBAL_LIST_EMPTY(editable_sign_types)
GLOBAL_LIST_EMPTY(wire_color_directory)
GLOBAL_LIST_EMPTY(wire_name_directory)
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 8f2a23df9e0..29c3a88f5bc 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -211,6 +211,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \
GLOBAL_LIST_INIT(gold_recipes, list ( \
new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("gold tile", /obj/item/stack/tile/mineral/gold, 1, 4, 20), \
+ new/datum/stack_recipe("blank plaque", /obj/item/plaque, 1), \
new/datum/stack_recipe("HoS Statue", /obj/structure/statue/gold/hos, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("HoP Statue", /obj/structure/statue/gold/hop, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("CE Statue", /obj/structure/statue/gold/ce, 5, one_per_turf = 1, on_floor = 1), \
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 92863243f6b..dbfb7c2f75c 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -626,7 +626,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/food/drinks/waterbottle/large/empty, 3), \
new /datum/stack_recipe("colo cups", /obj/item/reagent_containers/food/drinks/colocup, 1), \
new /datum/stack_recipe("wet floor sign", /obj/item/clothing/suit/caution, 2), \
- new /datum/stack_recipe("blank sign", /obj/item/sign_backing, 1)))
+ new /datum/stack_recipe("blank wall sign", /obj/item/sign, 1)))
/obj/item/stack/sheet/plastic
name = "plastic"
diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm
index dd887c061ca..5275a5d2cb6 100644
--- a/code/game/objects/structures/barsigns.dm
+++ b/code/game/objects/structures/barsigns.dm
@@ -7,7 +7,7 @@
max_integrity = 500
integrity_failure = 0.5
armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
- buildable_sign = 0
+ buildable_sign = FALSE
var/panel_open = FALSE
var/datum/barsign/chosen_sign
diff --git a/code/game/objects/structures/plaques/_plaques.dm b/code/game/objects/structures/plaques/_plaques.dm
new file mode 100644
index 00000000000..a2da8f6d07e
--- /dev/null
+++ b/code/game/objects/structures/plaques/_plaques.dm
@@ -0,0 +1,183 @@
+/obj/structure/plaque //This is a plaque you can craft with gold, then permanently engrave a title and description on, with a fountain pen.
+ icon = 'icons/obj/decals.dmi'
+ icon_state = "blankplaque"
+ name = "blank plaque"
+ desc = "A blank plaque, use a fancy pen to engrave it. It can be detatched from the wall with a wrench."
+ anchored = TRUE
+ opacity = FALSE
+ density = FALSE
+ layer = SIGN_LAYER
+ custom_materials = list(/datum/material/gold = 2000)
+ max_integrity = 200 //Twice as durable as regular signs.
+ armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
+ ///Custom plaque structures and items both start "unengraved", once engraved with a fountain pen their text can't be altered again. Static plaques are already engraved.
+ var/engraved = FALSE
+
+/obj/item/plaque //The item version of the above.
+ icon = 'icons/obj/decals.dmi'
+ icon_state = "blankplaque"
+ name = "blank plaque"
+ desc = "A blank plaque, use a fancy pen to engrave it. It can be placed on a wall."
+ w_class = WEIGHT_CLASS_NORMAL
+ custom_materials = list(/datum/material/gold = 2000)
+ max_integrity = 200
+ armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ ///This points the item to make the proper structure when placed on a wall.
+ var/plaque_path = /obj/structure/plaque
+ ///Custom plaque structures and items both start "unengraved", once engraved with a fountain pen their text can't be altered again.
+ var/engraved = FALSE
+
+/obj/structure/plaque/attack_hand(mob/user)
+ . = ..()
+ if(.)
+ return
+ user.examinate(src)
+
+/obj/structure/plaque/wrench_act(mob/living/user, obj/item/wrench/I)
+ . = ..()
+ user.visible_message("[user] starts removing [src]...", \
+ "You start unfastening [src].")
+ I.play_tool_sound(src)
+ if(!I.use_tool(src, user, 4 SECONDS))
+ return TRUE
+ playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
+ user.visible_message("[user] unfastens [src].", \
+ "You unfasten [src].")
+ var/obj/item/plaque/unwrenched_plaque = new (get_turf(user))
+ if(engraved) //If it's still just a basic unengraved plaque, we can (and should) skip some of the below variable transfers.
+ unwrenched_plaque.name = name //Copy over the plaque structure variables to the plaque item we're creating when we unwrench it.
+ unwrenched_plaque.desc = desc
+ unwrenched_plaque.engraved = engraved
+ unwrenched_plaque.obj_integrity = obj_integrity
+ unwrenched_plaque.setDir(dir)
+ qdel(src) //The plaque structure on the wall goes poof and only the plaque item from unwrenching remains.
+ return TRUE
+
+/obj/structure/plaque/welder_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(user.a_intent == INTENT_HARM)
+ return FALSE
+ if(obj_integrity == max_integrity)
+ to_chat(user, "This plaque is already in perfect condition.")
+ return TRUE
+ if(!I.tool_start_check(user, amount=0))
+ return TRUE
+ user.visible_message("[user] starts repairing [src]...", \
+ "You start repairing [src].")
+ if(!I.use_tool(src, user, 4 SECONDS, volume = 50))
+ return TRUE
+ user.visible_message("[user] finishes repairing [src].", \
+ "You finish repairing [src].")
+ obj_integrity = max_integrity
+ return TRUE
+
+/obj/item/plaque/welder_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(user.a_intent == INTENT_HARM)
+ return FALSE
+ if(obj_integrity == max_integrity)
+ to_chat(user, "This plaque is already in perfect condition.")
+ return TRUE
+ if(!I.tool_start_check(user, amount=0))
+ return TRUE
+ user.visible_message("[user] starts repairing [src]...", \
+ "You start repairing [src].")
+ if(!I.use_tool(src, user, 4 SECONDS, volume = 50))
+ return TRUE
+ user.visible_message("[user] finishes repairing [src].", \
+ "You finish repairing [src].")
+ obj_integrity = max_integrity
+ return TRUE
+
+/obj/structure/plaque/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/pen/fountain))
+ if(engraved)
+ to_chat(user, "This plaque has already been engraved.")
+ return
+ var/namechoice = input(user, "Title this plaque. (e.g. 'Best HoP Award', 'Great Ashwalker War Memorial')", "Plaque Customization")
+ if(!namechoice)
+ return
+ var/descriptionchoice = input(user, "Engrave this plaque's text.", "Plaque Customization")
+ if(!descriptionchoice)
+ return
+ if(!Adjacent(user)) //Make sure user is adjacent still
+ to_chat(user, "You need to stand next to the plaque to engrave it!")
+ return
+ user.visible_message("[user] begins engraving [src].", \
+ "You begin engraving [src].")
+ if(!do_after(user, 4 SECONDS, target = src)) //This spits out a visible message that somebody is engraving a plaque, then has a delay.
+ return
+ name = "\improper [namechoice]" //We want improper here so examine doesn't get weird if somebody capitalizes the plaque title.
+ desc = "The plaque reads: '[descriptionchoice]'"
+ engraved = TRUE //The plaque now has a name, description, and can't be altered again.
+ user.visible_message("[user] engraves [src].", \
+ "You engrave [src].")
+ return
+ if(istype(I, /obj/item/pen))
+ if(engraved)
+ to_chat(user, "This plaque has already been engraved, and your pen isn't fancy enough to engrave it anyway! Find a fountain pen.")
+ return
+ to_chat(user, "Your pen isn't fancy enough to engrave this! Find a fountain pen.") //Go steal the Curator's.
+ return
+ return ..()
+
+/obj/item/plaque/attackby(obj/item/I, mob/user, params) //Same as part of the above, except for the item in hand instead of the structure.
+ if(istype(I, /obj/item/pen/fountain))
+ if(engraved)
+ to_chat(user, "This plaque has already been engraved.")
+ return
+ var/namechoice = input(user, "Title this plaque. (e.g. 'Best HoP Award', 'Great Ashwalker War Memorial')", "Plaque Customization")
+ if(!namechoice)
+ return
+ var/descriptionchoice = input(user, "Engrave this plaque's text.", "Plaque Customization")
+ if(!descriptionchoice)
+ return
+ if(!Adjacent(user)) //Make sure user is adjacent still
+ to_chat(user, "You need to stand next to the plaque to engrave it!")
+ return
+ user.visible_message("[user] begins engraving [src].", \
+ "You begin engraving [src].")
+ if(!do_after(user, 40, target = src)) //This spits out a visible message that somebody is engraving a plaque, then has a delay.
+ return
+ name = "\improper [namechoice]" //We want improper here so examine doesn't get weird if somebody capitalizes the plaque title.
+ desc = "The plaque reads: '[descriptionchoice]'"
+ engraved = TRUE //The plaque now has a name, description, and can't be altered again.
+ user.visible_message("[user] engraves [src].", \
+ "You engrave [src].")
+ return
+ if(istype(I, /obj/item/pen))
+ if(engraved)
+ to_chat(user, "This plaque has already been engraved, and your pen isn't fancy enough to engrave it anyway! Find a fountain pen.")
+ return
+ to_chat(user, "Your pen isn't fancy enough to engrave this! Find a fountain pen.") //Go steal the Curator's.
+ return
+ return ..()
+
+/obj/item/plaque/afterattack(atom/target, mob/user, proximity)
+ . = ..()
+ if(!iswallturf(target) || !proximity)
+ return
+ var/turf/target_turf = target
+ var/turf/user_turf = get_turf(user)
+ var/obj/structure/plaque/placed_plaque = new plaque_path(user_turf) //We place the plaque on the turf the user is standing, and pixel shift it to the target wall, as below.
+ //This is to mimic how signs and other wall objects are usually placed by mappers, and so they're only visible from one side of a wall.
+ var/dir = get_dir(user_turf, target_turf)
+ if(dir & NORTH)
+ placed_plaque.pixel_y = 32
+ else if(dir & SOUTH)
+ placed_plaque.pixel_y = -32
+ if(dir & EAST)
+ placed_plaque.pixel_x = 32
+ else if(dir & WEST)
+ placed_plaque.pixel_x = -32
+ user.visible_message("[user] fastens [src] to [target_turf].", \
+ "You attach [src] to [target_turf].")
+ playsound(target_turf, 'sound/items/deconstruct.ogg', 50, TRUE)
+ if(engraved)
+ placed_plaque.name = name
+ placed_plaque.desc = desc
+ placed_plaque.engraved = engraved
+ placed_plaque.obj_integrity = obj_integrity
+ placed_plaque.setDir(dir)
+ qdel(src)
diff --git a/code/game/objects/structures/signs/signs_plaques.dm b/code/game/objects/structures/plaques/static_plaques.dm
similarity index 80%
rename from code/game/objects/structures/signs/signs_plaques.dm
rename to code/game/objects/structures/plaques/static_plaques.dm
index 68caf105d01..1ac3ec7546d 100644
--- a/code/game/objects/structures/signs/signs_plaques.dm
+++ b/code/game/objects/structures/plaques/static_plaques.dm
@@ -1,26 +1,27 @@
-//plaques and memorials
+//These are static plaques, they are made of gold and start engraved with a title and description.
-/obj/structure/sign/plaques
- name = "plaque"
- desc = "A plaque commemorating an event."
- icon_state = "atmosplaque"
+/obj/structure/plaque/static_plaque
+ engraved = TRUE
-/obj/structure/sign/plaques/atmos
+/obj/structure/plaque/static_plaque/atmos
name = "\improper FEA Atmospherics Division plaque"
desc = "This plaque commemorates the fall of the Atmos FEA division. For all the charred, dizzy, and brittle men who have died in its hands."
-/obj/structure/sign/plaques/thunderdome
+/obj/structure/plaque/static_plaque/thunderdome
name = "Thunderdome Plaque"
desc = "This plaque commemorates those who have fallen in glorious combat. For all the charred, dizzy, and beaten men who have died in its hands."
-/obj/structure/sign/plaques/golden
+/obj/structure/plaque/static_plaque/golden
name = "The Most Robust Men Award for Robustness"
desc = "To be Robust is not an action or a way of life, but a mental state. Only those with the force of Will strong enough to act during a crisis, saving friend from foe, are truly Robust. Stay Robust my friends."
icon_state = "goldenplaque"
-/obj/structure/sign/plaques/golden/captain
+/obj/structure/plaque/static_plaque/golden/captain
name = "The Most Robust Captain Award for Robustness"
+//These are plaques that aren't made of metal, so we'll just consider them signs. Those are made of plastic, not gold.
+//See: code>game>objects>structures>signs>_signs.dm
+
/obj/structure/sign/plaques/kiddie
name = "\improper AI developers plaque"
desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child appears to be disabled. Beneath the image, someone has scratched the word \"PACKETS\"."
@@ -31,7 +32,7 @@
desc = "A plaque commemorating the fallen, may they rest in peace, forever asleep amongst the stars. Someone has drawn a picture of a crying badger at the bottom."
/obj/structure/sign/plaques/kiddie/library
- name = "Library Rules Sign"
+ name = "\improper Library Rules Sign"
desc = "A long list of rules to be followed when in the library, extolling the virtues of being quiet at all times and threatening those who would dare eat hot food inside."
/obj/structure/sign/plaques/kiddie/perfect_man
@@ -43,6 +44,6 @@
desc = "A guide to the drone shell dispenser, detailing the constructive and destructive applications of modern repair drones, as well as the development of the incorruptible cyborg servants of tomorrow, available today."
/obj/structure/sign/plaques/deempisi
- name = "Mr. Deempisi portrait"
+ name = "\improper Mr. Deempisi portrait"
desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"
icon_state = "monkey_painting"
diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm
index ed3a506d5fb..5b9b29bafb5 100644
--- a/code/game/objects/structures/signs/_signs.dm
+++ b/code/game/objects/structures/signs/_signs.dm
@@ -1,28 +1,44 @@
/obj/structure/sign
icon = 'icons/obj/decals.dmi'
+ icon_state = "backing"
+ name = "sign backing"
+ desc = "A plastic sign backing, use a pen to change the decal. It can be detached from the wall with a wrench."
anchored = TRUE
opacity = 0
density = FALSE
layer = SIGN_LAYER
+ custom_materials = list(/datum/material/plastic = 2000)
max_integrity = 100
armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
- var/buildable_sign = 1 //unwrenchable and modifiable
+ ///Determines if a sign is unwrenchable.
+ var/buildable_sign = TRUE
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
+ resistance_flags = FLAMMABLE
+ ///This determines if you can select this sign type when using a pen on a sign backing. False by default, set to true per sign type to override.
+ var/is_editable = FALSE
+ ///sign_change_name is used to make nice looking, alphebetized and categorized names when you use a pen on a sign backing.
+ var/sign_change_name = "Sign - Blank" //If this is ever seen in game, something went wrong.
-/obj/structure/sign/basic
- name = "blank sign"
- desc = "How can signs be real if our eyes aren't real? Use a pen to change the decal."
+/obj/item/sign
+ name = "sign backing"
+ desc = "A plastic sign backing, use a pen to change the decal. It can be placed on a wall."
+ icon = 'icons/obj/decals.dmi'
icon_state = "backing"
+ w_class = WEIGHT_CLASS_NORMAL
+ custom_materials = list(/datum/material/plastic = 2000)
+ armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ resistance_flags = FLAMMABLE
+ max_integrity = 100
+ ///The type of sign structure that will be created when placed on a turf, the default looks just like a sign backing item.
+ var/sign_path = /obj/structure/sign
+ ///This determines if you can select this sign type when using a pen on a sign backing. False by default, set to true per sign type to override.
+ var/is_editable = TRUE
-/obj/structure/sign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
- switch(damage_type)
- if(BRUTE)
- if(damage_amount)
- playsound(src.loc, 'sound/weapons/slash.ogg', 80, TRUE)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, TRUE)
- if(BURN)
- playsound(loc, 'sound/items/welder.ogg', 80, TRUE)
+/obj/item/sign/Initialize() //Signs not attached to walls are always rotated so they look like they're laying horizontal.
+ . = ..()
+ var/matrix/M = matrix()
+ M.Turn(90)
+ transform = M
/obj/structure/sign/attack_hand(mob/user)
. = ..()
@@ -30,125 +46,164 @@
return
user.examinate(src)
+/**
+ * This proc populates GLOBAL_LIST_EMPTY(editable_sign_types)
+ *
+ * The first time a pen is used on any sign, this populates GLOBAL_LIST_EMPTY(editable_sign_types), creating a global list of all the signs that you can set a sign backing to with a pen.
+ */
+/proc/populate_editable_sign_types()
+ for(var/s in subtypesof(/obj/structure/sign))
+ var/obj/structure/sign/potential_sign = s
+ if(!initial(potential_sign.is_editable))
+ continue
+ GLOB.editable_sign_types[initial(potential_sign.sign_change_name)] = potential_sign
+ GLOB.editable_sign_types = sortList(GLOB.editable_sign_types) //Alphabetizes the results.
+
+/obj/structure/sign/wrench_act(mob/living/user, obj/item/wrench/I)
+ . = ..()
+ user.visible_message("[user] starts removing [src]...", \
+ "You start unfastening [src].")
+ I.play_tool_sound(src)
+ if(!I.use_tool(src, user, 4 SECONDS))
+ return TRUE
+ playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
+ user.visible_message("[user] unfastens [src].", \
+ "You unfasten [src].")
+ var/obj/item/sign/unwrenched_sign = new (get_turf(user))
+ if(type != /obj/structure/sign) //If it's still just a basic sign backing, we can (and should) skip some of the below variable transfers.
+ unwrenched_sign.name = name //Copy over the sign structure variables to the sign item we're creating when we unwrench a sign.
+ unwrenched_sign.desc = "[desc] It can be placed on a wall."
+ unwrenched_sign.icon_state = icon_state
+ unwrenched_sign.sign_path = type
+ unwrenched_sign.obj_integrity = obj_integrity //Transfer how damaged it is.
+ unwrenched_sign.setDir(dir)
+ qdel(src) //The sign structure on the wall goes poof and only the sign item from unwrenching remains.
+ return TRUE
+
+/obj/structure/sign/welder_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(user.a_intent == INTENT_HARM)
+ return FALSE
+ if(obj_integrity == max_integrity)
+ to_chat(user, "This sign is already in perfect condition.")
+ return TRUE
+ if(!I.tool_start_check(user, amount=0))
+ return TRUE
+ user.visible_message("[user] starts repairing [src]...", \
+ "You start repairing [src].")
+ if(!I.use_tool(src, user, 4 SECONDS, volume =50 ))
+ return TRUE
+ user.visible_message("[user] finishes repairing [src].", \
+ "You finish repairing [src].")
+ obj_integrity = max_integrity
+ return TRUE
+
+/obj/item/sign/welder_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(user.a_intent == INTENT_HARM)
+ return FALSE
+ if(obj_integrity == max_integrity)
+ to_chat(user, "This sign is already in perfect condition.")
+ return TRUE
+ if(!I.tool_start_check(user, amount=0))
+ return TRUE
+ user.visible_message("[user] starts repairing [src]...", \
+ "You start repairing [src].")
+ if(!I.use_tool(src, user, 4 SECONDS, volume =50 ))
+ return TRUE
+ user.visible_message("[user] finishes repairing [src].", \
+ "You finish repairing [src].")
+ obj_integrity = max_integrity
+ return TRUE
+
/obj/structure/sign/attackby(obj/item/I, mob/user, params)
- if(I.tool_behaviour == TOOL_WRENCH && buildable_sign)
- user.visible_message("[user] starts removing [src]...", \
- "You start unfastening [src].")
- I.play_tool_sound(src)
- if(I.use_tool(src, user, 40))
- playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
- user.visible_message("[user] unfastens [src].", \
- "You unfasten [src].")
- var/obj/item/sign_backing/SB = new (get_turf(user))
- SB.icon_state = icon_state
- SB.sign_path = type
- SB.setDir(dir)
- qdel(src)
- return
- else if(istype(I, /obj/item/pen) && buildable_sign)
- var/list/sign_types = list("Secure Area", "Biohazard", "High Voltage", "Radiation", "Hard Vacuum Ahead", "Disposal: Leads To Space", "Danger: Fire", "No Smoking", "Medbay", "Science", "Chemistry", \
- "Hydroponics", "Xenobiology", "Test Chamber","Firing Range", "Extreme Cold", "Extreme Heat", "Gas Mask", "Nanites Lab", "Maintenance", "Reactive Chemicals")
- var/obj/structure/sign/sign_type
- switch(input(user, "Select a sign type.", "Sign Customization") as null|anything in sortList(sign_types))
- if("Blank")
- sign_type = /obj/structure/sign/basic
- if("Secure Area")
- sign_type = /obj/structure/sign/warning/securearea
- if("Biohazard")
- sign_type = /obj/structure/sign/warning/biohazard
- if("High Voltage")
- sign_type = /obj/structure/sign/warning/electricshock
- if("Radiation")
- sign_type = /obj/structure/sign/warning/radiation
- if("Hard Vacuum Ahead")
- sign_type = /obj/structure/sign/warning/vacuum
- if("Disposal: Leads To Space")
- sign_type = /obj/structure/sign/warning/deathsposal
- if("Danger: Fire")
- sign_type = /obj/structure/sign/warning/fire
- if("No Smoking")
- sign_type = /obj/structure/sign/warning/nosmoking/circle
- if("Test Chamber")
- sign_type = /obj/structure/sign/warning/testchamber
- if("Firing Range")
- sign_type = /obj/structure/sign/warning/firingrange
- if("Extreme Cold")
- sign_type = /obj/structure/sign/warning/coldtemp
- if("Extreme Heat")
- sign_type = /obj/structure/sign/warning/hottemp
- if("Gas Mask")
- sign_type = /obj/structure/sign/warning/gasmask
- if("Reactive Chemicals")
- sign_type = /obj/structure/sign/warning/chemdiamond
- if("Medbay")
- sign_type = /obj/structure/sign/departments/medbay/alt
- if("Science")
- sign_type = /obj/structure/sign/departments/science
- if("Chemistry")
- sign_type = /obj/structure/sign/departments/chemistry
- if("Hydroponics")
- sign_type = /obj/structure/sign/departments/botany
- if("Xenobiology")
- sign_type = /obj/structure/sign/departments/xenobio
- if("Nanites Lab")
- sign_type = /obj/structure/sign/departments/nanites
- if("Maintenance")
- sign_type = /obj/structure/sign/departments/mait
-
- //Make sure user is adjacent still
- if(!Adjacent(user))
+ if(is_editable && istype(I, /obj/item/pen))
+ if(!length(GLOB.editable_sign_types))
+ populate_editable_sign_types()
+ if(!length(GLOB.editable_sign_types))
+ CRASH("GLOB.editable_sign_types failed to populate")
+ var/choice = input(user, "Select a sign type.", "Sign Customization") as null|anything in GLOB.editable_sign_types
+ if(!choice)
return
-
- if(!sign_type)
+ if(!Adjacent(user)) //Make sure user is adjacent still.
+ to_chat(user, "You need to stand next to the sign to change it!")
return
-
- //It's import to clone the pixel layout information
+ user.visible_message("[user] begins changing [src].", \
+ "You begin changing [src].")
+ if(!do_after(user, 4 SECONDS, target = src)) //Small delay for changing signs instead of it being instant, so somebody could be shoved or stunned to prevent them from doing so.
+ return
+ var/sign_type = GLOB.editable_sign_types[choice]
+ //It's import to clone the pixel layout information.
//Otherwise signs revert to being on the turf and
- //move jarringly
- var/obj/structure/sign/newsign = new sign_type(get_turf(src))
- newsign.pixel_x = pixel_x
- newsign.pixel_y = pixel_y
+ //move jarringly.
+ var/obj/structure/sign/changedsign = new sign_type(get_turf(src))
+ changedsign.pixel_x = pixel_x
+ changedsign.pixel_y = pixel_y
+ changedsign.obj_integrity = obj_integrity
qdel(src)
- else
- return ..()
+ user.visible_message("[user] finishes changing the sign.", \
+ "You finish changing the sign.")
+ return
+ return ..()
-/obj/item/sign_backing
- name = "sign backing"
- desc = "A sign with adhesive backing. Use a pen to change the decal once installed."
- icon = 'icons/obj/decals.dmi'
- icon_state = "backing"
- w_class = WEIGHT_CLASS_NORMAL
- custom_materials = list(/datum/material/plastic = 2000)
- resistance_flags = FLAMMABLE
- var/sign_path = /obj/structure/sign/basic //the type of sign that will be created when placed on a turf
+/obj/item/sign/attackby(obj/item/I, mob/user, params)
+ if(is_editable && istype(I, /obj/item/pen))
+ if(!length(GLOB.editable_sign_types))
+ populate_editable_sign_types()
+ if(!length(GLOB.editable_sign_types))
+ CRASH("GLOB.editable_sign_types failed to populate")
+ var/choice = input(user, "Select a sign type.", "Sign Customization") as null|anything in GLOB.editable_sign_types
+ if(!choice)
+ return
+ if(!Adjacent(user)) //Make sure user is adjacent still.
+ to_chat(user, "You need to stand next to the sign to change it!")
+ return
+ if(!choice)
+ return
+ user.visible_message("You begin changing [src].")
+ if(!do_after(user, 4 SECONDS, target = src))
+ return
+ var/obj/structure/sign/sign_type = GLOB.editable_sign_types[choice]
+ name = initial(sign_type.name)
+ desc = "[initial(sign_type.desc)] It can be placed on a wall."
+ icon_state = initial(sign_type.icon_state)
+ sign_path = sign_type
+ user.visible_message("You finish changing the sign.")
+ return
+ return ..()
-/obj/item/sign_backing/afterattack(atom/target, mob/user, proximity)
+/obj/item/sign/afterattack(atom/target, mob/user, proximity)
. = ..()
- if(isturf(target) && proximity)
- var/turf/T = target
- user.visible_message("[user] fastens [src] to [T].", \
- "You attach the sign to [T].")
- playsound(T, 'sound/items/deconstruct.ogg', 50, TRUE)
- var/obj/structure/sign/S = new sign_path(T)
- S.setDir(dir)
- qdel(src)
-
-/obj/item/sign_backing/Move(atom/new_loc, direct = 0)
- // pulling, throwing, or conveying a sign backing does not rotate it
- var/old_dir = dir
- . = ..()
- setDir(old_dir)
-
-/obj/item/sign_backing/attack_self(mob/user)
- . = ..()
- setDir(turn(dir, 90))
+ if(!iswallturf(target) || !proximity)
+ return
+ var/turf/target_turf = target
+ var/turf/user_turf = get_turf(user)
+ var/obj/structure/sign/placed_sign = new sign_path(user_turf) //We place the sign on the turf the user is standing, and pixel shift it to the target wall, as below.
+ //This is to mimic how signs and other wall objects are usually placed by mappers, and so they're only visible from one side of a wall.
+ var/dir = get_dir(user_turf, target_turf)
+ if(dir & NORTH)
+ placed_sign.pixel_y = 32
+ else if(dir & SOUTH)
+ placed_sign.pixel_y = -32
+ if(dir & EAST)
+ placed_sign.pixel_x = 32
+ else if(dir & WEST)
+ placed_sign.pixel_x = -32
+ user.visible_message("[user] fastens [src] to [target_turf].", \
+ "You attach the sign to [target_turf].")
+ playsound(target_turf, 'sound/items/deconstruct.ogg', 50, TRUE)
+ placed_sign.obj_integrity = obj_integrity
+ placed_sign.setDir(dir)
+ qdel(src)
/obj/structure/sign/nanotrasen
- name = "\improper Nanotrasen logo"
+ name = "\improper Nanotrasen logo sign"
+ sign_change_name = "Corporate Logo - Nanotrasen"
desc = "A sign with the Nanotrasen logo on it. Glory to Nanotrasen!"
icon_state = "nanotrasen"
+ is_editable = TRUE
/obj/structure/sign/logo
- name = "\improper Nanotrasen logo"
+ name = "\improper Nanotrasen logo sign"
desc = "The Nanotrasen corporate logo."
icon_state = "nanotrasen_sign1"
diff --git a/code/game/objects/structures/signs/signs_departments.dm b/code/game/objects/structures/signs/signs_departments.dm
index 907ad30fe3f..0de5621ae0a 100644
--- a/code/game/objects/structures/signs/signs_departments.dm
+++ b/code/game/objects/structures/signs/signs_departments.dm
@@ -1,96 +1,163 @@
//departmental signs
-/obj/structure/sign/departments/examroom
- name = "\improper EXAM ROOM"
- desc = "A guidance sign which reads 'EXAM ROOM'."
- icon_state = "examroom"
-/obj/structure/sign/departments/science //These 3 have multiple types, just var-edit the icon_state to whatever one you want on the map
- name = "\improper SCIENCE"
- desc = "A sign labelling an area where research and science is performed."
- icon_state = "science1"
-
-/obj/structure/sign/departments/chemistry
- name = "\improper CHEMISTRY"
- desc = "A sign labelling an area containing chemical equipment."
- icon_state = "chemistry1"
-
-/obj/structure/sign/departments/chemistry/pharmacy
- name = "\improper PHARMACY"
- desc = "A sign labelling an area containing pharmacy equipment."
- icon_state = "pharmacy"
-
-/obj/structure/sign/departments/botany
- name = "\improper HYDROPONICS"
- desc = "A sign labelling an area as a place where plants are grown."
- icon_state = "hydro1"
-
-/obj/structure/sign/departments/xenobio
- name = "\improper XENOBIOLOGY"
- desc = "A sign labelling an area as a place where xenobiological entities are researched."
- icon_state = "xenobio"
-
-/obj/structure/sign/departments/evac
- name = "\improper EVACUATION"
- desc = "A sign labelling an area where evacuation procedures take place."
- icon_state = "evac"
-
-/obj/structure/sign/departments/drop
- name = "\improper DROP PODS"
- desc = "A sign labelling an area where drop pod loading procedures take place."
- icon_state = "drop"
-
-/obj/structure/sign/departments/custodian
- name = "\improper CUSTODIAN"
- desc = "A sign labelling an area where the custodian works."
- icon_state = "custodian"
-
-/obj/structure/sign/departments/engineering
- name = "\improper ENGINEERING"
- desc = "A sign labelling an area where engineers work."
- icon_state = "engine"
-
-/obj/structure/sign/departments/cargo
- name = "\improper CARGO"
- desc = "A sign labelling an area where cargo ships dock."
- icon_state = "cargo"
-
-/obj/structure/sign/departments/security
- name = "\improper SECURITY"
- desc = "A sign labelling an area where the law is law."
- icon_state = "security"
-
-/obj/structure/sign/departments/holy
- name = "\improper HOLY"
- desc = "A sign labelling a religious area."
- icon_state = "holy"
-
-/obj/structure/sign/departments/restroom
- name = "\improper RESTROOM"
- desc = "A sign labelling a restroom."
- icon_state = "restroom"
+///////MEDBAY
/obj/structure/sign/departments/medbay
- name = "\improper MEDBAY"
+ name = "\improper Medbay sign"
+ sign_change_name = "Department - Medbay"
desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
icon_state = "bluecross"
+ is_editable = TRUE
/obj/structure/sign/departments/medbay/alt
+ name = "\improper Medbay sign"
+ sign_change_name = "Department - Medbay Alt"
+ desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
icon_state = "bluecross2"
+ is_editable = TRUE
-/obj/structure/sign/departments/mait
- name = "\improper MAINTENANCE TUNNEL"
- desc = "A sign labelling an area where the departments of the station are linked together."
- icon_state = "mait1"
+/obj/structure/sign/departments/examroom
+ name = "\improper Exam Room sign"
+ sign_change_name = "Department - Medbay: Exam Room"
+ desc = "A guidance sign which reads 'Exam Room'."
+ icon_state = "examroom"
+ is_editable = TRUE
-/obj/structure/sign/departments/mait/alt
- icon_state = "mait2"
+/obj/structure/sign/departments/chemistry
+ name = "\improper Chemistry sign"
+ sign_change_name = "Department - Medbay: Chemistry"
+ desc = "A sign labelling an area containing chemical equipment."
+ icon_state = "chemistry1"
+ is_editable = TRUE
-/obj/structure/sign/departments/nanites
- name = "\improper NANITE LAB"
- desc = "A sign labelling an area where testing and development of nanites is performed."
- icon_state = "nanites"
+/obj/structure/sign/departments/chemistry/pharmacy
+ name = "\improper Pharmacy sign"
+ sign_change_name = "Department - Medbay: Pharmacy"
+ desc = "A sign labelling an area containing pharmacy equipment."
+ icon_state = "pharmacy"
+ is_editable = TRUE
+
/obj/structure/sign/departments/psychology
- name = "\improper PSYCHOLOGY"
+ name = "\improper Psychology sign"
+ sign_change_name = "Department - Medbay: Psychology"
desc = "A sign labelling where the Psychologist works, they can probably help you get your head straight."
icon_state = "psychology"
+ is_editable = TRUE
+
+///////ENGINEERING
+
+/obj/structure/sign/departments/engineering
+ name = "\improper Engineering sign"
+ sign_change_name = "Department - Engineering"
+ desc = "A sign labelling an area where engineers work."
+ icon_state = "engine"
+ is_editable = TRUE
+
+///////SCIENCE
+
+/obj/structure/sign/departments/science
+ name = "\improper Science sign"
+ sign_change_name = "Department - Science"
+ desc = "A sign labelling an area where research and science is performed."
+ icon_state = "science1"
+ is_editable = TRUE
+
+/obj/structure/sign/departments/science/alt
+ name = "\improper Science sign"
+ sign_change_name = "Department - Science Alt"
+ desc = "A sign labelling an area where research and science is performed."
+ icon_state = "science2"
+ is_editable = TRUE
+
+/obj/structure/sign/departments/xenobio
+ name = "\improper Xenobiolgoy sign"
+ sign_change_name = "Department - Science: Xenobiology"
+ desc = "A sign labelling an area as a place where xenobiological entities are researched."
+ icon_state = "xenobio"
+ is_editable = TRUE
+
+/obj/structure/sign/departments/nanites
+ name = "\improper Nanite Lab sign"
+ sign_change_name = "Department - Science: Nanites"
+ desc = "A sign labelling an area where testing and development of nanites is performed."
+ icon_state = "nanites"
+ is_editable = TRUE
+
+///////SERVICE
+
+/obj/structure/sign/departments/botany
+ name = "\improper Botany sign"
+ sign_change_name = "Department - Botany"
+ desc = "A sign labelling an area as a place where plants are grown."
+ icon_state = "hydro1"
+ is_editable = TRUE
+
+/obj/structure/sign/departments/custodian
+ name = "\improper Janitor sign"
+ sign_change_name = "Department - Janitor"
+ desc = "A sign labelling an area where the janitor works."
+ icon_state = "custodian"
+ is_editable = TRUE
+
+/obj/structure/sign/departments/holy
+ name = "\improper Chapel sign"
+ sign_change_name = "Department - Chapel"
+ desc = "A sign labelling a religious area."
+ icon_state = "holy"
+ is_editable = TRUE
+
+///////SUPPLY
+
+/obj/structure/sign/departments/cargo
+ name = "\improper Cargo sign"
+ sign_change_name = "Department - Cargo"
+ desc = "A sign labelling an area where cargo ships dock."
+ icon_state = "cargo"
+ is_editable = TRUE
+
+///////SECURITY
+
+/obj/structure/sign/departments/security
+ name = "\improper Security sign"
+ sign_change_name = "Department - Security"
+ desc = "A sign labelling an area where the law is law."
+ icon_state = "security"
+ is_editable = TRUE
+
+////MISC LOCATIONS
+
+/obj/structure/sign/departments/restroom
+ name = "\improper Restroom sign"
+ sign_change_name = "Location - Restroom"
+ desc = "A sign labelling a restroom."
+ icon_state = "restroom"
+ is_editable = TRUE
+
+/obj/structure/sign/departments/mait
+ name = "\improper Maintenance Tunnel sign"
+ sign_change_name = "Location - Maintenance"
+ desc = "A sign labelling an area where the departments of the station are linked together."
+ icon_state = "mait1"
+ is_editable = TRUE
+
+/obj/structure/sign/departments/mait/alt
+ name = "\improper Maintenance Tunnel sign"
+ sign_change_name = "Location - Maintenance Alt"
+ desc = "A sign labelling an area where the departments of the station are linked together."
+ icon_state = "mait2"
+ is_editable = TRUE
+
+/obj/structure/sign/departments/evac
+ name = "\improper Evacuation sign"
+ sign_change_name = "Location - Evacuation"
+ desc = "A sign labelling an area where evacuation procedures take place."
+ icon_state = "evac"
+ is_editable = TRUE
+
+/obj/structure/sign/departments/drop
+ name = "\improper Drop Pods sign"
+ sign_change_name = "Location - Drop Pods"
+ desc = "A sign labelling an area where drop pod loading procedures take place."
+ icon_state = "drop"
+ is_editable = TRUE
diff --git a/code/game/objects/structures/signs/signs_maps.dm b/code/game/objects/structures/signs/signs_maps.dm
index 63de37f2e8c..ba79b6ff93f 100644
--- a/code/game/objects/structures/signs/signs_maps.dm
+++ b/code/game/objects/structures/signs/signs_maps.dm
@@ -2,7 +2,7 @@
/obj/structure/sign/map
name = "station map"
- desc = "A framed picture of the station."
+ desc = "A navigational chart of the station."
max_integrity = 500
/obj/structure/sign/map/left
@@ -12,47 +12,47 @@
icon_state = "map-right"
/obj/structure/sign/directions/science
- name = "science department"
+ name = "science department sign"
desc = "A direction sign, pointing out which way the Science department is."
icon_state = "direction_sci"
/obj/structure/sign/directions/engineering
- name = "engineering department"
+ name = "engineering department sign"
desc = "A direction sign, pointing out which way the Engineering department is."
icon_state = "direction_eng"
/obj/structure/sign/directions/security
- name = "security department"
+ name = "security department sign"
desc = "A direction sign, pointing out which way the Security department is."
icon_state = "direction_sec"
/obj/structure/sign/directions/medical
- name = "medical bay"
- desc = "A direction sign, pointing out which way the Medical Bay is."
+ name = "medbay sign"
+ desc = "A direction sign, pointing out which way the Medbay is."
icon_state = "direction_med"
/obj/structure/sign/directions/evac
- name = "escape arm"
+ name = "evacuation sign"
desc = "A direction sign, pointing out which way the escape shuttle dock is."
icon_state = "direction_evac"
/obj/structure/sign/directions/supply
- name = "cargo bay"
+ name = "cargo sign"
desc = "A direction sign, pointing out which way the Cargo Bay is."
icon_state = "direction_supply"
/obj/structure/sign/directions/command
- name = "command department"
+ name = "command department sign"
desc = "A direction sign, pointing out which way the Command department is."
icon_state = "direction_bridge"
/obj/structure/sign/directions/vault
- name = "vault directions"
+ name = "vault sign"
desc = "A direction sign, pointing out which way the station's Vault is."
icon_state = "direction_vault"
/obj/structure/sign/directions/upload
- name = "upload directions"
+ name = "upload sign"
desc = "A direction sign, pointing out which way the station's AI Upload is."
icon_state = "direction_upload"
diff --git a/code/game/objects/structures/signs/signs_warning.dm b/code/game/objects/structures/signs/signs_warning.dm
index 3a35f2d26ea..9b0867b5520 100644
--- a/code/game/objects/structures/signs/signs_warning.dm
+++ b/code/game/objects/structures/signs/signs_warning.dm
@@ -1,122 +1,181 @@
+//warning signs
+
+
+///////DANGEROUS THINGS
+
/obj/structure/sign/warning
- name = "\improper WARNING"
+ name = "\improper WARNING sign"
+ sign_change_name = "Warning"
desc = "A warning sign."
icon_state = "securearea"
+ is_editable = TRUE
/obj/structure/sign/warning/securearea
- name = "\improper SECURE AREA"
+ name = "\improper SECURE AREA sign"
+ sign_change_name = "Warning - Secure Area"
desc = "A warning sign which reads 'SECURE AREA'."
+ is_editable = TRUE
/obj/structure/sign/warning/docking
- name = "\improper KEEP CLEAR: DOCKING AREA"
+ name = "\improper KEEP CLEAR: DOCKING AREA sign"
+ sign_change_name = "Warning - Docking Area"
desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."
+ is_editable = TRUE
/obj/structure/sign/warning/biohazard
- name = "\improper BIOHAZARD"
+ name = "\improper BIOHAZARD sign"
+ sign_change_name = "Warning - Biohazard"
desc = "A warning sign which reads 'BIOHAZARD'."
icon_state = "bio"
+ is_editable = TRUE
/obj/structure/sign/warning/electricshock
- name = "\improper HIGH VOLTAGE"
+ name = "\improper HIGH VOLTAGE sign"
+ sign_change_name = "Warning - High Voltage"
desc = "A warning sign which reads 'HIGH VOLTAGE'."
icon_state = "shock"
+ is_editable = TRUE
/obj/structure/sign/warning/vacuum
- name = "\improper HARD VACUUM AHEAD"
+ name = "\improper HARD VACUUM AHEAD sign"
+ sign_change_name = "Warning - Hard Vacuum"
desc = "A warning sign which reads 'HARD VACUUM AHEAD'."
icon_state = "space"
+ is_editable = TRUE
/obj/structure/sign/warning/vacuum/external
- name = "\improper EXTERNAL AIRLOCK"
+ name = "\improper EXTERNAL AIRLOCK sign"
+ sign_change_name = "Warning - External Airlock"
desc = "A warning sign which reads 'EXTERNAL AIRLOCK'."
layer = MOB_LAYER
+ is_editable = TRUE
/obj/structure/sign/warning/deathsposal
- name = "\improper DISPOSAL: LEADS TO SPACE"
+ name = "\improper DISPOSAL: LEADS TO SPACE sign"
+ sign_change_name = "Warning - Disposals: Leads to Space"
desc = "A warning sign which reads 'DISPOSAL: LEADS TO SPACE'."
icon_state = "deathsposal"
+ is_editable = TRUE
/obj/structure/sign/warning/bodysposal
- name = "\improper DISPOSAL: LEADS TO MORGUE"
+ name = "\improper DISPOSAL: LEADS TO MORGUE sign"
+ sign_change_name = "Warning - Disposals: Leads to Morgue"
desc = "A warning sign which reads 'DISPOSAL: LEADS TO MORGUE'."
icon_state = "bodysposal"
-
-/obj/structure/sign/warning/pods
- name = "\improper ESCAPE PODS"
- desc = "A warning sign which reads 'ESCAPE PODS'."
- icon_state = "pods"
+ is_editable = TRUE
/obj/structure/sign/warning/fire
- name = "\improper DANGER: FIRE"
+ name = "\improper DANGER: FIRE sign"
+ sign_change_name = "Warning - Fire Hazard"
desc = "A warning sign which reads 'DANGER: FIRE'."
icon_state = "fire"
resistance_flags = FIRE_PROOF
+ is_editable = TRUE
/obj/structure/sign/warning/nosmoking
- name = "\improper NO SMOKING"
+ name = "\improper NO SMOKING sign"
+ sign_change_name = "Warning - No Smoking"
desc = "A warning sign which reads 'NO SMOKING'."
icon_state = "nosmoking2"
resistance_flags = FLAMMABLE
+ is_editable = TRUE
/obj/structure/sign/warning/nosmoking/circle
+ name = "\improper NO SMOKING sign"
+ sign_change_name = "Warning - No Smoking Alt"
+ desc = "A warning sign which reads 'NO SMOKING'."
icon_state = "nosmoking"
+ is_editable = TRUE
/obj/structure/sign/warning/radiation
- name = "\improper HAZARDOUS RADIATION"
+ name = "\improper HAZARDOUS RADIATION sign"
+ sign_change_name = "Warning - Radiation"
desc = "A warning sign alerting the user of potential radiation hazards."
icon_state = "radiation"
+ is_editable = TRUE
/obj/structure/sign/warning/radiation/rad_area
- name = "\improper RADIOACTIVE AREA"
+ name = "\improper RADIOACTIVE AREA sign"
+ sign_change_name = "Warning - Radioactive Area"
desc = "A warning sign which reads 'RADIOACTIVE AREA'."
+ is_editable = TRUE
/obj/structure/sign/warning/xeno_mining
- name = "\improper DANGEROUS ALIEN LIFE"
+ name = "\improper DANGEROUS ALIEN LIFE sign"
+ sign_change_name = "Warning - Xenos"
desc = "A sign that warns would-be travellers of hostile alien life in the vicinity."
icon = 'icons/obj/mining.dmi'
icon_state = "xeno_warning"
+ is_editable = TRUE
/obj/structure/sign/warning/enginesafety
- name = "\improper ENGINEERING SAFETY"
+ name = "\improper ENGINEERING SAFETY sign"
+ sign_change_name = "Warning - Engineering Safety Protocols"
desc = "A sign detailing the various safety protocols when working on-site to ensure a safe shift."
icon_state = "safety"
+ is_editable = TRUE
/obj/structure/sign/warning/explosives
- name = "\improper HIGH EXPLOSIVES"
+ name = "\improper HIGH EXPLOSIVES sign"
+ sign_change_name = "Warning - Explosives"
desc = "A warning sign which reads 'HIGH EXPLOSIVES'."
icon_state = "explosives"
+ is_editable = TRUE
/obj/structure/sign/warning/explosives/alt
- name = "\improper HIGH EXPLOSIVES"
+ name = "\improper HIGH EXPLOSIVES sign"
+ sign_change_name = "Warning - Explosives Alt"
desc = "A warning sign which reads 'HIGH EXPLOSIVES'."
icon_state = "explosives2"
+ is_editable = TRUE
/obj/structure/sign/warning/testchamber
- name = "\improper TESTING AREA"
- desc = "A sign that warns of high-power testing equipment in the area. That's either a really powerful laser... or a satellite landing on some person's head."
+ name = "\improper TESTING AREA sign"
+ sign_change_name = "Warning - Testing Area"
+ desc = "A sign that warns of high-power testing equipment in the area."
icon_state = "testchamber"
+ is_editable = TRUE
/obj/structure/sign/warning/firingrange
- name = "\improper FIRING RANGE"
+ name = "\improper FIRING RANGE sign"
+ sign_change_name = "Warning - Firing Range"
desc = "A sign reminding you to remain behind the firing line, and to wear ear protection."
icon_state = "firingrange"
+ is_editable = TRUE
/obj/structure/sign/warning/coldtemp
- name = "\improper FREEZING AIR"
+ name = "\improper FREEZING AIR sign"
+ sign_change_name = "Warning - Temp: Cold"
desc = "A sign that warns of extremely cold air in the vicinity."
icon_state = "cold"
+ is_editable = TRUE
/obj/structure/sign/warning/hottemp
- name = "\improper SUPERHEATED AIR"
+ name = "\improper SUPERHEATED AIR sign"
+ sign_change_name = "Warning - Temp: Hot"
desc = "A sign that warns of extremely hot air in the vicinity."
icon_state = "heat"
+ is_editable = TRUE
/obj/structure/sign/warning/gasmask
- name = "\improper CONTAMINATED AIR"
- desc = "A sign that warns of dangerous particulates in the air, instructing you to wear a filtration device."
+ name = "\improper CONTAMINATED AIR sign"
+ sign_change_name = "Warning - Contaminated Air"
+ desc = "A sign that warns of dangerous particulates or gasses in the air, instructing you to wear a filtration device."
icon_state = "gasmask"
+ is_editable = TRUE
/obj/structure/sign/warning/chemdiamond
name = "\improper REACTIVE CHEMICALS"
+ sign_change_name = "Warning - Hazardous Chemicals sign"
desc = "A sign that warns of potentially reactive chemicals nearby, be they explosive, flamable, or acidic."
icon_state = "chemdiamond"
+ is_editable = TRUE
+
+////MISC LOCATIONS
+
+/obj/structure/sign/warning/pods
+ name = "\improper ESCAPE PODS sign"
+ sign_change_name = "Location - Escape Pods"
+ desc = "A warning sign which reads 'ESCAPE PODS'."
+ icon_state = "pods"
+ is_editable = TRUE
diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi
index 2234b56eab9..e239a2e2ccf 100644
Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 15e59902c95..0fbc47b7afc 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1223,8 +1223,9 @@
#include "code\game\objects\structures\signs\_signs.dm"
#include "code\game\objects\structures\signs\signs_departments.dm"
#include "code\game\objects\structures\signs\signs_maps.dm"
-#include "code\game\objects\structures\signs\signs_plaques.dm"
#include "code\game\objects\structures\signs\signs_warning.dm"
+#include "code\game\objects\structures\plaques\_plaques.dm"
+#include "code\game\objects\structures\plaques\static_plaques.dm"
#include "code\game\objects\structures\transit_tubes\station.dm"
#include "code\game\objects\structures\transit_tubes\transit_tube.dm"
#include "code\game\objects\structures\transit_tubes\transit_tube_construction.dm"