Merge pull request #6906 from mwerezak/faxmachine

Fax Machines
This commit is contained in:
PsiOmegaDelta
2014-11-21 08:02:21 +01:00
9 changed files with 502 additions and 493 deletions

View File

@@ -1132,6 +1132,7 @@
#include "code\modules\organs\wound.dm"
#include "code\modules\paperwork\carbonpaper.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\faxmachine.dm"
#include "code\modules\paperwork\filingcabinet.dm"
#include "code\modules\paperwork\folders.dm"
#include "code\modules\paperwork\handlabeler.dm"
@@ -1470,7 +1471,6 @@
#include "code\WorkInProgress\computer3\computers\robot.dm"
#include "code\WorkInProgress\computer3\computers\security.dm"
#include "code\WorkInProgress\computer3\computers\welcome.dm"
#include "code\WorkInProgress\kilakk\fax.dm"
#include "code\WorkInProgress\Mini\atmos_control.dm"
#include "code\WorkInProgress\Ported\policetape.dm"
#include "code\WorkInProgress\SkyMarshal\officer_stuff.dm"

View File

@@ -1,213 +0,0 @@
var/list/obj/machinery/faxmachine/allfaxes = list()
var/list/alldepartments = list("Central Command")
/obj/machinery/faxmachine
name = "fax machine"
icon = 'icons/obj/library.dmi'
icon_state = "fax"
req_one_access = list(access_lawyer, access_heads, access_armory) //Warden needs to be able to Fax solgov too.
anchored = 1
density = 1
use_power = 1
idle_power_usage = 30
active_power_usage = 200
power_channel = EQUIP
var/obj/item/weapon/card/id/scan = null // identification
var/authenticated = 0
var/obj/item/weapon/paper/tofax = null // what we're sending
var/sendcooldown = 0 // to avoid spamming fax messages
var/department = "Unknown" // our department
var/dpt = "Central Command" // the department we're sending to
/obj/machinery/faxmachine/New()
..()
allfaxes += src
if( !("[department]" in alldepartments) )
alldepartments += department
alldepartments += "Sol Government"
/obj/machinery/faxmachine/process()
return 0
/obj/machinery/faxmachine/attack_ai(mob/user as mob)
return attack_hand(user)
/obj/machinery/faxmachine/attack_hand(mob/user as mob)
user.set_machine(src)
var/dat = "Fax Machine<BR>"
var/scan_name
if(scan)
scan_name = scan.name
else
scan_name = "--------"
dat += "Confirm Identity: <a href='byond://?src=\ref[src];scan=1'>[scan_name]</a><br>"
if(authenticated)
dat += "<a href='byond://?src=\ref[src];logout=1'>{Log Out}</a>"
else
dat += "<a href='byond://?src=\ref[src];auth=1'>{Log In}</a>"
dat += "<hr>"
if(authenticated)
dat += "<b>Logged in to:</b> Central Command Quantum Entanglement Network<br><br>"
if(tofax)
dat += "<a href='byond://?src=\ref[src];remove=1'>Remove Paper</a><br><br>"
if(sendcooldown)
dat += "<b>Transmitter arrays realigning. Please stand by.</b><br>"
else
dat += "<a href='byond://?src=\ref[src];send=1'>Send</a><br>"
dat += "<b>Currently sending:</b> [tofax.name]<br>"
dat += "<b>Sending to:</b> <a href='byond://?src=\ref[src];dept=1'>[dpt]</a><br>"
else
if(sendcooldown)
dat += "Please insert paper to send via secure connection.<br><br>"
dat += "<b>Transmitter arrays realigning. Please stand by.</b><br>"
else
dat += "Please insert paper to send via secure connection.<br><br>"
else
dat += "Proper authentication is required to use this device.<br><br>"
if(tofax)
dat += "<a href ='byond://?src=\ref[src];remove=1'>Remove Paper</a><br>"
user << browse(dat, "window=copier")
onclose(user, "copier")
return
/obj/machinery/faxmachine/Topic(href, href_list)
if(href_list["send"])
if(tofax)
if(dpt == "Central Command")
Centcomm_fax(src, tofax.info, tofax.name, usr)
sendcooldown = 1800
else if(dpt == "Sol Government")
Solgov_fax(src, tofax.info, tofax.name, usr)
sendcooldown = 1800
else
SendFax(tofax.info, tofax.name, usr, dpt)
sendcooldown = 600
usr << "Message transmitted successfully."
spawn(sendcooldown) // cooldown time
sendcooldown = 0
if(href_list["remove"])
if(tofax)
if(!ishuman(usr))
usr << "<span class='warning'>You can't do it.</span>"
else
tofax.loc = usr.loc
usr.put_in_hands(tofax)
usr << "<span class='notice'>You take the paper out of \the [src].</span>"
tofax = null
if(href_list["scan"])
if (scan)
if(ishuman(usr))
scan.loc = usr.loc
if(!usr.get_active_hand())
usr.put_in_hands(scan)
scan = null
else
scan.loc = src.loc
scan = null
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
scan = I
authenticated = 0
if(href_list["dept"])
var/lastdpt = dpt
dpt = input(usr, "Which department?", "Choose a department", "") as null|anything in alldepartments
if(!dpt) dpt = lastdpt
if(href_list["auth"])
if ( (!( authenticated ) && (scan)) )
if (check_access(scan))
authenticated = 1
if(href_list["logout"])
authenticated = 0
updateUsrDialog()
/obj/machinery/faxmachine/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/paper))
if(!tofax)
user.drop_item()
tofax = O
O.loc = src
user << "<span class='notice'>You insert the paper into \the [src].</span>"
flick("faxsend", src)
updateUsrDialog()
else
user << "<span class='notice'>There is already something in \the [src].</span>"
else if(istype(O, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/idcard = O
if(!scan)
usr.drop_item()
idcard.loc = src
scan = idcard
else if(istype(O, /obj/item/weapon/wrench))
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
anchored = !anchored
user << "<span class='notice'>You [anchored ? "wrench" : "unwrench"] \the [src].</span>"
return
/proc/Centcomm_fax(var/originfax, var/sent, var/sentname, var/mob/Sender)
var/msg = "\blue <b><font color='#006100'>CENTCOMM FAX: </font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<a href='?_src_=holder;CentcommFaxReply=\ref[Sender];originfax=\ref[originfax]'>RPLY</a>)</b>: Receiving '[sentname]' via secure connection ... <a href='?_src_=holder;CentcommFaxView=\ref[sent]'>view message</a>"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
C << msg
/proc/Solgov_fax(var/originfax, var/sent, var/sentname, var/mob/Sender)
var/msg = "\blue <b><font color='#1F66A0'>SOL GOVERNMENT FAX: </font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<a href='?_src_=holder;SolGovFaxReply=\ref[Sender];originfax=\ref[originfax]'>RPLY</a>)</b>: Receiving '[sentname]' via secure connection ... <a href='?_src_=holder;CentcommFaxView=\ref[sent]'>view message</a>"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
C << msg
proc/SendFax(var/sent, var/sentname, var/mob/Sender, var/dpt)
for(var/obj/machinery/faxmachine/F in allfaxes)
if( F.department == dpt )
if(! (F.stat & (BROKEN|NOPOWER) ) )
flick("faxreceive", F)
// give the sprite some time to flick
spawn(20)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( F.loc )
P.name = "[sentname]"
P.info = "[sent]"
P.update_icon()
playsound(F.loc, "sound/items/polaroid1.ogg", 50, 1)

View File

@@ -5,7 +5,7 @@
mode = M
proc/announce_directives()
for (var/obj/machinery/faxmachine/fax in world)
for (var/obj/machinery/photocopier/faxmachine/fax in world)
if (fax.department == "Captain's Office")
var/obj/item/weapon/paper/directive_x = new(fax.loc)
directive_x.name = "emergency action message"

View File

@@ -1483,61 +1483,92 @@
log_admin("[src.owner] replied to [key_name(H)]'s illegal message with the message [input].")
H << "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your benefactor. Message as follows, agent. <b>\"[input]\"</b> Message ends.\""
else if(href_list["CentcommFaxView"])
var/info = locate(href_list["CentcommFaxView"])
else if(href_list["AdminFaxView"])
var/obj/item/fax = locate(href_list["AdminFaxView"])
if (istype(fax, /obj/item/weapon/paper))
var/obj/item/weapon/paper/P = fax
P.show_content(usr)
else if (istype(fax, /obj/item/weapon/photo))
var/obj/item/weapon/photo/H = fax
H.show(usr)
else if (istype(fax, /obj/item/weapon/paper_bundle))
//having multiple people turning pages on a paper_bundle can cause issues
//open a browse window listing the contents instead
var/data = ""
var/obj/item/weapon/paper_bundle/B = fax
for (var/page = 1, page <= B.amount, page++)
var/obj/pageobj = B.contents[page]
data += "<A href='?src=\ref[src];AdminFaxViewPage=[page];paper_bundle=\ref[B]'>Page [page] - [pageobj.name]</A><BR>"
world << data
world << "usr = [usr]"
usr << browse(data, "window=[B.name]")
else
usr << "\red The faxed item is not viewable. This is probably a bug, and should be reported on the tracker: [fax.type]"
usr << browse("<HTML><HEAD><TITLE>Centcomm Fax Message</TITLE></HEAD><BODY>[info]</BODY></HTML>", "window=Centcomm Fax Message")
else if (href_list["AdminFaxViewPage"])
var/page = text2num(href_list["AdminFaxViewPage"])
var/obj/item/weapon/paper_bundle/bundle = locate(href_list["paper_bundle"])
if (!bundle) return
if (istype(bundle.contents[page], /obj/item/weapon/paper))
var/obj/item/weapon/paper/P = bundle.contents[page]
P.show_content(src.owner, 1)
else if (istype(bundle.contents[page], /obj/item/weapon/photo))
var/obj/item/weapon/photo/H = bundle.contents[page]
H.show(src.owner)
return
else if(href_list["CentcommFaxReply"])
var/mob/living/carbon/human/H = locate(href_list["CentcommFaxReply"])
var/obj/machinery/faxmachine/fax = locate(href_list["originfax"])
var/mob/sender = locate(href_list["CentcommFaxReply"])
var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"])
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use <br> for line breaks.", "Outgoing message from Centcomm", "") as message|null
var/input = input(src.owner, "Please enter a message to reply to [key_name(sender)] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use <br> for line breaks.", "Outgoing message from Centcomm", "") as message|null
if(!input) return
var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null
// Create the reply message
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( null ) //hopefully the null loc won't cause trouble for us
P.name = "[command_name()]- [customname]"
P.info = input
P.update_icon()
// Stamps
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
stampoverlay.icon_state = "paper_stamp-cent"
if(!P.stamped)
P.stamped = new
P.stamped += /obj/item/weapon/stamp
P.overlays += stampoverlay
P.stamps += "<HR><i>This paper has been stamped by the Central Command Quantum Relay.</i>"
for(var/obj/machinery/faxmachine/F in machines)
if(F == fax)
if(! (F.stat & (BROKEN|NOPOWER) ) )
// animate! it's alive!
flick("faxreceive", F)
// give the sprite some time to flick
spawn(20)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( F.loc )
P.name = "[command_name()]- [customname]"
P.info = input
P.update_icon()
playsound(F.loc, "sound/items/polaroid1.ogg", 50, 1)
// Stamps
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
stampoverlay.icon_state = "paper_stamp-cent"
if(!P.stamped)
P.stamped = new
P.stamped += /obj/item/weapon/stamp
P.overlays += stampoverlay
P.stamps += "<HR><i>This paper has been stamped by the Central Command Quantum Relay.</i>"
src.owner << "Message reply to transmitted successfully."
log_admin("[key_name(src.owner)] replied to a fax message from [key_name(H)]: [input]")
message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(H)]", 1)
return
src.owner << "/red Unable to locate fax!"
if(fax.recievefax(P))
src.owner << "\blue Message reply to transmitted successfully."
log_admin("[key_name(src.owner)] replied to a fax message from [key_name(sender)]: [input]")
message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(sender)]", 1)
else
src.owner << "\red Message reply failed."
spawn(100)
del(P)
return
else if(href_list["SolGovFaxReply"])
//TODO
/*
var/mob/living/carbon/human/H = locate(href_list["SolGovFaxReply"])
var/obj/machinery/faxmachine/fax = locate(href_list["originfax"])
var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"])
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use <br> for line breaks.", "Outgoing message from Centcomm", "") as message|null
if(!input) return
var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null
for(var/obj/machinery/faxmachine/F in machines)
for(var/obj/machinery/photocopier/faxmachine/F in machines)
if(F == fax)
if(! (F.stat & (BROKEN|NOPOWER) ) )
@@ -1567,6 +1598,7 @@
message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(H)]", 1)
return
src.owner << "/red Unable to locate fax!"
*/

