Files
kiwistation/code/modules/library/soapstone.dm
T
coiax dc87082fe1 Engraved messages UI and fixes (#23700)
* Engraved messages UI

🆑 coiax
add: Engraved messages now have a UI, which any player, living or dead
can access. See when the message was engraved, and like or dislike
accordingly.
add: Admins have additional options with the UI, seeing the player ckey,
original character name, and the ability to outright delete messages at
the press of a button.
/🆑

- If we were to move to a system where higher rated messages would be
more likely to be selected, this provides the ability to get those
ratings.
- Ratings are by ckey, so character independent.
- Authors cannot upvote or downvote their own messages.
- Did I mention that admins can just now delete the message, instead of
mucking around varediting them?

* Arrows > thumbs

* Brings back colours

* Readds message erasure

* Revert "Readds message erasure"

This reverts commit 92ef8e3f1672c0afd4d6cd630c329d6bf4689e77.

* Revert "Brings back colours"

This reverts commit 7a784e4e463398342c6ee5e18dc885f2a7cd46d0.
2017-02-17 09:54:30 +13:00

302 lines
8.5 KiB
Plaintext

/obj/item/soapstone
name = "chisel"
desc = "Leave informative messages for the crew, including the crew of future shifts!\nEven if out of uses, it can still be used to remove messages.\n(Not suitable for engraving on shuttles, off station or on cats. Side effects may include beatings, bannings and orbital bombardment.)"
icon = 'icons/obj/items.dmi'
icon_state = "soapstone"
throw_speed = 3
throw_range = 5
w_class = WEIGHT_CLASS_TINY
var/tool_speed = 50
var/remaining_uses = 3
var/non_dull_name
var/w_engrave = "engrave"
var/w_engraving = "engraving"
var/w_chipping = "chipping"
var/w_dull = "dull"
/obj/item/soapstone/New()
. = ..()
random_name()
check_name() // could start empty
/obj/item/soapstone/proc/random_name()
name = pick("soapstone", "chisel", "chalk", "magic marker")
non_dull_name = name
if(name == "chalk" || name == "magic marker")
desc = replacetext(desc, "engraving", "scribbling")
w_engrave = "scribble"
w_engraving = "scribbling"
w_chipping = "sketching"
if(name == "chalk")
w_dull = "used"
if(name == "magic marker")
w_dull = "empty"
if(name == "soapstone" || name == "chisel")
desc = replacetext(desc, "scribbling", "engraving")
w_engrave = initial(w_engrave)
w_engraving = initial(w_engraving)
w_chipping = initial(w_chipping)
w_dull = "dull"
/obj/item/soapstone/examine(mob/user)
. = ..()
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
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 && !already_message)
// The dull chisel is dull.
user << "<span class='warning'>[src] is [w_dull].</span>"
return
if(!good_chisel_message_location(T))
user << "<span class='warning'>It's not appropriate to [w_engrave] on [T].</span>"
return
if(already_message)
user.visible_message("<span class='notice'>[user] starts erasing [already_message].</span>", "<span class='notice'>You start erasing [already_message].</span>", "<span class='italics'>You hear a [w_chipping] sound.</span>")
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
// Removing our own messages refunds a charge
if(do_after(user, tool_speed, target=target))
user.visible_message("<span class='notice'>[user] has erased [already_message].</span>", "<span class='notice'>You erased [already_message].</span>")
already_message.persists = FALSE
qdel(already_message)
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
if(our_message)
refund_use()
return
var/message = stripped_input(user, "What would you like to [w_engrave]?", "[name] Message")
if(!message)
user << "You decide not to [w_engrave] anything."
return
if(!target.Adjacent(user) && locate(/obj/structure/chisel_message) in T)
user << "You decide not to [w_engrave] anything."
return
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
user.visible_message("<span class='notice'>[user] starts [w_engraving] a message into [T].</span>", "You start [w_engraving] a message into [T].", "<span class='italics'>You hear a [w_chipping] sound.</span>")
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/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--
check_name()
/obj/item/soapstone/proc/refund_use()
if(remaining_uses == -1)
return
remaining_uses++
check_name()
/obj/item/soapstone/proc/check_name()
if(remaining_uses)
name = non_dull_name
else
name = "[w_dull] [name]"
/* Persistent engraved messages, etched onto the station turfs to serve
as instructions and/or memes for the next generation of spessmen.
Limited in location to station_z only. Can be smashed out or exploded,
but only permamently removed with the librarian's soapstone.
*/
/obj/item/soapstone/infinite
remaining_uses = -1
/obj/item/soapstone/empty
remaining_uses = 0
/proc/good_chisel_message_location(turf/T)
if(!T)
. = FALSE
else if(T.z != ZLEVEL_STATION)
. = FALSE
else if(istype(get_area(T), /area/shuttle))
. = FALSE
else if(!(isfloorturf(T) || iswallturf(T)))
. = FALSE
else
. = TRUE
/obj/structure/chisel_message
name = "engraved message"
desc = "A message from a past traveler."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "soapstone_message"
density = 0
anchored = 1
luminosity = 1
obj_integrity = 30
max_integrity = 30
var/hidden_message
var/creator_key
var/creator_name
var/realdate
var/map
var/persists = TRUE
var/list/like_keys = list()
var/list/dislike_keys = list()
/obj/structure/chisel_message/New(newloc)
..()
SSpersistence.chisel_messages += src
var/turf/T = get_turf(src)
if(!good_chisel_message_location(T))
persists = FALSE
qdel(src)
/obj/structure/chisel_message/singularity_pull()
return
/obj/structure/chisel_message/proc/register(mob/user, newmessage)
hidden_message = newmessage
creator_name = user.real_name
creator_key = user.ckey
realdate = world.timeofday
map = MAP_NAME
update_icon()
/obj/structure/chisel_message/update_icon()
..()
var/hash = md5(hidden_message)
var/newcolor = copytext(hash, 1, 7)
add_atom_colour("#[newcolor]", FIXED_COLOUR_PRIORITY)
/obj/structure/chisel_message/proc/pack()
var/list/data = list()
data["hidden_message"] = hidden_message
data["creator_name"] = creator_name
data["creator_key"] = creator_key
data["realdate"] = realdate
data["map"] = MAP_NAME
var/turf/T = get_turf(src)
data["x"] = T.x
data["y"] = T.y
data["like_keys"] = like_keys
data["dislike_keys"] = dislike_keys
/obj/structure/chisel_message/proc/unpack(list/data)
hidden_message = data["hidden_message"]
creator_name = data["creator_name"]
creator_key = data["creator_key"]
realdate = data["realdate"]
like_keys = data["like_keys"]
if(!like_keys)
like_keys = list()
dislike_keys = data["dislike_keys"]
if(!dislike_keys)
dislike_keys = list()
var/x = data["x"]
var/y = data["y"]
var/turf/newloc = locate(x, y, ZLEVEL_STATION)
forceMove(newloc)
update_icon()
/obj/structure/chisel_message/examine(mob/user)
..()
user << "<span class='warning'>[hidden_message]</span>"
/obj/structure/chisel_message/Destroy()
if(persists)
SSpersistence.SaveChiselMessage(src)
SSpersistence.chisel_messages -= src
. = ..()
/obj/structure/chisel_message/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = always_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "engraved_message", name, 600, 300, master_ui, state)
ui.open()
/obj/structure/chisel_message/ui_data(mob/user)
var/list/data = list()
data["hidden_message"] = hidden_message
data["realdate"] = SQLtime(realdate)
data["num_likes"] = like_keys.len
data["num_dislikes"] = dislike_keys.len
data["is_creator"] = user.ckey == creator_key
data["has_liked"] = (user.ckey in like_keys)
data["has_disliked"] = (user.ckey in dislike_keys)
if(check_rights_for(user.client, R_ADMIN))
data["admin_mode"] = TRUE
data["creator_key"] = creator_key
data["creator_name"] = creator_name
return data
/obj/structure/chisel_message/ui_act(action, params, datum/tgui/ui)
var/mob/user = usr
var/is_admin = check_rights_for(user.client, R_ADMIN)
var/is_creator = user.ckey == creator_key
var/has_liked = (user.ckey in like_keys)
var/has_disliked = (user.ckey in dislike_keys)
switch(action)
if("like")
if(is_creator)
return
if(has_disliked)
dislike_keys -= user.ckey
like_keys |= user.ckey
. = TRUE
if("dislike")
if(is_creator)
return
if(has_liked)
like_keys -= user.ckey
dislike_keys |= user.ckey
. = TRUE
if("neutral")
if(is_creator)
return
dislike_keys -= user.ckey
like_keys -= user.ckey
. = TRUE
if("delete")
if(!is_admin)
return
var/confirm = alert(user, "Confirm deletion of engraved message?", "Confirm Deletion", "Yes", "No")
if(confirm == "Yes")
persists = FALSE
qdel(src)