From 8d70e212393f10b682b357170d97e98fdae5ee5d Mon Sep 17 00:00:00 2001 From: Letter N <24603524+LetterN@users.noreply.github.com> Date: Thu, 20 Aug 2020 19:40:47 +0800 Subject: [PATCH] the unexpected paperwork update. paperwork rp? And also includes ntnet upgrade because fuck it. --- code/__DEFINES/dye_keys.dm | 4 + code/__DEFINES/misc.dm | 1 + code/datums/components/honkspam.dm | 22 ++ code/datums/components/label.dm | 87 ++++++ code/modules/NTNet/netdata.dm | 17 -- code/modules/NTNet/network.dm | 2 +- code/modules/asset_cache/asset_list_items.dm | 10 +- .../computers/_modular_computer_shared.dm | 12 +- .../computers/item/computer.dm | 111 ++------ .../computers/item/computer_components.dm | 13 + .../computers/item/computer_ui.dm | 57 ++++ .../computers/item/laptop.dm | 1 + .../computers/item/processor.dm | 21 +- .../computers/item/tablet.dm | 3 +- .../computers/item/tablet_presets.dm | 12 +- .../computers/machinery/console_presets.dm | 11 +- .../computers/machinery/modular_computer.dm | 29 +- .../modular_computers/file_system/program.dm | 59 ++-- .../file_system/program_events.dm | 2 +- .../file_system/programs/airestorer.dm | 13 +- .../file_system/programs/alarm.dm | 5 +- .../programs/antagonist/contract_uplink.dm | 2 +- .../programs/antagonist/revelation.dm | 2 +- .../file_system/programs/arcade.dm | 19 +- .../file_system/programs/atmosscan.dm | 26 +- .../file_system/programs/borg_monitor.dm | 10 +- .../file_system/programs/bounty_board.dm | 1 - .../file_system/programs/card.dm | 83 +++--- .../file_system/programs/cargobounty.dm | 1 - .../file_system/programs/cargoship.dm | 3 +- .../file_system/programs/crewmanifest.dm | 6 +- .../file_system/programs/jobmanagement.dm | 6 +- .../file_system/programs/ntdownloader.dm | 16 +- .../file_system/programs/ntmonitor.dm | 4 +- .../file_system/programs/ntnrc_client.dm | 1 - .../file_system/programs/powermonitor.dm | 5 +- .../file_system/programs/radar.dm | 20 +- .../file_system/programs/robocontrol.dm | 7 +- .../file_system/programs/sm_monitor.dm | 9 +- .../modular_computers/hardware/_hardware.dm | 14 +- .../modular_computers/hardware/ai_slot.dm | 9 +- .../hardware/battery_module.dm | 4 +- .../modular_computers/hardware/card_slot.dm | 120 ++++---- .../modular_computers/hardware/hard_drive.dm | 10 +- .../hardware/network_card.dm | 6 +- .../hardware/portable_disk.dm | 8 +- .../modular_computers/hardware/printer.dm | 1 + .../hardware/sensor_package.dm | 8 + .../modular_computers/laptop_vendor.dm | 12 +- code/modules/paperwork/carbonpaper.dm | 45 +++ code/modules/paperwork/clipboard.dm | 19 +- code/modules/paperwork/filingcabinet.dm | 27 +- code/modules/paperwork/folders.dm | 16 +- code/modules/paperwork/handlabeler.dm | 15 +- code/modules/paperwork/paper.dm | 268 ++++++------------ code/modules/paperwork/paper_cutter.dm | 27 +- code/modules/paperwork/paper_premade.dm | 88 +++--- code/modules/paperwork/paperbin.dm | 28 +- code/modules/paperwork/paperplane.dm | 56 ++-- code/modules/paperwork/pen.dm | 55 +++- code/modules/paperwork/stamps.dm | 23 ++ code/modules/paperwork/ticketmachine.dm | 231 +++++++++++++++ icons/obj/bureaucracy.dmi | Bin 17316 -> 21514 bytes icons/stamp_icons/font.png | Bin 0 -> 1037 bytes icons/stamp_icons/large_stamp-cap.png | Bin 6697 -> 1138 bytes icons/stamp_icons/large_stamp-ce.png | Bin 6472 -> 1161 bytes icons/stamp_icons/large_stamp-centcom.png | Bin 0 -> 1191 bytes icons/stamp_icons/large_stamp-chap.png | Bin 0 -> 1137 bytes icons/stamp_icons/large_stamp-clown.png | Bin 5732 -> 964 bytes icons/stamp_icons/large_stamp-cmo.png | Bin 7002 -> 1151 bytes icons/stamp_icons/large_stamp-deny.png | Bin 5486 -> 1095 bytes icons/stamp_icons/large_stamp-hop.png | Bin 5130 -> 1245 bytes icons/stamp_icons/large_stamp-hos.png | Bin 6608 -> 1338 bytes icons/stamp_icons/large_stamp-law.png | Bin 5877 -> 1176 bytes icons/stamp_icons/large_stamp-mime.png | Bin 0 -> 824 bytes icons/stamp_icons/large_stamp-ok.png | Bin 5682 -> 1123 bytes icons/stamp_icons/large_stamp-qm.png | Bin 6494 -> 1188 bytes icons/stamp_icons/large_stamp-rd.png | Bin 6745 -> 1256 bytes icons/stamp_icons/large_stamp-syndicate.png | Bin 0 -> 1198 bytes tgstation.dme | 4 + 80 files changed, 1080 insertions(+), 727 deletions(-) create mode 100644 code/datums/components/honkspam.dm create mode 100644 code/datums/components/label.dm create mode 100644 code/modules/modular_computers/hardware/sensor_package.dm create mode 100644 code/modules/paperwork/carbonpaper.dm create mode 100644 code/modules/paperwork/ticketmachine.dm create mode 100644 icons/stamp_icons/font.png create mode 100644 icons/stamp_icons/large_stamp-centcom.png create mode 100644 icons/stamp_icons/large_stamp-chap.png create mode 100644 icons/stamp_icons/large_stamp-mime.png create mode 100644 icons/stamp_icons/large_stamp-syndicate.png diff --git a/code/__DEFINES/dye_keys.dm b/code/__DEFINES/dye_keys.dm index 133f9c47d3..a01dcacc18 100644 --- a/code/__DEFINES/dye_keys.dm +++ b/code/__DEFINES/dye_keys.dm @@ -4,6 +4,7 @@ #define DYE_REGISTRY_SNEAKERS "sneakers" #define DYE_REGISTRY_FANNYPACK "fannypack" #define DYE_REGISTRY_BEDSHEET "bedsheet" +#define DYE_LAWYER_SPECIAL "lawyer_special" #define DYE_RED "red" #define DYE_ORANGE "orange" @@ -16,6 +17,7 @@ #define DYE_RAINBOW "rainbow" #define DYE_MIME "mime" #define DYE_COSMIC "cosmic" +#define DYE_SYNDICATE "syndicate" #define DYE_QM "qm" #define DYE_LAW "law" #define DYE_CAPTAIN "captain" @@ -26,3 +28,5 @@ #define DYE_CMO "cmo" #define DYE_REDCOAT "redcoat" #define DYE_CLOWN "clown" +#define DYE_CHAP "chap" +#define DYE_CENTCOM "centcom" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index fc1706a948..0704947dda 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -116,6 +116,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define CRAYON_FONT "Comic Sans MS" #define PRINTER_FONT "Times New Roman" #define SIGNFONT "Times New Roman" +#define CHARCOAL_FONT "Candara" #define RESIZE_DEFAULT_SIZE 1 diff --git a/code/datums/components/honkspam.dm b/code/datums/components/honkspam.dm new file mode 100644 index 0000000000..73b5e3335a --- /dev/null +++ b/code/datums/components/honkspam.dm @@ -0,0 +1,22 @@ +// This used to be in paper.dm, it was some snowflake code that was +// used ONLY on april's fool. I moved it to a component so it could be +// used in other places + +/datum/component/honkspam + dupe_mode = COMPONENT_DUPE_UNIQUE + var/spam_flag = FALSE + +/datum/component/honkspam/Initialize() + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/interact) + +/datum/component/honkspam/proc/reset_spamflag() + spam_flag = FALSE + +/datum/component/honkspam/proc/interact(mob/user) + if(!spam_flag) + spam_flag = TRUE + var/obj/item/parent_item = parent + playsound(parent_item.loc, 'sound/items/bikehorn.ogg', 50, TRUE) + addtimer(CALLBACK(src, .proc/reset_spamflag), 2 SECONDS) diff --git a/code/datums/components/label.dm b/code/datums/components/label.dm new file mode 100644 index 0000000000..c6d0c595eb --- /dev/null +++ b/code/datums/components/label.dm @@ -0,0 +1,87 @@ +/** + The label component. + + This component is used to manage labels applied by the hand labeler. + + Atoms can only have one instance of this component, and therefore only one label at a time. + This is to avoid having names like "Backpack (label1) (label2) (label3)". This is annoying and abnoxious to read. + + When a player clicks the atom with a hand labeler to apply a label, this component gets applied to it. + If the labeler is off, the component will be removed from it, and the label will be removed from its name. + */ +/datum/component/label + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + /// The name of the label the player is applying to the parent. + var/label_name + +/datum/component/label/Initialize(_label_name) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + label_name = _label_name + apply_label() + +/datum/component/label/RegisterWithParent() + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/OnAttackby) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/Examine) + +/datum/component/label/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_PARENT_ATTACKBY, COMSIG_PARENT_EXAMINE)) + +/** + This proc will fire after the parent is hit by a hand labeler which is trying to apply another label. + Since the parent already has a label, it will remove the old one from the parent's name, and apply the new one. +*/ +/datum/component/label/InheritComponent(datum/component/label/new_comp , i_am_original, _label_name) + remove_label() + if(new_comp) + label_name = new_comp.label_name + else + label_name = _label_name + apply_label() + +/** + This proc will trigger when any object is used to attack the parent. + + If the attacking object is not a hand labeler, it will return. + If the attacking object is a hand labeler it will restore the name of the parent to what it was before this component was added to it, and the component will be deleted. + + Arguments: + * source: The parent. + * attacker: The object that is hitting the parent. + * user: The mob who is wielding the attacking object. +*/ +/datum/component/label/proc/OnAttackby(datum/source, obj/item/attacker, mob/user) + // If the attacking object is not a hand labeler or its mode is 1 (has a label ready to apply), return. + // The hand labeler should be off (mode is 0), in order to remove a label. + var/obj/item/hand_labeler/labeler = attacker + if(!istype(labeler) || labeler.mode) + return + + remove_label() + playsound(parent, 'sound/items/poster_ripped.ogg', 20, TRUE) + to_chat(user, "You remove the label from [parent].") + qdel(src) // Remove the component from the object. + +/** + This proc will trigger when someone examines the parent. + It will attach the text found in the body of the proc to the `examine_list` and display it to the player examining the parent. + + Arguments: + * source: The parent. + * user: The mob exmaining the parent. + * examine_list: The current list of text getting passed from the parent's normal examine() proc. +*/ +/datum/component/label/proc/Examine(datum/source, mob/user, list/examine_list) + examine_list += "It has a label with some words written on it. Use a hand labeler to remove it." + +/// Applies a label to the name of the parent in the format of: "parent_name (label)" +/datum/component/label/proc/apply_label() + var/atom/owner = parent + owner.name += " ([label_name])" + +/// Removes the label from the parent's name +/datum/component/label/proc/remove_label() + var/atom/owner = parent + owner.name = replacetext(owner.name, "([label_name])", "") // Remove the label text from the parent's name, wherever it's located. + owner.name = trim(owner.name) // Shave off any white space from the beginning or end of the parent's name. diff --git a/code/modules/NTNet/netdata.dm b/code/modules/NTNet/netdata.dm index 857869fc21..2a3a85f706 100644 --- a/code/modules/NTNet/netdata.dm +++ b/code/modules/NTNet/netdata.dm @@ -11,23 +11,6 @@ var/list/passkey -// Process data before sending it -/datum/netdata/proc/pre_send(datum/component/ntnet_interface/interface) - // Decrypt the passkey. - if(autopasskey) - if(data["encrypted_passkey"] && !passkey) - var/result = XorEncrypt(hextostr(data["encrypted_passkey"], TRUE), SScircuit.cipherkey) - if(length(result) > 1) - passkey = json_decode(XorEncrypt(hextostr(data["encrypted_passkey"], TRUE), SScircuit.cipherkey)) - - // Encrypt the passkey. - if(!data["encrypted_passkey"] && passkey) - data["encrypted_passkey"] = strtohex(XorEncrypt(json_encode(passkey), SScircuit.cipherkey)) - - // If there is no sender ID, set the default one. - if(!sender_id && interface) - sender_id = interface.hardware_id - /datum/netdata/proc/standard_format_data(primary, secondary, passkey) data["data"] = primary data["data_secondary"] = secondary diff --git a/code/modules/NTNet/network.dm b/code/modules/NTNet/network.dm index d86ad792fe..2a2820d289 100644 --- a/code/modules/NTNet/network.dm +++ b/code/modules/NTNet/network.dm @@ -206,7 +206,7 @@ for(var/datum/ntnet_conversation/chan in chat_channels) if(chan.id == id) return chan - + // Resets the IDS alarm /datum/ntnet/proc/resetIDS() intrusion_detection_alarm = FALSE diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index e7bdbc6d52..712ee4c867 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -105,11 +105,11 @@ "stamp-rd" = 'icons/stamp_icons/large_stamp-rd.png', "stamp-cap" = 'icons/stamp_icons/large_stamp-cap.png', "stamp-qm" = 'icons/stamp_icons/large_stamp-qm.png', - "stamp-law" = 'icons/stamp_icons/large_stamp-law.png' - // "stamp-chap" = 'icons/stamp_icons/large_stamp-chap.png', - // "stamp-mime" = 'icons/stamp_icons/large_stamp-mime.png', - // "stamp-centcom" = 'icons/stamp_icons/large_stamp-centcom.png', - // "stamp-syndicate" = 'icons/stamp_icons/large_stamp-syndicate.png' + "stamp-law" = 'icons/stamp_icons/large_stamp-law.png', + "stamp-chap" = 'icons/stamp_icons/large_stamp-chap.png', + "stamp-mime" = 'icons/stamp_icons/large_stamp-mime.png', + "stamp-centcom" = 'icons/stamp_icons/large_stamp-centcom.png', + "stamp-syndicate" = 'icons/stamp_icons/large_stamp-syndicate.png' ) diff --git a/code/modules/modular_computers/computers/_modular_computer_shared.dm b/code/modules/modular_computers/computers/_modular_computer_shared.dm index 8ca93e8347..f0583a9af1 100644 --- a/code/modules/modular_computers/computers/_modular_computer_shared.dm +++ b/code/modules/modular_computers/computers/_modular_computer_shared.dm @@ -44,18 +44,20 @@ . += "It has a slot installed for an intelliCard." var/obj/item/computer_hardware/card_slot/card_slot = get_modular_computer_part(MC_CARD) + var/obj/item/computer_hardware/card_slot/card_slot2 = get_modular_computer_part(MC_CARD2) + var/multiple_slots = istype(card_slot) && istype(card_slot2) if(card_slot) - if(card_slot.stored_card || card_slot.stored_card2) + if(card_slot.stored_card || card_slot2.stored_card) var/obj/item/card/id/first_ID = card_slot.stored_card - var/obj/item/card/id/second_ID = card_slot.stored_card2 + var/obj/item/card/id/second_ID = card_slot2.stored_card var/multiple_cards = istype(first_ID) && istype(second_ID) if(user_is_adjacent) - . += "It has two slots for identification cards installed[multiple_cards ? " which contain [first_ID] and [second_ID]" : ", one of which contains [first_ID ? first_ID : second_ID]"]." + . += "It has [multiple_slots ? "two slots" : "a slot"] for identification cards installed[multiple_cards ? " which contain [first_ID] and [second_ID]" : ", one of which contains [first_ID ? first_ID : second_ID]"]." else - . += "It has two slots for identification cards installed, [multiple_cards ? "both of which appear" : "and one of them appears"] to be occupied." + . += "It has [multiple_slots ? "two slots" : "a slot"] for identification cards installed, [multiple_cards ? "both of which appear" : "and one of them appears"] to be occupied." . += "Alt-click [src] to eject the identification card[multiple_cards ? "s":""]." else - . += "It has two slots installed for identification cards." + . += "It has [multiple_slots ? "two slots" : "a slot"] installed for identification cards." var/obj/item/computer_hardware/printer/printer_slot = get_modular_computer_part(MC_PRINT) if(printer_slot) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 67c04de13f..4313f4fa98 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -4,6 +4,12 @@ /obj/item/modular_computer name = "modular microcomputer" desc = "A small portable microcomputer." + icon = 'icons/obj/computer.dmi' + icon_state = "laptop-open" + light_on = FALSE + integrity_failure = 0.5 + max_integrity = 100 + armor = list("melee" = 0, "bullet" = 20, "laser" = 20, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0) var/enabled = 0 // Whether the computer is turned on. var/screen_on = 1 // Whether the computer is active/opened/it's screen is on. @@ -22,8 +28,6 @@ // must have it's own DMI file. Icon states must be called exactly the same in all files, but may look differently // If you create a program which is limited to Laptops and Consoles you don't have to add it's icon_state overlay for Tablets too, for example. - icon = 'icons/obj/computer.dmi' - icon_state = "laptop-open" var/icon_state_unpowered = null // Icon state when the computer is turned off. var/icon_state_powered = null // Icon state when the computer is turned on. var/icon_state_menu = "menu" // Icon state overlay when the computer is turned on, but no program is loaded that would override the screen. @@ -31,20 +35,16 @@ var/max_hardware_size = 0 // Maximal hardware w_class. Tablets/PDAs have 1, laptops 2, consoles 4. var/steel_sheet_cost = 5 // Amount of steel sheets refunded when disassembling an empty frame of this computer. - integrity_failure = 0.5 - max_integrity = 100 - armor = list("melee" = 0, "bullet" = 20, "laser" = 20, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0) - - // Important hardware (must be installed for computer to work) - - // Optional hardware (improves functionality, but is not critical for computer to work) - - var/list/all_components = list() // List of "connection ports" in this computer and the components with which they are plugged + /// List of "connection ports" in this computer and the components with which they are plugged + var/list/all_components = list() + /// Lazy List of extra hardware slots that can be used modularly. + var/list/expansion_bays + /// Number of total expansion bays this computer has available. + var/max_bays = 0 var/list/idle_threads // Idle programs on background. They still receive process calls but can't be interacted with. var/obj/physical = null // Object that represents our computer. It's used for Adjacent() and UI visibility checks. var/has_light = FALSE //If the computer has a flashlight/LED light/what-have-you installed - var/light_on = FALSE //If that light is enabled var/comp_light_luminosity = 3 //The brightness of that light var/comp_light_color //The color of that light @@ -71,80 +71,15 @@ physical = null return ..() - -/obj/item/modular_computer/proc/add_verb(var/path) - switch(path) - if(MC_CARD) - verbs += /obj/item/modular_computer/proc/eject_id - if(MC_SDD) - verbs += /obj/item/modular_computer/proc/eject_disk - if(MC_AI) - verbs += /obj/item/modular_computer/proc/eject_card - -/obj/item/modular_computer/proc/remove_verb(path) - switch(path) - if(MC_CARD) - verbs -= /obj/item/modular_computer/proc/eject_id - if(MC_SDD) - verbs -= /obj/item/modular_computer/proc/eject_disk - if(MC_AI) - verbs -= /obj/item/modular_computer/proc/eject_card - -// Eject ID card from computer, if it has ID slot with card inside. -/obj/item/modular_computer/proc/eject_id() - set name = "Eject ID" - set category = "Object" - set src in view(1) - - if(issilicon(usr)) - return - var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] - if(usr.canUseTopic(src, BE_CLOSE)) - card_slot.try_eject(null, usr) - -// Eject ID card from computer, if it has ID slot with card inside. -/obj/item/modular_computer/proc/eject_card() - set name = "Eject Intellicard" - set category = "Object" - - if(issilicon(usr)) - return - var/obj/item/computer_hardware/ai_slot/ai_slot = all_components[MC_AI] - if(usr.canUseTopic(src, BE_CLOSE)) - ai_slot.try_eject(null, usr,1) - - -// Eject ID card from computer, if it has ID slot with card inside. -/obj/item/modular_computer/proc/eject_disk() - set name = "Eject Data Disk" - set category = "Object" - - if(issilicon(usr)) - return - - if(usr.canUseTopic(src, BE_CLOSE)) - var/obj/item/computer_hardware/hard_drive/portable/portable_drive = all_components[MC_SDD] - if(uninstall_component(portable_drive, usr)) - portable_drive.verb_pickup() - /obj/item/modular_computer/AltClick(mob/user) ..() if(issilicon(user)) return if(user.canUseTopic(src, BE_CLOSE)) + var/obj/item/computer_hardware/card_slot/card_slot2 = all_components[MC_CARD2] var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] - var/obj/item/computer_hardware/ai_slot/ai_slot = all_components[MC_AI] - var/obj/item/computer_hardware/hard_drive/portable/portable_drive = all_components[MC_SDD] - if(portable_drive) - if(uninstall_component(portable_drive, user)) - portable_drive.verb_pickup() - else - if(card_slot && card_slot.try_eject(null, user)) - return - if(ai_slot) - ai_slot.try_eject(null, user) - + return (card_slot2?.try_eject(user) || card_slot?.try_eject(user)) //Try the secondary one first. // Gets IDs/access levels from card slot. Would be useful when/if PDAs would become modular PCs. /obj/item/modular_computer/GetAccess() @@ -160,19 +95,25 @@ return ..() /obj/item/modular_computer/RemoveID() + var/obj/item/computer_hardware/card_slot/card_slot2 = all_components[MC_CARD2] var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] - if(!card_slot) - return - return card_slot.RemoveID() + return (card_slot2?.try_eject() || card_slot?.try_eject()) //Try the secondary one first. /obj/item/modular_computer/InsertID(obj/item/inserting_item) var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] - if(!card_slot) + var/obj/item/computer_hardware/card_slot/card_slot2 = all_components[MC_CARD2] + if(!(card_slot || card_slot2)) + //to_chat(user, "There isn't anywhere you can fit a card into on this computer.") return FALSE + var/obj/item/card/inserting_id = inserting_item.RemoveID() if(!inserting_id) return FALSE - return card_slot.try_insert(inserting_id) + + if((card_slot?.try_insert(inserting_id)) || (card_slot2?.try_insert(inserting_id))) + return TRUE + //to_chat(user, "This computer doesn't have an open card slot.") + return FALSE /obj/item/modular_computer/MouseDrop(obj/over_object, src_location, over_location) var/mob/M = usr @@ -189,7 +130,7 @@ return if(enabled) ui_interact(user) - else if(IsAdminGhost(user)) + else if(isAdminGhostAI(user)) var/response = alert(user, "This computer is turned off. Would you like to turn it on?", "Admin Override", "Yes", "No") if(response == "Yes") turn_on(user) diff --git a/code/modules/modular_computers/computers/item/computer_components.dm b/code/modules/modular_computers/computers/item/computer_components.dm index 3c94a66384..8668b279cf 100644 --- a/code/modules/modular_computers/computers/item/computer_components.dm +++ b/code/modules/modular_computers/computers/item/computer_components.dm @@ -6,6 +6,14 @@ to_chat(user, "This component is too large for \the [src]!") return FALSE + if(H.expansion_hw) + if(LAZYLEN(expansion_bays) >= max_bays) + to_chat(user, "All of the computer's expansion bays are filled.") + return FALSE + if(LAZYACCESS(expansion_bays, H.device_type)) + to_chat(user, "The computer immediately ejects /the [H] and flashes an error: \"Hardware Address Conflict\".") + return FALSE + if(all_components[H.device_type]) to_chat(user, "This computer's hardware slot is already occupied by \the [all_components[H.device_type]].") return FALSE @@ -20,6 +28,8 @@ if(user && !user.transferItemToLoc(H, src)) return FALSE + if(H.expansion_hw) + LAZYSET(expansion_bays, H.device_type, H) all_components[H.device_type] = H to_chat(user, "You install \the [H] into \the [src].") @@ -32,7 +42,9 @@ /obj/item/modular_computer/proc/uninstall_component(obj/item/computer_hardware/H, mob/living/user = null) if(H.holder != src) // Not our component at all. return FALSE + if(H.expansion_hw) + LAZYREMOVE(expansion_bays, H.device_type) all_components.Remove(H.device_type) to_chat(user, "You remove \the [H] from \the [src].") @@ -43,6 +55,7 @@ if(enabled && !use_power()) shutdown_computer() update_icon() + return TRUE // Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index fd017e2b0f..4a985b93c1 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -44,6 +44,33 @@ /obj/item/modular_computer/ui_data(mob/user) var/list/data = get_header_data() data["device_theme"] = device_theme + + data["login"] = list() + var/obj/item/computer_hardware/card_slot/cardholder = all_components[MC_CARD] + if(cardholder) + var/obj/item/card/id/stored_card = cardholder.GetID() + if(stored_card) + var/stored_name = stored_card.registered_name + var/stored_title = stored_card.assignment + if(!stored_name) + stored_name = "Unknown" + if(!stored_title) + stored_title = "Unknown" + data["login"] = list( + IDName = stored_name, + IDJob = stored_title, + ) + + data["removable_media"] = list() + if(all_components[MC_SDD]) + data["removable_media"] += "removable storage disk" + var/obj/item/computer_hardware/ai_slot/intelliholder = all_components[MC_AI] + if(intelliholder?.stored_card) + data["removable_media"] += "intelliCard" + var/obj/item/computer_hardware/card_slot/secondarycardholder = all_components[MC_CARD2] + if(secondarycardholder?.stored_card) + data["removable_media"] += "secondary RFID card" + data["programs"] = list() var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD] for(var/datum/computer_file/program/P in hard_drive.stored_files) @@ -157,6 +184,36 @@ light_color = new_color update_light() return TRUE + + if("PC_Eject_Disk") + var/param = params["name"] + var/mob/user = usr + switch(param) + if("removable storage disk") + var/obj/item/computer_hardware/hard_drive/portable/portable_drive = all_components[MC_SDD] + if(!portable_drive) + return + if(uninstall_component(portable_drive, usr)) + user.put_in_hands(portable_drive) + playsound(src, 'sound/machines/card_slide.ogg', 50) + if("intelliCard") + var/obj/item/computer_hardware/ai_slot/intelliholder = all_components[MC_AI] + if(!intelliholder) + return + if(intelliholder.try_eject(user)) + playsound(src, 'sound/machines/card_slide.ogg', 50) + if("ID") + var/obj/item/computer_hardware/card_slot/cardholder = all_components[MC_CARD] + if(!cardholder) + return + cardholder.try_eject(user) + if("secondary RFID card") + var/obj/item/computer_hardware/card_slot/cardholder = all_components[MC_CARD2] + if(!cardholder) + return + cardholder.try_eject(user) + + else return diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index 5927d57a0b..ef83140a8f 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -12,6 +12,7 @@ hardware_flag = PROGRAM_LAPTOP max_hardware_size = 2 w_class = WEIGHT_CLASS_NORMAL + max_bays = 4 // No running around with open laptops in hands. item_flags = SLOWS_WHILE_IN_HAND diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index c79d7a9361..0d7b567877 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -8,6 +8,7 @@ icon_state_unpowered = null icon_state_menu = null hardware_flag = 0 + max_bays = 4 var/obj/machinery/modular_computer/machinery_computer = null @@ -18,7 +19,7 @@ machinery_computer = null . = ..() -/obj/item/modular_computer/processor/New(comp) //intentional new probably +/obj/item/modular_computer/processor/New(comp) ..() STOP_PROCESSING(SSobj, src) // Processed by its machine @@ -56,23 +57,5 @@ machinery_computer.update_icon() return -/obj/item/modular_computer/processor/add_verb(path) - switch(path) - if(MC_CARD) - machinery_computer.verbs += /obj/machinery/modular_computer/proc/eject_id - if(MC_SDD) - machinery_computer.verbs += /obj/machinery/modular_computer/proc/eject_disk - if(MC_AI) - machinery_computer.verbs += /obj/machinery/modular_computer/proc/eject_card - -/obj/item/modular_computer/processor/remove_verb(path) - switch(path) - if(MC_CARD) - machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_id - if(MC_SDD) - machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_disk - if(MC_AI) - machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_card - /obj/item/modular_computer/processor/attack_ghost(mob/user) ui_interact(user) diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm index 41a256467f..67e8118c7a 100644 --- a/code/modules/modular_computers/computers/item/tablet.dm +++ b/code/modules/modular_computers/computers/item/tablet.dm @@ -5,10 +5,11 @@ icon_state_unpowered = "tablet" icon_state_powered = "tablet" icon_state_menu = "menu" - //worn_icon_state = "tablet" + // worn_icon_state = "tablet" hardware_flag = PROGRAM_TABLET max_hardware_size = 1 w_class = WEIGHT_CLASS_SMALL + max_bays = 3 steel_sheet_cost = 1 slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT has_light = TRUE //LED flashlight! diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm index 7cca8ea5b4..d4945d04de 100644 --- a/code/modules/modular_computers/computers/item/tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -26,10 +26,20 @@ install_component(new /obj/item/computer_hardware/processor_unit/small) install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer)) install_component(hard_drive) + install_component(new /obj/item/computer_hardware/card_slot) install_component(new /obj/item/computer_hardware/network_card) install_component(new /obj/item/computer_hardware/printer/mini) hard_drive.store_file(new /datum/computer_file/program/bounty) - //hard_drive.store_file(new /datum/computer_file/program/shipping) + hard_drive.store_file(new /datum/computer_file/program/shipping) + +/obj/item/modular_computer/tablet/preset/advanced/atmos/Initialize() //This will be defunct and will be replaced when NtOS PDAs are done + . = ..() + install_component(new /obj/item/computer_hardware/sensorpackage) + +/obj/item/modular_computer/tablet/preset/advanced/command/Initialize() + . = ..() + install_component(new /obj/item/computer_hardware/sensorpackage) + install_component(new /obj/item/computer_hardware/card_slot/secondary) /// Given by the syndicate as part of the contract uplink bundle - loads in the Contractor Uplink. /obj/item/modular_computer/tablet/syndicate_contract_uplink/preset/uplink/Initialize() diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index 9d29b23e76..12b2f6d25a 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -1,6 +1,6 @@ /obj/machinery/modular_computer/console/preset // Can be changed to give devices specific hardware - var/_has_id_slot = FALSE + var/_has_second_id_slot = FALSE var/_has_printer = FALSE var/_has_battery = FALSE var/_has_ai = FALSE @@ -11,8 +11,9 @@ return cpu.install_component(new /obj/item/computer_hardware/processor_unit) - if(_has_id_slot) - cpu.install_component(new /obj/item/computer_hardware/card_slot) + cpu.install_component(new /obj/item/computer_hardware/card_slot) + if(_has_second_id_slot) + cpu.install_component(new /obj/item/computer_hardware/card_slot/secondary) if(_has_printer) cpu.install_component(new /obj/item/computer_hardware/printer) if(_has_battery) @@ -59,7 +60,7 @@ console_department = "Command" name = "command console" desc = "A stationary computer. This one comes preloaded with command programs." - _has_id_slot = TRUE + _has_second_id_slot = TRUE _has_printer = TRUE /obj/machinery/modular_computer/console/preset/command/install_programs() @@ -73,7 +74,7 @@ console_department = "Identification" name = "identification console" desc = "A stationary computer. This one comes preloaded with identification modification programs." - _has_id_slot = TRUE + _has_second_id_slot = TRUE _has_printer = TRUE /obj/machinery/modular_computer/console/preset/id/install_programs() diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 6f016ad147..0e6f4d161a 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -75,30 +75,6 @@ add_overlay("bsod") add_overlay("broken") -// Eject ID card from computer, if it has ID slot with card inside. -/obj/machinery/modular_computer/proc/eject_id() - set name = "Eject ID" - set category = "Object" - - if(cpu) - cpu.eject_id() - -// Eject ID card from computer, if it has ID slot with card inside. -/obj/machinery/modular_computer/proc/eject_disk() - set name = "Eject Data Disk" - set category = "Object" - - if(cpu) - cpu.eject_disk() - -/obj/machinery/modular_computer/proc/eject_card() - set name = "Eject Intellicard" - set category = "Object" - set src in view(1) - - if(cpu) - cpu.eject_card() - /obj/machinery/modular_computer/AltClick(mob/user) if(cpu) cpu.AltClick(user) @@ -136,7 +112,7 @@ return . = ..() -/obj/machinery/modular_computer/attackby(var/obj/item/W as obj, mob/user) +/obj/machinery/modular_computer/attackby(obj/item/W as obj, mob/user) if(cpu && !(flags_1 & NODECONSTRUCT_1)) return cpu.attackby(W, user) return ..() @@ -169,5 +145,4 @@ // "Brute" damage mostly damages the casing. /obj/machinery/modular_computer/bullet_act(obj/item/projectile/Proj) if(cpu) - return cpu.bullet_act(Proj) - return ..() + cpu.bullet_act(Proj) diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 12e5ef6e95..6d6a48d567 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -25,8 +25,6 @@ var/ntnet_status = 1 /// Bitflags (PROGRAM_CONSOLE, PROGRAM_LAPTOP, PROGRAM_TABLET combination) or PROGRAM_ALL var/usage_flags = PROGRAM_ALL - /// Optional string that describes what NTNet server/system this program connects to. Used in default logging. - var/network_destination = null /// Whether the program can be downloaded from NTNet. Set to 0 to disable. var/available_on_ntnet = 1 /// Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable. @@ -82,10 +80,18 @@ /datum/computer_file/program/proc/process_tick() return 1 -// Check if the user can run program. Only humans can operate computer. Automatically called in run_program() -// User has to wear their ID for ID Scan to work. -// Can also be called manually, with optional parameter being access_to_check to scan the user's ID -/datum/computer_file/program/proc/can_run(mob/user, loud = FALSE, access_to_check, transfer = FALSE) +/** + *Check if the user can run program. Only humans can operate computer. Automatically called in run_program() + *ID must be inserted into a card slot to be read. If the program is not currently installed (as is the case when + *NT Software Hub is checking available software), a list can be given to be used instead. + *Arguments: + *user is a ref of the mob using the device. + *loud is a bool deciding if this proc should use to_chats + *access_to_check is an access level that will be checked against the ID + *transfer, if TRUE and access_to_check is null, will tell this proc to use the program's transfer_access in place of access_to_check + *access can contain a list of access numbers to check against. If access is not empty, it will be used istead of checking any inserted ID. +*/ +/datum/computer_file/program/proc/can_run(mob/user, loud = FALSE, access_to_check, transfer = FALSE, var/list/access) // Defaults to required_access if(!access_to_check) if(transfer && transfer_access) @@ -104,29 +110,24 @@ if(issilicon(user)) return TRUE - if(ishuman(user)) + if(!length(access)) var/obj/item/card/id/D var/obj/item/computer_hardware/card_slot/card_slot - if(computer && card_slot) + if(computer) card_slot = computer.all_components[MC_CARD] - D = card_slot.GetID() - var/mob/living/carbon/human/h = user - var/obj/item/card/id/I = h.get_idcard(TRUE) + D = card_slot?.GetID() - if(!I && !D) + if(!D) if(loud) to_chat(user, "\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning.") return FALSE + access = D.GetAccess() - if(I) - if(access_to_check in I.GetAccess()) - return TRUE - else if(D) - if(access_to_check in D.GetAccess()) - return TRUE - if(loud) - to_chat(user, "\The [computer] flashes an \"Access Denied\" warning.") - return 0 + if(access_to_check in access) + return TRUE + if(loud) + to_chat(user, "\The [computer] flashes an \"Access Denied\" warning.") + return FALSE // This attempts to retrieve header data for UIs. If implementing completely new device of different type than existing ones // always include the device here in this proc. This proc basically relays the request to whatever is running the program. @@ -139,8 +140,12 @@ // When implementing new program based device, use this to run the program. /datum/computer_file/program/proc/run_program(mob/living/user) if(can_run(user, 1)) - if(requires_ntnet && network_destination) - generate_network_log("Connection opened to [network_destination].") + if(requires_ntnet) + var/obj/item/card/id/ID + var/obj/item/computer_hardware/card_slot/card_holder = computer.all_components[MC_CARD] + if(card_holder) + ID = card_holder.GetID() + generate_network_log("Connection opened -- Program ID: [filename] User:[ID?"[ID.registered_name]":"None"]") program_state = PROGRAM_STATE_ACTIVE return 1 return 0 @@ -162,8 +167,12 @@ // Use this proc to kill the program. Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client. /datum/computer_file/program/proc/kill_program(forced = FALSE) program_state = PROGRAM_STATE_KILLED - if(network_destination) - generate_network_log("Connection to [network_destination] closed.") + if(requires_ntnet) + var/obj/item/card/id/ID + var/obj/item/computer_hardware/card_slot/card_holder = computer.all_components[MC_CARD] + if(card_holder) + ID = card_holder.GetID() + generate_network_log("Connection closed -- Program ID: [filename] User:[ID?"[ID.registered_name]":"None"]") return 1 /datum/computer_file/program/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/modular_computers/file_system/program_events.dm b/code/modules/modular_computers/file_system/program_events.dm index 3c1daa5af3..1cb74a227b 100644 --- a/code/modules/modular_computers/file_system/program_events.dm +++ b/code/modules/modular_computers/file_system/program_events.dm @@ -2,7 +2,7 @@ // Always include a parent call when overriding an event. // Called when the ID card is removed from computer. ID is removed AFTER this proc. -/datum/computer_file/program/proc/event_idremoved(background, slot) +/datum/computer_file/program/proc/event_idremoved(background) return // Called when the computer fails due to power loss. Override when program wants to specifically react to power loss. diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm index 364ad79737..7ae6dd203a 100644 --- a/code/modules/modular_computers/file_system/programs/airestorer.dm +++ b/code/modules/modular_computers/file_system/programs/airestorer.dm @@ -1,8 +1,8 @@ /datum/computer_file/program/aidiag filename = "aidiag" - filedesc = "AI Integrity Restorer" + filedesc = "NT FRK" program_icon_state = "generic" - extended_desc = "This program is capable of reconstructing damaged AI systems. Requires direct AI connection via intellicard slot." + extended_desc = "Firmware Restoration Kit, capable of reconstructing damaged AI systems. Requires direct AI connection via intellicard slot." size = 12 requires_ntnet = FALSE usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP @@ -48,7 +48,7 @@ if(computer.all_components[MC_AI]) var/obj/item/computer_hardware/ai_slot/ai_slot = computer.all_components[MC_AI] if(ai_slot && ai_slot.stored_card) - ai_slot.try_eject(0,usr) + ai_slot.try_eject(usr) return TRUE /datum/computer_file/program/aidiag/process_tick() @@ -71,14 +71,19 @@ ai_slot.locked = FALSE restoring = FALSE return - ai_slot.locked =TRUE + ai_slot.locked = TRUE A.adjustOxyLoss(-5, 0)//, FALSE) A.adjustFireLoss(-5, 0)//, FALSE) A.adjustToxLoss(-5, 0) A.adjustBruteLoss(-5, 0) + + // Please don't forget to update health, otherwise the below if statements will probably always fail. A.updatehealth() + if(A.health >= 0 && A.stat == DEAD) A.revive(full_heal = FALSE, admin_revive = FALSE) + cardhold.update_icon() + // Finished restoring if(A.health >= 100) ai_slot.locked = FALSE diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm index 577fad83d0..55dea600e3 100644 --- a/code/modules/modular_computers/file_system/programs/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/alarm.dm @@ -1,11 +1,10 @@ /datum/computer_file/program/alarm_monitor filename = "alarmmonitor" - filedesc = "Alarm Monitor" + filedesc = "Canary" ui_header = "alarm_green.gif" program_icon_state = "alert-green" - extended_desc = "This program provides visual interface for station's alarm system." + extended_desc = "This program provides visual interface for a station's alarm system." requires_ntnet = 1 - network_destination = "alarm monitoring network" size = 5 tgui_id = "NtosStationAlertConsole" var/has_alert = 0 diff --git a/code/modules/modular_computers/file_system/programs/antagonist/contract_uplink.dm b/code/modules/modular_computers/file_system/programs/antagonist/contract_uplink.dm index 3accb8e02d..aa361d4544 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/contract_uplink.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/contract_uplink.dm @@ -14,7 +14,7 @@ var/assigned = FALSE var/first_load = TRUE -/datum/computer_file/program/contract_uplink/run_program(var/mob/living/user) +/datum/computer_file/program/contract_uplink/run_program(mob/living/user) . = ..(user) /datum/computer_file/program/contract_uplink/ui_act(action, params) diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm index 2ba3d69fe6..4f1c488b9e 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm @@ -10,7 +10,7 @@ tgui_id = "NtosRevelation" var/armed = 0 -/datum/computer_file/program/revelation/run_program(var/mob/living/user) +/datum/computer_file/program/revelation/run_program(mob/living/user) . = ..(user) if(armed) activate() diff --git a/code/modules/modular_computers/file_system/programs/arcade.dm b/code/modules/modular_computers/file_system/programs/arcade.dm index 2503073f9a..87a3f1ec94 100644 --- a/code/modules/modular_computers/file_system/programs/arcade.dm +++ b/code/modules/modular_computers/file_system/programs/arcade.dm @@ -1,10 +1,9 @@ /datum/computer_file/program/arcade - filename = "arcade" - filedesc = "Nanotrasen Micro Arcade" + filename = "dsarcade" + filedesc = "Donksoft Micro Arcade" program_icon_state = "arcade" extended_desc = "This port of the classic game 'Outbomb Cuban Pete', redesigned to run on tablets, with thrilling graphics and chilling storytelling." requires_ntnet = FALSE - network_destination = "arcade network" size = 6 tgui_id = "NtosArcade" @@ -25,7 +24,7 @@ /datum/computer_file/program/arcade/proc/game_check(mob/user) sleep(5) - //user?.mind?.adjust_experience(/datum/skill/gaming, 1) No gaming(TM) Yet + // user?.mind?.adjust_experience(/datum/skill/gaming, 1) if(boss_hp <= 0) heads_up = "You have crushed [boss_name]! Rejoice!" playsound(computer.loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3, falloff = 10) @@ -34,7 +33,7 @@ if(istype(computer)) computer.update_icon() ticket_count += 1 - //user?.mind?.adjust_experience(/datum/skill/gaming, 50) + // user?.mind?.adjust_experience(/datum/skill/gaming, 50) sleep(10) else if(player_hp <= 0 || player_mp <= 0) heads_up = "You have been defeated... how will the station survive?" @@ -43,7 +42,7 @@ program_icon_state = "arcade_off" if(istype(computer)) computer.update_icon() - //user?.mind?.adjust_experience(/datum/skill/gaming, 10) + // user?.mind?.adjust_experience(/datum/skill/gaming, 10) sleep(10) /datum/computer_file/program/arcade/proc/enemy_check(mob/user) @@ -98,8 +97,8 @@ if(computer) printer = computer.all_components[MC_PRINT] - //var/gamerSkillLevel = usr.mind?.get_skill_level(/datum/skill/gaming) - //var/gamerSkill = usr.mind?.get_skill_modifier(/datum/skill/gaming, SKILL_RANDS_MODIFIER) + // var/gamerSkillLevel = usr.mind?.get_skill_level(/datum/skill/gaming) + // var/gamerSkill = usr.mind?.get_skill_modifier(/datum/skill/gaming, SKILL_RANDS_MODIFIER) switch(action) if("Attack") var/attackamt = 0 //Spam prevention. @@ -119,8 +118,8 @@ if(pause_state == FALSE) healamt = rand(6,8)// + rand(0, gamerSkill) var/maxPointCost = 3 - //if(gamerSkillLevel >= SKILL_LEVEL_JOURNEYMAN) - // maxPointCost = 2 + // if(gamerSkillLevel >= SKILL_LEVEL_JOURNEYMAN) + // maxPointCost = 2 healcost = rand(1, maxPointCost) pause_state = TRUE heads_up = "You heal for [healamt] damage." diff --git a/code/modules/modular_computers/file_system/programs/atmosscan.dm b/code/modules/modular_computers/file_system/programs/atmosscan.dm index 2df751bebd..ebb2770f2e 100644 --- a/code/modules/modular_computers/file_system/programs/atmosscan.dm +++ b/code/modules/modular_computers/file_system/programs/atmosscan.dm @@ -1,29 +1,41 @@ /datum/computer_file/program/atmosscan filename = "atmosscan" - filedesc = "Atmospheric Scanner" + filedesc = "AtmoZphere" program_icon_state = "air" extended_desc = "A small built-in sensor reads out the atmospheric conditions around the device." - network_destination = "atmos scan" size = 4 tgui_id = "NtosAtmos" +/datum/computer_file/program/atmosscan/run_program(mob/living/user) + . = ..() + if (!.) + return + if(!computer?.get_modular_computer_part(MC_SENSORS)) //Giving a clue to users why the program is spitting out zeros. + to_chat(user, "\The [computer] flashes an error: \"hardware\\sensorpackage\\startup.bin -- file not found\".") + + /datum/computer_file/program/atmosscan/ui_data(mob/user) var/list/data = get_header_data() var/list/airlist = list() var/turf/T = get_turf(ui_host()) - if(T) + var/obj/item/computer_hardware/sensorpackage/sensors = computer?.get_modular_computer_part(MC_SENSORS) + if(T && sensors?.check_functionality()) var/datum/gas_mixture/environment = T.return_air() - var/list/env_gases = environment.get_gases() + var/list/env_gases = environment.gases var/pressure = environment.return_pressure() var/total_moles = environment.total_moles() data["AirPressure"] = round(pressure,0.1) - data["AirTemp"] = round(environment.return_temperature()-T0C) + data["AirTemp"] = round(environment.temperature-T0C) if (total_moles) for(var/id in env_gases) - var/gas_level = environment.get_moles(id)/total_moles + var/gas_level = env_gases[id][MOLES]/total_moles if(gas_level > 0) - airlist += list(list("name" = "[GLOB.meta_gas_names[id]]", "percentage" = round(gas_level*100, 0.01))) + airlist += list(list("name" = "[env_gases[id][GAS_META][META_GAS_NAME]]", "percentage" = round(gas_level*100, 0.01))) data["AirData"] = airlist + else + data["AirPressure"] = 0 + data["AirTemp"] = 0 + data["AirData"] = list(list()) return data /datum/computer_file/program/atmosscan/ui_act(action, list/params) diff --git a/code/modules/modular_computers/file_system/programs/borg_monitor.dm b/code/modules/modular_computers/file_system/programs/borg_monitor.dm index c2160a0e92..d1bf7dbab3 100644 --- a/code/modules/modular_computers/file_system/programs/borg_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/borg_monitor.dm @@ -1,12 +1,11 @@ /datum/computer_file/program/borg_monitor - filename = "cyborgmonitor" - filedesc = "Cyborg Remote Monitoring" + filename = "siliconnect" + filedesc = "SiliConnect" ui_header = "borg_mon.gif" program_icon_state = "generic" extended_desc = "This program allows for remote monitoring of station cyborgs." requires_ntnet = TRUE transfer_access = ACCESS_ROBOTICS - network_destination = "cyborg remote monitoring" size = 5 tgui_id = "NtosCyborgRemoteMonitor" @@ -81,8 +80,8 @@ return ID.registered_name /datum/computer_file/program/borg_monitor/syndicate - filename = "scyborgmonitor" - filedesc = "Mission-Specific Cyborg Remote Monitoring" + filename = "roboverlord" + filedesc = "Roboverlord" ui_header = "borg_mon.gif" program_icon_state = "generic" extended_desc = "This program allows for remote monitoring of mission-assigned cyborgs." @@ -90,7 +89,6 @@ available_on_ntnet = FALSE available_on_syndinet = TRUE transfer_access = null - network_destination = "cyborg remote monitoring" tgui_id = "NtosCyborgRemoteMonitorSyndicate" /datum/computer_file/program/borg_monitor/syndicate/evaluate_borg(mob/living/silicon/robot/R) diff --git a/code/modules/modular_computers/file_system/programs/bounty_board.dm b/code/modules/modular_computers/file_system/programs/bounty_board.dm index 46fde84f65..2e7d3cc87f 100644 --- a/code/modules/modular_computers/file_system/programs/bounty_board.dm +++ b/code/modules/modular_computers/file_system/programs/bounty_board.dm @@ -4,7 +4,6 @@ program_icon_state = "bountyboard" extended_desc = "A multi-platform network for placing requests across the station, with payment across the network being possible.." requires_ntnet = TRUE - network_destination = "bounty board interface" size = 10 tgui_id = "NtosRequestKiosk" ///Reference to the currently logged in user. diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index 842d6e2588..6d45914add 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -7,8 +7,8 @@ #define CARDCON_DEPARTMENT_COMMAND "Command" /datum/computer_file/program/card_mod - filename = "cardmod" - filedesc = "ID Card Modification" + filename = "plexagonidwriter" + filedesc = "Plexagon Access Management" program_icon_state = "id" extended_desc = "Program for programming employee ID cards to access parts of the station." transfer_access = ACCESS_HEADS @@ -98,17 +98,19 @@ return TRUE var/obj/item/computer_hardware/card_slot/card_slot + var/obj/item/computer_hardware/card_slot/card_slot2 var/obj/item/computer_hardware/printer/printer if(computer) card_slot = computer.all_components[MC_CARD] + card_slot2 = computer.all_components[MC_CARD2] printer = computer.all_components[MC_PRINT] - if(!card_slot) + if(!card_slot || !card_slot2) return var/mob/user = usr - var/obj/item/card/id/user_id_card = user.get_idcard(FALSE) + var/obj/item/card/id/user_id_card = card_slot.stored_card - var/obj/item/card/id/id_card = card_slot.stored_card + var/obj/item/card/id/target_id_card = card_slot2.stored_card switch(action) if("PRG_authenticate") @@ -129,14 +131,14 @@ return var/contents = {"