View File

@@ -0,0 +1,218 @@
var/list/obj/machinery/photocopier/faxmachine/allfaxes = list()
var/list/admin_departments = list("Central Command", "Sol Government")
var/list/alldepartments = list()
var/list/adminfaxes = list() //cache for faxes that have been sent to admins
/obj/machinery/photocopier/faxmachine
name = "fax machine"
icon = 'icons/obj/library.dmi'
icon_state = "fax"
insert_anim = "faxsend"
req_one_access = list(access_lawyer, access_heads, access_armory) //Warden needs to be able to Fax solgov too.
use_power = 1
idle_power_usage = 30
active_power_usage = 200
var/obj/item/weapon/card/id/scan = null // identification
var/authenticated = 0
var/sendcooldown = 0 // to avoid spamming fax messages
var/department = "Unknown" // our department
var/destination = "Central Command" // the department we're sending to
/obj/machinery/photocopier/faxmachine/New()
..()
allfaxes += src
if( !(("[department]" in alldepartments) || ("[department]" in admin_departments)) )
alldepartments |= department
/obj/machinery/photocopier/faxmachine/attack_hand(mob/user as mob)
user.set_machine(src)
var/dat = "Fax Machine<BR>"
var/scan_name
if(scan)
scan_name = scan.name
else
scan_name = "--------"
dat += "Confirm Identity: <a href='byond://?src=\ref[src];scan=1'>[scan_name]</a><br>"
if(authenticated)
dat += "<a href='byond://?src=\ref[src];logout=1'>{Log Out}</a>"
else
dat += "<a href='byond://?src=\ref[src];auth=1'>{Log In}</a>"
dat += "<hr>"
if(authenticated)
dat += "<b>Logged in to:</b> Central Command Quantum Entanglement Network<br><br>"
if(copyitem)
dat += "<a href='byond://?src=\ref[src];remove=1'>Remove Item</a><br><br>"
if(sendcooldown)
dat += "<b>Transmitter arrays realigning. Please stand by.</b><br>"
else
dat += "<a href='byond://?src=\ref[src];send=1'>Send</a><br>"
dat += "<b>Currently sending:</b> [copyitem.name]<br>"
dat += "<b>Sending to:</b> <a href='byond://?src=\ref[src];dept=1'>[destination]</a><br>"
else
if(sendcooldown)
dat += "Please insert paper to send via secure connection.<br><br>"
dat += "<b>Transmitter arrays realigning. Please stand by.</b><br>"
else
dat += "Please insert paper to send via secure connection.<br><br>"
else
dat += "Proper authentication is required to use this device.<br><br>"
if(copyitem)
dat += "<a href ='byond://?src=\ref[src];remove=1'>Remove Item</a><br>"
user << browse(dat, "window=copier")
onclose(user, "copier")
return
/obj/machinery/photocopier/faxmachine/Topic(href, href_list)
if(href_list["send"])
if(copyitem)
if (destination in admin_departments)
send_admin_fax(usr, destination)
else
sendfax(destination)
if (sendcooldown)
spawn(sendcooldown) // cooldown time
sendcooldown = 0
else if(href_list["remove"])
if(copyitem)
copyitem.loc = usr.loc
usr.put_in_hands(copyitem)
usr << "<span class='notice'>You take \the [copyitem] out of \the [src].</span>"
copyitem = null
updateUsrDialog()
if(href_list["scan"])
if (scan)
if(ishuman(usr))
scan.loc = usr.loc
if(!usr.get_active_hand())
usr.put_in_hands(scan)
scan = null
else
scan.loc = src.loc
scan = null
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
scan = I
authenticated = 0
if(href_list["dept"])
var/lastdestination = destination
destination = input(usr, "Which department?", "Choose a department", "") as null|anything in (alldepartments + admin_departments)
if(!destination) destination = lastdestination
if(href_list["auth"])
if ( (!( authenticated ) && (scan)) )
if (check_access(scan))
authenticated = 1
if(href_list["logout"])
authenticated = 0
updateUsrDialog()
/obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination)
if(stat & (BROKEN|NOPOWER))
return
use_power(200)
var/success = 0
for(var/obj/machinery/photocopier/faxmachine/F in allfaxes)
if( F.department == destination )
success = F.recievefax(copyitem)
if (success)
visible_message("[src] beeps, \"Message transmitted successfully.\"")
//sendcooldown = 600
else
visible_message("[src] beeps, \"Error transmitting message.\"")
/obj/machinery/photocopier/faxmachine/proc/recievefax(var/obj/item/incoming)
if(stat & (BROKEN|NOPOWER))
return 0
if(department == "Unknown")
return 0 //You can't send faxes to "Unknown"
flick("faxreceive", src)
playsound(loc, "sound/items/polaroid1.ogg", 50, 1)
// give the sprite some time to flick
sleep(20)
if (istype(incoming, /obj/item/weapon/paper))
copy(incoming)
else if (istype(incoming, /obj/item/weapon/photo))
photocopy(incoming)
else if (istype(incoming, /obj/item/weapon/paper_bundle))
bundlecopy(incoming)
else
return 0
use_power(active_power_usage)
return 1
/obj/machinery/photocopier/faxmachine/proc/send_admin_fax(var/mob/sender, var/destination)
if(stat & (BROKEN|NOPOWER))
return
use_power(200)
var/obj/item/rcvdcopy
if (istype(copyitem, /obj/item/weapon/paper))
rcvdcopy = copy(copyitem)
else if (istype(copyitem, /obj/item/weapon/photo))
rcvdcopy = photocopy(copyitem)
else if (istype(copyitem, /obj/item/weapon/paper_bundle))
rcvdcopy = bundlecopy(copyitem)
else
visible_message("[src] beeps, \"Error transmitting message.\"")
return
rcvdcopy.loc = null //hopefully this shouldn't cause trouble
adminfaxes += rcvdcopy
//message badmins that a fax has arrived
switch(destination)
if ("Central Command")
message_admins(sender, "CENTCOMM FAX", rcvdcopy, "CentcommFaxReply", "#006100")
if ("Sol Government")
message_admins(sender, "SOL GOVERNMENT FAX", rcvdcopy, "CentcommFaxReply", "#1F66A0")
//message_admins(sender, "SOL GOVERNMENT FAX", rcvdcopy, "SolGovFaxReply", "#1F66A0")
sendcooldown = 1800
sleep(50)
visible_message("[src] beeps, \"Message transmitted successfully.\"")
/obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/obj/item/sent, var/reply_type, font_colour="#006100")
var/msg = "\blue <b><font color='[font_colour]'>[faxname]: </font>[key_name(sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[sender]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=\ref[sender]'>JMP</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<a href='?_src_=holder;[reply_type]=\ref[sender];originfax=\ref[src]'>REPLY</a>)</b>: Receiving '[sent.name]' via secure connection ... <a href='?_src_=holder;AdminFaxView=\ref[sent]'>view message</a>"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
C << msg

