From e4cf2b221bf5a695d1f8a35814f5fec350e911ef Mon Sep 17 00:00:00 2001 From: Citinited Date: Fri, 14 Jul 2017 10:27:58 +0100 Subject: [PATCH] Makes clipboard code less horrible - You can now move a piece of paper to the top of the clipboard - You can now click on a clipboard with pen in hand to put it directly into the clipboard - Clipboard now works with paper bundles - Added "Remove clipboard pen" verb --- code/modules/paperwork/clipboard.dm | 247 ++++++++++++++-------------- 1 file changed, 125 insertions(+), 122 deletions(-) diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index da26fc96fec..81bf5202616 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -1,154 +1,157 @@ +#define PAPERWORK 1 +#define PHOTO 2 + /obj/item/weapon/clipboard name = "clipboard" + desc = "It looks like you're writing a letter. Want some help?" icon = 'icons/obj/bureaucracy.dmi' icon_state = "clipboard" item_state = "clipboard" - throwforce = 0 w_class = WEIGHT_CLASS_SMALL - throw_speed = 3 - throw_range = 10 - var/obj/item/weapon/pen/haspen //The stored pen. - var/obj/item/weapon/toppaper //The topmost piece of paper. + var/obj/item/weapon/pen + var/obj/item/weapon/toppaper slot_flags = SLOT_BELT burn_state = FLAMMABLE /obj/item/weapon/clipboard/New() + ..() update_icon() -/obj/item/weapon/clipboard/MouseDrop(obj/over_object as obj) //Quick clipboard fix. -Agouri - if(ishuman(usr)) - var/mob/M = usr - if(!(istype(over_object, /obj/screen) )) - return ..() +/obj/item/weapon/clipboard/verb/removePen() + set category = "Object" + set name = "Remove clipboard pen" + if(!ishuman(usr) || usr.incapacitated()) + return + penPlacement(FALSE, pen) - if(!M.restrained() && !M.stat) - switch(over_object.name) - if("r_hand") - M.unEquip(src) - M.put_in_r_hand(src) - if("l_hand") - M.unEquip(src) - M.put_in_l_hand(src) +/obj/item/weapon/clipboard/proc/isPaperwork(var/obj/item/weapon/W) //This could probably do with being somewhere else but for now it's fine here. + if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/paper_bundle)) + return PAPERWORK + if(istype(W, /obj/item/weapon/photo)) + return PHOTO - add_fingerprint(usr) +/obj/item/weapon/clipboard/proc/isPen(var/obj/item/weapon/W) //Should also probably be somewhere else + if(istype(W, /obj/item/weapon/pen)) + return TRUE + +/obj/item/weapon/clipboard/proc/checkTopPaper() + if(toppaper.loc != src) //Oh no! We're missing a top sheet! Better get another one to be at the top. + var/obj/item/weapon/paper/newtoppaper = locate(/obj/item/weapon/paper) in src + if(!newtoppaper) //In case there's no paper, try find a paper bundle instead (why is paper_bundle not a subtype of paper?) + newtoppaper = locate(/obj/item/weapon/paper_bundle) in src + if(newtoppaper) + toppaper = newtoppaper + else + toppaper = null + +obj/item/weapon/clipboard/proc/penPlacement(var/placing, var/obj/item/weapon/pen/P) + if(placing == TRUE) + if(pen) + to_chat(usr, "There's already a pen in [src]!") return + if(!isPen(P)) + return + to_chat(usr, "You slide [P] into [src].") + usr.unEquip(P) + P.forceMove(src) + pen = P + else + if(!pen) + to_chat(usr, "There isn't a pen in [src] for you to remove!") + return + to_chat(usr, "You remove [pen] from [src].") + usr.put_in_hands(pen) + pen = null + update_icon() + +/obj/item/weapon/clipboard/proc/show_clipboard() //Show them what's on the clipboard + var/dat = "[src]" + dat += "[pen ? "Remove pen" : "Add pen"]

" + for(var/obj/item/weapon/P in src) + if(isPaperwork(P) == PAPERWORK) + dat += "Remove [toppaper == P ? "On top" : "Put on top"] [toppaper == P ? "" : null][P.name][toppaper == P ? "" : null]

" + if(isPaperwork(P) == PHOTO) + dat += "Remove [P.name]