Access Report

Prepared By: [user_id_card && user_id_card.registered_name ? user_id_card.registered_name : "Unknown"]
- For: [id_card.registered_name ? id_card.registered_name : "Unregistered"]
+ For: [target_id_card.registered_name ? target_id_card.registered_name : "Unregistered"]

- Assignment: [id_card.assignment]
+ Assignment: [target_id_card.assignment]
Access:
"} var/known_access_rights = get_all_accesses() - for(var/A in id_card.access) + for(var/A in target_id_card.access) if(A in known_access_rights) contents += " [get_access_desc(A)]" @@ -148,43 +150,40 @@ computer.visible_message("\The [computer] prints out a paper.") return TRUE if("PRG_eject") - if(!computer || !card_slot) + if(!computer || !card_slot2) return - if(id_card) - GLOB.data_core.manifest_modify(id_card.registered_name, id_card.assignment) - card_slot.try_eject(TRUE, user) + if(target_id_card) + GLOB.data_core.manifest_modify(target_id_card.registered_name, target_id_card.assignment) + return card_slot2.try_eject(user) else var/obj/item/I = user.get_active_held_item() if(istype(I, /obj/item/card/id)) - if(!user.transferItemToLoc(I, computer)) - return - card_slot.stored_card = I - playsound(computer, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - return TRUE + return card_slot2.try_insert(I) + return FALSE if("PRG_terminate") if(!computer || !authenticated) return if(minor) - if(!(id_card.assignment in head_subordinates) && id_card.assignment != "Assistant") + if(!(target_id_card.assignment in head_subordinates) && target_id_card.assignment != "Assistant") return - id_card.access -= get_all_centcom_access() + get_all_accesses() - id_card.assignment = "Unassigned" - id_card.update_label() + target_id_card.access -= get_all_centcom_access() + get_all_accesses() + target_id_card.assignment = "Unassigned" + target_id_card.update_label() playsound(computer, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return TRUE if("PRG_edit") - if(!computer || !authenticated || !id_card) + if(!computer || !authenticated || !target_id_card) return var/new_name = params["name"] if(!new_name) return - id_card.registered_name = new_name - id_card.update_label() + target_id_card.registered_name = new_name + target_id_card.update_label() playsound(computer, "terminal_type", 50, FALSE) return TRUE if("PRG_assign") - if(!computer || !authenticated || !id_card) + if(!computer || !authenticated || !target_id_card) return var/target = params["assign_target"] if(!target) @@ -193,8 +192,8 @@ if(target == "Custom") var/custom_name = params["custom_name"] if(custom_name) - id_card.assignment = custom_name - id_card.update_label() + target_id_card.assignment = custom_name + target_id_card.update_label() else if(minor && !(target in head_subordinates)) return @@ -212,10 +211,10 @@ to_chat(user, "No class exists for this job: [target]") return new_access = job.get_access() - id_card.access -= get_all_centcom_access() + get_all_accesses() - id_card.access |= new_access - id_card.assignment = target - id_card.update_label() + target_id_card.access -= get_all_centcom_access() + get_all_accesses() + target_id_card.access |= new_access + target_id_card.assignment = target + target_id_card.update_label() playsound(computer, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) return TRUE if("PRG_access") @@ -223,22 +222,22 @@ return var/access_type = text2num(params["access_target"]) if(access_type in (is_centcom ? get_all_centcom_access() : get_all_accesses())) - if(access_type in id_card.access) - id_card.access -= access_type + if(access_type in target_id_card.access) + target_id_card.access -= access_type else - id_card.access |= access_type + target_id_card.access |= access_type playsound(computer, "terminal_type", 50, FALSE) return TRUE if("PRG_grantall") if(!computer || !authenticated || minor) return - id_card.access |= (is_centcom ? get_all_centcom_access() : get_all_accesses()) + target_id_card.access |= (is_centcom ? get_all_centcom_access() : get_all_accesses()) playsound(computer, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) return TRUE if("PRG_denyall") if(!computer || !authenticated || minor) return - id_card.access.Cut() + target_id_card.access.Cut() playsound(computer, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return TRUE if("PRG_grantregion") @@ -247,7 +246,7 @@ var/region = text2num(params["region"]) if(isnull(region)) return - id_card.access |= get_region_accesses(region) + target_id_card.access |= get_region_accesses(region) playsound(computer, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) return TRUE if("PRG_denyregion") @@ -256,7 +255,7 @@ var/region = text2num(params["region"]) if(isnull(region)) return - id_card.access -= get_region_accesses(region) + target_id_card.access -= get_region_accesses(region) playsound(computer, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return TRUE @@ -321,17 +320,17 @@ /datum/computer_file/program/card_mod/ui_data(mob/user) var/list/data = get_header_data() - var/obj/item/computer_hardware/card_slot/card_slot + var/obj/item/computer_hardware/card_slot/card_slot2 var/obj/item/computer_hardware/printer/printer if(computer) - card_slot = computer.all_components[MC_CARD] + card_slot2 = computer.all_components[MC_CARD2] printer = computer.all_components[MC_PRINT] data["station_name"] = station_name() if(computer) - data["have_id_slot"] = !!card_slot + data["have_id_slot"] = !!(card_slot2) data["have_printer"] = !!printer else data["have_id_slot"] = FALSE @@ -340,7 +339,7 @@ data["authenticated"] = authenticated if(computer) - var/obj/item/card/id/id_card = card_slot.stored_card + var/obj/item/card/id/id_card = card_slot2.stored_card data["has_id"] = !!id_card data["id_name"] = id_card ? id_card.name : "-----" if(id_card) diff --git a/code/modules/modular_computers/file_system/programs/cargobounty.dm b/code/modules/modular_computers/file_system/programs/cargobounty.dm index d9bc65c98d..74ac44ade3 100644 --- a/code/modules/modular_computers/file_system/programs/cargobounty.dm +++ b/code/modules/modular_computers/file_system/programs/cargobounty.dm @@ -5,7 +5,6 @@ extended_desc = "A basic interface for supply personnel to check and claim bounties." requires_ntnet = TRUE transfer_access = ACCESS_CARGO - network_destination = "cargo claims interface" size = 10 tgui_id = "NtosBountyConsole" ///cooldown var for printing paper sheets. diff --git a/code/modules/modular_computers/file_system/programs/cargoship.dm b/code/modules/modular_computers/file_system/programs/cargoship.dm index 3ba08a3719..db8d6d9f82 100644 --- a/code/modules/modular_computers/file_system/programs/cargoship.dm +++ b/code/modules/modular_computers/file_system/programs/cargoship.dm @@ -1,9 +1,8 @@ /datum/computer_file/program/shipping filename = "shipping" - filedesc = "Nanotrasen Shipping Scanner" + filedesc = "GrandArk Exporter" program_icon_state = "shipping" extended_desc = "A combination printer/scanner app that enables modular computers to print barcodes for easy scanning and shipping." - network_destination = "ship scanner" size = 6 tgui_id = "NtosShipping" ///Account used for creating barcodes. diff --git a/code/modules/modular_computers/file_system/programs/crewmanifest.dm b/code/modules/modular_computers/file_system/programs/crewmanifest.dm index a1503ce3a8..4f2688d8f1 100644 --- a/code/modules/modular_computers/file_system/programs/crewmanifest.dm +++ b/code/modules/modular_computers/file_system/programs/crewmanifest.dm @@ -1,10 +1,10 @@ /datum/computer_file/program/crew_manifest - filename = "crewmani" - filedesc = "Crew Manifest" + filename = "plexagoncrew" + filedesc = "Plexagon Crew List" program_icon_state = "id" extended_desc = "Program for viewing and printing the current crew manifest" transfer_access = ACCESS_HEADS - requires_ntnet = FALSE + requires_ntnet = TRUE size = 4 tgui_id = "NtosCrewManifest" diff --git a/code/modules/modular_computers/file_system/programs/jobmanagement.dm b/code/modules/modular_computers/file_system/programs/jobmanagement.dm index bccc6e4dbe..b88b793b66 100644 --- a/code/modules/modular_computers/file_system/programs/jobmanagement.dm +++ b/code/modules/modular_computers/file_system/programs/jobmanagement.dm @@ -1,10 +1,10 @@ /datum/computer_file/program/job_management - filename = "job_manage" - filedesc = "Job Manager" + filename = "plexagoncore" + filedesc = "Plexagon HR Core" program_icon_state = "id" extended_desc = "Program for viewing and changing job slot avalibility." transfer_access = ACCESS_HEADS - requires_ntnet = 0 + requires_ntnet = TRUE size = 4 tgui_id = "NtosJobManager" diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index 6401d6207f..8fbcfd0b01 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -1,14 +1,14 @@ /datum/computer_file/program/ntnetdownload - filename = "ntndownloader" - filedesc = "Software Download Tool" + filename = "ntsoftwarehub" + filedesc = "NT Software Hub" program_icon_state = "generic" extended_desc = "This program allows downloads of software from official NT repositories" - unsendable = 1 - undeletable = 1 + unsendable = TRUE + undeletable = TRUE size = 4 - requires_ntnet = 1 + requires_ntnet = TRUE requires_ntnet_feature = NTNET_SOFTWAREDOWNLOAD - available_on_ntnet = 0 + available_on_ntnet = FALSE ui_header = "downloader_finished.gif" tgui_id = "NtosNetDownloader" @@ -125,6 +125,8 @@ if(!istype(my_computer)) return + var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD] + var/list/access = card_slot?.GetAccess() var/list/data = get_header_data() @@ -146,7 +148,7 @@ for(var/A in main_repo) var/datum/computer_file/program/P = A // Only those programs our user can run will show in the list - if(!P.can_run(user,transfer = 1) || hard_drive.find_file_by_name(P.filename)) + if(!P.can_run(user,transfer = 1, access = access) || hard_drive.find_file_by_name(P.filename)) continue all_entries.Add(list(list( "filename" = P.filename, diff --git a/code/modules/modular_computers/file_system/programs/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/ntmonitor.dm index 7d6d89f32c..bbbde14780 100644 --- a/code/modules/modular_computers/file_system/programs/ntmonitor.dm +++ b/code/modules/modular_computers/file_system/programs/ntmonitor.dm @@ -1,6 +1,6 @@ /datum/computer_file/program/ntnetmonitor - filename = "ntmonitor" - filedesc = "NTNet Diagnostics and Monitoring" + filename = "wirecarp" + filedesc = "WireCarp" //wireshark. program_icon_state = "comm_monitor" extended_desc = "This program monitors stationwide NTNet network, provides access to logging systems, and allows for configuration changes" size = 12 diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index df9b02d8ec..f03ff3f8fd 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -6,7 +6,6 @@ size = 8 requires_ntnet = 1 requires_ntnet_feature = NTNET_COMMUNICATION - network_destination = "NTNRC server" ui_header = "ntnrc_idle.gif" available_on_ntnet = 1 tgui_id = "NtosNetChat" diff --git a/code/modules/modular_computers/file_system/programs/powermonitor.dm b/code/modules/modular_computers/file_system/programs/powermonitor.dm index bd11474858..e87a731a40 100644 --- a/code/modules/modular_computers/file_system/programs/powermonitor.dm +++ b/code/modules/modular_computers/file_system/programs/powermonitor.dm @@ -1,15 +1,14 @@ //normal computer version is located in code\modules\power\monitor.dm, /obj/machinery/computer/monitor /datum/computer_file/program/power_monitor - filename = "powermonitor" - filedesc = "Power Monitor" + filename = "ampcheck" + filedesc = "AmpCheck" program_icon_state = "power_monitor" extended_desc = "This program connects to sensors around the station to provide information about electrical systems" ui_header = "power_norm.gif" transfer_access = ACCESS_ENGINE usage_flags = PROGRAM_CONSOLE requires_ntnet = 0 - network_destination = "power monitoring system" size = 9 tgui_id = "NtosPowerMonitor" diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm index 9b0e09ef99..216365d6ea 100644 --- a/code/modules/modular_computers/file_system/programs/radar.dm +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -7,7 +7,6 @@ transfer_access = null available_on_ntnet = FALSE usage_flags = PROGRAM_LAPTOP | PROGRAM_TABLET - network_destination = "tracking program" size = 5 tgui_id = "NtosRadar" ///List of trackable entities. Updated by the scan() proc. @@ -207,7 +206,7 @@ ///A program that tracks crew members via suit sensors /datum/computer_file/program/radar/lifeline - filename = "Lifeline" + filename = "lifeline" filedesc = "Lifeline" extended_desc = "This program allows for tracking of crew members via their suit sensors." requires_ntnet = TRUE @@ -252,9 +251,9 @@ //Nuke Disk Finder App// //////////////////////// -///A program that tracks crew members via suit sensors +///A program that tracks nukes and nuclear accessories /datum/computer_file/program/radar/fission360 - filename = "Fission360" + filename = "fission360" filedesc = "Fission360" program_icon_state = "radarsyndicate" extended_desc = "This program allows for tracking of nuclear authorization disks and warheads." @@ -276,8 +275,6 @@ objects = list() for(var/i in GLOB.nuke_list) var/obj/machinery/nuclearbomb/nuke = i - if(!trackable(nuke)) - continue var/list/nukeinfo = list( ref = REF(nuke), @@ -285,9 +282,8 @@ ) objects += list(nukeinfo) var/obj/item/disk/nuclear/disk = locate() in GLOB.poi_list - if(trackable(disk)) - var/list/nukeinfo = list( - ref = REF(disk), - name = disk.name, - ) - objects += list(nukeinfo) + var/list/nukeinfo = list( + ref = REF(disk), + name = "Nuke Auth. Disk", + ) + objects += list(nukeinfo) diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm index 8644ce09b4..c0b82b9c95 100644 --- a/code/modules/modular_computers/file_system/programs/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm @@ -1,12 +1,11 @@ /datum/computer_file/program/robocontrol - filename = "robocontrol" - filedesc = "Bot Remote Controller" + filename = "botkeeper" + filedesc = "Botkeeper" program_icon_state = "robot" extended_desc = "A remote controller used for giving basic commands to non-sentient robots." transfer_access = ACCESS_ROBOTICS requires_ntnet = TRUE - network_destination = "robotics control network" size = 12 tgui_id = "NtosRoboControl" ///Number of simple robots on-station. @@ -78,7 +77,7 @@ return if(id_card) GLOB.data_core.manifest_modify(id_card.registered_name, id_card.assignment) - card_slot.try_eject(TRUE, current_user) + card_slot.try_eject(current_user) else playsound(get_turf(ui_host()) , 'sound/machines/buzz-sigh.ogg', 25, FALSE) return diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm index 32ad102871..564f952b54 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -1,12 +1,11 @@ /datum/computer_file/program/supermatter_monitor - filename = "smmonitor" - filedesc = "Supermatter Monitoring" + filename = "ntcims" + filedesc = "NT CIMS" ui_header = "smmon_0.gif" program_icon_state = "smmon_0" - extended_desc = "This program connects to specially calibrated supermatter sensors to provide information on the status of supermatter-based engines." + extended_desc = "Crystal Integrity Monitoring System, connects to specially calibrated supermatter sensors to provide information on the status of supermatter-based engines." requires_ntnet = TRUE transfer_access = ACCESS_CONSTRUCTION - network_destination = "supermatter monitoring system" size = 5 tgui_id = "NtosSupermatterMonitor" var/last_status = SUPERMATTER_INACTIVE @@ -70,7 +69,7 @@ data["active"] = TRUE data["SM_integrity"] = active.get_integrity() data["SM_power"] = active.power - data["SM_ambienttemp"] = air.return_temperature() + data["SM_ambienttemp"] = air.temperature data["SM_ambientpressure"] = air.return_pressure() //data["SM_EPR"] = round((air.total_moles / air.group_multiplier) / 23.1, 0.01) var/list/gasdata = list() diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index b33442f99b..81555340b2 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -10,9 +10,11 @@ // Computer that holds this hardware, if any. var/power_usage = 0 // If the hardware uses extra power, change this. - var/enabled = 1 // If the hardware is turned off set this to 0. - var/critical = 0 // Prevent disabling for important component, like the CPU. - var/can_install = 1 // Prevents direct installation of removable media. + var/enabled = TRUE // If the hardware is turned off set this to 0. + var/critical = FALSE // Prevent disabling for important component, like the CPU. + var/can_install = TRUE // Prevents direct installation of removable media. + var/expansion_hw = FALSE // Hardware that fits into expansion bays. + var/removable = TRUE // Whether the hardware is removable or not. var/damage = 0 // Current damage level var/max_damage = 100 // Maximal damage level. var/damage_malfunction = 20 // "Malfunction" threshold. When damage exceeds this value the hardware piece will semi-randomly fail and do !!FUN!! things @@ -20,7 +22,7 @@ var/malfunction_probability = 10// Chance of malfunction when the component is damaged var/device_type -/obj/item/computer_hardware/New(var/obj/L) +/obj/item/computer_hardware/New(obj/L) ..() pixel_x = rand(-8, 8) pixel_y = rand(-8, 8) @@ -56,7 +58,7 @@ return TRUE // Called on multitool click, prints diagnostic information to the user. -/obj/item/computer_hardware/proc/diagnostics(var/mob/user) +/obj/item/computer_hardware/proc/diagnostics(mob/user) to_chat(user, "Hardware Integrity Test... (Corruption: [damage]/[max_damage]) [damage > damage_failure ? "FAIL" : damage > damage_malfunction ? "WARN" : "PASS"]") // Handles damage checks @@ -73,7 +75,7 @@ return TRUE // Good to go. -/obj/item/computer_hardware/examine(var/mob/user) +/obj/item/computer_hardware/examine(mob/user) . = ..() if(damage > damage_failure) . += "It seems to be severely damaged!" diff --git a/code/modules/modular_computers/hardware/ai_slot.dm b/code/modules/modular_computers/hardware/ai_slot.dm index 0ad157afcb..c874d786a0 100644 --- a/code/modules/modular_computers/hardware/ai_slot.dm +++ b/code/modules/modular_computers/hardware/ai_slot.dm @@ -5,6 +5,7 @@ icon_state = "card_mini" w_class = WEIGHT_CLASS_SMALL device_type = MC_AI + expansion_hw = TRUE var/obj/item/aicard/stored_card = null var/locked = FALSE @@ -19,12 +20,6 @@ if(stored_card) . += "There appears to be an intelliCard loaded. There appears to be a pinhole protecting a manual eject button. A screwdriver could probably press it." -/obj/item/computer_hardware/ai_slot/on_install(obj/item/modular_computer/M, mob/living/user = null) - M.add_verb(device_type) - -/obj/item/computer_hardware/ai_slot/on_remove(obj/item/modular_computer/M, mob/living/user = null) - M.remove_verb(device_type) - /obj/item/computer_hardware/ai_slot/try_insert(obj/item/I, mob/living/user = null) if(!holder) return FALSE @@ -44,7 +39,7 @@ return TRUE -/obj/item/computer_hardware/ai_slot/try_eject(slot=0,mob/living/user = null,forced = 0) +/obj/item/computer_hardware/ai_slot/try_eject(mob/living/user = null,forced = FALSE) if(!stored_card) to_chat(user, "There is no card in \the [src].") return FALSE diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm index 6e3193abfd..0668248315 100644 --- a/code/modules/modular_computers/hardware/battery_module.dm +++ b/code/modules/modular_computers/hardware/battery_module.dm @@ -21,7 +21,7 @@ /obj/item/computer_hardware/battery/handle_atom_del(atom/A) if(A == battery) - try_eject(0, null, TRUE) + try_eject(forced = TRUE) . = ..() /obj/item/computer_hardware/battery/try_insert(obj/item/I, mob/living/user = null) @@ -48,7 +48,7 @@ return TRUE -/obj/item/computer_hardware/battery/try_eject(slot=0, mob/living/user = null, forced = 0) +/obj/item/computer_hardware/battery/try_eject(mob/living/user = null, forced = FALSE) if(!battery) to_chat(user, "There is no power cell connected to \the [src].") return FALSE diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm index 18b423a42e..c243bf7db1 100644 --- a/code/modules/modular_computers/hardware/card_slot.dm +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -7,13 +7,10 @@ device_type = MC_CARD var/obj/item/card/id/stored_card = null - var/obj/item/card/id/stored_card2 = null /obj/item/computer_hardware/card_slot/handle_atom_del(atom/A) if(A == stored_card) - try_eject(1, null, TRUE) - if(A == stored_card2) - try_eject(2, null, TRUE) + try_eject(null, TRUE) . = ..() /obj/item/computer_hardware/card_slot/Destroy() @@ -21,37 +18,25 @@ return ..() /obj/item/computer_hardware/card_slot/GetAccess() - if(stored_card && stored_card2) // Best of both worlds - return (stored_card.GetAccess() | stored_card2.GetAccess()) - else if(stored_card) - return stored_card.GetAccess() - else if(stored_card2) - return stored_card2.GetAccess() - return ..() + var/list/total_access + if(stored_card) + total_access = stored_card.GetAccess() + var/obj/item/computer_hardware/card_slot/card_slot2 = holder?.all_components[MC_CARD2] //Best of both worlds + if(card_slot2?.stored_card) + total_access |= card_slot2.stored_card.GetAccess() + return total_access /obj/item/computer_hardware/card_slot/GetID() if(stored_card) return stored_card - else if(stored_card2) - return stored_card2 return ..() /obj/item/computer_hardware/card_slot/RemoveID() if(stored_card) . = stored_card - if(!try_eject(1)) + if(!try_eject()) return null return - if(stored_card2) - . = stored_card2 - if(!try_eject(2)) - return null - -/obj/item/computer_hardware/card_slot/on_install(obj/item/modular_computer/M, mob/living/user = null) - M.add_verb(device_type) - -/obj/item/computer_hardware/card_slot/on_remove(obj/item/modular_computer/M, mob/living/user = null) - M.remove_verb(device_type) /obj/item/computer_hardware/card_slot/try_insert(obj/item/I, mob/living/user = null) if(!holder) @@ -60,8 +45,7 @@ if(!istype(I, /obj/item/card/id)) return FALSE - if(stored_card && stored_card2) - to_chat(user, "You try to insert \the [I] into \the [src], but its slots are occupied.") + if(stored_card) return FALSE if(user) if(!user.transferItemToLoc(I, src)) @@ -69,11 +53,8 @@ else I.forceMove(src) - if(!stored_card) - stored_card = I - else - stored_card2 = I - to_chat(user, "You insert \the [I] into \the [src].") + stored_card = I + to_chat(user, "You insert \the [I] into \the [expansion_hw ? "secondary":"primary"] [src].") playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -82,53 +63,58 @@ return TRUE -/obj/item/computer_hardware/card_slot/try_eject(slot=0, mob/living/user = null, forced = 0) - if(!stored_card && !stored_card2) +/obj/item/computer_hardware/card_slot/try_eject(mob/living/user = null, forced = FALSE) + if(!stored_card) to_chat(user, "There are no cards in \the [src].") return FALSE - var/ejected = 0 - if(stored_card && (!slot || slot == 1)) - if(user) - user.put_in_hands(stored_card) - else - stored_card.forceMove(drop_location()) - stored_card = null - ejected++ + if(user) + user.put_in_hands(stored_card) + else + stored_card.forceMove(drop_location()) + stored_card = null - if(stored_card2 && (!slot || slot == 2)) - if(user) - user.put_in_hands(stored_card2) - else - stored_card2.forceMove(drop_location()) - stored_card2 = null - ejected++ + if(holder) + if(holder.active_program) + holder.active_program.event_idremoved(0) - if(ejected) - if(holder) - if(holder.active_program) - holder.active_program.event_idremoved(0, slot) - - for(var/I in holder.idle_threads) - var/datum/computer_file/program/P = I - P.event_idremoved(1, slot) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - H.sec_hud_set_ID() - to_chat(user, "You remove the card[ejected>1 ? "s" : ""] from \the [src].") - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - return TRUE - return FALSE + for(var/p in holder.idle_threads) + var/datum/computer_file/program/computer_program = p + computer_program.event_idremoved(1) + if(ishuman(user)) + var/mob/living/carbon/human/human_user = user + human_user.sec_hud_set_ID() + to_chat(user, "You remove the card from \the [src].") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + return TRUE /obj/item/computer_hardware/card_slot/attackby(obj/item/I, mob/living/user) if(..()) return if(I.tool_behaviour == TOOL_SCREWDRIVER) - to_chat(user, "You press down on the manual eject button with \the [I].") - try_eject(0,user) - return + if(stored_card) + to_chat(user, "You press down on the manual eject button with \the [I].") + try_eject(user) + return + swap_slot() + to_chat(user, "You adjust the connecter to fit into [expansion_hw ? "an expansion bay" : "the primary ID bay"].") + +/** + *Swaps the card_slot hardware between using the dedicated card slot bay on a computer, and using an expansion bay. +*/ +/obj/item/computer_hardware/card_slot/proc/swap_slot() + expansion_hw = !expansion_hw + if(expansion_hw) + device_type = MC_CARD2 + else + device_type = MC_CARD /obj/item/computer_hardware/card_slot/examine(mob/user) . = ..() - if(stored_card || stored_card2) + . += "The connector is set to fit into [expansion_hw ? "an expansion bay" : "a computer's primary ID bay"], but can be adjusted with a screwdriver." + if(stored_card) . += "There appears to be something loaded in the card slots." + +/obj/item/computer_hardware/card_slot/secondary + device_type = MC_CARD2 + expansion_hw = TRUE diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index b8b9624388..e5c133de20 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -22,14 +22,14 @@ . = ..() . += "It has [max_capacity] GQ of storage capacity." -/obj/item/computer_hardware/hard_drive/diagnostics(var/mob/user) +/obj/item/computer_hardware/hard_drive/diagnostics(mob/user) ..() // 999 is a byond limit that is in place. It's unlikely someone will reach that many files anyway, since you would sooner run out of space. to_chat(user, "NT-NFS File Table Status: [stored_files.len]/999") to_chat(user, "Storage capacity: [used_capacity]/[max_capacity]GQ") // Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. -/obj/item/computer_hardware/hard_drive/proc/store_file(var/datum/computer_file/F) +/obj/item/computer_hardware/hard_drive/proc/store_file(datum/computer_file/F) if(!F || !istype(F)) return 0 @@ -52,7 +52,7 @@ return 1 // Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. -/obj/item/computer_hardware/hard_drive/proc/remove_file(var/datum/computer_file/F) +/obj/item/computer_hardware/hard_drive/proc/remove_file(datum/computer_file/F) if(!F || !istype(F)) return 0 @@ -78,7 +78,7 @@ used_capacity = total_size // Checks whether file can be stored on the hard drive. We can only store unique files, so this checks whether we wouldn't get a duplicity by adding a file. -/obj/item/computer_hardware/hard_drive/proc/can_store_file(var/datum/computer_file/F) +/obj/item/computer_hardware/hard_drive/proc/can_store_file(datum/computer_file/F) if(!F || !istype(F)) return 0 @@ -101,7 +101,7 @@ // Tries to find the file by filename. Returns null on failure -/obj/item/computer_hardware/hard_drive/proc/find_file_by_name(var/filename) +/obj/item/computer_hardware/hard_drive/proc/find_file_by_name(filename) if(!check_functionality()) return null diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index fe1b1879cb..04bf494fe4 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -11,7 +11,7 @@ device_type = MC_NET var/static/ntnet_card_uid = 1 -/obj/item/computer_hardware/network_card/diagnostics(var/mob/user) +/obj/item/computer_hardware/network_card/diagnostics(mob/user) ..() to_chat(user, "NIX Unique ID: [identification_id]") to_chat(user, "NIX User Tag: [identification_string]") @@ -22,7 +22,7 @@ if(ethernet) to_chat(user, "OpenEth (Physical Connection) - Physical network connection port") -/obj/item/computer_hardware/network_card/New(var/l) +/obj/item/computer_hardware/network_card/New(l) ..() identification_id = ntnet_card_uid++ @@ -31,7 +31,7 @@ return "[identification_string] (NID [identification_id])" // 0 - No signal, 1 - Low signal, 2 - High signal. 3 - Wired Connection -/obj/item/computer_hardware/network_card/proc/get_signal(var/specific_action = 0) +/obj/item/computer_hardware/network_card/proc/get_signal(specific_action = 0) if(!holder) // Hardware is not installed in anything. No signal. How did this even get called? return 0 diff --git a/code/modules/modular_computers/hardware/portable_disk.dm b/code/modules/modular_computers/hardware/portable_disk.dm index b5a957be04..89b0382e86 100644 --- a/code/modules/modular_computers/hardware/portable_disk.dm +++ b/code/modules/modular_computers/hardware/portable_disk.dm @@ -8,12 +8,8 @@ max_capacity = 16 device_type = MC_SDD -/obj/item/computer_hardware/hard_drive/portable/on_install(obj/item/modular_computer/M, mob/living/user = null) - M.add_verb(device_type) - -/obj/item/computer_hardware/hard_drive/portable/on_remove(obj/item/modular_computer/M, mob/living/user = null) - ..() - M.remove_verb(device_type) +/obj/item/computer_hardware/hard_drive/portable/on_remove(obj/item/modular_computer/MC, mob/user) + return //this is a floppy disk, let's not shut the computer down when it gets pulled out. /obj/item/computer_hardware/hard_drive/portable/install_default_programs() return // Empty by default diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm index ebe40c1922..3bd5946435 100644 --- a/code/modules/modular_computers/hardware/printer.dm +++ b/code/modules/modular_computers/hardware/printer.dm @@ -5,6 +5,7 @@ icon_state = "printer" w_class = WEIGHT_CLASS_NORMAL device_type = MC_PRINT + expansion_hw = TRUE var/stored_paper = 20 var/max_paper = 30 diff --git a/code/modules/modular_computers/hardware/sensor_package.dm b/code/modules/modular_computers/hardware/sensor_package.dm new file mode 100644 index 0000000000..c0363bc809 --- /dev/null +++ b/code/modules/modular_computers/hardware/sensor_package.dm @@ -0,0 +1,8 @@ +//This item doesn't do much on its own, but is required by apps such as AtmoZphere. +/obj/item/computer_hardware/sensorpackage + name = "sensor package" + desc = "An integrated sensor package allowing a computer to take readings from the environment. Required by certain programs." + icon_state = "servo" + w_class = WEIGHT_CLASS_TINY + device_type = MC_SENSORS + expansion_hw = TRUE diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index a8d30bad21..a3b34c4b9b 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -52,6 +52,7 @@ var/obj/item/computer_hardware/battery/battery_module = null if(fabricate) fabricated_laptop = new /obj/item/modular_computer/laptop/buildable(src) + fabricated_laptop.install_component(new /obj/item/computer_hardware/card_slot) fabricated_laptop.install_component(new /obj/item/computer_hardware/battery) battery_module = fabricated_laptop.all_components[MC_CELL] total_price = 99 @@ -107,7 +108,7 @@ if(dev_card) total_price += 199 if(fabricate) - fabricated_laptop.install_component(new /obj/item/computer_hardware/card_slot) + fabricated_laptop.install_component(new /obj/item/computer_hardware/card_slot/secondary) return total_price else if(devtype == 2) // Tablet, more expensive, not everyone could probably afford this. @@ -116,6 +117,7 @@ fabricated_tablet = new(src) fabricated_tablet.install_component(new /obj/item/computer_hardware/battery) fabricated_tablet.install_component(new /obj/item/computer_hardware/processor_unit/small) + fabricated_tablet.install_component(new/obj/item/computer_hardware/card_slot) battery_module = fabricated_tablet.all_components[MC_CELL] total_price = 199 switch(dev_battery) @@ -154,11 +156,11 @@ if(dev_printer) total_price += 99 if(fabricate) - fabricated_tablet.install_component(new/obj/item/computer_hardware/printer) + fabricated_tablet.install_component(new/obj/item/computer_hardware/printer/mini) if(dev_card) total_price += 199 if(fabricate) - fabricated_tablet.install_component(new/obj/item/computer_hardware/card_slot) + fabricated_tablet.install_component(new/obj/item/computer_hardware/card_slot/secondary) return total_price return FALSE @@ -222,7 +224,7 @@ return FALSE /obj/machinery/lapvend/ui_interact(mob/user, datum/tgui/ui) - if(stat & (BROKEN | NOPOWER | MAINT)) + if(machine_stat & (BROKEN | NOPOWER | MAINT)) if(ui) ui.close() return FALSE @@ -257,7 +259,7 @@ say("Insufficient credits on card to purchase!") return credits += target_credits - say("[target_credits] cr has been deposited from your account.") + say("[target_credits] cr have been withdrawn from your account.") return return ..() diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm new file mode 100644 index 0000000000..dc8f172069 --- /dev/null +++ b/code/modules/paperwork/carbonpaper.dm @@ -0,0 +1,45 @@ +/obj/item/paper/carbon + name = "sheet of carbon" + icon_state = "paper_stack" + item_state = "paper" + // inhand_icon_state = "paper" + show_written_words = FALSE + var/copied = FALSE + var/iscopy = FALSE + +/obj/item/paper/carbon/update_icon_state() + if(iscopy) + icon_state = "cpaper" + else if(copied) + icon_state = "paper" + else + icon_state = "paper_stack" + if(info) + icon_state = "[icon_state]_words" + +/obj/item/paper/carbon/proc/removecopy(mob/living/user) + if(!copied) + var/obj/item/paper/carbon/C = src + var/copycontents = C.info + var/obj/item/paper/carbon/Copy = new /obj/item/paper/carbon(user.loc) + + if(info) + copycontents = replacetext(copycontents, "" + Copy.name = "Copy - [C.name]" + to_chat(user, "You tear off the carbon-copy!") + C.copied = TRUE + Copy.iscopy = TRUE + Copy.update_icon_state() + C.update_icon_state() + user.put_in_hands(Copy) + else + to_chat(user, "There are no more carbon copies attached to this paper!") + +/obj/item/paper/carbon/on_attack_hand(mob/living/user) + if(loc == user && user.is_holding(src)) + removecopy(user) + return + return ..() diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 1a93661c76..5b576a2438 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -3,6 +3,8 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "clipboard" item_state = "clipboard" + // inhand_icon_state = "clipboard" + // worn_icon_state = "clipboard" throwforce = 0 w_class = WEIGHT_CLASS_SMALL throw_speed = 3 @@ -34,7 +36,6 @@ . += "clipboard_pen" . += "clipboard_over" - /obj/item/clipboard/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/paper)) if(!user.transferItemToLoc(W, src)) @@ -92,14 +93,14 @@ to_chat(usr, "You slot [W] into [src].") if(href_list["write"]) - var/obj/item/P = locate(href_list["write"]) - if(istype(P) && P.loc == src) + var/obj/item/P = locate(href_list["write"]) in src + if(istype(P)) if(usr.get_active_held_item()) P.attackby(usr.get_active_held_item(), usr) if(href_list["remove"]) - var/obj/item/P = locate(href_list["remove"]) - if(istype(P) && P.loc == src) + var/obj/item/P = locate(href_list["remove"]) in src + if(istype(P)) P.forceMove(usr.loc) usr.put_in_hands(P) if(P == toppaper) @@ -111,13 +112,13 @@ toppaper = null if(href_list["read"]) - var/obj/item/paper/P = locate(href_list["read"]) - if(istype(P) && P.loc == src) + var/obj/item/paper/P = locate(href_list["read"]) in src + if(istype(P)) usr.examinate(P) if(href_list["top"]) - var/obj/item/P = locate(href_list["top"]) - if(istype(P) && P.loc == src) + var/obj/item/P = locate(href_list["top"]) in src + if(istype(P)) toppaper = P to_chat(usr, "You move [P.name] to the top.") diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index b8f2c95762..390cd0cf83 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -35,7 +35,7 @@ . = ..() if(mapload) for(var/obj/item/I in loc) - if(istype(I, /obj/item/paper) || istype(I, /obj/item/folder) || istype(I, /obj/item/photo)) + if(I.w_class < WEIGHT_CLASS_NORMAL) //there probably shouldn't be anything placed ontop of filing cabinets in a map that isn't meant to go in them I.forceMove(src) /obj/structure/filingcabinet/deconstruct(disassembled = TRUE) @@ -46,7 +46,12 @@ qdel(src) /obj/structure/filingcabinet/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/paper) || istype(P, /obj/item/folder) || istype(P, /obj/item/photo) || istype(P, /obj/item/documents)) + if(P.tool_behaviour == TOOL_WRENCH && user.a_intent != INTENT_HELP) + to_chat(user, "You begin to [anchored ? "unwrench" : "wrench"] [src].") + if(P.use_tool(src, user, 20, volume=50)) + to_chat(user, "You successfully [anchored ? "unwrench" : "wrench"] [src].") + anchored = !anchored + else if(P.w_class < WEIGHT_CLASS_NORMAL) if(!user.transferItemToLoc(P, src)) return to_chat(user, "You put [P] in [src].") @@ -54,11 +59,6 @@ sleep(5) icon_state = initial(icon_state) updateUsrDialog() - else if(istype(P, /obj/item/wrench)) - to_chat(user, "You begin to [anchored ? "unwrench" : "wrench"] [src].") - if(P.use_tool(src, user, 20, volume=50)) - to_chat(user, "You successfully [anchored ? "unwrench" : "wrench"] [src].") - anchored = !anchored else if(user.a_intent != INTENT_HARM) to_chat(user, "You can't put [P] in [src]!") else @@ -67,9 +67,6 @@ /obj/structure/filingcabinet/ui_interact(mob/user) . = ..() - if(isobserver(user)) - return - if(contents.len <= 0) to_chat(user, "[src] is empty.") return @@ -100,16 +97,17 @@ to_chat(user, "You find nothing in [src].") /obj/structure/filingcabinet/Topic(href, href_list) + if(!usr.canUseTopic(src, BE_CLOSE, ismonkey(usr))) + return if(href_list["retrieve"]) usr << browse("", "window=filingcabinet") // Close the menu - var/obj/item/P = locate(href_list["retrieve"])//contents[retrieveindex] - if(istype(P) && P.loc == src && in_range(src, usr)) + var/obj/item/P = locate(href_list["retrieve"]) in src //contents[retrieveindex] + if(istype(P) && in_range(src, usr)) usr.put_in_hands(P) updateUsrDialog() icon_state = "[initial(icon_state)]-open" - sleep(5) - icon_state = initial(icon_state) + addtimer(VARSET_CALLBACK(src, icon_state, initial(icon_state)), 5) /* @@ -170,6 +168,7 @@ virgin = 0 //tabbing here is correct- it's possible for people to try and use it //before the records have been generated, so we do this inside the loop. +//ATTACK HAND IGNORING PARENT RETURN VALUE /obj/structure/filingcabinet/medical/on_attack_hand() populate() . = ..() diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index c32afab342..305099d115 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -33,7 +33,10 @@ if(contents.len) . += "folder_paper" + /obj/item/folder/attackby(obj/item/W, mob/user, params) + if(burn_paper_product_attackby_check(W, user)) + return if(istype(W, /obj/item/paper) || istype(W, /obj/item/photo) || istype(W, /obj/item/documents)) if(!user.transferItemToLoc(W, src)) return @@ -43,11 +46,14 @@ if(!user.is_literate()) to_chat(user, "You scribble illegibly on the cover of [src]!") return + var/inputvalue = stripped_input(user, "What would you like to label the folder?", "Folder Labelling", "", MAX_NAME_LEN) + if(!inputvalue) return + if(user.canUseTopic(src, BE_CLOSE)) - name = "folder - '[inputvalue]'" + name = "folder[(inputvalue ? " - '[inputvalue]'" : null)]" /obj/item/folder/Destroy() @@ -76,14 +82,14 @@ if(usr.contents.Find(src)) if(href_list["remove"]) - var/obj/item/I = locate(href_list["remove"]) - if(istype(I) && I.loc == src) + var/obj/item/I = locate(href_list["remove"]) in src + if(istype(I)) I.forceMove(usr.loc) usr.put_in_hands(I) if(href_list["read"]) - var/obj/item/I = locate(href_list["read"]) - if(istype(I) && I.loc == src) + var/obj/item/I = locate(href_list["read"]) in src + if(istype(I)) usr.examinate(I) //Update everything diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index d054e5ff12..da9fdc4ca4 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -1,9 +1,10 @@ /obj/item/hand_labeler name = "hand labeler" - desc = "A combined label printer and applicator in a portable device, designed to be easy to operate and use." + desc = "A combined label printer, applicator, and remover, all in a single portable device. Designed to be easy to operate and use." icon = 'icons/obj/bureaucracy.dmi' icon_state = "labeler0" item_state = "flight" + // inhand_icon_state = "flight" var/label = null var/labels_left = 30 var/mode = 0 @@ -55,9 +56,10 @@ to_chat(user, "You can't label creatures!") // use a collar return - user.visible_message("[user] labels [A] as [label].", \ - "You label [A] as [label].") - A.name = "[A.name] ([label])" + user.visible_message("[user] labels [A] with \"[label]\".", \ + "You label [A] with \"[label]\".") + A.AddComponent(/datum/component/label, label) + // playsound(A, 'sound/items/handling/component_pickup.ogg', 20, TRUE) labels_left-- @@ -90,7 +92,9 @@ name = "cyborg-hand labeler" /obj/item/hand_labeler/borg/afterattack(atom/A, mob/user, proximity) - . = ..(A, user, proximity) + . = ..() + if(!proximity) + return if(!iscyborg(user)) return @@ -114,6 +118,7 @@ desc = "A roll of paper. Use it on a hand labeler to refill it." icon_state = "labeler_refill" item_state = "electropack" + // inhand_icon_state = "electropack" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 5d842ef11a..20ec678e45 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -11,41 +11,6 @@ #define MODE_WRITING 1 #define MODE_STAMPING 2 -/** - * This is a custom ui state. All it really does is keep track of pen - * being used and if they are editing it or not. This way we can keep - * the data with the ui rather than on the paper - */ -/datum/ui_state/default/paper_state - /// What edit mode we are in and who is - /// writing on it right now - var/edit_mode = MODE_READING - /// Setup for writing to a sheet - var/pen_color = "black" - var/pen_font = "" - var/is_crayon = FALSE - /// Setup for stamping a sheet - // Why not the stamp obj? I have no idea - // what happens to states out of scope so - // don't want to put instances in this - var/stamp_icon_state = "" - var/stamp_name = "" - var/stamp_class = "" - -/datum/ui_state/default/paper_state/proc/copy_from(datum/ui_state/default/paper_state/from) - switch(from.edit_mode) - if(MODE_READING) - edit_mode = MODE_READING - if(MODE_WRITING) - edit_mode = MODE_WRITING - pen_color = from.pen_color - pen_font = from.pen_font - is_crayon = from.is_crayon - if(MODE_STAMPING) - edit_mode = MODE_STAMPING - stamp_icon_state = from.stamp_icon_state - stamp_class = from.stamp_class - stamp_name = from.stamp_name /** * Paper is now using markdown (like in github pull notes) for ALL rendering @@ -58,6 +23,9 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "paper" item_state = "paper" + // inhand_icon_state = "paper" + // worn_icon_state = "paper" + // custom_fire_overlay = "paper_onfire_overlay" throwforce = 0 w_class = WEIGHT_CLASS_TINY throw_range = 1 @@ -80,34 +48,19 @@ var/list/stamps /// Positioning for the stamp in tgui var/list/stamped /// Overlay info - /// This REALLY should be a componenet. Basicly used during, april fools - /// to honk at you - var/rigged = 0 - var/spam_flag = 0 - var/contact_poison // Reagent ID to transfer on contact var/contact_poison_volume = 0 - // Ok, so WHY are we caching the ui's? - // Since we are not using autoupdate we - // need some way to update the ui's of - // other people looking at it and if - // its been updated. Yes yes, lame - // but canot be helped. However by - // doing it this way, we can see - // live updates and have multipule - // people look at it - var/list/viewing_ui = list() - /// When the sheet can be "filled out" /// This is an associated list var/list/form_fields = list() var/field_counter = 1 /obj/item/paper/Destroy() - close_all_ui() stamps = null stamped = null + form_fields = null + stamped = null . = ..() /** @@ -162,7 +115,7 @@ set category = "Object" set src in usr - if(usr.incapacitated() || !usr.is_literate()) + if(!usr.can_read(src) || usr.incapacitated(TRUE, TRUE) || (isobserver(usr) && !IsAdminGhost(usr))) return if(ishuman(usr)) var/mob/living/carbon/human/H = usr @@ -180,18 +133,6 @@ user.visible_message("[user] scratches a grid on [user.p_their()] wrist with the paper! It looks like [user.p_theyre()] trying to commit sudoku...") return (BRUTELOSS) -/// ONLY USED FOR APRIL FOOLS -/obj/item/paper/proc/reset_spamflag() - spam_flag = FALSE - -/obj/item/paper/attack_self(mob/user) - if(rigged && (SSevents.holidays && SSevents.holidays[APRIL_FOOLS])) - if(!spam_flag) - spam_flag = TRUE - playsound(loc, 'sound/items/bikehorn.ogg', 50, TRUE) - addtimer(CALLBACK(src, .proc/reset_spamflag), 20) - . = ..() - /obj/item/paper/proc/clearpaper() info = "" stamps = null @@ -199,28 +140,39 @@ cut_overlays() update_icon_state() -/obj/item/paper/examine_more(mob/user) - ui_interact(user) - return list("You try to read [src]...") +/obj/item/paper/examine(mob/user) + . = ..() + if(!in_range(user, src) && !isobserver(user)) + . += "You're too far away to read it!" + return + if(user.can_read(src)) + ui_interact(user) + return + . += "You cannot read it!" + +/obj/item/paper/ui_status(mob/user,/datum/ui_state/state) + // Are we on fire? Hard ot read if so + if(resistance_flags & ON_FIRE) + return UI_CLOSE + if(!in_range(user,src)) + return UI_CLOSE + if(user.incapacitated(TRUE, TRUE) || (isobserver(user) && !IsAdminGhost(user))) + return UI_UPDATE + // Even harder to read if your blind...braile? humm + // .. or if you cannot read + if(!user.can_read(src)) + return UI_CLOSE + if(in_contents_of(/obj/machinery/door/airlock)) + return UI_INTERACTIVE + return ..() + + /obj/item/paper/can_interact(mob/user) - if(!..()) - return FALSE - // Are we on fire? Hard ot read if so - if(resistance_flags & ON_FIRE) - return FALSE - // Even harder to read if your blind...braile? humm - if(user.is_blind()) - return FALSE - // checks if the user can read. - return user.can_read(src) + if(in_contents_of(/obj/machinery/door/airlock)) + return TRUE + return ..() -/** - * This creates the ui, since we are using a custom state but not much else - * just makes it easyer to make it. - */ -/obj/item/paper/proc/create_ui(mob/user, datum/ui_state/default/paper_state/state) - ui_interact(user, state = state) /obj/item/proc/burn_paper_product_attackby_check(obj/item/I, mob/living/user, bypass_clumsy) var/ignition_message = I.ignition_effect(src, user) @@ -244,49 +196,22 @@ /obj/item/paper/attackby(obj/item/P, mob/living/user, params) if(burn_paper_product_attackby_check(P, user)) - close_all_ui() + SStgui.close_uis(src) return if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) if(length(info) >= MAX_PAPER_LENGTH) // Sheet must have less than 1000 charaters to_chat(user, "This sheet of paper is full!") return - - var/datum/ui_state/default/paper_state/state = new - state.edit_mode = MODE_WRITING - // should a crayon be in the same subtype as a pen? How about a brush or charcoal? - // TODO: Convert all writing stuff to one type, /obj/item/art_tool maybe? - state.is_crayon = istype(P, /obj/item/toy/crayon); - if(state.is_crayon) - var/obj/item/toy/crayon/PEN = P - state.pen_font = CRAYON_FONT - state.pen_color = PEN.paint_color - else - var/obj/item/pen/PEN = P - state.pen_font = PEN.font - state.pen_color = PEN.colour - - create_ui(user, state) + ui_interact(user) return else if(istype(P, /obj/item/stamp)) - - var/datum/ui_state/default/paper_state/state = new - state.edit_mode = MODE_STAMPING // we are read only becausse the sheet is full - state.stamp_icon_state = P.icon_state - state.stamp_name = P.name - - var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/simple/paper) - state.stamp_class = sheet.icon_class_name(P.icon_state) - to_chat(user, "You ready your stamp over the paper! ") - - create_ui(user, state) + ui_interact(user) return /// Normaly you just stamp, you don't need to read the thing else // cut paper? the sky is the limit! - var/datum/ui_state/default/paper_state/state = new - state.edit_mode = MODE_READING - create_ui(user, state) // The other ui will be created with just read mode outside of this + ui_interact(user) // The other ui will be created with just read mode outside of this return ..() @@ -301,68 +226,64 @@ get_asset_datum(/datum/asset/spritesheet/simple/paper), ) -/obj/item/paper/ui_interact(mob/user, datum/tgui/ui, - datum/ui_state/default/paper_state/state) - // Update the state - ui = ui || SStgui.get_open_ui(user, src) - if(ui && state) - var/datum/ui_state/default/paper_state/current_state = ui.state - current_state.copy_from(state) +/obj/item/paper/ui_interact(mob/user, datum/tgui/ui) // Update the UI ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "PaperSheet", name) - state = new - ui.set_state(state) - ui.set_autoupdate(FALSE) - viewing_ui[user] = ui ui.open() -/obj/item/paper/ui_close(mob/user) - /// close the editing window and change the mode - viewing_ui[user] = null - . = ..() -// Again, we have to do this as autoupdate is off -/obj/item/paper/proc/update_all_ui() - for(var/datum/tgui/ui in viewing_ui) - ui.process(force = TRUE) +/obj/item/paper/ui_static_data(mob/user) + . = list() + .["text"] = info + .["max_length"] = MAX_PAPER_LENGTH + .["paper_color"] = !color || color == "white" ? "#FFFFFF" : color // color might not be set + .["paper_state"] = icon_state /// TODO: show the sheet will bloodied or crinkling? + .["stamps"] = stamps + -// Again, we have to do this as autoupdate is off -/obj/item/paper/proc/close_all_ui() - for(var/datum/tgui/ui in viewing_ui) - ui.close() - viewing_ui = list() /obj/item/paper/ui_data(mob/user) var/list/data = list() - - var/datum/tgui/ui = viewing_ui[user] - var/datum/ui_state/default/paper_state/state = ui.state - - // Should all this go in static data and just do a forced update? - data["text"] = info - data["max_length"] = MAX_PAPER_LENGTH - data["paper_state"] = icon_state /// TODO: show the sheet will bloodied or crinkling? - data["paper_color"] = !color || color == "white" ? "#FFFFFF" : color // color might not be set - data["stamps"] = stamps - - data["edit_mode"] = state.edit_mode - data["edit_usr"] = "[ui.user]"; - - // pen info for editing - data["is_crayon"] = state.is_crayon - data["pen_font"] = state.pen_font - data["pen_color"] = state.pen_color - // stamping info for..stamping - data["stamp_class"] = state.stamp_class - + var/obj/O = user.get_active_held_item() + if(istype(O, /obj/item/toy/crayon)) + var/obj/item/toy/crayon/PEN = O + data["pen_font"] = CRAYON_FONT + data["pen_color"] = PEN.paint_color + data["edit_mode"] = MODE_WRITING + data["is_crayon"] = TRUE + data["stamp_class"] = "FAKE" + data["stamp_icon_state"] = "FAKE" + else if(istype(O, /obj/item/pen)) + var/obj/item/pen/PEN = O + data["pen_font"] = PEN.font + data["pen_color"] = PEN.colour + data["edit_mode"] = MODE_WRITING + data["is_crayon"] = FALSE + data["stamp_class"] = "FAKE" + data["stamp_icon_state"] = "FAKE" + else if(istype(O, /obj/item/stamp)) + var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/simple/paper) + data["stamp_icon_state"] = O.icon_state + data["stamp_class"] = sheet.icon_class_name(O.icon_state) + data["edit_mode"] = MODE_STAMPING + data["pen_font"] = "FAKE" + data["pen_color"] = "FAKE" + data["is_crayon"] = FALSE + else + data["edit_mode"] = MODE_READING + data["pen_font"] = "FAKE" + data["pen_color"] = "FAKE" + data["is_crayon"] = FALSE + data["stamp_icon_state"] = "FAKE" + data["stamp_class"] = "FAKE" data["field_counter"] = field_counter data["form_fields"] = form_fields return data -/obj/item/paper/ui_act(action, params, datum/tgui/ui, datum/ui_state/default/paper_state/state) +/obj/item/paper/ui_act(action, params,datum/tgui/ui) if(..()) return switch(action) @@ -370,34 +291,33 @@ var/stamp_x = text2num(params["x"]) var/stamp_y = text2num(params["y"]) var/stamp_r = text2num(params["r"]) // rotation in degrees - + var/stamp_icon_state = params["stamp_icon_state"] + var/stamp_class = params["stamp_class"] if (isnull(stamps)) - stamps = new/list() + stamps = list() if(stamps.len < MAX_PAPER_STAMPS) // I hate byond when dealing with freaking lists - stamps += list(list(state.stamp_class, stamp_x, stamp_y,stamp_r)) /// WHHHHY + stamps[++stamps.len] = list(stamp_class, stamp_x, stamp_y, stamp_r) /// WHHHHY /// This does the overlay stuff if (isnull(stamped)) - stamped = new/list() + stamped = list() if(stamped.len < MAX_PAPER_STAMPS_OVERLAYS) - var/mutable_appearance/stampoverlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_[state.stamp_icon_state]") + var/mutable_appearance/stampoverlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_[stamp_icon_state]") stampoverlay.pixel_x = rand(-2, 2) stampoverlay.pixel_y = rand(-3, 2) add_overlay(stampoverlay) - LAZYADD(stamped, state.stamp_icon_state) + LAZYADD(stamped, stamp_icon_state) - ui.user.visible_message("[ui.user] stamps [src] with [state.stamp_name]!", "You stamp [src] with [state.stamp_name]!") + update_static_data(usr,ui) + ui.user.visible_message("[ui.user] stamps [src] with [stamp_class]!", "You stamp [src] with [stamp_class]!") else to_chat(usr, pick("You try to stamp but you miss!", "There is no where else you can stamp!")) - - update_all_ui() . = TRUE if("save") var/in_paper = params["text"] var/paper_len = length(in_paper) - var/list/fields = params["form_fields"] field_counter = params["field_counter"] ? text2num(params["field_counter"]) : field_counter if(paper_len > MAX_PAPER_LENGTH) @@ -413,14 +333,10 @@ if(info != in_paper) to_chat(ui.user, "You have added to your paper masterpiece!"); info = in_paper - - for(var/key in fields) - form_fields[key] = fields[key]; + update_static_data(usr,ui) - update_all_ui() update_icon() - . = TRUE /** diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index 3937720f74..a3b9b23141 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -26,11 +26,11 @@ var/obj/item/bodypart/BP = C.get_bodypart(BODY_ZONE_HEAD) if(BP) BP.drop_limb() - playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1) + playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'),50, TRUE, -1) return (BRUTELOSS) else user.visible_message("[user] repeatedly bashes [src.name] against [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!") - playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1) + playsound(loc, 'sound/items/gavel.ogg', 50, TRUE, -1) return (BRUTELOSS) @@ -42,11 +42,12 @@ if(storedpaper) . += "paper" + /obj/item/papercutter/attackby(obj/item/P, mob/user, params) if(istype(P, /obj/item/paper) && !storedpaper) if(!user.transferItemToLoc(P, src)) return - playsound(loc, "pageturn", 60, 1) + playsound(loc, "pageturn", 60, TRUE) to_chat(user, "You place [P] in [src].") storedpaper = P update_icon() @@ -59,17 +60,17 @@ storedcutter = P update_icon() return - if(istype(P, /obj/item/screwdriver) && storedcutter) + if(P.tool_behaviour == TOOL_SCREWDRIVER && storedcutter) P.play_tool_sound(src) to_chat(user, "[storedcutter] has been [cuttersecured ? "unsecured" : "secured"].") cuttersecured = !cuttersecured return ..() -/obj/item/papercutter/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) +/obj/item/papercutter/on_attack_hand(mob/user) add_fingerprint(user) if(!storedcutter) - to_chat(user, "The cutting blade is gone! You can't use [src] now.") + to_chat(user, "The cutting blade is gone! You can't use [src] now.") return if(!cuttersecured) @@ -79,7 +80,7 @@ update_icon() if(storedpaper) - playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1) + playsound(src.loc, 'sound/weapons/slash.ogg', 50, TRUE) to_chat(user, "You neatly cut [storedpaper].") storedpaper = null qdel(storedpaper) @@ -88,6 +89,7 @@ update_icon() /obj/item/papercutter/MouseDrop(atom/over_object) + . = ..() var/mob/M = usr if(M.incapacitated() || !Adjacent(M)) return @@ -98,10 +100,6 @@ else if(istype(over_object, /obj/screen/inventory/hand)) var/obj/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) - - else - . = ..() - add_fingerprint(M) /obj/item/paperslip @@ -112,6 +110,12 @@ resistance_flags = FLAMMABLE max_integrity = 50 +/obj/item/paperslip/attackby(obj/item/I, mob/living/user, params) + if(burn_paper_product_attackby_check(I, user)) + return + return ..() + + /obj/item/paperslip/Initialize() . = ..() pixel_x = rand(-5, 5) @@ -124,5 +128,6 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "cutterblade" item_state = "knife" + // inhand_icon_state = "knife" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm index 414026924a..97b15628a8 100644 --- a/code/modules/paperwork/paper_premade.dm +++ b/code/modules/paperwork/paper_premade.dm @@ -4,53 +4,22 @@ /obj/item/paper/fluff/sop name = "paper- 'Standard Operating Procedure'" - info = {" -Alert Levels: -* Blue - Emergency - * Caused by fire - * Caused by manual interaction - * Action: Close all fire doors. These can only be opened by resetting the alarm -* Red- Ejection/Self Destruct - * Caused by module operating computer. - * Action: After the specified time the module will eject completely. -Engine Maintenance Instructions: -1. Shut off ignition systems: -2. Activate internal power -3. Activate orbital balance matrix -4. Remove volatile liquids from area -5. Wear a fire suit -6. After Decontaminate Visit medical examiner -Toxin Laboratory Procedure: -1. Wear a gas mask regardless -2. Get an oxygen tank. -3. Activate internal atmosphere -4. After Decontaminate Visit medical examiner -Disaster Procedure: -Fire: -1. Activate sector fire alarm. -2. Move to a safe area. -3. Get a fire suit -* After: - 1. Assess Damage - 2. Repair damages - 3. If needed, Evacuate -Meteor Shower: -1. Activate fire alarm -2. Move to the back of ship -* After - 1. Repair damage - 2. If needed, Evacuate -Accidental Reentry: -1. Activate fire alarms in front of ship. -2. Move volatile matter to a fire proof area! -3. Get a fire suit. -4. Stay secure until an emergency ship arrives. -5. If ship does not arrive-Evacuate to a nearby safe area! -"}; + info = "Alert Levels:
\nBlue- Emergency
\n\t1. Caused by fire
\n\t2. Caused by manual interaction
\n\tAction:
\n\t\tClose all fire doors. These can only be opened by resetting the alarm
\nRed- Ejection/Self-Destruct
\n\t1. Caused by module operating computer.
\n\tAction:
\n\t\tAfter the specified time the module will eject completely.
\n
\nEngine Maintenance Instructions:
\n\tShut off ignition systems:
\n\tActivate internal power
\n\tActivate orbital balance matrix
\n\tRemove volatile liquids from area
\n\tWear a fire suit
\n
\n\tAfter
\n\t\tDecontaminate
\n\t\tVisit medical examiner
\n
\nToxin Laboratory Procedure:
\n\tWear a gas mask regardless
\n\tGet an oxygen tank.
\n\tActivate internal atmosphere
\n
\n\tAfter
\n\t\tDecontaminate
\n\t\tVisit medical examiner
\n
\nDisaster Procedure:
\n\tFire:
\n\t\tActivate sector fire alarm.
\n\t\tMove to a safe area.
\n\t\tGet a fire suit
\n\t\tAfter:
\n\t\t\tAssess Damage
\n\t\t\tRepair damages
\n\t\t\tIf needed, Evacuate
\n\tMeteor Shower:
\n\t\tActivate fire alarm
\n\t\tMove to the back of ship
\n\t\tAfter
\n\t\t\tRepair damage
\n\t\t\tIf needed, Evacuate
\n\tAccidental Reentry:
\n\t\tActivate fire alarms in front of ship.
\n\t\tMove volatile matter to a fire proof area!
\n\t\tGet a fire suit.
\n\t\tStay secure until an emergency ship arrives.
\n
\n\t\tIf ship does not arrive-
\n\t\t\tEvacuate to a nearby safe area!" /obj/item/paper/fluff/shuttles/daniel info = "i love daniel
daniel is my best friend