View File

@@ -60,20 +60,20 @@
icon_state = "paper"
/obj/item/weapon/paper/examine(mob/user)
// ..() //We don't want them to see the dumb "this is a paper" thing every time.
// I didn't like the idea that people can read tiny pieces of paper from across the room.
// Now you need to be next to the paper in order to read it.
if(in_range(user, src))
if(!(istype(user, /mob/living/carbon/human) || istype(user, /mob/dead/observer) || istype(user, /mob/living/silicon)))
user << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[stars(info)][stamps]</BODY></HTML>", "window=[name]")
onclose(user, "[name]")
else
user << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[info][stamps]</BODY></HTML>", "window=[name]")
onclose(user, "[name]")
show_content(usr)
else
user << "<span class='notice'>It is too far away.</span>"
return
/obj/item/weapon/paper/proc/show_content(var/mob/user, var/forceshow=0)
if(!(istype(user, /mob/living/carbon/human) || istype(user, /mob/dead/observer) || istype(user, /mob/living/silicon)) && !forceshow)
user << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[stars(info)][stamps]</BODY></HTML>", "window=[name]")
onclose(user, "[name]")
else
user << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[info][stamps]</BODY></HTML>", "window=[name]")
onclose(user, "[name]")
/obj/item/weapon/paper/verb/rename()
set name = "Rename paper"
set category = "Object"

