From 4ef4aadc642f2bf7283bb324cc9c1cc6fd43d2a6 Mon Sep 17 00:00:00 2001 From: spookerton Date: Tue, 1 Nov 2022 20:17:14 +0000 Subject: [PATCH 1/2] added the skeleton for envelopes --- code/modules/paperwork/folders.dm | 101 ++++++++++++++++++++++++++++++ icons/obj/bureaucracy.dmi | Bin 23136 -> 23638 bytes 2 files changed, 101 insertions(+) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index bb0ff85f0f..3c71bccdb5 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -7,6 +7,14 @@ pressure_resistance = 2 drop_sound = 'sound/items/drop/paper.ogg' pickup_sound = 'sound/items/pickup/paper.ogg' + var/list/obj/item/paper/initial_contents + + +/obj/item/folder/Initialize() + . = ..() + for (var/obj/item/paper/paper as anything in initial_contents) + new paper (src) + /obj/item/folder/blue desc = "A blue folder." @@ -140,3 +148,96 @@ attack_self(usr) update_icon() return + + +/obj/item/folder/envelope + abstract_type = /obj/item/folder/envelope + name = "envelope" + desc = "A thick envelope for holding documents securely." + icon_state = "envelope_sealed" + + // When true, a confirmation is shown before opening. If accepted, it becomes false. + var/sealed = TRUE + + +/obj/item/folder/envelope/update_icon() + if (sealed) + icon_state = "envelope_sealed" + else if (length(contents)) + icon_state = "envelope_full" + else + icon_state = "envelope_empty" + + +/obj/item/folder/envelope/examine(mob/user) + . = ..() + if (sealed) + . += "The seal is [SPAN_NOTICE("intact")]." + else + . += "The seal is [SPAN_WARNING("broken")]." + + +/obj/item/folder/envelope/attack_self(mob/living/user) + if (sealed) + ConfirmBreakSeal(user) + return + ..() + + +/obj/item/folder/envelope/attackby(obj/item/item, mob/living/user) + if (sealed && is_sharp(item)) + if (user.a_intent == I_HURT) + user.visible_message( + SPAN_WARNING("\The [user] slashes open \a [src] with \a [item]!"), + SPAN_ITALIC("You slash open \the [src] with \the [item]!"), + range = 5 + ) + BreakSeal() + return TRUE + ConfirmBreakSeal(user) + return TRUE + ..() + + +/obj/item/folder/envelope/proc/ConfirmBreakSeal(mob/living/user) + PROTECTED_PROC(TRUE) + if (!istype(user)) + return + if (!Adjacent(user) || user.incapacitated()) + to_chat(user, SPAN_WARNING("You're in no condition to do that.")) + return + var/response = alert(user, "Break the seal?", "[src]", "Yes", "No") + if (response != "Yes") + return + if (!Adjacent(user) || user.incapacitated()) + to_chat(user, SPAN_WARNING("You're in no condition to do that.")) + return + user.visible_message( + SPAN_WARNING("\The [user] breaks the seal on \a [src]."), + SPAN_ITALIC("You break the seal on \the [src]."), + range = 5 + ) + BreakSeal() + + +/// Forces the envelope to be open. Internal / pcall. +/obj/item/folder/envelope/proc/BreakSeal() + PROTECTED_PROC(TRUE) + sealed = FALSE + update_icon() + + +// Implement at map level. This is only an example. +/obj/item/folder/envelope/example + name = "exemplary envelope" + initial_contents = list( + /obj/item/paper/envelope_example + ) + + +/obj/item/paper/envelope_example + info = {"\ +

Hello World

\ +

I am a demonstration paper for an envelope.

\ +

Am I not cool and neat?