you are tearing me apart elise" +/obj/item/paper/fluff/jobs/prisoner/letter + name = "letter from home" + info = {"Dearest sweetheart, +
It is truly saddening you must spend your time locked up in an awful prison on that dangerous station. I have spoken to your lawyer who will attempt to appeal to the judge so your sentence may hopefully be reduced. +
Regardless, I just want you to understand that all of us out here still love you, and want to see you released safely some day! I know that prison can be a very vicious place, so please promise us you'll avoid getting into any fights or trouble, okay? +
We all care for your safety deeply, and could not live with ourselves if you ended up getting hurt. We've scheduled a visit to see you, and with any luck, hopefully our request will be granted soon. +
Anyways, please do your best to make it by in that place, and never forget we'll be always here for you, no matter if we're separated. +
+
Please stay safe, +
-Love, Your Dearest"} + //////////// Job guides n' fluff @@ -90,9 +59,42 @@ Accidental Reentry: name = "paper- 'Chemical Information'" info = "Known Onboard Toxins:
\n\tGrade A Semi-Liquid Plasma:
\n\t\tHighly poisonous. You cannot sustain concentrations above 15 units.
\n\t\tA gas mask fails to filter plasma after 50 units.
\n\t\tWill attempt to diffuse like a gas.
\n\t\tFiltered by scrubbers.
\n\t\tThere is a bottled version which is very different
\n\t\t\tfrom the version found in canisters!
\n
\n\t\tWARNING: Highly Flammable. Keep away from heat sources
\n\t\texcept in an enclosed fire area!
\n\t\tWARNING: It is a crime to use this without authorization.
\nKnown Onboard Anti-Toxin:
\n\tAnti-Toxin Type 01P: Works against Grade A Plasma.
\n\t\tBest if injected directly into bloodstream.
\n\t\tA full injection is in every regular Med-Kit.
\n\t\tSpecial toxin Kits hold around 7.
\n
\nKnown Onboard Chemicals (other):
\n\tRejuvenation T#001:
\n\t\tEven 1 unit injected directly into the bloodstream
\n\t\t\twill cure unconscious and sleep toxins.
\n\t\tIf administered to a dying patient it will prevent
\n\t\t\tfurther damage for about units*3 seconds.
\n\t\t\tit will not cure them or allow them to be cured.
\n\t\tIt can be administered to a non-dying patient
\n\t\t\tbut the chemicals disappear just as fast.
\n\tMorphine T#054:
\n\t\t5 units will induce precisely 1 minute of sleep.
\n\t\t\tThe effect are cumulative.
\n\t\tWARNING: It is a crime to use this without authorization" +/obj/item/paper/fluff/jobs/medical/hippocratic + name = "paper- 'Hippocratic Oath'" + info = {"I swear to fulfill, to the best of my ability and judgment, this covenant: +
+ I will respect the hard-won scientific gains of those physicians in whose steps I walk, + and gladly share such knowledge as is mine with those who are to follow. +
+ I will apply, for the benefit of the sick, all measures that are required, + avoiding those twin traps of overtreatment and therapeutic nihilism. +
+ I will remember that there is art to medicine as well as science, + and that warmth, sympathy, and understanding may outweigh the surgeon's knife or the chemist's drug. +
+ I will not be ashamed to say "I know not," + nor will I fail to call in my colleagues when the skills of another are needed for a patient's recovery. +
+ I will respect the privacy of my patients, for their problems are not disclosed to me that the world may know. Most especially must I tread with care in matters of life and death. + If it is given me to save a life, all thanks. But it may also be within my power to take a life; + this awesome responsibility must be faced with great humbleness and awareness of my own frailty. Above all, I must not play at God. +
+ I will remember that I do not treat a fever chart, a cancerous growth, but a sick human being, whose illness may affect the person's family and economic stability. + My responsibility includes these related problems, if I am to care adequately for the sick. +
+ I will prevent disease whenever I can, for prevention is preferable to cure. +
+ I will remember that I remain a member of society, with special obligations to all my fellow human beings, + those sound of mind and body as well as the infirm. +
+ If I do not violate this oath, may I enjoy life and art, respected while I live and remembered with affection thereafter. + May I always act so as to preserve the finest traditions of my calling and may I long experience the joy of healing those who seek my help. +
"} + /* * Stations */ +////////// cogstation. /obj/item/paper/guides/cogstation/job_changes name = "MEMO: Job Changes" diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 28cb5ffae9..b8bbd0a30e 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "paper_bin1" item_state = "sheet-metal" + // inhand_icon_state = "sheet-metal" lefthand_file = 'icons/mob/inhands/misc/sheets_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/sheets_righthand.dmi' throwforce = 0 @@ -43,6 +44,7 @@ ..() /obj/item/paper_bin/MouseDrop(atom/over_object) + . = ..() var/mob/living/M = usr if(!istype(M) || M.incapacitated() || !Adjacent(M)) return @@ -54,17 +56,18 @@ var/obj/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) - else - . = ..() - add_fingerprint(M) /obj/item/paper_bin/attack_paw(mob/user) return attack_hand(user) -/obj/item/paper_bin/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) - if(user.lying) - return +//ATTACK HAND IGNORING PARENT RETURN VALUE +/obj/item/paper_bin/on_attack_hand(mob/user) + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_PICKUP)) + return + // user.changeNext_move(CLICK_CD_MELEE) if(bin_pen) var/obj/item/pen/P = bin_pen P.add_fingerprint(user) @@ -85,8 +88,8 @@ P = new papertype(src) if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) if(prob(30)) - P.info = "*HONK HONK HONK HONK HONK HONK HONK
HOOOOOOOOOOOOOOOOOOOOOONK*\n*APRIL FOOLS*\n" - P.rigged = 1 + 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) @@ -148,8 +151,7 @@ papertype = /obj/item/paper/natural resistance_flags = FLAMMABLE -/obj/item/paper_bin/bundlenatural/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) - ..() +/obj/item/paper_bin/bundlenatural/on_attack_hand(mob/user) if(total_paper < 1) qdel(src) @@ -173,3 +175,9 @@ qdel(src) 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" + papertype = /obj/item/paper/carbon diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index c6a1ee1389..d496ae8068 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -1,9 +1,9 @@ - /obj/item/paperplane name = "paper plane" desc = "Paper, folded in the shape of a plane." icon = 'icons/obj/bureaucracy.dmi' icon_state = "paperplane" + // custom_fire_overlay = "paperplane_onfire" throw_range = 7 throw_speed = 1 throwforce = 0 @@ -11,7 +11,7 @@ resistance_flags = FLAMMABLE max_integrity = 50 - var/hit_probability = 2//% + var/hit_probability = 2 //% var/obj/item/paper/internalPaper /obj/item/paperplane/origami @@ -41,6 +41,13 @@ qdel(src) return ..() +/obj/item/paperplane/Exited(atom/movable/AM, atom/newLoc) + . = ..() + if (AM == internalPaper) + internalPaper = null + if(!QDELETED(src)) + qdel(src) + /obj/item/paperplane/Destroy() QDEL_NULL(internalPaper) return ..() @@ -71,35 +78,23 @@ user.put_in_hands(internal_paper_tmp) /obj/item/paperplane/attackby(obj/item/P, mob/living/carbon/human/user, params) - ..() + if(burn_paper_product_attackby_check(P, user)) + return if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) - to_chat(user, "You should unfold [src] before changing it.") + to_chat(user, "You should unfold [src] before changing it!") return else if(istype(P, /obj/item/stamp)) //we don't randomize stamps on a paperplane internalPaper.attackby(P, user) //spoofed attack to update internal paper. update_icon() + add_fingerprint(user) + return - else if(P.get_temperature()) - if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10)) - user.visible_message("[user] accidentally ignites [user.p_them()]self!", \ - "You miss [src] and accidentally light yourself on fire!") - user.dropItemToGround(P) - user.adjust_fire_stacks(1) - user.IgniteMob() - return - - if(!(in_range(user, src))) //to prevent issues as a result of telepathically lighting a paper - return - user.dropItemToGround(src) - user.visible_message("[user] lights [src] ablaze with [P]!", "You light [src] on fire!") - fire_act() - - add_fingerprint(user) + return ..() -/obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback) - . = ..(target, range, speed, thrower, FALSE, diagonals_first, callback) +/obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback, quickstart = TRUE) + . = ..(target, range, speed, thrower, FALSE, diagonals_first, callback, quickstart = quickstart) /obj/item/paperplane/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(iscarbon(hit_atom)) @@ -112,26 +107,28 @@ if(..() || !ishuman(hit_atom))//if the plane is caught or it hits a nonhuman return var/mob/living/carbon/human/H = hit_atom + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) if(prob(hit_probability)) if(H.is_eyes_covered()) return - var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) - visible_message("\The [src] hits [H] in the eye!") + visible_message("\The [src] hits [H] in the eye[eyes ? "" : " socket"]!") H.adjust_blurriness(6) - if(eyes) - eyes.applyOrganDamage(rand(6,8)) + eyes?.applyOrganDamage(rand(6,8)) H.DefaultCombatKnockdown(40) H.emote("scream") - /obj/item/paper/examine(mob/user) . = ..() . += "Alt-click [src] to fold it into a paper plane." /obj/item/paper/AltClick(mob/living/carbon/user, obj/item/I) - . = ..() - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user), NO_TK)) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return + if(istype(src, /obj/item/paper/carbon)) + var/obj/item/paper/carbon/Carbon = src + if(!Carbon.iscopy && !Carbon.copied) + to_chat(user, "Take off the carbon copy first.") + return to_chat(user, "You fold [src] into the shape of a plane!") user.temporarilyRemoveItemFromInventory(src) var/obj/item/paperplane/plane_type = /obj/item/paperplane @@ -142,4 +139,3 @@ I = new plane_type(user, src) user.put_in_hands(I) - return TRUE diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 91b8a6719b..13890ae69e 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -16,6 +16,8 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "pen" item_state = "pen" + // inhand_icon_state = "pen" + // worn_icon_state = "pen" slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_EARS throwforce = 0 w_class = WEIGHT_CLASS_TINY @@ -76,6 +78,22 @@ icon_state = "pen-fountain" font = FOUNTAIN_PEN_FONT +/obj/item/pen/charcoal + name = "charcoal stylus" + desc = "It's just a wooden stick with some compressed ash on the end. At least it can write." + icon_state = "pen-charcoal" + colour = "dimgray" + font = CHARCOAL_FONT + custom_materials = null + grind_results = list(/datum/reagent/ash = 5, /datum/reagent/cellulose = 10) + +/datum/crafting_recipe/charcoal_stylus + name = "Charcoal Stylus" + result = /obj/item/pen/charcoal + reqs = list(/obj/item/stack/sheet/mineral/wood = 1, /datum/reagent/ash = 30) + time = 30 + category = CAT_PRIMAL + /obj/item/pen/fountain/captain name = "captain's fountain pen" desc = "It's an expensive Oak fountain pen. The nib is quite sharp." @@ -93,6 +111,7 @@ "Black and Silver" = "pen-fountain-b", "Command Blue" = "pen-fountain-cb" ) + embedding = list("embed_chance" = 75) /obj/item/pen/fountain/captain/Initialize() . = ..() @@ -139,20 +158,18 @@ if(QDELETED(O) || !user.canUseTopic(O, BE_CLOSE)) return if(oldname == input) - to_chat(user, "You changed \the [O.name] to... well... \the [O.name].") + to_chat(user, "You changed \the [O.name] to... well... \the [O.name].") else O.name = input - to_chat(user, "\The [oldname] has been successfully been renamed to \the [input].") + to_chat(user, "\The [oldname] has been successfully been renamed to \the [input].") O.renamedByPlayer = TRUE - log_game("[user] [key_name(user)] has renamed [O] to [input]") if(penchoice == "Change description") - var/input = stripped_input(user,"Describe \the [O.name] here", ,"", 2048) + var/input = stripped_input(user,"Describe \the [O.name] here", ,"", 100) if(QDELETED(O) || !user.canUseTopic(O, BE_CLOSE)) return O.desc = input - to_chat(user, "You have successfully changed \the [O.name]'s description.") - log_game("[user] [key_name(user)] has changed [O]'s description to to [input]") + to_chat(user, "You have successfully changed \the [O.name]'s description.") /* * Sleepypens @@ -181,9 +198,10 @@ */ /obj/item/pen/edagger attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off + // attack_verb_continuous = list("slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") //these won't show up if the pen is off + // attack_verb_simple = list("slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") sharpness = SHARP_EDGED var/on = FALSE - embedding = list(embed_chance = EMBED_CHANCE) /obj/item/pen/edagger/ComponentInitialize() . = ..() @@ -193,29 +211,38 @@ /obj/item/pen/edagger/get_sharpness() return on * sharpness +/obj/item/pen/edagger/suicide_act(mob/user) + . = BRUTELOSS + if(on) + user.visible_message("[user] forcefully rams the pen into their mouth!") + else + user.visible_message("[user] is holding a pen up to their mouth! It looks like [user.p_theyre()] trying to commit suicide!") + attack_self(user) + /obj/item/pen/edagger/attack_self(mob/living/user) if(on) on = FALSE force = initial(force) + throw_speed = initial(throw_speed) w_class = initial(w_class) name = initial(name) hitsound = initial(hitsound) - embedding = null + embedding = list(embed_chance = EMBED_CHANCE) throwforce = initial(throwforce) - playsound(user, 'sound/weapons/saberoff.ogg', 5, 1) + playsound(user, 'sound/weapons/saberoff.ogg', 5, TRUE) to_chat(user, "[src] can now be concealed.") - updateEmbedding() else on = TRUE force = 18 + throw_speed = 4 w_class = WEIGHT_CLASS_NORMAL name = "energy dagger" hitsound = 'sound/weapons/blade1.ogg' - embedding = list(embed_chance = 100, fall_chance = 0) //rule of cool + embedding = list(embed_chance = 100) //rule of cool throwforce = 35 - playsound(user, 'sound/weapons/saberon.ogg', 5, 1) + playsound(user, 'sound/weapons/saberon.ogg', 5, TRUE) to_chat(user, "[src] is now active.") - updateEmbedding() + updateEmbedding() update_icon() /obj/item/pen/edagger/update_icon_state() @@ -235,6 +262,8 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "digging_pen" item_state = "pen" + // inhand_icon_state = "pen" + // worn_icon_state = "pen" force = 3 w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/iron=10, /datum/material/diamond=100, /datum/material/titanium = 10) diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 241dde13a8..104f70bfdf 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "stamp-ok" item_state = "stamp" + // inhand_icon_state = "stamp" throwforce = 0 w_class = WEIGHT_CLASS_TINY throw_speed = 3 @@ -11,6 +12,8 @@ custom_materials = list(/datum/material/iron=60) pressure_resistance = 2 attack_verb = list("stamped") + // attack_verb_continuous = list("stamps") + // attack_verb_simple = list("stamp") /obj/item/stamp/suicide_act(mob/user) user.visible_message("[user] stamps 'VOID' on [user.p_their()] forehead, then promptly falls over, dead.") @@ -66,5 +69,25 @@ icon_state = "stamp-clown" dye_color = DYE_CLOWN +/obj/item/stamp/mime + name = "mime's rubber stamp" + icon_state = "stamp-mime" + dye_color = DYE_MIME + +/obj/item/stamp/chap + name = "chaplain's rubber stamp" + icon_state = "stamp-chap" + dye_color = DYE_CHAP + +/obj/item/stamp/centcom + name = "CentCom rubber stamp" + icon_state = "stamp-centcom" + dye_color = DYE_CENTCOM + +/obj/item/stamp/syndicate + name = "Syndicate rubber stamp" + icon_state = "stamp-syndicate" + dye_color = DYE_SYNDICATE + /obj/item/stamp/attack_paw(mob/user) return attack_hand(user) diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm new file mode 100644 index 0000000000..e46ed64971 --- /dev/null +++ b/code/modules/paperwork/ticketmachine.dm @@ -0,0 +1,231 @@ +//Bureaucracy machine! +//Simply set this up in the hopline and you can serve people based on ticket numbers + +/obj/machinery/ticket_machine + name = "ticket machine" + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "ticketmachine" + desc = "A marvel of bureaucratic engineering encased in an efficient plastic shell. It can be refilled with a hand labeler refill roll and linked to buttons with a multitool." + density = FALSE + maptext_height = 26 + maptext_width = 32 + maptext_x = 7 + maptext_y = 10 + layer = HIGH_OBJ_LAYER + var/ticket_number = 0 //Increment the ticket number whenever the HOP presses his button + var/current_number = 0 //What ticket number are we currently serving? + var/max_number = 100 //At this point, you need to refill it. + var/cooldown = 50 + var/ready = TRUE + var/id = "ticket_machine_default" //For buttons + var/list/ticket_holders = list() + var/list/obj/item/ticket_machine_ticket/tickets = list() + +/obj/machinery/ticket_machine/multitool_act(mob/living/user, obj/item/I) + if(!multitool_check_buffer(user, I)) //make sure it has a data buffer + return + var/obj/item/multitool/M = I + M.buffer = src + to_chat(user, "You store linkage information in [I]'s buffer.") + return TRUE + +/obj/machinery/ticket_machine/emag_act(mob/user) //Emag the ticket machine to dispense burning tickets, as well as randomize its number to destroy the HoP's mind. + if(obj_flags & EMAGGED) + return + to_chat(user, "You overload [src]'s bureaucratic logic circuitry to its MAXIMUM setting.") + ticket_number = rand(0,max_number) + current_number = ticket_number + obj_flags |= EMAGGED + if(tickets.len) + for(var/obj/item/ticket_machine_ticket/ticket in tickets) + ticket.audible_message("\the [ticket] disperses!") + qdel(ticket) + tickets.Cut() + update_icon() + +/obj/machinery/ticket_machine/Initialize() + . = ..() + update_icon() + +/obj/machinery/ticket_machine/proc/increment() + if(current_number > ticket_number) + return + if(current_number && !(obj_flags & EMAGGED) && tickets[current_number]) + tickets[current_number].audible_message("\the [tickets[current_number]] disperses!") + qdel(tickets[current_number]) + if(current_number < ticket_number) + current_number ++ //Increment the one we're serving. + playsound(src, 'sound/misc/announce_dig.ogg', 50, FALSE) + say("Now serving ticket #[current_number]!") + if(!(obj_flags & EMAGGED) && tickets[current_number]) + tickets[current_number].audible_message("\the [tickets[current_number]] vibrates!") + update_icon() //Update our icon here rather than when they take a ticket to show the current ticket number being served + +/obj/machinery/button/ticket_machine + name = "increment ticket counter" + desc = "Use this button after you've served someone to tell the next person to come forward." + device_type = /obj/item/assembly/control/ticket_machine + req_access = list() + id = "ticket_machine_default" + +/obj/machinery/button/ticket_machine/Initialize() + . = ..() + if(device) + var/obj/item/assembly/control/ticket_machine/ours = device + ours.id = id + +/obj/machinery/button/ticket_machine/multitool_act(mob/living/user, obj/item/I) + . = ..() + if(I.tool_behaviour == TOOL_MULTITOOL) + var/obj/item/multitool/M = I + if(M.buffer && !istype(M.buffer, /obj/machinery/ticket_machine)) + return + var/obj/item/assembly/control/ticket_machine/controller = device + controller.linked = M.buffer + id = null + controller.id = null + to_chat(user, "You've linked [src] to [controller.linked].") + +/obj/item/assembly/control/ticket_machine + name = "ticket machine controller" + desc = "A remote controller for the HoP's ticket machine." + var/obj/machinery/ticket_machine/linked //To whom are we linked? + +/obj/item/assembly/control/ticket_machine/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/item/assembly/control/ticket_machine/LateInitialize() + find_machine() + +/obj/item/assembly/control/ticket_machine/proc/find_machine() //Locate the one to which we're linked + for(var/obj/machinery/ticket_machine/ticketsplease in GLOB.machines) + if(ticketsplease.id == id) + linked = ticketsplease + if(linked) + return TRUE + else + return FALSE + +/obj/item/assembly/control/ticket_machine/activate() + if(cooldown) + return + if(!linked) + return + cooldown = TRUE + linked.increment() + addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10) + +/obj/machinery/ticket_machine/update_icon() + switch(ticket_number) //Gives you an idea of how many tickets are left + if(0 to 49) + icon_state = "ticketmachine_100" + if(50 to 99) + icon_state = "ticketmachine_50" + if(100) + icon_state = "ticketmachine_0" + handle_maptext() + +/obj/machinery/ticket_machine/proc/handle_maptext() + switch(ticket_number) //This is here to handle maptext offsets so that the numbers align. + if(0 to 9) + maptext_x = 13 + if(10 to 99) + maptext_x = 10 + if(100) + maptext_x = 8 + maptext = "[current_number]" //Finally, apply the maptext + +/obj/machinery/ticket_machine/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/hand_labeler_refill)) + if(!(ticket_number >= max_number)) + to_chat(user, "[src] refuses [I]! There [max_number-ticket_number==1 ? "is" : "are"] still [max_number-ticket_number] ticket\s left!") + return + to_chat(user, "You start to refill [src]'s ticket holder (doing this will reset its ticket count!).") + if(do_after(user, 30, target = src)) + to_chat(user, "You insert [I] into [src] as it whirs nondescriptly.") + qdel(I) + ticket_number = 0 + current_number = 0 + if(tickets.len) + for(var/obj/item/ticket_machine_ticket/ticket in tickets) + ticket.audible_message("\the [ticket] disperses!") + qdel(ticket) + tickets.Cut() + max_number = initial(max_number) + update_icon() + return + +/obj/machinery/ticket_machine/proc/reset_cooldown() + ready = TRUE + +/obj/machinery/ticket_machine/attack_hand(mob/living/carbon/user) + . = ..() + if(!ready) + to_chat(user,"You press the button, but nothing happens...") + return + if(ticket_number >= max_number) + to_chat(user,"Ticket supply depleted, please refill this unit with a hand labeller refill cartridge!") + return + if((user in ticket_holders) && !(obj_flags & EMAGGED)) + to_chat(user, "You already have a ticket!") + return + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 100, FALSE) + ticket_number ++ + to_chat(user, "You take a ticket from [src], looks like you're ticket number #[ticket_number]...") + var/obj/item/ticket_machine_ticket/theirticket = new /obj/item/ticket_machine_ticket(get_turf(src)) + theirticket.name = "Ticket #[ticket_number]" + theirticket.maptext = "[ticket_number]" + theirticket.saved_maptext = "[ticket_number]" + theirticket.ticket_number = ticket_number + theirticket.source = src + theirticket.owner = user + user.put_in_hands(theirticket) + ticket_holders += user + tickets += theirticket + if(obj_flags & EMAGGED) //Emag the machine to destroy the HOP's life. + ready = FALSE + addtimer(CALLBACK(src, .proc/reset_cooldown), cooldown)//Small cooldown to prevent piles of flaming tickets + theirticket.fire_act() + user.dropItemToGround(theirticket) + user.adjust_fire_stacks(1) + user.IgniteMob() + return + +/obj/item/ticket_machine_ticket + name = "Ticket" + desc = "A ticket which shows your place in the Head of Personnel's line. Made from Nanotrasen patented NanoPaper®. Though solid, its form seems to shimmer slightly. Feels (and burns) just like the real thing." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "ticket" + maptext_x = 7 + maptext_y = 10 + w_class = WEIGHT_CLASS_TINY + resistance_flags = FLAMMABLE + max_integrity = 50 + var/saved_maptext = null + var/mob/living/carbon/owner + var/obj/machinery/ticket_machine/source + var/ticket_number + +/obj/item/ticket_machine_ticket/attack_hand(mob/user) + . = ..() + maptext = saved_maptext //For some reason, storage code removes all maptext off objs, this stops its number from being wiped off when taken out of storage. + +/obj/item/ticket_machine_ticket/attackby(obj/item/P, mob/living/carbon/human/user, params) //Stolen from papercode + if(burn_paper_product_attackby_check(P, user)) + return + + return ..() + +/obj/item/paper/extinguish() + ..() + update_icon() + +/obj/item/ticket_machine_ticket/Destroy() + if(owner && source) + source.ticket_holders -= owner + source.tickets[ticket_number] = null + owner = null + source = null + return ..() diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 95ae326f1ecc7bf60f77ae4cc8c1a2ca926fd88a..b778a9d1a2124a2a1a9359f5cded01eb229b1483 100644 GIT binary patch literal 21514 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 Hu0mjfyFT@_ literal 0 HcmV?d00001 diff --git a/icons/stamp_icons/large_stamp-cap.png b/icons/stamp_icons/large_stamp-cap.png index 7f7ce460a4edf7fd70f3708297572c7d4cf800b5..19883563b2c94a90d3a60cb5e43c10d63d6b47b9 100644 GIT binary patch delta 1118 zcmV-k1flz>H1Y_LBYy-rNklw<;7*XY zZr}|9cmt2%0fO8^qm)%iN}?qH#QK0DjZ9NCDN>ZgxN6%L3SJw3rWT+eKZ=o8fMVno zpcr`t_$ysJUT$|6gU|Q3DwQy}KZ>s{Ps+Yu85NgZAI{f*n}6-D!EHm|)l{4L-@XmA?Gt;S=!V7gS*Ze*~g3RjsWxzmD|Xs4}ftLAB#|ZNQNej9BN>@Gwzy? z(5XF+;+;EUOgV_CDU38S4%KDen>So}3;>f|8w2~!I|cKGxP)55+_iT2IAU2RuK>l! zD}cBeGDjTF*MENi&;S6mr+xKkdnO;K&CorU77Sg;y)^(dhHfr!W%Nt*X}7!REO)jM7x9Tv;@;jwkfuz0)Dq zsnqM_!})rTH9QVAL*D_Qb*V3nePZTA<3p$AbG+Q{xXu1fYl4SuV2#ej0}4B9vpa|x zVYb3H+kYJZK=as$@TMVTchYF(nHpNB3Z9cwhV7y6VCcJAI?hZ%^ZEW(nQMl&J?$&o zvr_R%g;dFI^p00a!hU0JQ9v~(+v_&T(0Bw&^Z1vC>^0)d5}WM~hQ1@$%Z$F*9mLq^ zsrF>wj`1!{t_*#%-N9zNYhucla^T_7zHsh%Nq>;GHlxCIh|#z$ITu0=7?a7)WUz?I zt_IOZjdnQZuI0o}!%iRahrSE-;wLmZQyoxfYrC+3p~4<7xBJ7}ex(U>`T(& zBO|X;I6+kTPizri$-2WUU2{b~b~8j<#D_sY>-) zevXx^WG}9FET<^tJ=-iLaJ1ZjaJBhDG=H!at;~QBBa>1NHAeddMS_RpJd~p2?$y+3 zJ3ZNYw%IKKm-q{c6rf6OLu$!2CCQVa{0M#Fi2f0J!D}GtDOABcQ9OACaAwzYJ|PNu z(@u`J@^J4plis<4>0L5O*F&BsYq%czt~P(#`?>GbuRJ8=h)xtwY~a{FrTe9q=2zJu zjhyzG(18f`;Hu@B|4i3n92$a3^SR_;6S}iv$P|+}@_@ z{pjhsbF1dw?mFFlPEG6^EoD4xYHR=i@KjY4brIeVVZxZ`i095<;Xeq6<*s7<9sqDi z{uvUGol6M-*xHT?3UA&xxOus~cW`s3S5;7;clUI&cYJ3D0KO|wJ&3;E0lCyQ?616f zOlYdQn=Tn9y{>$GC}}b)Cj%CtS`0(MGMP>v(d*Z!G$UVQP!bYCKauHxaO1F-Fm@Tf zB}5d)#QnVA3Mh15=)C?l@zk^^4X?U@HcnymV&bN&2BT}zdvZy*{ zC@CQ8pCDfX$SNU)LNi(QfUl^4<(Q524)BHxuw)DQH3x)3Z?XcA0Mk?kGNiA`06mFa zj3VG50aQ&H#=Qo>ya1`a`hXa)#0BuG8riD=buB>eBq2@%fQbw6>cm8H0H^_g

