diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 07500afb982..ebbfd77fa1b 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -71,6 +71,7 @@ #define COLOR_BROWN "#BA9F6D" #define COLOR_DARK_BROWN "#997C4F" +#define COLOR_ORANGE_BROWN "#a9734f" #define COLOR_GREEN_GRAY "#99BB76" #define COLOR_RED_GRAY "#B4696A" diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index a119d37260e..99b979e1304 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -1,8 +1,10 @@ +#define PAPERS_PER_OVERLAY 8 +#define PAPER_OVERLAY_PIXEL_SHIFT 2 /obj/item/paper_bin name = "paper bin" desc = "Contains all the paper you'll never need." icon = 'icons/obj/bureaucracy.dmi' - icon_state = "paper_bin1" + icon_state = "paper_bin0" inhand_icon_state = "sheet-metal" lefthand_file = 'icons/mob/inhands/misc/sheets_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/sheets_righthand.dmi' @@ -15,30 +17,55 @@ var/total_paper = 30 var/list/papers = list() var/obj/item/pen/bin_pen + ///Overlay of the pen on top of the bin. + var/mutable_appearance/pen_overlay + ///Name of icon that goes over the paper overlays. + var/bin_overlay_string = "paper_bin_overlay" + ///Overlay that goes over the paper overlays. + var/mutable_appearance/bin_overlay /obj/item/paper_bin/Initialize(mapload) . = ..() interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP AddElement(/datum/element/drag_pickup) - if(!mapload) - return - var/obj/item/pen/P = locate(/obj/item/pen) in src.loc - if(P && !bin_pen) - P.forceMove(src) - bin_pen = P - update_appearance() - + if(mapload) + var/obj/item/pen/pen = locate(/obj/item/pen) in loc + if(pen && !bin_pen) + pen.forceMove(src) + bin_pen = pen + for(var/i in 1 to total_paper) + papers.Add(generate_paper()) + update_appearance() + +/obj/item/paper_bin/proc/generate_paper() + var/obj/item/paper/paper = new papertype(src) + if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) + if(prob(30)) + paper.info = "HONK HONK HONK HONK HONK HONK HONK
HOOOOOOOOOOOOOOOOOOOOOONK
APRIL FOOLS
" + paper.AddComponent(/datum/component/honkspam) + return paper /obj/item/paper_bin/Destroy() - if(papers) - for(var/i in papers) - qdel(i) - papers = null + QDEL_LIST(papers) . = ..() +/obj/item/paper_bin/dump_contents(atom/droppoint, collapse = FALSE) + if(!droppoint) + droppoint = drop_location() + if(collapse) + visible_message("The stack of paper collapses!") + for(var/atom/movable/movable_atom in contents) + movable_atom.forceMove(droppoint) + if(!movable_atom.pixel_y) + movable_atom.pixel_y = rand(-3,3) + if(!movable_atom.pixel_x) + movable_atom.pixel_x = rand(-3,3) + LAZYNULL(papers) + update_appearance() + /obj/item/paper_bin/fire_act(exposed_temperature, exposed_volume) - if(total_paper) - total_paper = 0 + if(LAZYLEN(papers)) + LAZYNULL(papers) update_appearance() ..() @@ -48,69 +75,65 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/paper_bin/attack_hand(mob/user, list/modifiers) if(isliving(user)) - var/mob/living/L = user - if(!(L.mobility_flags & MOBILITY_PICKUP)) + var/mob/living/living_mob = user + if(!(living_mob.mobility_flags & MOBILITY_PICKUP)) return user.changeNext_move(CLICK_CD_MELEE) + if(at_overlay_limit()) + dump_contents(drop_location(), TRUE) + return if(bin_pen) - var/obj/item/pen/P = bin_pen - P.add_fingerprint(user) - P.forceMove(user.loc) - user.put_in_hands(P) - to_chat(user, "You take [P] out of \the [src].") + var/obj/item/pen/pen = bin_pen + pen.add_fingerprint(user) + pen.forceMove(user.loc) + user.put_in_hands(pen) + to_chat(user, "You take [pen] out of [src].") bin_pen = null update_appearance() - else if(total_paper >= 1) - total_paper-- + else if(LAZYLEN(papers)) + var/obj/item/paper/top_paper = papers[papers.len] + papers.Remove(top_paper) + top_paper.add_fingerprint(user) + top_paper.forceMove(user.loc) + user.put_in_hands(top_paper) + to_chat(user, "You take [top_paper] out of [src].") update_appearance() - // If there's any custom paper on the stack, use that instead of creating a new paper. - var/obj/item/paper/P - if(papers.len > 0) - P = papers[papers.len] - papers.Remove(P) - else - P = new papertype(src) - if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) - if(prob(30)) - P.info = "HONK HONK HONK HONK HONK HONK HONK
HOOOOOOOOOOOOOOOOOOOOOONK
APRIL FOOLS
" - P.AddComponent(/datum/component/honkspam) - - P.add_fingerprint(user) - P.forceMove(user.loc) - user.put_in_hands(P) - to_chat(user, "You take [P] out of \the [src].") else to_chat(user, "[src] is empty!") add_fingerprint(user) return ..() /obj/item/paper_bin/attackby(obj/item/I, mob/user, params) + if(at_overlay_limit()) + dump_contents(drop_location(), TRUE) + return if(istype(I, /obj/item/paper)) - var/obj/item/paper/P = I - if(!user.transferItemToLoc(P, src)) + var/obj/item/paper/paper = I + if(!user.transferItemToLoc(paper, src)) return - to_chat(user, "You put [P] in [src].") - papers.Add(P) - total_paper++ + to_chat(user, "You put [paper] in [src].") + papers.Add(paper) update_appearance() else if(istype(I, /obj/item/pen) && !bin_pen) - var/obj/item/pen/P = I - if(!user.transferItemToLoc(P, src)) + var/obj/item/pen/pen = I + if(!user.transferItemToLoc(pen, src)) return - to_chat(user, "You put [P] in [src].") - bin_pen = P + to_chat(user, "You put [pen] in [src].") + bin_pen = pen update_appearance() else return ..() +/obj/item/paper_bin/proc/at_overlay_limit() + return overlays.len >= MAX_ATOM_OVERLAYS + /obj/item/paper_bin/examine(mob/user) . = ..() if(total_paper) - . += "It contains [total_paper > 1 ? "[total_paper] papers" : " one paper"]." + . += "It contains [total_paper > 1 ? "[total_paper] papers" : "one paper"]." else . += "It doesn't contain anything." - /obj/item/paper_bin/update_icon_state() if(total_paper < 1) icon_state = "paper_bin0" @@ -120,50 +143,95 @@ /obj/item/paper_bin/update_overlays() . = ..() + + total_paper = LAZYLEN(papers) + if(bin_pen) - . += mutable_appearance(bin_pen.icon, bin_pen.icon_state) + pen_overlay = mutable_appearance(bin_pen.icon, bin_pen.icon_state) + + if(!bin_overlay) + bin_overlay = mutable_appearance(icon, bin_overlay_string) + + if(LAZYLEN(papers)) + for(var/paper_number in 1 to papers.len) + if(paper_number != papers.len && paper_number % PAPERS_PER_OVERLAY != 0) //only top paper and every nth paper get overlays + continue + var/obj/item/paper/current_paper = papers[paper_number] + var/mutable_appearance/paper_overlay = mutable_appearance(current_paper.icon, current_paper.icon_state) + paper_overlay.color = current_paper.color + paper_overlay.pixel_y = paper_number/PAPERS_PER_OVERLAY - PAPER_OVERLAY_PIXEL_SHIFT //gives the illusion of stacking + . += paper_overlay + if(paper_number == papers.len) //this is our top paper + . += current_paper.overlays //add overlays only for top paper + if(istype(src, /obj/item/paper_bin/bundlenatural)) + bin_overlay.pixel_y = paper_overlay.pixel_y //keeps binding centred on stack + if(bin_pen) + pen_overlay.pixel_y = paper_overlay.pixel_y //keeps pen on top of stack + . += bin_overlay + + if(bin_pen) + . += pen_overlay /obj/item/paper_bin/construction name = "construction paper bin" desc = "Contains all the paper you'll never need, IN COLOR!" - icon_state = "paper_binc" papertype = /obj/item/paper/construction /obj/item/paper_bin/bundlenatural name = "natural paper bundle" desc = "A bundle of paper created using traditional methods." - icon_state = "paper_bundle" + icon_state = null papertype = /obj/item/paper/natural resistance_flags = FLAMMABLE + bin_overlay_string = "paper_bundle_overlay" + ///Cable this bundle is held together with. + var/obj/item/stack/cable_coil/binding_cable + +/obj/item/paper_bin/bundlenatural/Initialize(mapload) + binding_cable = new /obj/item/stack/cable_coil(src, 2) + binding_cable.color = COLOR_ORANGE_BROWN + binding_cable.cable_color = "brown" + binding_cable.desc += " Non-natural." + return ..() + +/obj/item/paper_bin/bundlenatural/dump_contents(atom/droppoint) + . = ..() + qdel(src) + +/obj/item/paper_bin/bundlenatural/update_overlays() + bin_overlay = mutable_appearance(icon, bin_overlay_string) + bin_overlay.color = binding_cable.color + return ..() /obj/item/paper_bin/bundlenatural/attack_hand(mob/user, list/modifiers) - ..() - if(total_paper < 1) - qdel(src) + . = ..() + if(!LAZYLEN(papers)) + deconstruct(FALSE) + +/obj/item/paper_bin/bundlenatural/deconstruct(disassembled) + dump_contents() + return ..() /obj/item/paper_bin/bundlenatural/fire_act(exposed_temperature, exposed_volume) qdel(src) /obj/item/paper_bin/bundlenatural/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/paper/carbon)) + to_chat(user, "[W] won't fit into [src].") + return if(W.get_sharpness()) - to_chat(user, "You snip \the [src], spilling paper everywhere.") - var/turf/T = get_turf(src.loc) - while(total_paper > 0) - total_paper-- - var/obj/item/paper/P - if(papers.len > 0) - P = papers[papers.len] - papers -= P - else - P = new papertype() - P.forceMove(T) - CHECK_TICK - qdel(src) + if(W.use_tool(src, user, 1 SECONDS)) + to_chat(user, "You slice the cable from [src].") + deconstruct(TRUE) else ..() /obj/item/paper_bin/carbon name = "carbon paper bin" desc = "Contains all the paper you'll ever need, in duplicate!" - icon_state = "paper_bin_carbon" + icon_state = "paper_bin_carbon0" papertype = /obj/item/paper/carbon + bin_overlay_string = "paper_bin_carbon_overlay" + +#undef PAPERS_PER_OVERLAY +#undef PAPER_OVERLAY_PIXEL_SHIFT diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index bd3db689649..4754c8375e9 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