\ + "} diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 69a2943506fa963c18a48d47e6ef0975fc8d151b..4e9d270a5747f96efe860946dc4b45dd1565ee0b 100644 GIT binary patch literal 23638 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 Hz83jEt8%Z~ literal 23136 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 From 271d915dffcf2d2ae59bbe7d46a5f4fd75903931 Mon Sep 17 00:00:00 2001 From: spookerton Date: Wed, 2 Nov 2022 10:02:13 +0000 Subject: [PATCH 2/2] re-sealing envelopes with stamps + style tweaks Also adds item/proc/BlockInteraction. Carries out common or configurable checks for whether a given interaction should be allowed to continue; reduces boilerplate somewhat. Also refactors stamps to make this possible. Stamps are now configured with authority_name and authority_suffix rather than setting the stamp name directly. This is so that envelope seals can be sealed by a `Sol Government seal` rather than `Sol Government logo stamp seal`, or a `clown seal` rather than a `clown's rubber stamp seal`. You get the idea. Also partially refactors folders. Their attackby behavior was a sin. --- code/game/objects/items.dm | 42 +++++ code/modules/paperwork/folders.dm | 253 ++++++++++++++++++------------ code/modules/paperwork/stamps.dm | 131 ++++++++++++---- 3 files changed, 295 insertions(+), 131 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 442b27c3ab..5cae51bbb0 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -921,3 +921,45 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. /obj/item/proc/animal_consumed(var/mob/user) user.visible_message(SPAN_NOTICE("\The [user] finishes eating \the [src]."), SPAN_NOTICE("You finish eating \the [src].")) qdel(src) + + +/obj/item/proc/BlockInteraction(mob/living/user, silent, list/options) + var/static/list/default_options = list( + "type" = /mob/living, + "distance" = TRUE, + "incapacitation" = INCAPACITATION_DEFAULT, + "dexterity" = FALSE + ) + . = TRUE // A code per case is possible. For now, just TRUE if the interaction should be blocked. + if (QDELETED(user)) + return + if (!options) + options = default_options + var/test_type = options["type"] + if (test_type) + if (!istype(user, test_type)) + if (!silent) + to_chat(user, SPAN_WARNING("You're the wrong kind of mob to use \the [src].")) + return + var/test_distance = options["distance"] + if (test_distance > 0) + if (test_distance <= 1) + if (!Adjacent(user)) //Adjacency is more costly than simple distance, but common use. + if (!silent) + to_chat(user, SPAN_WARNING("You're not close enough to \the [src].")) + return + else if (get_dist(src, user) > test_distance) + if (!silent) + to_chat(user, SPAN_WARNING("You're not close enough to \the [src].")) + return + var/test_incapacitation = options["incapacitation"] + if (test_incapacitation) + if (user.incapacitated(test_incapacitation)) + if (!silent) + to_chat(user, SPAN_WARNING("You're in no condition to use \the [src].")) + return + var/test_dexterity = options["dexterity"] + if (test_dexterity) + if (!user.check_dexterity(test_dexterity, src, silent)) // Handles its own failure message. + return + return FALSE diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 3c71bccdb5..c8c6c79889 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -7,85 +7,55 @@ pressure_resistance = 2 drop_sound = 'sound/items/drop/paper.ogg' pickup_sound = 'sound/items/pickup/paper.ogg' - var/list/obj/item/paper/initial_contents + + /// The items that spawn inside this folder, if anything. + var/list/obj/item/initial_contents /obj/item/folder/Initialize() . = ..() - for (var/obj/item/paper/paper as anything in initial_contents) - new paper (src) + if (length(initial_contents)) + for (var/obj/item/item as anything in initial_contents) + new item (src) + update_icon() -/obj/item/folder/blue - desc = "A blue folder." - icon_state = "folder_blue" - -/obj/item/folder/red - desc = "A red folder." - icon_state = "folder_red" - -/obj/item/folder/yellow - desc = "A yellow folder." - icon_state = "folder_yellow" - -/obj/item/folder/white - desc = "A white folder." - icon_state = "folder_white" - -/obj/item/folder/blue_captain - desc = "A blue folder with Site Manager markings." - icon_state = "folder_captain" - -/obj/item/folder/blue_hop - desc = "A blue folder with HoP markings." - icon_state = "folder_hop" - -/obj/item/folder/white_cmo - desc = "A white folder with CMO markings." - icon_state = "folder_cmo" - -/obj/item/folder/white_rd - desc = "A white folder with RD markings." - icon_state = "folder_rd" - -/obj/item/folder/white_rd/Initialize() - . = ..() - //add some memos - var/obj/item/paper/P = new() - P.name = "Memo RE: proper analysis procedure" - P.info = "
We keep test dummies in pens here for a reason" - src.contents += P - update_icon() - -/obj/item/folder/yellow_ce - desc = "A yellow folder with CE markings." - icon_state = "folder_ce" - -/obj/item/folder/red_hos - desc = "A red folder with HoS markings." - icon_state = "folder_hos" - /obj/item/folder/update_icon() cut_overlays() - if(contents.len) + if (length(contents)) add_overlay("folder_paper") - return -/obj/item/folder/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/paper) || istype(W, /obj/item/photo) || istype(W, /obj/item/paper_bundle)) - user.drop_item() - W.loc = src - to_chat(user, "You put the [W] into \the [src].") + +/obj/item/folder/attackby(obj/item/item, mob/living/user) + . = TRUE + if (istype(item, /obj/item/paper) || istype(item, /obj/item/photo) || istype(item, /obj/item/paper_bundle)) + if (!user.unEquip(item, target = src)) + return + user.visible_message( + SPAN_ITALIC("\The [user] puts \a [item] into \a [src]."), + SPAN_ITALIC("You put \the [item] into \the [src]."), + range = 5 + ) update_icon() - else if(istype(W, /obj/item/pen)) - var/n_name = sanitizeSafe(input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text, MAX_NAME_LEN) - if((loc == usr && usr.stat == 0)) - name = "folder[(n_name ? text("- '[n_name]'") : null)]" - return + return + if (istype(item, /obj/item/pen)) + var/response = input(user, "Set new folder label:") as null | text + if (isnull(response)) + return + if (BlockInteraction(user)) + return + if (!response) + name = initial(name) + return + response = sanitizeSafe(response, MAX_NAME_LEN) + if (!response) + return + name = "folder - `[response]`" + return ..() -/obj/item/folder/attack_self(mob/user as mob) + +/obj/item/folder/attack_self(mob/living/user) var/dat = "[name]" - for(var/obj/item/paper/P in src) dat += "Remove Rename - [P.name]
" for(var/obj/item/photo/Ph in src) @@ -97,19 +67,17 @@ add_fingerprint(usr) return -/obj/item/folder/Topic(href, href_list) + +/obj/item/folder/Topic(href, list/href_list) ..() if((usr.stat || usr.restrained())) return - if(src.loc == usr) - if(href_list["remove"]) var/obj/item/P = locate(href_list["remove"]) if(P && (P.loc == src) && istype(P)) P.loc = usr.loc usr.put_in_hands(P) - else if(href_list["read"]) var/obj/item/paper/P = locate(href_list["read"]) if(P && (P.loc == src) && istype(P)) @@ -130,38 +98,92 @@ onclose(usr, "[P.name]") else if(href_list["rename"]) var/obj/item/O = locate(href_list["rename"]) - if(O && (O.loc == src)) if(istype(O, /obj/item/paper)) var/obj/item/paper/to_rename = O to_rename.rename() - else if(istype(O, /obj/item/photo)) var/obj/item/photo/to_rename = O to_rename.rename() - else if(istype(O, /obj/item/paper_bundle)) var/obj/item/paper_bundle/to_rename = O to_rename.rename() - - //Update everything attack_self(usr) update_icon() - return + + +/obj/item/folder/blue + desc = "A blue folder." + icon_state = "folder_blue" + + +/obj/item/folder/red + desc = "A red folder." + icon_state = "folder_red" + + +/obj/item/folder/yellow + desc = "A yellow folder." + icon_state = "folder_yellow" + + +/obj/item/folder/white + desc = "A white folder." + icon_state = "folder_white" + + +/obj/item/folder/blue_captain + desc = "A blue folder with Site Manager markings." + icon_state = "folder_captain" + + +/obj/item/folder/blue_hop + desc = "A blue folder with HoP markings." + icon_state = "folder_hop" + + +/obj/item/folder/white_cmo + desc = "A white folder with CMO markings." + icon_state = "folder_cmo" + + +/obj/item/folder/yellow_ce + desc = "A yellow folder with CE markings." + icon_state = "folder_ce" + + +/obj/item/folder/red_hos + desc = "A red folder with HoS markings." + icon_state = "folder_hos" + + +/obj/item/folder/white_rd + desc = "A white folder with RD markings." + icon_state = "folder_rd" + initial_contents = list( + /obj/item/paper/white_rd_folder + ) + + +/obj/item/paper/white_rd_folder + name = "Memo RE: proper analysis procedure" + info = {"\ +

