Large bureaucracy overhaul.

This affects clipboards, hand labelers, paper, paper bins, pens, photocopiers, and stamps.
Everything (that I've changed significantly) should be BETTER.

NO paths have been changed.
All of the above have been added to the paperwork module (pending rename to bureaucracy, which is COOLER).
SPRITES for most of the above (except photocopiers) are now in bureaucracy.dmi.

Clipboards in particular are MASSIVELY IMPROVED.
Hand labelers can now be turned ON AND OFF, to make it simpler to avoid labelling tables.
This includes work in progress FOLDERS, which currently do NOTHING.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3253 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
petethegoat@gmail.com
2012-03-05 00:23:05 +00:00
parent d5bff25b5b
commit 0a0f97ef0c
16 changed files with 775 additions and 878 deletions
+135
View File
@@ -0,0 +1,135 @@
/obj/item/weapon/clipboard
name = "clipboard"
icon = 'bureaucracy.dmi'
icon_state = "clipboard"
item_state = "clipboard"
throwforce = 0
w_class = 2.0
throw_speed = 3
throw_range = 10
var/obj/item/weapon/pen/haspen //The stored pen.
var/obj/item/weapon/paper/toppaper //The topmost piece of paper.
/obj/item/weapon/clipboard/MouseDrop(obj/over_object as obj) //Quick clipboard fix. -Agouri
if(ishuman(usr) || ismonkey(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~
var/mob/M = usr
if (!(istype(over_object, /obj/screen) ))
return ..()
if((!(M.restrained()) && !(M.stat)))
if(over_object.name == "r_hand")
if(!(M.r_hand))
M.u_equip(src)
M.r_hand = src
else
if(over_object.name == "l_hand")
if(!(M.l_hand))
M.u_equip(src)
M.l_hand = src
M.update_clothing()
src.add_fingerprint(usr)
return
/obj/item/weapon/clipboard/update_icon()
overlays = null
if(toppaper)
overlays += toppaper.icon_state
overlays += toppaper.overlays
if(haspen)
overlays += "clipboard_pen"
overlays += "clipboard_over"
return
/obj/item/weapon/clipboard/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/paper))
user.drop_item()
W.loc = src
toppaper = W
user << "\blue You clip the paper onto the clipboard."
update_icon()
else if(toppaper)
toppaper.attackby(usr.get_active_hand(), usr)
update_icon()
return
/obj/item/weapon/clipboard/attack_self(mob/user as mob)
var/dat = "<title>Clipboard</title>"
if (haspen)
dat += "<A href='?src=\ref[src];pen=1'>Remove Pen</A><BR><HR>"
else
dat += "<A href='?src=\ref[src];addpen=1'>Add Pen</A><BR><HR>"
//The topmost paper. I don't think there's any way to organise contents in byond, so this is what we're stuck with. -Pete
if(toppaper)
var/obj/item/weapon/paper/P = toppaper
dat += "<A href='?src=\ref[src];write=\ref[P]'>Write</A> <A href='?src=\ref[src];remove=\ref[P]'>Remove</A> - <A href='?src=\ref[src];read=\ref[P]'>[P.name]</A><BR><HR>"
for(P in src)
if(P == toppaper)
continue
dat += "<A href='?src=\ref[src];write=\ref[P]'>Write</A> <A href='?src=\ref[src];remove=\ref[P]'>Remove</A> <A href='?src=\ref[src];top=\ref[P]'>Move to top</A> - <A href='?src=\ref[src];read=\ref[P]'>[P.name]</A><BR>"
user << browse(dat, "window=clipboard")
onclose(user, "clipboard")
add_fingerprint(usr)
return
/obj/item/weapon/clipboard/Topic(href, href_list)
..()
if ((usr.stat || usr.restrained()))
return
if (usr.contents.Find(src))
if(href_list["pen"])
if(haspen)
haspen.loc = usr.loc
if(ishuman(usr))
if(!usr.get_active_hand())
usr.put_in_hand(haspen)
haspen = null
if(href_list["addpen"])
if(!haspen)
if(istype(usr.get_active_hand(), /obj/item/weapon/pen))
var/obj/item/weapon/pen/W = usr.get_active_hand()
usr.drop_item()
W.loc = src
haspen = W
usr << "\blue You slot the pen into the clipboard."
if(href_list["write"])
var/obj/item/P = locate(href_list["write"])
if(P)
if(usr.get_active_hand())
P.attackby(usr.get_active_hand(), usr)
if(href_list["remove"])
var/obj/item/P = locate(href_list["remove"])
if(P)
P.loc = usr.loc
if(ishuman(usr))
if(!usr.get_active_hand())
usr.put_in_hand(P)
else
P.loc = get_turf(usr)
if(P == toppaper)
var/obj/item/weapon/paper/newtop = locate(/obj/item/weapon/paper in src)
if(newtop && newtop != toppaper)
toppaper = newtop
else
toppaper = null
if(href_list["read"])
var/obj/item/P = locate(href_list["read"])
if(P)
P.examine(usr)
if(href_list["top"])
var/obj/item/P = locate(href_list["top"])
if(P)
toppaper = P
usr << "You move [P.name] to the top."
//Update everything
attack_self(usr)
update_icon()
return
+22
View File
@@ -0,0 +1,22 @@
//THIS IS OBVIOUSLY WIP, SORRY -PETE
/obj/item/weapon/folder
name = "folder"
desc = "A folder."
icon = 'bureaucracy.dmi'
icon_state = "folder"
w_class = 2
/obj/item/weapon/folder/blue
desc = "A blue folder."
icon_state = "folder_blue"
/obj/item/weapon/folder/red
desc = "A red folder."
icon_state = "folder_red"
/obj/item/weapon/folder/yellow
desc = "A yellow folder."
icon_state = "folder_yellow"
/obj/item/weapon/folder/attack_self()
usr << "lol!"
+53
View File
@@ -0,0 +1,53 @@
/obj/item/weapon/hand_labeler
name = "Hand labeler"
icon = 'bureaucracy.dmi'
icon_state = "labeler0"
item_state = "flight"
var/label = null
var/labels_left = 30
var/mode = 0 //off or on.
/obj/item/weapon/hand_labeler/afterattack(atom/A, mob/user as mob)
if(!mode) //if it's off, give up.
return
if(A==loc) // if placing the labeller into something (e.g. backpack)
return // don't set a label
if(!labels_left)
user << "\blue No labels left."
return
if(!label || !length(label))
user << "\blue No text set."
return
if(length(A.name) + length(label) > 64)
user << "\blue Label too big."
return
if(ishuman(A))
user << "\blue You can't label humans."
return
if(issilicon(A))
user << "\blue You can't label cyborgs."
return
for(var/mob/M in viewers())
if ((M.client && !( M.blinded )))
M << "\blue [user] labels [A] as [label]."
A.name = "[A.name] ([label])"
/obj/item/weapon/hand_labeler/attack_self()
mode = !mode
icon_state = "labeler[mode]"
if(mode)
usr << "\blue You turn on the hand labeler."
//Now let them chose the text.
var/str = input(usr,"Label text?","Set label","")
if(!str || !length(str))
usr << "\red Invalid text."
return
if(length(str) > 64)
usr << "\red Text too long."
return
label = str
usr << "\blue You set the text to '[str]'."
else
usr << "\blue You turn off the hand labeler."
+186
View File
@@ -0,0 +1,186 @@
/obj/item/weapon/paper
name = "paper"
gender = PLURAL
icon = 'bureaucracy.dmi'
icon_state = "paper"
throwforce = 0
w_class = 1.0
throw_speed = 3
throw_range = 15
layer = 4
var/info //What's actually written on the paper.
var/stamps //The (text for the) stamps on the paper.
var/list/stamped
var/see_face = 1
var/body_parts_covered = HEAD
/obj/item/weapon/paper/New()
..()
src.pixel_y = rand(-8, 8)
src.pixel_x = rand(-9, 9)
spawn(2)
if(src.info)
src.overlays += "paper_words"
return
/obj/item/weapon/paper/update_icon()
if(src.info)
src.overlays += "paper_words"
return
/obj/item/weapon/paper/examine(mob/user as mob)
set src in oview(1)
//I think this is the best way to handle this! Shout at me if it isn't! -Pete
if(!user)
user = usr
// ..() //We don't want them to see the dumb "this is a paper" thing every time.
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]")
return
/obj/item/weapon/paper/verb/rename()
set name = "Rename paper"
set category = "Object"
set src in usr
if ((usr.mutations & CLUMSY) && prob(50))
usr << "\red You cut yourself on the paper."
return
var/n_name = input(usr, "What would you like to label the paper?", "Paper Labelling", null) as text
n_name = copytext(n_name, 1, 32)
if ((loc == usr && usr.stat == 0))
name = "paper[(n_name ? text("- '[n_name]'") : null)]"
add_fingerprint(usr)
return
/obj/item/weapon/paper/attack_self(mob/living/user as mob)
examine()
return
/obj/item/weapon/paper/attack_ai(var/mob/living/silicon/ai/user as mob)
var/dist
if (istype(user) && user.current) //is AI
dist = get_dist(src, user.current)
else //cyborg or AI not seeing through a camera
dist = get_dist(src, user)
if (dist < 2)
usr << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[info][stamps]</BODY></HTML>", "window=[name]")
onclose(usr, "[name]")
else
usr << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[stars(info)][stamps]</BODY></HTML>", "window=[name]")
onclose(usr, "[name]")
return
/obj/item/weapon/paper/attackby(obj/item/weapon/P as obj, mob/user as mob)
..()
var/clown = 0
if(user.mind && (user.mind.assigned_role == "Clown"))
clown = 1
if (istype(P, /obj/item/weapon/pen))
var/t = strip_html_simple(input(user, "What text do you wish to add?", "[name]", null),8192) as message
if ((!in_range(src, usr) && src.loc != user && !( istype(src.loc, /obj/item/weapon/clipboard) ) && src.loc.loc != user && user.equipped() != P))
return
t = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
t = dd_replacetext(t, "\[center\]", "<center>")
t = dd_replacetext(t, "\[/center\]", "</center>")
t = dd_replacetext(t, "\[list\]", "<ul>")
t = dd_replacetext(t, "\[/list\]", "</ul>")
t = dd_replacetext(t, "\[*\]", "<li>")
t = dd_replacetext(t, "\[*\]", "<li>")
t = dd_replacetext(t, "\[br\]", "<BR>")
t = dd_replacetext(t, "\[hr\]", "<HR>")
t = dd_replacetext(t, "\[b\]", "<B>")
t = dd_replacetext(t, "\[/b\]", "</B>")
t = dd_replacetext(t, "\[i\]", "<I>")
t = dd_replacetext(t, "\[/i\]", "</I>")
t = dd_replacetext(t, "\[u\]", "<U>")
t = dd_replacetext(t, "\[/u\]", "</U>")
t = dd_replacetext(t, "\[small\]", "<font size = \"1\">")
t = dd_replacetext(t, "\[/small\]", "</font>")
t = dd_replacetext(t, "\[large\]", "<font size = \"4\">")
t = dd_replacetext(t, "\[/large\]", "</font>")
t = dd_replacetext(t, "\[sign\]", "<font face=vivaldi>[user.real_name]</font>")
var/obj/item/weapon/pen/i = P
t = "<font face=calligrapher color=[i.colour]>[t]</font>"
if(!overlays.Find("paper_words"))
overlays += "paper_words"
info += t
return
if(istype(P, /obj/item/toy/crayon))
var/t = strip_html_simple(input(user, "What text do you wish to add?", "[name]", null),8192) as message
if ((!in_range(src, usr) && src.loc != user && !( istype(src.loc, /obj/item/weapon/clipboard) ) && src.loc.loc != user && user.equipped() != P))
return
t = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
t = dd_replacetext(t, "\[center\]", "<center>")
t = dd_replacetext(t, "\[/center\]", "</center>")
t = dd_replacetext(t, "\[br\]", "<BR>")
t = dd_replacetext(t, "\[b\]", "")
t = dd_replacetext(t, "\[/b\]", "")
t = dd_replacetext(t, "\[i\]", "<I>")
t = dd_replacetext(t, "\[/i\]", "</I>")
t = dd_replacetext(t, "\[u\]", "<U>")
t = dd_replacetext(t, "\[/u\]", "</U>")
t = dd_replacetext(t, "\[large\]", "<font size = \"4\">")
t = dd_replacetext(t, "\[/large\]", "</font>")
t = dd_replacetext(t, "\[sign\]", "<I>[user.real_name]</I>")
var/obj/item/toy/crayon/i = P
t = "<font face=\"Comic Sans MS\" color=[i.colour]><B>[t]</B></font>"
if(!overlays.Find("paper_words"))
overlays += "paper_words"
info += t
return
else
if(istype(P, /obj/item/weapon/stamp))
if ((!in_range(src, usr) && src.loc != user && !( istype(src.loc, /obj/item/weapon/clipboard) ) && src.loc.loc != user && user.equipped() != P))
return
if(stamps)
stamps += "<BR><i>This paper has been stamped with the [P.name].</i>"
else
stamps += "<HR><i>This paper has been stamped with the [P.name].</i>"
switch(P.type)
if(/obj/item/weapon/stamp/captain)
overlays += "paper_stamped_cap"
if(/obj/item/weapon/stamp/hop)
overlays += "paper_stamped_hop"
if(/obj/item/weapon/stamp/hos)
overlays += "paper_stamped_hos"
if(/obj/item/weapon/stamp/ce)
overlays += "paper_stamped_ce"
if(/obj/item/weapon/stamp/rd)
overlays += "paper_stamped_rd"
if(/obj/item/weapon/stamp/cmo)
overlays += "paper_stamped_cmo"
if(/obj/item/weapon/stamp/denied)
overlays += "paper_stamped_denied"
if(/obj/item/weapon/stamp/clown)
if (!clown)
usr << "\red You are totally unable to use the stamp. HONK!"
return
else
overlays += "paper_stamped_clown"
else
overlays += "paper_stamped"
if(!stamped)
stamped = new
stamped += P.type
user << "\blue You stamp the paper with your rubber stamp."
add_fingerprint(user)
return
+65
View File
@@ -0,0 +1,65 @@
/obj/item/weapon/paper_bin
name = "paper bin"
icon = 'bureaucracy.dmi'
icon_state = "paper_bin1"
item_state = "sheet-metal"
throwforce = 1
w_class = 3
throw_speed = 3
throw_range = 7
var/amount = 30 //How much paper is in the bin.
/obj/item/weapon/paper_bin/MouseDrop(mob/user as mob)
if ((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr))))))
if (usr.hand)
if (!( usr.l_hand ))
spawn( 0 )
src.attack_hand(usr, 1, 1)
return
else
if (!( usr.r_hand ))
spawn( 0 )
src.attack_hand(usr, 0, 1)
return
return
/obj/item/weapon/paper_bin/attack_paw(mob/user as mob)
return src.attack_hand(user)
/obj/item/weapon/paper_bin/attack_hand(mob/user as mob)
if (amount >= 1)
amount--
update_icon()
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper
P.loc = user.loc
if(ishuman(user))
if(!user.get_active_hand())
user.put_in_hand(P)
user << "You take a paper out of the bin."
else
P.loc = get_turf_loc(src)
user << "You take a paper out of the bin."
else
user << "The paper bin is empty!"
add_fingerprint(user)
return
/obj/item/weapon/paper_bin/examine()
set src in oview(1)
if(amount)
if(amount > 1)
usr << "There are [amount] papers in the bin."
else
usr << "There is one paper in the bin."
else
usr << "There are no papers in the bin."
return
/obj/item/weapon/paper_bin/update_icon()
if(amount < 1)
icon_state = "paper_bin0"
else
icon_state = "paper_bin1"
+22
View File
@@ -0,0 +1,22 @@
/obj/item/weapon/pen
desc = "It's a normal black ink pen."
name = "pen"
icon = 'bureaucracy.dmi'
icon_state = "pen"
flags = FPRINT | ONBELT | TABLEPASS
throwforce = 0
w_class = 1.0
throw_speed = 7
throw_range = 15
m_amt = 10
var/colour = "black" //what colour the ink is!
/obj/item/weapon/pen/blue
desc = "It's a normal blue ink pen."
icon_state = "pen_blue"
colour = "blue"
/obj/item/weapon/pen/red
desc = "It's a normal red ink pen."
icon_state = "pen_red"
colour = "red"
+135
View File
@@ -0,0 +1,135 @@
/obj/machinery/photocopier
name = "Photocopier"
icon = 'library.dmi'
icon_state = "bigscanner"
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/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!
/obj/machinery/photocopier/attack_ai(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/photocopier/attack_paw(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/photocopier/attack_hand(mob/user as mob)
user.machine = src
var/dat = "Photocopier<BR><BR>"
if(copy)
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>"
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(copy)
for(var/i = 0, i < copies, i++)
if(toner > 0)
var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (src.loc)
if(toner > 10) //lots of toner, make it dark
c.info = "<font color = #101010>"
else //no toner? shitty copies for you!
c.info = "<font color = #808080>"
var/copied = html_decode(copy.info)
copied = dd_replacetext(copied, "<font face=calligrapher color=", "<font face=calligrapher nocolor=") //state of the art techniques in action
copied = dd_replacetext(copied, "<font face=\"Comic Sans MS\" color=", "<font face=\"Comic Sans MS\" nocolor=") //This basically just breaks the existing color tag, which we need to do because the innermost tag takes priority.
c.info += copied
c.info += "</font>"
c.name = copy.name // -- Doohl
toner--
sleep(15)
else
break
updateUsrDialog()
if(href_list["remove"])
if(copy)
if(ishuman(usr))
if(!usr.get_active_hand())
copy.loc = usr.loc
usr.put_in_hand(copy)
usr << "You take the paper out of the photocopier."
copy = null
updateUsrDialog()
if(href_list["min"])
if(copies > 1)
copies--
updateUsrDialog()
if(href_list["add"])
if(copies < maxcopies)
copies++
updateUsrDialog()
obj/machinery/photocopier/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/paper))
if(!copy)
user.drop_item()
copy = O
O.loc = src
user << "You insert the paper into the photocopier."
flick("bigscanner1", src)
updateUsrDialog()
else
user << "There is already paper in the photocopier."
if(istype(O, /obj/item/device/toner))
if(toner == 0)
user.drop_item()
del(O)
toner = 30
user << "You insert the toner cartridge into the photocopier."
updateUsrDialog()
else
user << "This cartridge is not yet ready for replacement! Use up the rest of the toner."
obj/machinery/photocopier/ex_act(severity)
switch(severity)
if(1.0)
del(src)
return
if(2.0)
if(prob(50))
del(src)
else
if(toner > 0)
new /obj/effect/decal/cleanable/oil(get_turf(src))
toner = 0
return
else
if(prob(50))
if(toner > 0)
new /obj/effect/decal/cleanable/oil(get_turf(src))
toner = 0
return
return
obj/machinery/photocopier/blob_act()
if(prob(50))
del(src)
return
else
if(toner > 0)
new /obj/effect/decal/cleanable/oil(get_turf(src))
toner = 0
return
obj/item/device/toner
name = "toner cartridge"
icon_state = "tonercartridge"
+53
View File
@@ -0,0 +1,53 @@
/obj/item/weapon/stamp
desc = "A rubber stamp for stamping important documents."
name = "rubber stamp"
icon = 'bureaucracy.dmi'
icon_state = "stamp-qm"
item_state = "stamp"
flags = FPRINT | TABLEPASS
throwforce = 0
w_class = 1.0
throw_speed = 7
throw_range = 15
m_amt = 60
var/color = "cargo"
/obj/item/weapon/stamp/captain
name = "captain's rubber stamp"
icon_state = "stamp-cap"
color = "captain"
/obj/item/weapon/stamp/hop
name = "head of personnel's rubber stamp"
icon_state = "stamp-hop"
color = "hop"
/obj/item/weapon/stamp/hos
name = "head of security's rubber stamp"
icon_state = "stamp-hos"
color = "hosred"
/obj/item/weapon/stamp/ce
name = "chief engineer's rubber stamp"
icon_state = "stamp-ce"
color = "chief"
/obj/item/weapon/stamp/rd
name = "research director's rubber stamp"
icon_state = "stamp-rd"
color = "director"
/obj/item/weapon/stamp/cmo
name = "chief medical officer's rubber stamp"
icon_state = "stamp-cmo"
color = "medical"
/obj/item/weapon/stamp/denied
name = "\improper DENIED rubber stamp"
icon_state = "stamp-qm"
color = "redcoat"
/obj/item/weapon/stamp/clown
name = "clown's rubber stamp"
icon_state = "stamp-clown"
color = "clown"