j# 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 Hu0mjfJzX+_ literal 6472 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 literal 0 HcmV?d00001 diff --git a/icons/stamp_icons/large_stamp-chap.png b/icons/stamp_icons/large_stamp-chap.png new file mode 100644 index 0000000000000000000000000000000000000000..2586c13bade640f7b9f2b3a1bd4f32f010e8718c GIT binary patch literal 1137 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 QKDGmjvL9q1AhVGF0SDmz2mk;8 diff --git a/icons/stamp_icons/large_stamp-cmo.png b/icons/stamp_icons/large_stamp-cmo.png index eb004be6216016e06c4d7e426c78813d3e6a47c0..bac4c7b2f9156a77ba67f386418a61d70a276db3 100644 GIT binary patch delta 1131 zcmV-x1eE*QHvb5aBYy-&Nkl^ky%t{`=61>Wb>;S}Hk zQcdn5Ca1`f_{a8|Zzhuj3_=nD0Wzm?9HHWO;dFx*Q#vZ}MX3+vsTJrUnL69)E+Y%RKjex&LVOo}?vI z_h_F!4U9pkP(tX$(4ghH`lzC${LnUN7|-_;m(C8?#)3_w@Fz#(u=V7qAJd7UL6xH^ zOXDdApIV))C1Wd=dPl`J;G(PQcpU(&lC`1vdTXE8Te+Uz zP#D)+`<$Bp6MuXM?X#HxzAx*{*|T#v0DQJ#?(IDQ3`{x*&pW4=Mhdwvlw5M@WCJ%m zA?5}EFE6!M%1HGr(k*S;B%CeTFw((`$?<$Y!8v_{63zF%>rhGgP8}(y)u)g3=mGQZ(FVt&TLXBGqlZ83X#J z&->K#0cjrR{>R8Jrfkv8kPH^PS(M_{=&G5Zm-ev5IXUGX>mHqzSh!etDH(Xr$v#Lq zTXp zsd=?=ODAVJ5!$K5;W}h9A+*>6F0$U(j><_kbp>6SXXj~D)hbFfaSY^k{)q$XUv8lY- zTz~bhK@X3((v(#XD0YtE1B!aom=`JK;_@DucigoPOylYKDb70z)(o5|5*b33O@HHO zIG`Bo_dJHmhonjMeZ*^9o>SMVrNVz)bY$PwB#4P-;FL}473wyjv2^P$G)=0H!u7cY z4;*5Y8zc9iqsCYShP84%mWzvaO>>26DSrhm){5@YJ~`*hd7Yf|H5o1F4S|cLc6}Sd z)fzd4dc|<3o@cYXCbKpQIV0RFGumr36z@3gEjf_V63Tm>Z1U>*xhy2PClBNU$n%;^ zg&j#>ld)k-!_$!vBlmip!~tO4*2M4H&>L;&bw@Of)@gp{yvix(6-qJixyH)%9%QdY z8DS_F@A2Ydd%0_i))1&Buu^w|l>p|&)_FBYSRAg=x$9s)CU5Hk=Iqv`f literal 7002 zcmYkAWl&tr5{3_f;1+@e4X%s3yDkz~+{%SeHOtq@L8u!^VJ`%YRKfp{c896mPIKN?RJgdT~yg0xRj7#s90 zJaX*ur`I=|rHfAlg5vUfW{!vjM<_gTaOP^ldN zY~*@#im%U9aKN3fkPs7P4^kHZ=RS{y4D={v^{|nIy<(k6Waz{B2gCI^C-8xh{c!;? z&sd3KKuiYCKPR0Q0^}nA#^YwDd%!1Vz?jbOa31i_xy$f^1N4$9@ZjOcunid;XiGp3*uW>R}c30R}=;$^i0OId|se^Mm<{3 zU+#T{o^Ee;x^}4pI1B=05$<;SCax8WNTw4}f=xFL<7A(j(O#cO=P3u|Ox*$f%)uU<^n&g1V(x=gaDeQpt zV1k_6OWzTIf*?ME{N99OEga4?QkyCknII$Nj-po%0Vj%@d^8+al@gr5Eyu1FsZOpT zM|vsj^oBo7U#2ZVa0K88ddPGd2mrxVahy_6@k^Qb`vG|F>6okEBq&@#c&uySar zy}IakU!CU&M4f)ceig~@s`)>R_Bw{h(aZ?z-9Z#K7!{!|0o(($KPFebT^ZZcpGn)J zgv-kc_$4_NIJN54u97W9k@nIZ@3NhhQI6@pA+b1Am6Tj<-Ar>3Q9 zSIAYUR>+=q@>KsW$tmuXZr6DXz!V==pwp+5g~m<2%{hXsLN-fKOYoJ11#YTY%592> z3)-dJy6sBN({sBF{c{!VOSU{Zj~+;TSfACOZ68W*WYM(|>(QwZ*U_gw2n}*O+6$4g z4zFLRN*eTwNfw!;n56v-PH3GK`nD(&BZC!fJ*2-!y=OaQJM@hfk(PoMtaPGuo~fqP zTFg)^s3@p7JUKC0IJuO;oh8h^%yE=;l(n3--E6Gut_x}^ZECTQuiMux);VwLunW=U z*D2E0&^4%+smiIMS!%CpFL_tes+^=;k-G%#uf1p*Z7ORftUXvkT(54jZSpaJni4>p z2dn$flRA@p+I(W3g^@7ARxv9`bxD1{HaOu5XbNm)PGz5q`V3yD9~ zk24Hd=RmUNWuXMn)~`WV;ZYIbz;Tu|5tc0Cq0N!beFf(mM}wc9b2m9z^;vztOV?}8 zdCslR!#46JxbhfsbvVDy^p8mHs2xOJx?@EJ)-C?kt^O8|&TkdR6ORk53OwkoqOck{i?5=%JxZTSn6kzU`Q-a+ zX$HyU&?Ktg7o9F7EJQ0*G}a+pn`o9jjoWQ@L-Omk)Pq#2)K(UhU4_4fS%I5Tq@3lm z&>C+WSDWY%i>1!QqIQn9{1-3@KMP|ukKLE9?Wf;YVY@lIXnS4+>8v9L4ju(leb*r+ z_+>0OAc0gd#c*Z5_2(0zj69-ekL{*g@U!1Nwp6Pqq?Jy0~4r6t#0b^UU;rGoy>2=n$N&5Bn zpeD)IZ{0#I9Tp{{QfhC`)gRP(&gV88O_uNMX3vSeI{tB;Ew1Zz+&+tpcCBl` zX(%mPE?PXwKi1!hR!5W{-=#j<8dNFUI{qGppM!r!qQY!iZe3U;ofB49i(6tkmBk$X z*!7b0$Bh|-2SXz!duW%+LCRzQ_!edRmJCB+%{AJq@+Z>#M^{oPDeGs6%*#xfEJ)^~ zo~d4&%7n=5(#e+RlkECOtZXhJ9S?;o^-=4!bTbwWJ)(_rmwPbKCAED;_33#Z2D|L+GSc&x2<>4^GVMsVa@tb-w;{X zs5>XS;kD-D?_ReJH_|`fwy{+9y~+LPU#;$c+(2eZ9+L=@l3o$u)32V)IGNXByomr6 zR}u$+AF?cG0RaCX0JwjJ&Bp-X!Ug~*#sDCY4gdu9iAIAm0D$cx zFD0(-zILYX;Xu6X@%nFI7ZK|M7waOPehY^=E3t~t3A7q5C*4%CtoXk5I9l+>p5L1C zXBt1}xnrr%Ic35TMGZ*_W-i6@f;n7u@{y@2>8YjjI8=$d%!ZWGL_z^?@wJVoU*JHs z02~e=uUdC8X^h;l>GQ|u=&@_tOJ6G0LT)ZCYvwz0qJpxT+Nit&Bfq>n4c+liY_hFS zcf3$Iz`tugJK_}L7pfMDx{<7-s9jfzk&U$b$`sZ(ie*9)&T*(aWMoUCZQ)Jb*BIZ0 zFibK$zoa_ae~mJ+dkY6lv}an8a=%D~ETBc^B&wyrRcZi=}a%&}UQ59PgI_jf7&P~!Q#Xq{1KEihp*cL4w-F4JUvCKBOUCOt?z9{(nN*!C@Z!fT45 zo82dpX6uZ|1G#`x9;-}1*Efke;^k)l2T~)cux;3Jb!we^o=K>{)~l1=n@GDhB*C_I zL-SC9sXB-o(&l@=4#Em2_x6+&p=f%KY)Swy8NDY+UI<&jJu_Fy^Xj|pa zI4m*EVdC^YSf2PatRw5TUZ8}Xk{q9iv7UFljXu~$Cs1?MWG%C+J*qxGW4ZF!q4U7h%g!6Bh8RuQ9fnLb&Tl!6-=5#|}rbM5ZPZXqTj4%2IVAJ4jcz~cG^djf%q@NZwX+Gluz@{)+sf+eu?i2w z&mDba`eFD(Y)bS2QemM)Vpsx#Wx~77CdXcOKba&|-1nNn#_q1}oXvbLh=9M`M$2!myS}<_Jb6ozGyen$kxFhH190 z@Voh}5Af->c{GJyr;0r}IK7LUI`Pih+7*X*D-Z>K2cW>?Ox* z7P9?+>Vk_2v_Fmc&%*4mNs>ZgcB62HLr1V_=%tbxh1az&p1Ot4N+ayekE*?veZdEs z-e99PEVORgHtPhv><&7sCsnlgOU>|1=-_paGhuM3QgFlSO%agnX9OB#zmu)M+m9AC78z?{x z%h4i>u>cx=sOxB97QXPj&&Lz+ZD*aOG|}8hsW{8ioyu6QmcnFv96CHe>0y9VK0DlL zCwOkiS3Fs9@Ag_O)AQ9_KE87)0qJROUzCsu>-n-meMSJbK&JTMRXa&X&EHsR#EE{U z-q5xDanjvF!Yx;F(nVIf@nWD!{3laEyp)Z_k=Ua=N9PVJO0mVzByBVE@=&cCn`P()r9&zqL|$W>;=>=EUJYjKA8Qy zWtyfpE32tkrC5|>pfUe!PwwC^%{!ktl41v0@TBQvIJe{8tt#w$N1>&q^(p!0fY zxL-Ulk%M&ebhl9oDg1S<7#4Q)N^5O$jL$hc*SHA-fEF3MhF{`Cl@b+c*MeVv{=tYm`rVr{QfS5Bg%0#D)#=E-^wigL36gF_6*V*AXOp`-7o4Ov* zWeY`2bOUV-3OdYFyWzbFs?>dn(yFT#X>h>87zAWsq~@nx7^h}_lL$Jj_$@;1aMK^Ckt9?*R;| za-Q_XXvSa<$k1(S8S1is4eq$q!mNzLM2vj4S9Yzrc*_wSd3X=V`$IX`wi^etN(2r^ zppC>@ALUrbzRPqCHC-~t2P*SrlwQ+c3Z-fthEd0A90*2+ zi)AM_NOkkgy&G$h_|>st^}keL?O}d=&&t5kI`SiIY-Oo&=EexWgF{76XL%&XQj|v@ z$M<6~_n(N(q=c}xs`3d@->0?I4HCOMO%B3~4#LhjkT3`2~&; zD|GY9+~^%5m`||}L8vq?(g{oSMtAD9sv7hQnYsUEg0={fi`L03S-b=5@8zo5Q2{FqF!d)RLat--`Ae$c{31(0JGB=rc6C1B({UbJWD>ms;V1pPx-;( z@2DHdOQ5oF`P%q=vCWgtWn19rCP27S)7K{$x${j`eHXp6D?MR@0@! zk(Cogn3^Xqz*sLDtKBJlu7S;ZQE+hN6J2T{t!`BcNvcom#VVt?22K2bHhzhJwWR_^ zIP9A}y?q2lkbq>^V%&LLod;SKy{H9n%)pPmpYp}uN~+|OU_1c}`}?9}L80eCx6uY~ zm}W;pw#+0SIgRi zoR9dymCrLdN1td&Wj>+bq*<}ojH0CBuLZ8@TJFp*OQk6xzoEoeG*a89zaopsIXV97 z+<5M#k0<5Un9T3FmWkt$3cF1c+~dBpu0Ap^QoO-7;0YkSyXLkv)W~Q(FBP83{=CR} zX+=r@`?Gna&^6fd?;O5sU4`DEaPRkkd~91om)5d>e>LoWc5QNdUQuo?w$bHwWfa6> zwS+ugTQU&R+zi7=OU0Bkd`SS7U~#P>kFG#`<2|VOLHa4W41oZ|~ye#2%?WJAH#RTa$gDS%I)xuA$J)n!T=jv*5YQmh6 zhNrZVYwx57pu_9wpT@2GQR7V0l+8;M)`IPs`K`g=dzcB`r*15!@!*v#Ro?CkHg0-j2a=uR9M9Hx_ zYK4nHiqlYp3^(q{6Yz=AfHVFE|I7=IeU>ZpumQx;R@^q`$K?z|#;sh3?a)ESIk6*# z(ep>y+k4NO4F}2cUT&xQkXm!z@{=7O=!UgcXotW;|FYFxkSsC!0Q{kFxV9%aP!+v6Qy(3My24d~wM3 znGu{=x76qOlMtPPv^{^gytEU_WlAVwm*vV1pVt|53~K4RD+@X$H)K#%N#$Yu0z-y7 zxP(L-02ttQdX|LwP!hj|?JPqgJehMuLxo1- zfOcyQiyHj4iW_-Knq}ja`pbA%gJ>*x=;+dlXFbn00<3`XAN8>-^P!mtK_rgDnak1U{AG_0hTJn@)GT z$FY}Ot>5-T-c1VJ(YnU@O!#5f4;o&FMnl)NdG|NGSx=|0@XNNe{bSv`O%F_7SP$sq zU{5ma_p3VfcN}qjLh`+Z*55S+dih-qz+Fuu4s8%3k>U1{kU%GFpXsSF{9F6))$a%& zl_VT4#mIS$Nn=}ju>TN91`zb7!+Oe~87-`kZba*%Cb?y;HmI-&@#d@U;akV8_QDB8 z?(HY3R(d`HyTKHL)5w3`%$jC_E8D`2ximULtOj1{a>_e~+d-sMuHyv#M)r*f|0Whz`M+hi6A zJq#lx@v_0@tD33_1{w2PSYWjWtu=J^&DYi)=#;06d;q%02cV050J_Kr;M;fLc2Pg) z2h37K_Y+L#2h8^qOs34VH^D+@lIhfq8j~*wzvXT?u3txr-Xc8sn8La;|5KjU7w? z0NhUiVC`JF$K5(lrC!``u6@XHw|_Z^8P}&$FD&?q-n+hC)T@NR80QB70L;`o(=92{ zKYKe>x_^(5HM(A7{TJd{006$o62lCJ>)|2xx&Gx~T=ZZ+vt!3P*pq8n;B(aO{ZhE4 zn1mpaTM^h`gxUH{%4iFfyw=|4U(k+Py*TyhK~(={pb`2ln5iF~fm zHYEkFK9R4)Cc;+ftLAl`D|E?-*w>F-=dqFeNh|qGrZNCiX>C&_hBaaklgLMDwfiO1 zR@3!b9RBZ8Bxc6n<}L|XP;8-$D~q8>bjql zqS|<$$uR@Lecy`1SC=a1E-=Ji2%#U9liCdN(EACdFRh1h(N}62h^~{5hs^QMb@0J_Kr;15d2IOLy|r!4>g002ovPDHLkV1g7P7yJMK literal 5486 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 diff --git a/icons/stamp_icons/large_stamp-hop.png b/icons/stamp_icons/large_stamp-hop.png index 3f9aa4a76fb5af3d2b78879775b2b45143f7c890..1447d58a87563b0fc5e496a39e96e6f20254c7dd 100644 GIT binary patch delta 1226 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 diff --git a/icons/stamp_icons/large_stamp-hos.png b/icons/stamp_icons/large_stamp-hos.png index 67b69d75039b782101e17c4d4a6890a684a34940..bd595909757087d37f9152b368bc3034585b07b6 100644 GIT binary patch delta 1320 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 G;r|1Mf4CU{ diff --git a/icons/stamp_icons/large_stamp-law.png b/icons/stamp_icons/large_stamp-law.png index d6d77eee9b61eeb5df7fec5332ab99b43d8ab188..aee5aa3fbc07aecc3b8d97ee90057f1288bad170 100644 GIT binary patch delta 1156 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 diff --git a/icons/stamp_icons/large_stamp-mime.png b/icons/stamp_icons/large_stamp-mime.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a01434394db71d9d55ddf8c34e5d08c47d152b GIT binary patch literal 824 zcmV-81IPS{P)la(^Z5j0Y<|8y z0ONd2no0{ zc0MJn>w4qLNlSLl-M#l)i@~H~apjS;Uan29?2Hdk0uh(^Q(8a$J%sS!=9wdH#En`gpxwe^i+$va}Q!-=#z=bG#~QsmwRrf89w8#TL^wd9`naZsNOp(s69K63ut z8znlaUal#D(!Z64P*OiVQ?lX?mkikx#ftlt7V%o5&XOgMI9JXs&0L?o-vN`tCjcf+ z*5Y`zyg0!1*()Xg9iq;X0pxUMtRp2uB!PRkVt_KoOZ^?Mi1&V@M60oCO%_~(+M6M* zm)U(=4OR^Bp?94K-R&gTb-i(?Nk?vL0_YJKpuuvj0ZQn|5zE#ja4G6V251ulk0@?r z7{?3XnAjtW8_9~SP2iM~ju2a*GEO$?Fp(#~M4kZAyUyJ=Zj~^Ra<7zcz&#d<8{e5v z0iy23mE4uvkG=M(Mdpi(~?sL#1xlG zWB%!IE{`3i({m!E3e2^Qsuz0zsd_@%1OOmka+x0T$C(z}Cu3Gj4Pwd@N|l9`%MC=1 zHgI5VpxT&wTwG~f7LAH5Uvl9x4%)y+tKoQcz!13uoZfY-Opnj>biH5H%?gA2wFpy8^&$q<^FG0+p^6IHz-WBClNGEyB$TGnpOfT;*YTu{wi2?9yA`el+s4-s2BIjCLOb0?Eo&d0(SlRJr z99D)MFJE%8%cIKY>W^t(2r=U-Uvj~mujsSu=^>X~0>`kN0RUju?@{eRw&QD)TEBUm z>U)lm^?xl?sr{dLzP&}~d(p&r3UyLK=hNlfFG`q}XqK-|N>K5k^tEN(P1bu8AFa^o`s*TI<|)$$Eq@~Ap<;2`O65!L%2IPcX|=1HA*N#! zf`Kk z*MFiMuTnzia;!>Wwhwc@a<|_{V4pkP(QER$CjGhOHh7csSd-hXazc;G^*hJ>woCA( zfq&1G9k_+s+p9)>O?N9#ImdW$T9L<^>k|^xd3y?P`IKyW$i+PBtR-~L3l-K>9sWK! z(w@%+Ty*1jaU4-xO&43J-Weiyz!13uegQ~8 VLGVdcL^l8c002ovPDHLkV1lUmAl(1} literal 5682 zcmV-27R~92P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}000Y3NklS~na)%@y`(0Ue(2?sZ6-5Gr%k>jsnV8?w$+&s)HDXgU zF;l@X7QC?}#wCp`T6RJA?T3BO;q2}?%h?MTnf*IwT+ZdaJ@0dQ|Id4lB7`7~*$rEI z2+~4MBQ4}K(n3xnE#x$&1{skjlvXA5qX7qZ@(NBWad8*U=zH~#$^V7?EllnaF`l2! zFkdk^CsI(Bn6$cv5qS8FUS6Y?-2h^PaWP8d5=v=Rpn-X8;2H&FSrDpG!$pFFBc@rv zBE@A+O@GcaOdGjkuNbv%uJ7hV3;|;@6Gf7pn(hU=NO4(W3am{Cg)CqNE%Eu}FS8ba z5O8ThzGHEx>tge}x_lzmjoy2>eF9(#d2@~8#CMJ8FShiNd` z85Aa}$wBSc%<#t{d-5iG$(IrTeN^DVPagAV=Lp3(G;J=%!CAcIFo#}-EKS`*?8M1j z-sK2+%*D$XrR)G;5nln|7-gK|J^o8C0F`p$b<)Ka>ZfI7>Np1|1b~IiNz7ai>jXaC z*u;0V-wtdzm`6V&tl=>^A>ABeCjeJ?AAmvnEiFZI*aW~D9;2TT9Asc;9soDE0Kisy zSWGdOb?umLr`E{5R_yKVA9w}0i3dM7@sNQ_3g%1<&5a(Ec`TM?g(6ii0qt59wRF-& z06{5EYUrLZeOEO(DRVt@1skID^2wr|Z!$n1BeXC~gY@Gef0;|Z!61bGw(H`N&p8Re zX?{mOS)8MVbCO&*%09*zCWkqE$VD78NHPA*J+d##?9=2v1}P$!7MfYdKlmc0)X_s7 zJq!_~oKjA6fg&7HlcR)H^fDC2#ShbfA3-I%XrrA6_&SSOEwy|J>sd=TpOVWR1ay|b z%NT{M)FSPvMv%Tl1FxBeX!H6Z58)-iMmFQbPAh-XuD!!^1Q4vEfIfU-&;N@Ka z0F2(|j8_L;ETfQozA!7vm2KjUr z3)xbToWX2H)wKG`sncXT=y*L#LJn$S`B;pZ(ntwQd7e?O;^UxUCgu=3wY95?iP)h= zN?3rKn|OGFm!hs8U^7{)kIMe2&*{&{ihA|sN48TSP^6jHm#5ZkRK{fCAUn9uUvYCS zQLAefcm)X{OareLn%Sr$Ogx%NA2re=WmOwr_si2M?)3W^tvJC3(po