We keep test dummies in pens here for a reason.

\ + "} /obj/item/folder/envelope abstract_type = /obj/item/folder/envelope name = "envelope" desc = "A thick envelope for holding documents securely." - icon_state = "envelope_sealed" + icon_state = "envelope_envelope_seal" - // When true, a confirmation is shown before opening. If accepted, it becomes false. - var/sealed = TRUE + // When falsy, the envelope can be opened. Otherwise, the seal name to show in examine. + var/envelope_seal = "original" /obj/item/folder/envelope/update_icon() - if (sealed) + if (envelope_seal) icon_state = "envelope_sealed" else if (length(contents)) icon_state = "envelope_full" @@ -171,59 +193,96 @@ /obj/item/folder/envelope/examine(mob/user) . = ..() - if (sealed) - . += "The seal is [SPAN_NOTICE("intact")]." + if (get_dist(src, user) > 3 && !isobserver(user)) + return + if (envelope_seal) + . += "It has an [SPAN_NOTICE("intact [envelope_seal] seal")]." else - . += "The seal is [SPAN_WARNING("broken")]." + . += "The seal is [SPAN_DANGER("broken")]." /obj/item/folder/envelope/attack_self(mob/living/user) - if (sealed) + if (envelope_seal) ConfirmBreakSeal(user) return ..() /obj/item/folder/envelope/attackby(obj/item/item, mob/living/user) - if (sealed && is_sharp(item)) + . = TRUE + if (envelope_seal) + if (!is_sharp(item)) + return ..() if (user.a_intent == I_HURT) user.visible_message( SPAN_WARNING("\The [user] slashes open \a [src] with \a [item]!"), SPAN_ITALIC("You slash open \the [src] with \the [item]!"), range = 5 ) - BreakSeal() - return TRUE + SetSeal(FALSE) + return ConfirmBreakSeal(user) - return TRUE - ..() + return + else if (istype(item, /obj/item/stamp)) + ConfirmCreateSeal(item, user) + return + return ..() + + +/obj/item/folder/envelope/proc/ConfirmCreateSeal(obj/item/stamp/stamp, mob/living/user) + PROTECTED_PROC(TRUE) + if (!istype(user)) + return + if (envelope_seal) + to_chat(user, SPAN_WARNING("\The [src] already has \a [envelope_seal] seal.")) + return + if (BlockInteraction(user)) + return + var/response = alert(user, "Create a new [stamp.name] seal?", "[src]", "Yes", "No") + if (response != "Yes") + return + if (BlockInteraction(user)) + return + if (envelope_seal) + to_chat(user, SPAN_WARNING("\The [src] already has \a [envelope_seal] seal.")) + return + user.visible_message( + SPAN_WARNING("\The [user] uses \a [stamp] to seal \a [src]."), + SPAN_ITALIC("You form a new seal on \the [src] with \the [stamp]."), + range = 5 + ) + SetSeal(stamp.authority_name) /obj/item/folder/envelope/proc/ConfirmBreakSeal(mob/living/user) PROTECTED_PROC(TRUE) if (!istype(user)) return - if (!Adjacent(user) || user.incapacitated()) - to_chat(user, SPAN_WARNING("You're in no condition to do that.")) + if (!envelope_seal) + to_chat(user, SPAN_WARNING("\The [src] is already open.")) + return + if (BlockInteraction(user)) return var/response = alert(user, "Break the seal?", "[src]", "Yes", "No") if (response != "Yes") return - if (!Adjacent(user) || user.incapacitated()) - to_chat(user, SPAN_WARNING("You're in no condition to do that.")) + if (BlockInteraction(user)) + return + if (!envelope_seal) + to_chat(user, SPAN_WARNING("\The [src] is already open.")) return user.visible_message( SPAN_WARNING("\The [user] breaks the seal on \a [src]."), SPAN_ITALIC("You break the seal on \the [src]."), range = 5 ) - BreakSeal() + SetSeal(FALSE) -/// Forces the envelope to be open. Internal / pcall. -/obj/item/folder/envelope/proc/BreakSeal() +/// Sets the seal name or breaks it, updating the envelope's icon. +/obj/item/folder/envelope/proc/SetSeal(value) PROTECTED_PROC(TRUE) - sealed = FALSE + envelope_seal = value update_icon() diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 538e2f915c..028fd5c980 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -15,102 +15,165 @@ drop_sound = 'sound/items/drop/device.ogg' pickup_sound = 'sound/items/pickup/device.ogg' + /// The authority this stamp represents. Used where the full object name would be inappropriate. + var/authority_name = "" + + /// Any trailing posessiveness for authority_name. + var/authority_suffix = "" + + +/obj/item/stamp/Initialize() + . = ..() + GenerateName() + + +/obj/item/stamp/proc/GenerateName() + if (!authority_name) + name = initial(name) + return + var/first_char = copytext_char(authority_name, 1, 2) + if (lowertext(first_char) != first_char) + name = "\improper [authority_name][authority_suffix] [initial(name)]" + else + name = "[authority_name][authority_suffix] [initial(name)]" + + /obj/item/stamp/captain - name = "site manager's rubber stamp" icon_state = "stamp-cap" + authority_name = "site manager" + authority_suffix = "'s" + /obj/item/stamp/hop - name = "head of personnel's rubber stamp" icon_state = "stamp-hop" + authority_name = "head of personnel" + authority_suffix = "'s" + /obj/item/stamp/hos - name = "head of security's rubber stamp" icon_state = "stamp-hos" + authority_name = "head of security" + authority_suffix = "'s" + /obj/item/stamp/ward - name = "warden's rubber stamp" icon_state = "stamp-ward" + authority_name = "warden" + authority_suffix = "'s" + /obj/item/stamp/ce - name = "chief engineer's rubber stamp" icon_state = "stamp-ce" + authority_name = "chief engineer" + authority_suffix = "'s" + /obj/item/stamp/rd - name = "research director's rubber stamp" icon_state = "stamp-rd" + authority_name = "research director" + authority_suffix = "'s" + /obj/item/stamp/cmo - name = "chief medical officer's rubber stamp" icon_state = "stamp-cmo" + authority_name = "chief medical officer" + authority_suffix = "'s" + /obj/item/stamp/denied - name = "\improper DENIED rubber stamp" icon_state = "stamp-deny" attack_verb = list("DENIED") + authority_name = "DENIED" + /obj/item/stamp/accepted - name = "\improper ACCEPTED rubber stamp" icon_state = "stamp-ok" + attack_verb = list("ACCEPTED") + authority_name = "ACCEPTED" + /obj/item/stamp/clown - name = "clown's rubber stamp" icon_state = "stamp-clown" + authority_name = "clown" + authority_suffix = "'s" + /obj/item/stamp/internalaffairs - name = "internal affairs rubber stamp" icon_state = "stamp-intaff" + authority_name = "internal affairs" + /obj/item/stamp/centcomm - name = "\improper CentCom rubber stamp" icon_state = "stamp-cent" + authority_name = "CentCom" + /obj/item/stamp/qm - name = "quartermaster's rubber stamp" icon_state = "stamp-qm" + authority_name = "quartermaster" + authority_suffix = "'s" + /obj/item/stamp/cargo - name = "cargo rubber stamp" icon_state = "stamp-cargo" + authority_name = "cargo" + /obj/item/stamp/solgov - name = "\improper Sol Government rubber stamp" icon_state = "stamp-sg" + authority_name = "Sol Government" + /obj/item/stamp/solgovlogo - name = "\improper Sol Government logo stamp" icon_state = "stamp-sol" + name = "logo stamp" + authority_name = "Sol Government" + /obj/item/stamp/einstein - name = "\improper Einstein Engines rubber stamp" icon_state = "stamp-einstein" + authority_name = "Eintstein Engines" + /obj/item/stamp/hephaestus - name = "\improper Hephaestus Industries rubber stamp" icon_state = "stamp-heph" + authority_name = "Hephaestus Industries" + /obj/item/stamp/zeng_hu - name = "\improper Zeng-Hu Pharmaceuticals rubber stamp" icon_state = "stamp-zenghu" + authority_name = "Zeng-Hu Pharmaceuticals" -// Syndicate stamp to forge documents. -/obj/item/stamp/chameleon/attack_self(mob/user as mob) - var/list/stamp_types = typesof(/obj/item/stamp) - src.type // Get all stamp types except our own - var/list/stamps = list() +/obj/item/stamp/chameleon + var/static/list/chameleon_stamps - // Generate them into a list - for(var/stamp_type in stamp_types) - var/obj/item/stamp/S = new stamp_type - stamps[capitalize(S.name)] = S - var/list/show_stamps = list("EXIT" = null) + sortList(stamps) // the list that will be shown to the user to pick from +/obj/item/stamp/chameleon/Initialize() + . = ..() + if (chameleon_stamps) + return + chameleon_stamps = list() + for (var/obj/item/stamp/stamp as anything in (typesof(/obj/item/stamp) - type)) + stamp = new stamp + chameleon_stamps[stamp.name] = list(stamp.icon_state, stamp.authority_name, stamp.authority_suffix) + chameleon_stamps = sortList(chameleon_stamps) - var/input_stamp = input(user, "Choose a stamp to disguise as.", "Choose a stamp.") in show_stamps - if(user && (src in user.contents)) // Er, how necessary is this in attack_self? +/obj/item/stamp/chameleon/attack_self(mob/living/user) + UpdateChameleon(user) - var/obj/item/stamp/chosen_stamp = stamps[capitalize(input_stamp)] - if(chosen_stamp) - name = chosen_stamp.name - icon_state = chosen_stamp.icon_state +/obj/item/stamp/chameleon/proc/UpdateChameleon(mob/living/user) + if (BlockInteraction(user)) + return + var/response = input(user, "Select a stamp to copy:") as null | anything in chameleon_stamps + if (!response || !(response in chameleon_stamps)) + return + if (BlockInteraction(user)) + return + var/list/stamp = chameleon_stamps[response] + name = response + icon_state = stamp[1] + authority_name = stamp[2] + authority_suffix = stamp[3]