diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 393247c5a1f..0023f3bb4f7 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -9,6 +9,8 @@ #define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable +#define is_pen(W) (istype(W, /obj/item/weapon/pen)) + var/list/static/global/pointed_types = typecacheof(list( /obj/item/weapon/pen, /obj/item/weapon/screwdriver, diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index da26fc96fec..e46e1ed03f9 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -1,154 +1,159 @@ +#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/containedpen + 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(mob/user) + set category = "Object" + set name = "Remove clipboard pen" + if(!ishuman(user) || user.incapacitated()) + return + penPlacement(user, containedpen, FALSE) - 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(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/checkTopPaper() + if(toppaper.loc != src) //Oh no! We're missing a top sheet! Better get another one to be at the top. + toppaper = locate(/obj/item/weapon/paper) in src + if(!toppaper) //In case there's no paper, try find a paper bundle instead (why is paper_bundle not a subtype of paper?) + toppaper = locate(/obj/item/weapon/paper_bundle) in src + +/obj/item/weapon/clipboard/examine(mob/user) + if(..(user, 1) && toppaper) + toppaper.examine(user) + +obj/item/weapon/clipboard/proc/penPlacement(mob/user, obj/item/weapon/pen/P, placing) + if(placing) + if(containedpen) + to_chat(user, "There's already a pen in [src]!") return + if(!is_pen(P)) + return + to_chat(user, "You slide [P] into [src].") + user.unEquip(P) + P.forceMove(src) + containedpen = P + else + if(!containedpen) + to_chat(user, "There isn't a pen in [src] for you to remove!") + return + to_chat(user, "You remove [containedpen] from [src].") + user.put_in_hands(containedpen) + containedpen = null + update_icon() + +/obj/item/weapon/clipboard/proc/showClipboard(mob/user) //Show them what's on the clipboard + var/dat = "[src]" + dat += "[containedpen ? "Remove pen" : "Add pen"]

" + if(toppaper) + dat += "Remove[toppaper.name]

" + for(var/obj/item/weapon/P in src) + if(isPaperwork(P) == PAPERWORK && P != toppaper) + dat += "RemovePut on top[P.name]
" + if(isPaperwork(P) == PHOTO) + dat += "Remove[P.name]
" + var/datum/browser/popup = new(user, "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(containedpen) 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)) +/obj/item/weapon/clipboard/attackby(obj/item/weapon/W, mob/user) + if(isPaperwork(W)) //If it's a photo, paper bundle, or piece of paper, place it on the clipboard. + user.unEquip(W) + W.forceMove(src) + to_chat(user, "You clip [W] onto [src].") + playsound(loc, "pageturn", 50, 1) + if(isPaperwork(W) == PAPERWORK) toppaper = W - to_chat(user, "You clip the [W] onto \the [src].") + update_icon() + else if(is_pen(W)) + if(!toppaper) //If there's no paper we can write on, just stick the pen into the clipboard + penPlacement(user, W, TRUE) + return + if(containedpen) //If there's a pen in the clipboard, let's just let them write and not bother asking about the pen + toppaper.attackby(W, 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(!Adjacent(user) || user.incapacitated()) + return + switch(writeonwhat) + if("Write") + toppaper.attackby(W, user) + if("Place pen") + penPlacement(user, W, TRUE) + else + return + else if(istype(W, /obj/item/weapon/stamp) && toppaper) //We can stamp the topmost piece of paper + toppaper.attackby(W, user) update_icon() - 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) + showClipboard(user) /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") + penPlacement(usr, I, TRUE) + else + penPlacement(usr, containedpen, FALSE) + 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(is_pen(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/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() + showClipboard(usr) - 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