X0f2nXeofQZCmIf$7kCgp|Nrsu1t z6Ao-tvpwZ&WmUj-;BMygApJD3FekyB9j0DI|@tL5R)8PDKkW7 zP|dblr;kz1^cvq^W|47wP3uo+O#XnA3=Xj~X&-GQV1QBJ9Ivv{P*x&Vq-~4AGKr`x z)LncZfb$H71wC7+$43w+b1ikmBV)k@xT7Xfh|%hf(rP13buu^3gnjBWXH=juMGtp0RGAI)JiKFF259Kp>m~xyR4)3#sj7w@&><2ilE4$TCQ&|;=ykc3<)i8 z0^;0$lPob}JfK(Pq?{YUmB+8azc3W=F_UQo`_{vNKof^8y7W{uqp-GDomGLRyG8LvRG?bMo|h)v_b&EF>IK~Uq@U*1~8rRMcx6TAu=~6!< z2;Dy;Z79V_1*<8i00%a_jPZ`aK4B*rni(GAs9aJNo7R1XH)Z7c?4A~MywzUupnSdlCl{@*BPiAxWyz5$^ZjVTC7eEKch6UM`NH|EHN$piu6;f zSe_CQcG9Igx}%mah!#6tnX$%570+5FPH{dZ}Eb~(t}neU+lok zEX}A!!6Dz+LMPpt1{%$6!4!f(JV+`}v6M2zDK=2OFu4K+CAgP)GG<#F!}F^|}M49h5Z zlXk9(8Y(GcAjU2Qbx^9Pp^rfT?&RkYOjmJ?$>uh_c9}M5vh!0EL7Sr^Z131O@+6)6 z8JDB3bx}qSpG{cysMKKdAS;&q;tag>wB~gL*}91k+K%dEIS(2{-r1I#wOTS=4@LRo z5Rsx^hUN1VgfwF+(9i$E-ndX-jfuoscG1rWL)_AmHD~b}X4Uk9K29;7 zh{RwkCnh`ZZRV5BZT$QERO6P*DWDW5nR4N76<(P#%jJ7vKCO**0}9lS9fgDPjRvE( zskCacaFL~@9|ZyznGw{g(CAbbnVO3TAn0QIgynCepH@~%K`XR!f(>k(Y{O%V+XQUo zWlpeE*Q7~wEKu)Ks)Up1M}3ILYKCD7*v=|^?@&O$BNGxm$;4d0eX%oK~5pS{p8 zcLZng@;bGa38HOWqLq~#<<%4j*wVx{+B7i!&g(?)Cm&)bBecXcQ)x^dEWV$d+#avV z-ujY;b;S9?Tb!|58q)?hHxna6+}z}b^hxtk*v}*B(VU^!&!ebWsPkNpPgg(CMY-SR zILVX#VuHiUJ*jvm+48OQhXmRet6Xz9`4Qv!^$)ExUH})Uriek7g{@DmerRo?Z+u}n z3Xd*-vcL5;(Ff&-qc6f@eG}bleyvL59d2@&C*#v(H`jTaY+5-PwRoSn5yCKy0 Y0Mt|Vw*#DXzyJUM07*qoM6N<$f?8aYPXGV_ diff --git a/icons/stamp_icons/large_stamp-qm.png b/icons/stamp_icons/large_stamp-qm.png index ea863078b43d126a9dc5fb8cf6e2ecf33efa6478..4ba31b374152aa967b82c82cb3ddcaabf2911917 100644 GIT binary patch delta 1169 zcmV;C1aAA@GNcKRBYy;INklYG8?*uU%>Y`q~NM1ORaDkGKA^|KiFv z)IOQ=VxJOIMyO8~C09~J4h|A14nB^#^}?0mJeoA}wLjjZiWRQ`jjig!YXPW6UI40* zKLFA?h228s#D9I|X8-`&-Kps>`x^js0AQSJK=}XwUAsG-J=dJPAMJT~NpdOP6wi=; z1@n|3E$rsSzwD{42Gx$ONAY&ADIQpM5YG~r zbGkP0+(D^4R*p{@R36nHZkK9D;*|o4XLihGWNNfZqklKFyoLiO7kjcs4u|6V^ia%l zPX@hr7yvj2$m7am!$G?{odac`k(@J;k9pYg9V+YVSMfnnbYuIkqCUk0Y>wi%P5t7{dwD|a+!kgnzh_`4f(#V=X zyjX-7QCdyLf|GlHYD6wxVh3MN`1Ikk)yqxS!#Ke(PTi_KG$E^4w_dwDHG~19R$7eAx+mcxc<%IzU>nHSkq1c_%T}` zfqDc3Qm0T zV?lyrrUTPBd5@TAMLF;-j(kxvIS07rm4Dizo{T{m+d}Yi8ytuE#HMlbFtp{K`aq$? z?4@~@!ET{)lW~DNi*!5!mGr&JeGszmDX9NYY9|r6M?5NTc8ccrD?p8 zQWVuLi@DbtcAxCC6=`J6&Ab$5QWB1j=F&Jk0_R>~0VxIY)qV1tqrQY*0RYv=Z-0;I zpn;0_LG%{N#oR}VIlm=siQ>CQmtIcA@V{H`cXNp%n%QC!iLViN37%)YKgG7rBB>4&h--d%i|M`Yf)F% j3qUpU0#J>-0Q>_APb=X)E=(o>015yANkvXXu0mjfI+#YM literal 6494 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 Z24XB`AI>O-=3%=!peU;*QzvB+@jpW<7sCJm diff --git a/icons/stamp_icons/large_stamp-syndicate.png b/icons/stamp_icons/large_stamp-syndicate.png new file mode 100644 index 0000000000000000000000000000000000000000..68f17d8f5e2812d968153b66da9a4a10c25ba7f5 GIT binary patch literal 1198 zcmV;f1X25mP)56j3pw8j>v9~&Z?2vtS>nZZM*#Yl%1yHA17ID) z$0F1oE}}`2LkYG!{6h+VJHu08Dmm2$s$}1+NX~ z66zi1uDwIzh*9h0n7O+^h7>kdlRO_z_o<%yLUcZ)vaxeBgzFgKH%v_R+_y_vNz&3F z)W*JyKA2?OxwMm5T)NIRl6wHq_RX~w$vlo@wn3fJ#=#^v*K^e_VZ@ZRw`TBpv4^Nw zXo&VDET*27OT3d;56Qp?v2lBA24C_Om3T=;)}`z24uUD=dZwJi0D4d6+F_ZYx;Wby zdq@Yp#Kyj7RN>kPHX|;enLW}6rtAS3!y>!iD|yaAlxWahy6*0JH>HiA;N8}YNv3Qg zNHc{_*B}NZW2*$v+$egPH07EiP-L-;|@%Lsi*<|5%uDZ0^<_+7)Jz1JmJdNz7d_J6FZkPPXq!JSB`N&hBqC;w#`28@j zH|IpQ#4DEv=k%tnk&E!8o{W{uInT7W2Bvz>vW?nY&sB=3;=&r<~+=TS#kzX5x)Hll4Rep zmNukFpEE>rVJ_#<=EK?>8t>Xz1BV?R-cz!Uj=KIM-R;_H9b7Ib$U%B?h!<;+Yksqn zIjTRj1RG%SR<2!2T|$yC1IezKIZs|VBV`9AUhj0OBsHoX5j1411PP0Q8sbaC^!K+A>a_wBKBKvTN))Kv1|w9SzoRA5s~Jl4D5F zl*RO$8s00wAzQ;3!QtBKWbI`J=b_YdTw9;c>dW>L2uMn9(>;GNj3KVK$^c{@A9LS( zRg@2*zd52mgkJC&a9+tR_zV)eLA`7L*6HA zxSr~{H$U3;-2b7U^2iaLD4Cex*gjqDU0<4KgCsfiF`M>f-*wuc2(~@gF7wHAk*NMg zK7jwB8ebv@C`&2~Y@gI}&EK5-5I&qF7kmcxyyLYS6q0v