From 4c171767a3abda5a1b888c003ff2d3c3a11f61e3 Mon Sep 17 00:00:00 2001 From: Segrain Date: Sun, 10 Mar 2024 20:50:36 +0400 Subject: [PATCH 01/90] Fix for answering marked tickets. (#5897) # About the pull request Followup to #5872. Should have searched through all the files instead of only one to begin withal. # Explain why it's good for the game Is fix. # Changelog :cl: admin: Actually fixed the last case of being warned against interacting with ticket already marked by you. /:cl: --- code/modules/admin/verbs/adminpm.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index fe3cf36e9a9e..76525b2cae96 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -60,7 +60,7 @@ var/message_prompt = "Message:" - if((AH?.opening_responders && length(AH.ticket_interactions) == 1 ) || ((AH?.marked_admin && AH?.marked_admin != usr.key) && length(AH.ticket_interactions) == 2)) + if((AH?.opening_responders && length(AH.ticket_interactions) == 1 ) || ((AH?.marked_admin && AH?.marked_admin != usr.ckey) && length(AH.ticket_interactions) == 2)) SEND_SOUND(src, sound('sound/machines/buzz-sigh.ogg', volume=30)) message_prompt += "\n\n**This ticket is already being responded to by: [length(AH.opening_responders) ? english_list(AH.opening_responders) : AH.marked_admin]**" From 19d20a80b220d8f39c682e4c3edf3deee9bcc722 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 10 Mar 2024 16:56:46 +0000 Subject: [PATCH 02/90] Automatic changelog for PR #5897 [ci skip] --- html/changelogs/AutoChangeLog-pr-5897.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5897.yml diff --git a/html/changelogs/AutoChangeLog-pr-5897.yml b/html/changelogs/AutoChangeLog-pr-5897.yml new file mode 100644 index 000000000000..aa2bd81e3c4c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5897.yml @@ -0,0 +1,4 @@ +author: "Segrain" +delete-after: True +changes: + - admin: "Actually fixed the last case of being warned against interacting with ticket already marked by you." \ No newline at end of file From 24a15389ab9f333115bf32fcebb1d6dccd2b88f4 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 11 Mar 2024 01:07:59 +0000 Subject: [PATCH 03/90] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5897.yml | 4 ---- html/changelogs/archive/2024-03.yml | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5897.yml diff --git a/html/changelogs/AutoChangeLog-pr-5897.yml b/html/changelogs/AutoChangeLog-pr-5897.yml deleted file mode 100644 index aa2bd81e3c4c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5897.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Segrain" -delete-after: True -changes: - - admin: "Actually fixed the last case of being warned against interacting with ticket already marked by you." \ No newline at end of file diff --git a/html/changelogs/archive/2024-03.yml b/html/changelogs/archive/2024-03.yml index b5126eb5d428..df09e0a90a35 100644 --- a/html/changelogs/archive/2024-03.yml +++ b/html/changelogs/archive/2024-03.yml @@ -117,3 +117,7 @@ - bugfix: Fix pod doors no longer updating adjacent tiles iloveloopers: - balance: ravager empower range is now 4 tiles +2024-03-11: + Segrain: + - admin: Actually fixed the last case of being warned against interacting with ticket + already marked by you. From ae6a2e864d10814cf37dd18df7528e91147cee47 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Mon, 11 Mar 2024 04:23:57 -0700 Subject: [PATCH 04/90] Fix chestrig expecting map skins (#5911) # About the pull request This PR is a follow up to #5620 setting the setting required to indicate it doesn't have map specific skins (e.g. Shiva) # Explain why it's good for the game Fixes #5910 # Testing Photographs and Procedure
Screenshots & Videos ![rig](https://github.com/cmss13-devs/cmss13/assets/76988376/412f41c3-338c-414e-a218-434ac4917ade)
# Changelog :cl: Drathek fix: Fix chestrig not displaying on maps with different skins (e.g. Shivas) /:cl: --- code/game/objects/items/storage/backpack.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index cafea5fa074b..5aeef14c536d 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -498,6 +498,7 @@ name = "\improper USCM chestrig" desc = "A chestrig used by some USCM personnel." icon_state = "chestrig" + has_gamemode_skin = FALSE GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/rto) From 111f650a3fd752f636dfb9eafba3c0d4c7790e4a Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Mon, 11 Mar 2024 11:30:45 +0000 Subject: [PATCH 05/90] Automatic changelog for PR #5911 [ci skip] --- html/changelogs/AutoChangeLog-pr-5911.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5911.yml diff --git a/html/changelogs/AutoChangeLog-pr-5911.yml b/html/changelogs/AutoChangeLog-pr-5911.yml new file mode 100644 index 000000000000..be5faf7a6811 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5911.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fix chestrig not displaying on maps with different skins (e.g. Shivas)" \ No newline at end of file From d3e5812787bbf4c31c6784e2e5b40fa3fdb8228e Mon Sep 17 00:00:00 2001 From: Segrain Date: Mon, 11 Mar 2024 15:54:04 +0400 Subject: [PATCH 06/90] Fix for empty lists of frequencies. (#5898) # About the pull request Followup to #5833. First I thought that I had simply fumbled back then by fixing things enough that breaking them actually works now and fixing it is simply a matter of making the list empty itself instead of replacing itself with a null so that trying to `|=` to it no longer would runtime. And then I discovered that somebody once had decided that the syntax to declare comms machines as universal shall be by giving them empty frequency lists. Please never do that. It is a pain to track which cases are intended to be empty because they are meant to be universal and which are intended to be empty because they will be filled via some procedure. I _think_ that I sorted them correctly, but if something will break again, more fixing will need doing. # Explain why it's good for the game Is fix. # Changelog :cl: fix: Wiping frequencies off radiotowers no longer breaks them forever. /:cl: --- code/controllers/subsystem/communications.dm | 6 ++++-- code/game/machinery/telecomms/presets.dm | 4 ++-- code/game/machinery/telecomms/telecomunications.dm | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/controllers/subsystem/communications.dm b/code/controllers/subsystem/communications.dm index b8b037c33381..c245b1012900 100644 --- a/code/controllers/subsystem/communications.dm +++ b/code/controllers/subsystem/communications.dm @@ -66,6 +66,8 @@ Frequency range: 1200 to 1600 Radiochat range: 1441 to 1489 (most devices refuse to be tune to other frequency, even during mapmaking) */ +#define UNIVERSAL_FREQ 1 + #define MIN_FREE_FREQ 1201 // ------------------------------------------------- //Misc channels @@ -327,11 +329,11 @@ SUBSYSTEM_DEF(radio) if(length(extra_zs)) target_zs += extra_zs for(var/obj/structure/machinery/telecomms/T as anything in tcomm_machines_ground) - if(!length(T.freq_listening) || (frequency in T.freq_listening)) + if((UNIVERSAL_FREQ in T.freq_listening) || (frequency in T.freq_listening)) target_zs += SSmapping.levels_by_trait(ZTRAIT_GROUND) break for(var/obj/structure/machinery/telecomms/T as anything in tcomm_machines_almayer) - if(!length(T.freq_listening) || (frequency in T.freq_listening)) + if((UNIVERSAL_FREQ in T.freq_listening) || (frequency in T.freq_listening)) target_zs += SSmapping.levels_by_trait(ZTRAIT_MARINE_MAIN_SHIP) target_zs += SSmapping.levels_by_trait(ZTRAIT_RESERVED) break diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index 7a9f5babbd7a..459eddc4a544 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -155,7 +155,7 @@ toggle_state(user) // just flip dat switch /obj/structure/machinery/telecomms/relay/preset/tower/all - freq_listening = list() + freq_listening = list(UNIVERSAL_FREQ) /obj/structure/machinery/telecomms/relay/preset/tower/faction name = "UPP telecommunications relay" @@ -268,7 +268,7 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) return var/choice = tgui_input_list(user, "What do you wish to do?", "TC-3T comms tower", list("Wipe communication frequencies", "Add your faction's frequencies")) if(choice == "Wipe communication frequencies") - freq_listening = null + freq_listening.Cut() to_chat(user, SPAN_NOTICE("You wipe the preexisting frequencies from \the [src].")) return else if(choice == "Add your faction's frequencies") diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 8b8b12dfd170..7652ac601f56 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -26,7 +26,7 @@ GLOBAL_LIST_EMPTY_TYPED(telecomms_list, /obj/structure/machinery/telecomms) var/traffic = 0 // value increases as traffic increases var/netspeed = 5 // how much traffic to lose per tick (50 gigabytes/second * netspeed) var/list/autolinkers = list() // list of text/number values to link with - var/list/freq_listening = list() // list of frequencies to tune into: if none, will listen to all + var/list/freq_listening = list(UNIVERSAL_FREQ) // list of frequencies to tune into: if universal frequency is included, will listen to all var/machinetype = 0 // just a hacky way of preventing alike machines from pairing var/delay = 10 // how many process() ticks to delay per heat var/long_range_link = 0 // Can you link it across Z levels or on the otherside of the map? (Relay & Hub) From 268eb4b73a5e0f12eb1380ee44f52068af10e1ad Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Mon, 11 Mar 2024 11:59:17 +0000 Subject: [PATCH 07/90] Automatic changelog for PR #5898 [ci skip] --- html/changelogs/AutoChangeLog-pr-5898.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5898.yml diff --git a/html/changelogs/AutoChangeLog-pr-5898.yml b/html/changelogs/AutoChangeLog-pr-5898.yml new file mode 100644 index 000000000000..6192f2e61d85 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5898.yml @@ -0,0 +1,4 @@ +author: "Segrain" +delete-after: True +changes: + - bugfix: "Wiping frequencies off radiotowers no longer breaks them forever." \ No newline at end of file From 87ea79f81ecefc5e73527f0956014f8e84bfca2a Mon Sep 17 00:00:00 2001 From: Segrain Date: Mon, 11 Mar 2024 21:20:41 +0400 Subject: [PATCH 08/90] Spare medical/engineering radios. (#5900) # About the pull request May the medical survivors rejoice. # Explain why it's good for the game Ever since somebody decided that half the shipside roles should be spawning without headsets at all, there is no way for a doctor/researcher that survives and gets to Almayer to actually get a functional radio. Time to fix that. (Also removed a thing that should have been gone long ago. You know who you are and what have you done.) # Changelog :cl: add: Requisitions' vendor now has medical radio keys in stock. add: CE and CMO can now get spare departmental headsets from their vendors to recruit survivors without having to go to Requisitions. /:cl: --------- Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- .../machinery/vending/vendor_types/crew/senior_officers.dm | 7 +++++++ code/game/machinery/vending/vendor_types/requisitions.dm | 1 + .../structures/crates_lockers/closets/secure/medical.dm | 2 -- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm index bec77560430e..a5d3cbe85b01 100644 --- a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm +++ b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm @@ -162,6 +162,9 @@ GLOBAL_LIST_INIT(cm_vending_clothing_chief_engineer, list( list("M41A Pulse Rifle MK2", 0, /obj/item/storage/box/guncase/m41a, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR), list("M240 Incinerator Unit", 0, /obj/item/storage/box/guncase/flamer, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR), + list("Spare Equipment", 0, null, null, null), + list("Technician's Headset", 15, /obj/item/device/radio/headset/almayer/mt, null, VENDOR_ITEM_REGULAR), + )) @@ -288,6 +291,10 @@ GLOBAL_LIST_INIT(cm_vending_clothing_cmo, list( list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + + list("Spare Equipment", 0, null, null, null), + list("Doctor's Headset", 15, /obj/item/device/radio/headset/almayer/doc, null, VENDOR_ITEM_REGULAR), + list("Researcher's Headset", 15, /obj/item/device/radio/headset/almayer/research, null, VENDOR_ITEM_REGULAR), )) diff --git a/code/game/machinery/vending/vendor_types/requisitions.dm b/code/game/machinery/vending/vendor_types/requisitions.dm index 1a9ec9156e20..9ce8390095e8 100644 --- a/code/game/machinery/vending/vendor_types/requisitions.dm +++ b/code/game/machinery/vending/vendor_types/requisitions.dm @@ -409,6 +409,7 @@ list("Engineering Radio Encryption Key", 5, /obj/item/device/encryptionkey/engi, VENDOR_ITEM_REGULAR), list("Intel Radio Encryption Key", 5, /obj/item/device/encryptionkey/intel, VENDOR_ITEM_REGULAR), list("JTAC Radio Encryption Key", 5, /obj/item/device/encryptionkey/jtac, VENDOR_ITEM_REGULAR), + list("Medical Radio Encryption Key", 5, /obj/item/device/encryptionkey/med, VENDOR_ITEM_REGULAR), list("Sentry Gun Network Encryption Key", 8, /obj/item/device/encryptionkey/sentry_laptop, VENDOR_ITEM_REGULAR), list("Marine Radio Headset", 5, /obj/item/device/radio/headset/almayer, VENDOR_ITEM_REGULAR), list("Supply Radio Encryption Key", 5, /obj/item/device/encryptionkey/req, VENDOR_ITEM_REGULAR), diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 8cc9b84bb023..f7518a8c6058 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -107,8 +107,6 @@ new /obj/item/storage/pouch/medical(src) new /obj/item/storage/pouch/syringe(src) new /obj/item/storage/pouch/medkit(src) - if(is_mainship_level(z)) - new /obj/item/device/radio/headset/almayer/cmo(src) return /obj/structure/closet/secure_closet/chemical name = "chemical closet" From 19e77792f7fbbf82227db92a34ed0000f09161b8 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Mon, 11 Mar 2024 17:27:24 +0000 Subject: [PATCH 09/90] Automatic changelog for PR #5900 [ci skip] --- html/changelogs/AutoChangeLog-pr-5900.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5900.yml diff --git a/html/changelogs/AutoChangeLog-pr-5900.yml b/html/changelogs/AutoChangeLog-pr-5900.yml new file mode 100644 index 000000000000..d2e2212646e2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5900.yml @@ -0,0 +1,5 @@ +author: "Segrain" +delete-after: True +changes: + - rscadd: "Requisitions' vendor now has medical radio keys in stock." + - rscadd: "CE and CMO can now get spare departmental headsets from their vendors to recruit survivors without having to go to Requisitions." \ No newline at end of file From e6aeb400b389d8fbce862d6a440c2d3bae68e6e6 Mon Sep 17 00:00:00 2001 From: ihatethisengine <115417687+ihatethisengine@users.noreply.github.com> Date: Mon, 11 Mar 2024 23:15:19 +0300 Subject: [PATCH 10/90] Dropship doors can now always be broken by queen (#5917) # About the pull request This PR is a follow up to https://github.com/cmss13-devs/cmss13/pull/5808 removing a locked check to break the doors. # Explain why it's good for the game Now regardless of currently locked or open, the queen can break the doors to prevent further door spamming.
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: ihatethisengine2 fix: Dropship door prying can now always be performed by queen even if open or not locked /:cl: --------- Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/game/machinery/doors/airlock_control.dm | 10 +++--- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/multi_tile.dm | 37 +++++++++++--------- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 57e27cc60d91..b656250dabeb 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -123,14 +123,16 @@ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK) -/obj/structure/machinery/door/airlock/open(surpress_send) +/obj/structure/machinery/door/airlock/open(forced) . = ..() - if(!surpress_send) send_status() + if(!forced) + send_status() -/obj/structure/machinery/door/airlock/close(surpress_send) +/obj/structure/machinery/door/airlock/close(forced) . = ..() - if(!surpress_send) send_status() + if(!forced) + send_status() /obj/structure/machinery/door/airlock/proc/set_frequency(new_frequency) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 021cb60769f9..27bb58397956 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -214,7 +214,7 @@ flick("door_deny", src) return -/obj/structure/machinery/door/proc/open(forced=0) +/obj/structure/machinery/door/proc/open(forced) if(!density) return TRUE if(operating || !loc) diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index 9e734a0152e7..0de099801b49 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -291,29 +291,32 @@ if(!queen_pryable) return ..() - if(!locked) - return ..() - if(xeno.action_busy) return - to_chat(xeno, SPAN_NOTICE("You try and force the doors open")) + var/direction + switch(id) + if("starboard_door") + direction = "starboard" + if("port_door") + direction = "port" + if("aft_door") + direction = "aft" + var/datum/door_controller/single/control + if(linked_dropship && linked_dropship.door_control.door_controllers[direction]) + control = linked_dropship.door_control.door_controllers[direction] + + if(control && control.status == SHUTTLE_DOOR_BROKEN) + to_chat(xeno, SPAN_NOTICE("The door is already disabled.")) + return + + to_chat(xeno, SPAN_WARNING("You try and force the doors open!")) if(do_after(xeno, 3 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) + if(control) + control.status = SHUTTLE_DOOR_BROKEN unlock(TRUE) - open(1) + open(TRUE) lock(TRUE) - var/direction - switch(id) - if("starboard_door") - direction = "starboard" - if("port_door") - direction = "port" - if("aft_door") - direction = "aft" - if(linked_dropship && linked_dropship.door_control.door_controllers[direction]) - var/datum/door_controller/single/control = linked_dropship.door_control.door_controllers[direction] - control.status = SHUTTLE_DOOR_BROKEN - /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds1 name = "\improper Alamo cargo door" From 3ff60e30705744d67d2756dfacc83a0b573d7b18 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Mon, 11 Mar 2024 20:22:44 +0000 Subject: [PATCH 11/90] Automatic changelog for PR #5917 [ci skip] --- html/changelogs/AutoChangeLog-pr-5917.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5917.yml diff --git a/html/changelogs/AutoChangeLog-pr-5917.yml b/html/changelogs/AutoChangeLog-pr-5917.yml new file mode 100644 index 000000000000..1e901448a212 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5917.yml @@ -0,0 +1,4 @@ +author: "ihatethisengine2" +delete-after: True +changes: + - bugfix: "Dropship door prying can now always be performed by queen even if open or not locked" \ No newline at end of file From f85a7bf1f41f926e0e5a6c20c6a97cdcf474f771 Mon Sep 17 00:00:00 2001 From: Katskan Date: Mon, 11 Mar 2024 16:15:37 -0400 Subject: [PATCH 12/90] Adjust Medical Skill Duration Multiplier (#5904) # About the pull request Adjusts medical skill level to be more incremental and based on proficiency and familiarity with the tools, as such Medical 4 doesn't get speed bonus out of nowhere, being preceded by Medical 3 giving a lower bonus and then Medical 4 getting a larger bonus. Also reduces the raw bonus of Medical 4 so that you no longer have the issue with defibrillators shocking before they're done charging. # Explain why it's good for the game Makes medical skill make some more sense in how it progresses, also gives a little bump to the majority of higher medical roles which have Medical 3. Because it doesn't touch Medical 2, shouldn't impact front line dynamics much if at all. # Testing Photographs and Procedure Ran on local machine for testing. # Changelog Spoke with Drathek King Of Balance prior to posting PR :cl: balance: Medical Skill 4 reduced speed buff from -75% duration to -50% duration balance: Medical Skill 3 increased speed buff from -0% duration to -25% duration /:cl: --- code/modules/mob/mob_helpers.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index ce9e16e3747e..4d64307ad631 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -482,7 +482,9 @@ GLOBAL_LIST_INIT(limb_types_by_name, list( // Medical if(SKILL_MEDICAL) if(skillcheck(src, SKILL_MEDICAL, SKILL_MEDICAL_MASTER)) - return DURATION_MULTIPLIER_TIER_3 + return DURATION_MULTIPLIER_TIER_2 + if(skillcheck(src, SKILL_MEDICAL, SKILL_MEDICAL_DOCTOR)) + return DURATION_MULTIPLIER_TIER_1 // Surgeon if(SKILL_SURGERY) if(skillcheck(src, SKILL_SURGERY, SKILL_SURGERY_EXPERT)) From f2e1761e29c3f70a767241123f6f17659082126f Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Mon, 11 Mar 2024 20:30:59 +0000 Subject: [PATCH 13/90] Automatic changelog for PR #5904 [ci skip] --- html/changelogs/AutoChangeLog-pr-5904.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5904.yml diff --git a/html/changelogs/AutoChangeLog-pr-5904.yml b/html/changelogs/AutoChangeLog-pr-5904.yml new file mode 100644 index 000000000000..2b0302639478 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5904.yml @@ -0,0 +1,5 @@ +author: "Katskan" +delete-after: True +changes: + - balance: "Medical Skill 4 reduced speed buff from -75% duration to -50% duration" + - balance: "Medical Skill 3 increased speed buff from -0% duration to -25% duration" \ No newline at end of file From 80a989c59c2ddba6c80cc30252d01209431c4dbd Mon Sep 17 00:00:00 2001 From: Staykeu <79605233+Staykeu@users.noreply.github.com> Date: Mon, 11 Mar 2024 16:38:18 -0400 Subject: [PATCH 14/90] Drop Pouch Buff (#5902) # About the pull request The intention behind this PR is to see the drop pouch used more often as a middle ground between the magazine webbing and large webbing. Adds two more small item spaces (one medium item space). The drop pouch carries either two large items (unchanged), four medium sized items, or eight small items. # Explain why it's good for the game The drop pouch is rarely ever used, mostly by smartgunners who need a few extra drums. This should change that. It brings the drop pouch up from a niche "(worse) large pouch but for your webbing slot" to a middler between the magazine webbing and large webbing, mag webbing is still better for packing mags, like it always has been, and large webbing is still better for packing medium sized items, which are most of the items a marine would be packing. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Stakeyng balance: Drop pouch has more space (2 large (unchanged), 4 medium, 8 small) /:cl: --------- Co-authored-by: private-tristan <54422837+private-tristan@users.noreply.github.com> --- code/modules/clothing/under/ties.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm index 56d819b088cb..767ff51438dd 100644 --- a/code/modules/clothing/under/ties.dm +++ b/code/modules/clothing/under/ties.dm @@ -751,7 +751,7 @@ w_class = SIZE_LARGE //Allow storage containers that's medium or below storage_slots = null max_w_class = SIZE_MEDIUM - max_storage_space = 6 //weight system like backpacks, hold enough for 2 medium (normal) size items, or 3 small items, or 6 tiny items + max_storage_space = 8 //weight system like backpacks, hold enough for 2 medium (normal) size items, or 4 small items, or 8 tiny items cant_hold = list( //Prevent inventory powergame /obj/item/storage/firstaid, /obj/item/storage/bible, From 135e111503bc30fdddb48ea8ee7d11dac10ece0f Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Mon, 11 Mar 2024 20:44:50 +0000 Subject: [PATCH 15/90] Automatic changelog for PR #5902 [ci skip] --- html/changelogs/AutoChangeLog-pr-5902.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5902.yml diff --git a/html/changelogs/AutoChangeLog-pr-5902.yml b/html/changelogs/AutoChangeLog-pr-5902.yml new file mode 100644 index 000000000000..090030cec56a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5902.yml @@ -0,0 +1,4 @@ +author: "Stakeyng" +delete-after: True +changes: + - balance: "Drop pouch has more space (2 large (unchanged), 4 medium, 8 small)" \ No newline at end of file From 02350b6a37935d7b2def5246de90327513161e3f Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Tue, 12 Mar 2024 00:48:53 +0000 Subject: [PATCH 16/90] Project ARES: Ticket Notifications (#5510) # About the pull request Adds audio notifications for certain ticket interactions, played from APOLLO consoles and WJ PDAs. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: soundadd: Added pda_ping.ogg, sourced from Paradise SS13 mailapproved.ogg add: Added notification sounds from certain APOLLO ticket interactions. add: People making an access ticket request are now notified of the status changes. /:cl: --------- Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/game/machinery/ARES/ARES_interface.dm | 54 ++++++------- .../machinery/ARES/ARES_interface_apollo.dm | 76 +++++++++++++----- code/game/machinery/ARES/apollo_pda.dm | 59 ++++++++++---- code/game/objects/items/cards_ids.dm | 2 +- sound/machines/pda_ping.ogg | Bin 0 -> 6747 bytes tgui/packages/tgui/interfaces/WorkingJoe.jsx | 22 ++++- 6 files changed, 143 insertions(+), 70 deletions(-) create mode 100644 sound/machines/pda_ping.ogg diff --git a/code/game/machinery/ARES/ARES_interface.dm b/code/game/machinery/ARES/ARES_interface.dm index cfe3fe2669bc..dd99240b2550 100644 --- a/code/game/machinery/ARES/ARES_interface.dm +++ b/code/game/machinery/ARES/ARES_interface.dm @@ -218,17 +218,17 @@ return playsound(src, "keyboard_alt", 15, 1) + var/mob/living/carbon/human/operator = ui.user switch (action) if("go_back") if(!last_menu) - return to_chat(usr, SPAN_WARNING("Error, no previous page detected.")) + return to_chat(operator, SPAN_WARNING("Error, no previous page detected.")) var/temp_holder = current_menu current_menu = last_menu last_menu = temp_holder if("login") - var/mob/living/carbon/human/operator = usr var/obj/item/card/id/idcard = operator.get_active_hand() if(istype(idcard)) authentication = get_ares_access(idcard) @@ -239,7 +239,7 @@ authentication = get_ares_access(idcard) last_login = idcard.registered_name else - to_chat(usr, SPAN_WARNING("You require an ID card to access this terminal!")) + to_chat(operator, SPAN_WARNING("You require an ID card to access this terminal!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(authentication) @@ -247,14 +247,14 @@ current_menu = "main" if("sudo") - var/new_user = tgui_input_text(usr, "Enter Sudo Username", "Sudo User", encode = FALSE) + var/new_user = tgui_input_text(operator, "Enter Sudo Username", "Sudo User", encode = FALSE) if(new_user) if(new_user == sudo_holder) last_login = sudo_holder sudo_holder = null return FALSE if(new_user == last_login) - to_chat(usr, SPAN_WARNING("Already remote logged in as this user.")) + to_chat(operator, SPAN_WARNING("Already remote logged in as this user.")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE sudo_holder = last_login @@ -370,9 +370,9 @@ datacore.records_talking -= conversation if("message_ares") - var/message = tgui_input_text(usr, "What do you wish to say to ARES?", "ARES Message", encode = FALSE) + var/message = tgui_input_text(operator, "What do you wish to say to ARES?", "ARES Message", encode = FALSE) if(message) - message_ares(message, usr, params["active_convo"]) + message_ares(message, operator, params["active_convo"]) if("read_record") var/datum/ares_record/deleted_talk/conversation = locate(params["record"]) @@ -385,36 +385,36 @@ // -- Emergency Buttons -- // if("general_quarters") if(!COOLDOWN_FINISHED(datacore, ares_quarters_cooldown)) - to_chat(usr, SPAN_WARNING("It has not been long enough since the last General Quarters call!")) + to_chat(operator, SPAN_WARNING("It has not been long enough since the last General Quarters call!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(GLOB.security_level < SEC_LEVEL_RED) set_security_level(SEC_LEVEL_RED, no_sound = TRUE, announce = FALSE) shipwide_ai_announcement("ATTENTION! GENERAL QUARTERS. ALL HANDS, MAN YOUR BATTLESTATIONS.", MAIN_AI_SYSTEM, 'sound/effects/GQfullcall.ogg') - log_game("[key_name(usr)] has called for general quarters via ARES.") - message_admins("[key_name_admin(usr)] has called for general quarters via ARES.") + log_game("[key_name(operator)] has called for general quarters via ARES.") + message_admins("[key_name_admin(operator)] has called for general quarters via ARES.") log_ares_security("General Quarters", "[last_login] has called for general quarters via ARES.") COOLDOWN_START(datacore, ares_quarters_cooldown, 10 MINUTES) . = TRUE if("evacuation_start") if(GLOB.security_level < SEC_LEVEL_RED) - to_chat(usr, SPAN_WARNING("The ship must be under red alert in order to enact evacuation procedures.")) + to_chat(operator, SPAN_WARNING("The ship must be under red alert in order to enact evacuation procedures.")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(SShijack.evac_admin_denied) - to_chat(usr, SPAN_WARNING("The USCM has placed a lock on deploying the evacuation pods.")) + to_chat(operator, SPAN_WARNING("The USCM has placed a lock on deploying the evacuation pods.")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(!SShijack.initiate_evacuation()) - to_chat(usr, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!")) + to_chat(operator, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE - log_game("[key_name(usr)] has called for an emergency evacuation via ARES.") - message_admins("[key_name_admin(usr)] has called for an emergency evacuation via ARES.") + log_game("[key_name(operator)] has called for an emergency evacuation via ARES.") + message_admins("[key_name_admin(operator)] has called for an emergency evacuation via ARES.") log_ares_security("Initiate Evacuation", "[last_login] has called for an emergency evacuation via ARES.") . = TRUE @@ -422,27 +422,27 @@ if(!SSticker.mode) return FALSE //Not a game mode? if(world.time < DISTRESS_TIME_LOCK) - to_chat(usr, SPAN_WARNING("You have been here for less than six minutes... what could you possibly have done!")) + to_chat(operator, SPAN_WARNING("You have been here for less than six minutes... what could you possibly have done!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(!COOLDOWN_FINISHED(datacore, ares_distress_cooldown)) - to_chat(usr, SPAN_WARNING("The distress launcher is cooling down!")) + to_chat(operator, SPAN_WARNING("The distress launcher is cooling down!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(GLOB.security_level == SEC_LEVEL_DELTA) - to_chat(usr, SPAN_WARNING("The ship is already undergoing self destruct procedures!")) + to_chat(operator, SPAN_WARNING("The ship is already undergoing self destruct procedures!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(GLOB.security_level < SEC_LEVEL_RED) - to_chat(usr, SPAN_WARNING("The ship must be under red alert to launch a distress beacon!")) + to_chat(operator, SPAN_WARNING("The ship must be under red alert to launch a distress beacon!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE for(var/client/admin in GLOB.admins) if((R_ADMIN|R_MOD) & admin.admin_holder.rights) playsound_client(admin,'sound/effects/sos-morse-code.ogg',10) - SSticker.mode.request_ert(usr, TRUE) - to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM High Command.")) + SSticker.mode.request_ert(operator, TRUE) + to_chat(operator, SPAN_NOTICE("A distress beacon request has been sent to USCM High Command.")) COOLDOWN_START(datacore, ares_distress_cooldown, COOLDOWN_COMM_REQUEST) return TRUE @@ -450,25 +450,25 @@ if(!SSticker.mode) return FALSE //Not a game mode? if(world.time < NUCLEAR_TIME_LOCK) - to_chat(usr, SPAN_WARNING("It is too soon to request Nuclear Ordnance!")) + to_chat(operator, SPAN_WARNING("It is too soon to request Nuclear Ordnance!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(!COOLDOWN_FINISHED(datacore, ares_nuclear_cooldown)) - to_chat(usr, SPAN_WARNING("The ordnance request frequency is garbled, wait for reset!")) + to_chat(operator, SPAN_WARNING("The ordnance request frequency is garbled, wait for reset!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(GLOB.security_level == SEC_LEVEL_DELTA || SSticker.mode.is_in_endgame) - to_chat(usr, SPAN_WARNING("The mission has failed catastrophically, what do you want a nuke for?!")) + to_chat(operator, SPAN_WARNING("The mission has failed catastrophically, what do you want a nuke for?!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE - var/reason = tgui_input_text(usr, "Please enter reason nuclear ordnance is required.", "Reason for Nuclear Ordnance") + var/reason = tgui_input_text(operator, "Please enter reason nuclear ordnance is required.", "Reason for Nuclear Ordnance") if(!reason) return FALSE for(var/client/admin in GLOB.admins) if((R_ADMIN|R_MOD) & admin.admin_holder.rights) playsound_client(admin,'sound/effects/sos-morse-code.ogg',10) - message_admins("[key_name(usr)] has requested use of Nuclear Ordnance (via ARES)! Reason: [reason] [CC_MARK(usr)] (APPROVE) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") - to_chat(usr, SPAN_NOTICE("A nuclear ordnance request has been sent to USCM High Command for the following reason: [reason]")) + message_admins("[key_name(operator)] has requested use of Nuclear Ordnance (via ARES)! Reason: [reason] [CC_MARK(operator)] (APPROVE) (DENY) [ADMIN_JMP_USER(operator)] [CC_REPLY(operator)]") + to_chat(operator, SPAN_NOTICE("A nuclear ordnance request has been sent to USCM High Command for the following reason: [reason]")) log_ares_security("Nuclear Ordnance Request", "[last_login] has sent a request for nuclear ordnance for the following reason: [reason]") if(ares_can_interface()) ai_silent_announcement("[last_login] has sent a request for nuclear ordnance to USCM High Command.", ".V") diff --git a/code/game/machinery/ARES/ARES_interface_apollo.dm b/code/game/machinery/ARES/ARES_interface_apollo.dm index 56283417ae05..c1c936676dc5 100644 --- a/code/game/machinery/ARES/ARES_interface_apollo.dm +++ b/code/game/machinery/ARES/ARES_interface_apollo.dm @@ -18,6 +18,9 @@ /// The last person to login. var/last_login + /// Notification sound + var/notify_sounds = TRUE + /obj/structure/machinery/computer/working_joe/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) if(link && !override) @@ -34,6 +37,16 @@ link_systems(override = FALSE) . = ..() +/obj/structure/machinery/computer/working_joe/proc/notify() + if(notify_sounds) + playsound(src, 'sound/machines/pda_ping.ogg', 25, 0) + +/obj/structure/machinery/computer/working_joe/proc/send_notifcation() + for(var/obj/structure/machinery/computer/working_joe/ticketer as anything in link.ticket_computers) + if(ticketer == src) + continue + ticketer.notify() + /obj/structure/machinery/computer/working_joe/proc/delink() if(link) link.ticket_computers -= src @@ -76,8 +89,9 @@ data["access_log"] = list() data["access_log"] += datacore.apollo_login_list - data["apollo_log"] = list() - data["apollo_log"] += datacore.apollo_log + data["apollo_log"] = datacore.apollo_log + + data["notify_sounds"] = notify_sounds var/list/logged_maintenance = list() for(var/datum/ares_ticket/maintenance/maint_ticket as anything in link.tickets_maintenance) @@ -142,12 +156,12 @@ return var/playsound = TRUE - var/mob/living/carbon/human/operator = usr + var/mob/living/carbon/human/operator = ui.user switch (action) if("go_back") if(!last_menu) - return to_chat(usr, SPAN_WARNING("Error, no previous page detected.")) + return to_chat(operator, SPAN_WARNING("Error, no previous page detected.")) var/temp_holder = current_menu current_menu = last_menu last_menu = temp_holder @@ -198,6 +212,9 @@ last_menu = current_menu current_menu = "maint_claim" + if("toggle_sound") + notify_sounds = !notify_sounds + if("new_report") var/priority_report = FALSE var/maint_type = tgui_input_list(operator, "What is the type of maintenance item you wish to report?", "Report Category", GLOB.maintenance_categories, 30 SECONDS) @@ -223,6 +240,8 @@ link.tickets_maintenance += maint_ticket if(priority_report) ares_apollo_talk("Priority Maintenance Report: [maint_type] - ID [maint_ticket.ticket_id]. Seek and resolve.") + else + send_notifcation() log_game("ARES: Maintenance Ticket '\ref[maint_ticket]' created by [key_name(operator)] as [last_login] with Category '[maint_type]' and Details of '[details]'.") return TRUE return FALSE @@ -235,14 +254,14 @@ var/assigned = ticket.ticket_assignee if(assigned) if(assigned == last_login) - var/prompt = tgui_alert(usr, "You already claimed this ticket! Do you wish to drop your claim?", "Unclaim ticket", list("Yes", "No")) + var/prompt = tgui_alert(operator, "You already claimed this ticket! Do you wish to drop your claim?", "Unclaim ticket", list("Yes", "No")) if(prompt != "Yes") return FALSE /// set ticket back to pending ticket.ticket_assignee = null ticket.ticket_status = TICKET_PENDING return claim - var/choice = tgui_alert(usr, "This ticket has already been claimed by [assigned]! Do you wish to override their claim?", "Claim Override", list("Yes", "No")) + var/choice = tgui_alert(operator, "This ticket has already been claimed by [assigned]! Do you wish to override their claim?", "Claim Override", list("Yes", "No")) if(choice != "Yes") claim = FALSE if(claim) @@ -255,12 +274,14 @@ if(!istype(ticket)) return FALSE if(ticket.ticket_submitter != last_login) - to_chat(usr, SPAN_WARNING("You cannot cancel a ticket that does not belong to you!")) + to_chat(operator, SPAN_WARNING("You cannot cancel a ticket that does not belong to you!")) return FALSE - to_chat(usr, SPAN_WARNING("[ticket.ticket_type] [ticket.ticket_id] has been cancelled.")) + to_chat(operator, SPAN_WARNING("[ticket.ticket_type] [ticket.ticket_id] has been cancelled.")) ticket.ticket_status = TICKET_CANCELLED if(ticket.ticket_priority) ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been cancelled.") + else + send_notifcation() return TRUE if("mark_ticket") @@ -268,9 +289,9 @@ if(!istype(ticket)) return FALSE if(ticket.ticket_assignee != last_login && ticket.ticket_assignee) //must be claimed by you or unclaimed.) - to_chat(usr, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) + to_chat(operator, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) return FALSE - var/choice = tgui_alert(usr, "What do you wish to mark the ticket as?", "Mark", list(TICKET_COMPLETED, TICKET_REJECTED), 20 SECONDS) + var/choice = tgui_alert(operator, "What do you wish to mark the ticket as?", "Mark", list(TICKET_COMPLETED, TICKET_REJECTED), 20 SECONDS) switch(choice) if(TICKET_COMPLETED) ticket.ticket_status = TICKET_COMPLETED @@ -280,7 +301,9 @@ return FALSE if(ticket.ticket_priority) ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been [choice] by [last_login].") - to_chat(usr, SPAN_NOTICE("[ticket.ticket_type] [ticket.ticket_id] marked as [choice].")) + else + send_notifcation() + to_chat(operator, SPAN_NOTICE("[ticket.ticket_type] [ticket.ticket_id] marked as [choice].")) return TRUE if("new_access") @@ -328,8 +351,6 @@ break for(var/obj/item/card/id/identification in link.active_ids) - if(!istype(identification)) - continue if(identification.registered_gid != access_ticket.user_id_num) continue @@ -353,11 +374,9 @@ if("auth_access") playsound = FALSE var/datum/ares_ticket/access/access_ticket = locate(params["ticket"]) - if(!access_ticket) + if(!istype(access_ticket)) return FALSE for(var/obj/item/card/id/identification in link.waiting_ids) - if(!istype(identification)) - continue if(identification.registered_gid != access_ticket.user_id_num) continue identification.handle_ares_access(last_login, operator) @@ -366,8 +385,6 @@ ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] was granted access by [last_login].") return TRUE for(var/obj/item/card/id/identification in link.active_ids) - if(!istype(identification)) - continue if(identification.registered_gid != access_ticket.user_id_num) continue identification.handle_ares_access(last_login, operator) @@ -382,22 +399,29 @@ if(!istype(access_ticket)) return FALSE if(access_ticket.ticket_assignee != last_login && access_ticket.ticket_assignee) //must be claimed by you or unclaimed.) - to_chat(usr, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) + to_chat(operator, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) return FALSE access_ticket.ticket_status = TICKET_REJECTED - to_chat(usr, SPAN_NOTICE("[access_ticket.ticket_type] [access_ticket.ticket_id] marked as rejected.")) + to_chat(operator, SPAN_NOTICE("[access_ticket.ticket_type] [access_ticket.ticket_id] marked as rejected.")) ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] was rejected access by [last_login].") + for(var/obj/item/card/id/identification in link.waiting_ids) + if(identification.registered_gid != access_ticket.user_id_num) + continue + var/mob/living/carbon/human/id_owner = identification.registered_ref?.resolve() + if(id_owner) + to_chat(id_owner, SPAN_WARNING("AI visitation access rejected.")) + playsound_client(id_owner?.client, 'sound/machines/pda_ping.ogg', src, 25, 0) return TRUE if(playsound) playsound(src, "keyboard_alt", 15, 1) -/obj/item/card/id/proc/handle_ares_access(logged_in, mob/user) +/obj/item/card/id/proc/handle_ares_access(logged_in = MAIN_AI_SYSTEM, mob/user) var/operator = key_name(user) var/datum/ares_link/link = GLOB.ares_link if(logged_in == MAIN_AI_SYSTEM) if(!user) - operator = "[MAIN_AI_SYSTEM] (Sensor Trip)" + operator = "[MAIN_AI_SYSTEM] (Automated)" else operator = "[user.ckey]/([MAIN_AI_SYSTEM])" if(ACCESS_MARINE_AI_TEMP in access) @@ -405,10 +429,18 @@ link.active_ids -= src modification_log += "Temporary AI access revoked by [operator]" to_chat(user, SPAN_NOTICE("Access revoked from [registered_name].")) + var/mob/living/carbon/human/id_owner = registered_ref?.resolve() + if(id_owner) + to_chat(id_owner, SPAN_WARNING("AI visitation access revoked.")) + playsound_client(id_owner?.client, 'sound/machines/pda_ping.ogg', src, 25, 0) else access += ACCESS_MARINE_AI_TEMP modification_log += "Temporary AI access granted by [operator]" to_chat(user, SPAN_NOTICE("Access granted to [registered_name].")) link.waiting_ids -= src link.active_ids += src + var/mob/living/carbon/human/id_owner = registered_ref?.resolve() + if(id_owner) + to_chat(id_owner, SPAN_HELPFUL("AI visitation access granted.")) + playsound_client(id_owner?.client, 'sound/machines/pda_ping.ogg', src, 25, 0) return TRUE diff --git a/code/game/machinery/ARES/apollo_pda.dm b/code/game/machinery/ARES/apollo_pda.dm index 8df3faf79260..69e774cf0da3 100644 --- a/code/game/machinery/ARES/apollo_pda.dm +++ b/code/game/machinery/ARES/apollo_pda.dm @@ -19,6 +19,9 @@ /// The last person to login. var/last_login + /// Notification sound + var/notify_sounds = TRUE + /obj/item/device/working_joe_pda/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) if(link && !override) @@ -35,6 +38,16 @@ link_systems(override = FALSE) . = ..() +/obj/item/device/working_joe_pda/proc/notify() + if(notify_sounds) + playsound(src, 'sound/machines/pda_ping.ogg', 25, 0) + +/obj/item/device/working_joe_pda/proc/send_notifcation() + for(var/obj/item/device/working_joe_pda/ticketer as anything in link.ticket_computers) + if(ticketer == src) + continue + ticketer.notify() + /obj/item/device/working_joe_pda/proc/delink() if(link) link.ticket_computers -= src @@ -103,6 +116,8 @@ data["apollo_log"] = list() data["apollo_log"] += datacore.apollo_log + data["notify_sounds"] = notify_sounds + var/list/logged_maintenance = list() for(var/datum/ares_ticket/maintenance/maint_ticket as anything in link.tickets_maintenance) if(!istype(maint_ticket)) @@ -164,12 +179,12 @@ return var/playsound = TRUE - var/mob/living/carbon/human/operator = usr + var/mob/living/carbon/human/operator = ui.user switch (action) if("go_back") if(!last_menu) - return to_chat(usr, SPAN_WARNING("Error, no previous page detected.")) + return to_chat(operator, SPAN_WARNING("Error, no previous page detected.")) var/temp_holder = current_menu current_menu = last_menu last_menu = temp_holder @@ -223,6 +238,9 @@ last_menu = current_menu current_menu = "maint_claim" + if("toggle_sound") + notify_sounds = !notify_sounds + if("new_report") var/priority_report = FALSE var/maint_type = tgui_input_list(operator, "What is the type of maintenance item you wish to report?", "Report Category", GLOB.maintenance_categories, 30 SECONDS) @@ -248,6 +266,8 @@ link.tickets_maintenance += maint_ticket if(priority_report) ares_apollo_talk("Priority Maintenance Report: [maint_type] - ID [maint_ticket.ticket_id]. Seek and resolve.") + else + send_notifcation() log_game("ARES: Maintenance Ticket '\ref[maint_ticket]' created by [key_name(operator)] as [last_login] with Category '[maint_type]' and Details of '[details]'.") return TRUE return FALSE @@ -260,14 +280,14 @@ var/assigned = ticket.ticket_assignee if(assigned) if(assigned == last_login) - var/prompt = tgui_alert(usr, "You already claimed this ticket! Do you wish to drop your claim?", "Unclaim ticket", list("Yes", "No")) + var/prompt = tgui_alert(operator, "You already claimed this ticket! Do you wish to drop your claim?", "Unclaim ticket", list("Yes", "No")) if(prompt != "Yes") return FALSE /// set ticket back to pending ticket.ticket_assignee = null ticket.ticket_status = TICKET_PENDING return claim - var/choice = tgui_alert(usr, "This ticket has already been claimed by [assigned]! Do you wish to override their claim?", "Claim Override", list("Yes", "No")) + var/choice = tgui_alert(operator, "This ticket has already been claimed by [assigned]! Do you wish to override their claim?", "Claim Override", list("Yes", "No")) if(choice != "Yes") claim = FALSE if(claim) @@ -280,12 +300,14 @@ if(!istype(ticket)) return FALSE if(ticket.ticket_submitter != last_login) - to_chat(usr, SPAN_WARNING("You cannot cancel a ticket that does not belong to you!")) + to_chat(operator, SPAN_WARNING("You cannot cancel a ticket that does not belong to you!")) return FALSE - to_chat(usr, SPAN_WARNING("[ticket.ticket_type] [ticket.ticket_id] has been cancelled.")) + to_chat(operator, SPAN_WARNING("[ticket.ticket_type] [ticket.ticket_id] has been cancelled.")) ticket.ticket_status = TICKET_CANCELLED if(ticket.ticket_priority) ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been cancelled.") + else + send_notifcation() return TRUE if("mark_ticket") @@ -293,9 +315,9 @@ if(!istype(ticket)) return FALSE if(ticket.ticket_assignee != last_login && ticket.ticket_assignee) //must be claimed by you or unclaimed.) - to_chat(usr, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) + to_chat(operator, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) return FALSE - var/choice = tgui_alert(usr, "What do you wish to mark the ticket as?", "Mark", list(TICKET_COMPLETED, TICKET_REJECTED), 20 SECONDS) + var/choice = tgui_alert(operator, "What do you wish to mark the ticket as?", "Mark", list(TICKET_COMPLETED, TICKET_REJECTED), 20 SECONDS) switch(choice) if(TICKET_COMPLETED) ticket.ticket_status = TICKET_COMPLETED @@ -305,7 +327,9 @@ return FALSE if(ticket.ticket_priority) ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been [choice] by [last_login].") - to_chat(usr, SPAN_NOTICE("[ticket.ticket_type] [ticket.ticket_id] marked as [choice].")) + else + send_notifcation() + to_chat(operator, SPAN_NOTICE("[ticket.ticket_type] [ticket.ticket_id] marked as [choice].")) return TRUE if("new_access") @@ -353,8 +377,6 @@ break for(var/obj/item/card/id/identification in link.active_ids) - if(!istype(identification)) - continue if(identification.registered_gid != access_ticket.user_id_num) continue @@ -381,8 +403,6 @@ if(!access_ticket) return FALSE for(var/obj/item/card/id/identification in link.waiting_ids) - if(!istype(identification)) - continue if(identification.registered_gid != access_ticket.user_id_num) continue identification.handle_ares_access(last_login, operator) @@ -391,8 +411,6 @@ ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] was granted access by [last_login].") return TRUE for(var/obj/item/card/id/identification in link.active_ids) - if(!istype(identification)) - continue if(identification.registered_gid != access_ticket.user_id_num) continue identification.handle_ares_access(last_login, operator) @@ -407,11 +425,18 @@ if(!istype(access_ticket)) return FALSE if(access_ticket.ticket_assignee != last_login && access_ticket.ticket_assignee) //must be claimed by you or unclaimed.) - to_chat(usr, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) + to_chat(operator, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) return FALSE access_ticket.ticket_status = TICKET_REJECTED - to_chat(usr, SPAN_NOTICE("[access_ticket.ticket_type] [access_ticket.ticket_id] marked as rejected.")) + to_chat(operator, SPAN_NOTICE("[access_ticket.ticket_type] [access_ticket.ticket_id] marked as rejected.")) ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] was rejected access by [last_login].") + for(var/obj/item/card/id/identification in link.waiting_ids) + if(identification.registered_gid != access_ticket.user_id_num) + continue + var/mob/living/carbon/human/id_owner = identification.registered_ref?.resolve() + if(id_owner) + to_chat(id_owner, SPAN_WARNING("AI visitation access rejected.")) + playsound_client(id_owner?.client, 'sound/machines/pda_ping.ogg', src, 25, 0) return TRUE if(playsound) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 9addf3346a39..31158d055327 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -67,7 +67,7 @@ /// The name registered_name on the card var/registered_name = "Unknown" - var/registered_ref = null + var/datum/weakref/registered_ref = null var/registered_gid = 0 flags_equip_slot = SLOT_ID diff --git a/sound/machines/pda_ping.ogg b/sound/machines/pda_ping.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2f3135bc3c2253504541b76f57b4b64c3e8fc569 GIT binary patch literal 6747 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 { const MainMenu = (props) => { const { data, act } = useBackend(); - const { logged_in, access_text, last_page, current_menu, access_level } = - data; + const { + logged_in, + access_text, + last_page, + current_menu, + access_level, + notify_sounds, + } = data; let can_request_access = 'Yes'; if (access_level > 2) { can_request_access = 'No'; } + let soundicon = 'volume-high'; + if (!notify_sounds) { + soundicon = 'volume-xmark'; + } return ( <> @@ -86,11 +96,17 @@ const MainMenu = (props) => {