diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm
index 0a5d447f72a..ccec533563d 100644
--- a/code/modules/library/soapstone.dm
+++ b/code/modules/library/soapstone.dm
@@ -9,6 +9,7 @@
var/tool_speed = 50
var/remaining_uses = 3
+ var/non_dull_name
var/w_engrave = "engrave"
var/w_engraving = "engraving"
var/w_chipping = "chipping"
@@ -39,19 +40,28 @@
/obj/item/soapstone/examine(mob/user)
. = ..()
- user << "It has [remaining_uses] uses left."
+ if(remaining_uses != -1)
+ user << "It has [remaining_uses] uses left."
+ else
+ user << "It looks like it can be used an unlimited number of times."
/obj/item/soapstone/afterattack(atom/target, mob/user, proximity)
var/turf/T = get_turf(target)
if(!proximity)
return
- if(!remaining_uses)
- // The dull chisel is dull.
- user << "[src] is [w_dull]."
var/obj/structure/chisel_message/already_message = locate(/obj/structure/chisel_message) in T
+ var/our_message = FALSE
+ if(already_message)
+ our_message = already_message.creator_key == user.ckey
+
+ if(!remaining_uses && !our_message)
+ // The dull chisel is dull.
+ user << "[src] is [w_dull]."
+ return
+
if(!good_chisel_message_location(T))
user << "It's not appropriate to [w_engrave] on [T]."
return
@@ -60,11 +70,17 @@
user.visible_message("[user] starts erasing [already_message].", "You start erasing [already_message].", "You hear a [w_chipping] sound.")
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
- if(do_after(user, tool_speed, target=target) && spend_use())
+ // Removing our own messages refunds a charge
+
+ if((our_message || can_use()) && do_after(user, tool_speed, target=target) && (our_message || can_use()))
user.visible_message("[user] has erased [already_message].", "You erased [already_message].")
already_message.persists = FALSE
qdel(already_message)
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
+ if(our_message)
+ refund_use()
+ else
+ remove_use()
return
var/message = stripped_input(user, "What would you like to [w_engrave]?", "[name] Message")
@@ -78,21 +94,38 @@
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
user.visible_message("[user] starts [w_engraving] a message into [T].", "You start [w_engraving] a message into [T].", "You hear a [w_chipping] sound.")
- if(do_after(user, tool_speed, target=T))
- if(!locate(/obj/structure/chisel_message in T) && spend_use())
+ if(can_use() && do_after(user, tool_speed, target=T) && can_use())
+ if(!locate(/obj/structure/chisel_message in T))
user << "You [w_engrave] a message into [T]."
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
var/obj/structure/chisel_message/M = new(T)
M.register(user, message)
+ remove_use()
-/obj/item/soapstone/proc/spend_use(mob/user)
- if(!remaining_uses)
- . = FALSE
- else
- remaining_uses--
- if(!remaining_uses)
- name = "[w_dull] [name]"
+/obj/item/soapstone/proc/can_use()
+ if(remaining_uses == -1 || remaining_uses >= 0)
. = TRUE
+ else
+ . = FALSE
+
+/obj/item/soapstone/proc/remove_use()
+ if(remaining_uses <= 0)
+ // -1 == unlimited, 0 == empty
+ return
+
+ remaining_uses--
+ if(!remaining_uses)
+ non_dull_name = name
+ name = "[w_dull] [name]"
+
+/obj/item/soapstone/proc/refund_use()
+ if(remaining_uses == -1)
+ return
+ var/was_dull = remaining_uses
+ remaining_uses++
+
+ if(was_dull)
+ name = non_dull_name
/* Persistent engraved messages, etched onto the station turfs to serve
as instructions and/or memes for the next generation of spessmen.
@@ -101,6 +134,9 @@
but only permamently removed with the librarian's soapstone.
*/
+/obj/item/soapstone/infinite
+ remaining_uses = -1
+
/proc/good_chisel_message_location(turf/T)
if(!T)
. = FALSE
@@ -141,8 +177,8 @@
/obj/structure/chisel_message/proc/register(mob/user, newmessage)
hidden_message = newmessage
- creator_name = user.name
- creator_key = user.key
+ creator_name = user.real_name
+ creator_key = user.ckey
realdate = world.timeofday
map = MAP_NAME
update_icon()