Bleeding edgy refresh (#303)

* not code stuff

* other things

* global vars, defines, helpers

* onclick hud stuff, orphans, world.dm

* controllers and datums

* game folder

* everything not client/mobs in modules

* client folder

* stage 1 mob stuff

* simple animal things

* silicons

* carbon things

* ayylmaos and monkeys

* hyoomahn

* icons n shit

* sprite fixes

* compile fixes

* some fixes I cherrypicked.

* qdel fixes

* forgot brain refractors
This commit is contained in:
Poojawa
2017-03-21 11:44:10 -05:00
committed by GitHub
parent 099a6c8764
commit f67e9f6d87
1476 changed files with 344416 additions and 40694 deletions
+4 -4
View File
@@ -15,17 +15,17 @@
/obj/item/weapon/book/codex_gigas/attack_self(mob/user)
if(is_blind(user))
user << "<span class='warning'>As you are trying to read, you suddenly feel very stupid.</span>"
to_chat(user, "<span class='warning'>As you are trying to read, you suddenly feel very stupid.</span>")
return
if(ismonkey(user))
user << "<span class='notice'>You skim through the book but can't comprehend any of it.</span>"
to_chat(user, "<span class='notice'>You skim through the book but can't comprehend any of it.</span>")
return
if(inUse)
user << "<span class='notice'>Someone else is reading it.</span>"
to_chat(user, "<span class='notice'>Someone else is reading it.</span>")
if(ishuman(user))
var/mob/living/carbon/human/U = user
if(U.check_acedia())
user << "<span class='notice'>None of this matters, why are you reading this? You put the [title] down.</span>"
to_chat(user, "<span class='notice'>None of this matters, why are you reading this? You put the [title] down.</span>")
return
inUse = 1
var/devilName = copytext(sanitize(input(user, "What infernal being do you wish to research?", "Codex Gigas", null) as text),1,MAX_MESSAGE_LEN)
+30 -30
View File
@@ -44,13 +44,13 @@
if(istype(I, /obj/item/weapon/wrench))
playsound(loc, I.usesound, 100, 1)
if(do_after(user, 20*I.toolspeed, target = src))
user << "<span class='notice'>You wrench the frame into place.</span>"
to_chat(user, "<span class='notice'>You wrench the frame into place.</span>")
anchored = 1
state = 1
if(istype(I, /obj/item/weapon/crowbar))
playsound(loc, I.usesound, 100, 1)
if(do_after(user, 20*I.toolspeed, target = src))
user << "<span class='notice'>You pry the frame apart.</span>"
to_chat(user, "<span class='notice'>You pry the frame apart.</span>")
deconstruct(TRUE)
if(1)
@@ -58,12 +58,12 @@
var/obj/item/stack/sheet/mineral/wood/W = I
if(W.get_amount() >= 2)
W.use(2)
user << "<span class='notice'>You add a shelf.</span>"
to_chat(user, "<span class='notice'>You add a shelf.</span>")
state = 2
icon_state = "book-0"
if(istype(I, /obj/item/weapon/wrench))
playsound(loc, I.usesound, 100, 1)
user << "<span class='notice'>You unwrench the frame.</span>"
to_chat(user, "<span class='notice'>You unwrench the frame.</span>")
anchored = 0
state = 0
@@ -78,7 +78,7 @@
for(var/obj/item/T in B.contents)
if(istype(T, /obj/item/weapon/book) || istype(T, /obj/item/weapon/spellbook))
B.remove_from_storage(T, src)
user << "<span class='notice'>You empty \the [I] into \the [src].</span>"
to_chat(user, "<span class='notice'>You empty \the [I] into \the [src].</span>")
update_icon()
else if(istype(I, /obj/item/weapon/pen))
var/newname = stripped_input(user, "What would you like to title this bookshelf?")
@@ -88,10 +88,10 @@
name = ("bookcase ([sanitize(newname)])")
else if(istype(I, /obj/item/weapon/crowbar))
if(contents.len)
user << "<span class='warning'>You need to remove the books first!</span>"
to_chat(user, "<span class='warning'>You need to remove the books first!</span>")
else
playsound(loc, I.usesound, 100, 1)
user << "<span class='notice'>You pry the shelf out.</span>"
to_chat(user, "<span class='notice'>You pry the shelf out.</span>")
new /obj/item/stack/sheet/mineral/wood(loc, 2)
state = 1
icon_state = "bookempty"
@@ -180,36 +180,36 @@
/obj/item/weapon/book/attack_self(mob/user)
if(is_blind(user))
user << "<span class='warning'>As you are trying to read, you suddenly feel very stupid!</span>"
to_chat(user, "<span class='warning'>As you are trying to read, you suddenly feel very stupid!</span>")
return
if(ismonkey(user))
user << "<span class='notice'>You skim through the book but can't comprehend any of it.</span>"
to_chat(user, "<span class='notice'>You skim through the book but can't comprehend any of it.</span>")
return
if(dat)
user << browse("<TT><I>Penned by [author].</I></TT> <BR>" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.")
onclose(user, "book")
else
user << "<span class='notice'>This book is completely blank!</span>"
to_chat(user, "<span class='notice'>This book is completely blank!</span>")
/obj/item/weapon/book/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/pen))
if(is_blind(user))
user << "<span class='warning'> As you are trying to write on the book, you suddenly feel very stupid!</span>"
to_chat(user, "<span class='warning'> As you are trying to write on the book, you suddenly feel very stupid!</span>")
return
if(unique)
user << "<span class='warning'>These pages don't seem to take the ink well! Looks like you can't modify it.</span>"
to_chat(user, "<span class='warning'>These pages don't seem to take the ink well! Looks like you can't modify it.</span>")
return
var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel")
switch(choice)
if("Title")
var/newtitle = reject_bad_text(stripped_input(usr, "Write a new title:"))
if (length(newtitle) > 20)
usr << "That title won't fit on the cover!"
to_chat(usr, "That title won't fit on the cover!")
return
if(!newtitle)
usr << "That title is invalid."
to_chat(usr, "That title is invalid.")
return
else
name = newtitle
@@ -217,14 +217,14 @@
if("Contents")
var/content = stripped_input(usr, "Write your book's contents (HTML NOT allowed):","","",8192)
if(!content)
usr << "The content is invalid."
to_chat(usr, "The content is invalid.")
return
else
dat += content
if("Author")
var/newauthor = stripped_input(usr, "Write the author's name:")
if(!newauthor)
usr << "The name is invalid."
to_chat(usr, "The name is invalid.")
return
else
author = newauthor
@@ -234,37 +234,37 @@
else if(istype(I, /obj/item/weapon/barcodescanner))
var/obj/item/weapon/barcodescanner/scanner = I
if(!scanner.computer)
user << "[I]'s screen flashes: 'No associated computer found!'"
to_chat(user, "[I]'s screen flashes: 'No associated computer found!'")
else
switch(scanner.mode)
if(0)
scanner.book = src
user << "[I]'s screen flashes: 'Book stored in buffer.'"
to_chat(user, "[I]'s screen flashes: 'Book stored in buffer.'")
if(1)
scanner.book = src
scanner.computer.buffer_book = name
user << "[I]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'"
to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'")
if(2)
scanner.book = src
for(var/datum/borrowbook/b in scanner.computer.checkouts)
if(b.bookname == name)
scanner.computer.checkouts.Remove(b)
user << "[I]'s screen flashes: 'Book stored in buffer. Book has been checked in.'"
to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Book has been checked in.'")
return
user << "[I]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'"
to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'")
if(3)
scanner.book = src
for(var/obj/item/weapon/book in scanner.computer.inventory)
if(book == src)
user << "[I]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'"
to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'")
return
scanner.computer.inventory.Add(src)
user << "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'"
to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'")
else if(istype(I, /obj/item/weapon/kitchen/knife) || istype(I, /obj/item/weapon/wirecutters))
user << "<span class='notice'>You begin to carve out [title]...</span>"
to_chat(user, "<span class='notice'>You begin to carve out [title]...</span>")
if(do_after(user, 30, target = src))
user << "<span class='notice'>You carve out the pages from [title]! You didn't want to read it anyway.</span>"
to_chat(user, "<span class='notice'>You carve out the pages from [title]! You didn't want to read it anyway.</span>")
var/obj/item/weapon/storage/book/B = new
B.name = src.name
B.title = src.title
@@ -300,7 +300,7 @@
mode += 1
if(mode > 3)
mode = 0
user << "[src] Status Display:"
to_chat(user, "[src] Status Display:")
var/modedesc
switch(mode)
if(0)
@@ -313,9 +313,9 @@
modedesc = "Scan book to local buffer, attempt to add book to general inventory."
else
modedesc = "ERROR"
user << " - Mode [mode] : [modedesc]"
to_chat(user, " - Mode [mode] : [modedesc]")
if(computer)
user << "<font color=green>Computer has been associated with this unit.</font>"
to_chat(user, "<font color=green>Computer has been associated with this unit.</font>")
else
user << "<font color=red>No associated computer found. Only local scans will function properly.</font>"
user << "\n"
to_chat(user, "<font color=red>No associated computer found. Only local scans will function properly.</font>")
to_chat(user, "\n")
+40 -33
View File
@@ -51,14 +51,14 @@
dat += "<table>"
dat += "<tr><td>AUTHOR</td><td>TITLE</td><td>CATEGORY</td><td>SS<sup>13</sup>BN</td></tr>"
var/DBQuery/query = dbcon.NewQuery(SQLquery)
query.Execute()
while(query.NextRow())
var/author = query.item[1]
var/title = query.item[2]
var/category = query.item[3]
var/id = query.item[4]
var/DBQuery/query_library_list_books = dbcon.NewQuery(SQLquery)
if(!query_library_list_books.Execute())
dat += "<font color=red><b>ERROR</b>: Unable to retrieve book listings. Please contact your system administrator for assistance.</font><BR>"
while(query_library_list_books.NextRow())
var/author = query_library_list_books.item[1]
var/title = query_library_list_books.item[2]
var/category = query_library_list_books.item[3]
var/id = query_library_list_books.item[4]
dat += "<tr><td>[author]</td><td>[title]</td><td>[category]</td><td>[id]</td></tr>"
dat += "</table><BR>"
dat += "<A href='?src=\ref[src];back=1'>\[Go Back\]</A><BR>"
@@ -137,15 +137,15 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
if(!dbcon.Connect())
return
cachedbooks = list()
var/DBQuery/query = dbcon.NewQuery("SELECT id, author, title, category FROM [format_table_name("library")] WHERE isnull(deleted)")
query.Execute()
while(query.NextRow())
var/DBQuery/query_library_cache = dbcon.NewQuery("SELECT id, author, title, category FROM [format_table_name("library")] WHERE isnull(deleted)")
if(!query_library_cache.Execute())
return
while(query_library_cache.NextRow())
var/datum/cachedbook/newbook = new()
newbook.id = query.item[1]
newbook.author = query.item[2]
newbook.title = query.item[3]
newbook.category = query.item[4]
newbook.id = query_library_cache.item[1]
newbook.author = query_library_cache.item[2]
newbook.title = query_library_cache.item[3]
newbook.category = query_library_cache.item[4]
cachedbooks += newbook
@@ -270,9 +270,7 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
if(5)
dat += "<H3>Upload a New Title</H3>"
if(!scanner)
for(var/obj/machinery/libraryscanner/S in range(9))
scanner = S
break
findscanner(9)
if(!scanner)
dat += "<FONT color=red>No scanner found within wireless network range.</FONT><BR>"
else if(!scanner.cache)
@@ -288,6 +286,8 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
dat += "<A href='?src=\ref[src];switchscreen=0'>(Return to main menu)</A><BR>"
if(6)
dat += "<h3>Post Title to Newscaster</h3>"
if(!scanner)
scanner = findscanner(9)
if(!scanner)
dat += "<FONT color=red>No scanner found within wireless network range.</FONT><BR>"
else if(!scanner.cache)
@@ -313,6 +313,11 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
/obj/machinery/computer/libraryconsole/bookmanagement/proc/findscanner(viewrange)
for(var/obj/machinery/libraryscanner/S in range(viewrange))
return S
return null
/obj/machinery/computer/libraryconsole/bookmanagement/proc/print_forbidden_lore(mob/user)
var/spook = pick("blood", "brass")
var/turf/T = get_turf(src)
@@ -321,14 +326,14 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
else
new /obj/item/clockwork/slab(T)
user << "<span class='warning'>Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a [spook == "blood" ? "dusty old tome" : "strange metal tablet"] sitting on the desk. You don't really remember printing it.[spook == "brass" ? " And how did it print something made of metal?" : ""]</span>"
to_chat(user, "<span class='warning'>Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a [spook == "blood" ? "dusty old tome" : "strange metal tablet"] sitting on the desk. You don't really remember printing it.[spook == "brass" ? " And how did it print something made of metal?" : ""]</span>")
user.visible_message("[user] stares at the blank screen for a few moments, [user.p_their()] expression frozen in fear. When [user.p_they()] finally awaken[user.p_s()] from it, [user.p_they()] look[user.p_s()] a lot older.", 2)
/obj/machinery/computer/libraryconsole/bookmanagement/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/barcodescanner))
var/obj/item/weapon/barcodescanner/scanner = W
scanner.computer = src
user << "[scanner]'s associated machine has been set to [src]."
to_chat(user, "[scanner]'s associated machine has been set to [src].")
audible_message("[src] lets out a low, short blip.")
else
return ..()
@@ -414,9 +419,10 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
var/sqlauthor = sanitizeSQL(scanner.cache.author)
var/sqlcontent = sanitizeSQL(scanner.cache.dat)
var/sqlcategory = sanitizeSQL(upload_category)
var/DBQuery/query = dbcon.NewQuery("INSERT INTO [format_table_name("library")] (author, title, content, category, ckey, datetime) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]', '[usr.ckey]', Now())")
if(!query.Execute())
usr << query.ErrorMsg()
var/DBQuery/query_library_upload = dbcon.NewQuery("INSERT INTO [format_table_name("library")] (author, title, content, category, ckey, datetime) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]', '[usr.ckey]', Now())")
if(!query_library_upload.Execute())
alert("Database error encountered uploading to Archive")
return
else
log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs")
alert("Upload Complete. Uploaded title will be unavailable for printing for a short period")
@@ -449,13 +455,14 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
say("Printer unavailable. Please allow a short time before attempting to print.")
else
cooldown = world.time + PRINTER_COOLDOWN
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("library")] WHERE id=[sqlid] AND isnull(deleted)")
query.Execute()
while(query.NextRow())
var/author = query.item[2]
var/title = query.item[3]
var/content = query.item[4]
var/DBQuery/query_library_print = dbcon.NewQuery("SELECT * FROM [format_table_name("library")] WHERE id=[sqlid] AND isnull(deleted)")
if(!query_library_print.Execute())
say("PRINTER ERROR! Failed to print document (0x0000000F)")
return
while(query_library_print.NextRow())
var/author = query_library_print.item[2]
var/title = query_library_print.item[3]
var/content = query_library_print.item[4]
var/obj/item/weapon/book/B = new(get_turf(src))
B.name = "Book: [title]"
B.title = title
@@ -477,7 +484,7 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
say("Printer currently unavailable, please wait a moment.")
if(href_list["printposter"])
if(cooldown < world.time)
new /obj/item/weapon/poster/legit(src.loc)
new /obj/item/weapon/poster/random_official(src.loc)
cooldown = world.time + PRINTER_COOLDOWN
else
say("Printer currently unavailable, please wait a moment.")
@@ -563,7 +570,7 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
if(stat)
return
if(busy)
user << "<span class='warning'>The book binder is busy. Please wait for completion of previous operation.</span>"
to_chat(user, "<span class='warning'>The book binder is busy. Please wait for completion of previous operation.</span>")
return
if(!user.drop_item())
return
+7 -8
View File
@@ -43,19 +43,18 @@
if(prob(25))
category = null
var/c = category? " AND category='[sanitizeSQL(category)]'" :""
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("library")] WHERE isnull(deleted)[c] GROUP BY title ORDER BY rand() LIMIT [amount];") // isdeleted copyright (c) not me
if(query.Execute())
while(query.NextRow())
var/DBQuery/query_get_random_books = dbcon.NewQuery("SELECT * FROM [format_table_name("library")] WHERE isnull(deleted)[c] GROUP BY title ORDER BY rand() LIMIT [amount];") // isdeleted copyright (c) not me
if(query_get_random_books.Execute())
while(query_get_random_books.NextRow())
var/obj/item/weapon/book/B = new(location)
. += B
B.author = query.item[2]
B.title = query.item[3]
B.dat = query.item[4]
B.author = query_get_random_books.item[2]
B.title = query_get_random_books.item[3]
B.dat = query_get_random_books.item[4]
B.name = "Book: [B.title]"
B.icon_state= "book[rand(1,8)]"
else
log_game("SQL ERROR populating library bookshelf. Category: \[[category]\], Count: [amount], Error: \[[query.ErrorMsg()]\]\n")
return
/obj/structure/bookcase/random/fiction
name = "bookcase (Fiction)"
+23 -39
View File
@@ -43,76 +43,59 @@
/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."
to_chat(user, "It has [remaining_uses] uses left.")
/obj/item/soapstone/afterattack(atom/target, mob/user, proximity)
var/turf/T = get_turf(target)
if(!proximity)
return
var/obj/structure/chisel_message/existing_message = locate() in T
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>"
if(!remaining_uses && !existing_message)
to_chat(user, "<span class='warning'>[src] is too worn out to use.</span>")
return
if(!good_chisel_message_location(T))
user << "<span class='warning'>It's not appropriate to [w_engrave] on [T].</span>"
to_chat(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>")
if(existing_message)
user.visible_message("<span class='notice'>[user] starts erasing [existing_message].</span>", "<span class='notice'>You start erasing [existing_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)
if(do_after(user, tool_speed, target = existing_message))
user.visible_message("<span class='notice'>[user] erases [existing_message].</span>", "<span class='notice'>You erase [existing_message][existing_message.creator_key == user.ckey ? ", refunding a use" : ""].</span>")
existing_message.persists = FALSE
qdel(existing_message)
playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1)
if(our_message)
if(existing_message.creator_key == user.ckey)
refund_use()
return
var/message = stripped_input(user, "What would you like to [w_engrave]?", "[name] Message")
var/message = stripped_input(user, "What would you like to [w_engrave]?", "Leave a message")
if(!message)
user << "You decide not to [w_engrave] anything."
to_chat(user, "<span class='notice'>You decide not to [w_engrave] anything.</span>")
return
if(!target.Adjacent(user) && locate(/obj/structure/chisel_message) in T)
user << "You decide not to [w_engrave] anything."
to_chat(user, "<span class='warning'>Someone wrote here before you chose! Find another spot.</span>")
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())
user.visible_message("<span class='notice'>[user] starts [w_engraving] a message into [T]...</span>", "<span class='notice'>You start [w_engraving] a message into [T]...</span>", "<span class='italics'>You hear a [w_chipping] sound.</span>")
if(can_use() && do_after(user, tool_speed, target = T) && can_use()) //This looks messy but it's actually really clever!
if(!locate(/obj/structure/chisel_message in T))
user << "You [w_engrave] a message into [T]."
user.visible_message("<span class='notice'>[user] leaves a message for future spacemen!</span>", "<span class='notice'>You [w_engrave] a message into [T]!</span>", "<span class='italics'>You hear a [w_chipping] sound.</span>")
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
return remaining_uses == -1 || remaining_uses >= 0
/obj/item/soapstone/proc/remove_use()
if(remaining_uses <= 0)
// -1 == unlimited, 0 == empty
return
remaining_uses--
check_name()
@@ -158,6 +141,7 @@
desc = "A message from a past traveler."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "soapstone_message"
layer = HIGH_OBJ_LAYER
density = 0
anchored = 1
luminosity = 1
@@ -189,7 +173,7 @@
creator_name = user.real_name
creator_key = user.ckey
realdate = world.timeofday
map = MAP_NAME
map = SSmapping.config.map_name
update_icon()
/obj/structure/chisel_message/update_icon()
@@ -204,7 +188,7 @@
data["creator_name"] = creator_name
data["creator_key"] = creator_key
data["realdate"] = realdate
data["map"] = MAP_NAME
data["map"] = SSmapping.config.map_name
var/turf/T = get_turf(src)
data["x"] = T.x
data["y"] = T.y
@@ -231,7 +215,7 @@
/obj/structure/chisel_message/examine(mob/user)
..()
user << "<span class='warning'>[hidden_message]</span>"
to_chat(user, "<span class='warning'>[hidden_message]</span>")
/obj/structure/chisel_message/Destroy()
if(persists)