diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 38e9e858fc9..908d3d65642 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -344,6 +344,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items /obj/item/disk/nuclear/fake = 1, /obj/item/skillchip/brainwashing = 1, /obj/item/tattoo_kit = 1, + /obj/item/folder/ancient_paperwork = 1, ) = 1, )) diff --git a/code/modules/cargo/exports/stamped_paperwork.dm b/code/modules/cargo/exports/stamped_paperwork.dm new file mode 100644 index 00000000000..6f2c0e47ee1 --- /dev/null +++ b/code/modules/cargo/exports/stamped_paperwork.dm @@ -0,0 +1,49 @@ +/datum/export/paperwork + cost = CARGO_CRATE_VALUE * 3 + unit_name = "paperwork pile" + export_types = list(/obj/item/paperwork) + exclude_types = list(/obj/item/paperwork/photocopy) //Has its own category + allow_negative_cost = TRUE + +/datum/export/paperwork/get_cost(obj/item/paperwork/sold_paperwork) + var/paperwork_cost = cost + + if(sold_paperwork.stamped) + paperwork_cost = ..() + else + paperwork_cost = -init_cost //Punishment for improperly filed paperwork. + + return paperwork_cost + +/datum/export/photocopy + cost = CARGO_CRATE_VALUE + unit_name = "messy paperwork pile" + export_types = list(/obj/item/paperwork/photocopy) + allow_negative_cost = TRUE + ///Tracks the chance of losing money for trying to double-dip with photocopies. Resets every time it ruins an order. + var/backfire_chance = 0 + ///Used to track if a batch of photocopy exports has backfired + var/backfired = FALSE + +/datum/export/photocopy/get_cost(obj/item/paperwork/photocopy/sold_paperwork) + if(sold_paperwork.stamped && !backfired) //Upon backfiring, no more photocopies are processed or sold until the next cargo shipment + if(sold_paperwork.voided) + return 0 //Voided photocopies do nothing + else + backfire_chance += rand(15,25) + if(prob(backfire_chance)) + backfire_chance = 0 + backfired = TRUE + return -init_cost * 4 //too high of an amount to allow for infinite money + else + return ..() + + else + return -init_cost + +/datum/export/photocopy/total_printout(datum/export_report/ex, notes) + . = ..() + + if(backfired) + backfired = FALSE + . += " Counterfeit paperwork was detected in this shipment. A fine has been taken from your budget as a result." diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index 7414f93d77a..9f047863b50 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -25,6 +25,7 @@ PIZZA_DELIVERY, RUSKY_PARTY, SPIDER_GIFT, + PAPERS_PLEASE, ) ///The types of loan events already run (and to be excluded if the event triggers). var/list/run_events = list() @@ -58,6 +59,7 @@ var/loan_type //for logging /datum/round_event/shuttle_loan/setup() + for(var/datum/round_event_control/shuttle_loan/loan_event_control in SSevents.control) //We can't call control, because it hasn't been set yet if(loan_event_control.chosen_event) //Pass down the admin selection and clean it for future use. dispatch_type = loan_event_control.chosen_event @@ -74,6 +76,7 @@ loan_event_control.run_events += dispatch_type //Regardless of admin selection, we add the event being run to the run_events list /datum/round_event/shuttle_loan/announce(fake) + SSshuttle.shuttle_loan = src switch(dispatch_type) if(HIJACK_SYNDIE) priority_announce("Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache.","CentCom Counterintelligence") @@ -106,7 +109,6 @@ log_game("Shuttle Loan event could not find [dispatch_type] event to offer.") kill() return - SSshuttle.shuttle_loan = src /datum/round_event/shuttle_loan/proc/loan_shuttle() priority_announce(thanks_msg, "Cargo shuttle commandeered by CentCom.") @@ -146,6 +148,9 @@ if(MY_GOD_JC) SSshuttle.centcom_message += "Live explosive ordnance incoming. Exercise extreme caution." loan_type = "Shuttle with a ticking bomb" + if(PAPERS_PLEASE) + SSshuttle.centcom_message += "Paperwork incoming." + loan_type = "Paperwork shipment" log_game("Shuttle loan event firing with type '[loan_type]'.") @@ -292,6 +297,9 @@ else shuttle_spawns.Add(/obj/item/paper/fluff/cargo/bomb/allyourbase) + if(PAPERS_PLEASE) + shuttle_spawns += subtypesof(/obj/item/paperwork) - typesof(/obj/item/paperwork/photocopy) - typesof(/obj/item/paperwork/ancient) + var/false_positive = 0 while(shuttle_spawns.len && empty_shuttle_turfs.len) var/turf/T = pick_n_take(empty_shuttle_turfs) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 20d0c50ef6e..05dd37c6003 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -8,6 +8,13 @@ resistance_flags = FLAMMABLE /// The background color for tgui in hex (with a `#`) var/bg_color = "#7f7f7f" + /// A typecache of the objects that can be inserted into a folder + var/static/list/folder_insertables = typecacheof(list( + /obj/item/paper, + /obj/item/photo, + /obj/item/documents, + /obj/item/paperwork, + )) /obj/item/folder/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] begins filing an imaginary death warrant! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -62,7 +69,7 @@ /obj/item/folder/attackby(obj/item/weapon, mob/user, params) if(burn_paper_product_attackby_check(weapon, user)) return - if(istype(weapon, /obj/item/paper) || istype(weapon, /obj/item/photo) || istype(weapon, /obj/item/documents)) + if(is_type_in_typecache(weapon, folder_insertables)) //Add paper, photo or documents into the folder if(!user.transferItemToLoc(weapon, src)) return diff --git a/code/modules/paperwork/folders_premade.dm b/code/modules/paperwork/folders_premade.dm index 731b8b9efa0..77dfed6d489 100644 --- a/code/modules/paperwork/folders_premade.dm +++ b/code/modules/paperwork/folders_premade.dm @@ -53,3 +53,8 @@ . = ..() new /obj/item/documents/syndicate/mining(src) update_appearance() + +/obj/item/folder/ancient_paperwork/Initialize(mapload) + . = ..() + new /obj/item/paperwork/ancient(src) + update_appearance() diff --git a/code/modules/paperwork/paperwork.dm b/code/modules/paperwork/paperwork.dm new file mode 100644 index 00000000000..bf413e5c66d --- /dev/null +++ b/code/modules/paperwork/paperwork.dm @@ -0,0 +1,261 @@ +/** + * # Paperwork + * + * Paperwork documents that can be stamped by their associated stamp to provide a bonus to cargo. + * + * Paperwork documents are a cargo item meant to provide the opportunity to make money. + * Each piece of paperwork has its own associated stamp it needs to be stamped with. Selling a + * properly stamped piece of paperwork will provide a cash bonus to the cargo budget. If a document is + * not properly stamped it will instead drain a small stipend from the cargo budget. + * + */ + +/obj/item/paperwork + name = "paperwork documents" + desc = "A disorganized mess of documents, research results, and investigation findings." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "docs_part" + inhand_icon_state = "paper" + throwforce = 0 + w_class = WEIGHT_CLASS_TINY + throw_range = 1 + throw_speed = 1 + layer = MOB_LAYER + ///The stamp overlay, used to show that the paperwork is complete without making a bunch of sprites + var/mutable_appearance/stamp_overlay + ///The specific stamp icon to be overlaid on the paperwork + var/stamp_icon = "paper_stamp-void" + ///The stamp needed to "complete" this form. + var/stamp_requested = /obj/item/stamp/void + ///Has the paperwork been properly stamped + var/stamped = FALSE + ///The path to the job of the associated paperwork form + var/stamp_job + ///Used to store the bonus text that displays when the paperwork's associated role reads it + var/detailed_desc + +/obj/item/paperwork/Initialize(mapload) + . = ..() + + detailed_desc = span_notice("As you sift through the papers, you slowly start to piece together what you're reading.") + +/obj/item/paperwork/attackby(obj/item/attacking_item, mob/user, params) + . = ..() + + if(!stamped) + if(istype(attacking_item, /obj/item/stamp)) + if(istype(attacking_item, stamp_requested)) //chameleon stamp does not work, this is a CRITICAL issue + add_stamp() + to_chat(user, span_notice("You skim through the papers until you find a field reading 'STAMP HERE', and complete the paperwork.")) + else + if(istype(attacking_item, /obj/item/stamp/chameleon)) + var/obj/item/stamp/chameleon/chameleon_stamp = attacking_item + to_chat(user, span_notice("[chameleon_stamp] morphs into the appropriate stamp, which you use to complete the paperwork.")) + chameleon_stamp.chameleon_action.update_item(stamp_requested) + add_stamp() + else + to_chat(user, span_warning("You hunt through the papers for somewhere to use the [attacking_item], but can't find anything.")) + +/obj/item/paperwork/examine_more(mob/user) + . = ..() + + if(ishuman(user)) + var/mob/living/carbon/human/viewer = user + if(istype(viewer.mind?.assigned_role, stamp_job)) //Examining the paperwork as the proper job gets you some bonus details + . += detailed_desc + else + if(stamped) + . += span_info("It looks like these documents have already been stamped. Now they can be returned to Central Command.") + else + var/datum/job/stamp_title = stamp_job + var/title = initial(stamp_title.title) + . += span_info("Trying to read through it makes your head spin. Judging by the few words you can make out, this looks like a job for the [title].") + +/obj/item/paperwork/suicide_act(mob/living/user) + user.visible_message(span_suicide("[user] begins insulting the inefficiency of paperwork and bureaucracy. It looks like [user.p_theyre()] trying to commit suicide!")) + + var/obj/item/paper/new_paper = new /obj/item/paper(get_turf(src)) + var/turf/turf_to_throw_at = get_ranged_target_turf(get_turf(src), pick(GLOB.alldirs)) + new_paper.throw_at(turf_to_throw_at, 2) + + var/obj/item/bodypart/BP = user.get_bodypart(pick(BODY_ZONE_HEAD)) + if(BP) + BP.dismember() + new_paper.visible_message(span_alert("The [src] launches a sheet of paper, instantly slicing off [user]'s head!")) + else + user.visible_message(span_suicide("[user] panics and starts choking to death!")) + return OXYLOSS + + return MANUAL_SUICIDE + +/** + * Adds the stamp overlay and sets "stamped" to true + * + * Adds the stamp overlay to a piece of paperwork, and sets "stamped" to true. + * Handled as a proc so that an object may be maked as "stamped" even when a stamp isn't present (like the photocopier) + */ +/obj/item/paperwork/proc/add_stamp() + stamp_overlay = mutable_appearance('icons/obj/bureaucracy.dmi', stamp_icon) + add_overlay(stamp_overlay) + stamped = TRUE + +/** + * Copies the requested stamp, associated job, and associated icon of a given paperwork type + * + * Copies the stamp/job related info of a given paperwork type to the object + * Used to mutate photocopied/ancient paperwork into behaving like their subtype counterparts without the extra details + */ +/obj/item/paperwork/proc/copy_stamp_info(obj/item/paperwork/paperwork_type) + stamp_requested = initial(paperwork_type.stamp_requested) + stamp_job = initial(paperwork_type.stamp_job) + stamp_icon = initial(paperwork_type.stamp_icon) + +//HEAD OF STAFF DOCUMENTS + +/obj/item/paperwork/cargo + stamp_requested = /obj/item/stamp/qm + stamp_job = /datum/job/quartermaster + stamp_icon = "paper_stamp-qm" + +/obj/item/paperwork/cargo/Initialize() + . = ..() + + detailed_desc += span_info(" The papers are a mess of shipping order paperwork. There's no rhyme or reason to how these documents are sorted at all.") + detailed_desc += span_info(" By the looks of it, there's nothing out of the ordinary here besides a high-priority request for a second engine.") + detailed_desc += span_info(" The 'priority request reason' field is scribbled out, but a note in the margins reads 'we just want to try two engines, don't worry about it'.") + detailed_desc += span_info(" Despite how disorganized the documents are, they're all appropriately filled in. You should probably stamp this.") + +/obj/item/paperwork/security + stamp_requested = /obj/item/stamp/hos + stamp_job = /datum/job/head_of_security + stamp_icon = "paper_stamp-hos" + +/obj/item/paperwork/security/Initialize() + . = ..() + + detailed_desc += span_info(" The stack of documents are related to a civil case being processed by a neighboring installation.") + detailed_desc += span_info(" The document requests that you review a conduct report submitted by the lawyer of the station.") + detailed_desc += span_info(" The case file details accusations against the station's security department, including misconduct, harassment, an-") + detailed_desc += span_info(" What a bunch of crap, the security team were clearly just doing what they had to. You should probably stamp this.") + +/obj/item/paperwork/service + stamp_requested = /obj/item/stamp/hop + stamp_job = /datum/job/head_of_personnel + stamp_icon = "paper_stamp-hop" + +/obj/item/paperwork/service/Initialize() + . = ..() + + detailed_desc += span_info(" You begin scanning over the document. This is a standard Nanotrasen NT-435Z3 form used for requests to Central Command.") + detailed_desc += span_info(" Looks like a nearby station has sent in a MAXIMUM priority request for coal, in seemingly ridiculous quantities.") + detailed_desc += span_info(" The reason listed for the request seems to be hastily filled in -- 'Seeking alternative methods to power the station.'") + detailed_desc += span_info(" A MAXIMUM priority request like this is nothing to balk at. You should probably stamp this.") + +/obj/item/paperwork/medical + stamp_requested = /obj/item/stamp/cmo + stamp_job = /datum/job/chief_medical_officer + stamp_icon = "paper_stamp-cmo" + +/obj/item/paperwork/medical/Initialize() + . = ..() + + detailed_desc += span_info(" The stack of documents appear to be a medical report from a nearby station, detailing the autopsy of an unknown xenofauna.") + detailed_desc += span_info(" Skipping to the end of the report reveals that the specimen was the station bartender's pet monkey.") + detailed_desc += span_info(" The specimen had been exposed to radiation during an 'unrelated incident with the engine', leading to it's mutated form.") + detailed_desc += span_info(" Regardless, the autopsy results look like they could be useful. You should probably stamp this.") + + +/obj/item/paperwork/engineering + stamp_requested = /obj/item/stamp/ce + stamp_job = /datum/job/chief_engineer + stamp_icon = "paper_stamp-ce" + +/obj/item/paperwork/engineering/Initialize() + . = ..() + + detailed_desc += span_info(" These papers are a power output report from a neighboring station. It details the power output and other engineering data regarding the station during a typical shift.") + detailed_desc += span_info(" Checking the logs, you notice the energy output and engine temperature spike dramatically, and shortly after, the surrounding department appears to be depressurized by an unknown force.") + detailed_desc += span_info(" Clearly the station's engineering department was testing an experimental engine setup, and had to use the air in the nearby rooms to help cool the engine. Totally.") + detailed_desc += span_info(" Damn, that's impressive stuff. You should probably stamp this.") + +/obj/item/paperwork/research + stamp_requested = /obj/item/stamp/rd + stamp_job = /datum/job/research_director + stamp_icon = "paper_stamp-rd" + +/obj/item/paperwork/research/Initialize() + . = ..() + + detailed_desc += span_info(" The documents detail the results of a standard ordnance test that occured on a nearby station.") + detailed_desc += span_info(" As you read further, you realize something strange with the results -- The epicenter doesn't seem to be correct.") + detailed_desc += span_info(" If your math is correct, this explosion didn't happen at the station's ordnance site, it occured in the station's engine room.") + detailed_desc += span_info(" Regardless, they're still perfectly usable test results. You should probably stamp this.") + +/obj/item/paperwork/captain + stamp_requested = /obj/item/stamp/captain + stamp_job = /datum/job/captain + stamp_icon = "paper_stamp-cap" + +/obj/item/paperwork/captain/Initialize() + . = ..() + + detailed_desc += span_info(" The documents are an unsigned correspondence from the captain's desk of a nearby station.") + detailed_desc += span_info(" It seems to be a standard check-in message, reporting that the station is functioning at optimal efficiency.") + detailed_desc += span_info(" The message repeatedly asserts that the engine is functioning 'perfectly fine' and is generating 'buttloads' of power.") + detailed_desc += span_info(" Everything checks out. You should probably stamp this.") + +//Photocopied paperwork. These are created when paperwork, whether stamped or otherwise, is printed. If it is stamped, it can be sold to cargo at the risk of the paperwork not being accepted (which takes a small fee from cargo). +//If it is unstamped it will lose you money like normal, unless it has been marked with a VOID stamp +/obj/item/paperwork/photocopy + name = "photocopied paperwork documents" + desc = "An even more disorganized mess of photocopied documents and paperwork. Did these even copy in the right order?" + stamp_icon = "paper_stamp-pc" + /// Has the photocopy been marked with a "void" stamp. Used to prevent documents from draining money if they somehow make their way to cargo. + var/voided = FALSE + +/obj/item/paperwork/photocopy/Initialize(mapload) + . = ..() + + detailed_desc = span_notice("The print job on this paperwork has rendered it almost entirely unreadable.") + +/obj/item/paperwork/photocopy/examine_more(mob/user) + . = ..() + + if(stamped) + if(voided) + . += span_notice("It looks like it's been marked as 'VOID' on the front. It's unlikely that anyone will accept these now.") + else + . += span_notice("The stamp on the front appears to be smudged and faded. Central Command will probably still accept these, right?") + else + . += span_notice("These appear to just be a photocopy of the original documents.") + +/obj/item/paperwork/photocopy/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/stamp/void) && !stamped && !voided) + to_chat(user, span_notice("You plant the [attacking_item] firmly onto the front of the documents.")) + stamp_overlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_stamp-void") + add_overlay(stamp_overlay) + voided = TRUE + stamped = TRUE //It won't get you any money, but it also can't LOSE you money now. + return + + return ..() + +//Ancient paperwork is a subtype of paperwork, meant to be used for any paperwork not spawned by the event. +//It doesn't have any of the flavor text that the event ones spawn with. + +/obj/item/paperwork/ancient + name = "ancient paperwork" + desc = "A dusty, ugly mess of paper scraps. You can't recognize a single name, date, or topic mentioned within. How old are these?" + +/obj/item/paperwork/ancient/Initialize(mapload) + . = ..() + + detailed_desc = span_notice("It's impossible to really tell how old these are or what they're for, but Central Command might appreciate them anyways.") + + var/static/list/paperwork_to_use //Make the ancient paperwork function like one of the main types + if(!paperwork_to_use) + paperwork_to_use = subtypesof(/obj/item/paperwork) + paperwork_to_use -= (list(/obj/item/paperwork/ancient, /obj/item/paperwork/photocopy)) //Get rid of the uncopiable paperwork types + + var/obj/item/paperwork/paperwork_type = pick(paperwork_to_use) + copy_stamp_info(paperwork_type) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index e87618a4989..040221d274c 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -14,6 +14,8 @@ #define ASS_TONER_USE 0.625 /// The maximum amount of copies you can make with one press of the copy button. #define MAX_COPIES_AT_ONCE 10 +/// How much toner is used for making a copy of paperwork +#define PAPERWORK_TONER_USE 0.75 /obj/machinery/photocopier name = "photocopier" @@ -34,6 +36,8 @@ var/mob/living/ass /// A reference to the toner cartridge that's inserted into the copier. Null if there is no cartridge. var/obj/item/toner/toner_cartridge + /// A reference to an `/obj/item/paperwork` inside the copier, if one is inserted. Otherwise null. + var/obj/item/paperwork/paperwork_copy /// How many copies will be printed with one click of the "copy" button. var/num_copies = 1 /// Used with photos. Determines if the copied photo will be in greyscale or color. @@ -59,12 +63,15 @@ ass = null if(deleting_atom == toner_cartridge) toner_cartridge = null + if(deleting_atom == paperwork_copy) + paperwork_copy = null return ..() /obj/machinery/photocopier/Destroy() QDEL_NULL(paper_copy) QDEL_NULL(photo_copy) QDEL_NULL(toner_cartridge) + QDEL_NULL(paperwork_copy) ass = null //the mob isn't actually contained and just referenced, no need to delete it. return ..() @@ -143,6 +150,10 @@ if(ass) do_copy_loop(CALLBACK(src, PROC_REF(make_ass_copy)), usr) return TRUE + // Copying paperwork + if(paperwork_copy) + do_copy_loop(CALLBACK(src, PROC_REF(make_paperwork_copy)), usr) + return TRUE // Remove the paper/photo/document from the photocopier. if("remove") @@ -157,6 +168,9 @@ document_copy = null else if(check_ass()) to_chat(ass, span_notice("You feel a slight pressure on your ass.")) + else if(paperwork_copy) + remove_photocopy(paperwork_copy, usr) + paperwork_copy = null return TRUE // AI printing photos from their saved images. @@ -229,6 +243,8 @@ return toner_cartridge.charges >= (PHOTO_TONER_USE * num_copies) else if(ass) return toner_cartridge.charges >= (ASS_TONER_USE * num_copies) + else if(paperwork_copy) + return toner_cartridge.charges >= (PAPERWORK_TONER_USE * num_copies) return FALSE /** @@ -313,6 +329,23 @@ give_pixel_offset(copied_doc) toner_cartridge.charges -= DOCUMENT_TONER_USE +/** + * Handles the copying of documents. + * + * Checks first if `paperwork_copy` exists. Since this proc is called from a timer, it's possible that it was removed. + * Copies the stamp from a given piece of paperwork if it is already stamped, allowing for you to sell photocopied paperwork at the risk of losing budget money. + */ +/obj/machinery/photocopier/proc/make_paperwork_copy() + if(!paperwork_copy || !toner_cartridge) + return + var/obj/item/paperwork/photocopy/copied_paperwork = new(loc, paperwork_copy) + copied_paperwork.copy_stamp_info(paperwork_copy) + if(paperwork_copy.stamped) + copied_paperwork.stamp_icon = "paper_stamp-pc" //Override with the photocopy overlay sprite + copied_paperwork.add_stamp() + give_pixel_offset(copied_paperwork) + toner_cartridge.charges -= PAPERWORK_TONER_USE + /** * The procedure is called when printing a blank to write off toner consumption. */ @@ -430,7 +463,17 @@ else if(istype(O, /obj/item/areaeditor/blueprints)) to_chat(user, span_warning("The Blueprint is too large to put into the copier. You need to find something else to record the document.")) - else + else if(istype(O, /obj/item/paperwork)) + if(copier_empty()) + if(istype(O, /obj/item/paperwork/photocopy)) //No infinite paper chain. You need the original paperwork to make more copies. + to_chat(user, span_warning("The [O] is far too messy to produce a good copy!")) + else + if(!user.temporarilyRemoveItemFromInventory(O)) + return + paperwork_copy = O + do_insertion(O, user) + else + to_chat(user, span_warning("There is already something in [src]!")) return ..() /obj/machinery/photocopier/atom_break(damage_flag) @@ -514,7 +557,7 @@ * Return `FALSE` is the copier has something inside of it. Returns `TRUE` if it doesn't. */ /obj/machinery/photocopier/proc/copier_empty() - if(paper_copy || photo_copy || document_copy || check_ass()) + if(paper_copy || photo_copy || document_copy || check_ass() || paperwork_copy) return FALSE else return TRUE @@ -555,3 +598,4 @@ #undef DOCUMENT_TONER_USE #undef ASS_TONER_USE #undef MAX_COPIES_AT_ONCE +#undef PAPERWORK_TONER_USE diff --git a/tgstation.dme b/tgstation.dme index 6911b44de01..e64d1bf8548 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2924,6 +2924,7 @@ #include "code\modules\cargo\exports\parts.dm" #include "code\modules\cargo\exports\seeds.dm" #include "code\modules\cargo\exports\sheets.dm" +#include "code\modules\cargo\exports\stamped_paperwork.dm" #include "code\modules\cargo\exports\tools.dm" #include "code\modules\cargo\exports\weapons.dm" #include "code\modules\cargo\exports\xenobio.dm" @@ -4258,6 +4259,7 @@ #include "code\modules\paperwork\paper_premade.dm" #include "code\modules\paperwork\paperbin.dm" #include "code\modules\paperwork\paperplane.dm" +#include "code\modules\paperwork\paperwork.dm" #include "code\modules\paperwork\pen.dm" #include "code\modules\paperwork\photocopier.dm" #include "code\modules\paperwork\stamps.dm"