diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 08e0c6cba7..ffa64ce64f 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1369,8 +1369,8 @@
var/data = ""
var/obj/item/weapon/paper_bundle/B = fax
- for (var/page = 1, page <= B.amount, page++)
- var/obj/pageobj = B.contents[page]
+ for (var/page = 1, page <= B.pages.len, page++)
+ var/obj/pageobj = B.pages[page]
data += "Page [page] - [pageobj.name]
"
usr << browse(data, "window=[B.name]")
@@ -1383,11 +1383,11 @@
if (!bundle) return
- if (istype(bundle.contents[page], /obj/item/weapon/paper))
- var/obj/item/weapon/paper/P = bundle.contents[page]
+ if (istype(bundle.pages[page], /obj/item/weapon/paper))
+ var/obj/item/weapon/paper/P = bundle.pages[page]
P.show_content(src.owner, 1)
- else if (istype(bundle.contents[page], /obj/item/weapon/photo))
- var/obj/item/weapon/photo/H = bundle.contents[page]
+ else if (istype(bundle.pages[page], /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/H = bundle.pages[page]
H.show(src.owner)
return
diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm
index 9598800312..2253e049a5 100644
--- a/code/modules/paperwork/clipboard.dm
+++ b/code/modules/paperwork/clipboard.dm
@@ -68,14 +68,14 @@
//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]
"
+ dat += "Write Remove Rename - [P.name]
"
for(var/obj/item/weapon/paper/P in src)
if(P==toppaper)
continue
- dat += "Remove - [P.name]
"
+ dat += "Remove Rename - [P.name]
"
for(var/obj/item/weapon/photo/Ph in src)
- dat += "Remove - [Ph.name]
"
+ dat += "Remove Rename - [Ph.name]
"
user << browse(dat, "window=clipboard")
onclose(user, "clipboard")
@@ -129,6 +129,18 @@
toppaper = newtop
else
toppaper = null
+
+ else if(href_list["rename"])
+ var/obj/item/weapon/O = locate(href_list["rename"])
+
+ if(O && (O.loc == src))
+ if(istype(O, /obj/item/weapon/paper))
+ var/obj/item/weapon/paper/to_rename = O
+ to_rename.rename()
+
+ else if(istype(O, /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/to_rename = O
+ to_rename.rename()
else if(href_list["read"])
var/obj/item/weapon/paper/P = locate(href_list["read"])
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index 33d0bb31c6..7cd104870f 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -189,7 +189,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
else if (istype(copyitem, /obj/item/weapon/photo))
rcvdcopy = photocopy(copyitem)
else if (istype(copyitem, /obj/item/weapon/paper_bundle))
- rcvdcopy = bundlecopy(copyitem)
+ rcvdcopy = bundlecopy(copyitem, 0)
else
visible_message("[src] beeps, \"Error transmitting message.\"")
return
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index ddc211cc7c..c10b940c1e 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -44,11 +44,11 @@
var/dat = "[name]"
for(var/obj/item/weapon/paper/P in src)
- dat += "Remove - [P.name]
"
+ dat += "Remove Rename - [P.name]
"
for(var/obj/item/weapon/photo/Ph in src)
- dat += "Remove - [Ph.name]
"
+ dat += "Remove Rename - [Ph.name]
"
for(var/obj/item/weapon/paper_bundle/Pb in src)
- dat += "Remove - [Pb.name]
"
+ dat += "Remove Rename - [Pb.name]
"
user << browse(dat, "window=folder")
onclose(user, "folder")
add_fingerprint(usr)
@@ -85,7 +85,22 @@
if(P && (P.loc == src) && istype(P))
P.attack_self(usr)
onclose(usr, "[P.name]")
-
+ else if(href_list["rename"])
+ var/obj/item/weapon/O = locate(href_list["rename"])
+
+ if(O && (O.loc == src))
+ if(istype(O, /obj/item/weapon/paper))
+ var/obj/item/weapon/paper/to_rename = O
+ to_rename.rename()
+
+ else if(istype(O, /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/to_rename = O
+ to_rename.rename()
+
+ else if(istype(O, /obj/item/weapon/paper_bundle))
+ var/obj/item/weapon/paper_bundle/to_rename = O
+ to_rename.rename()
+
//Update everything
attack_self(usr)
update_icon()
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 31cb465923..2bf4516b7c 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -95,12 +95,15 @@
usr << "You cut yourself on the paper."
return
var/n_name = sanitizeSafe(input(usr, "What would you like to label the paper?", "Paper Labelling", null) as text, MAX_NAME_LEN)
- if((loc == usr && usr.stat == 0))
- name = "[(n_name ? text("[n_name]") : initial(name))]"
- if(name != "paper")
- desc = "This is a paper titled '" + name + "'."
- add_fingerprint(usr)
- return
+
+ // We check loc one level up, so we can rename in clipboards and such. See also: /obj/item/weapon/photo/rename()
+ if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == 0 && n_name)
+ name = n_name
+ if(n_name != "paper")
+ desc = "This is a paper titled '" + name + "'."
+
+ add_fingerprint(usr)
+ return
/obj/item/weapon/paper/attack_self(mob/living/user as mob)
user.examinate(src)
@@ -447,7 +450,9 @@
user << "You clip the [P.name] to [(src.name == "paper") ? "the paper" : src.name]."
src.loc = B
P.loc = B
- B.amount++
+
+ B.pages.Add(src)
+ B.pages.Add(P)
B.update_icon()
else if(istype(P, /obj/item/weapon/pen) || istype(P, /obj/item/toy/crayon))
diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm
index 5d9fd9baba..28f535a2ff 100644
--- a/code/modules/paperwork/paper_bundle.dm
+++ b/code/modules/paperwork/paper_bundle.dm
@@ -11,50 +11,35 @@
layer = 4
pressure_resistance = 1
attack_verb = list("bapped")
- var/amount = 0 //Amount of items clipped to the paper
- var/page = 1
- var/screen = 0
+ var/page = 1 // current page
+ var/list/pages = list() // Ordered list of pages as they are to be displayed. Can be different order than src.contents.
/obj/item/weapon/paper_bundle/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
- var/obj/item/weapon/paper/P
- if(istype(W, /obj/item/weapon/paper))
- P = W
- if (istype(P, /obj/item/weapon/paper/carbon))
- var/obj/item/weapon/paper/carbon/C = P
- if (!C.iscopy && !C.copied)
- user << "Take off the carbon copy first."
- add_fingerprint(user)
- return
- amount++
- if(screen == 2)
- screen = 1
- user << "You add [(P.name == "paper") ? "the paper" : P.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]."
- user.drop_from_inventory(P)
- P.loc = src
- if(istype(user,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = user
- H.update_inv_l_hand()
- H.update_inv_r_hand()
- else if(istype(W, /obj/item/weapon/photo))
- amount++
- if(screen == 2)
- screen = 1
- user << "You add [(W.name == "photo") ? "the photo" : W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]."
- user.drop_from_inventory(W)
- W.loc = src
+ if (istype(W, /obj/item/weapon/paper/carbon))
+ var/obj/item/weapon/paper/carbon/C = W
+ if (!C.iscopy && !C.copied)
+ user << "Take off the carbon copy first."
+ add_fingerprint(user)
+ return
+ // adding sheets
+ if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo))
+ insert_sheet_at(user, pages.len+1, W)
+
+ // burning
else if(istype(W, /obj/item/weapon/flame))
burnpaper(W, user)
+
+ // merging bundles
else if(istype(W, /obj/item/weapon/paper_bundle))
user.drop_from_inventory(W)
for(var/obj/O in W)
O.loc = src
O.add_fingerprint(usr)
- src.amount++
- if(screen == 2)
- screen = 1
+ pages.Add(O)
+
user << "You add \the [W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]."
qdel(W)
else
@@ -62,15 +47,27 @@
return 0
if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/toy/crayon))
usr << browse("", "window=[name]") //Closes the dialog
- P = src[page]
+ var/obj/P = pages[page]
P.attackby(W, user)
-
update_icon()
attack_self(usr) //Update the browsed page.
add_fingerprint(usr)
return
+/obj/item/weapon/paper_bundle/proc/insert_sheet_at(mob/user, var/index, obj/item/weapon/sheet)
+ if(istype(sheet, /obj/item/weapon/paper))
+ user << "You add [(sheet.name == "paper") ? "the paper" : sheet.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]."
+ else if(istype(sheet, /obj/item/weapon/photo))
+ user << "You add [(sheet.name == "photo") ? "the photo" : sheet.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name]."
+
+ user.drop_from_inventory(sheet)
+ sheet.loc = src
+
+ pages.Insert(index, sheet)
+
+ if(index <= page)
+ page++
/obj/item/weapon/paper_bundle/proc/burnpaper(obj/item/weapon/flame/P, mob/user)
var/class = ""
@@ -105,28 +102,32 @@
/obj/item/weapon/paper_bundle/proc/show_content(mob/user as mob)
var/dat
- var/obj/item/weapon/W = src[page]
- switch(screen)
- if(0)
- dat+= ""
- dat+= ""
- dat+= "
"
- if(1)
- dat+= ""
- dat+= ""
- dat+= "
"
- if(2)
- dat+= ""
- dat+= "
"
- dat+= ""
- if(istype(src[page], /obj/item/weapon/paper))
+ var/obj/item/weapon/W = pages[page]
+
+ // first
+ if(page == 1)
+ dat+= ""
+ dat+= ""
+ dat+= "
"
+ // last
+ else if(page == pages.len)
+ dat+= ""
+ dat+= ""
+ dat+= "
"
+ // middle pages
+ else
+ dat+= ""
+ dat+= ""
+ dat+= "
"
+
+ if(istype(pages[page], /obj/item/weapon/paper))
var/obj/item/weapon/paper/P = W
if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/dead/observer) || istype(usr, /mob/living/silicon)))
dat+= "[P.name][stars(P.info)][P.stamps]"
else
dat+= "[P.name][P.info][P.stamps]"
user << browse(dat, "window=[name]")
- else if(istype(src[page], /obj/item/weapon/photo))
+ else if(istype(pages[page], /obj/item/weapon/photo))
var/obj/item/weapon/photo/P = W
user << browse_rsc(P.img, "tmp_photo.png")
user << browse(dat + "[P.name]" \
@@ -145,55 +146,51 @@
..()
if((src in usr.contents) || (istype(src.loc, /obj/item/weapon/folder) && (src.loc in usr.contents)))
usr.set_machine(src)
+ var/obj/item/weapon/in_hand = usr.get_active_hand()
if(href_list["next_page"])
- if(page == amount)
- screen = 2
- else if(page == 1)
- screen = 1
- else if(page == amount+1)
- return
- page++
- playsound(src.loc, "pageturn", 50, 1)
+ if(in_hand && (istype(in_hand, /obj/item/weapon/paper) || istype(in_hand, /obj/item/weapon/photo)))
+ insert_sheet_at(usr, page+1, in_hand)
+ else if(page != pages.len)
+ page++
+ playsound(src.loc, "pageturn", 50, 1)
if(href_list["prev_page"])
- if(page == 1)
- return
- else if(page == 2)
- screen = 0
- else if(page == amount+1)
- screen = 1
- page--
- playsound(src.loc, "pageturn", 50, 1)
+ if(in_hand && (istype(in_hand, /obj/item/weapon/paper) || istype(in_hand, /obj/item/weapon/photo)))
+ insert_sheet_at(usr, page, in_hand)
+ else if(page > 1)
+ page--
+ playsound(src.loc, "pageturn", 50, 1)
if(href_list["remove"])
- var/obj/item/weapon/W = src[page]
+ var/obj/item/weapon/W = pages[page]
usr.put_in_hands(W)
+ pages.Remove(pages[page])
+
usr << "You remove the [W.name] from the bundle."
- if(amount == 1)
+
+ if(pages.len <= 1)
var/obj/item/weapon/paper/P = src[1]
usr.drop_from_inventory(src)
usr.put_in_hands(P)
qdel(src)
- else if(page == amount)
- screen = 2
- else if(page == amount+1)
- page--
-
- amount--
+
+ return
+
+ if(page > pages.len)
+ page = pages.len
+
update_icon()
else
usr << "You need to hold it in hands!"
if (istype(src.loc, /mob) ||istype(src.loc.loc, /mob))
- src.attack_self(src.loc)
+ src.attack_self(usr)
updateUsrDialog()
-
-
/obj/item/weapon/paper_bundle/verb/rename()
set name = "Rename bundle"
set category = "Object"
set src in usr
var/n_name = sanitizeSafe(input(usr, "What would you like to label the bundle?", "Bundle Labelling", null) as text, MAX_NAME_LEN)
- if((loc == usr && usr.stat == 0))
+ if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == 0)
name = "[(n_name ? text("[n_name]") : "paper")]"
add_fingerprint(usr)
return
@@ -215,7 +212,7 @@
/obj/item/weapon/paper_bundle/update_icon()
- var/obj/item/weapon/paper/P = src[1]
+ var/obj/item/weapon/paper/P = pages[1]
icon_state = P.icon_state
overlays = P.overlays
underlays = 0
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 0aea8aa0f4..2ae10e1c35 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -56,7 +56,7 @@
sleep(15)
else if (istype(copyitem, /obj/item/weapon/paper_bundle))
var/obj/item/weapon/paper_bundle/B = bundlecopy(copyitem)
- sleep(15*B.amount)
+ sleep(15*B.pages.len)
else
usr << "\The [copyitem] can't be copied by \the [src]."
break
@@ -216,7 +216,7 @@
//If need_toner is 0, the copies will still be lightened when low on toner, however it will not be prevented from printing. TODO: Implement print queues for fax machines and get rid of need_toner
/obj/machinery/photocopier/proc/bundlecopy(var/obj/item/weapon/paper_bundle/bundle, var/need_toner=1)
var/obj/item/weapon/paper_bundle/p = new /obj/item/weapon/paper_bundle (src)
- for(var/obj/item/weapon/W in bundle)
+ for(var/obj/item/weapon/W in bundle.pages)
if(toner <= 0 && need_toner)
toner = 0
visible_message("A red light on \the [src] flashes, indicating that it is out of toner.")
@@ -227,8 +227,8 @@
else if(istype(W, /obj/item/weapon/photo))
W = photocopy(W)
W.loc = p
- p.amount++
- //p.amount--
+ p.pages += W
+
p.loc = src.loc
p.update_icon()
p.icon_state = "paper_words"
diff --git a/html/changelogs/Daranz-paper_functionality.yml b/html/changelogs/Daranz-paper_functionality.yml
new file mode 100644
index 0000000000..5bdb81041e
--- /dev/null
+++ b/html/changelogs/Daranz-paper_functionality.yml
@@ -0,0 +1,5 @@
+author: Daranz
+delete-after: True
+
+changes:
+ - rscadd: "Paper bundles can now have papers inserted at arbitrary points. This can be done by clicking the previous/next page links with a sheet of paper in hand."
\ No newline at end of file