" + var/datum/browser/popup = new(usr, "clipboard", "[src]", 400, 400) + popup.set_content(dat) + popup.open() /obj/item/weapon/clipboard/update_icon() overlays.Cut() if(toppaper) overlays += toppaper.icon_state overlays += toppaper.overlays - if(haspen) + if(pen) overlays += "clipboard_pen" overlays += "clipboard_over" return -/obj/item/weapon/clipboard/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - - if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo)) - user.drop_item() - W.loc = src - if(istype(W, /obj/item/weapon/paper)) - toppaper = W - to_chat(user, "You clip the [W] onto \the [src].") +/obj/item/weapon/clipboard/attackby(obj/item/weapon/W, mob/user) + var/obj/item/weapon/P = W + if(isPaperwork(P)) //If it's a photo, paper bundle, or piece of paper, place it on the clipboard. + user.unEquip(P) + P.forceMove(src) + to_chat(user, "You clip [P] onto [src].") + if(isPaperwork(P) == PAPERWORK) + toppaper = P update_icon() + else if(isPen(W)) //If it's not a pen, we're done here + if(!toppaper) //If there's no paper we can write on, just stick the pen into the clipboard + penPlacement(TRUE, P) + return + if(pen) //If there's a pen in the clipboard, let's just let them write and not bother asking about the pen + var/obj/item/weapon/paper/T = toppaper + T.attackby(P, user) + return + var/writeonwhat = input(user, "Write on [toppaper.name], or place your pen in [src]?", "Pick one!") as null|anything in list("Write", "Place pen") + if(!writeonwhat) + return + if(writeonwhat == "Write") + var/obj/item/weapon/paper/T = toppaper + T.attackby(P, user) + else if(writeonwhat == "Place pen") + penPlacement(TRUE, P) - else if(istype(toppaper) && istype(W, /obj/item/weapon/pen)) - toppaper.attackby(W, usr, params) - update_icon() - - return - -/obj/item/weapon/clipboard/attack_self(mob/user as mob) - var/dat = "Clipboard" - if(haspen) - dat += "Remove Pen

" - else - dat += "Add Pen

" - - //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 += "Write Remove - [P.name]

" - - for(var/obj/item/weapon/paper/P in src) - if(P==toppaper) - continue - dat += "Remove - [P.name]
" - for(var/obj/item/weapon/photo/Ph in src) - dat += "Remove - [Ph.name]
" - - user << browse(dat, "window=clipboard") - onclose(user, "clipboard") - add_fingerprint(usr) - return +/obj/item/weapon/clipboard/attack_self(mob/user) + show_clipboard() /obj/item/weapon/clipboard/Topic(href, href_list) ..() - if((usr.stat || usr.restrained())) + if(!Adjacent(usr) || usr.incapacitated()) return + var/obj/item/I = usr.get_active_hand() + if(href_list["doPenThings"]) + if(href_list["doPenThings"] == "Add") + var/obj/item/weapon/pen/W = usr.get_active_hand() + penPlacement(TRUE, W) + else + penPlacement(FALSE, pen) + else if(href_list["remove"]) + var/obj/item/P = locate(href_list["remove"]) + if(isPaperwork(P)) + usr.put_in_hands(P) + to_chat(usr, "You remove [P] from [src].") + checkTopPaper() //So we don't accidentally make the top sheet not be on the clipboard + else if(href_list["viewOrWrite"]) + var/obj/item/weapon/P = locate(href_list["viewOrWrite"]) + if(!isPaperwork(P)) + return + if(isPen(I) && isPaperwork(P) != PHOTO) //Because you can't write on photos that aren't in your hand + P.attackby(I, usr) + else if(isPaperwork(P) == PAPERWORK) //Why can't these be subtypes of paper + P.examine(usr) + else if(isPaperwork(P) == PHOTO) + var/obj/item/weapon/photo/Ph = P + Ph.show(usr) + else if(href_list["topPaper"]) + var/obj/item/weapon/paper/P = locate(href_list["topPaper"]) + if(P == toppaper) + return + to_chat(usr, "You flick the pages so that [P] is on top.") + playsound(loc, "pageturn", 50, 1) + toppaper = P + update_icon() + show_clipboard() - if(src.loc == usr) - - if(href_list["pen"]) - if(istype(haspen) && (haspen.loc == src)) - haspen.loc = usr.loc - usr.put_in_hands(haspen) - haspen = null - - else if(href_list["addpen"]) - if(!haspen) - var/obj/item/weapon/pen/W = usr.get_active_hand() - if(istype(W, /obj/item/weapon/pen)) - usr.drop_item() - W.loc = src - haspen = W - to_chat(usr, "You slot the pen into \the [src].") - - else if(href_list["write"]) - var/obj/item/weapon/P = locate(href_list["write"]) - - if(P && (P.loc == src) && istype(P, /obj/item/weapon/paper) && (P == toppaper) ) - - var/obj/item/I = usr.get_active_hand() - - if(istype(I, /obj/item/weapon/pen)) - - P.attackby(I, usr) - - else if(href_list["remove"]) - var/obj/item/P = locate(href_list["remove"]) - - if(P && (P.loc == src) && (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo)) ) - - P.loc = usr.loc - usr.put_in_hands(P) - if(P == toppaper) - toppaper = null - var/obj/item/weapon/paper/newtop = locate(/obj/item/weapon/paper) in src - if(newtop && (newtop != P)) - toppaper = newtop - else - toppaper = null - - else if(href_list["read"]) - var/obj/item/weapon/paper/P = locate(href_list["read"]) - - if(P && (P.loc == src) && istype(P, /obj/item/weapon/paper) ) - P.show_content(usr) - - else if(href_list["look"]) - var/obj/item/weapon/photo/P = locate(href_list["look"]) - if(P && (P.loc == src) && istype(P, /obj/item/weapon/photo) ) - P.show(usr) - - else if(href_list["top"]) // currently unused - var/obj/item/P = locate(href_list["top"]) - if(P && (P.loc == src) && istype(P, /obj/item/weapon/paper) ) - toppaper = P - to_chat(usr, "You move [P.name] to the top.") - - //Update everything - attack_self(usr) - update_icon() - return +#undef PAPERWORK +#undef PHOTO