View File

@@ -93,55 +93,51 @@
else
user << "\red You must hold \the [P] steady to burn \the [src]."
/obj/item/weapon/paper_bundle/examine(mob/user)
if(..(user, 1))
src.attack_self(user)
src.show_content(user)
else
user << "<span class='notice'>It is too far away.</span>"
return
/obj/item/weapon/paper_bundle/proc/show_content(mob/user as mob)
var/dat
var/obj/item/weapon/W = src[page]
switch(screen)
if(0)
dat+= "<DIV STYLE='float:left; text-align:left; width:33.33333%'></DIV>"
dat+= "<DIV STYLE='float:left; text-align:center; width:33.33333%'><A href='?src=\ref[src];remove=1'>Remove [(istype(W, /obj/item/weapon/paper)) ? "paper" : "photo"]</A></DIV>"
dat+= "<DIV STYLE='float:left; text-align:right; width:33.33333%'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV><BR><HR>"
if(1)
dat+= "<DIV STYLE='float:left; text-align:left; width:33.33333%'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV>"
dat+= "<DIV STYLE='float:left; text-align:center; width:33.33333%'><A href='?src=\ref[src];remove=1'>Remove [(istype(W, /obj/item/weapon/paper)) ? "paper" : "photo"]</A></DIV>"
dat+= "<DIV STYLE='float:left; text-align:right; width:33.33333%'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV><BR><HR>"
if(2)
dat+= "<DIV STYLE='float:left; text-align:left; width:33.33333%'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV>"
dat+= "<DIV STYLE='float:left; text-align:center; width:33.33333%'><A href='?src=\ref[src];remove=1'>Remove [(istype(W, /obj/item/weapon/paper)) ? "paper" : "photo"]</A></DIV><BR><HR>"
dat+= "<DIV STYLE='float;left; text-align:right; with:33.33333%'></DIV>"
if(istype(src[page], /obj/item/weapon/paper))
var/obj/item/weapon/paper/P = W
if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/dead/observer) || istype(usr, /mob/living/silicon)))
dat+= "<HTML><HEAD><TITLE>[P.name]</TITLE></HEAD><BODY>[stars(P.info)][P.stamps]</BODY></HTML>"
else
dat+= "<HTML><HEAD><TITLE>[P.name]</TITLE></HEAD><BODY>[P.info][P.stamps]</BODY></HTML>"
user << browse(dat, "window=[name]")
else if(istype(src[page], /obj/item/weapon/photo))
var/obj/item/weapon/photo/P = W
user << browse_rsc(P.img, "tmp_photo.png")
user << browse(dat + "<html><head><title>[P.name]</title></head>" \
+ "<body style='overflow:hidden'>" \
+ "<div> <img src='tmp_photo.png' width = '180'" \
+ "[P.scribble ? "<div> Written on the back:<br><i>[P.scribble]</i>" : ]"\
+ "</body></html>", "window=[name]")
/obj/item/weapon/paper_bundle/attack_self(mob/user as mob)
if(ishuman(user))
var/mob/living/carbon/human/human_user = user
var/dat
var/obj/item/weapon/W = src[page]
switch(screen)
if(0)
dat+= "<DIV STYLE='float:left; text-align:left; width:33.33333%'></DIV>"
dat+= "<DIV STYLE='float:left; text-align:center; width:33.33333%'><A href='?src=\ref[src];remove=1'>Remove [(istype(W, /obj/item/weapon/paper)) ? "paper" : "photo"]</A></DIV>"
dat+= "<DIV STYLE='float:left; text-align:right; width:33.33333%'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV><BR><HR>"
if(1)
dat+= "<DIV STYLE='float:left; text-align:left; width:33.33333%'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV>"
dat+= "<DIV STYLE='float:left; text-align:center; width:33.33333%'><A href='?src=\ref[src];remove=1'>Remove [(istype(W, /obj/item/weapon/paper)) ? "paper" : "photo"]</A></DIV>"
dat+= "<DIV STYLE='float:left; text-align:right; width:33.33333%'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV><BR><HR>"
if(2)
dat+= "<DIV STYLE='float:left; text-align:left; width:33.33333%'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV>"
dat+= "<DIV STYLE='float:left; text-align:center; width:33.33333%'><A href='?src=\ref[src];remove=1'>Remove [(istype(W, /obj/item/weapon/paper)) ? "paper" : "photo"]</A></DIV><BR><HR>"
dat+= "<DIV STYLE='float;left; text-align:right; with:33.33333%'></DIV>"
if(istype(src[page], /obj/item/weapon/paper))
var/obj/item/weapon/paper/P = W
if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/dead/observer) || istype(usr, /mob/living/silicon)))
dat+= "<HTML><HEAD><TITLE>[P.name]</TITLE></HEAD><BODY>[stars(P.info)][P.stamps]</BODY></HTML>"
else
dat+= "<HTML><HEAD><TITLE>[P.name]</TITLE></HEAD><BODY>[P.info][P.stamps]</BODY></HTML>"
human_user << browse(dat, "window=[name]")
P.add_fingerprint(usr)
else if(istype(src[page], /obj/item/weapon/photo))
var/obj/item/weapon/photo/P = W
human_user << browse_rsc(P.img, "tmp_photo.png")
human_user << browse(dat + "<html><head><title>[P.name]</title></head>" \
+ "<body style='overflow:hidden'>" \
+ "<div> <img src='tmp_photo.png' width = '180'" \
+ "[P.scribble ? "<div> Written on the back:<br><i>[P.scribble]</i>" : ]"\
+ "</body></html>", "window=[name]")
P.add_fingerprint(usr)
add_fingerprint(usr)
update_icon()
src.show_content(user)
add_fingerprint(usr)
update_icon()
return
/obj/item/weapon/paper_bundle/Topic(href, href_list)
..()
if((src in usr.contents) || (istype(src.loc, /obj/item/weapon/folder) && (src.loc in usr.contents)))

