diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index f532b5a57f5..2319f3b5ca7 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -2,6 +2,10 @@
// SUIT STORAGE UNIT /////////////////
//////////////////////////////////////
+#define REPAIR_NEEDS_WIRECUTTERS 1
+#define REPAIR_NEEDS_WIRES 2
+#define REPAIR_NEEDS_CROWBAR 3
+#define REPAIR_NEEDS_METAL 4
/obj/machinery/suit_storage_unit
name = "suit storage unit"
@@ -33,6 +37,24 @@
var/panelopen = 0
var/safetieson = 1
var/cycletime_left = 0
+ var/repair_stage = 0
+
+/obj/machinery/suit_storage_unit/examine(mob/user)
+ ..()
+ if(isbroken && isopen)
+ if(!panelopen)
+ user << "A small LED above the maintenance panel is flashing red."
+ return
+ if(in_range(user, src))
+ switch(repair_stage)
+ if(REPAIR_NEEDS_WIRECUTTERS)
+ user << "The wires inside are charred and snapped."
+ if(REPAIR_NEEDS_WIRES)
+ user << "There are no wires inside."
+ if(REPAIR_NEEDS_CROWBAR)
+ user << "Some of the interior metal is burnt and broken."
+ if(REPAIR_NEEDS_METAL)
+ user << "It lacks interior plating."
@@ -376,6 +398,7 @@
src.isbroken = 1
src.isopen = 1
src.islocked = 0
+ repair_stage = REPAIR_NEEDS_WIRECUTTERS
src.eject_occupant(OCCUPANT)
src.isUV = 0 //Cycle ends
src.update_icon()
@@ -473,6 +496,12 @@
return
return
+/obj/machinery/suit_storage_unit/proc/fix()
+ audible_message("[src] beeps and comes back online!")
+ playsound(src, 'sound/machines/defib_ready.ogg', 50, 1)
+ repair_stage = 0
+ isbroken = 0
+ update_icon()
/obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params)
if(!src.ispowered)
@@ -484,10 +513,66 @@
return
if(istype(I, /obj/item/weapon/screwdriver))
src.panelopen = !src.panelopen
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << text("You [] the unit's maintenance panel.",(src.panelopen ? "open up" : "close") )
src.updateUsrDialog()
return
+ if(isbroken && panelopen)
+ if(istype(I, /obj/item/weapon/wirecutters) && repair_stage == REPAIR_NEEDS_WIRECUTTERS)
+ user.visible_message("[user] starts removing [src]'s damaged wires.", \
+ "You begin removing the damaged wires from [src]...")
+ playsound(src, 'sound/items/Wirecutter.ogg', 50, 1)
+ if(!do_after(user, 30, target = src))
+ return
+ user.visible_message("[user] removes the damaged wires from [src].", \
+ "You remove the damaged wiring from [src].")
+ playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
+ repair_stage = REPAIR_NEEDS_WIRES
+ return
+ if(istype(I, /obj/item/stack/cable_coil) && repair_stage == REPAIR_NEEDS_WIRES)
+ var/obj/item/stack/cable_coil/C = I
+ if(C.amount < 5)
+ user << "You need at least five cables to rewire [src]!"
+ return
+ user.visible_message("[user] begins replacing [src] wires.", \
+ "You begin rewiring [src]...")
+ playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
+ if(!do_after(user, 30, target = src))
+ return
+ user.visible_message("[user] adds wires to [src].", \
+ "You rewire [src].")
+ C.amount -= 5
+ if(C.amount <= 0)
+ user.drop_item()
+ qdel(C)
+ playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
+ repair_stage = REPAIR_NEEDS_CROWBAR
+ return
+ if(istype(I, /obj/item/weapon/crowbar) && repair_stage == REPAIR_NEEDS_CROWBAR)
+ user.visible_message("[user] starts removing [src]'s broken interior plating.", \
+ "You begin removing the damaged interior plating from [src]...")
+ playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
+ if(!do_after(user, 30, target = src))
+ return
+ user.visible_message("[user] removes the damaged interior plating from [src].", \
+ "You remove the damaged interior plating from [src].")
+ playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
+ repair_stage = REPAIR_NEEDS_METAL
+ return
+ if(istype(I, /obj/item/stack/sheet/metal) && repair_stage == REPAIR_NEEDS_METAL)
+ var/obj/item/stack/sheet/metal/M = I
+ if(M.amount < 3)
+ user << "You need at least three sheets of metal to repair [src]!"
+ return
+ user.visible_message("[user] starts adding interior plating to [src].", \
+ "You begin adding interior plating to [src]...")
+ playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
+ if(!do_after(user, 30, target = src))
+ return
+ user.visible_message("[user] adds interior plating to [src].", \
+ "You add interior plating to [src].")
+ fix()
+ return
if ( istype(I, /obj/item/weapon/grab) )
var/obj/item/weapon/grab/G = I
store_mob(G.affecting, user)
@@ -566,3 +651,7 @@
user << "The console controls are far too complicated for your tiny brain!"
return
+#undef REPAIR_NEEDS_WIRECUTTERS
+#undef REPAIR_NEEDS_WIRES
+#undef REPAIR_NEEDS_CROWBAR
+#undef REPAIR_NEEDS_METAL
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index bfb9df96d7f..d81bda3467e 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -5,6 +5,11 @@
density = 0
layer = 3.5
+/obj/structure/sign/basic
+ name = "blank sign"
+ desc = "How can signs be real if our eyes aren't real?"
+ icon_state = "backing"
+
/obj/structure/sign/ex_act(severity, target)
qdel(src)
@@ -12,6 +17,38 @@
qdel(src)
return
+/obj/structure/sign/attackby(obj/item/O, mob/user, params)
+ if(istype(O, /obj/item/weapon/wrench))
+ user.visible_message("[user] starts removing [src]...", \
+ "You start unfastening [src].")
+ playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
+ if(!do_after(user, 30, target = src))
+ return
+ playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
+ user.visible_message("[user] unfastens [src].", \
+ "You unfasten [src].")
+ new /obj/item/wallframe/sign_backing(get_turf(user))
+ qdel(src)
+ if(istype(O, /obj/item/weapon/pen))
+ var/list/sign_types = list()
+ for(var/S in typesof(/obj/structure/sign))
+ sign_types.Add(S)
+ sign_types.Remove(src.type)
+ var/sign_type
+ sign_type = input(user, "Select a sign type.", "Sign Customization") as null|anything in sign_types
+ if(!sign_type)
+ return
+ new sign_type(get_turf(src))
+ qdel(src)
+
+/obj/item/wallframe/sign_backing
+ name = "sign backing"
+ desc = "A blank sign with adhesive backing."
+ icon = 'icons/obj/decals.dmi'
+ icon_state = "backing"
+ w_class = 3
+ burn_state = 0 //Burnable, made of wood
+ result_path = /obj/structure/sign/basic
/obj/structure/sign/map
name = "station map"
diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi
index 52703d3b74e..e553b3cf34c 100644
Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