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