View File

@@ -2,210 +2,159 @@
name = "photocopier"
icon = 'icons/obj/library.dmi'
icon_state = "bigscanner"
var/insert_anim = "bigscanner1"
anchored = 1
density = 1
use_power = 1
idle_power_usage = 30
active_power_usage = 200
power_channel = EQUIP
var/obj/item/weapon/paper/copy = null //what's in the copier!
var/obj/item/weapon/photo/photocopy = null
var/obj/item/weapon/paper_bundle/bundle = null
var/obj/item/copyitem = null //what's in the copier!
var/copies = 1 //how many copies to print!
var/toner = 30 //how much toner is left! woooooo~
var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier!
attack_ai(mob/user as mob)
return attack_hand(user)
/obj/machinery/photocopier/attack_ai(mob/user as mob)
return attack_hand(user)
attack_hand(mob/user as mob)
user.set_machine(src)
/obj/machinery/photocopier/attack_hand(mob/user as mob)
user.set_machine(src)
var/dat = "Photocopier<BR><BR>"
if(copy || photocopy || bundle)
dat += "<a href='byond://?src=\ref[src];remove=1'>Remove Paper</a><BR>"
if(toner)
dat += "<a href='byond://?src=\ref[src];copy=1'>Copy</a><BR>"
dat += "Printing: [copies] copies."
dat += "<a href='byond://?src=\ref[src];min=1'>-</a> "
dat += "<a href='byond://?src=\ref[src];add=1'>+</a><BR><BR>"
else if(toner)
dat += "Please insert paper to copy.<BR><BR>"
if(istype(user,/mob/living/silicon))
dat += "<a href='byond://?src=\ref[src];aipic=1'>Print photo from database</a><BR><BR>"
dat += "Current toner level: [toner]"
if(!toner)
dat +="<BR>Please insert a new toner cartridge!"
user << browse(dat, "window=copier")
onclose(user, "copier")
return
Topic(href, href_list)
if(href_list["copy"])
if(copy)
for(var/i = 0, i < copies, i++)
if(toner > 0)
copy(copy)
sleep(15)
else
break
updateUsrDialog()
else if(photocopy)
for(var/i = 0, i < copies, i++)
if(toner > 0)
photocopy(photocopy)
sleep(15)
else
break
updateUsrDialog()
else if(bundle)
for(var/i = 0, i < copies, i++)
if(toner <= 0)
break
var/obj/item/weapon/paper_bundle/p = new /obj/item/weapon/paper_bundle (src)
var/j = 0
for(var/obj/item/weapon/W in bundle)
if(toner <= 0)
usr << "<span class='notice'>The photocopier couldn't finish the printjob.</span>"
break
else if(istype(W, /obj/item/weapon/paper))
W = copy(W)
else if(istype(W, /obj/item/weapon/photo))
W = photocopy(W)
W.loc = p
p.amount++
j++
p.amount--
p.loc = src.loc
p.update_icon()
p.icon_state = "paper_words"
p.name = bundle.name
p.pixel_y = rand(-8, 8)
p.pixel_x = rand(-9, 9)
sleep(15*j)
updateUsrDialog()
else if(href_list["remove"])
if(copy)
copy.loc = usr.loc
usr.put_in_hands(copy)
usr << "<span class='notice'>You take the paper out of \the [src].</span>"
copy = null
updateUsrDialog()
else if(photocopy)
photocopy.loc = usr.loc
usr.put_in_hands(photocopy)
usr << "<span class='notice'>You take the photo out of \the [src].</span>"
photocopy = null
updateUsrDialog()
else if(bundle)
bundle.loc = usr.loc
usr.put_in_hands(bundle)
usr << "<span class='notice'>You take the paper bundle out of \the [src].</span>"
bundle = null
updateUsrDialog()
else if(href_list["min"])
if(copies > 1)
copies--
updateUsrDialog()
else if(href_list["add"])
if(copies < maxcopies)
copies++
updateUsrDialog()
else if(href_list["aipic"])
if(!istype(usr,/mob/living/silicon)) return
if(toner >= 5)
var/mob/living/silicon/tempAI = usr
var/obj/item/device/camera/siliconcam/camera = tempAI.aiCamera
if(!camera)
return
var/obj/item/weapon/photo/selection = camera.selectpicture()
if (!selection)
return
var/obj/item/weapon/photo/p = photocopy(selection)
p.loc = src.loc
if (p.desc == "")
p.desc += "Copy by [tempAI.name]"
else
p.desc += " - Copy by [tempAI.name]"
var/dat = "Photocopier<BR><BR>"
if(copyitem)
dat += "<a href='byond://?src=\ref[src];remove=1'>Remove Item</a><BR>"
if(toner)
dat += "<a href='byond://?src=\ref[src];copy=1'>Copy</a><BR>"
dat += "Printing: [copies] copies."
dat += "<a href='byond://?src=\ref[src];min=1'>-</a> "
dat += "<a href='byond://?src=\ref[src];add=1'>+</a><BR><BR>"
else if(toner)
dat += "Please insert something to copy.<BR><BR>"
if(istype(user,/mob/living/silicon))
dat += "<a href='byond://?src=\ref[src];aipic=1'>Print photo from database</a><BR><BR>"
dat += "Current toner level: [toner]"
if(!toner)
dat +="<BR>Please insert a new toner cartridge!"
user << browse(dat, "window=copier")
onclose(user, "copier")
return
/obj/machinery/photocopier/Topic(href, href_list)
if(href_list["copy"])
if(stat & (BROKEN|NOPOWER))
return
for(var/i = 0, i < copies, i++)
if(toner <= 0)
break
if (istype(copyitem, /obj/item/weapon/paper))
copy(copyitem)
sleep(15)
else if (istype(copyitem, /obj/item/weapon/photo))
photocopy(copyitem)
sleep(15)
else if (istype(copyitem, /obj/item/weapon/paper_bundle))
var/obj/item/weapon/paper_bundle/B = bundlecopy(copyitem)
sleep(15*B.amount)
else
usr << "<span class='notice'>The photocopier couldn't finish the printjob.</span>"
usr << "<span class='warning'>\The [copyitem] can't be copied by \the [src].</span>"
break
use_power(active_power_usage)
updateUsrDialog()
else if(href_list["remove"])
if(copyitem)
copyitem.loc = usr.loc
usr.put_in_hands(copyitem)
usr << "<span class='notice'>You take \the [copyitem] out of \the [src].</span>"
copyitem = null
updateUsrDialog()
else if(href_list["min"])
if(copies > 1)
copies--
updateUsrDialog()
else if(href_list["add"])
if(copies < maxcopies)
copies++
updateUsrDialog()
else if(href_list["aipic"])
if(!istype(usr,/mob/living/silicon)) return
if(stat & (BROKEN|NOPOWER)) return
if(toner >= 5)
var/mob/living/silicon/tempAI = usr
var/obj/item/device/camera/siliconcam/camera = tempAI.aiCamera
attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/paper))
if(!copy && !photocopy && !bundle)
user.drop_item()
copy = O
O.loc = src
user << "<span class='notice'>You insert the paper into \the [src].</span>"
flick("bigscanner1", src)
updateUsrDialog()
else
user << "<span class='notice'>There is already something in \the [src].</span>"
else if(istype(O, /obj/item/weapon/photo))
if(!copy && !photocopy && !bundle)
user.drop_item()
photocopy = O
O.loc = src
user << "<span class='notice'>You insert the photo into \the [src].</span>"
flick("bigscanner1", src)
updateUsrDialog()
else
user << "<span class='notice'>There is already something in \the [src].</span>"
else if(istype(O, /obj/item/weapon/paper_bundle))
if(!copy && !photocopy && !bundle)
user.drop_item()
bundle = O
O.loc = src
user << "<span class='notice'>You insert the bundle into \the [src].</span>"
flick("bigscanner1", src)
updateUsrDialog()
else if(istype(O, /obj/item/device/toner))
if(toner == 0)
user.drop_item()
del(O)
toner = 30
user << "<span class='notice'>You insert the toner cartridge into \the [src].</span>"
updateUsrDialog()
else
user << "<span class='notice'>This cartridge is not yet ready for replacement! Use up the rest of the toner.</span>"
else if(istype(O, /obj/item/weapon/wrench))
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
anchored = !anchored
user << "<span class='notice'>You [anchored ? "wrench" : "unwrench"] \the [src].</span>"
return
if(!camera)
return
var/datum/picture/selection = camera.selectpicture()
if (!selection)
return
ex_act(severity)
switch(severity)
if(1.0)
del(src)
if(2.0)
if(prob(50))
del(src)
else
if(toner > 0)
new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
toner = 0
var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (src.loc)
p.construct(selection)
if (p.desc == "")
p.desc += "Copied by [tempAI.name]"
else
if(prob(50))
if(toner > 0)
new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
toner = 0
return
p.desc += " - Copied by [tempAI.name]"
toner -= 5
sleep(15)
updateUsrDialog()
blob_act()
if(prob(50))
del(src)
/obj/machinery/photocopier/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/paper) || istype(O, /obj/item/weapon/photo) || istype(O, /obj/item/weapon/paper_bundle))
if(!copyitem)
user.drop_item()
copyitem = O
O.loc = src
user << "<span class='notice'>You insert \the [O] into \the [src].</span>"
flick(insert_anim, src)
updateUsrDialog()
else
if(toner > 0)
new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
toner = 0
return
user << "<span class='notice'>There is already something in \the [src].</span>"
else if(istype(O, /obj/item/device/toner))
if(toner <= 10) //allow replacing when low toner is affecting the print darkness
user.drop_item()
user << "<span class='notice'>You insert the toner cartridge into \the [src].</span>"
var/obj/item/device/toner/T = O
toner += T.toner_amount
del(O)
updateUsrDialog()
else
user << "<span class='notice'>This cartridge is not yet ready for replacement! Use up the rest of the toner.</span>"
else if(istype(O, /obj/item/weapon/wrench))
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
anchored = !anchored
user << "<span class='notice'>You [anchored ? "wrench" : "unwrench"] \the [src].</span>"
return
/obj/machinery/photocopier/ex_act(severity)
switch(severity)
if(1.0)
del(src)
if(2.0)
if(prob(50))
del(src)
else
if(toner > 0)
new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
toner = 0
else
if(prob(50))
if(toner > 0)
new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
toner = 0
return
/obj/machinery/photocopier/blob_act()
if(prob(50))
del(src)
else
if(toner > 0)
new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
toner = 0
return
/obj/machinery/photocopier/proc/copy(var/obj/item/weapon/paper/copy)
var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc)
@@ -239,6 +188,8 @@
c.overlays += img
c.updateinfolinks()
toner--
if(toner == 0)
visible_message("<span class='notice'>A red light on \the [src] flashes, indicating that it is out of toner.</span>")
return c
@@ -258,9 +209,34 @@
toner -= 5 //photos use a lot of ink!
if(toner < 0)
toner = 0
visible_message("<span class='notice'>A red light on \the [src] flashes, indicating that it is out of toner.</span>")
return p
//If need_toner is 0, the copies will still be lightened when low on toner, however it will not be prevented from printing. TODO: Implement print queues for fax machines and get rid of need_toner
/obj/machinery/photocopier/proc/bundlecopy(var/obj/item/weapon/paper_bundle/bundle, var/need_toner=1)
var/obj/item/weapon/paper_bundle/p = new /obj/item/weapon/paper_bundle (src)
for(var/obj/item/weapon/W in bundle)
if(toner <= 0 && need_toner)
toner = 0
visible_message("<span class='notice'>A red light on \the [src] flashes, indicating that it is out of toner.</span>")
break
if(istype(W, /obj/item/weapon/paper))
W = copy(W)
else if(istype(W, /obj/item/weapon/photo))
W = photocopy(W)
W.loc = p
p.amount++
//p.amount--
p.loc = src.loc
p.update_icon()
p.icon_state = "paper_words"
p.name = bundle.name
p.pixel_y = rand(-8, 8)
p.pixel_x = rand(-9, 9)
return p
/obj/item/device/toner
name = "toner cartridge"
icon_state = "tonercartridge"
var/toner_amount = 30

View File

@@ -256,7 +256,7 @@
"aeV" = (/obj/structure/closet{name = "Evidence Closet"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/brig)
"aeW" = (/obj/structure/filingcabinet,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos)
"aeX" = (/obj/machinery/computer/secure_data,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos)
"aeY" = (/obj/structure/table,/obj/machinery/faxmachine{department = "Warden's Office"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden)
"aeY" = (/obj/structure/table,/obj/machinery/photocopier/faxmachine{department = "Warden's Office"},/turf/simulated/floor{icon_state = "dark"},/area/security/warden)
"aeZ" = (/obj/machinery/computer/security,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos)
"afa" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos)
"afb" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/security/warden)
@@ -532,7 +532,7 @@
"akl" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/security/brig)
"akm" = (/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement 2"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/brig)
"akn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
"ako" = (/obj/structure/table/reinforced,/obj/machinery/faxmachine{anchored = 0; department = "Internal Affairs"},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
"ako" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{anchored = 0; department = "Internal Affairs"},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
"akp" = (/obj/structure/flora/pottedplant{tag = "icon-plant-10"; icon_state = "plant-10"},/obj/machinery/light{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"akq" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"akr" = (/obj/structure/disposalpipe/segment,/obj/structure/closet/secure_closet/detective,/obj/item/weapon/reagent_containers/food/drinks/flask/detflask,/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
@@ -788,7 +788,7 @@
"aph" = (/obj/structure/flora/pottedplant{tag = "icon-plant-22"; icon_state = "plant-22"},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main)
"api" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos)
"apj" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/item/weapon/stamp,/obj/item/weapon/stamp/denied{pixel_x = 5},/turf/simulated/floor{icon_state = "dark"},/area/security/warden)
"apk" = (/obj/structure/table/woodentable,/obj/machinery/keycard_auth{pixel_x = 30},/obj/machinery/faxmachine{department = "Head of Security"},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos)
"apk" = (/obj/structure/table/woodentable,/obj/machinery/keycard_auth{pixel_x = 30},/obj/machinery/photocopier/faxmachine{department = "Head of Security"},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos)
"apl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos)
"apm" = (/obj/structure/table/woodentable,/obj/item/device/megaphone,/obj/item/device/radio/off,/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos)
"apn" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/crew_quarters/heads/hos)
@@ -1674,7 +1674,7 @@
"aGj" = (/obj/structure/closet/wardrobe/chaplain_black,/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office)
"aGk" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep)
"aGl" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"aGm" = (/obj/structure/table/woodentable,/obj/machinery/faxmachine{department = "Bridge"},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"aGm" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Bridge"},/turf/simulated/floor/wood,/area/bridge/meeting_room)
"aGn" = (/obj/structure/table/reinforced,/obj/machinery/door/poddoor/shutters{dir = 2; id = "bar"; layer = 3.1; name = "Bar Shutters"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aGo" = (/obj/structure/closet/coffin,/obj/machinery/door/window/eastleft{name = "Coffin Storage"; req_access_txt = "22"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main)
"aGp" = (/obj/item/weapon/book/manual/security_space_law,/obj/structure/table/woodentable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/bridge/meeting_room)
@@ -2046,7 +2046,7 @@
"aNr" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/arrivals)
"aNs" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/hallway/primary/central_one)
"aNt" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; name = "Locker Room"; sortType = "Locker Room"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/crew_quarters/locker)
"aNu" = (/obj/structure/table,/obj/machinery/faxmachine{anchored = 1; department = "Vacant Office"},/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/security/vacantoffice)
"aNu" = (/obj/structure/table,/obj/machinery/photocopier/faxmachine{anchored = 1; department = "Vacant Office"},/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/security/vacantoffice)
"aNv" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/decal/cleanable/blood/oil,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/locker)
"aNw" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/evahallway)
"aNx" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plating,/area/maintenance/evahallway)
@@ -3867,7 +3867,7 @@
"bws" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/hallway/primary/aft)
"bwt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/research)
"bwu" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/door_control{desc = "A remote control-switch for engine core."; id = "EngineVent"; name = "Engine Ventillatory Control"; pixel_x = -24; pixel_y = 10; req_access_txt = "10"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door_control{desc = "A remote control-switch for the engine core airlock hatch bolts."; id = "engine_access_hatch"; name = "Engine Hatch Bolt Control"; normaldoorcontrol = 1; pixel_x = -24; pixel_y = -10; req_access_txt = "10"; specialfunctions = 4},/turf/simulated/floor,/area/crew_quarters/heads/chief)
"bwv" = (/obj/structure/table/reinforced,/obj/machinery/faxmachine{department = "Chief Engineer's Office"},/turf/simulated/floor,/area/crew_quarters/heads/chief)
"bwv" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Chief Engineer's Office"},/turf/simulated/floor,/area/crew_quarters/heads/chief)
"bww" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/clothing/glasses/welding/superior,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/book/manual/supermatter_engine,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/heads/chief)
"bwx" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/central_two)
"bwy" = (/obj/structure/disposalpipe/segment,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two)
@@ -3896,7 +3896,7 @@
"bwV" = (/obj/machinery/light{dir = 1},/obj/structure/bookcase/manuals/medical,/obj/item/weapon/book/manual/stasis,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak)
"bwW" = (/turf/simulated/wall,/area/crew_quarters/medbreak)
"bwX" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper)
"bwY" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/table,/obj/machinery/faxmachine{department = "CMO's Office"},/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/crew_quarters/heads/cmo)
"bwY" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/table,/obj/machinery/photocopier/faxmachine{department = "CMO's Office"},/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/crew_quarters/heads/cmo)
"bwZ" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
"bxa" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/hallway/primary/central_one)
"bxb" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
@@ -4071,7 +4071,7 @@
"bAo" = (/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bAp" = (/turf/simulated/floor,/area/hallway/secondary/entry/aft)
"bAq" = (/turf/simulated/wall,/area/medical/genetics)
"bAr" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light,/obj/structure/table,/obj/machinery/faxmachine{department = "Research Director's Office"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hop)
"bAr" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/light,/obj/structure/table,/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hop)
"bAs" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/table,/obj/item/weapon/storage/box/botanydisk,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora)
"bAt" = (/obj/structure/table,/obj/item/weapon/cartridge/signal/science,/obj/item/weapon/cartridge/signal/science{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/science{pixel_x = 4; pixel_y = 6},/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("SS13","Research")},/obj/item/clothing/glasses/welding/superior,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bAu" = (/obj/structure/closet/secure_closet/RD,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
@@ -4887,7 +4887,7 @@
"bPY" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room)
"bPZ" = (/turf/simulated/wall,/area/medical/medbay2)
"bQa" = (/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/camera{c_tag = "Messaging Server"; dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room)
"bQb" = (/obj/structure/table,/obj/machinery/faxmachine{department = "Head of Personnel's Office"},/turf/simulated/floor,/area/crew_quarters/heads/hop)
"bQb" = (/obj/structure/table,/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/turf/simulated/floor,/area/crew_quarters/heads/hop)
"bQc" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/crew_quarters/heads/hop)
"bQd" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Cloning Laboratory"; req_access_txt = "5"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/cryo)
"bQe" = (/obj/machinery/camera{c_tag = "Mining Dock External"; dir = 8},/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor{icon_state = "warning"},/area/quartermaster/miningdock)
@@ -4983,7 +4983,7 @@
"bRQ" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/substation/command)
"bRR" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/camera{c_tag = "Command Substation"; dir = 2; network = list("SS13","Engineering")},/obj/machinery/power/smes/buildable{charge = 0},/turf/simulated/floor/plating,/area/maintenance/substation/command)
"bRS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bRT" = (/obj/machinery/faxmachine{department = "Captain's Office"},/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bRT" = (/obj/machinery/photocopier/faxmachine{department = "Captain's Office"},/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bRU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"bRV" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/cryo)
"bRW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)