From 357e4fe2dd4fd58dedddd1f75040350fc792783c Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 2 May 2024 01:09:58 +0000 Subject: [PATCH 01/50] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6094.yml | 5 --- html/changelogs/AutoChangeLog-pr-6097.yml | 5 --- html/changelogs/AutoChangeLog-pr-6148.yml | 10 ------ html/changelogs/AutoChangeLog-pr-6155.yml | 4 --- html/changelogs/AutoChangeLog-pr-6173.yml | 7 ---- html/changelogs/AutoChangeLog-pr-6174.yml | 6 ---- html/changelogs/AutoChangeLog-pr-6180.yml | 5 --- html/changelogs/AutoChangeLog-pr-6192.yml | 4 --- html/changelogs/AutoChangeLog-pr-6216.yml | 4 --- html/changelogs/archive/2024-05.yml | 39 +++++++++++++++++++++++ 10 files changed, 39 insertions(+), 50 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6094.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6097.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6148.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6155.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6173.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6174.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6180.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6192.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6216.yml create mode 100644 html/changelogs/archive/2024-05.yml diff --git a/html/changelogs/AutoChangeLog-pr-6094.yml b/html/changelogs/AutoChangeLog-pr-6094.yml deleted file mode 100644 index 24ca7af1b3c4..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6094.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "HumiliatedGoblin" -delete-after: True -changes: - - qol: "Now needs help intent to repair walls" - - qol: "Now needs disarm, grab and harm intent to deconstruct walls" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6097.yml b/html/changelogs/AutoChangeLog-pr-6097.yml deleted file mode 100644 index e69ab191fbaf..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6097.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "cuberound" -delete-after: True -changes: - - balance: "FM sound is 4 seconds before CAS open fire from 5" - - balance: "FM direction warning is 1 seconds before CAS open fire from 1.5" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6148.yml b/html/changelogs/AutoChangeLog-pr-6148.yml deleted file mode 100644 index 2a96e934c820..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6148.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - balance: "Lurker invisibility recharge time is now 20s (up from 15s)" - - balance: "Lurker invisibility now ends when devouring but refunds 50% of time unused" - - balance: "Lurker invisibility bump now refunds 50% of time unused" - - balance: "Lurker invisibility can now be toggled refunding 90% of time unused (with dbl click prevention)" - - rscdel: "Removed defender crest toggle balloon alerts" - - bugfix: "Lurker invisibility code is refactored to properly use cooldowns and now doesn't incorrectly get interrupted by bump code" - - rscadd: "Lurker invisibility recharge time is now displayed in status tab" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6155.yml b/html/changelogs/AutoChangeLog-pr-6155.yml deleted file mode 100644 index fddb8491f6d2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6155.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ihatethisengine" -delete-after: True -changes: - - rscadd: "Corrupted Queen can set up personal alliances with humans" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6173.yml b/html/changelogs/AutoChangeLog-pr-6173.yml deleted file mode 100644 index bec3e4ad190e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6173.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - rscadd: "Changed the AI Core Lockdown to the same system as Research Lockdown." - - rscadd: "Added a subtype of desk bell for the AI Core reception desk that sends an alert over APOLLO Link." - - imageadd: "Added directional blast door sprites from Thwomper for blended black shutters." - - code_imp: "Renamed operator var in apollo console code to user." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6174.yml b/html/changelogs/AutoChangeLog-pr-6174.yml deleted file mode 100644 index 7a74a1bd6317..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6174.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Huffie56" -delete-after: True -changes: - - maptweak: "Officer cafeteria added back missing emergency shutters and move the pipes from bellow the windows." - - maptweak: "Starboard aft hull removed the two walls." - - maptweak: "Upper engi area around lobby remove pipping going bellow window also rework the area to better fit aestetic of almayer." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6180.yml b/html/changelogs/AutoChangeLog-pr-6180.yml deleted file mode 100644 index f021d04f9f40..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6180.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - maptweak: "Added medlinks to WO" - - maptweak: "Added a medlink to each ground map" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6192.yml b/html/changelogs/AutoChangeLog-pr-6192.yml deleted file mode 100644 index 4e3fc164c00b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6192.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Git-Nivrak" -delete-after: True -changes: - - rscadd: "Survivors can now receive command announcements with IFF and a marine headset." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6216.yml b/html/changelogs/AutoChangeLog-pr-6216.yml deleted file mode 100644 index ba3a89952a9b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6216.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Huffie56" -delete-after: True -changes: - - maptweak: "some apc are a bit moved around to avoid them having a small light on them." \ No newline at end of file diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml new file mode 100644 index 000000000000..74b346b71d1e --- /dev/null +++ b/html/changelogs/archive/2024-05.yml @@ -0,0 +1,39 @@ +2024-05-02: + Drathek: + - balance: Lurker invisibility recharge time is now 20s (up from 15s) + - balance: Lurker invisibility now ends when devouring but refunds 50% of time unused + - balance: Lurker invisibility bump now refunds 50% of time unused + - balance: Lurker invisibility can now be toggled refunding 90% of time unused (with + dbl click prevention) + - rscdel: Removed defender crest toggle balloon alerts + - bugfix: Lurker invisibility code is refactored to properly use cooldowns and now + doesn't incorrectly get interrupted by bump code + - rscadd: Lurker invisibility recharge time is now displayed in status tab + - maptweak: Added medlinks to WO + - maptweak: Added a medlink to each ground map + Git-Nivrak: + - rscadd: Survivors can now receive command announcements with IFF and a marine + headset. + Huffie56: + - maptweak: Officer cafeteria added back missing emergency shutters and move the + pipes from bellow the windows. + - maptweak: Starboard aft hull removed the two walls. + - maptweak: Upper engi area around lobby remove pipping going bellow window also + rework the area to better fit aestetic of almayer. + - maptweak: some apc are a bit moved around to avoid them having a small light on + them. + HumiliatedGoblin: + - qol: Now needs help intent to repair walls + - qol: Now needs disarm, grab and harm intent to deconstruct walls + cuberound: + - balance: FM sound is 4 seconds before CAS open fire from 5 + - balance: FM direction warning is 1 seconds before CAS open fire from 1.5 + ihatethisengine: + - rscadd: Corrupted Queen can set up personal alliances with humans + realforest2001: + - rscadd: Changed the AI Core Lockdown to the same system as Research Lockdown. + - rscadd: Added a subtype of desk bell for the AI Core reception desk that sends + an alert over APOLLO Link. + - imageadd: Added directional blast door sprites from Thwomper for blended black + shutters. + - code_imp: Renamed operator var in apollo console code to user. From d8d463c17f38a9c56a0c6a2ce1ecab514c0c26b9 Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Thu, 2 May 2024 02:50:00 +0100 Subject: [PATCH 02/50] Project ARES: Announcement Signatures (#6030) # About the pull request ARES now logs who sent an announcement and not just the contents of it. # Explain why it's good for the game Makes the available information a little more useful. It's all well and good recording what was said, but a little pointless if not including who said it. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Added the name of an announcement sender, if one exists, to ARES logs. /:cl: --- code/defines/procs/announcement.dm | 14 ++-- code/game/machinery/ARES/ARES_interface.dm | 8 +- .../machinery/ARES/ARES_interface_admin.dm | 2 +- .../machinery/ARES/ARES_interface_apollo.dm | 2 +- code/game/machinery/ARES/ARES_procs.dm | 14 +++- code/game/machinery/ARES/apollo_pda.dm | 2 +- code/game/machinery/aicore_lockdown.dm | 11 +-- code/game/machinery/biohazard_lockdown.dm | 11 +-- .../machinery/computer/almayer_control.dm | 81 ++++++++++--------- .../game/machinery/computer/communications.dm | 4 +- code/game/objects/items/devices/cictablet.dm | 46 +++++------ 11 files changed, 102 insertions(+), 93 deletions(-) diff --git a/code/defines/procs/announcement.dm b/code/defines/procs/announcement.dm index d6251748f3a0..bad07104db22 100644 --- a/code/defines/procs/announcement.dm +++ b/code/defines/procs/announcement.dm @@ -52,9 +52,9 @@ switch(logging) if(ARES_LOG_MAIN) - log_ares_announcement(title, message) + log_ares_announcement(title, message, signature) if(ARES_LOG_SECURITY) - log_ares_security(title, message) + log_ares_security(title, message, signature) else if(faction_to_display == "Everyone (-Yautja)") for(var/mob/M in targets) @@ -103,9 +103,9 @@ switch(logging) if(ARES_LOG_MAIN) - log_ares_announcement("[MAIN_AI_SYSTEM] Comms Update", message) + log_ares_announcement("Comms Update", message, MAIN_AI_SYSTEM) if(ARES_LOG_SECURITY) - log_ares_security("[MAIN_AI_SYSTEM] Security Update", message) + log_ares_security("Security Update", message, MAIN_AI_SYSTEM) /proc/ai_silent_announcement(message, channel_prefix, bypass_cooldown = FALSE) if(!message) @@ -138,9 +138,9 @@ message += "

Signed by,
[signature]
" switch(ares_logging) if(ARES_LOG_MAIN) - log_ares_announcement(title, message) + log_ares_announcement(title, message, signature) if(ARES_LOG_SECURITY) - log_ares_security(title, message) + log_ares_security(title, message, signature) announcement_helper(message, title, targets, sound_to_play) @@ -153,7 +153,7 @@ if(!ishuman(T) || isyautja(T) || !is_mainship_level((get_turf(T))?.z)) targets.Remove(T) - log_ares_announcement("[title] Shipwide Update", message) + log_ares_announcement("Shipwide Update", message, title) announcement_helper(message, title, targets, sound_to_play) diff --git a/code/game/machinery/ARES/ARES_interface.dm b/code/game/machinery/ARES/ARES_interface.dm index 6905c47febb8..04547d079664 100644 --- a/code/game/machinery/ARES/ARES_interface.dm +++ b/code/game/machinery/ARES/ARES_interface.dm @@ -420,7 +420,7 @@ shipwide_ai_announcement("ATTENTION! GENERAL QUARTERS. ALL HANDS, MAN YOUR BATTLESTATIONS.", MAIN_AI_SYSTEM, 'sound/effects/GQfullcall.ogg') log_game("[key_name(user)] has called for general quarters via ARES.") message_admins("[key_name_admin(user)] has called for general quarters via ARES.") - log_ares_security("General Quarters", "[last_login] has called for general quarters via ARES.") + log_ares_security("General Quarters", "Called for general quarters via ARES.", last_login) COOLDOWN_START(datacore, ares_quarters_cooldown, 10 MINUTES) . = TRUE @@ -442,7 +442,7 @@ log_game("[key_name(user)] has called for an emergency evacuation via ARES.") message_admins("[key_name_admin(user)] has called for an emergency evacuation via ARES.") - log_ares_security("Initiate Evacuation", "[last_login] has called for an emergency evacuation via ARES.") + log_ares_security("Initiate Evacuation", "Called for an emergency evacuation via ARES.", last_login) . = TRUE if("distress") @@ -496,7 +496,7 @@ playsound_client(admin,'sound/effects/sos-morse-code.ogg',10) message_admins("[key_name(user)] has requested use of Nuclear Ordnance (via ARES)! Reason: [reason] [CC_MARK(user)] (APPROVE) (DENY) [ADMIN_JMP_USER(user)] [CC_REPLY(user)]") to_chat(user, 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]") + log_ares_security("Nuclear Ordnance Request", "Sent a request for nuclear ordnance for the following reason: [reason]", last_login) if(ares_can_interface()) ai_silent_announcement("[last_login] has sent a request for nuclear ordnance to USCM High Command.", ".V") ai_silent_announcement("Reason given: [reason].", ".V") @@ -518,7 +518,7 @@ playsound(src, 'sound/machines/chime.ogg', 15, 1) COOLDOWN_START(sec_vent, vent_trigger_cooldown, COOLDOWN_ARES_VENT) ares_apollo_talk("Nerve Gas release imminent from [sec_vent.vent_tag].") - log_ares_security("Nerve Gas Release", "[last_login] released Nerve Gas from Vent '[sec_vent.vent_tag]'.") + log_ares_security("Nerve Gas Release", "Released Nerve Gas from Vent '[sec_vent.vent_tag]'.", last_login) sec_vent.create_gas(VENT_GAS_CN20_XENO, 6, 5 SECONDS) log_admin("[key_name(user)] released nerve gas from Vent '[sec_vent.vent_tag]' via ARES.") diff --git a/code/game/machinery/ARES/ARES_interface_admin.dm b/code/game/machinery/ARES/ARES_interface_admin.dm index 586b01a51af9..758ba9fbb5e7 100644 --- a/code/game/machinery/ARES/ARES_interface_admin.dm +++ b/code/game/machinery/ARES/ARES_interface_admin.dm @@ -511,6 +511,6 @@ playsound(src, 'sound/machines/chime.ogg', 15, 1) COOLDOWN_START(sec_vent, vent_trigger_cooldown, COOLDOWN_ARES_VENT) ares_apollo_talk("Nerve Gas release imminent from [sec_vent.vent_tag].") - log_ares_security("Nerve Gas Release", "[MAIN_AI_SYSTEM] released Nerve Gas from Vent '[sec_vent.vent_tag]'.") + log_ares_security("Nerve Gas Release", "Released Nerve Gas from Vent '[sec_vent.vent_tag]'.", MAIN_AI_SYSTEM) sec_vent.create_gas(VENT_GAS_CN20_XENO, 6, 5 SECONDS) log_admin("[key_name(user)] released nerve gas from Vent '[sec_vent.vent_tag]' via ARES.") diff --git a/code/game/machinery/ARES/ARES_interface_apollo.dm b/code/game/machinery/ARES/ARES_interface_apollo.dm index 37b2fbda0ecb..243ecdf1355f 100644 --- a/code/game/machinery/ARES/ARES_interface_apollo.dm +++ b/code/game/machinery/ARES/ARES_interface_apollo.dm @@ -433,7 +433,7 @@ playsound(src, 'sound/machines/chime.ogg', 15, 1) COOLDOWN_START(sec_vent, vent_trigger_cooldown, COOLDOWN_ARES_VENT) ares_apollo_talk("Nerve Gas release imminent from [sec_vent.vent_tag].") - log_ares_security("Nerve Gas Release", "[last_login] released Nerve Gas from Vent '[sec_vent.vent_tag]'.") + log_ares_security("Nerve Gas Release", "Released Nerve Gas from Vent '[sec_vent.vent_tag]'.", last_login) sec_vent.create_gas(VENT_GAS_CN20_XENO, 6, 5 SECONDS) log_admin("[key_name(user)] released nerve gas from Vent '[sec_vent.vent_tag]' via ARES.") diff --git a/code/game/machinery/ARES/ARES_procs.dm b/code/game/machinery/ARES/ARES_procs.dm index 8ecb711e9fb7..ef1b836a3d4b 100644 --- a/code/game/machinery/ARES/ARES_procs.dm +++ b/code/game/machinery/ARES/ARES_procs.dm @@ -175,11 +175,14 @@ GLOBAL_LIST_INIT(maintenance_categories, list( var/datum/ares_datacore/datacore = GLOB.ares_datacore datacore.records_bombardment.Add(new /datum/ares_record/bombardment(ob_name, message, user_name)) -/proc/log_ares_announcement(title, message) +/proc/log_ares_announcement(title, message, signature) if(!ares_can_log()) return FALSE + var/final_msg = message + if(signature) + final_msg = "[signature]: - [final_msg]" var/datum/ares_datacore/datacore = GLOB.ares_datacore - datacore.records_announcement.Add(new /datum/ares_record/announcement(title, message)) + datacore.records_announcement.Add(new /datum/ares_record/announcement(title, final_msg)) /proc/log_ares_requisition(source, details, user_name) if(!ares_can_log()) @@ -187,11 +190,14 @@ GLOBAL_LIST_INIT(maintenance_categories, list( var/datum/ares_datacore/datacore = GLOB.ares_datacore datacore.records_asrs.Add(new /datum/ares_record/requisition_log(source, details, user_name)) -/proc/log_ares_security(title, details) +/proc/log_ares_security(title, details, signature) if(!ares_can_log()) return FALSE + var/final_msg = details + if(signature) + final_msg = "[signature]: - [final_msg]" var/datum/ares_datacore/datacore = GLOB.ares_datacore - datacore.records_security.Add(new /datum/ares_record/security(title, details)) + datacore.records_security.Add(new /datum/ares_record/security(title, final_msg)) /proc/log_ares_antiair(details) if(!ares_can_log()) diff --git a/code/game/machinery/ARES/apollo_pda.dm b/code/game/machinery/ARES/apollo_pda.dm index 2f18a5ba0522..787b194ffb44 100644 --- a/code/game/machinery/ARES/apollo_pda.dm +++ b/code/game/machinery/ARES/apollo_pda.dm @@ -459,7 +459,7 @@ playsound(src, 'sound/machines/chime.ogg', 15, 1) COOLDOWN_START(sec_vent, vent_trigger_cooldown, COOLDOWN_ARES_VENT) ares_apollo_talk("Nerve Gas release imminent from [sec_vent.vent_tag].") - log_ares_security("Nerve Gas Release", "[last_login] released Nerve Gas from Vent '[sec_vent.vent_tag]'.") + log_ares_security("Nerve Gas Release", "Released Nerve Gas from Vent '[sec_vent.vent_tag]'.", last_login) sec_vent.create_gas(VENT_GAS_CN20_XENO, 6, 5 SECONDS) log_admin("[key_name(user)] released nerve gas from Vent '[sec_vent.vent_tag]' via ARES.") diff --git a/code/game/machinery/aicore_lockdown.dm b/code/game/machinery/aicore_lockdown.dm index aaedf0fbfd63..8120e98977dc 100644 --- a/code/game/machinery/aicore_lockdown.dm +++ b/code/game/machinery/aicore_lockdown.dm @@ -84,22 +84,23 @@ return PROC_BLOCKED var/log = "[key_name(user)] triggered AI core lockdown!" - var/ares_log = "[user.name] triggered triggered AI Core Emergency Lockdown." + var/ares_log = "Triggered triggered AI Core Emergency Lockdown." + var/person = user.name if(message) log = "[key_name(user)] triggered AI core emergency lockdown! (Using a custom announcement)." if(admin) log += " (Admin Triggered)." - ares_log = "[MAIN_AI_SYSTEM] triggered AI Core Emergency Lockdown." + person = MAIN_AI_SYSTEM if(GLOB.ares_datacore.ai_lockdown_active) GLOB.ares_datacore.ai_lockdown_active = FALSE if(!message) message = "ATTENTION! \n\nAI CORE EMERGENCY LOCKDOWN LIFTED." log = "[key_name(user)] lifted AI core lockdown!" - ares_log = "[user.name] lifted AI Core Emergency Lockdown." + ares_log = "Lifted AI Core Emergency Lockdown." if(admin) log += " (Admin Triggered)." - ares_log = "[MAIN_AI_SYSTEM] lifted AI Core Emergency Lockdown." + person = MAIN_AI_SYSTEM if(GLOB.security_level > SEC_LEVEL_GREEN) set_security_level(SEC_LEVEL_BLUE, TRUE, FALSE) @@ -115,4 +116,4 @@ COOLDOWN_START(GLOB.ares_datacore, aicore_lockdown, 2 MINUTES) shipwide_ai_announcement(message, MAIN_AI_SYSTEM, 'sound/effects/biohazard.ogg') message_admins(log) - log_ares_security("AI Core Lockdown", ares_log) + log_ares_security("AI Core Lockdown", ares_log, person) diff --git a/code/game/machinery/biohazard_lockdown.dm b/code/game/machinery/biohazard_lockdown.dm index fdf7c026185d..bb2674ccca6f 100644 --- a/code/game/machinery/biohazard_lockdown.dm +++ b/code/game/machinery/biohazard_lockdown.dm @@ -74,14 +74,15 @@ GLOBAL_VAR_INIT(med_lockdown_state, LOCKDOWN_READY) return PROC_BLOCKED var/log = "[key_name(user)] triggered research bio lockdown!" - var/ares_log = "[user.name] triggered Medical Research Biohazard Containment Lockdown." + var/ares_log = "Triggered Medical Research Biohazard Containment Lockdown." + var/person = user.name if(!message) message = "ATTENTION! \n\nBIOHAZARD CONTAINMENT BREACH. \n\nRESEARCH DEPARTMENT UNDER LOCKDOWN." else log = "[key_name(user)] triggered research bio lockdown! (Using a custom announcement)." if(admin) log += " (Admin Triggered)." - ares_log = "[MAIN_AI_SYSTEM] triggered Medical Research Biohazard Containment Lockdown." + person = MAIN_AI_SYSTEM switch(GLOB.med_lockdown_state) if(LOCKDOWN_READY) @@ -93,10 +94,10 @@ GLOBAL_VAR_INIT(med_lockdown_state, LOCKDOWN_READY) GLOB.med_lockdown_state = LOCKDOWN_READY message = "ATTENTION! \n\nBIOHAZARD CONTAINMENT LOCKDOWN LIFTED." log = "[key_name(user)] lifted research bio lockdown!" - ares_log = "[user.name] lifted Medical Research Biohazard Containment Lockdown." + ares_log = "Lifted Medical Research Biohazard Containment Lockdown." if(admin) log += " (Admin Triggered)." - ares_log = "[MAIN_AI_SYSTEM] lifted Medical Research Biohazard Containment Lockdown." + person = MAIN_AI_SYSTEM if(GLOB.security_level > SEC_LEVEL_GREEN) set_security_level(SEC_LEVEL_BLUE, TRUE, FALSE) @@ -104,7 +105,7 @@ GLOBAL_VAR_INIT(med_lockdown_state, LOCKDOWN_READY) shipwide_ai_announcement(message, MAIN_AI_SYSTEM, 'sound/effects/biohazard.ogg') message_admins(log) - log_ares_security("Containment Lockdown", ares_log) + log_ares_security("Containment Lockdown", ares_log, person) #undef LOCKDOWN_READY #undef LOCKDOWN_ACTIVE diff --git a/code/game/machinery/computer/almayer_control.dm b/code/game/machinery/computer/almayer_control.dm index 1f3338e15bf7..0090a6673961 100644 --- a/code/game/machinery/computer/almayer_control.dm +++ b/code/game/machinery/computer/almayer_control.dm @@ -108,33 +108,34 @@ . = ..() if(.) return + var/mob/user = ui.user switch(action) if("award") - open_medal_panel(usr, src) + open_medal_panel(user, src) . = TRUE // evac stuff start \\ 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(user, SPAN_WARNING("The ship must be under red alert in order to enact evacuation procedures.")) 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(user, SPAN_WARNING("The USCM has placed a lock on deploying the evacuation pods.")) return FALSE if(!SShijack.initiate_evacuation()) - to_chat(usr, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!")) + to_chat(user, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!")) return FALSE - log_game("[key_name(usr)] has called for an emergency evacuation.") - message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") - log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") + log_game("[key_name(user)] has called for an emergency evacuation.") + message_admins("[key_name_admin(user)] has called for an emergency evacuation.") + log_ares_security("Initiate Evacuation", "Called for an emergency evacuation.", user) . = TRUE if("evacuation_cancel") - var/mob/living/carbon/human/human_user = usr + var/mob/living/carbon/human/human_user = user var/obj/item/card/id/idcard = human_user.get_active_hand() var/bio_fail = FALSE if(!istype(idcard)) @@ -148,12 +149,12 @@ return FALSE if(!SShijack.cancel_evacuation()) - to_chat(usr, SPAN_WARNING("You are unable to cancel the evacuation right now!")) + to_chat(user, SPAN_WARNING("You are unable to cancel the evacuation right now!")) return FALSE - log_game("[key_name(usr)] has canceled the emergency evacuation.") - message_admins("[key_name_admin(usr)] has canceled the emergency evacuation.") - log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") + log_game("[key_name(user)] has canceled the emergency evacuation.") + message_admins("[key_name_admin(user)] has canceled the emergency evacuation.") + log_ares_security("Cancel Evacuation", "Cancelled the emergency evacuation.", user) . = TRUE // evac stuff end \\ @@ -168,32 +169,32 @@ if(SEC_LEVEL_DELTA) return - var/level_selected = tgui_input_list(usr, "What alert would you like to set it as?", "Alert Level", alert_list) + var/level_selected = tgui_input_list(user, "What alert would you like to set it as?", "Alert Level", alert_list) if(!level_selected) return set_security_level(seclevel2num(level_selected), log = ARES_LOG_NONE) - log_game("[key_name(usr)] has changed the security level to [get_security_level()].") - message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") - log_ares_security("Manual Security Update", "[usr] has changed the security level to [get_security_level()].") + log_game("[key_name(user)] has changed the security level to [get_security_level()].") + message_admins("[key_name_admin(user)] has changed the security level to [get_security_level()].") + log_ares_security("Manual Security Update", "Changed the security level to [get_security_level()].", user) . = TRUE if("messageUSCM") if(!COOLDOWN_FINISHED(src, cooldown_central)) - to_chat(usr, SPAN_WARNING("Arrays are re-cycling. Please stand by.")) + to_chat(user, SPAN_WARNING("Arrays are re-cycling. Please stand by.")) return FALSE - var/input = stripped_input(usr, "Please choose a message to transmit to USCM. Please be aware that this process is very expensive, and abuse will lead to termination. Transmission does not guarantee a response. There is a small delay before you may send another message. Be clear and concise.", "To abort, send an empty message.", "") - if(!input || !(usr in view(1,src)) || !COOLDOWN_FINISHED(src, cooldown_central)) + var/input = stripped_input(user, "Please choose a message to transmit to USCM. Please be aware that this process is very expensive, and abuse will lead to termination. Transmission does not guarantee a response. There is a small delay before you may send another message. Be clear and concise.", "To abort, send an empty message.", "") + if(!input || !(user in view(1,src)) || !COOLDOWN_FINISHED(src, cooldown_central)) return FALSE - high_command_announce(input, usr) - to_chat(usr, SPAN_NOTICE("Message transmitted.")) - log_announcement("[key_name(usr)] has made an USCM announcement: [input]") + high_command_announce(input, user) + to_chat(user, SPAN_NOTICE("Message transmitted.")) + log_announcement("[key_name(user)] has made an USCM announcement: [input]") COOLDOWN_START(src, cooldown_central, COOLDOWN_COMM_CENTRAL) . = TRUE if("ship_announce") - var/mob/living/carbon/human/human_user = usr + var/mob/living/carbon/human/human_user = user var/obj/item/card/id/idcard = human_user.get_active_hand() var/bio_fail = FALSE if(!istype(idcard)) @@ -207,10 +208,10 @@ return FALSE if(!COOLDOWN_FINISHED(src, cooldown_message)) - to_chat(usr, SPAN_WARNING("Please allow at least [COOLDOWN_TIMELEFT(src, cooldown_message)/10] second\s to pass between announcements.")) + to_chat(user, SPAN_WARNING("Please allow at least [COOLDOWN_TIMELEFT(src, cooldown_message)/10] second\s to pass between announcements.")) return FALSE - var/input = stripped_multiline_input(usr, "Please write a message to announce to the station crew.", "Priority Announcement", "") - if(!input || !COOLDOWN_FINISHED(src, cooldown_message) || !(usr in view(1,src))) + var/input = stripped_multiline_input(user, "Please write a message to announce to the station crew.", "Priority Announcement", "") + if(!input || !COOLDOWN_FINISHED(src, cooldown_message) || !(user in view(1,src))) return FALSE var/signed = null @@ -219,35 +220,35 @@ COOLDOWN_START(src, cooldown_message, COOLDOWN_COMM_MESSAGE) shipwide_ai_announcement(input, COMMAND_SHIP_ANNOUNCE, signature = signed) - message_admins("[key_name(usr)] has made a shipwide annoucement.") - log_announcement("[key_name(usr)] has announced the following to the ship: [input]") + message_admins("[key_name(user)] has made a shipwide annoucement.") + log_announcement("[key_name(user)] has announced the following to the ship: [input]") . = TRUE if("distress") if(world.time < DISTRESS_TIME_LOCK) - to_chat(usr, SPAN_WARNING("The distress beacon cannot be launched this early in the operation. Please wait another [time_left_until(DISTRESS_TIME_LOCK, world.time, 1 MINUTES)] minutes before trying again.")) + to_chat(user, SPAN_WARNING("The distress beacon cannot be launched this early in the operation. Please wait another [time_left_until(DISTRESS_TIME_LOCK, world.time, 1 MINUTES)] minutes before trying again.")) return FALSE if(!SSticker.mode) return FALSE //Not a game mode? if(SSticker.mode.force_end_at == 0) - to_chat(usr, SPAN_WARNING("ARES has denied your request for operational security reasons.")) + to_chat(user, SPAN_WARNING("ARES has denied your request for operational security reasons.")) return FALSE if(!COOLDOWN_FINISHED(src, cooldown_request)) - to_chat(usr, SPAN_WARNING("The distress beacon has recently broadcast a message. Please wait.")) + to_chat(user, SPAN_WARNING("The distress beacon has recently broadcast a message. Please wait.")) return FALSE if(GLOB.security_level == SEC_LEVEL_DELTA) - to_chat(usr, SPAN_WARNING("The ship is already undergoing self-destruct procedures!")) + to_chat(user, SPAN_WARNING("The ship is already undergoing self-destruct procedures!")) return FALSE for(var/client/admin_client as anything in GLOB.admins) if((R_ADMIN|R_MOD) & admin_client.admin_holder.rights) admin_client << 'sound/effects/sos-morse-code.ogg' - SSticker.mode.request_ert(usr) - to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM Central Command.")) + SSticker.mode.request_ert(user) + to_chat(user, SPAN_NOTICE("A distress beacon request has been sent to USCM Central Command.")) COOLDOWN_START(src, cooldown_request, COOLDOWN_COMM_REQUEST) . = TRUE @@ -256,29 +257,29 @@ if("destroy") if(world.time < DISTRESS_TIME_LOCK) - to_chat(usr, SPAN_WARNING("The self-destruct cannot be activated this early in the operation. Please wait another [time_left_until(DISTRESS_TIME_LOCK, world.time, 1 MINUTES)] minutes before trying again.")) + to_chat(user, SPAN_WARNING("The self-destruct cannot be activated this early in the operation. Please wait another [time_left_until(DISTRESS_TIME_LOCK, world.time, 1 MINUTES)] minutes before trying again.")) return FALSE if(!SSticker.mode) return FALSE //Not a game mode? if(SSticker.mode.force_end_at == 0) - to_chat(usr, SPAN_WARNING("ARES has denied your request for operational security reasons.")) + to_chat(user, SPAN_WARNING("ARES has denied your request for operational security reasons.")) return FALSE if(!COOLDOWN_FINISHED(src, cooldown_destruct)) - to_chat(usr, SPAN_WARNING("A self-destruct request has already been sent to high command. Please wait.")) + to_chat(user, SPAN_WARNING("A self-destruct request has already been sent to high command. Please wait.")) return FALSE if(get_security_level() == "delta") - to_chat(usr, SPAN_WARNING("The [MAIN_SHIP_NAME]'s self-destruct is already activated.")) + to_chat(user, SPAN_WARNING("The [MAIN_SHIP_NAME]'s self-destruct is already activated.")) return FALSE for(var/client/admin_client as anything in GLOB.admins) if((R_ADMIN|R_MOD) & admin_client.admin_holder.rights) admin_client << 'sound/effects/sos-morse-code.ogg' - message_admins("[key_name(usr)] has requested Self-Destruct! [CC_MARK(usr)] (GRANT) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") - to_chat(usr, SPAN_NOTICE("A self-destruct request has been sent to USCM Central Command.")) + message_admins("[key_name(user)] has requested Self-Destruct! [CC_MARK(user)] (GRANT) (DENY) [ADMIN_JMP_USER(user)] [CC_REPLY(user)]") + to_chat(user, SPAN_NOTICE("A self-destruct request has been sent to USCM Central Command.")) COOLDOWN_START(src, cooldown_destruct, COOLDOWN_COMM_DESTRUCT) . = TRUE diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index beed3610b53f..6ed2a8c7be64 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -161,7 +161,7 @@ log_game("[key_name(usr)] has called for an emergency evacuation.") message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") - log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") + log_ares_security("Initiate Evacuation", "Called for an emergency evacuation.", usr) return TRUE state = STATE_EVACUATION @@ -187,7 +187,7 @@ log_game("[key_name(usr)] has canceled the emergency evacuation.") message_admins("[key_name_admin(usr)] has canceled the emergency evacuation.") - log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") + log_ares_security("Cancel Evacuation", "Cancelled the emergency evacuation.", usr) return TRUE state = STATE_EVACUATION_CANCEL diff --git a/code/game/objects/items/devices/cictablet.dm b/code/game/objects/items/devices/cictablet.dm index 664054fb59e2..de03f1779f2b 100644 --- a/code/game/objects/items/devices/cictablet.dm +++ b/code/game/objects/items/devices/cictablet.dm @@ -91,43 +91,43 @@ . = ..() if(.) return - + var/mob/user = ui.user switch(action) if("announce") - if(usr.client.prefs.muted & MUTE_IC) - to_chat(usr, SPAN_DANGER("You cannot send Announcements (muted).")) + if(user.client.prefs.muted & MUTE_IC) + to_chat(user, SPAN_DANGER("You cannot send Announcements (muted).")) return if(!COOLDOWN_FINISHED(src, announcement_cooldown)) - to_chat(usr, SPAN_WARNING("Please wait [COOLDOWN_TIMELEFT(src, announcement_cooldown)/10] second\s before making your next announcement.")) + to_chat(user, SPAN_WARNING("Please wait [COOLDOWN_TIMELEFT(src, announcement_cooldown)/10] second\s before making your next announcement.")) return FALSE - var/input = stripped_multiline_input(usr, "Please write a message to announce to the [MAIN_SHIP_NAME]'s crew and all groundside personnel.", "Priority Announcement", "") - if(!input || !COOLDOWN_FINISHED(src, announcement_cooldown) || !(usr in view(1, src))) + var/input = stripped_multiline_input(user, "Please write a message to announce to the [MAIN_SHIP_NAME]'s crew and all groundside personnel.", "Priority Announcement", "") + if(!input || !COOLDOWN_FINISHED(src, announcement_cooldown) || !(user in view(1, src))) return FALSE var/signed = null - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - var/obj/item/card/id/id = H.wear_id + if(ishuman(user)) + var/mob/living/carbon/human/human_user = user + var/obj/item/card/id/id = human_user.wear_id if(istype(id)) - var/paygrade = get_paygrades(id.paygrade, FALSE, H.gender) + var/paygrade = get_paygrades(id.paygrade, FALSE, human_user.gender) signed = "[paygrade] [id.registered_name]" marine_announcement(input, announcement_title, faction_to_display = announcement_faction, add_PMCs = add_pmcs, signature = signed) - message_admins("[key_name(usr)] has made a command announcement.") - log_announcement("[key_name(usr)] has announced the following: [input]") + message_admins("[key_name(user)] has made a command announcement.") + log_announcement("[key_name(user)] has announced the following: [input]") COOLDOWN_START(src, announcement_cooldown, cooldown_between_messages) . = TRUE if("award") if(announcement_faction != FACTION_MARINE) return - open_medal_panel(usr, src) + open_medal_panel(user, src) . = TRUE if("mapview") - tacmap.tgui_interact(usr) + tacmap.tgui_interact(user) . = TRUE if("evacuation_start") @@ -135,20 +135,20 @@ return 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(user, SPAN_WARNING("The ship must be under red alert in order to enact evacuation procedures.")) 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(user, SPAN_WARNING("The USCM has placed a lock on deploying the evacuation pods.")) return FALSE if(!SShijack.initiate_evacuation()) - to_chat(usr, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!")) + to_chat(user, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!")) return FALSE - log_game("[key_name(usr)] has called for an emergency evacuation.") - message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") - log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") + log_game("[key_name(user)] has called for an emergency evacuation.") + message_admins("[key_name_admin(user)] has called for an emergency evacuation.") + log_ares_security("Initiate Evacuation", "Called for an emergency evacuation.", user) . = TRUE if("distress") @@ -156,14 +156,14 @@ return FALSE //Not a game mode? if(GLOB.security_level == SEC_LEVEL_DELTA) - to_chat(usr, SPAN_WARNING("The ship is already undergoing self destruct procedures!")) + to_chat(user, SPAN_WARNING("The ship is already undergoing self destruct procedures!")) return FALSE for(var/client/C in GLOB.admins) if((R_ADMIN|R_MOD) & C.admin_holder.rights) playsound_client(C,'sound/effects/sos-morse-code.ogg',10) - SSticker.mode.request_ert(usr) - to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM Central Command.")) + SSticker.mode.request_ert(user) + to_chat(user, SPAN_NOTICE("A distress beacon request has been sent to USCM Central Command.")) COOLDOWN_START(src, distress_cooldown, COOLDOWN_COMM_REQUEST) return TRUE From ef5d7835e11be1728c6aec6dbdbe40bb659991a2 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 2 May 2024 02:54:10 +0100 Subject: [PATCH 03/50] Automatic changelog for PR #6030 [ci skip] --- html/changelogs/AutoChangeLog-pr-6030.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6030.yml diff --git a/html/changelogs/AutoChangeLog-pr-6030.yml b/html/changelogs/AutoChangeLog-pr-6030.yml new file mode 100644 index 000000000000..879a2cd35b55 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6030.yml @@ -0,0 +1,4 @@ +author: "realforest2001" +delete-after: True +changes: + - rscadd: "Added the name of an announcement sender, if one exists, to ARES logs." \ No newline at end of file From 27a679d51e4008b9d752c5de0670bb222da6cf76 Mon Sep 17 00:00:00 2001 From: InsaneRed <47158596+InsaneRed@users.noreply.github.com> Date: Thu, 2 May 2024 05:27:52 +0300 Subject: [PATCH 04/50] Un-cavemans some strain buy information, and changes every strain flavor text from 40k/doom references (#6204) # About the pull request changes up the stupid "talls, auto spitters etc" inside OOC strain buying information. Re-writes all strainflavor text. # Explain why it's good for the game Cooler(imo) strain flavor texts are better when not all of them are warhammer references. its weird as hell to use IC in OOC information like "talls, auto spitters". (its also stupid as hell that they speak like this anyway, or whoever intrdouced this) # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: spellcheck: New flavor text and better strain information /:cl: --------- Co-authored-by: InsaneRed Co-authored-by: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- .../living/carbon/xenomorph/strains/castes/boiler/trapper.dm | 4 ++-- .../living/carbon/xenomorph/strains/castes/crusher/charger.dm | 4 ++-- .../carbon/xenomorph/strains/castes/defender/steel_crest.dm | 2 +- .../living/carbon/xenomorph/strains/castes/drone/healer.dm | 4 ++-- .../xenomorph/strains/castes/hivelord/resin_whisperer.dm | 2 +- .../carbon/xenomorph/strains/castes/praetorian/dancer.dm | 4 ++-- .../carbon/xenomorph/strains/castes/praetorian/oppressor.dm | 4 ++-- .../carbon/xenomorph/strains/castes/praetorian/vanguard.dm | 4 ++-- .../carbon/xenomorph/strains/castes/praetorian/warden.dm | 4 ++-- .../carbon/xenomorph/strains/castes/ravager/berserker.dm | 4 ++-- .../carbon/xenomorph/strains/castes/ravager/hedgehog.dm | 2 +- .../mob/living/carbon/xenomorph/strains/castes/runner/acid.dm | 2 +- 12 files changed, 20 insertions(+), 20 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/boiler/trapper.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/boiler/trapper.dm index e6c8061bd0fe..f64bfd6b500f 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/boiler/trapper.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/boiler/trapper.dm @@ -1,7 +1,7 @@ /datum/xeno_strain/trapper name = BOILER_TRAPPER - description = "You trade your ability to bombard, lance, and dump your acid in order to gain some speed and the ability to create acid explosions and restrain talls within them. With your longer-range vision, set up traps that immobilize your opponents and place acid mines which deal damage to talls and barricades and reduce the cooldown of your trap deployment for every tall hit. Finally, hit talls with your Acid Shotgun ability which adds a stack of insight to empower the next trap you place once you reach a maximum of ten insight. A point-blank shot or a shot on a stunned target will instantly apply ten stacks." - flavor_description = "Hsss, I love the smell of burnin' tallhost flesh in the mornin'." + description = "You trade your ability to bombard, lance, and dump your acid in order to gain some speed and the ability to create acid explosions and restrain enemies within them. With your longer-range vision, set up traps that immobilize your opponents and place acid mines which deal damage to enemies and barricades and reduce the cooldown of your trap deployment for every enemy hit. Finally, hit enemies with your Acid Shotgun ability which adds a stack of insight to empower the next trap you place once you reach a maximum of ten insight. A point-blank shot or a shot on a stunned target will instantly apply ten stacks." + flavor_description = "The battlefield is my canvas, this one, my painter. Melt them where they stand." actions_to_remove = list( /datum/action/xeno_action/activable/xeno_spit/bombard, diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/crusher/charger.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/crusher/charger.dm index 84877b43571e..55e459cc6dde 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/crusher/charger.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/crusher/charger.dm @@ -14,8 +14,8 @@ /datum/xeno_strain/charger name = CRUSHER_CHARGER - description = "In exchange for your shield, a little bit of your armor and damage, your slowdown resist from autospitters, your influence under frenzy pheromones, your stomp no longer knocking down talls, and your ability to lock your direction, you gain a considerable amount of health, some speed, your stomp does extra damage when stomping over a grounded tall, and your charge is now manually-controlled and momentum-based; the further you go, the more damage and speed you will gain until you achieve maximum momentum, indicated by your roar. In addition, your armor is now directional, being the toughest on the front, weaker on the sides, and weakest from the back. In return, you gain an ability to tumble to pass through talls and avoid enemy fire, and an ability to forcefully move enemies via ramming into them." - flavor_description = "We're just getting started. Nothing stops this train. Nothing." + description = "In exchange for your shield, a little bit of your armor and damage, your slowdown resist from turrets, your influence under frenzy pheromones, your stomp no longer knocking down talls, and your ability to lock your direction, you gain a considerable amount of health, some speed, your stomp does extra damage when stomping over a grounded tall, and your charge is now manually-controlled and momentum-based; the further you go, the more damage and speed you will gain until you achieve maximum momentum, indicated by your roar. In addition, your armor is now directional, being the toughest on the front, weaker on the sides, and weakest from the back. In return, you gain an ability to tumble to pass through enemies and avoid enemy fire, and an ability to forcefully move enemies via ramming into them." + flavor_description = "Nothing stops this hive. This one will become both the immovable object and the unstoppable force." actions_to_remove = list( /datum/action/xeno_action/activable/pounce/crusher_charge, diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/defender/steel_crest.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/defender/steel_crest.dm index f84566e9c841..cfbf85de299d 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/defender/steel_crest.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/defender/steel_crest.dm @@ -1,7 +1,7 @@ /datum/xeno_strain/steel_crest name = DEFENDER_STEELCREST description = "You trade your tail sweep and a small amount of your slash damage for slightly increased headbutt knockback and damage and the ability to slowly move and headbutt while fortified. Along with this, you gain a unique ability to accumulate damage, and use it to recover a slight amount of health and refresh your tail slam." - flavor_description = "To handle yourself, use your head. To handle others, use your head." + flavor_description = "This one, like my will, is indomitable. It will become my steel crest against all that defy me." icon_state_prefix = "Steelcrest" actions_to_remove = list( diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/drone/healer.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/drone/healer.dm index 0fcbb2ecf09a..5ebafc88eaef 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/drone/healer.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/drone/healer.dm @@ -1,7 +1,7 @@ /datum/xeno_strain/healer name = DRONE_HEALER - description = "You lose your choice of resin secretions, a chunk of your slash damage, and you will experience a slighty-increased difficulty in tackling tallhosts in exchange for strong pheromones, the ability to use a bit of your health to plant a maximum of three lesser resin fruits, and the ability to heal your sisters' wounds by secreting a regenerative resin salve by using your vital fluids and a fifth of your plasma. Be wary, this is a dangerous process; overexert yourself and you may exhaust yourself to unconsciousness, or die..." - flavor_description = "To the very last drop, your blood belongs to The Hive; share it with your sisters to keep them fighting." + description = "You lose your choice of resin secretions, a chunk of your slash damage, and you will experience a slighty-increased difficulty in tackling hosts in exchange for strong pheromones, the ability to use a bit of your health to plant a maximum of three lesser resin fruits, and the ability to heal your sisters' wounds by secreting a regenerative resin salve by using your vital fluids and a fifth of your plasma. Be wary, this is a dangerous process; overexert yourself and you may exhaust yourself to unconsciousness, or die..." + flavor_description = "Divided we fall, united we win. We live for the hive, we die for the hive." icon_state_prefix = "Healer" actions_to_remove = list( diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/hivelord/resin_whisperer.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/hivelord/resin_whisperer.dm index cf1cafde9267..538aacc63722 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/hivelord/resin_whisperer.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/hivelord/resin_whisperer.dm @@ -1,7 +1,7 @@ /datum/xeno_strain/resin_whisperer name = HIVELORD_RESIN_WHISPERER description = "You lose your corrosive acid, your ability to secrete thick resin, your ability to reinforce resin secretions, sacrifice your ability to plant weed nodes outside of weeds, and you sacrifice a fifth of your plasma reserves to enhance your vision and gain a stronger connection to the resin. You can now remotely place resin secretions including weed nodes up to a distance of twelve paces!" - flavor_description = "Let the resin guide you. It whispers, so listen closely." + flavor_description = "We let the resin guide us. It whispers, so listen closely." icon_state_prefix = "Resin Whisperer" actions_to_remove = list( diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/dancer.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/dancer.dm index f9a5dbedb614..7de4b93aad19 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/dancer.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/dancer.dm @@ -1,8 +1,8 @@ /datum/xeno_strain/dancer // My name is Cuban Pete, I'm the King of the Rumba Beat name = PRAETORIAN_DANCER - description = "You lose all of your acid-based abilities and a small amount of your armor in exchange for increased movement speed, evasion, and unparalleled agility that gives you an ability to move even more quickly, dodge bullets, and phase through tallhosts. By slashing tallhosts, you temporarily increase your movement speed and you also you apply a tag that changes how your two new tail abilities function. By tagging hosts, you will make Impale hit twice instead of once and make Tail Trip knock hosts down instead of stunning them." - flavor_description = "Demonstrate to the talls what 'there is beauty in death' truly symbolizes, then dance upon their graves!" + description = "You lose all of your acid-based abilities and a small amount of your armor in exchange for increased movement speed, evasion, and unparalleled agility that gives you an ability to move even more quickly, dodge bullets, and phase through enemies and allies alike. By slashing enemies, you temporarily increase your movement speed and you also you apply a tag that changes how your two new tail abilities function. By tagging enemies, you will make Impale hit twice instead of once and make Tail Trip knock enemies down instead of stunning them." + flavor_description = "A performance fit for a Queen, this one will become my instrument of death." icon_state_prefix = "Dancer" actions_to_remove = list( diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/oppressor.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/oppressor.dm index 91ea59661462..b9541a13ca80 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/oppressor.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/oppressor.dm @@ -1,8 +1,8 @@ /datum/xeno_strain/oppressor // Dread it, run from it, destiny still arrives... or should I say, I do name = PRAETORIAN_OPPRESSOR - description = "You abandon all of your acid-based abilities, your dash, some speed, and a bit of your slash damage for some resistance against small explosives, slashes that deal extra damage to prone targets, and a powerful hook ability that pulls up to three talls towards you, slows them, and has varying effects depending on how many talls you pull. You also gain a powerful punch that reduces your other abilities' cooldowns, pierces through armor, and does double damage in addition to rooting slowed targets. You can also knock talls back and slow them with your new Tail Lash and quickly grab a tall, slow it, and pull it towards you with your unique Tail Stab." - flavor_description = "Dread it. Run from it. The Hive arrives all the same, or, more accurately, you do." + description = "You abandon all of your acid-based abilities, your dash, some speed, and a bit of your slash damage for some resistance against small explosives, slashes that deal extra damage to prone targets, and a powerful hook ability that pulls up to three enemies towards you, slows them, and has varying effects depending on how many enemies you pull. You also gain a powerful punch that reduces your other abilities' cooldowns, pierces through armor, and does double damage in addition to rooting slowed targets. You can also knock enemies back and slow them with your new Tail Lash and quickly grab a tall, slow it, and pull it towards you with your unique Tail Stab." + flavor_description = "My reach is endless, this one will pull down the heavens." icon_state_prefix = "Oppressor" actions_to_remove = list( diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/vanguard.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/vanguard.dm index 2a344523e974..310db35ab370 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/vanguard.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/vanguard.dm @@ -1,7 +1,7 @@ /datum/xeno_strain/vanguard name = PRAETORIAN_VANGUARD - description = "You forfeit all of your acid-based abilities and some health for some extra speed and a rechargable shield that can block one attack. Use your Pierce from up to three paces away to stab through talls, while stabbing through several will completely recharge your shield. Use your charge to plow through enemies and use it again to unleash a powerful AoE slash that reaches up to three paces. You also have a Cleave ability, amplified by your shield, which you can toggle to either immobilize or fling a target away." - flavor_description = "They are my bulwark against the tallhosts. They are my Vanguard and they shall know no fear." + description = "You forfeit all of your acid-based abilities and some health for some extra speed and a rechargable shield that can block one attack. Use your Pierce from up to three paces away to stab through talls, while stabbing through two or more will completely recharge your shield. Use your charge to plow through enemies and use it again to unleash a powerful AoE slash that reaches up to three paces. You also have a Cleave ability, amplified by your shield, which you can toggle to either immobilize or fling a target away." + flavor_description = "Fearless you are born, fearless you serve, fearless you die. This one will become my Vanguard" icon_state_prefix = "Vanguard" actions_to_remove = list( diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/warden.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/warden.dm index 313778baf038..9dc9404ee498 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/warden.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/praetorian/warden.dm @@ -1,8 +1,8 @@ /datum/xeno_strain/warden // i mean so basically im braum name = PRAETORIAN_WARDEN - description = "You trade your acid ball, acid spray, dash, and a small bit of your slash damage and speed to become an effective medic. You gain the ability to emit strong pheromones, an ability that retrieves endangered, knocked-down or sitting allies and pulls them to your location, and you gain an internal hitpoint pool that fills with every slash against your enemies, which can be spent to aid your allies and yourself by healing them or curing their ailments." - flavor_description = "Only in death does your sisters' service to the Queen end. They will be untouched by plague or disease; no sickness will blight them." + description = "You trade your acid ball, acid spray, dash, and a small bit of your slash damage and speed to become an effective medic. You gain the ability to emit strong pheromones, an ability that retrieves endangered, knocked-down or resting allies and pulls them to your location, and you gain an internal hitpoint pool that fills with every slash against your enemies, which can be spent to aid your allies and yourself by healing them or curing their ailments." + flavor_description = "This one will deny her sisters' deaths until they earn it. Fight or be forgotten." icon_state_prefix = "Warden" actions_to_remove = list( diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/ravager/berserker.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/ravager/berserker.dm index 365304259ac8..5b8981157bda 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/ravager/berserker.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/ravager/berserker.dm @@ -1,7 +1,7 @@ /datum/xeno_strain/berserker name = RAVAGER_BERSERKER - description = "You lose your empower, charge, and scissor cut, decrease your health, and sacrifice a bit of your influence under frenzy pheromones to increase your movement speed, slightly increase your armor, and gain a new set of abilities that make you a terrifying melee monster. By slashing, you heal yourself and gain a stack of rage that increases your armor, movement speed, attack speed, and your heals per slash, to a maximum of six rage. Use your new Appehend ability to increase your movement speed and apply a slow on the next target you slash and use your Clothesline ability to fling your target to heal yourself, even more-so if you have a rage stack that will be used up. Finally, use your Eviscerate to unleash a devastating windmill attack that heals you for every host you hit after an immobilizing wind-up." - flavor_description = "They shall be my finest warriors. They will rend and tear, crush and butcher, and maim and rage until every tallhost falls." + description = "You lose your empower, charge, and scissor cut, decrease your health, and sacrifice a bit of your influence under frenzy pheromones to increase your movement speed, slightly increase your armor, and gain a new set of abilities that make you a terrifying melee monster. By slashing, you heal yourself and gain a stack of rage that increases your armor, movement speed, attack speed, and your heals per slash, to a maximum of six rage. Use your new Appehend ability to increase your movement speed and apply a slow on the next target you slash and use your Clothesline ability to fling your target to heal yourself, even more-so if you have a rage stack that will be used up. Finally, use your Eviscerate to unleash a devastating windmill attack that heals you for every enemy you hit after an immobilizing wind-up." + flavor_description = "Unbridled fury fills this one. You will become an extension of my rage." icon_state_prefix = "Berserker" actions_to_remove = list( diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/ravager/hedgehog.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/ravager/hedgehog.dm index 5cb756d8889d..b88df4068cec 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/ravager/hedgehog.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/ravager/hedgehog.dm @@ -1,7 +1,7 @@ /datum/xeno_strain/hedgehog name = RAVAGER_HEDGEHOG description = "You lose your empower, charge, scissor cut, and some slash damage in exchange for more explosive resistance. Your resistance scales with your shard count and at 50% grants you immunity to some explosive stuns. You accumulate shards over time and when taking damage. You can use these shards to power three new abilities: Spike Shield which gives you a temporary shield that spits bone shards around you when damaged; Fire Spikes which launches spikes at your target to slow them and deal damage when they move; and Spike Shed which launches all your spikes, grants a temporary speed boost, and disables shard generation for thirty seconds." - flavor_description = "They will be of iron will and steely muscle. In great armor shall they be clad, and with the mightiest spikes will they be armed." + flavor_description = "You will pierce them a million times, show them what it feels like. This one will become my shield." icon_state_prefix = "Hedgehog" actions_to_remove = list( diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/runner/acid.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/runner/acid.dm index 7b9bafadeb7b..f98263871707 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/runner/acid.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/runner/acid.dm @@ -1,7 +1,7 @@ /datum/xeno_strain/acider name = RUNNER_ACIDER description = "At the cost of a little bit of your speed and all of your current abilities, you gain a considerable amount of health, some armor, and a new organ that fills with volatile acid over time. Your Tail Stab and slashes apply acid to living lifeforms that slowly burns them, and slashes against targets with acid stacks fill your acid glands. You also gain Corrosive Acid equivalent to that of a boiler that you can deploy more quickly than any other caste, at the cost of a chunk of your acid reserves with each use. Finally, after a twenty second windup, you can force your body to explode, covering everything near you with acid. The more acid you have stored, the more devastating the explosion will be, but during those twenty seconds before detonation you are slowed and give off several warning signals which give talls an opportunity to end you before you can detonate. If you successfully explode, you will reincarnate as a larva again!" - flavor_description = "Burn their walls, maim their faces! Your life, for The Hive!" + flavor_description = "This one will be the last thing they hear. A martyr." icon_state_prefix = "Acider" actions_to_remove = list( From 17cf367c292a214346f3018b725f9a1bbbc088df Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 2 May 2024 03:32:25 +0100 Subject: [PATCH 05/50] Automatic changelog for PR #6204 [ci skip] --- html/changelogs/AutoChangeLog-pr-6204.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6204.yml diff --git a/html/changelogs/AutoChangeLog-pr-6204.yml b/html/changelogs/AutoChangeLog-pr-6204.yml new file mode 100644 index 000000000000..099fcc82b7ba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6204.yml @@ -0,0 +1,4 @@ +author: "InsaneRed" +delete-after: True +changes: + - spellcheck: "New flavor text and better strain information" \ No newline at end of file From 79df661747e632abd663c021ce68a73c8dcab66e Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 3 May 2024 01:13:33 +0000 Subject: [PATCH 06/50] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6030.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6204.yml | 4 ---- html/changelogs/archive/2024-05.yml | 5 +++++ 3 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6030.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6204.yml diff --git a/html/changelogs/AutoChangeLog-pr-6030.yml b/html/changelogs/AutoChangeLog-pr-6030.yml deleted file mode 100644 index 879a2cd35b55..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6030.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - rscadd: "Added the name of an announcement sender, if one exists, to ARES logs." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6204.yml b/html/changelogs/AutoChangeLog-pr-6204.yml deleted file mode 100644 index 099fcc82b7ba..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6204.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "InsaneRed" -delete-after: True -changes: - - spellcheck: "New flavor text and better strain information" \ No newline at end of file diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml index 74b346b71d1e..2de916ae3976 100644 --- a/html/changelogs/archive/2024-05.yml +++ b/html/changelogs/archive/2024-05.yml @@ -37,3 +37,8 @@ - imageadd: Added directional blast door sprites from Thwomper for blended black shutters. - code_imp: Renamed operator var in apollo console code to user. +2024-05-03: + InsaneRed: + - spellcheck: New flavor text and better strain information + realforest2001: + - rscadd: Added the name of an announcement sender, if one exists, to ARES logs. From d975ca0ea1465b5ed1a38b277f6c6ceb90dfca9a Mon Sep 17 00:00:00 2001 From: Vero <73014819+vero5123@users.noreply.github.com> Date: Thu, 2 May 2024 20:45:29 -0700 Subject: [PATCH 07/50] Fixes microwave food duplication (#6222) # About the pull request Fixes #6128, probably. # Changelog :cl: fix: Fixes microwave food duplication /:cl: Co-authored-by: DOOM --- code/game/machinery/kitchen/microwave.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 220772e98b17..5a7e690fc3ca 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -229,8 +229,9 @@ //************************************/ /obj/structure/machinery/microwave/proc/cook(time_multiplier = 1) - if(inoperable()) + if(inoperable() || operating) return + start() if (reagents.total_volume==0 && !(locate(/obj) in contents)) //dry run if (!wzhzhzh(10 * time_multiplier)) From 775dc1d7fb3347f389b0a01975509feaabf1c271 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 3 May 2024 04:56:32 +0100 Subject: [PATCH 08/50] Automatic changelog for PR #6222 [ci skip] --- html/changelogs/AutoChangeLog-pr-6222.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6222.yml diff --git a/html/changelogs/AutoChangeLog-pr-6222.yml b/html/changelogs/AutoChangeLog-pr-6222.yml new file mode 100644 index 000000000000..d2a49c8ea8db --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6222.yml @@ -0,0 +1,4 @@ +author: "vero5123" +delete-after: True +changes: + - bugfix: "Fixes microwave food duplication" \ No newline at end of file From e5b3e3db724381378bb60f3f85142f41d818bd90 Mon Sep 17 00:00:00 2001 From: Vero <73014819+vero5123@users.noreply.github.com> Date: Thu, 2 May 2024 20:45:37 -0700 Subject: [PATCH 09/50] Fixes cloaked scout being decapable when wearing a helmet (#6224) # About the pull request Closes #6215, keeps beagle's original functionality the same as well. # Changelog :cl: fix: Fixes scout being able to be decapitated with a helmet on while cloaked. /:cl: Co-authored-by: DOOM --- code/modules/organs/limbs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/organs/limbs.dm b/code/modules/organs/limbs.dm index 4c3954575245..3cf8dae2a2c6 100644 --- a/code/modules/organs/limbs.dm +++ b/code/modules/organs/limbs.dm @@ -1513,7 +1513,7 @@ treat_grafted var tells it to apply to grafted but unsalved wounds, for burn kit /obj/limb/head/limb_delimb(damage_source) var/obj/item/clothing/head/helmet/owner_helmet = owner.head - if(!istype(owner_helmet) || !owner.allow_gun_usage) + if(!istype(owner_helmet) || (issynth(owner) && !owner.allow_gun_usage)) droplimb(0, 0, damage_source) return From d1820c6aed4da64552242f11a082e7b4a7829ee1 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 3 May 2024 05:03:42 +0100 Subject: [PATCH 10/50] Automatic changelog for PR #6224 [ci skip] --- html/changelogs/AutoChangeLog-pr-6224.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6224.yml diff --git a/html/changelogs/AutoChangeLog-pr-6224.yml b/html/changelogs/AutoChangeLog-pr-6224.yml new file mode 100644 index 000000000000..7aa42719c371 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6224.yml @@ -0,0 +1,4 @@ +author: "vero5123" +delete-after: True +changes: + - bugfix: "Fixes scout being able to be decapitated with a helmet on while cloaked." \ No newline at end of file From a848e2fc65491b4f0033261d9e46b9ea5234fcb1 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Fri, 3 May 2024 06:58:34 +0300 Subject: [PATCH 11/50] Fix synths being affected by boiler neurotoxin (#6197) # About the pull request For some reason the neurotoxin is an effect instead of a chemical and lacks the proper checks so it affected synths which is pretty funny # Explain why it's good for the game Consistency and it makes no sense # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Synths no longer get affected by boiler's neurotoxin /:cl: --- code/datums/effects/neurotoxin.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/datums/effects/neurotoxin.dm b/code/datums/effects/neurotoxin.dm index 490ed213292b..b7402ca370fd 100644 --- a/code/datums/effects/neurotoxin.dm +++ b/code/datums/effects/neurotoxin.dm @@ -37,6 +37,10 @@ return FALSE if(affected_mob.stat == DEAD) return + + if(issynth(affected_atom)) + return + // General effects affected_mob.last_damage_data = cause_data affected_mob.apply_stamina_damage(stam_dam) From 1b19ddf251b60a28f9dde7756e50ee8b101fab9d Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 3 May 2024 05:10:24 +0100 Subject: [PATCH 12/50] Automatic changelog for PR #6197 [ci skip] --- html/changelogs/AutoChangeLog-pr-6197.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6197.yml diff --git a/html/changelogs/AutoChangeLog-pr-6197.yml b/html/changelogs/AutoChangeLog-pr-6197.yml new file mode 100644 index 000000000000..76106b8578cc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6197.yml @@ -0,0 +1,4 @@ +author: "Git-Nivrak" +delete-after: True +changes: + - bugfix: "Synths no longer get affected by boiler's neurotoxin" \ No newline at end of file From 0fa59551510b37226dd3e5b582dcf1a58277ada5 Mon Sep 17 00:00:00 2001 From: Vero <73014819+vero5123@users.noreply.github.com> Date: Thu, 2 May 2024 21:14:43 -0700 Subject: [PATCH 13/50] Fixes sentry targeting xenos inside of vents (#6223) # About the pull request Closes #6110, #5556. Honestly I was unable to reproduce the issue, but this seems like it should work regardless of the original problem. # Changelog :cl: fix: Fixes sentries firing at xenos while vent crawling. /:cl: --------- Co-authored-by: DOOM --- code/modules/defenses/sentry.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/defenses/sentry.dm b/code/modules/defenses/sentry.dm index a02e4e7808c9..954e6adca7ec 100644 --- a/code/modules/defenses/sentry.dm +++ b/code/modules/defenses/sentry.dm @@ -365,7 +365,7 @@ targets.Remove(A) continue - if(M.get_target_lock(faction_group) || M.invisibility || HAS_TRAIT(M, TRAIT_ABILITY_BURROWED)) + if(M.get_target_lock(faction_group) || M.invisibility || HAS_TRAIT(M, TRAIT_ABILITY_BURROWED) || M.is_ventcrawling) if(M == target) target = null targets.Remove(M) From 36a77b57fea199a9cb36320d6dc82634d9d9196c Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 3 May 2024 05:21:21 +0100 Subject: [PATCH 14/50] Automatic changelog for PR #6223 [ci skip] --- html/changelogs/AutoChangeLog-pr-6223.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6223.yml diff --git a/html/changelogs/AutoChangeLog-pr-6223.yml b/html/changelogs/AutoChangeLog-pr-6223.yml new file mode 100644 index 000000000000..19f214273ef6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6223.yml @@ -0,0 +1,4 @@ +author: "vero5123" +delete-after: True +changes: + - bugfix: "Fixes sentries firing at xenos while vent crawling." \ No newline at end of file From 9aec1a0c55e39d16312cec68939396b67d029a56 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Fri, 3 May 2024 00:15:31 -0400 Subject: [PATCH 15/50] nerfs Kutjevo ledges (#6218) # About the pull request Kutjevo ledges now take only 0.2 seconds to climb instead of 1 whole second # Explain why it's good for the game why should kutjevo ledges take longer to climb? consistency # Testing Photographs and Procedure probably works # Changelog :cl: balance: Kutjevo ledges now take only 0.2 seconds to climb instead of 1 whole second /:cl: --- code/game/objects/structures/platforms.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/structures/platforms.dm b/code/game/objects/structures/platforms.dm index cfffbc90fb7c..5510d319ee1e 100644 --- a/code/game/objects/structures/platforms.dm +++ b/code/game/objects/structures/platforms.dm @@ -142,7 +142,6 @@ icon_state = "kutjevo_platform" name = "raised metal edge" desc = "A raised level of metal, often used to elevate areas above others, or construct bridges. You could probably climb it." - climb_delay = 10 /obj/structure/platform_decoration/kutjevo name = "raised metal corner" From 751b8a54e0e1b386a492efad532a24d56d7bce98 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 3 May 2024 05:33:59 +0100 Subject: [PATCH 16/50] Automatic changelog for PR #6218 [ci skip] --- html/changelogs/AutoChangeLog-pr-6218.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6218.yml diff --git a/html/changelogs/AutoChangeLog-pr-6218.yml b/html/changelogs/AutoChangeLog-pr-6218.yml new file mode 100644 index 000000000000..e2f506c6a2e5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6218.yml @@ -0,0 +1,4 @@ +author: "iloveloopers" +delete-after: True +changes: + - balance: "Kutjevo ledges now take only 0.2 seconds to climb instead of 1 whole second" \ No newline at end of file From 3d28974d129f1be3824ed01c7e3c414bb0cbd80f Mon Sep 17 00:00:00 2001 From: kiVts <48099872+kiVts@users.noreply.github.com> Date: Fri, 3 May 2024 00:30:29 -0400 Subject: [PATCH 17/50] metal sheet exploit fix (#6209) # About the pull request funny thing I noticed while surfing the code # Explain why it's good for the game Im pretty sure thats not how world works # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: kivts fix: Infinite metal oversight fix. /:cl: --------- Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/game/objects/items/frames/table_rack.dm | 2 ++ code/modules/projectiles/gun_attachables.dm | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/frames/table_rack.dm b/code/game/objects/items/frames/table_rack.dm index c7aa53a2c4c1..eda9b9c5749b 100644 --- a/code/game/objects/items/frames/table_rack.dm +++ b/code/game/objects/items/frames/table_rack.dm @@ -100,6 +100,7 @@ desc = "A kit for a table, including a large, flat wooden surface and four legs. Some assembly required." icon_state = "wood_tableparts" flags_atom = FPRINT + matter = null table_type = /obj/structure/surface/table/woodentable /obj/item/frame/table/wood/attackby(obj/item/W, mob/user) @@ -140,6 +141,7 @@ desc = "A kit for a table, including a large, flat wooden and carpet surface and four legs. Some assembly required." icon_state = "gamble_tableparts" flags_atom = null + matter = null table_type = /obj/structure/surface/table/gamblingtable /obj/item/frame/table/gambling/attackby(obj/item/W as obj, mob/user as mob) diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm index a2801821349c..5e2fc8459377 100644 --- a/code/modules/projectiles/gun_attachables.dm +++ b/code/modules/projectiles/gun_attachables.dm @@ -1761,8 +1761,6 @@ Defined in conflicts.dm of the #defines folder. //but at the same time you are slow when 2 handed aim_speed_mod = CONFIG_GET(number/slowdown_med) - matter = list("wood" = 2000) - select_gamemode_skin(type) /obj/item/attachable/stock/double From 8a2727a27605fb894e25713e2d06d3cc9cf4588f Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 3 May 2024 05:41:19 +0100 Subject: [PATCH 18/50] Automatic changelog for PR #6209 [ci skip] --- html/changelogs/AutoChangeLog-pr-6209.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6209.yml diff --git a/html/changelogs/AutoChangeLog-pr-6209.yml b/html/changelogs/AutoChangeLog-pr-6209.yml new file mode 100644 index 000000000000..43d06d293a8f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6209.yml @@ -0,0 +1,4 @@ +author: "kivts" +delete-after: True +changes: + - bugfix: "Infinite metal oversight fix." \ No newline at end of file From 4ef1793a1bba196a5ea21d851205080d8a9f647a Mon Sep 17 00:00:00 2001 From: Vero <73014819+vero5123@users.noreply.github.com> Date: Thu, 2 May 2024 21:53:48 -0700 Subject: [PATCH 19/50] Fixes huggers not dying when caught by predator (#6226) # About the pull request Closes #6134. # Changelog :cl: fix: fixes hugger not dying when squished by predator /:cl: Co-authored-by: DOOM --- .../mob/living/carbon/xenomorph/Facehuggers.dm | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm index bf88acd2b790..9a87f10d74a3 100644 --- a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm +++ b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm @@ -281,7 +281,7 @@ if(isturf(human.loc)) forceMove(human.loc)//Just checkin - if(!human.handle_hugger_attachment(src)) + if(!human.handle_hugger_attachment(src, hugger)) return FALSE attached = TRUE @@ -491,15 +491,14 @@ /** * Human hugger handling */ - -/mob/living/carbon/human/proc/handle_hugger_attachment(obj/item/clothing/mask/facehugger/hugger) +/mob/living/carbon/human/proc/handle_hugger_attachment(obj/item/clothing/mask/facehugger/hugger, mob/living/carbon/xenomorph/facehugger/mob_hugger) var/can_infect = TRUE if(!has_limb("head")) hugger.visible_message(SPAN_WARNING("[hugger] looks for a face to hug on [src], but finds none!")) hugger.go_idle() return FALSE - if(species && !species.handle_hugger_attachment(src, hugger)) + if(species && !species.handle_hugger_attachment(src, hugger, mob_hugger)) return FALSE if(head && !(head.flags_item & NODROP)) @@ -546,10 +545,10 @@ return can_infect -/datum/species/proc/handle_hugger_attachment(mob/living/carbon/human/target, obj/item/clothing/mask/facehugger/hugger) +/datum/species/proc/handle_hugger_attachment(mob/living/carbon/human/target, obj/item/clothing/mask/facehugger/hugger, mob/living/carbon/xenomorph/facehugger/mob_hugger) return TRUE -/datum/species/yautja/handle_hugger_attachment(mob/living/carbon/human/target, obj/item/clothing/mask/facehugger/hugger) +/datum/species/yautja/handle_hugger_attachment(mob/living/carbon/human/target, obj/item/clothing/mask/facehugger/hugger, mob/living/carbon/xenomorph/facehugger/mob_hugger) var/catch_chance = 50 if(target.dir == GLOB.reverse_dir[hugger.dir]) catch_chance += 20 @@ -563,7 +562,10 @@ if(!target.stat && target.dir != hugger.dir && prob(catch_chance)) //Not facing away target.visible_message(SPAN_NOTICE("[target] snatches [hugger] out of the air and squashes it!")) - hugger.die() + if(mob_hugger) + mob_hugger.death(create_cause_data("squished")) + else + hugger.die() return FALSE return TRUE From 53cd988797a9e485b30f839a8df96aaddf2a4842 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 3 May 2024 05:58:44 +0100 Subject: [PATCH 20/50] Automatic changelog for PR #6226 [ci skip] --- html/changelogs/AutoChangeLog-pr-6226.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6226.yml diff --git a/html/changelogs/AutoChangeLog-pr-6226.yml b/html/changelogs/AutoChangeLog-pr-6226.yml new file mode 100644 index 000000000000..7acfc4e24fee --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6226.yml @@ -0,0 +1,4 @@ +author: "vero5123" +delete-after: True +changes: + - bugfix: "fixes hugger not dying when squished by predator" \ No newline at end of file From 1c4830167fb74dcc03b0be5a1c2335c738a82f3f Mon Sep 17 00:00:00 2001 From: ColdIronWarrior Date: Fri, 3 May 2024 01:07:50 -0400 Subject: [PATCH 21/50] sea vendor additions (and CPR dummy removal) (#6221) # About the pull request these are some requested edits to the SEA vendor. - adds an eyewear category with: - welding goggles - medhuds - prescription medhuds - sunglasses - adds a gloves category with - insuls - marine combat gloves - makes the SEA vendor's utility holster rig spawn full - removes the CPR dummy since it's reportedly not useful tested # Explain why it's good for the game these were requested by SEA players to help with some roles works through part of this list: ![image](https://github.com/cmss13-devs/cmss13/assets/29965103/50bdea25-1393-4e20-9938-4d1be4f17fd5) notably: - i dont know what would be needed for either of the kits - i dont know how to do the trackers # Testing Photographs and Procedure ![image](https://github.com/cmss13-devs/cmss13/assets/29965103/53d06f19-860d-4d38-a2b6-7247da693862) # Changelog :cl: add: Added eyewear options, more glove options to the SEA vendor add: SEAs now get full versions of the utility holster belt del: Removed the CPR dummy from the SEA vendor /:cl: --------- Co-authored-by: nefarious <72267018+nefarious6th@users.noreply.github.com> --- .../machinery/vending/vendor_types/crew/sea.dm | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/vending/vendor_types/crew/sea.dm b/code/game/machinery/vending/vendor_types/crew/sea.dm index 44f530271037..37cacfd14a6f 100644 --- a/code/game/machinery/vending/vendor_types/crew/sea.dm +++ b/code/game/machinery/vending/vendor_types/crew/sea.dm @@ -29,17 +29,20 @@ GLOBAL_LIST_INIT(cm_vending_gear_sea, list( GLOBAL_LIST_INIT(cm_vending_clothing_sea, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Officer Uniform", 0, /obj/item/clothing/under/marine/dress, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Marine Combat Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/cdrcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("Satchel", 0, /obj/item/storage/backpack/satchel/lockable, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("GLOVES (CHOOSE 1)", 0, null, null, null), + list("Insulated Gloves", 0, /obj/item/clothing/gloves/yellow, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_REGULAR), + list("Marine Combat Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_REGULAR), + list("BELT (CHOOSE 1)", 0, null, null, null), list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), list("M276 Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 Combat Toolbelt Rig (Full)", 0, /obj/item/storage/belt/gun/utility, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 Combat Toolbelt Rig (Full)", 0, /obj/item/storage/belt/gun/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("POUCHES (CHOOSE 2)", 0, null, null, null), list("Autoinjector Pouch", 0, /obj/item/storage/pouch/autoinjector/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), @@ -58,6 +61,12 @@ GLOBAL_LIST_INIT(cm_vending_clothing_sea, list( list("Bulletproof Vest", 0, /obj/item/clothing/suit/armor/bulletproof, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), list("USCM Service Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/service, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("EYEWEAR (CHOOSE 1)", 0, null, null, null), + list("Welding Goggles", 0, /obj/item/clothing/glasses/welding, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), + list("Medical HUD Glasses", 0, /obj/item/clothing/glasses/hud/health, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), + list("Prescription Medical HUD Glasses", 0, /obj/item/clothing/glasses/hud/health/prescription, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), + list("Sunglasses", 0, /obj/item/clothing/glasses/sunglasses, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), + list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), @@ -68,9 +77,6 @@ GLOBAL_LIST_INIT(cm_vending_clothing_sea, list( list("HEADWEAR (CHOOSE 1)", 0, null, null, null), list("Drill Hat", 0, /obj/item/clothing/head/drillhat, MARINE_CAN_BUY_MASK, VENDOR_ITEM_RECOMMENDED), list("M10 Helmet", 0, /obj/item/clothing/head/helmet/marine, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR), - - list("TOOLS OF THE TRADE", 0, null, null, null), - list("CPR Dummy", 5, /obj/item/cpr_dummy, null, VENDOR_ITEM_REGULAR) )) /obj/structure/machinery/cm_vending/clothing/sea From 69d1e80ca0aaae28c09829831d1e5792546a6149 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 3 May 2024 06:12:17 +0100 Subject: [PATCH 22/50] Automatic changelog for PR #6221 [ci skip] --- html/changelogs/AutoChangeLog-pr-6221.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6221.yml diff --git a/html/changelogs/AutoChangeLog-pr-6221.yml b/html/changelogs/AutoChangeLog-pr-6221.yml new file mode 100644 index 000000000000..c23424f146c1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6221.yml @@ -0,0 +1,6 @@ +author: "coldironwarrior" +delete-after: True +changes: + - rscadd: "Added eyewear options, more glove options to the SEA vendor" + - rscadd: "SEAs now get full versions of the utility holster belt" + - rscdel: "Removed the CPR dummy from the SEA vendor" \ No newline at end of file From 95857412f13d1cd3cd9a61ceac9e8e4206d2bd9a Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Fri, 3 May 2024 06:12:42 +0100 Subject: [PATCH 23/50] WY Security Skills & Engineer (#6214) # About the pull request Finally gives WY Goons their own skill set rather than using MP/CMP skills. Also gives them an engineer preset. (This won't spawn normally at the moment, but can be used in events without needing to tinker so much w/ skills. # Explain why it's good for the game Makes events using goons more flexible, and addresses the weirdness of the skills due to being CMP based for WY lead # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Added skillsets specific to WY Goons. add: Added a WY Goon Engineer preset. /:cl: --- code/__DEFINES/job.dm | 1 + code/datums/skills/wygoons.dm | 36 +++++++++++++++++++++++++ code/modules/gear_presets/wy_goons.dm | 38 +++++++++++++++++++++++++-- colonialmarines.dme | 1 + 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 code/datums/skills/wygoons.dm diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm index 1b2907cf57ce..f869357efd1b 100644 --- a/code/__DEFINES/job.dm +++ b/code/__DEFINES/job.dm @@ -206,6 +206,7 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) //-------- WY Goons --------// #define JOB_WY_GOON "WY Corporate Security" +#define JOB_WY_GOON_TECH "WY Corporate Security Technician" #define JOB_WY_GOON_LEAD "WY Corporate Security Lead" #define JOB_WY_GOON_RESEARCHER "WY Research Consultant" diff --git a/code/datums/skills/wygoons.dm b/code/datums/skills/wygoons.dm new file mode 100644 index 000000000000..2d2c247bd1ea --- /dev/null +++ b/code/datums/skills/wygoons.dm @@ -0,0 +1,36 @@ +/datum/skills/wy_goon + name = "Corporate Security" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + ) + +/datum/skills/wy_goon_tech + name = "Corporate Security Support Technician" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + ) + +/datum/skills/wy_goon_lead + name = "Corporate Security Leader" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + ) diff --git a/code/modules/gear_presets/wy_goons.dm b/code/modules/gear_presets/wy_goons.dm index a8f3a443311e..7867016491dc 100644 --- a/code/modules/gear_presets/wy_goons.dm +++ b/code/modules/gear_presets/wy_goons.dm @@ -62,7 +62,7 @@ assignment = JOB_WY_GOON rank = JOB_WY_GOON paygrade = PAY_SHORT_CPO - skills = /datum/skills/MP + skills = /datum/skills/wy_goon /datum/equipment_preset/goon/standard/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/WY, WEAR_L_EAR) @@ -88,6 +88,40 @@ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ap, WEAR_IN_BACK) +/datum/equipment_preset/goon/engineer + name = "Weyland-Yutani Corporate Security Technician (Goon Engineer)" + flags = EQUIPMENT_PRESET_EXTRA + + assignment = JOB_WY_GOON_TECH + rank = JOB_WY_GOON_TECH + paygrade = PAY_SHORT_CPO + skills = /datum/skills/wy_goon_tech + +/datum/equipment_preset/goon/engineer/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/WY, WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/pmc/corporate, WEAR_BODY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/pmc/light/corporate, WEAR_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS) + new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc/corporate, WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/welding, WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate, WEAR_FEET) + + new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/engineerpack/ert, WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/weapon/baton, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle, WEAR_IN_BACK) + + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/utility/full, WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full, WEAR_R_STORE) + new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/construction/full, WEAR_L_STORE) + + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41a/corporate, WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ap, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/ap, WEAR_IN_JACKET) + + /datum/equipment_preset/goon/lead name = "Weyland-Yutani Corporate Security Lead (Goon Lead)" flags = EQUIPMENT_PRESET_EXTRA @@ -95,7 +129,7 @@ assignment = JOB_WY_GOON_LEAD rank = JOB_WY_GOON_LEAD paygrade = PAY_SHORT_CSPO - skills = /datum/skills/MP + skills = /datum/skills/wy_goon_lead /datum/equipment_preset/goon/lead/New() . = ..() diff --git a/colonialmarines.dme b/colonialmarines.dme index cab62dffd2fc..d38af7820e21 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -631,6 +631,7 @@ #include "code\datums\skills\synthetic.dm" #include "code\datums\skills\upp.dm" #include "code\datums\skills\uscm.dm" +#include "code\datums\skills\wygoons.dm" #include "code\datums\stamina\_stamina.dm" #include "code\datums\stamina\none.dm" #include "code\datums\statistics\cause_data.dm" From 6efc072b3eeaa2a2947102a9208d1d65f12f6d84 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 3 May 2024 06:17:35 +0100 Subject: [PATCH 24/50] Automatic changelog for PR #6214 [ci skip] --- html/changelogs/AutoChangeLog-pr-6214.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6214.yml diff --git a/html/changelogs/AutoChangeLog-pr-6214.yml b/html/changelogs/AutoChangeLog-pr-6214.yml new file mode 100644 index 000000000000..299816c889a6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6214.yml @@ -0,0 +1,5 @@ +author: "realforest2001" +delete-after: True +changes: + - rscadd: "Added skillsets specific to WY Goons." + - rscadd: "Added a WY Goon Engineer preset." \ No newline at end of file From ab6c09dc89d8eb973c1bc8a7aa8b3f04c78773b1 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Fri, 3 May 2024 01:53:15 -0400 Subject: [PATCH 25/50] Bookcases can now be deconstructed by slashing or wrenching (#6213) # About the pull request title # Explain why it's good for the game no more stupid undestroyable crap blocking your movement # Testing Photographs and Procedure https://github.com/cmss13-devs/cmss13/assets/140007537/e5c8f24a-8a4f-4977-a1a4-22954beee519 # Changelog :cl: qol: Bookcases can now be wrenched or slashed to be deconstructed /:cl: --------- Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/game/objects/structures/bookcase.dm | 34 ++++++++++++++++++++---- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index b310bd00aa07..a6fc95fa0d73 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -7,6 +7,24 @@ density = TRUE opacity = TRUE +/obj/structure/bookcase/deconstruct(disassembled) + new /obj/item/stack/sheet/metal(loc) + return ..() + +/obj/structure/bookcase/attack_alien(mob/living/carbon/xenomorph/xeno) + if(xeno.a_intent == INTENT_HARM) + if(unslashable) + return + xeno.animation_attack_on(src) + playsound(loc, 'sound/effects/metalhit.ogg', 25, 1) + xeno.visible_message(SPAN_DANGER("[xeno] slices [src] apart!"), + SPAN_DANGER("We slice [src] apart!"), null, 5, CHAT_TYPE_XENO_COMBAT) + deconstruct(FALSE) + return XENO_ATTACK_ACTION + else + attack_hand(xeno) + return XENO_NONCOMBAT_ACTION + /obj/structure/bookcase/Initialize() . = ..() for(var/obj/item/I in loc) @@ -20,12 +38,18 @@ O.forceMove(src) update_icon() else if(HAS_TRAIT(O, TRAIT_TOOL_PEN)) - var/newname = stripped_input(usr, "What would you like to title this bookshelf?") + var/newname = stripped_input(user, "What would you like to title this bookshelf?") if(!newname) return else name = ("bookcase ([strip_html(newname)])") playsound(src, "paper_writing", 15, TRUE) + else if(HAS_TRAIT(O, TRAIT_TOOL_WRENCH)) + playsound(loc, 'sound/items/Ratchet.ogg', 25, 1) + if(do_after(user, 1 SECONDS, INTERRUPT_MOVED, BUSY_ICON_FRIENDLY, src)) + user.visible_message("[user] deconstructs [src].", \ + "You deconstruct [src].", "You hear a noise.") + deconstruct(FALSE) else ..() @@ -33,7 +57,7 @@ if(contents.len) var/obj/item/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents if(choice) - if(usr.is_mob_incapacitated() || !in_range(loc, usr)) + if(user.is_mob_incapacitated() || !in_range(loc, user)) return if(ishuman(user)) if(!user.get_active_hand()) @@ -67,7 +91,7 @@ /obj/structure/bookcase/manuals/medical - name = "Medical Manuals bookcase" + name = "medical manuals bookcase" /obj/structure/bookcase/manuals/medical/Initialize() . = ..() @@ -78,7 +102,7 @@ /obj/structure/bookcase/manuals/engineering - name = "Engineering Manuals bookcase" + name = "engineering manuals bookcase" /obj/structure/bookcase/manuals/engineering/Initialize() . = ..() @@ -90,7 +114,7 @@ update_icon() /obj/structure/bookcase/manuals/research_and_development - name = "R&D Manuals bookcase" + name = "\improper R&D manuals bookcase" /obj/structure/bookcase/manuals/research_and_development/Initialize() . = ..() From e7f59eef09d2f32df2a44a54f4b4ff5043a60bba Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 3 May 2024 06:57:56 +0100 Subject: [PATCH 26/50] Automatic changelog for PR #6213 [ci skip] --- html/changelogs/AutoChangeLog-pr-6213.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6213.yml diff --git a/html/changelogs/AutoChangeLog-pr-6213.yml b/html/changelogs/AutoChangeLog-pr-6213.yml new file mode 100644 index 000000000000..450bf2bd2b79 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6213.yml @@ -0,0 +1,4 @@ +author: "iloveloopers" +delete-after: True +changes: + - qol: "Bookcases can now be wrenched or slashed to be deconstructed" \ No newline at end of file From 364c141c10386d75145b9f0ea0864c2476639d6a Mon Sep 17 00:00:00 2001 From: AndroBetel <44546836+AndroBetel@users.noreply.github.com> Date: Fri, 3 May 2024 09:08:12 +0300 Subject: [PATCH 27/50] pointing at an item in your hands shows it off (#6207) # About the pull request just like that "Show held item" verb # Explain why it's good for the game it's hard for me personally to find that verb in object tab sooooo # Testing Photographs and Procedure
Screenshots & Videos yep...
# Changelog :cl: qol: Pointing at an item in your hands shows it off. /:cl: --------- Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> Co-authored-by: fira --- code/modules/mob/living/carbon/human/human.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 4e71b178824d..bc7d11c25e1f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1687,3 +1687,11 @@ INVOKE_ASYNC(target, TYPE_PROC_REF(/mob/living/carbon/human, regenerate_icons)) INVOKE_ASYNC(target, TYPE_PROC_REF(/mob/living/carbon/human, update_body), 1, 0) INVOKE_ASYNC(target, TYPE_PROC_REF(/mob/living/carbon/human, update_hair)) + +/mob/living/carbon/human/point_to_atom(atom/A, turf/T) + if(isitem(A)) + var/obj/item/item = A + if(item == get_active_hand() || item == get_inactive_hand()) + item.showoff(src) + return TRUE + return ..() From 56d8ebe18ff463ae130b4f5ef9eea75bb605206d Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 3 May 2024 07:13:32 +0100 Subject: [PATCH 28/50] Automatic changelog for PR #6207 [ci skip] --- html/changelogs/AutoChangeLog-pr-6207.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6207.yml diff --git a/html/changelogs/AutoChangeLog-pr-6207.yml b/html/changelogs/AutoChangeLog-pr-6207.yml new file mode 100644 index 000000000000..48cd0acf3852 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6207.yml @@ -0,0 +1,4 @@ +author: "AndroBetel" +delete-after: True +changes: + - qol: "Pointing at an item in your hands shows it off." \ No newline at end of file From 0dc2987b3b8629626b278787eb2d4d5ebb482228 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Thu, 2 May 2024 23:45:22 -0700 Subject: [PATCH 29/50] Fix weeded corpses on shuttles (#6227) # About the pull request This PR resolves an issue where dropships were causing the `parent_turf` is mismatch with the mob's actual `loc` because a shuttle launch changes the turf of its contents, but doesn't call the `COMSIG_MOVABLE_MOVED` signal making the corpse location incorrect. I also renamed a cosmig signal to comsig that I previously created for weed_food. E.g. ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/ec02ad02-753c-4404-a971-10fb6a5453f0) # Explain why it's good for the game Fixes #6220 # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Drathek fix: Fixed weeded corpses staying weeded if they were transported by shuttle /:cl: --- .../__DEFINES/dcs/signals/atom/signals_obj.dm | 2 +- code/datums/components/weed_food.dm | 22 +++++++++---------- code/game/objects/objs.dm | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/code/__DEFINES/dcs/signals/atom/signals_obj.dm b/code/__DEFINES/dcs/signals/atom/signals_obj.dm index ed27c26b2115..af541144ffc2 100644 --- a/code/__DEFINES/dcs/signals/atom/signals_obj.dm +++ b/code/__DEFINES/dcs/signals/atom/signals_obj.dm @@ -30,7 +30,7 @@ #define COMSIG_TENT_COLLAPSING "tent_collapsing" /// from /obj/proc/afterbuckle() -#define COSMIG_OBJ_AFTER_BUCKLE "signal_obj_after_buckle" +#define COMSIG_OBJ_AFTER_BUCKLE "signal_obj_after_buckle" /// from /obj/structure/machinery/cryopod/go_out() #define COMSIG_CRYOPOD_GO_OUT "cryopod_go_out" diff --git a/code/datums/components/weed_food.dm b/code/datums/components/weed_food.dm index 8737fba08db9..ce6fe35e4a28 100644 --- a/code/datums/components/weed_food.dm +++ b/code/datums/components/weed_food.dm @@ -87,7 +87,7 @@ parent_buckle = null /datum/component/weed_food/RegisterWithParent() - RegisterSignal(parent_mob, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + RegisterSignal(parent_mob, COMSIG_MOVABLE_TURF_ENTERED, PROC_REF(on_move)) RegisterSignal(parent_mob, list(COMSIG_LIVING_REJUVENATED, COMSIG_HUMAN_REVIVED), PROC_REF(on_rejuv)) RegisterSignal(parent_mob, COMSIG_HUMAN_SET_UNDEFIBBABLE, PROC_REF(on_update)) RegisterSignal(parent_mob, COMSIG_LIVING_PREIGNITION, PROC_REF(on_preignition)) @@ -98,7 +98,7 @@ /datum/component/weed_food/UnregisterFromParent() if(parent_mob) UnregisterSignal(parent_mob, list( - COMSIG_MOVABLE_MOVED, + COMSIG_MOVABLE_TURF_ENTERED, COMSIG_LIVING_REJUVENATED, COMSIG_HUMAN_REVIVED, COMSIG_HUMAN_SET_UNDEFIBBABLE, @@ -109,12 +109,12 @@ if(parent_turf) UnregisterSignal(parent_turf, COMSIG_WEEDNODE_GROWTH) if(parent_buckle) - UnregisterSignal(parent_buckle, COSMIG_OBJ_AFTER_BUCKLE) + UnregisterSignal(parent_buckle, COMSIG_OBJ_AFTER_BUCKLE) if(parent_nest) UnregisterSignal(parent_nest, COMSIG_PARENT_QDELETING) UnregisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING) -/// SIGNAL_HANDLER for COMSIG_MOVABLE_MOVED +/// SIGNAL_HANDLER for COMSIG_MOVABLE_TURF_ENTERED /datum/component/weed_food/proc/on_move() SIGNAL_HANDLER @@ -148,7 +148,7 @@ qdel(src) -/// SIGNAL_HANDLER for COSMIG_OBJ_AFTER_BUCKLE +/// SIGNAL_HANDLER for COMSIG_OBJ_AFTER_BUCKLE /datum/component/weed_food/proc/on_after_buckle(obj/source, mob/buckled) SIGNAL_HANDLER @@ -220,12 +220,12 @@ return FALSE // Still buckled to the same thing if(!istype(parent_mob.buckled, /obj/structure/bed/nest)) if(parent_buckle) // Still have a lingering reference somehow? - UnregisterSignal(parent_buckle, COSMIG_OBJ_AFTER_BUCKLE) + UnregisterSignal(parent_buckle, COMSIG_OBJ_AFTER_BUCKLE) parent_buckle = parent_mob.buckled - RegisterSignal(parent_mob.buckled, COSMIG_OBJ_AFTER_BUCKLE, PROC_REF(on_after_buckle)) + RegisterSignal(parent_mob.buckled, COMSIG_OBJ_AFTER_BUCKLE, PROC_REF(on_after_buckle)) return FALSE if(parent_buckle) - UnregisterSignal(parent_buckle, COSMIG_OBJ_AFTER_BUCKLE) + UnregisterSignal(parent_buckle, COMSIG_OBJ_AFTER_BUCKLE) parent_buckle = null if(parent_mob.is_xeno_grabbable()) @@ -282,16 +282,16 @@ return FALSE // Still buckled to the same thing somehow? if(!istype(parent_mob.buckled, /obj/structure/bed/nest)) if(parent_buckle) // Still have a lingering reference somehow? - UnregisterSignal(parent_buckle, COSMIG_OBJ_AFTER_BUCKLE) + UnregisterSignal(parent_buckle, COMSIG_OBJ_AFTER_BUCKLE) parent_buckle = parent_mob.buckled - RegisterSignal(parent_mob.buckled, COSMIG_OBJ_AFTER_BUCKLE, PROC_REF(on_after_buckle)) + RegisterSignal(parent_mob.buckled, COMSIG_OBJ_AFTER_BUCKLE, PROC_REF(on_after_buckle)) return FALSE else parent_nest = parent_mob.buckled RegisterSignal(parent_nest, COMSIG_PARENT_QDELETING, PROC_REF(on_nest_deletion)) if(parent_buckle) - UnregisterSignal(parent_buckle, COSMIG_OBJ_AFTER_BUCKLE) + UnregisterSignal(parent_buckle, COMSIG_OBJ_AFTER_BUCKLE) parent_buckle = null if(SEND_SIGNAL(parent_mob, COMSIG_ATTEMPT_MOB_PULL) & COMPONENT_CANCEL_MOB_PULL) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 66b41fff9127..70dc5ff1786d 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -234,7 +234,7 @@ /obj/proc/afterbuckle(mob/M as mob) // Called after somebody buckled / unbuckled handle_rotation() // To be removed when we have full dir support in set_buckled - SEND_SIGNAL(src, COSMIG_OBJ_AFTER_BUCKLE, buckled_mob) + SEND_SIGNAL(src, COMSIG_OBJ_AFTER_BUCKLE, buckled_mob) if(!buckled_mob) UnregisterSignal(M, COMSIG_PARENT_QDELETING) else From a5b2a08260ab1860719f18238c94fa793b24894a Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 3 May 2024 07:49:58 +0100 Subject: [PATCH 30/50] Automatic changelog for PR #6227 [ci skip] --- html/changelogs/AutoChangeLog-pr-6227.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6227.yml diff --git a/html/changelogs/AutoChangeLog-pr-6227.yml b/html/changelogs/AutoChangeLog-pr-6227.yml new file mode 100644 index 000000000000..4949430b2c69 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6227.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fixed weeded corpses staying weeded if they were transported by shuttle" \ No newline at end of file From 2722b9b893a6ecefc4a7bd6c88a3c686fe07bc2d Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Fri, 3 May 2024 07:47:20 +0100 Subject: [PATCH 31/50] Fixes Whitelist Notes (#6212) # About the pull request Makes whitelist notes actually usable. I put them in the game two years ago but they've been entirely non-functional since. # Explain why it's good for the game About time I fixed my crap code. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Whitelist notes now work properly. Council can add notes to players regarding whitelist issues. add: Changing whitelist flags with the Whitelist Panel now automatically adds a note with the reason. /:cl: --- code/__DEFINES/admin.dm | 8 ++-- code/datums/entities/player.dm | 19 +++++--- code/game/jobs/whitelist.dm | 7 ++- code/game/verbs/records.dm | 70 ++++++++--------------------- code/modules/admin/admin.dm | 6 +-- code/modules/admin/admin_verbs.dm | 1 + code/modules/client/client_procs.dm | 28 +++--------- 7 files changed, 46 insertions(+), 93 deletions(-) diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 31103fee93ee..3137088d1c90 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -17,12 +17,10 @@ #define NOTE_ADMIN 1 ///This note is used by staff for positive record keeping. #define NOTE_MERIT 2 -///These notes are used by respective whitelist councils for record keeping. -#define NOTE_COMMANDER 3 -#define NOTE_SYNTHETIC 4 -#define NOTE_YAUTJA 5 +///These notes are automatically applied by the Whitelist Panel. +#define NOTE_WHITELIST 3 ///Note categories in text form, in order of their numerical #defines. -GLOBAL_LIST_INIT(note_categories, list("Admin", "Merit", "Commanding Officer", "Synthetic", "Yautja")) +GLOBAL_LIST_INIT(note_categories, list("Admin", "Merit", "Whitelist")) #define ADMIN_FLW(user) "(FLW)" #define ADMIN_PP(user) "(PP)" diff --git a/code/datums/entities/player.dm b/code/datums/entities/player.dm index aefa81672b54..a62e663ba21c 100644 --- a/code/datums/entities/player.dm +++ b/code/datums/entities/player.dm @@ -90,11 +90,12 @@ BSQL_PROTECT_DATUM(/datum/entity/player) /datum/entity/player/proc/add_note(note_text, is_confidential, note_category = NOTE_ADMIN, is_ban = FALSE, duration = null) var/client/admin = usr.client // do all checks here, especially for sensitive stuff like this - if(!admin || !admin.player_data) - return FALSE - if(note_category == NOTE_ADMIN || is_confidential) - if (!AHOLD_IS_MOD(admin.admin_holder)) + if(!(note_category == NOTE_WHITELIST)) + if(!admin || !admin.player_data) return FALSE + if(note_category == NOTE_ADMIN || is_confidential) + if (!AHOLD_IS_MOD(admin.admin_holder)) + return FALSE // this is here for a short transition period when we still are testing DB notes and constantly deleting the file if(CONFIG_GET(flag/duplicate_notes_to_file)) @@ -119,7 +120,7 @@ BSQL_PROTECT_DATUM(/datum/entity/player) note.note_category = note_category note.is_ban = is_ban note.ban_time = duration - note.admin_rank = admin.admin_holder.rank + note.admin_rank = admin.admin_holder ? admin.admin_holder.rank : "Non-Staff" // since admin is in game, their player_data has to be populated. This is also checked above note.admin_id = admin.player_data.id note.admin = admin.player_data @@ -134,13 +135,17 @@ BSQL_PROTECT_DATUM(/datum/entity/player) notes.Add(note) return TRUE -/datum/entity/player/proc/remove_note(note_id) +/datum/entity/player/proc/remove_note(note_id, whitelist = FALSE) + if(IsAdminAdvancedProcCall()) + return PROC_BLOCKED var/client/admin = usr.client // do all checks here, especially for sensitive stuff like this if(!admin || !admin.player_data) return FALSE - if (!AHOLD_IS_MOD(admin.admin_holder)) + if((!AHOLD_IS_MOD(admin.admin_holder)) && !whitelist) + return FALSE + if(whitelist && !(isSenator(admin) || CLIENT_HAS_RIGHTS(admin, R_PERMISSIONS))) return FALSE // this is here for a short transition period when we still are testing DB notes and constantly deleting the file diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index 09db84fec2c2..8cd91a494c83 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -24,6 +24,8 @@ if(isSenator(src)) add_verb(src, /client/proc/whitelist_panel) + if(isCouncil(src)) + add_verb(src, /client/proc/other_records) /client var/datum/whitelist_panel/wl_panel @@ -144,8 +146,10 @@ GLOBAL_LIST_INIT(misc_flags, list( /datum/whitelist_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) - return + return FALSE var/mob/user = ui.user + if(!isSenator(user.client) && !CLIENT_HAS_RIGHTS(user.client, R_PERMISSIONS)) + return FALSE switch(action) if("go_back") go_back() @@ -165,6 +169,7 @@ GLOBAL_LIST_INIT(misc_flags, list( return var/datum/entity/player/player = get_player_from_key(player_key) player.set_whitelist_status(new_rights) + player.add_note("Whitelists updated by [user.key]. Reason: '[reason]'.", FALSE, NOTE_WHITELIST) to_chat(user, SPAN_HELPFUL("Whitelists for [player_key] updated.")) message_admins("Whitelists for [player_key] updated by [key_name(user)]. Reason: '[reason]'.") log_admin("WHITELISTS: Flags for [player_key] changed from [target_rights] to [new_rights]. Reason: '[reason]'.") diff --git a/code/game/verbs/records.dm b/code/game/verbs/records.dm index 05506804790a..3810bf7e99cb 100644 --- a/code/game/verbs/records.dm +++ b/code/game/verbs/records.dm @@ -1,10 +1,8 @@ -//CO Whitelist is '1', Synthetic Whitelist is '2', Yautja Whitelist is '3'. - /client/verb/own_records() set name = "View Own Records" set category = "OOC.Records" - var/list/options = list("Admin", "Merit", "Commanding Officer", "Synthetic", "Yautja") + var/list/options = list("Admin", "Merit", "Whitelist") var/choice = tgui_input_list(usr, "What record do you wish to view?", "Record Choice", options) switch(choice) @@ -12,12 +10,8 @@ show_own_notes(NOTE_ADMIN, choice) if("Merit") show_own_notes(NOTE_MERIT, choice) - if("Commanding Officer") - show_own_notes(NOTE_COMMANDER, choice) - if("Synthetic") - show_own_notes(NOTE_SYNTHETIC, choice) - if("Yautja") - show_own_notes(NOTE_YAUTJA, choice) + if("Whitelist") + show_own_notes(NOTE_WHITELIST, choice) else return to_chat(usr, SPAN_NOTICE("Displaying your [choice] Record.")) @@ -46,12 +40,8 @@ switch(note_category) if(NOTE_MERIT) color = "#9e3dff" - if(NOTE_COMMANDER) + if(NOTE_WHITELIST) color = "#324da5" - if(NOTE_SYNTHETIC) - color = "#39e7a4" - if(NOTE_YAUTJA) - color = "#114e11" dat += "[N.text] by [admin_ckey] ([N.admin_rank]) on [N.date] [NOTE_ROUND_ID(N)] " dat += "

" @@ -69,16 +59,15 @@ //Contributions and suggestions are welcome. //Kindly, forest2001 -/client/verb/other_records() +/client/proc/other_records() set name = "View Target Records" set category = "OOC.Records" ///Management Access - var/MA + var/manager = FALSE ///Edit Access - var/edit_C = FALSE - var/edit_S = FALSE - var/edit_Y = FALSE + var/add_wl = FALSE + var/del_wl = FALSE ///Note category options var/list/options = list() @@ -86,7 +75,7 @@ if(CLIENT_IS_STAFF(src)) options = GLOB.note_categories.Copy() if(admin_holder.rights & R_PERMISSIONS) - MA = TRUE + manager = TRUE else if(!isCouncil(src)) to_chat(usr, SPAN_WARNING("Error: you are not authorised to view the records of another player!")) return @@ -97,15 +86,11 @@ return target = ckey(target) - if(check_whitelist_status(WHITELIST_COMMANDER_COUNCIL)) - options |= "Commanding Officer" - edit_C = TRUE - if(check_whitelist_status(WHITELIST_SYNTHETIC_COUNCIL)) - options |= "Synthetic" - edit_S = TRUE - if(check_whitelist_status(WHITELIST_YAUTJA_COUNCIL)) - options |= "Yautja" - edit_Y = TRUE + if(manager || isCouncil(src)) + options |= "Whitelist" + add_wl = TRUE + if(manager || isSenator(src)) + del_wl = TRUE var/choice = tgui_input_list(usr, "What record do you wish to view?", "Record Choice", options) if(!choice) @@ -115,21 +100,8 @@ show_other_record(NOTE_ADMIN, choice, target, TRUE) if("Merit") show_other_record(NOTE_MERIT, choice, target, TRUE) - if("Commanding Officer") - if(MA || check_whitelist_status(WHITELIST_COMMANDER_LEADER)) - show_other_record(NOTE_COMMANDER, choice, target, TRUE, TRUE) - else - show_other_record(NOTE_COMMANDER, choice, target, edit_C) - if("Synthetic") - if(MA || check_whitelist_status(WHITELIST_SYNTHETIC_LEADER)) - show_other_record(NOTE_SYNTHETIC, choice, target, TRUE, TRUE) - else - show_other_record(NOTE_SYNTHETIC, choice, target, edit_S) - if("Yautja") - if(MA || check_whitelist_status(WHITELIST_YAUTJA_LEADER)) - show_other_record(NOTE_YAUTJA, choice, target, TRUE, TRUE) - else - show_other_record(NOTE_YAUTJA, choice, target, edit_Y) + if("Whitelist") + show_other_record(NOTE_WHITELIST, choice, target, add_wl, del_wl) to_chat(usr, SPAN_NOTICE("Displaying [target]'s [choice] notes.")) @@ -148,15 +120,9 @@ if(NOTE_MERIT) color = "#9e3dff" add_dat = "Add Merit Note
" - if(NOTE_COMMANDER) + if(NOTE_WHITELIST) color = "#324da5" - add_dat = "Add Commander Note
" - if(NOTE_SYNTHETIC) - color = "#39e7a4" - add_dat = "Add Synthetic Note
" - if(NOTE_YAUTJA) - color = "#114e11" - add_dat = "Add Yautja Note
" + add_dat = "Add Whitelist Note
" var/list/datum/view_record/note_view/NL = DB_VIEW(/datum/view_record/note_view, DB_COMP("player_ckey", DB_EQUALS, target)) for(var/datum/view_record/note_view/N as anything in NL) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 4194627262a4..979217019f0c 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -95,12 +95,8 @@ color = "#AA0055" else if(N.note_category == NOTE_MERIT) color = "#9e3dff" - else if(N.note_category == NOTE_COMMANDER) + else if(N.note_category == NOTE_WHITELIST) color = "#324da5" - else if(N.note_category == NOTE_SYNTHETIC) - color = "#39e7a4" - else if(N.note_category == NOTE_YAUTJA) - color = "#114e11" dat += "[N.text] by [admin_ckey] ([N.admin_rank])[confidential_text] on [N.date] [NOTE_ROUND_ID(N)] " if(admin_ckey == usr.ckey || admin_ckey == "Adminbot" || check_for_rights(R_PERMISSIONS)) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index da95fc090da8..aa87f157173c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -72,6 +72,7 @@ GLOBAL_LIST_INIT(admin_verbs_default, list( /client/proc/cmd_admin_say, /*staff-only ooc chat*/ /client/proc/cmd_mod_say, /* alternate way of typing asay, no different than cmd_admin_say */ /client/proc/cmd_admin_tacmaps_panel, + /client/proc/other_records, )) GLOBAL_LIST_INIT(admin_verbs_admin, list( diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 213c54f0e201..6afbfa695db2 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -187,39 +187,21 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( var/datum/entity/player/P = get_player_from_key(key) P.add_note(add, FALSE, NOTE_MERIT) - if(href_list["add_wl_info_1"]) - var/key = href_list["add_wl_info_1"] - var/add = input("Add Commander Note") as null|message + if(href_list["add_wl_info"]) + var/key = href_list["add_wl_info"] + var/add = input("Add Whitelist Note") as null|message if(!add) return var/datum/entity/player/P = get_player_from_key(key) - P.add_note(add, FALSE, NOTE_COMMANDER) - - if(href_list["add_wl_info_2"]) - var/key = href_list["add_wl_info_2"] - var/add = input("Add Synthetic Note") as null|message - if(!add) - return - - var/datum/entity/player/P = get_player_from_key(key) - P.add_note(add, FALSE, NOTE_SYNTHETIC) - - if(href_list["add_wl_info_3"]) - var/key = href_list["add_wl_info_3"] - var/add = input("Add Yautja Note") as null|message - if(!add) - return - - var/datum/entity/player/P = get_player_from_key(key) - P.add_note(add, FALSE, NOTE_YAUTJA) + P.add_note(add, FALSE, NOTE_WHITELIST) if(href_list["remove_wl_info"]) var/key = href_list["remove_wl_info"] var/index = text2num(href_list["remove_index"]) var/datum/entity/player/P = get_player_from_key(key) - P.remove_note(index) + P.remove_note(index, whitelist = TRUE) switch(href_list["_src_"]) if("admin_holder") From 5d408394f83c971c956aeccf11e5502227cad612 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 3 May 2024 07:56:50 +0100 Subject: [PATCH 32/50] Automatic changelog for PR #6212 [ci skip] --- html/changelogs/AutoChangeLog-pr-6212.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6212.yml diff --git a/html/changelogs/AutoChangeLog-pr-6212.yml b/html/changelogs/AutoChangeLog-pr-6212.yml new file mode 100644 index 000000000000..24e67e6d690e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6212.yml @@ -0,0 +1,5 @@ +author: "realforest2001" +delete-after: True +changes: + - bugfix: "Whitelist notes now work properly. Council can add notes to players regarding whitelist issues." + - rscadd: "Changing whitelist flags with the Whitelist Panel now automatically adds a note with the reason." \ No newline at end of file From cc49556b48a1913bd1da5c5f238c9510ee250107 Mon Sep 17 00:00:00 2001 From: Vero <73014819+vero5123@users.noreply.github.com> Date: Fri, 3 May 2024 16:52:58 -0700 Subject: [PATCH 33/50] Fixes burrower being able to tunnel across the map (#6231) # About the pull request Fixes #6141. # Changelog :cl: fix: Burrower can no longer tunnel across the map. /:cl: --------- Co-authored-by: DOOM --- code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm | 4 ++++ .../carbon/xenomorph/abilities/burrower/burrower_powers.dm | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm b/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm index 0b0efbc0f34f..0da2b61142e8 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm @@ -93,6 +93,10 @@ to_chat(src, SPAN_XENOWARNING("Our sister's psychic connection is cut off!")) return + if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) + to_chat(src, SPAN_XENOWARNING("We cannot do this in our current state!")) + return + if(observed_xeno && targetXeno && observed_xeno == targetXeno) if(istype(targetXeno, /obj/effect/alien/resin/marker)) to_chat(src, SPAN_XENOWARNING("We are already watching that mark!")) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm index f854272365d0..ee084e77a5a0 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm @@ -126,7 +126,7 @@ return var/area/A = get_area(T) - if(A.flags_area & AREA_NOTUNNEL) + if(A.flags_area & AREA_NOTUNNEL || get_dist(src, T) > 15) to_chat(src, SPAN_XENOWARNING("There's no way to tunnel over there.")) return From 36bdaa2fe8661a751d8ea35871fe98d2d1e723cc Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 4 May 2024 00:57:39 +0100 Subject: [PATCH 34/50] Automatic changelog for PR #6231 [ci skip] --- html/changelogs/AutoChangeLog-pr-6231.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6231.yml diff --git a/html/changelogs/AutoChangeLog-pr-6231.yml b/html/changelogs/AutoChangeLog-pr-6231.yml new file mode 100644 index 000000000000..1731d0b1bc0a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6231.yml @@ -0,0 +1,4 @@ +author: "vero5123" +delete-after: True +changes: + - bugfix: "Burrower can no longer tunnel across the map." \ No newline at end of file From ac173af64a00dfa007a4ba25b17ebad9f7ef49a4 Mon Sep 17 00:00:00 2001 From: BasilHerb <168701329+BasilHerb@users.noreply.github.com> Date: Sat, 4 May 2024 09:53:06 +1000 Subject: [PATCH 35/50] Adds Type 80 UPP bayonets to CLF who lack knives (#6228) # About the pull request The purpose of this PR is to add knives to the CLF ERTs who currently lack them. I have tested these changes on a private server, spawning each CLF mob and looking at whether they have bayonets or not. To the extent of my knowledge, all CLF should now spawn with bayonets on their mouth, with exception to the CLF Cell Commander (who has UPP boots), and the CLF Survivor (who spawns with an M5 raider knife, which I do not know how to change.) # Explain why it's good for the game Dying to shrapnel because you got shot once by PVT Stanley or your teammate is extremely sad and depressing, and by adding knives we will finally be free of this oppression. Also, loads of people keep complaining about it. # Testing Photographs and Procedure ![Screenshot 2024-05-02 174638](https://github.com/cmss13-devs/cmss13/assets/168701329/e95bc3df-ea51-49b7-b96d-c1feee03ab49) # Changelog :cl: add: Type 80 bayonet to the mouths of the following mobs: CLF Soldier, CLF Specialist, CLF Medic, CLF Engineer, CLF Leader. /:cl: --- code/modules/gear_presets/clf.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/gear_presets/clf.dm b/code/modules/gear_presets/clf.dm index 143a2271f00e..bb168f22457b 100644 --- a/code/modules/gear_presets/clf.dm +++ b/code/modules/gear_presets/clf.dm @@ -71,6 +71,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/shotgun/full/random(new_human), WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/pump/dual_tube/cmb(new_human), WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/attachable/bayonet/upp(new_human), WEAR_FACE) if(prob(50)) spawn_rebel_smg(new_human) else @@ -176,6 +177,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/welding, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/utility/full(new_human), WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/CLF/cct, WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/attachable/bayonet/upp(new_human), WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/engineerpack/ert, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK) @@ -300,6 +302,7 @@ new_human.equip_to_slot_or_del(new /obj/item/roller, WEAR_IN_BELT) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/CLF/medic(new_human), WEAR_L_EAR) + new_human.equip_to_slot_or_del(new /obj/item/attachable/bayonet/upp(new_human), WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/ied(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK) @@ -455,6 +458,7 @@ //clothing new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/militia(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/swat(new_human), WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/attachable/bayonet/upp(new_human), WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(new_human), WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/m4a3/mod88(new_human), WEAR_WAIST) @@ -574,6 +578,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/colonist/clf(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/militia(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/sec/hos(new_human), WEAR_HEAD) + new_human.equip_to_slot_or_del(new /obj/item/attachable/bayonet/upp(new_human), WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(new_human), WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine(new_human), WEAR_WAIST) From ac98cd4484d5dc0175e9a93ee97a6d64c58fabe4 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 4 May 2024 01:04:31 +0100 Subject: [PATCH 36/50] Automatic changelog for PR #6228 [ci skip] --- html/changelogs/AutoChangeLog-pr-6228.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6228.yml diff --git a/html/changelogs/AutoChangeLog-pr-6228.yml b/html/changelogs/AutoChangeLog-pr-6228.yml new file mode 100644 index 000000000000..ce5691253940 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6228.yml @@ -0,0 +1,4 @@ +author: "BasilHerb" +delete-after: True +changes: + - rscadd: "Type 80 bayonet to the mouths of the following mobs: CLF Soldier, CLF Specialist, CLF Medic, CLF Engineer, CLF Leader." \ No newline at end of file From 0ed622c14923d2c8852bc0ed97d29be2c55dbe8b Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 4 May 2024 01:10:02 +0000 Subject: [PATCH 37/50] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6197.yml | 4 --- html/changelogs/AutoChangeLog-pr-6207.yml | 4 --- html/changelogs/AutoChangeLog-pr-6209.yml | 4 --- html/changelogs/AutoChangeLog-pr-6212.yml | 5 ---- html/changelogs/AutoChangeLog-pr-6213.yml | 4 --- html/changelogs/AutoChangeLog-pr-6214.yml | 5 ---- html/changelogs/AutoChangeLog-pr-6218.yml | 4 --- html/changelogs/AutoChangeLog-pr-6221.yml | 6 ----- html/changelogs/AutoChangeLog-pr-6222.yml | 4 --- html/changelogs/AutoChangeLog-pr-6223.yml | 4 --- html/changelogs/AutoChangeLog-pr-6224.yml | 4 --- html/changelogs/AutoChangeLog-pr-6226.yml | 4 --- html/changelogs/AutoChangeLog-pr-6227.yml | 4 --- html/changelogs/AutoChangeLog-pr-6228.yml | 4 --- html/changelogs/AutoChangeLog-pr-6231.yml | 4 --- html/changelogs/archive/2024-05.yml | 33 +++++++++++++++++++++++ 16 files changed, 33 insertions(+), 64 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6197.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6207.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6209.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6212.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6213.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6214.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6218.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6221.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6222.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6223.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6224.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6226.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6227.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6228.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6231.yml diff --git a/html/changelogs/AutoChangeLog-pr-6197.yml b/html/changelogs/AutoChangeLog-pr-6197.yml deleted file mode 100644 index 76106b8578cc..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6197.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Git-Nivrak" -delete-after: True -changes: - - bugfix: "Synths no longer get affected by boiler's neurotoxin" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6207.yml b/html/changelogs/AutoChangeLog-pr-6207.yml deleted file mode 100644 index 48cd0acf3852..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6207.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AndroBetel" -delete-after: True -changes: - - qol: "Pointing at an item in your hands shows it off." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6209.yml b/html/changelogs/AutoChangeLog-pr-6209.yml deleted file mode 100644 index 43d06d293a8f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6209.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kivts" -delete-after: True -changes: - - bugfix: "Infinite metal oversight fix." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6212.yml b/html/changelogs/AutoChangeLog-pr-6212.yml deleted file mode 100644 index 24e67e6d690e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6212.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - bugfix: "Whitelist notes now work properly. Council can add notes to players regarding whitelist issues." - - rscadd: "Changing whitelist flags with the Whitelist Panel now automatically adds a note with the reason." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6213.yml b/html/changelogs/AutoChangeLog-pr-6213.yml deleted file mode 100644 index 450bf2bd2b79..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6213.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "iloveloopers" -delete-after: True -changes: - - qol: "Bookcases can now be wrenched or slashed to be deconstructed" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6214.yml b/html/changelogs/AutoChangeLog-pr-6214.yml deleted file mode 100644 index 299816c889a6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6214.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - rscadd: "Added skillsets specific to WY Goons." - - rscadd: "Added a WY Goon Engineer preset." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6218.yml b/html/changelogs/AutoChangeLog-pr-6218.yml deleted file mode 100644 index e2f506c6a2e5..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6218.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "iloveloopers" -delete-after: True -changes: - - balance: "Kutjevo ledges now take only 0.2 seconds to climb instead of 1 whole second" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6221.yml b/html/changelogs/AutoChangeLog-pr-6221.yml deleted file mode 100644 index c23424f146c1..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6221.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "coldironwarrior" -delete-after: True -changes: - - rscadd: "Added eyewear options, more glove options to the SEA vendor" - - rscadd: "SEAs now get full versions of the utility holster belt" - - rscdel: "Removed the CPR dummy from the SEA vendor" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6222.yml b/html/changelogs/AutoChangeLog-pr-6222.yml deleted file mode 100644 index d2a49c8ea8db..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6222.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "vero5123" -delete-after: True -changes: - - bugfix: "Fixes microwave food duplication" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6223.yml b/html/changelogs/AutoChangeLog-pr-6223.yml deleted file mode 100644 index 19f214273ef6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6223.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "vero5123" -delete-after: True -changes: - - bugfix: "Fixes sentries firing at xenos while vent crawling." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6224.yml b/html/changelogs/AutoChangeLog-pr-6224.yml deleted file mode 100644 index 7aa42719c371..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6224.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "vero5123" -delete-after: True -changes: - - bugfix: "Fixes scout being able to be decapitated with a helmet on while cloaked." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6226.yml b/html/changelogs/AutoChangeLog-pr-6226.yml deleted file mode 100644 index 7acfc4e24fee..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6226.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "vero5123" -delete-after: True -changes: - - bugfix: "fixes hugger not dying when squished by predator" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6227.yml b/html/changelogs/AutoChangeLog-pr-6227.yml deleted file mode 100644 index 4949430b2c69..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6227.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fixed weeded corpses staying weeded if they were transported by shuttle" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6228.yml b/html/changelogs/AutoChangeLog-pr-6228.yml deleted file mode 100644 index ce5691253940..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6228.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BasilHerb" -delete-after: True -changes: - - rscadd: "Type 80 bayonet to the mouths of the following mobs: CLF Soldier, CLF Specialist, CLF Medic, CLF Engineer, CLF Leader." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6231.yml b/html/changelogs/AutoChangeLog-pr-6231.yml deleted file mode 100644 index 1731d0b1bc0a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6231.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "vero5123" -delete-after: True -changes: - - bugfix: "Burrower can no longer tunnel across the map." \ No newline at end of file diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml index 2de916ae3976..b13a2d13046d 100644 --- a/html/changelogs/archive/2024-05.yml +++ b/html/changelogs/archive/2024-05.yml @@ -42,3 +42,36 @@ - spellcheck: New flavor text and better strain information realforest2001: - rscadd: Added the name of an announcement sender, if one exists, to ARES logs. +2024-05-04: + AndroBetel: + - qol: Pointing at an item in your hands shows it off. + BasilHerb: + - rscadd: 'Type 80 bayonet to the mouths of the following mobs: CLF Soldier, CLF + Specialist, CLF Medic, CLF Engineer, CLF Leader.' + Drathek: + - bugfix: Fixed weeded corpses staying weeded if they were transported by shuttle + Git-Nivrak: + - bugfix: Synths no longer get affected by boiler's neurotoxin + coldironwarrior: + - rscadd: Added eyewear options, more glove options to the SEA vendor + - rscadd: SEAs now get full versions of the utility holster belt + - rscdel: Removed the CPR dummy from the SEA vendor + iloveloopers: + - qol: Bookcases can now be wrenched or slashed to be deconstructed + - balance: Kutjevo ledges now take only 0.2 seconds to climb instead of 1 whole + second + kivts: + - bugfix: Infinite metal oversight fix. + realforest2001: + - bugfix: Whitelist notes now work properly. Council can add notes to players regarding + whitelist issues. + - rscadd: Changing whitelist flags with the Whitelist Panel now automatically adds + a note with the reason. + - rscadd: Added skillsets specific to WY Goons. + - rscadd: Added a WY Goon Engineer preset. + vero5123: + - bugfix: Fixes microwave food duplication + - bugfix: Fixes scout being able to be decapitated with a helmet on while cloaked. + - bugfix: Fixes sentries firing at xenos while vent crawling. + - bugfix: fixes hugger not dying when squished by predator + - bugfix: Burrower can no longer tunnel across the map. From 98d5943e45f4f032bd5eefa2e719d275f44ed0ad Mon Sep 17 00:00:00 2001 From: ihatethisengine <115417687+ihatethisengine@users.noreply.github.com> Date: Sun, 5 May 2024 05:43:33 +0300 Subject: [PATCH 38/50] SADAR backblast now takes xeno explosion resistance into accout (#6234) # About the pull request I really died to this. # Explain why it's good for the game More consistent. Also knockdown instead of just stun. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: ihatethisengine balance: SADAR backblast now knockdowns and is reduced by xeno explosion resistance /:cl: --- .../specialist/launcher/rocket_launcher.dm | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/code/modules/projectiles/guns/specialist/launcher/rocket_launcher.dm b/code/modules/projectiles/guns/specialist/launcher/rocket_launcher.dm index 356d0e6c3b48..1f0ae4aed571 100644 --- a/code/modules/projectiles/guns/specialist/launcher/rocket_launcher.dm +++ b/code/modules/projectiles/guns/specialist/launcher/rocket_launcher.dm @@ -189,12 +189,18 @@ smoke.set_up(1, 0, backblast_loc, turn(user.dir, 180)) smoke.start() playsound(src, 'sound/weapons/gun_rocketlauncher.ogg', 100, TRUE, 10) - for(var/mob/living/carbon/C in backblast_loc) - if(C.body_position == STANDING_UP && !HAS_TRAIT(C, TRAIT_EAR_PROTECTION)) //Have to be standing up to get the fun stuff - C.apply_damage(15, BRUTE) //The shockwave hurts, quite a bit. It can knock unarmored targets unconscious in real life - C.apply_effect(4, STUN) //For good measure - C.apply_effect(6, STUTTER) - C.emote("pain") + for(var/mob/living/carbon/mob in backblast_loc) + if(mob.body_position != STANDING_UP || HAS_TRAIT(mob, TRAIT_EAR_PROTECTION)) //Have to be standing up to get the fun stuff + continue + to_chat(mob, SPAN_BOLDWARNING("You got hit by the backblast!")) + mob.apply_damage(15, BRUTE) //The shockwave hurts, quite a bit. It can knock unarmored targets unconscious in real life + var/knockdown_amount = 6 + if(isxeno(mob)) + var/mob/living/carbon/xenomorph/xeno = mob + knockdown_amount = knockdown_amount * (1 - xeno.caste?.xeno_explosion_resistance / 100) + mob.KnockDown(knockdown_amount) + mob.apply_effect(6, STUTTER) + mob.emote("pain") //------------------------------------------------------- //M5 RPG'S MEAN FUCKING COUSIN From 6f381552ce9e43ffd3f371ca36a5b9064262db6b Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 5 May 2024 03:50:09 +0100 Subject: [PATCH 39/50] Automatic changelog for PR #6234 [ci skip] --- html/changelogs/AutoChangeLog-pr-6234.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6234.yml diff --git a/html/changelogs/AutoChangeLog-pr-6234.yml b/html/changelogs/AutoChangeLog-pr-6234.yml new file mode 100644 index 000000000000..fe86a6098af6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6234.yml @@ -0,0 +1,4 @@ +author: "ihatethisengine" +delete-after: True +changes: + - balance: "SADAR backblast now knockdowns and is reduced by xeno explosion resistance" \ No newline at end of file From 2c243940eceb9845249be3714af32e82670e7077 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Sun, 5 May 2024 05:46:49 +0300 Subject: [PATCH 40/50] Watcher nerf (#6237) # About the pull request Watcher facehugger strain now takes damage off weeds the same as the base variant # Explain why it's good for the game It's a straight up upgrade to the base variant + Metagaming afk marines \ open cades from ghost is cancer # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: balance: Watcher is now immobilized when zoomed out and loses health off weeds when not zoomed out /:cl: --------- Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- .../abilities/ability_helper_procs.dm | 4 ++++ .../facehugger/facehugger_abilities.dm | 5 +++++ .../abilities/facehugger/facehugger_powers.dm | 18 ++++++++++++++++++ .../xenomorph/abilities/general_abilities.dm | 3 +++ .../strains/castes/facehugger/watcher.dm | 14 ++++++++++++-- 5 files changed, 42 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm index 9bfc98a7091d..0990df678f61 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm @@ -195,6 +195,10 @@ client.pixel_x = -viewoffset client.pixel_y = 0 + for (var/datum/action/xeno_action/onclick/toggle_long_range/action in actions) + action.on_zoom_in() + return + /mob/living/carbon/xenomorph/proc/zoom_out() if(!client) return diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm index ee1fed3094a7..d60d292cba25 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm @@ -17,3 +17,8 @@ freeze_time = 5 freeze_play_sound = FALSE can_be_shield_blocked = TRUE + +/datum/action/xeno_action/onclick/toggle_long_range/facehugger + handles_movement = FALSE + should_delay = FALSE + ability_primacy = XENO_PRIMARY_ACTION_3 diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_powers.dm index 054762b3c7d4..6eef21c6d5af 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_powers.dm @@ -25,4 +25,22 @@ if(current_airlock.density) //if its CLOSED YOU'RE SCUTTLING AND CANNOT POUNCE!!! to_chat(owner, SPAN_WARNING("We cannot do that while squeezing and scuttling!")) return FALSE + + if(HAS_TRAIT(owner, TRAIT_IMMOBILIZED)) + to_chat(owner, SPAN_WARNING("We cannot do that while immobilized!")) + return FALSE + return ..() + +/datum/action/xeno_action/onclick/toggle_long_range/facehugger/on_zoom_out() + . = ..() + + var/mob/living/carbon/xenomorph/facehugger/facehugger = owner + REMOVE_TRAIT(facehugger, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Long-Range Sight")) + +/datum/action/xeno_action/onclick/toggle_long_range/facehugger/on_zoom_in() + . = ..() + + var/mob/living/carbon/xenomorph/facehugger/facehugger = owner + ADD_TRAIT(facehugger, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Long-Range Sight")) + diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm index f36e23394eef..39b05b964648 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm @@ -329,6 +329,9 @@ xeno.recalculate_speed() button.icon_state = "template" +/datum/action/xeno_action/onclick/toggle_long_range/proc/on_zoom_in() + return + /datum/action/xeno_action/onclick/toggle_long_range/proc/handle_mob_move_or_look(mob/living/carbon/xenomorph/xeno, actually_moving, direction, specific_direction) SIGNAL_HANDLER movement_buffer-- diff --git a/code/modules/mob/living/carbon/xenomorph/strains/castes/facehugger/watcher.dm b/code/modules/mob/living/carbon/xenomorph/strains/castes/facehugger/watcher.dm index 7fba30b6f352..c5e1cff29c63 100644 --- a/code/modules/mob/living/carbon/xenomorph/strains/castes/facehugger/watcher.dm +++ b/code/modules/mob/living/carbon/xenomorph/strains/castes/facehugger/watcher.dm @@ -1,13 +1,13 @@ /datum/xeno_strain/watcher name = FACEHUGGER_WATCHER - description = "You lose your ability to hide in exchange to see further and the ability to no longer take damage outside of weeds. This enables you to stalk your host from a distance and wait for the perfect oppertunity to strike." + description = "You lose your ability to hide in exchange to see further. This enables you to stalk your host from a distance and wait for the perfect oppertunity to strike." flavor_description = "No need to hide when you can see the danger." actions_to_remove = list( /datum/action/xeno_action/onclick/xenohide, ) actions_to_add = list( - /datum/action/xeno_action/onclick/toggle_long_range/runner, + /datum/action/xeno_action/onclick/toggle_long_range/facehugger, ) behavior_delegate_type = /datum/behavior_delegate/facehugger_watcher @@ -19,3 +19,13 @@ // This has no special effects, it's just here to skip `/datum/behavior_delegate/facehugger_base/on_life()`. /datum/behavior_delegate/facehugger_watcher name = "Watcher Facehugger Behavior Delegate" + +/datum/behavior_delegate/facehugger_watcher/on_life() + // Sap health if we're standing, not on weeds, and not zoomed out + if(bound_xeno.body_position != STANDING_UP) + return + if(bound_xeno.is_zoomed) + return + if(locate(/obj/effect/alien/weeds) in get_turf(bound_xeno)) + return + bound_xeno.adjustBruteLoss(1) From aca1e69ddc7f2979b85cc0c621a79da079cd2a14 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 5 May 2024 03:57:25 +0100 Subject: [PATCH 41/50] Automatic changelog for PR #6237 [ci skip] --- html/changelogs/AutoChangeLog-pr-6237.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6237.yml diff --git a/html/changelogs/AutoChangeLog-pr-6237.yml b/html/changelogs/AutoChangeLog-pr-6237.yml new file mode 100644 index 000000000000..ec3774c75a02 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6237.yml @@ -0,0 +1,4 @@ +author: "Git-Nivrak" +delete-after: True +changes: + - balance: "Watcher is now immobilized when zoomed out and loses health off weeds when not zoomed out" \ No newline at end of file From 950df0069bbe07ce7f6969062f888beb3e844f91 Mon Sep 17 00:00:00 2001 From: s5nt <99336728+s5nt@users.noreply.github.com> Date: Sun, 5 May 2024 13:29:34 -0400 Subject: [PATCH 42/50] Adds a bunch of material to the pred ship and slightly adjusts layout to compensate. (#6172) # About the pull request Adds a bunch of material to the pred ship including more runed sandstone, normal sandstone, more metal, along with new items that spawn in pred storage which are stacks of wood, stacks of carpet tile, candle boxes, desk lamps, lanterns, gambling table parts, fancy wooden table parts, wooden table parts, poor wooden table parts, etc. Also adds more pred specific food to the pred kitchen for lodge decoration. Slightly adjusts pred ship layout to compensate, moving bracer storage to the other side to accommodate more racks for materials. Screenshot attached. # Explain why it's good for the game Allows preds to build larger and more impressive lodges (barely anybody builds lodges anyways), which provides more opportunity for RP and fun marine/xeno interactions with lodges rather than them just blowing into a room with a C4 and that being the entire lodge. Pred WL is self regulating in terms of stupidly/obstructively large lodges via pred council, obstructive lodges are essentially never an issue anyway. # Testing Photographs and Procedure
Screenshots & Videos ![image](https://github.com/cmss13-devs/cmss13/assets/99336728/e2ea15c9-1b77-43de-9b18-31405871285f)
# Changelog :cl: add: Added more materials to pred ship including more sandstone, wood, table parts, etc for lodge construction, along with more pred specific food to the pred kitchen. maptweak: Slightly expanded pred ship material storage area by moving bracer storage over to the left side of the ship. /:cl: --- maps/predship/huntership.dmm | 393 +++++++++++++++++++++++++++++++---- 1 file changed, 347 insertions(+), 46 deletions(-) diff --git a/maps/predship/huntership.dmm b/maps/predship/huntership.dmm index 7c5d633286f0..113f6448d3a8 100644 --- a/maps/predship/huntership.dmm +++ b/maps/predship/huntership.dmm @@ -525,6 +525,11 @@ /obj/item/stack/sheet/mineral/sandstone/large_stack, /obj/item/stack/sheet/mineral/sandstone/large_stack, /obj/item/stack/sheet/mineral/sandstone/large_stack, +/obj/item/stack/sheet/mineral/sandstone/large_stack, +/obj/item/stack/sheet/mineral/sandstone/large_stack, +/obj/item/stack/sheet/mineral/sandstone/large_stack, +/obj/item/stack/sheet/mineral/sandstone/large_stack, +/obj/item/stack/sheet/mineral/sandstone/large_stack, /turf/open/floor/corsat{ dir = 1; icon_state = "squareswood" @@ -844,6 +849,13 @@ icon_state = "squareswood" }, /area/yautja) +"bZ" = ( +/obj/item/storage/fancy/candle_box, +/turf/open/floor/corsat{ + dir = 1; + icon_state = "squareswood" + }, +/area/yautja) "ca" = ( /obj/structure/barricade/handrail/strata{ dir = 1 @@ -1029,6 +1041,18 @@ /obj/structure/closet/secure_closet/freezer/fridge{ locked = 0 }, +/obj/item/reagent_container/food/snacks/xemeatpie{ + name = "Elite Hunter's Xenopie" + }, +/obj/item/reagent_container/food/snacks/xemeatpie{ + name = "Elite Hunter's Xenopie" + }, +/obj/item/reagent_container/food/snacks/xemeatpie{ + name = "Elite Hunter's Xenopie" + }, +/obj/item/reagent_container/food/snacks/xemeatpie{ + name = "Elite Hunter's Xenopie" + }, /turf/open/floor{ dir = 10; icon_state = "darkred2" @@ -1343,6 +1367,29 @@ /obj/item/stack/sheet/mineral/sandstone/runed/large_stack, /obj/item/stack/sheet/mineral/sandstone/runed/large_stack, /obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, +/obj/item/stack/sheet/mineral/sandstone/runed/large_stack, /turf/open/floor/corsat{ dir = 1; icon_state = "squareswood" @@ -1547,6 +1594,12 @@ /obj/structure/closet/secure_closet/freezer/fridge{ locked = 0 }, +/obj/item/reagent_container/food/snacks/xemeatpie{ + name = "Elite Hunter's Xenopie" + }, +/obj/item/reagent_container/food/snacks/xemeatpie{ + name = "Elite Hunter's Xenopie" + }, /turf/open/floor{ dir = 1; icon_state = "darkred2" @@ -1734,6 +1787,30 @@ }, /turf/open/shuttle/predship, /area/yautja) +"fI" = ( +/obj/structure/surface/rack{ + color = "#6b675e"; + layer = 2.79 + }, +/obj/item/device/flashlight/lamp, +/obj/item/device/flashlight/lamp, +/obj/item/device/flashlight/lamp, +/obj/item/device/flashlight/lamp, +/obj/item/device/flashlight/lamp, +/obj/item/device/flashlight/lamp, +/obj/item/device/flashlight/lamp, +/obj/item/device/flashlight/lamp, +/obj/item/device/flashlight/lamp, +/obj/item/device/flashlight/lamp, +/obj/item/device/flashlight/lamp, +/obj/item/device/flashlight/lamp, +/obj/item/device/flashlight/lamp, +/obj/item/device/flashlight/lamp, +/turf/open/floor/corsat{ + dir = 1; + icon_state = "squareswood" + }, +/area/yautja) "fS" = ( /obj/structure/barricade/handrail/strata, /turf/open/gm/dirtgrassborder/weedable{ @@ -1807,8 +1884,32 @@ name = "Armory Shutters"; needs_power = 0; pixel_x = 24; - req_one_access_txt = "392"; - needs_power = 0 + req_one_access_txt = "392" + }, +/turf/open/floor/corsat{ + dir = 1; + icon_state = "squareswood" + }, +/area/yautja) +"gN" = ( +/obj/structure/surface/rack{ + color = "#6b675e"; + layer = 2.79 + }, +/obj/item/stack/tile/carpet{ + amount = 50 + }, +/obj/item/stack/tile/carpet{ + amount = 50 + }, +/obj/item/stack/tile/carpet{ + amount = 50 + }, +/obj/item/stack/tile/carpet{ + amount = 50 + }, +/obj/item/stack/tile/carpet{ + amount = 50 }, /turf/open/floor/corsat{ dir = 1; @@ -1859,6 +1960,11 @@ /obj/structure/kitchenspike, /obj/item/reagent_container/food/snacks/sliceable/xenomeatbread, /obj/item/reagent_container/food/snacks/sliceable/xenomeatbread, +/obj/item/reagent_container/food/snacks/sliceable/xenomeatbread, +/obj/item/reagent_container/food/snacks/sliceable/xenomeatbread, +/obj/item/reagent_container/food/snacks/sliceable/xenomeatbread, +/obj/item/reagent_container/food/snacks/sliceable/xenomeatbread, +/obj/item/reagent_container/food/snacks/sliceable/xenomeatbread, /turf/open/floor{ dir = 8; icon_state = "darkred2" @@ -1950,6 +2056,60 @@ icon_state = "desert1" }, /area/yautja) +"mn" = ( +/obj/structure/surface/rack{ + color = "#6b675e"; + layer = 2.79 + }, +/obj/item/device/flashlight/lantern{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/device/flashlight/lantern{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/device/flashlight/lantern{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/device/flashlight/lantern{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/device/flashlight/lantern{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/device/flashlight/lantern{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/device/flashlight/lantern{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/device/flashlight/lantern{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/device/flashlight/lantern{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/device/flashlight/lantern{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/device/flashlight/lantern{ + pixel_x = 1; + pixel_y = 9 + }, +/turf/open/floor/corsat{ + dir = 1; + icon_state = "squareswood" + }, +/area/yautja) "mv" = ( /obj/structure/surface/table/reinforced/prison{ color = "#6b675e" @@ -2151,6 +2311,37 @@ icon_state = "multi_tiles" }, /area/yautja) +"sS" = ( +/obj/structure/surface/rack{ + color = "#6b675e"; + layer = 2.79 + }, +/obj/item/stack/sheet/wood{ + amount = 50 + }, +/obj/item/stack/sheet/wood{ + amount = 50 + }, +/obj/item/stack/sheet/wood{ + amount = 50 + }, +/obj/item/stack/sheet/wood{ + amount = 50 + }, +/obj/item/stack/sheet/wood{ + amount = 50 + }, +/obj/item/stack/sheet/wood{ + amount = 50 + }, +/obj/item/stack/sheet/wood{ + amount = 50 + }, +/turf/open/floor/corsat{ + dir = 1; + icon_state = "squareswood" + }, +/area/yautja) "sV" = ( /obj/structure/machinery/door/airlock/yautja{ dir = 1; @@ -2210,18 +2401,22 @@ }, /area/yautja) "tR" = ( -/obj/structure/surface/table/reinforced/prison{ - color = "#6b675e" - }, -/obj/structure/window/reinforced{ - dir = 8; - health = 80 - }, -/obj/structure/window/reinforced{ - dir = 4; - health = 80 +/obj/structure/surface/rack{ + color = "#6b675e"; + layer = 2.79 }, -/obj/item/storage/box/bracer, +/obj/item/frame/table/wood/poor, +/obj/item/frame/table/wood/poor, +/obj/item/frame/table/wood/poor, +/obj/item/frame/table/wood/poor, +/obj/item/frame/table/wood/poor, +/obj/item/frame/table/wood/poor, +/obj/item/frame/table/wood/poor, +/obj/item/frame/table/wood/poor, +/obj/item/frame/table/wood/poor, +/obj/item/frame/table/wood/poor, +/obj/item/frame/table/wood/poor, +/obj/item/frame/table/wood/poor, /turf/open/floor/corsat{ dir = 1; icon_state = "squareswood" @@ -2233,6 +2428,54 @@ }, /turf/open/gm/dirtgrassborder/west, /area/yautja) +"uj" = ( +/obj/structure/surface/rack{ + color = "#6b675e"; + layer = 2.79 + }, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/obj/item/frame/table/gambling, +/turf/open/floor/corsat{ + dir = 1; + icon_state = "squareswood" + }, +/area/yautja) +"um" = ( +/obj/structure/surface/rack{ + color = "#6b675e"; + layer = 2.79 + }, +/obj/item/storage/fancy/candle_box, +/obj/item/storage/fancy/candle_box, +/obj/item/storage/fancy/candle_box, +/obj/item/storage/fancy/candle_box, +/obj/item/storage/fancy/candle_box, +/obj/item/storage/fancy/candle_box, +/obj/item/storage/fancy/candle_box, +/turf/open/floor/corsat{ + dir = 1; + icon_state = "squareswood" + }, +/area/yautja) "uO" = ( /obj/structure/bed/chair/hunter{ dir = 4 @@ -2358,6 +2601,24 @@ icon_state = "squareswood" }, /area/yautja) +"yr" = ( +/obj/structure/window/reinforced{ + dir = 8; + health = 80 + }, +/obj/structure/window/reinforced{ + dir = 4; + health = 80 + }, +/obj/structure/surface/table/reinforced/prison{ + color = "#6b675e" + }, +/obj/item/storage/box/bracer, +/turf/open/floor/corsat{ + dir = 1; + icon_state = "squareswood" + }, +/area/yautja) "yH" = ( /obj/structure/closet/secure_closet/freezer/fridge/groceries, /turf/open/floor{ @@ -2394,18 +2655,28 @@ }, /area/yautja) "zZ" = ( -/obj/structure/surface/table/reinforced/prison{ - color = "#6b675e" - }, -/obj/structure/window/reinforced{ - dir = 8; - health = 80 - }, -/obj/structure/window/reinforced{ - dir = 1; - health = 80; - pixel_y = 16 +/obj/structure/surface/rack{ + color = "#6b675e"; + layer = 2.79 }, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, +/obj/item/frame/table/wood/fancy, /turf/open/floor/corsat{ dir = 1; icon_state = "squareswood" @@ -2845,6 +3116,21 @@ /obj/item/stack/sheet/metal{ amount = 50 }, +/obj/item/stack/sheet/metal{ + amount = 50 + }, +/obj/item/stack/sheet/metal{ + amount = 50 + }, +/obj/item/stack/sheet/metal{ + amount = 50 + }, +/obj/item/stack/sheet/metal{ + amount = 50 + }, +/obj/item/stack/sheet/metal{ + amount = 50 + }, /turf/open/floor/corsat{ dir = 1; icon_state = "squareswood" @@ -3109,17 +3395,32 @@ /turf/open/shuttle/predship, /area/yautja) "Ut" = ( -/obj/structure/surface/table/reinforced/prison{ - color = "#6b675e" - }, -/obj/structure/window/reinforced{ - dir = 8; - health = 80 - }, -/obj/structure/window/reinforced{ - dir = 4; - health = 80 +/obj/structure/surface/rack{ + color = "#6b675e"; + layer = 2.79 }, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, +/obj/item/frame/table/wood, /turf/open/floor/corsat{ dir = 1; icon_state = "squareswood" @@ -5403,7 +5704,7 @@ JH JH JH bL -bL +yr bj bj bj @@ -5475,7 +5776,7 @@ bL bL JH JH -bL +yr bj bM da @@ -5545,9 +5846,9 @@ cP bL bL bL -bL +bZ JH -bL +yr bj cv cP @@ -5619,7 +5920,7 @@ bL mv xO JH -bL +yr bj cP cP @@ -5691,7 +5992,7 @@ cP cP Dk JH -bL +yr bj cP cP @@ -6479,7 +6780,7 @@ cH ti bd ti -Ut +uj bL cP tR @@ -6554,7 +6855,7 @@ bj Ut cP cP -tR +fI bj bj bj @@ -6621,12 +6922,12 @@ cP cP Pm ov -nh -ZM +sS +gN zZ cP cP -tR +mn bj bj bj @@ -6698,7 +6999,7 @@ cP cP cP cP -tR +um bj bj aa From cedfbd7c1cd273c92e9a818a2f02e5d56aa03d99 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 5 May 2024 18:34:34 +0100 Subject: [PATCH 43/50] Automatic changelog for PR #6172 [ci skip] --- html/changelogs/AutoChangeLog-pr-6172.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6172.yml diff --git a/html/changelogs/AutoChangeLog-pr-6172.yml b/html/changelogs/AutoChangeLog-pr-6172.yml new file mode 100644 index 000000000000..fc434022b3da --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6172.yml @@ -0,0 +1,5 @@ +author: "s5nt" +delete-after: True +changes: + - rscadd: "Added more materials to pred ship including more sandstone, wood, table parts, etc for lodge construction, along with more pred specific food to the pred kitchen." + - maptweak: "Slightly expanded pred ship material storage area by moving bracer storage over to the left side of the ship." \ No newline at end of file From a2f8aa4de2b5ae5851591bf62005abb4abee00ff Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 6 May 2024 01:12:20 +0000 Subject: [PATCH 44/50] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6172.yml | 5 ----- html/changelogs/AutoChangeLog-pr-6234.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6237.yml | 4 ---- html/changelogs/archive/2024-05.yml | 12 ++++++++++++ 4 files changed, 12 insertions(+), 13 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6172.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6234.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6237.yml diff --git a/html/changelogs/AutoChangeLog-pr-6172.yml b/html/changelogs/AutoChangeLog-pr-6172.yml deleted file mode 100644 index fc434022b3da..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6172.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "s5nt" -delete-after: True -changes: - - rscadd: "Added more materials to pred ship including more sandstone, wood, table parts, etc for lodge construction, along with more pred specific food to the pred kitchen." - - maptweak: "Slightly expanded pred ship material storage area by moving bracer storage over to the left side of the ship." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6234.yml b/html/changelogs/AutoChangeLog-pr-6234.yml deleted file mode 100644 index fe86a6098af6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6234.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ihatethisengine" -delete-after: True -changes: - - balance: "SADAR backblast now knockdowns and is reduced by xeno explosion resistance" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6237.yml b/html/changelogs/AutoChangeLog-pr-6237.yml deleted file mode 100644 index ec3774c75a02..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6237.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Git-Nivrak" -delete-after: True -changes: - - balance: "Watcher is now immobilized when zoomed out and loses health off weeds when not zoomed out" \ No newline at end of file diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml index b13a2d13046d..513615f57575 100644 --- a/html/changelogs/archive/2024-05.yml +++ b/html/changelogs/archive/2024-05.yml @@ -75,3 +75,15 @@ - bugfix: Fixes sentries firing at xenos while vent crawling. - bugfix: fixes hugger not dying when squished by predator - bugfix: Burrower can no longer tunnel across the map. +2024-05-06: + Git-Nivrak: + - balance: Watcher is now immobilized when zoomed out and loses health off weeds + when not zoomed out + ihatethisengine: + - balance: SADAR backblast now knockdowns and is reduced by xeno explosion resistance + s5nt: + - rscadd: Added more materials to pred ship including more sandstone, wood, table + parts, etc for lodge construction, along with more pred specific food to the + pred kitchen. + - maptweak: Slightly expanded pred ship material storage area by moving bracer storage + over to the left side of the ship. From cc60c815011c0e55147dbdc7d160f890377275df Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Sun, 5 May 2024 20:50:42 -0700 Subject: [PATCH 45/50] M540-B Armored Recon Carrier (#5401) # About the pull request Design doc here: https://hackmd.io/@cmss13/arc Adds the M540-B Armored Recon Carrier to the game. ![image](https://github.com/cmss13-devs/cmss13/assets/41448081/df012ac6-b21c-4163-8078-f642551dd97a) The M540 is meant to act as a mobile command & intelligence post for deploying CIC officers, with all the equipment they'd need (see design doc for list). It can only be driven by SOs, XOs, COs, and synthetics. ![image](https://github.com/cmss13-devs/cmss13/assets/41448081/6285d198-db71-4157-bc3d-90b461b183af) The M540 can be obtained for 5 intel points at tier 1. Numbers subject to change. The primary features of the ARC are the RE700 rotary cannon sentry and the U-56 radar antenna. The U-56 takes 8 seconds to retract or deploy. When deployed, the ARC is anchored in place but has a radar function akin to the command APC. Since the ARC is now a sitting duck, the RE700 rotary cannon is activated. Any non-USCM personnel or life forms that come within 5 tiles of the ARC will be fired upon automatically. ![image](https://github.com/cmss13-devs/cmss13/assets/41448081/f3e43a7e-8f5b-4ca1-b6fd-accbe0e21ed0) # Explain why it's good for the game Deploying command personnel can be hard-pressed to stay alive or relevant at times (without just becoming a pointman [COs] or medic+ [SOs]). The ARC gives groundside command personnel the ability to coordinate and lead from safety, in addition to giving IOs a potential dropoff point to upload intel and decrypt disks. # Todo - [x] Get side-facing movement sprites for the ARC - [ ] Get a techweb sprite for the ARC # Changelog :cl: Zonespace, d.1.n.a. (original sprites), esselnek (new sprites) add: Added the M540-B Armored Recon Carrier as a t1 intel purchase. /:cl: --------- Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> Co-authored-by: SabreML <57483089+SabreML@users.noreply.github.com> --- .../__DEFINES/dcs/signals/atom/signals_obj.dm | 8 + code/__DEFINES/vehicle.dm | 2 +- code/_onclick/item_attack.dm | 3 +- code/controllers/subsystem/ticker.dm | 2 +- code/datums/ammo/bullet/arc.dm | 14 + code/datums/components/disk_reader.dm | 87 +++++ code/datums/elements/bullet_trait/iff.dm | 2 +- code/datums/skills/uscm.dm | 8 +- code/datums/supply_packs/vehicle_ammo.dm | 12 + code/datums/supply_packs/vehicle_equipment.dm | 9 + code/datums/vehicles.dm | 4 + code/game/atoms_movable.dm | 5 +- code/game/machinery/computer/computer.dm | 2 +- .../vending/vendor_types/crew/vehicle_crew.dm | 8 + code/game/supplyshuttle.dm | 8 + code/modules/almayer/machinery.dm | 7 +- code/modules/cm_marines/overwatch.dm | 3 + .../modules/cm_tech/techs/marine/tier1/arc.dm | 40 +++ .../living/carbon/human/human_abilities.dm | 23 ++ code/modules/objectives/data_retrieval.dm | 53 +--- .../objectives/objective_memory_storage.dm | 9 + code/modules/projectiles/projectile.dm | 25 +- code/modules/vehicles/apc/apc_command.dm | 2 - code/modules/vehicles/arc/arc.dm | 271 ++++++++++++++++ code/modules/vehicles/arc/verbs.dm | 121 +++++++ code/modules/vehicles/hardpoints/hardpoint.dm | 26 +- .../hardpoint_ammo/arc_sentry_ammo.dm | 16 + .../vehicles/hardpoints/primary/arc_sentry.dm | 229 ++++++++++++++ .../vehicles/hardpoints/support/antenna.dm | 94 ++++++ .../vehicles/hardpoints/wheels/arc_wheels.dm | 17 + code/modules/vehicles/interior/areas.dm | 4 + .../vehicles/interior/interior_landmarks.dm | 2 +- code/modules/vehicles/multitile/multitile.dm | 3 +- .../multitile/multitile_hardpoints.dm | 5 +- code/modules/vehicles/vehicle.dm | 3 +- colonialmarines.dme | 10 + icons/obj/vehicles/arc.dmi | Bin 0 -> 73243 bytes icons/obj/vehicles/hardpoints/arc.dmi | Bin 0 -> 932 bytes icons/turf/areas_interiors.dmi | Bin 867 -> 924 bytes icons/ui_icons/map_blips_large.dmi | Bin 451 -> 439 bytes maps/interiors/arc.dmm | 296 ++++++++++++++++++ strings/xenotips.txt | 2 + 42 files changed, 1359 insertions(+), 76 deletions(-) create mode 100644 code/datums/ammo/bullet/arc.dm create mode 100644 code/datums/components/disk_reader.dm create mode 100644 code/datums/supply_packs/vehicle_equipment.dm create mode 100644 code/modules/cm_tech/techs/marine/tier1/arc.dm create mode 100644 code/modules/vehicles/arc/arc.dm create mode 100644 code/modules/vehicles/arc/verbs.dm create mode 100644 code/modules/vehicles/hardpoints/hardpoint_ammo/arc_sentry_ammo.dm create mode 100644 code/modules/vehicles/hardpoints/primary/arc_sentry.dm create mode 100644 code/modules/vehicles/hardpoints/support/antenna.dm create mode 100644 code/modules/vehicles/hardpoints/wheels/arc_wheels.dm create mode 100644 icons/obj/vehicles/arc.dmi create mode 100644 icons/obj/vehicles/hardpoints/arc.dmi create mode 100644 maps/interiors/arc.dmm diff --git a/code/__DEFINES/dcs/signals/atom/signals_obj.dm b/code/__DEFINES/dcs/signals/atom/signals_obj.dm index af541144ffc2..c850b2a52e03 100644 --- a/code/__DEFINES/dcs/signals/atom/signals_obj.dm +++ b/code/__DEFINES/dcs/signals/atom/signals_obj.dm @@ -32,6 +32,14 @@ /// from /obj/proc/afterbuckle() #define COMSIG_OBJ_AFTER_BUCKLE "signal_obj_after_buckle" +/// from /datum/cm_objective/retrieve_data/disk/process() +#define COMSIG_INTEL_DISK_LOST_POWER "intel_disk_lost_power" + +/// from /datum/cm_objective/retrieve_data/disk/complete() +#define COMSIG_INTEL_DISK_COMPLETED "intel_disk_completed" + +/// from /obj/vehicle/multitile/arc/toggle_antenna() +#define COMSIG_ARC_ANTENNA_TOGGLED "arc_antenna_toggled" /// from /obj/structure/machinery/cryopod/go_out() #define COMSIG_CRYOPOD_GO_OUT "cryopod_go_out" diff --git a/code/__DEFINES/vehicle.dm b/code/__DEFINES/vehicle.dm index 8a1617229926..5eb6a824d8ac 100644 --- a/code/__DEFINES/vehicle.dm +++ b/code/__DEFINES/vehicle.dm @@ -7,7 +7,7 @@ #define HDPT_TURRET "turret" #define HDPT_SPECIAL "special" //special pre-installed hardpoints with unique behaviour -#define HDPT_LAYER_WHEELS 1 +#define HDPT_LAYER_WHEELS 0.01 // so it appears below xenomorphs and other mobs #define HDPT_LAYER_SUPPORT 2 #define HDPT_LAYER_ARMOR 3 #define HDPT_LAYER_TURRET 4 diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 8d77920a59cc..71fc9162dcaa 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -16,7 +16,8 @@ return FALSE /atom/movable/attackby(obj/item/W, mob/living/user) - if(W) + . = ..() + if(W && !.) if(!(W.flags_item & NOBLUDGEON)) visible_message(SPAN_DANGER("[src] has been hit by [user] with [W]."), null, null, 5, CHAT_TYPE_MELEE_HIT) user.animation_attack_on(src) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index f265315460e3..40400f2a151c 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -50,7 +50,7 @@ SUBSYSTEM_DEF(ticker) var/totalPlayers = 0 //used for pregame stats on statpanel var/totalPlayersReady = 0 //used for pregame stats on statpanel - var/tutorial_disabled = FALSE //zonenote + var/tutorial_disabled = FALSE /datum/controller/subsystem/ticker/Initialize(timeofday) load_mode() diff --git a/code/datums/ammo/bullet/arc.dm b/code/datums/ammo/bullet/arc.dm new file mode 100644 index 000000000000..5e74508e04b2 --- /dev/null +++ b/code/datums/ammo/bullet/arc.dm @@ -0,0 +1,14 @@ +/datum/ammo/bullet/re700 + name = "rotary cannon bullet" + icon_state = "autocannon" + damage_falloff = 0 + flags_ammo_behavior = AMMO_BALLISTIC + + accuracy = HIT_ACCURACY_TIER_7 + scatter = 0 + damage = 30 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_2 + accurate_range = 10 + max_range = 12 + shell_speed = AMMO_SPEED_TIER_6 diff --git a/code/datums/components/disk_reader.dm b/code/datums/components/disk_reader.dm new file mode 100644 index 000000000000..6292519893e9 --- /dev/null +++ b/code/datums/components/disk_reader.dm @@ -0,0 +1,87 @@ +/datum/component/disk_reader + dupe_mode = COMPONENT_DUPE_UNIQUE + /// Ref to the inserted disk + var/obj/item/disk/objective/disk + +/datum/component/disk_reader/Initialize() + . = ..() + if(!istype(parent, /obj/structure/machinery)) + return COMPONENT_INCOMPATIBLE + +/datum/component/disk_reader/Destroy(force, silent) + handle_qdel() + return ..() + +/datum/component/disk_reader/RegisterWithParent() + ..() + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(on_disk_insert)) + RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(handle_qdel)) + RegisterSignal(parent, COMSIG_INTEL_DISK_COMPLETED, PROC_REF(on_disk_complete)) + RegisterSignal(parent, COMSIG_INTEL_DISK_LOST_POWER, PROC_REF(on_power_lost)) + +/datum/component/disk_reader/UnregisterFromParent() + ..() + handle_qdel() + +/datum/component/disk_reader/proc/handle_qdel() + SIGNAL_HANDLER + QDEL_NULL(disk) + +/datum/component/disk_reader/proc/on_disk_insert(datum/source, obj/item/disk/objective/potential_disk, mob/living/inserter, params) + SIGNAL_HANDLER + + if(!istype(potential_disk) || !potential_disk.objective) + return + + if(disk) + to_chat(inserter, SPAN_WARNING("There's already a disk inside [parent], wait for it to finish first!")) + return COMPONENT_NO_AFTERATTACK + + if(potential_disk.objective.state == OBJECTIVE_COMPLETE) + to_chat(inserter, SPAN_WARNING("The reader displays a message stating this disk has already been read and refuses to accept it.")) + return COMPONENT_NO_AFTERATTACK + + INVOKE_ASYNC(src, PROC_REF(handle_disk_insert), potential_disk, inserter) + return COMPONENT_NO_AFTERATTACK + +/datum/component/disk_reader/proc/handle_disk_insert(obj/item/disk/objective/potential_disk, mob/living/inserter) + if(tgui_input_text(inserter, "Enter the encryption key", "Decrypting [potential_disk]", "") != potential_disk.objective.decryption_password) + to_chat(inserter, SPAN_WARNING("The reader buzzes, ejecting the disk.")) + return + + if(disk) + to_chat(inserter, SPAN_WARNING("There's already a disk inside [parent], wait for it to finish first!")) + return + + if(!(potential_disk in inserter.contents)) + return + + potential_disk.objective.activate() + + inserter.drop_inv_item_to_loc(potential_disk, parent) + disk = potential_disk + to_chat(inserter, SPAN_NOTICE("You insert [potential_disk] and enter the decryption key.")) + inserter.count_niche_stat(STATISTICS_NICHE_DISK) + +/datum/component/disk_reader/proc/on_disk_complete(datum/source) + SIGNAL_HANDLER + var/atom/atom_parent = parent + + atom_parent.visible_message("[atom_parent] pings softly as the upload finishes and ejects [disk].") + playsound(atom_parent, 'sound/machines/screen_output1.ogg', 25, 1) + disk.forceMove(get_turf(atom_parent)) + disk.name = "[disk.name] (complete)" + disk.objective.award_points() + disk.retrieve_objective.state = OBJECTIVE_ACTIVE + disk.retrieve_objective.activate() + disk = null + +/datum/component/disk_reader/proc/on_power_lost(datum/source) + SIGNAL_HANDLER + var/atom/atom_parent = parent + + atom_parent.visible_message(SPAN_WARNING("[atom_parent] powers down mid-operation as the area loses power.")) + playsound(atom_parent, 'sound/machines/terminal_shutdown.ogg', 25, 1) + SSobjectives.stop_processing_objective(src) + disk.forceMove(get_turf(atom_parent)) + disk = null diff --git a/code/datums/elements/bullet_trait/iff.dm b/code/datums/elements/bullet_trait/iff.dm index ab48b29f4812..cee36acbed80 100644 --- a/code/datums/elements/bullet_trait/iff.dm +++ b/code/datums/elements/bullet_trait/iff.dm @@ -46,7 +46,7 @@ // The cache is reset when the user drops their ID /datum/element/bullet_trait_iff/proc/get_user_iff_group(mob/living/carbon/human/user) if(!ishuman(user)) - return user.faction_group + return user?.faction_group var/iff_group = LAZYACCESS(iff_group_cache, user) if(isnull(iff_group)) diff --git a/code/datums/skills/uscm.dm b/code/datums/skills/uscm.dm index 1e0dedf5dd05..9c56e7f62a88 100644 --- a/code/datums/skills/uscm.dm +++ b/code/datums/skills/uscm.dm @@ -239,7 +239,8 @@ COMMAND STAFF SKILL_JTAC = SKILL_JTAC_MASTER, SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, //can BE people - SKILL_INTEL = SKILL_INTEL_EXPERT + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, ) /datum/skills/commander @@ -261,7 +262,8 @@ COMMAND STAFF SKILL_JTAC = SKILL_JTAC_MASTER, SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, //can BE people SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED //can change ship alt + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, //can change ship alt + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, ) /datum/skills/XO @@ -282,6 +284,7 @@ COMMAND STAFF SKILL_JTAC = SKILL_JTAC_MASTER, SKILL_INTEL = SKILL_INTEL_EXPERT, SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, ) /datum/skills/SO @@ -299,6 +302,7 @@ COMMAND STAFF SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, SKILL_JTAC = SKILL_JTAC_EXPERT, SKILL_INTEL = SKILL_INTEL_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, ) /datum/skills/SEA diff --git a/code/datums/supply_packs/vehicle_ammo.dm b/code/datums/supply_packs/vehicle_ammo.dm index 5dad91d27ed4..43ce36ec2b64 100644 --- a/code/datums/supply_packs/vehicle_ammo.dm +++ b/code/datums/supply_packs/vehicle_ammo.dm @@ -148,3 +148,15 @@ containertype = /obj/structure/closet/crate/ammo containername = "M-87F Flare Launcher ammo crate" group = "Vehicle Ammo" + +/datum/supply_packs/ammo_arcsentry + name = "RE700 Rotary Cannon magazines (x3)" + contains = list( + /obj/item/ammo_magazine/hardpoint/arc_sentry, + /obj/item/ammo_magazine/hardpoint/arc_sentry, + /obj/item/ammo_magazine/hardpoint/arc_sentry, + ) + cost = 20 + containertype = /obj/structure/closet/crate/ammo + containername = "RE700 Rotary Cannon ammo crate" + group = "Vehicle Ammo" diff --git a/code/datums/supply_packs/vehicle_equipment.dm b/code/datums/supply_packs/vehicle_equipment.dm new file mode 100644 index 000000000000..df106761d467 --- /dev/null +++ b/code/datums/supply_packs/vehicle_equipment.dm @@ -0,0 +1,9 @@ +/datum/supply_packs/arcsentry_replacement + name = "Replacement RE700 Rotary Cannon (x1)" + contains = list( + /obj/item/hardpoint/primary/arc_sentry, + ) + cost = 25 + containertype = /obj/structure/closet/crate/weapon + containername = "RE700 Rotary Cannon crate" + group = "Vehicle Equipment" diff --git a/code/datums/vehicles.dm b/code/datums/vehicles.dm index 36ac96938c6b..67070dd04c0b 100644 --- a/code/datums/vehicles.dm +++ b/code/datums/vehicles.dm @@ -37,3 +37,7 @@ /datum/map_template/interior/van name = "Van" interior_id = "van" + +/datum/map_template/interior/arc + name = "ARC" + interior_id = "arc" diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 21f7b6b0a9be..52a35b715b1a 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -45,7 +45,10 @@ if(orbiting) orbiting.end_orbit(src) orbiting = null - vis_contents.Cut() + + vis_locs = null //clears this atom out of all viscontents + if(length(vis_contents)) + vis_contents.Cut() . = ..() moveToNullspace() //so we move into null space. Must be after ..() b/c atom's Dispose handles deleting our lighting stuff diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index c33517796271..f6efe6edb5e2 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -126,7 +126,7 @@ src.attack_alien(user) return src.attack_hand(user) - return + return ..() /obj/structure/machinery/computer/attack_hand() . = ..() diff --git a/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm b/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm index 6877c2b4b5b3..0586f4b72fa5 100644 --- a/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm +++ b/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm @@ -76,6 +76,9 @@ else display_list = GLOB.cm_vending_vehicle_crew_tank_spare + else if(selected_vehicle == "ARC") + display_list = GLOB.cm_vending_vehicle_crew_arc + else if(selected_vehicle == "APC") if(available_categories) display_list = GLOB.cm_vending_vehicle_crew_apc @@ -245,6 +248,11 @@ GLOBAL_LIST_INIT(cm_vending_vehicle_crew_apc_spare, list( list("WHEELS", 0, null, null, null), list("APC Wheels", 200, /obj/item/hardpoint/locomotion/apc_wheels, null, VENDOR_ITEM_REGULAR))) +GLOBAL_LIST_INIT(cm_vending_vehicle_crew_arc, list( + list("STARTING KIT SELECTION:", 0, null, null, null), + + list("WHEELS", 0, null, null, null), + list("Replacement ARC Wheels", 0, /obj/item/hardpoint/locomotion/arc_wheels, VEHICLE_TREADS_AVAILABLE, VENDOR_ITEM_MANDATORY))) //------------WEAPONS RACK--------------- diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 482139c03707..03c554af3426 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -412,6 +412,7 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) "Operations", "Weapons", "Vehicle Ammo", + "Vehicle Equipment", "Attachments", "Ammo", "Weapons Specialist Ammo", @@ -1367,6 +1368,13 @@ GLOBAL_DATUM_INIT(supply_controller, /datum/controller/supply, new()) name = "Barebones M577 Armored Personal Carrier" ordered_vehicle = /obj/effect/vehicle_spawner/apc/unarmed/broken +/datum/vehicle_order/arc + name = "M540-B Armored Recon Carrier" + ordered_vehicle = /obj/effect/vehicle_spawner/arc + +/datum/vehicle_order/arc/has_vehicle_lock() + return + /obj/structure/machinery/computer/supplycomp/vehicle/Initialize() . = ..() diff --git a/code/modules/almayer/machinery.dm b/code/modules/almayer/machinery.dm index 74ce9a81eb88..9411c229d2f3 100644 --- a/code/modules/almayer/machinery.dm +++ b/code/modules/almayer/machinery.dm @@ -73,7 +73,7 @@ /obj/structure/machinery/prop/almayer/CICmap name = "map table" - desc = "A table that displays a map of the current target location" + desc = "A table that displays a map of the current operation location." icon = 'icons/obj/structures/machinery/computer.dmi' icon_state = "maptable" anchored = TRUE @@ -103,6 +103,11 @@ map.tgui_interact(user) +/obj/structure/machinery/prop/almayer/CICmap/computer + name = "map terminal" + desc = "A terminal that displays a map of the current operation location." + icon_state = "security" + /obj/structure/machinery/prop/almayer/CICmap/upp minimap_type = MINIMAP_FLAG_UPP faction = FACTION_UPP diff --git a/code/modules/cm_marines/overwatch.dm b/code/modules/cm_marines/overwatch.dm index 70b2b82d8c86..500d575c053f 100644 --- a/code/modules/cm_marines/overwatch.dm +++ b/code/modules/cm_marines/overwatch.dm @@ -867,6 +867,9 @@ /obj/structure/machinery/computer/overwatch/almayer/broken name = "Broken Overwatch Console" +/obj/structure/machinery/computer/overwatch/almayer/small + icon_state = "engineering_terminal" + /obj/structure/machinery/computer/overwatch/clf faction = FACTION_CLF /obj/structure/machinery/computer/overwatch/upp diff --git a/code/modules/cm_tech/techs/marine/tier1/arc.dm b/code/modules/cm_tech/techs/marine/tier1/arc.dm new file mode 100644 index 000000000000..dc02762cc5f0 --- /dev/null +++ b/code/modules/cm_tech/techs/marine/tier1/arc.dm @@ -0,0 +1,40 @@ +/datum/tech/arc + name = "M540-B Armored Recon Carrier" + desc = "Purchase an M540-B Armored Recon Carrier, specialized in assisting groundside command. Able to be driven by Staff Officers, Executive Officers, and Commanding Officers." + icon_state = "upgrade" + + required_points = 5 + + tier = /datum/tier/one + + announce_name = "M540-B ARC ACQUIRED" + announce_message = "An M540-B Armored Recon Carrier has been authorized and will be delivered in the vehicle bay." + + flags = TREE_FLAG_MARINE + +/datum/tech/arc/on_unlock() + . = ..() + + var/obj/structure/machinery/computer/supplycomp/vehicle/comp = GLOB.VehicleElevatorConsole + var/obj/structure/machinery/cm_vending/gear/vehicle_crew/gearcomp = GLOB.VehicleGearConsole + + if(!comp || !gearcomp) + return FALSE + + comp.spent = FALSE + QDEL_NULL_LIST(comp.vehicles) + comp.vehicles = list( + new /datum/vehicle_order/arc() + ) + comp.allowed_roles = list(JOB_SYNTH, JOB_SEA, JOB_SO, JOB_XO, JOB_CO, JOB_GENERAL) + comp.req_access = list(ACCESS_MARINE_COMMAND) + comp.req_one_access = list() + comp.spent = FALSE + + gearcomp.req_access = list(ACCESS_MARINE_COMMAND) + gearcomp.req_one_access = list() + gearcomp.vendor_role = list() + gearcomp.selected_vehicle = "ARC" + gearcomp.available_categories = VEHICLE_ALL_AVAILABLE + + return TRUE diff --git a/code/modules/mob/living/carbon/human/human_abilities.dm b/code/modules/mob/living/carbon/human/human_abilities.dm index a568e93df5c0..2d7f472952cc 100644 --- a/code/modules/mob/living/carbon/human/human_abilities.dm +++ b/code/modules/mob/living/carbon/human/human_abilities.dm @@ -605,3 +605,26 @@ CULT var/mob/living/carbon/human/human_user = owner SEND_SIGNAL(human_user, COMSIG_MOB_MG_EXIT) + +/datum/action/human_action/toggle_arc_antenna + name = "Toggle Sensor Antenna" + action_icon_state = "recoil_compensation" + +/datum/action/human_action/toggle_arc_antenna/give_to(mob/user) + . = ..() + RegisterSignal(user, COMSIG_MOB_RESET_VIEW, PROC_REF(remove_from)) + +/datum/action/human_action/toggle_arc_antenna/remove_from(mob/user) + . = ..() + UnregisterSignal(user, COMSIG_MOB_RESET_VIEW) + +/datum/action/human_action/toggle_arc_antenna/action_activate() + if(!can_use_action()) + return + + var/mob/living/carbon/human/human_user = owner + if(istype(human_user.buckled, /obj/structure/bed/chair/comfy/vehicle)) + var/obj/structure/bed/chair/comfy/vehicle/vehicle_chair = human_user.buckled + if(istype(vehicle_chair.vehicle, /obj/vehicle/multitile/arc)) + var/obj/vehicle/multitile/arc/vehicle = vehicle_chair.vehicle + vehicle.toggle_antenna(human_user) diff --git a/code/modules/objectives/data_retrieval.dm b/code/modules/objectives/data_retrieval.dm index f66c578f48fb..ee5053f26c4b 100644 --- a/code/modules/objectives/data_retrieval.dm +++ b/code/modules/objectives/data_retrieval.dm @@ -117,29 +117,14 @@ /datum/cm_objective/retrieve_data/disk/process() var/obj/structure/machinery/computer/disk_reader/reader = disk.loc if(!reader.powered()) - reader.visible_message(SPAN_WARNING("\The [reader] powers down mid-operation as the area looses power.")) - playsound(reader, 'sound/machines/terminal_shutdown.ogg', 25, 1) - SSobjectives.stop_processing_objective(src) - disk.forceMove(reader.loc) - reader.disk = null + SEND_SIGNAL(reader, COMSIG_INTEL_DISK_LOST_POWER) return ..() /datum/cm_objective/retrieve_data/disk/complete() state = OBJECTIVE_COMPLETE - var/obj/structure/machinery/computer/disk_reader/reader = disk.loc - reader.visible_message("\The [reader] pings softly as the upload finishes and ejects the disk.") - playsound(reader, 'sound/machines/screen_output1.ogg', 25, 1) - disk.forceMove(reader.loc) - disk.name = "[disk.name] (complete)" - reader.disk = null - award_points() - - // Now enable the objective to store this disk in the lab. - disk.retrieve_objective.state = OBJECTIVE_ACTIVE - disk.retrieve_objective.activate() - + SEND_SIGNAL(disk.loc, COMSIG_INTEL_DISK_COMPLETED) ..() /datum/cm_objective/retrieve_data/disk/get_tgui_data() @@ -295,34 +280,6 @@ unslashable = TRUE unacidable = TRUE -/obj/structure/machinery/computer/disk_reader/attack_hand(mob/living/user) - if(isxeno(user)) - return - if(disk) - to_chat(user, SPAN_NOTICE("[disk] is currently being uploaded to ARES.")) - -/obj/structure/machinery/computer/disk_reader/attackby(obj/item/W, mob/living/user) - if(istype(W, /obj/item/disk/objective)) - if(istype(disk)) - to_chat(user, SPAN_WARNING("There is a disk in the drive being uploaded already!")) - return FALSE - var/obj/item/disk/objective/newdisk = W - if(newdisk.objective.state == OBJECTIVE_COMPLETE) - to_chat(user, SPAN_WARNING("The reader displays a message stating this disk has already been read and refuses to accept it.")) - return FALSE - if(input(user,"Enter the encryption key","Decrypting [newdisk]","") != newdisk.objective.decryption_password) - to_chat(user, SPAN_WARNING("The reader asks for the encryption key for this disk, not having the correct key you eject the disk.")) - return FALSE - if(istype(disk)) - to_chat(user, SPAN_WARNING("There is a disk in the drive being uploaded already!")) - return FALSE - - if(!(newdisk in user.contents)) - return FALSE - - newdisk.objective.activate() - - user.drop_inv_item_to_loc(W, src) - disk = W - to_chat(user, SPAN_NOTICE("You insert \the [W] and enter the decryption key.")) - user.count_niche_stat(STATISTICS_NICHE_DISK) +/obj/structure/machinery/computer/disk_reader/Initialize() + . = ..() + AddComponent(/datum/component/disk_reader) diff --git a/code/modules/objectives/objective_memory_storage.dm b/code/modules/objectives/objective_memory_storage.dm index 161c78d4d1ba..de2ab30691cc 100644 --- a/code/modules/objectives/objective_memory_storage.dm +++ b/code/modules/objectives/objective_memory_storage.dm @@ -218,6 +218,15 @@ GLOBAL_DATUM_INIT(intel_system, /datum/intel_system, new()) GLOB.intel_system.store_single_objective(O) return 1 +/obj/structure/machinery/computer/intel/disk_reader // ARC computer to save on tile space + name = "\improper SIGINT terminal" + desc = "An USCM computer capable of uploading data to the intelligence database. It has a disk reader slot built into the bottom, as well." + icon_state = "terminal" + +/obj/structure/machinery/computer/intel/disk_reader/Initialize() + . = ..() + AddComponent(/datum/component/disk_reader) + // -------------------------------------------- // *** View objectives with the computer *** // -------------------------------------------- diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index edb565158185..cd69c1940aba 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -358,14 +358,7 @@ SEND_SIGNAL(src, COMSIG_BULLET_TERMINAL) // Check we can reach the turf at all based on pathed grid - var/proj_dir = get_dir(current_turf, next_turf) - if((proj_dir & (proj_dir - 1)) && !current_turf.Adjacent(next_turf)) - ammo.on_hit_turf(current_turf, src) - current_turf.bullet_act(src) - return TRUE - - // Check for hits that would occur when moving to turf, such as a blocking cade - if(scan_a_turf(next_turf, proj_dir)) + if(check_canhit(current_turf, next_turf)) return TRUE // Actually move @@ -533,7 +526,8 @@ else direct_hit = TRUE - SEND_SIGNAL(firer, COMSIG_BULLET_DIRECT_HIT, L) + if(firer) + SEND_SIGNAL(firer, COMSIG_BULLET_DIRECT_HIT, L) // At present, Xenos have no inherent effects or localized damage stemming from limb targeting // Therefore we exempt the shooter from direct hit accuracy penalties as well, @@ -600,6 +594,19 @@ if(SEND_SIGNAL(src, COMSIG_BULLET_POST_HANDLE_MOB, L, .) & COMPONENT_BULLET_PASS_THROUGH) return FALSE +/obj/projectile/proc/check_canhit(turf/current_turf, turf/next_turf) + var/proj_dir = get_dir(current_turf, next_turf) + if((proj_dir & (proj_dir - 1)) && !current_turf.Adjacent(next_turf)) + ammo.on_hit_turf(current_turf, src) + current_turf.bullet_act(src) + return TRUE + + // Check for hits that would occur when moving to turf, such as a blocking cade + if(scan_a_turf(next_turf, proj_dir)) + return TRUE + + return FALSE + //---------------------------------------------------------- // \\ // HITTING THE TARGET \\ diff --git a/code/modules/vehicles/apc/apc_command.dm b/code/modules/vehicles/apc/apc_command.dm index e0862ae4f2ab..54647279ec3b 100644 --- a/code/modules/vehicles/apc/apc_command.dm +++ b/code/modules/vehicles/apc/apc_command.dm @@ -43,8 +43,6 @@ return ..() /obj/vehicle/multitile/apc/command/process() - . = ..() - var/turf/apc_turf = get_turf(src) if(health == 0 || !visible_in_tacmap || !is_ground_level(apc_turf.z)) return diff --git a/code/modules/vehicles/arc/arc.dm b/code/modules/vehicles/arc/arc.dm new file mode 100644 index 000000000000..feee097c3638 --- /dev/null +++ b/code/modules/vehicles/arc/arc.dm @@ -0,0 +1,271 @@ +/obj/vehicle/multitile/arc + name = "\improper M540-B Armored Recon Carrier" + desc = "An M540-B Armored Recon Carrier. A lightly armored reconnaissance and intelligence vehicle. Entrances on the sides." + + icon = 'icons/obj/vehicles/arc.dmi' + icon_state = "arc_base" + pixel_x = -48 + pixel_y = -48 + + bound_width = 96 + bound_height = 96 + + bound_x = -32 + bound_y = -32 + + health = 800 + + interior_map = /datum/map_template/interior/arc + + passengers_slots = 3 + xenos_slots = 5 + + entrances = list( + "left" = list(2, 0), + "right" = list(-2, 0), + ) + + entrance_speed = 0.5 SECONDS + + required_skill = SKILL_VEHICLE_LARGE + + movement_sound = 'sound/vehicles/tank_driving.ogg' + + luminosity = 7 + + hardpoints_allowed = list( + /obj/item/hardpoint/locomotion/arc_wheels, + /obj/item/hardpoint/primary/arc_sentry, + /obj/item/hardpoint/support/arc_antenna, + ) + + seats = list( + VEHICLE_DRIVER = null, + ) + + active_hp = list( + VEHICLE_DRIVER = null, + ) + + vehicle_flags = VEHICLE_CLASS_LIGHT + + mob_size_required_to_hit = MOB_SIZE_XENO + + dmg_multipliers = list( + "all" = 1, + "acid" = 1.8, + "slash" = 1.1, + "bullet" = 0.6, + "explosive" = 0.8, + "blunt" = 0.8, + "abstract" = 1, + ) + + move_max_momentum = 2.2 + move_momentum_build_factor = 1.5 + move_turn_momentum_loss_factor = 0.8 + + vehicle_ram_multiplier = VEHICLE_TRAMPLE_DAMAGE_APC_REDUCTION + + /// If the ARC has its antenna up, making it unable to move but enabling the turret and sensor wallhack + var/antenna_deployed = FALSE + /// How long it takes to deploy or retract the antenna + var/antenna_toggle_time = 10 SECONDS + /// Range of the ARC's xenomorph wallhacks + var/sensor_radius = 45 + /// weakrefs of xenos temporarily added to the marine minimap + var/list/minimap_added = list() + +/obj/vehicle/multitile/arc/Initialize() + . = ..() + + var/turf/gotten_turf = get_turf(src) + if(gotten_turf?.z) + SSminimaps.add_marker(src, gotten_turf.z, MINIMAP_FLAG_USCM, "arc", 'icons/ui_icons/map_blips_large.dmi') + + RegisterSignal(src, COMSIG_ARC_ANTENNA_TOGGLED, PROC_REF(on_antenna_toggle)) + +/obj/vehicle/multitile/arc/crew_mousedown(datum/source, atom/object, turf/location, control, params) + var/list/modifiers = params2list(params) + if(modifiers[SHIFT_CLICK] || modifiers[MIDDLE_CLICK] || modifiers[RIGHT_CLICK]) //don't step on examine, point, etc + return + + switch(get_mob_seat(source)) + if(VEHICLE_DRIVER) + if(modifiers[LEFT_CLICK] && modifiers[CTRL_CLICK]) + activate_horn() + +/obj/vehicle/multitile/arc/get_examine_text(mob/user) + . = ..() + if(!isxeno(user)) + return + + if(health > 0) + . += SPAN_XENO("[src] can be crawled under once destroyed.") + else + . += SPAN_XENO("[src] can be crawled under by dragging our sprite to it.") + +/obj/vehicle/multitile/arc/proc/on_antenna_toggle(datum/source) + SIGNAL_HANDLER + + if(antenna_deployed) + START_PROCESSING(SSslowobj, src) + + else + STOP_PROCESSING(SSslowobj, src) + +/obj/vehicle/multitile/arc/process() + var/turf/arc_turf = get_turf(src) + if((health <= 0) || !visible_in_tacmap || !is_ground_level(arc_turf.z)) + return + + var/obj/item/hardpoint/support/arc_antenna/antenna = locate() in hardpoints + if(!antenna || (antenna.health <= 0)) + for(var/datum/weakref/xeno as anything in minimap_added) + SSminimaps.remove_marker(xeno.resolve()) + minimap_added.Remove(xeno) + return + + for(var/mob/living/carbon/xenomorph/current_xeno as anything in GLOB.living_xeno_list) + var/turf/xeno_turf = get_turf(current_xeno) + if(!is_ground_level(xeno_turf.z)) + continue + + var/datum/weakref/xeno_weakref = WEAKREF(current_xeno) + + if(get_dist(src, current_xeno) <= sensor_radius) + if(xeno_weakref in minimap_added) + continue + + SSminimaps.remove_marker(current_xeno) + current_xeno.add_minimap_marker(MINIMAP_FLAG_USCM|MINIMAP_FLAG_XENO) + minimap_added += xeno_weakref + else if(xeno_weakref in minimap_added) + SSminimaps.remove_marker(current_xeno) + current_xeno.add_minimap_marker() + minimap_added -= xeno_weakref + +/obj/vehicle/multitile/arc/relaymove(mob/user, direction) + if(antenna_deployed) + return FALSE + + return ..() + +/obj/vehicle/multitile/arc/load_role_reserved_slots() + var/datum/role_reserved_slots/RRS = new + RRS.category_name = "CIC Officer" + RRS.roles = list(JOB_SO, JOB_SEA, JOB_XO, JOB_CO, JOB_GENERAL) + RRS.total = 2 + role_reserved_slots += RRS + + RRS = new + RRS.category_name = "Intelligence Officer" + RRS.roles = list(JOB_INTEL) + RRS.total = 1 + role_reserved_slots += RRS + +/obj/vehicle/multitile/arc/set_seated_mob(seat, mob/living/M) + . = ..() + if(!.) + return + + give_action(M, /datum/action/human_action/toggle_arc_antenna) + +/obj/vehicle/multitile/arc/add_seated_verbs(mob/living/M, seat) + if(!M.client) + return + add_verb(M.client, list( + /obj/vehicle/multitile/proc/get_status_info, + /obj/vehicle/multitile/arc/proc/open_arc_controls_guide, + /obj/vehicle/multitile/proc/toggle_door_lock, + /obj/vehicle/multitile/proc/activate_horn, + /obj/vehicle/multitile/proc/name_vehicle, + /obj/vehicle/multitile/arc/proc/toggle_antenna, + )) + +/obj/vehicle/multitile/arc/remove_seated_verbs(mob/living/M, seat) + if(!M.client) + return + remove_verb(M.client, list( + /obj/vehicle/multitile/proc/get_status_info, + /obj/vehicle/multitile/arc/proc/open_arc_controls_guide, + /obj/vehicle/multitile/proc/toggle_door_lock, + /obj/vehicle/multitile/proc/activate_horn, + /obj/vehicle/multitile/proc/name_vehicle, + /obj/vehicle/multitile/arc/proc/toggle_antenna, + )) + SStgui.close_user_uis(M, src) + +/obj/vehicle/multitile/arc/initialize_cameras(change_tag = FALSE) + if(!camera) + camera = new /obj/structure/machinery/camera/vehicle(src) + if(change_tag) + camera.c_tag = "#[rand(1,100)] M540-B \"[nickname]\" ARC" + if(camera_int) + camera_int.c_tag = camera.c_tag + " interior" + else + camera.c_tag = "#[rand(1,100)] M540-B ARC" + if(camera_int) + camera_int.c_tag = camera.c_tag + " interior" + +/obj/vehicle/multitile/arc/MouseDrop_T(mob/M, mob/user) + . = ..() + if((M != user) || !isxeno(user)) + return + + if(health > 0) + to_chat(user, SPAN_XENO("We can't go under [src] until it is destroyed!")) + return + + var/turf/current_turf = get_turf(user) + var/dir_to_go = get_dir(current_turf, src) + for(var/i in 1 to 3) + current_turf = get_step(current_turf, dir_to_go) + if(!(current_turf in locs)) + break + + if(current_turf.density) + to_chat(user, SPAN_XENO("The path under [src] is obstructed!")) + return + + // Now we check to make sure the turf on the other side of the ARC isn't dense too + current_turf = get_step(current_turf, dir_to_go) + if(current_turf.density) + to_chat(user, SPAN_XENO("The path under [src] is obstructed!")) + return + + to_chat(user, SPAN_XENO("We begin to crawl under [src]...")) + if(!do_after(user, 3 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) + to_chat(user, SPAN_XENO("We stop crawling under [src].")) + return + + user.forceMove(current_turf) + to_chat(user, SPAN_XENO("We crawl to the other side of [src].")) + +/* +** PRESETS SPAWNERS +*/ +/obj/effect/vehicle_spawner/arc + name = "ARC Transport Spawner" + icon = 'icons/obj/vehicles/apc.dmi' + icon_state = "apc_base" + pixel_x = -48 + pixel_y = -48 + +/obj/effect/vehicle_spawner/arc/Initialize() + . = ..() + spawn_vehicle() + return INITIALIZE_HINT_QDEL + +/obj/effect/vehicle_spawner/arc/spawn_vehicle() + var/obj/vehicle/multitile/arc/ARC = new (loc) + + load_misc(ARC) + load_hardpoints(ARC) + handle_direction(ARC) + ARC.update_icon() + +/obj/effect/vehicle_spawner/arc/load_hardpoints(obj/vehicle/multitile/arc/vehicle) + vehicle.add_hardpoint(new /obj/item/hardpoint/locomotion/arc_wheels) + vehicle.add_hardpoint(new /obj/item/hardpoint/primary/arc_sentry) + vehicle.add_hardpoint(new /obj/item/hardpoint/support/arc_antenna) diff --git a/code/modules/vehicles/arc/verbs.dm b/code/modules/vehicles/arc/verbs.dm new file mode 100644 index 000000000000..3b866236e77d --- /dev/null +++ b/code/modules/vehicles/arc/verbs.dm @@ -0,0 +1,121 @@ +/obj/vehicle/multitile/arc/proc/toggle_antenna(mob/toggler) + set name = "Toggle Sensor Antenna" + set desc = "Raises or lowers the external sensor antenna. While raised, the ARC cannot move." + set category = "Vehicle" + + var/mob/user = toggler || usr + if(!user || !istype(user)) + return + + var/obj/vehicle/multitile/arc/vehicle = user.interactee + if(!istype(vehicle)) + return + + var/seat + for(var/vehicle_seat in vehicle.seats) + if(vehicle.seats[vehicle_seat] == user) + seat = vehicle_seat + break + + if(!seat) + return + + if(vehicle.health < initial(vehicle.health) * 0.5) + to_chat(user, SPAN_WARNING("[vehicle]'s hull is too damaged to operate!")) + return + + var/obj/item/hardpoint/support/arc_antenna/antenna = locate() in vehicle.hardpoints + if(!antenna) + to_chat(user, SPAN_WARNING("[vehicle] has no antenna mounted!")) + return + + if(antenna.deploying) + return + + if(antenna.health <= 0) + to_chat(user, SPAN_WARNING("[antenna] is broken!")) + return + + if(vehicle.antenna_deployed) + to_chat(user, SPAN_NOTICE("You begin to retract [antenna]...")) + antenna.deploying = TRUE + if(!do_after(user, max(vehicle.antenna_toggle_time - antenna.deploy_animation_time, 1 SECONDS), target = vehicle)) + to_chat(user, SPAN_NOTICE("You stop retracting [antenna].")) + antenna.deploying = FALSE + return + + antenna.retract_antenna() + addtimer(CALLBACK(vehicle, PROC_REF(finish_antenna_retract), user), antenna.deploy_animation_time) + + else + to_chat(user, SPAN_NOTICE("You begin to extend [antenna]...")) + antenna.deploying = TRUE + if(!do_after(user, max(vehicle.antenna_toggle_time - antenna.deploy_animation_time, 1 SECONDS), target = vehicle)) + to_chat(user, SPAN_NOTICE("You stop extending [antenna].")) + antenna.deploying = FALSE + return + + antenna.deploy_antenna() + addtimer(CALLBACK(vehicle, PROC_REF(finish_antenna_deploy), user), antenna.deploy_animation_time) + +/obj/vehicle/multitile/arc/proc/finish_antenna_retract(mob/user) + var/obj/item/hardpoint/support/arc_antenna/antenna = locate() in hardpoints + if(!antenna) + antenna.deploying = FALSE + return + + if(user) + to_chat(user, SPAN_NOTICE("You retract [antenna], enabling the ARC to move again.")) + playsound(user, 'sound/machines/hydraulics_2.ogg', 80, TRUE) + antenna_deployed = !antenna_deployed + antenna.deploying = FALSE + update_icon() + SEND_SIGNAL(src, COMSIG_ARC_ANTENNA_TOGGLED) + +/obj/vehicle/multitile/arc/proc/finish_antenna_deploy(mob/user) + var/obj/item/hardpoint/support/arc_antenna/antenna = locate() in hardpoints + if(!antenna) + antenna.deploying = FALSE + return + + if(user) + to_chat(user, SPAN_NOTICE("You extend [antenna], locking the ARC in place.")) + playsound(user, 'sound/machines/hydraulics_2.ogg', 80, TRUE) + antenna_deployed = !antenna_deployed + antenna.deploying = FALSE + update_icon() + SEND_SIGNAL(src, COMSIG_ARC_ANTENNA_TOGGLED) + +/obj/vehicle/multitile/arc/proc/open_arc_controls_guide() + set name = "Vehicle Controls Guide" + set desc = "MANDATORY FOR FIRST PLAY AS VEHICLE CREWMAN OR AFTER UPDATES." + set category = "Vehicle" + + var/mob/user = usr + if(!istype(user)) + return + + var/obj/vehicle/multitile/arc/vehicle = user.interactee + if(!istype(vehicle)) + return + + var/seat + for(var/vehicle_seat in vehicle.seats) + if(vehicle.seats[vehicle_seat] == user) + seat = vehicle_seat + break + + if(!seat) + return + + var/dat = "Common verbs:
\ + 1. \"G: Name Vehicle\" - used to add a custom name to the vehicle. Single use. 26 characters maximum.
\ + 2. \"I: Get Status Info\" - brings up \"Vehicle Status Info\" window with all available information about your vehicle.
\ + 3. \"G: Toggle Sensor Antenna\" - extend or retract the ARC's sensor antenna. While extended, all unknown lifeforms within a large range can be seen by all on the tacmap, but the ARC cannot move. Additionally enables the automated RE700 cannon.
\ + Driver verbs:
1. \"G: Activate Horn\" - activates vehicle horn. Keep in mind, that vehicle horn is very loud and can be heard from afar by both allies and foes.
\ + 2. \"G: Toggle Door Locks\" - toggles vehicle's access restrictions. Crewman, Brig and Command accesses bypass these restrictions.
\ + Driver shortcuts:
1. \"CTRL + Click\" - activates vehicle horn.
" + + show_browser(user, dat, "Vehicle Controls Guide", "vehicle_help", "size=900x500") + onclose(user, "vehicle_help") + return diff --git a/code/modules/vehicles/hardpoints/hardpoint.dm b/code/modules/vehicles/hardpoints/hardpoint.dm index 21e3e4b29f89..9b69308a47a0 100644 --- a/code/modules/vehicles/hardpoints/hardpoint.dm +++ b/code/modules/vehicles/hardpoints/hardpoint.dm @@ -125,6 +125,8 @@ /// Currently selected target to fire at. Set with set_target(). var/atom/target + /// The type of projectile to fire + var/projectile_type = /obj/projectile //----------------------------- //------GENERAL PROCS---------- @@ -149,7 +151,7 @@ if(owner || indestructible) return - health = max(0, health - severity / 2) + take_damage(severity / 2) if(health <= 0) visible_message(SPAN_WARNING("\The [src] disintegrates into useless pile of scrap under the damage it suffered.")) deconstruct(TRUE) @@ -159,7 +161,7 @@ return /obj/item/hardpoint/proc/generate_bullet(mob/user, turf/origin_turf) - var/obj/projectile/P = new(origin_turf, create_cause_data(initial(name), user)) + var/obj/projectile/P = new projectile_type(origin_turf, create_cause_data(initial(name), user)) P.generate_bullet(new ammo.default_ammo) // Apply bullet traits from gun for(var/entry in traits_to_give) @@ -180,7 +182,14 @@ return TRUE /obj/item/hardpoint/proc/take_damage(damage) + if(health <= 0) + return health = max(0, health - damage * damage_multiplier) + if(!health) + on_destroy() + +/obj/item/hardpoint/proc/on_destroy() + return /obj/item/hardpoint/proc/is_activatable() if(health <= 0) @@ -581,7 +590,6 @@ /// Wrapper proc for the autofire system to ensure the important args aren't null. /obj/item/hardpoint/proc/fire_wrapper(atom/target, mob/living/user, params) - SHOULD_NOT_OVERRIDE(TRUE) if(!target) target = src.target if(!user) @@ -717,7 +725,9 @@ var/is_broken = health <= 0 var/image/I = image(icon = disp_icon, icon_state = "[disp_icon_state]_[is_broken ? "1" : "0"]", pixel_x = x_offset, pixel_y = y_offset, dir = new_dir) switch(round((health / initial(health)) * 100)) - if(0 to 20) + if(0) + I.color = "#888888" + if(1 to 20) I.color = "#4e4e4e" if(21 to 40) I.color = "#6e6e6e" @@ -792,3 +802,11 @@ /obj/item/hardpoint/get_applying_acid_time() return 10 SECONDS //you are not supposed to be able to easily combat-melt irreplaceable things. + +/// Proc to be overridden if you want to have special conditions preventing the removal of the hardpoint. Add chat messages in this proc if you want to tell the player why +/obj/item/hardpoint/proc/can_be_removed(mob/remover) + SHOULD_CALL_PARENT(TRUE) + + if(remover.stat > CONSCIOUS) + return FALSE + return TRUE diff --git a/code/modules/vehicles/hardpoints/hardpoint_ammo/arc_sentry_ammo.dm b/code/modules/vehicles/hardpoints/hardpoint_ammo/arc_sentry_ammo.dm new file mode 100644 index 000000000000..f9c28e151514 --- /dev/null +++ b/code/modules/vehicles/hardpoints/hardpoint_ammo/arc_sentry_ammo.dm @@ -0,0 +1,16 @@ +/obj/item/ammo_magazine/hardpoint/arc_sentry + name = "\improper RE700 Rotary Cannon Magazine" + desc = "A magazine for RE700 Rotary Cannon filled with 20mm rounds. Supports IFF." + caliber = "20mm" + icon_state = "ace_autocannon" + w_class = SIZE_LARGE + default_ammo = /datum/ammo/bullet/re700 + max_rounds = 500 + gun_type = /obj/item/hardpoint/primary/arc_sentry + +/obj/item/ammo_magazine/hardpoint/arc_sentry/update_icon() + if(current_rounds > 0) + icon_state = "ace_autocannon" + else + icon_state = "ace_autocannon_empty" + diff --git a/code/modules/vehicles/hardpoints/primary/arc_sentry.dm b/code/modules/vehicles/hardpoints/primary/arc_sentry.dm new file mode 100644 index 000000000000..4b5087b2e608 --- /dev/null +++ b/code/modules/vehicles/hardpoints/primary/arc_sentry.dm @@ -0,0 +1,229 @@ +// APC cannons +/obj/item/hardpoint/primary/arc_sentry + name = "\improper RE700 Rotary Cannon" + desc = "A primary two-barrel cannon for the ARC that shoots 12.7mm IFF-compatible rounds." + icon = 'icons/obj/vehicles/hardpoints/arc.dmi' + + icon_state = "autocannon" + disp_icon = "arc" + disp_icon_state = "autocannon" + activation_sounds = list('sound/weapons/gun_m60.ogg') + + damage_multiplier = 0.1 + health = 125 + + origins = list(0, 0) + + ammo = new /obj/item/ammo_magazine/hardpoint/arc_sentry + max_clips = 2 + + use_muzzle_flash = TRUE + angle_muzzleflash = FALSE + muzzleflash_icon_state = "muzzle_flash_double" + + muzzle_flash_pos = list( + "1" = list(1, 4), + "2" = list(1, -29), + "4" = list(16, 3), + "8" = list(-16, 3) + ) + gun_firemode = GUN_FIREMODE_BURSTFIRE + gun_firemode_list = list( + GUN_FIREMODE_BURSTFIRE, + ) + burst_delay = 2 + burst_amount = 3 + projectile_type = /obj/projectile/arc_sentry + + /// Potential targets the turret can shoot at + var/list/targets = list() + /// The currently focused sentry target + var/atom/movable/sentry_target = null + /// The range that this turret can shoot at the furthest + var/turret_range = 5 + /// What factions this sentry is aligned with + var/faction_group = FACTION_LIST_MARINE + +/obj/item/hardpoint/primary/arc_sentry/on_install(obj/vehicle/multitile/vehicle) + . = ..() + RegisterSignal(owner, COMSIG_ARC_ANTENNA_TOGGLED, PROC_REF(toggle_processing)) + toggle_processing() // We can't know that the antenna is in the same position as when the gun was removed + +/obj/item/hardpoint/primary/arc_sentry/on_uninstall(obj/vehicle/multitile/vehicle) + . = ..() + UnregisterSignal(owner, COMSIG_ARC_ANTENNA_TOGGLED) + STOP_PROCESSING(SSfastobj, src) + +/obj/item/hardpoint/primary/arc_sentry/Destroy() + STOP_PROCESSING(SSfastobj, src) + sentry_target = null + return ..() + +/obj/item/hardpoint/primary/arc_sentry/proc/toggle_processing() + SIGNAL_HANDLER + if(!owner) + return + + var/obj/vehicle/multitile/arc/vehicle = owner + if(vehicle.antenna_deployed) + START_PROCESSING(SSfastobj, src) + + else + STOP_PROCESSING(SSfastobj, src) + +/obj/item/hardpoint/primary/arc_sentry/process() + for(var/mob/living/in_range_mob in range(turret_range, owner)) + targets |= in_range_mob + + if(!length(targets)) + return FALSE + + if(!sentry_target) + sentry_target = pick(targets) + + get_target(sentry_target) + return TRUE + +/obj/item/hardpoint/primary/arc_sentry/set_bullet_traits() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff, faction_group) + )) + +/obj/item/hardpoint/primary/arc_sentry/fire_wrapper(atom/target, mob/living/user, params) + if(!target) + target = src.target + if(!target) + return NONE + + return try_fire(target, null, params) + + +/obj/item/hardpoint/primary/arc_sentry/generate_bullet(mob/user, turf/origin_turf) + var/obj/projectile/arc_sentry/made_projectile = ..() + made_projectile.permutated += owner + return made_projectile + +/obj/item/hardpoint/primary/arc_sentry/start_fire(datum/source, atom/object, turf/location, control, params) + if(QDELETED(object)) + return + if(!COOLDOWN_FINISHED(src, fire_cooldown)) + return + + set_target(object) + SEND_SIGNAL(src, COMSIG_GUN_FIRE) + +/obj/item/hardpoint/primary/arc_sentry/proc/get_target(atom/movable/new_target) + if(QDELETED(new_target)) + sentry_target = null + return + + if(!targets.Find(new_target)) + targets.Add(new_target) + + if(!length(targets)) + return + + var/list/conscious_targets = list() + var/list/unconscious_targets = list() + + for(var/mob/living/living_mob as anything in targets) // orange allows sentry to fire through gas and darkness + if(living_mob.stat == DEAD) + purge_target(living_mob) + continue + + if(living_mob.get_target_lock(faction_group) || living_mob.invisibility || HAS_TRAIT(living_mob, TRAIT_ABILITY_BURROWED)) + purge_target(living_mob) + continue + + var/list/turf/path = get_line(get_turf(src), living_mob) + if(!length(path) || get_dist(get_turf(src), living_mob) > turret_range) + purge_target(living_mob) + continue + + var/blocked = FALSE + for(var/turf/tile as anything in path) + if(tile.density || tile.opacity) + blocked = TRUE + break + + for(var/obj/structure/struct in tile) + if(struct.opacity) + blocked = TRUE + break + + for(var/obj/vehicle/multitile/vehicle in tile) + if(vehicle == owner) // Some of the tiles will inevitably be the ARC itself + continue + blocked = TRUE + break + + if(locate(/obj/effect/particle_effect/smoke) in tile) + blocked = TRUE + break + + if(blocked) + purge_target(living_mob) + continue + + if(living_mob.stat & UNCONSCIOUS) + unconscious_targets += living_mob + else + conscious_targets += living_mob + + if((sentry_target in conscious_targets) || (sentry_target in unconscious_targets)) + sentry_target = sentry_target + + else if(length(conscious_targets)) + sentry_target = pick(conscious_targets) + + else if(length(unconscious_targets)) + sentry_target = pick(unconscious_targets) + + if(!sentry_target) //No targets, don't bother firing + return + + start_fire(object = sentry_target) + +/obj/item/hardpoint/primary/arc_sentry/proc/purge_target(mob/target) + if(target == sentry_target) + sentry_target = null + targets.Remove(target) + +/obj/item/hardpoint/primary/arc_sentry/can_be_removed(mob/remover) + var/obj/vehicle/multitile/arc/arc_owner = owner + if(!istype(arc_owner)) + return TRUE + + if(arc_owner.antenna_deployed) + to_chat(remover, SPAN_WARNING("[src] cannot be removed from [owner] while its antenna is deployed.")) + return FALSE + + return ..() + +/obj/projectile/arc_sentry/Initialize(mapload, datum/cause_data/cause_data) + . = ..() + RegisterSignal(src, COMSIG_BULLET_POST_HANDLE_OBJ, PROC_REF(check_passthrough)) + +/obj/projectile/arc_sentry/check_canhit(turf/current_turf, turf/next_turf) + var/proj_dir = get_dir(current_turf, next_turf) + var/obj/item/hardpoint/arc_sentry = shot_from + if(!(arc_sentry.owner in current_turf) && !(arc_sentry.owner in next_turf) && (proj_dir & (proj_dir - 1)) && !current_turf.Adjacent(next_turf)) + ammo.on_hit_turf(current_turf, src) + current_turf.bullet_act(src) + return TRUE + + // Check for hits that would occur when moving to turf, such as a blocking cade + if(scan_a_turf(next_turf, proj_dir)) + return TRUE + + return FALSE + +/obj/projectile/arc_sentry/proc/check_passthrough(datum/source, obj/hit_obj, bool) + SIGNAL_HANDLER + + if(!istype(shot_from, /obj/item/hardpoint)) + return + + var/obj/item/hardpoint/sentry = shot_from + if(sentry.owner == hit_obj) + return COMPONENT_BULLET_PASS_THROUGH diff --git a/code/modules/vehicles/hardpoints/support/antenna.dm b/code/modules/vehicles/hardpoints/support/antenna.dm new file mode 100644 index 000000000000..11fd50a9506e --- /dev/null +++ b/code/modules/vehicles/hardpoints/support/antenna.dm @@ -0,0 +1,94 @@ +/obj/item/hardpoint/support/arc_antenna + name = "\improper U-56 Radar Antenna" + desc = "A heavy-duty antenna built for the ARC." + icon = 'icons/obj/vehicles/hardpoints/arc.dmi' + + icon_state = "antenna" + disp_icon = "arc" + disp_icon_state = "antenna" + + damage_multiplier = 0.1 + + health = 500 + + /// How long the antenna deploy/retract animation is, keep accurate to the sprite in the dmi + var/deploy_animation_time = 1.2 SECONDS + /// If the antenna is already deploying + var/deploying = FALSE + +/obj/item/hardpoint/support/arc_antenna/proc/deploy_antenna() + set waitfor = FALSE + + disp_icon_state = "" + if(owner) + owner.update_icon() + var/obj/dummy_obj = new() + dummy_obj.icon = 'icons/obj/vehicles/arc.dmi' + dummy_obj.icon_state = "antenna_cover_0" + dummy_obj.dir = owner.dir + dummy_obj.vis_flags = VIS_INHERIT_ID | VIS_INHERIT_LAYER | VIS_INHERIT_PLANE + owner.vis_contents += dummy_obj + flick("antenna_extending", dummy_obj) + sleep(deploy_animation_time) + qdel(dummy_obj) + disp_icon_state = initial(disp_icon_state) + +/obj/item/hardpoint/support/arc_antenna/proc/retract_antenna() + set waitfor = FALSE + + disp_icon_state = "" + if(owner) + owner.update_icon() + var/obj/dummy_obj = new() + dummy_obj.icon = 'icons/obj/vehicles/arc.dmi' + dummy_obj.icon_state = "antenna_cover_0" + dummy_obj.dir = owner.dir + dummy_obj.vis_flags = VIS_INHERIT_ID | VIS_INHERIT_LAYER | VIS_INHERIT_PLANE + owner.vis_contents += dummy_obj + flick("antenna_retracting", dummy_obj) + sleep(deploy_animation_time) + qdel(dummy_obj) + disp_icon_state = initial(disp_icon_state) + +/obj/item/hardpoint/support/arc_antenna/get_icon_image(x_offset, y_offset, new_dir) + var/is_broken = health <= 0 + var/antenna_extended = FALSE + if(istype(owner, /obj/vehicle/multitile/arc)) + var/obj/vehicle/multitile/arc/arc_owner = owner + antenna_extended = arc_owner.antenna_deployed + + var/image/antenna_img = image(icon = disp_icon, icon_state = "[disp_icon_state]_[antenna_extended ? "extended" : "cover"]_[is_broken ? "1" : "0"]", pixel_x = x_offset, pixel_y = y_offset, dir = new_dir) + switch(round((health / initial(health)) * 100)) + if(0) + antenna_img.color = "#888888" + if(1 to 20) + antenna_img.color = "#4e4e4e" + if(21 to 40) + antenna_img.color = "#6e6e6e" + if(41 to 60) + antenna_img.color = "#8b8b8b" + if(61 to 80) + antenna_img.color = "#bebebe" + else + antenna_img.color = null + return antenna_img + +/obj/item/hardpoint/support/arc_antenna/can_be_removed(mob/remover) + var/obj/vehicle/multitile/arc/arc_owner = owner + if(!istype(arc_owner)) + return TRUE + + if(arc_owner.antenna_deployed) + to_chat(remover, SPAN_WARNING("[src] cannot be removed from [owner] while it is deployed.")) + return FALSE + + return ..() + +/obj/item/hardpoint/support/arc_antenna/on_destroy() + var/obj/vehicle/multitile/arc/arc_owner = owner + if(!istype(arc_owner)) + return + + if(arc_owner.antenna_deployed) + retract_antenna() + addtimer(CALLBACK(arc_owner, TYPE_PROC_REF(/obj/vehicle/multitile/arc, finish_antenna_retract)), deploy_animation_time) diff --git a/code/modules/vehicles/hardpoints/wheels/arc_wheels.dm b/code/modules/vehicles/hardpoints/wheels/arc_wheels.dm new file mode 100644 index 000000000000..9bb6c31746e0 --- /dev/null +++ b/code/modules/vehicles/hardpoints/wheels/arc_wheels.dm @@ -0,0 +1,17 @@ +/obj/item/hardpoint/locomotion/arc_wheels + name = "ARC Wheels" + desc = "Integral to the movement of the ARC." + icon = 'icons/obj/vehicles/hardpoints/arc.dmi' + + damage_multiplier = 0.15 + + icon_state = "tires" + disp_icon = "arc" + disp_icon_state = "arc_wheels" + + health = 500 + + move_delay = VEHICLE_SPEED_SUPERFAST + move_max_momentum = 2 + move_momentum_build_factor = 1.5 + move_turn_momentum_loss_factor = 0.5 diff --git a/code/modules/vehicles/interior/areas.dm b/code/modules/vehicles/interior/areas.dm index 254bcb6b26ea..399e55e11450 100644 --- a/code/modules/vehicles/interior/areas.dm +++ b/code/modules/vehicles/interior/areas.dm @@ -29,5 +29,9 @@ name = "van interior" icon_state = "van" +/area/interior/vehicle/arc + name = "\improper ARC interior" + icon_state = "arc" + /area/interior/fancylocker name = "closet interior" diff --git a/code/modules/vehicles/interior/interior_landmarks.dm b/code/modules/vehicles/interior/interior_landmarks.dm index 90284682d2d4..fa1eee8651ac 100644 --- a/code/modules/vehicles/interior/interior_landmarks.dm +++ b/code/modules/vehicles/interior/interior_landmarks.dm @@ -227,7 +227,7 @@ Phone.pixel_x = pixel_x Phone.pixel_y = pixel_y Phone.phone_category = "Vehicles" - Phone.phone_id = I.exterior.name + Phone.phone_id = replacetext(Phone.phone_id, "\improper", "") // this has to be done because phone IDs need to be the same as their display name (\improper doesn't display, obviously) qdel(src) diff --git a/code/modules/vehicles/multitile/multitile.dm b/code/modules/vehicles/multitile/multitile.dm index f3b7be510b08..18dade67b834 100644 --- a/code/modules/vehicles/multitile/multitile.dm +++ b/code/modules/vehicles/multitile/multitile.dm @@ -334,11 +334,12 @@ // Checked here because we want to be able to null the mob in a seat if(!istype(M)) - return + return FALSE M.set_interaction(src) M.reset_view(src) give_action(M, /datum/action/human_action/vehicle_unbuckle) + return TRUE /// Get crewmember of seat. /obj/vehicle/multitile/proc/get_seat_mob(seat) diff --git a/code/modules/vehicles/multitile/multitile_hardpoints.dm b/code/modules/vehicles/multitile/multitile_hardpoints.dm index 2a6f97dda06f..b94b8459890f 100644 --- a/code/modules/vehicles/multitile/multitile_hardpoints.dm +++ b/code/modules/vehicles/multitile/multitile_hardpoints.dm @@ -149,7 +149,7 @@ hps += H var/chosen_hp = tgui_input_list(usr, "Select a hardpoint to remove", "Hardpoint Removal", (hps + "Cancel")) - if(chosen_hp == "Cancel" || !chosen_hp || !in_range(src, user)) + if(chosen_hp == "Cancel" || !chosen_hp || (get_dist(src, user) > 2)) //get_dist uses 2 because the vehicle is 3x3 return var/obj/item/hardpoint/old = chosen_hp @@ -158,6 +158,9 @@ to_chat(user, SPAN_WARNING("There is nothing installed there.")) return + if(!old.can_be_removed(user)) + return + // It's in a holder if(!(old in hardpoints)) for(var/obj/item/hardpoint/holder/H in hardpoints) diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 8632159b4f6d..c78be6fa57ec 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -159,10 +159,11 @@ // Checked here because we want to be able to null the mob in a seat if(!istype(M)) - return + return FALSE M.forceMove(src) M.set_interaction(src) + return TRUE /obj/vehicle/proc/turn_on() if(stat) diff --git a/colonialmarines.dme b/colonialmarines.dme index d38af7820e21..11902f619cad 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -382,6 +382,7 @@ #include "code\datums\ammo\rocket.dm" #include "code\datums\ammo\shrapnel.dm" #include "code\datums\ammo\xeno.dm" +#include "code\datums\ammo\bullet\arc.dm" #include "code\datums\ammo\bullet\bullet.dm" #include "code\datums\ammo\bullet\lever_action.dm" #include "code\datums\ammo\bullet\pistol.dm" @@ -404,6 +405,7 @@ #include "code\datums\components\cluster_stack.dm" #include "code\datums\components\connect_mob_behalf.dm" #include "code\datums\components\crate_tag.dm" +#include "code\datums\components\disk_reader.dm" #include "code\datums\components\footstep.dm" #include "code\datums\components\healing_reduction.dm" #include "code\datums\components\id_lock.dm" @@ -677,6 +679,7 @@ #include "code\datums\supply_packs\restricted_equipment.dm" #include "code\datums\supply_packs\spec_ammo.dm" #include "code\datums\supply_packs\vehicle_ammo.dm" +#include "code\datums\supply_packs\vehicle_equipment.dm" #include "code\datums\supply_packs\weapons.dm" #include "code\datums\tutorial\_tutorial.dm" #include "code\datums\tutorial\_tutorial_menu.dm" @@ -1690,6 +1693,7 @@ #include "code\modules\cm_tech\resources\resource.dm" #include "code\modules\cm_tech\techs\abstract\repeatable.dm" #include "code\modules\cm_tech\techs\abstract\transitory.dm" +#include "code\modules\cm_tech\techs\marine\tier1\arc.dm" #include "code\modules\cm_tech\techs\marine\tier1\points.dm" #include "code\modules\cm_tech\techs\marine\tier2\orbital_ammo.dm" #include "code\modules\cm_tech\techs\marine\tier3\cryo_spec.dm" @@ -2400,6 +2404,8 @@ #include "code\modules\vehicles\apc\apc_command.dm" #include "code\modules\vehicles\apc\apc_medical.dm" #include "code\modules\vehicles\apc\interior.dm" +#include "code\modules\vehicles\arc\arc.dm" +#include "code\modules\vehicles\arc\verbs.dm" #include "code\modules\vehicles\hardpoints\hardpoint.dm" #include "code\modules\vehicles\hardpoints\armor\armor.dm" #include "code\modules\vehicles\hardpoints\armor\ballistic.dm" @@ -2407,6 +2413,7 @@ #include "code\modules\vehicles\hardpoints\armor\concussive.dm" #include "code\modules\vehicles\hardpoints\armor\paladin.dm" #include "code\modules\vehicles\hardpoints\armor\snowplow.dm" +#include "code\modules\vehicles\hardpoints\hardpoint_ammo\arc_sentry_ammo.dm" #include "code\modules\vehicles\hardpoints\hardpoint_ammo\autocannon_ammo.dm" #include "code\modules\vehicles\hardpoints\hardpoint_ammo\cupola_ammo.dm" #include "code\modules\vehicles\hardpoints\hardpoint_ammo\dualcannon_ammo.dm" @@ -2422,6 +2429,7 @@ #include "code\modules\vehicles\hardpoints\hardpoint_ammo\tow_ammo.dm" #include "code\modules\vehicles\hardpoints\holder\holder.dm" #include "code\modules\vehicles\hardpoints\holder\tank_turret.dm" +#include "code\modules\vehicles\hardpoints\primary\arc_sentry.dm" #include "code\modules\vehicles\hardpoints\primary\autocannon.dm" #include "code\modules\vehicles\hardpoints\primary\dual_cannon.dm" #include "code\modules\vehicles\hardpoints\primary\flamer.dm" @@ -2436,12 +2444,14 @@ #include "code\modules\vehicles\hardpoints\secondary\tow.dm" #include "code\modules\vehicles\hardpoints\special\firing_port_weapon.dm" #include "code\modules\vehicles\hardpoints\special\special.dm" +#include "code\modules\vehicles\hardpoints\support\antenna.dm" #include "code\modules\vehicles\hardpoints\support\artillery.dm" #include "code\modules\vehicles\hardpoints\support\flare.dm" #include "code\modules\vehicles\hardpoints\support\iwsa.dm" #include "code\modules\vehicles\hardpoints\support\overdrive.dm" #include "code\modules\vehicles\hardpoints\support\support.dm" #include "code\modules\vehicles\hardpoints\wheels\apc_wheels.dm" +#include "code\modules\vehicles\hardpoints\wheels\arc_wheels.dm" #include "code\modules\vehicles\hardpoints\wheels\locomotion.dm" #include "code\modules\vehicles\hardpoints\wheels\treads.dm" #include "code\modules\vehicles\hardpoints\wheels\van_wheels.dm" diff --git a/icons/obj/vehicles/arc.dmi b/icons/obj/vehicles/arc.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f662d5475ac032768acdf38e1bed79f3de05778d GIT binary patch literal 73243 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%0A( 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 J_?i00zX30`Qq%wd literal 0 HcmV?d00001 diff --git a/icons/obj/vehicles/hardpoints/arc.dmi b/icons/obj/vehicles/hardpoints/arc.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b971efecff5e6dd8a7f1a985657989c7d59b0819 GIT binary patch literal 932 zcmV;V16%xwP)`FccUWL`q6fS5|CP8#X*UUSwisARxfNz%*4j78Vv$Q&VhgY%wu0LqkI$CMJk0 zD`OTZB_$D@x2wg|OkO5=%?+lN0mu^79BQ%_~XG%S*(iPFca# z&jsvK05KjiiJ7EXL;wH+f=NU{R9J=Wl;M)AFbIVuMB`4i-K*Wc|D!GtNYK`~Gs)jQ zV{O#%NjSt|aDuGiQo;1;Aw?qE=^{9q_~I~&<5*A!?xDPN9HSS+ajbJR3Xvw-5Gp*5 z6ULZQigAt#0!jzo;-v&<0!>Yb5fVpp?0C)qYIsVaBESJA0&ptw_W1-r(D)=71SJ6K z3J5SwF;OWLz<&Y&O#mzq4kJkcq5v=^c40mOauq-`2q_0zAw7U? z_JOV|xGyGecgsL~>1?BZlmBm{A&QMq!*h1mD$`0ss*UcppFfdc(mx(~fb}GPzWG_h zpWbzoqeF`v9r2=$_;tD8>C_ImucUhq;PzN=U4UhMEPa4SFJN7}0PCI9|(`g!jAwlxx-uNMI}8g0!P(9sqvTArl#8t(hv^*Nx@4O~Ae zKvM zg2M`mO22;zF8KKMiI%sn*10q1gExd4Tr__0Nawtd=1GR4p57f6#zDrHjlC4+JeqW5 zQiwwEN)=+16q)y*p;PMAJ<{e{S6A{aebl{_IB8i~G0Rn_FKpI*^v;$<{N4hhuU5 z*%aTfg%fC9VE<{O>|nv14EDO|0JW=XwR? zyt}sgz}*WMc`dh_-znkj^7c9TG0L}M?UpyP>#M~>HgDNrzzy@n4(HOeIj;H-QntSN zS#NFBAk>2CQDE3IFbJiT+TUr8{I>F6(}s6Zi+g9QKl;(YvtgHf&usPl9rwQl*j0)B zc(Hyi>ru%KDLdM)oND>EXMb0|-0lAfDV$9^r|5RRFIu$!+l`pd-_Q6mhGhMicJP}g zznqs|#~Pt6p=p0UZqSikTNx5uALh(0u<&H`#re^TCNUl{tzT=u#mwHs+{{YV+bdNs z&q&-{SMrVVk|jK%e?9z_4%L?YzFrV-^K4q4`_{tG6Ow;L)!w(>Cl$F({~c@Lk?AQ7 zzA@rk!XJBAI~X;Donj5JofSFbs0$C&|4gs^Ua3?u{*C0UpS$)XgO>m-whPKXH%#K+ z`z7=Hx%+ADhqp5B`4VMor}6dAswi@yK> literal 867 zcmeAS@N?(olHy`uVBq!ia0vp^2|(TXvL|TOar` zP3)ZOGM3)g4?SKf?_F7;JjSu{=af3xncgFs{U-P{u3^8AW+3%RstNN_PYGbU&-@US*4WH1n6Xk$8nDfmpRmQk$i zoa|m3sb`h@Lw~pX{O(WRwm;IR37pCoQ z-15JldG0-Vo#$7}9Wx93|K|FvR>%|5jg~KlwX@YT>ixcmDqT6|sdK{;7A?O(=<#Z&9 zoG`K9k{Mvn`m^#@`-5e_oep^a&K63qob_>*mSy{`gW{1tlVu)lG)^g>^>kxP$zHRq z&H9T(1k$%H<6c!>dB0P&LngiEG*^aTjiBK3=bTm@pOV{i;`rvwD7}l4E`BoHu?Z8L U#l3|Im}?k3UHx3vIVCg!00;4d`~Uy| diff --git a/icons/ui_icons/map_blips_large.dmi b/icons/ui_icons/map_blips_large.dmi index 0cf41b52a4dc7c796e3e891c7494b7ce7ce6d7f2..f03433c8c8efa246893f12ba1d15df17ea312b1e 100644 GIT binary patch delta 259 zcmV+e0sQ{M1GfW^BnL21OjJcKHIXYE8kd%(|NsBn+uQZ)ChX!G#l^)-#g#Y!005Ga zafE-uYKm~GQC4vEa{&he0H#Dr-aAFEE&u=kq)9|UR49>!klPZ&AP5B!6l;me|Nm{d zsLg{-Pc*aR5(fhCCn=#Or8^NB5t+t}y3(B}$Ta4{Tr%znaw*yNo`AJZYk5zAY;}x# z(uVA!Xl)V&Q4GdB2OFe=DfwW}skOd5wQW=4y85fVN7|QQ*(Yt=59JtIBy?BPHKs+T zmZiHF#MffSs>Q)Cuct57hsX3JSXT9Q*kgKf}BVvrd* zi77>FnUNFLI;~}ykv3=4F Date: Mon, 6 May 2024 04:54:56 +0100 Subject: [PATCH 46/50] Automatic changelog for PR #5401 [ci skip] --- html/changelogs/AutoChangeLog-pr-5401.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5401.yml diff --git a/html/changelogs/AutoChangeLog-pr-5401.yml b/html/changelogs/AutoChangeLog-pr-5401.yml new file mode 100644 index 000000000000..6bda3a48b8b2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5401.yml @@ -0,0 +1,4 @@ +author: "Zonespace, d.1.n.a. (original sprites), esselnek (new sprites)" +delete-after: True +changes: + - rscadd: "Added the M540-B Armored Recon Carrier as a t1 intel purchase." \ No newline at end of file From 92655a09a48e316b9a7b5381c27d188a7a84b6e6 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 7 May 2024 01:12:16 +0000 Subject: [PATCH 47/50] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5401.yml | 4 ---- html/changelogs/archive/2024-05.yml | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5401.yml diff --git a/html/changelogs/AutoChangeLog-pr-5401.yml b/html/changelogs/AutoChangeLog-pr-5401.yml deleted file mode 100644 index 6bda3a48b8b2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5401.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Zonespace, d.1.n.a. (original sprites), esselnek (new sprites)" -delete-after: True -changes: - - rscadd: "Added the M540-B Armored Recon Carrier as a t1 intel purchase." \ No newline at end of file diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml index 513615f57575..af586d5033c1 100644 --- a/html/changelogs/archive/2024-05.yml +++ b/html/changelogs/archive/2024-05.yml @@ -87,3 +87,6 @@ pred kitchen. - maptweak: Slightly expanded pred ship material storage area by moving bracer storage over to the left side of the ship. +2024-05-07: + Zonespace, d.1.n.a. (original sprites), esselnek (new sprites): + - rscadd: Added the M540-B Armored Recon Carrier as a t1 intel purchase. From e8c7ca66cfc9aed8a13fb118447e757146d8a0c2 Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Thu, 9 May 2024 21:24:02 +0100 Subject: [PATCH 48/50] Legcuffs work (#5696) # About the pull request Allows legcuffs to function without needing to be beartraps. # 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: code: Repaths handcuffs and legcuffs to have a shared parent. code: Repaths xeno restraints to reduce confusion from the typepath. add: Legcuffs work appropriately now, and can be found in small numbers within security vendors. add: Cable restraints can now be adjusted via right-click to fit on wrists or ankles. add: Prison shoe chains now require ankle restraints rather than handcuffs. add: Prison shoes that have been chained now have an equp and unequip delay to account for the chains, proportionate to the breakout time of the item used in the chains. /:cl: --- code/game/machinery/autolathe_datums.dm | 2 +- code/game/machinery/vending/vending_types.dm | 7 +- code/game/objects/items.dm | 4 +- code/game/objects/items/handcuffs.dm | 195 ++++++++++-------- code/game/objects/items/legcuffs.dm | 52 ++++- code/game/objects/items/stacks/cable_coil.dm | 2 +- code/game/objects/items/storage/belt.dm | 16 +- code/game/objects/items/storage/boxes.dm | 70 ++++--- .../objects/items/tools/maintenance_tools.dm | 2 +- .../closets/secure/cm_closets.dm | 4 +- code/modules/clothing/shoes/colour.dm | 45 ++-- code/modules/clothing/spacesuits/captain.dm | 2 +- .../clothing/spacesuits/miscellaneous.dm | 4 +- code/modules/clothing/suits/armor.dm | 8 +- code/modules/clothing/suits/bio.dm | 2 +- code/modules/clothing/suits/jobs.dm | 10 +- code/modules/clothing/suits/labcoat.dm | 4 +- .../suits/marine_armor/_marine_armor.dm | 2 +- .../clothing/suits/marine_armor/ert.dm | 12 +- code/modules/clothing/suits/marine_coat.dm | 2 +- code/modules/clothing/suits/miscellaneous.dm | 10 +- code/modules/clothing/suits/utility.dm | 2 +- code/modules/gear_presets/cmb.dm | 10 +- ...ot_in_progress_insert_fiorina_nightmare.dm | 24 +-- .../crashlanding-offices_insert_bigred.dm | 2 +- code/modules/gear_presets/synths.dm | 6 +- code/modules/gear_presets/upp.dm | 28 +-- code/modules/gear_presets/uscm_event.dm | 10 +- code/modules/gear_presets/uscm_police.dm | 4 +- code/modules/gear_presets/wy_goons.dm | 14 +- .../mob/living/carbon/carbon_defines.dm | 2 +- code/modules/mob/mob_defines.dm | 2 +- maps/map_files/BigRed/BigRed.dmm | 10 +- .../BigRed/sprinkles/20.etatunnel_open.dmm | 6 +- .../BigRed/sprinkles/40.viro_open.dmm | 2 +- .../BigRed/sprinkles/70.se-checkpoint.dmm | 2 +- .../BigRed/standalone/crashlanding-eva.dmm | 2 +- .../standalone/crashlanding-offices.dmm | 2 +- maps/map_files/CORSAT/Corsat.dmm | 32 +-- maps/map_files/DesertDam/Desert_Dam.dmm | 6 +- .../sprinkles/10.damtemple_intact.dmm | 2 +- .../FOP_v2_Cellblocks/Prison_Station_FOP.dmm | 10 +- .../FOP_v3_Sciannex/Fiorina_SciAnnex.dmm | 12 +- .../sprinkles/20.yardbasketball.dmm | 2 +- .../sprinkles/25.researchprestine.dmm | 4 +- .../map_files/Ice_Colony_v2/Ice_Colony_v2.dmm | 8 +- .../Ice_Colony_v3/Shivas_Snowball.dmm | 8 +- .../LV522_Chances_Claim.dmm | 10 +- maps/map_files/LV624/LV624.dmm | 6 +- maps/map_files/LV624/maintemple/1.intact.dmm | 2 +- maps/map_files/LV624/standalone/clfship.dmm | 4 +- .../LV624/standalone/corporatedome.dmm | 2 +- maps/map_files/New_Varadero/New_Varadero.dmm | 10 +- .../Sorokyne_Strata/Sorokyne_Strata.dmm | 2 +- maps/map_files/USS_Almayer/USS_Almayer.dmm | 12 +- maps/map_files/generic/Admin_level.dmm | 2 +- maps/predship/huntership.dmm | 36 ++-- maps/predship/regular.dmm | 24 +-- maps/shuttles/ert_shuttle_big.dmm | 6 +- .../lazy_templates/clf_ert_station.dmm | 6 +- .../lazy_templates/freelancer_ert_station.dmm | 2 +- .../lazy_templates/twe_ert_station.dmm | 8 +- .../lazy_templates/upp_ert_station.dmm | 4 +- 63 files changed, 454 insertions(+), 349 deletions(-) diff --git a/code/game/machinery/autolathe_datums.dm b/code/game/machinery/autolathe_datums.dm index 01a40b3638f6..71f350ffbd25 100644 --- a/code/game/machinery/autolathe_datums.dm +++ b/code/game/machinery/autolathe_datums.dm @@ -269,7 +269,7 @@ /datum/autolathe/recipe/handcuffs name = "handcuffs" - path = /obj/item/handcuffs + path = /obj/item/restraint/handcuffs hidden = TRUE category = AUTOLATHE_CATEGORY_GENERAL diff --git a/code/game/machinery/vending/vending_types.dm b/code/game/machinery/vending/vending_types.dm index 92ba81af4d94..b69773dbf8bf 100644 --- a/code/game/machinery/vending/vending_types.dm +++ b/code/game/machinery/vending/vending_types.dm @@ -234,8 +234,9 @@ icon_deny = "sec-deny" req_access = list(ACCESS_MARINE_BRIG) products = list( - /obj/item/handcuffs = 8, - /obj/item/handcuffs/zip = 10, + /obj/item/restraint/handcuffs = 8, + /obj/item/restraint/handcuffs/zip = 10, + /obj/item/restraint/legcuffs = 3, /obj/item/explosive/grenade/flashbang = 4, /obj/item/weapon/gun/energy/taser = 4, /obj/item/reagent_container/spray/pepper = 4, @@ -263,7 +264,7 @@ hacking_safety = TRUE wrenchable = FALSE products = list( - /obj/item/handcuffs/zip = 40, + /obj/item/restraint/handcuffs/zip = 40, /obj/item/explosive/grenade/flashbang = 20, /obj/item/explosive/grenade/custom/teargas = 40, /obj/item/ammo_magazine/smg/m39/rubber = 40, diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index fb0103876301..1a632569eccb 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -668,13 +668,13 @@ cases. Override_icon_state should be a list.*/ if(WEAR_HANDCUFFS) if(human.handcuffed) return FALSE - if(!istype(src, /obj/item/handcuffs)) + if(!istype(src, /obj/item/restraint)) return FALSE return TRUE if(WEAR_LEGCUFFS) if(human.legcuffed) return FALSE - if(!istype(src, /obj/item/legcuffs)) + if(!istype(src, /obj/item/restraint)) return FALSE return TRUE if(WEAR_IN_ACCESSORY) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 2137b41d86bf..af71b806ed42 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -1,124 +1,162 @@ -/obj/item/handcuffs - name = "handcuffs" - desc = "Use this to keep prisoners in line." - gender = PLURAL - icon = 'icons/obj/items/items.dmi' - icon_state = "handcuff" - flags_atom = FPRINT|CONDUCT - flags_equip_slot = SLOT_WAIST - throwforce = 5 - w_class = SIZE_SMALL - throw_speed = SPEED_SLOW - throw_range = 5 - matter = list("metal" = 500) - - var/dispenser = 0 +/obj/item/restraint + /// SLOT_HANDS or SLOT_LEGS, for handcuffs or legcuffs + var/target_zone = SLOT_HANDS + /// How long to break out var/breakouttime = 1 MINUTES /// determines if handcuffs will be deleted on removal var/single_use = 0 var/cuff_sound = 'sound/weapons/handcuffs.ogg' /// how many deciseconds it takes to cuff someone var/cuff_delay = 4 SECONDS + /// If can be applied to people manually + var/manual = TRUE -/obj/item/handcuffs/attack(mob/living/carbon/C, mob/user) - if(!istype(C)) +/obj/item/restraint/attack(mob/living/carbon/attacked_carbon, mob/user) + if(!istype(attacked_carbon) || !manual) return ..() - if (!istype(user, /mob/living/carbon/human)) + if (!ishuman(user)) to_chat(user, SPAN_DANGER("You don't have the dexterity to do this!")) return - if(!C.handcuffed) - place_handcuffs(C, user) - -/obj/item/handcuffs/get_mob_overlay(mob/user_mob, slot) - var/image/ret = ..() - - var/image/handcuffs = overlay_image('icons/mob/mob.dmi', "handcuff1", color, RESET_COLOR) - ret.overlays += handcuffs - - return ret - -/obj/item/handcuffs/proc/place_handcuffs(mob/living/carbon/target, mob/user) + switch(target_zone) + if(SLOT_HANDS) + if(!attacked_carbon.handcuffed) + place_handcuffs(attacked_carbon, user) + if(SLOT_LEGS) + if(!attacked_carbon.legcuffed) + apply_legcuffs(attacked_carbon, user) + +/obj/item/restraint/proc/place_handcuffs(mob/living/carbon/target, mob/user) playsound(src.loc, cuff_sound, 25, 1, 4) if(user.action_busy) return - if (ishuman(target)) - var/mob/living/carbon/human/H = target + if(ishuman(target)) + var/mob/living/carbon/human/human_mob = target - if (!H.has_limb_for_slot(WEAR_HANDCUFFS)) - to_chat(user, SPAN_DANGER("\The [H] needs at least two wrists before you can cuff them together!")) + if(!human_mob.has_limb_for_slot(WEAR_HANDCUFFS)) + to_chat(user, SPAN_DANGER("\The [human_mob] needs at least two wrists before you can cuff them together!")) return - H.attack_log += text("\[[time_stamp()]\] Has been handcuffed (attempt) by [key_name(user)]") - user.attack_log += text("\[[time_stamp()]\] Attempted to handcuff [key_name(H)]") - msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(H)] in [get_area(src)] ([src.loc.x],[src.loc.y],[src.loc.z]).", src.loc.x, src.loc.y, src.loc.z) + human_mob.attack_log += text("\[[time_stamp()]\] Has been handcuffed (attempt) by [key_name(user)]") + user.attack_log += text("\[[time_stamp()]\] Attempted to handcuff [key_name(human_mob)]") + msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(human_mob)] in [get_area(src)] ([loc.x],[loc.y],[loc.z]).", loc.x, loc.y, loc.z) - user.visible_message(SPAN_NOTICE("[user] tries to put [src] on [H].")) - if(do_after(user, cuff_delay, INTERRUPT_MOVED, BUSY_ICON_HOSTILE, H, INTERRUPT_MOVED, BUSY_ICON_GENERIC)) - if(src == user.get_active_hand() && !H.handcuffed && Adjacent(user)) - if(iscarbon(H)) - if(istype(H.buckled, /obj/structure/bed/roller)) + user.visible_message(SPAN_NOTICE("[user] tries to put [src] on [human_mob].")) + if(do_after(user, cuff_delay, INTERRUPT_MOVED, BUSY_ICON_HOSTILE, human_mob, INTERRUPT_MOVED, BUSY_ICON_GENERIC)) + if(src == user.get_active_hand() && !human_mob.handcuffed && Adjacent(user)) + if(iscarbon(human_mob)) + if(istype(human_mob.buckled, /obj/structure/bed/roller)) to_chat(user, SPAN_DANGER("You cannot handcuff someone who is buckled onto a roller bed.")) return - if(H.has_limb_for_slot(WEAR_HANDCUFFS)) + if(human_mob.has_limb_for_slot(WEAR_HANDCUFFS)) user.drop_inv_item_on_ground(src) - H.equip_to_slot_if_possible(src, WEAR_HANDCUFFS, 1, 0, 1, 1) + human_mob.equip_to_slot_if_possible(src, WEAR_HANDCUFFS, 1, 0, 1, 1) user.count_niche_stat(STATISTICS_NICHE_HANDCUFF) - else if (ismonkey(target)) + else if(ismonkey(target)) user.visible_message(SPAN_NOTICE("[user] tries to put [src] on [target].")) if(do_after(user, 30, INTERRUPT_MOVED, BUSY_ICON_HOSTILE, target, INTERRUPT_MOVED, BUSY_ICON_GENERIC)) if(src == user.get_active_hand() && !target.handcuffed && Adjacent(user)) user.drop_inv_item_on_ground(src) target.equip_to_slot_if_possible(src, WEAR_HANDCUFFS, 1, 0, 1, 1) +/obj/item/restraint/handcuffs + name = "handcuffs" + desc = "Use this to keep prisoners in line." + gender = PLURAL + icon = 'icons/obj/items/items.dmi' + icon_state = "handcuff" + flags_atom = FPRINT|CONDUCT + flags_equip_slot = SLOT_WAIST + throwforce = 5 + w_class = SIZE_SMALL + throw_speed = SPEED_SLOW + throw_range = 5 + matter = list("metal" = 500) + +/obj/item/restraint/handcuffs/get_mob_overlay(mob/user_mob, slot) + var/image/ret = ..() + + var/image/handcuffs = overlay_image('icons/mob/mob.dmi', "handcuff1", color, RESET_COLOR) + ret.overlays += handcuffs + + return ret -/obj/item/handcuffs/zip +/obj/item/restraint/handcuffs/zip name = "zip cuffs" desc = "Single-use plastic zip tie handcuffs." w_class = SIZE_TINY icon_state = "cuff_zip" - breakouttime = 600 //Deciseconds = 60s + breakouttime = 60 SECONDS cuff_sound = 'sound/weapons/cablecuff.ogg' cuff_delay = 20 -/obj/item/handcuffs/zip/place_handcuffs(mob/living/carbon/target, mob/user) +/obj/item/restraint/handcuffs/zip/place_handcuffs(mob/living/carbon/target, mob/user) ..() flags_item |= DELONDROP -/obj/item/handcuffs/cable +/obj/item/restraint/adjustable/verb/adjust_restraints() + set category = "Object" + set name = "Adjust Restraints" + set desc = "Adjust the restraint size for wrists or ankles." + set src = usr.contents + + if(!ishuman(usr)) + return FALSE + + if(usr.is_mob_incapacitated()) + to_chat(usr, "Not right now.") + return FALSE + + switch(target_zone) + if(SLOT_HANDS) + target_zone = SLOT_LEGS + to_chat(usr, SPAN_NOTICE("[src] has been adjusted to tie around a subject's ankles.")) + if(SLOT_LEGS) + target_zone = SLOT_HANDS + to_chat(usr, SPAN_NOTICE("[src] has been adjusted to tie around a subject's wrists.")) + +/obj/item/restraint/adjustable/get_examine_text(mob/user) + . = ..() + switch(target_zone) + if(SLOT_HANDS) + . += SPAN_RED("Sized for human hands.") + if(SLOT_LEGS) + . += SPAN_RED("Sized for human ankles.") + +/obj/item/restraint/adjustable/cable name = "cable restraints" desc = "Looks like some cables tied together. Could be used to tie something up." icon_state = "cuff_white" - breakouttime = 300 //Deciseconds = 30s + breakouttime = 30 SECONDS cuff_sound = 'sound/weapons/cablecuff.ogg' -/obj/item/handcuffs/cable/red +/obj/item/restraint/adjustable/cable/red color = "#DD0000" -/obj/item/handcuffs/cable/yellow +/obj/item/restraint/adjustable/cable/yellow color = "#DDDD00" -/obj/item/handcuffs/cable/blue +/obj/item/restraint/adjustable/cable/blue color = "#0000DD" -/obj/item/handcuffs/cable/green +/obj/item/restraint/adjustable/cable/green color = "#00DD00" -/obj/item/handcuffs/cable/pink +/obj/item/restraint/adjustable/cable/pink color = "#DD00DD" -/obj/item/handcuffs/cable/orange +/obj/item/restraint/adjustable/cable/orange color = "#DD8800" -/obj/item/handcuffs/cable/cyan +/obj/item/restraint/adjustable/cable/cyan color = "#00DDDD" -/obj/item/handcuffs/cable/white +/obj/item/restraint/adjustable/cable/white color = "#FFFFFF" -/obj/item/handcuffs/cable/attackby(obj/item/I, mob/user as mob) +/obj/item/restraint/adjustable/cable/attackby(obj/item/I, mob/user as mob) ..() if(istype(I, /obj/item/stack/rods)) var/obj/item/stack/rods/R = I @@ -130,34 +168,30 @@ qdel(src) update_icon(user) - -/obj/item/handcuffs/cyborg - dispenser = 1 - -/obj/item/handcuffs/cyborg/attack(mob/living/carbon/C as mob, mob/user as mob) - if(!C.handcuffed) +/obj/item/restraint/handcuffs/cyborg/attack(mob/living/carbon/carbon_mob as mob, mob/user as mob) + if(!carbon_mob.handcuffed) var/turf/p_loc = user.loc - var/turf/p_loc_m = C.loc - playsound(src.loc, cuff_sound, 25, 1, 4) - user.visible_message(SPAN_DANGER("[user] is trying to put handcuffs on [C]!")) - - if (ishuman(C)) - var/mob/living/carbon/human/H = C - if (!H.has_limb_for_slot(WEAR_HANDCUFFS)) - to_chat(user, SPAN_DANGER("\The [H] needs at least two wrists before you can cuff them together!")) + var/turf/p_loc_m = carbon_mob.loc + playsound(loc, cuff_sound, 25, 1, 4) + user.visible_message(SPAN_DANGER("[user] is trying to put handcuffs on [carbon_mob]!")) + + if(ishuman(carbon_mob)) + var/mob/living/carbon/human/human_mob = carbon_mob + if (!human_mob.has_limb_for_slot(WEAR_HANDCUFFS)) + to_chat(user, SPAN_DANGER("\The [human_mob] needs at least two wrists before you can cuff them together!")) return spawn(30) - if(!C) return - if(p_loc == user.loc && p_loc_m == C.loc) - C.handcuffed = new /obj/item/handcuffs(C) - C.handcuff_update() + if(!carbon_mob) return + if(p_loc == user.loc && p_loc_m == carbon_mob.loc) + carbon_mob.handcuffed = new /obj/item/restraint/handcuffs(carbon_mob) + carbon_mob.handcuff_update() -/obj/item/restraints +/obj/item/xeno_restraints name = "xeno restraints" desc = "Use this to hold xenomorphic creatures safely." gender = PLURAL @@ -171,10 +205,9 @@ throw_range = 5 matter = list("metal" = 500) - var/dispenser = 0 var/breakouttime = 2 MINUTES -/obj/item/restraints/attack(mob/living/carbon/C as mob, mob/user as mob) +/obj/item/xeno_restraints/attack(mob/living/carbon/C as mob, mob/user as mob) if(!istype(C, /mob/living/carbon/xenomorph)) to_chat(user, SPAN_DANGER("The cuffs do not fit!")) return @@ -187,7 +220,7 @@ spawn(30) if(!C) return if(p_loc == user.loc && p_loc_m == C.loc) - C.handcuffed = new /obj/item/restraints(C) + C.handcuffed = new /obj/item/xeno_restraints(C) C.handcuff_update() C.visible_message(SPAN_DANGER("[C] has been successfully restrained by [user]!")) qdel(src) diff --git a/code/game/objects/items/legcuffs.dm b/code/game/objects/items/legcuffs.dm index c0dfe44728f0..1d216e6556e2 100644 --- a/code/game/objects/items/legcuffs.dm +++ b/code/game/objects/items/legcuffs.dm @@ -1,4 +1,4 @@ -/obj/item/legcuffs +/obj/item/restraint/legcuffs name = "legcuffs" desc = "Use this to keep prisoners in line." gender = PLURAL @@ -8,24 +8,66 @@ throwforce = 0 w_class = SIZE_MEDIUM - var/breakouttime = 15 SECONDS + target_zone = SLOT_LEGS -/obj/item/legcuffs/beartrap +/obj/item/restraint/proc/apply_legcuffs(mob/living/carbon/target, mob/user) + playsound(loc, 'sound/weapons/handcuffs.ogg', 25, 1, 4) + + if(user.action_busy) + return FALSE + + if (ishuman(target)) + var/mob/living/carbon/human/human_target = target + + if (!human_target.has_limb_for_slot(WEAR_LEGCUFFS)) + to_chat(user, SPAN_DANGER("\The [human_target] needs two ankles before you can cuff them together!")) + return FALSE + + human_target.attack_log += text("\[[time_stamp()]\] Has been legcuffed (attempt) by [key_name(user)]") + user.attack_log += text("\[[time_stamp()]\] Attempted to legcuff [key_name(human_target)]") + msg_admin_attack("[key_name(user)] attempted to legcuff [key_name(human_target)] in [get_area(src)] ([loc.x],[loc.y],[loc.z]).", loc.x, loc.y, loc.z) + + user.visible_message(SPAN_NOTICE("[user] tries to put [src] on [human_target].")) + if(do_after(user, cuff_delay, INTERRUPT_MOVED, BUSY_ICON_HOSTILE, human_target, INTERRUPT_MOVED, BUSY_ICON_GENERIC)) + if(src == user.get_active_hand() && !human_target.legcuffed && Adjacent(user)) + if(iscarbon(human_target)) + if(istype(human_target.buckled, /obj/structure/bed/roller)) + to_chat(user, SPAN_DANGER("You cannot legcuff someone who is buckled onto a roller bed.")) + return FALSE + if(human_target.has_limb_for_slot(WEAR_LEGCUFFS)) + user.drop_inv_item_on_ground(src) + human_target.equip_to_slot_if_possible(src, WEAR_LEGCUFFS, 1, 0, 1, 1) + user.count_niche_stat(STATISTICS_NICHE_HANDCUFF) + + else if (ismonkey(target)) + user.visible_message(SPAN_NOTICE("[user] tries to put [src] on [target].")) + if(do_after(user, 30, INTERRUPT_MOVED, BUSY_ICON_HOSTILE, target, INTERRUPT_MOVED, BUSY_ICON_GENERIC)) + if(src == user.get_active_hand() && !target.legcuffed && Adjacent(user)) + user.drop_inv_item_on_ground(src) + target.equip_to_slot_if_possible(src, WEAR_LEGCUFFS, 1, 0, 1, 1) + return TRUE + +/obj/item/restraint/legcuffs/beartrap name = "bear trap" throw_speed = SPEED_FAST throw_range = 1 icon_state = "beartrap0" desc = "A trap used to catch bears and other legged creatures." + breakouttime = 20 SECONDS var/armed = FALSE + manual = FALSE + +/obj/item/restraint/legcuffs/beartrap/apply_legcuffs(mob/living/carbon/target, mob/user) + return FALSE -/obj/item/legcuffs/beartrap/attack_self(mob/user as mob) +/obj/item/restraint/legcuffs/beartrap/attack_self(mob/user as mob) ..() if(ishuman(user) && !user.stat && !user.is_mob_restrained()) armed = !armed icon_state = "beartrap[armed]" to_chat(user, SPAN_NOTICE("[src] is now [armed ? "armed" : "disarmed"]")) -/obj/item/legcuffs/beartrap/Crossed(atom/movable/AM) +/obj/item/restraint/legcuffs/beartrap/Crossed(atom/movable/AM) if(armed) if(ismob(AM)) var/mob/M = AM diff --git a/code/game/objects/items/stacks/cable_coil.dm b/code/game/objects/items/stacks/cable_coil.dm index 077cb801c90d..1dd95464ddd5 100644 --- a/code/game/objects/items/stacks/cable_coil.dm +++ b/code/game/objects/items/stacks/cable_coil.dm @@ -70,7 +70,7 @@ if(src.amount <= 14) to_chat(usr, SPAN_WARNING("You need at least 15 lengths to make restraints!")) return - var/obj/item/handcuffs/cable/B = new /obj/item/handcuffs/cable(usr.loc) + var/obj/item/restraint/adjustable/cable/B = new /obj/item/restraint/adjustable/cable(usr.loc) B.color = color to_chat(usr, SPAN_NOTICE("You wind some cable together to make some restraints.")) src.use(15) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 1daffa2908f0..385c22d3a713 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -357,7 +357,7 @@ /obj/item/explosive/grenade/flashbang, /obj/item/explosive/grenade/custom/teargas, /obj/item/reagent_container/spray/pepper, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/flash, /obj/item/clothing/glasses, /obj/item/ammo_magazine/pistol, @@ -402,7 +402,7 @@ new /obj/item/weapon/gun/energy/taser(src) new /obj/item/device/flash(src) new /obj/item/weapon/baton(src) - new /obj/item/handcuffs(src) + new /obj/item/restraint/handcuffs(src) new /obj/item/reagent_container/spray/pepper(src) new /obj/item/device/clue_scanner(src) @@ -412,7 +412,7 @@ new /obj/item/weapon/baton(src) new /obj/item/reagent_container/spray/pepper(src) new /obj/item/device/clue_scanner(src) - new /obj/item/handcuffs(src) + new /obj/item/restraint/handcuffs(src) /obj/item/storage/belt/security/MP/UPP name = "\improper Type 43 military police rig" @@ -422,7 +422,7 @@ new /obj/item/weapon/gun/energy/taser(src) new /obj/item/device/flash(src) new /obj/item/weapon/baton(src) - new /obj/item/handcuffs(src) + new /obj/item/restraint/handcuffs(src) new /obj/item/reagent_container/spray/pepper(src) new /obj/item/ammo_magazine/revolver/upp/shrapnel(src) @@ -439,8 +439,8 @@ new /obj/item/weapon/baton(src) new /obj/item/reagent_container/spray/pepper(src) new /obj/item/device/clue_scanner(src) - new /obj/item/handcuffs(src) - new /obj/item/handcuffs(src) + new /obj/item/restraint/handcuffs(src) + new /obj/item/restraint/handcuffs(src) new /obj/item/explosive/grenade/flashbang(src) /obj/item/storage/belt/security/MP/CMB/synth/fill_preset_inventory() @@ -449,8 +449,8 @@ new /obj/item/weapon/baton(src) new /obj/item/reagent_container/spray/pepper(src) new /obj/item/device/clue_scanner(src) - new /obj/item/handcuffs(src) - new /obj/item/handcuffs(src) + new /obj/item/restraint/handcuffs(src) + new /obj/item/restraint/handcuffs(src) new /obj/item/explosive/grenade/flashbang(src) /obj/item/storage/belt/marine diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 4b7ecc4c5599..3f5e56f85517 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -345,14 +345,28 @@ icon_state = "handcuff" /obj/item/storage/box/handcuffs/fill_preset_inventory() - new /obj/item/handcuffs(src) - new /obj/item/handcuffs(src) - new /obj/item/handcuffs(src) - new /obj/item/handcuffs(src) - new /obj/item/handcuffs(src) - new /obj/item/handcuffs(src) - new /obj/item/handcuffs(src) + new /obj/item/restraint/handcuffs(src) + new /obj/item/restraint/handcuffs(src) + new /obj/item/restraint/handcuffs(src) + new /obj/item/restraint/handcuffs(src) + new /obj/item/restraint/handcuffs(src) + new /obj/item/restraint/handcuffs(src) + new /obj/item/restraint/handcuffs(src) + + +/obj/item/storage/box/legcuffs + name = "box of legcuffs" + desc = "A box full of legcuffs." + icon_state = "handcuff" +/obj/item/storage/box/legcuffs/fill_preset_inventory() + new /obj/item/restraint/legcuffs(src) + new /obj/item/restraint/legcuffs(src) + new /obj/item/restraint/legcuffs(src) + new /obj/item/restraint/legcuffs(src) + new /obj/item/restraint/legcuffs(src) + new /obj/item/restraint/legcuffs(src) + new /obj/item/restraint/legcuffs(src) /obj/item/storage/box/zipcuffs name = "box of zip cuffs" @@ -360,20 +374,20 @@ icon_state = "handcuff" /obj/item/storage/box/zipcuffs/fill_preset_inventory() - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) /obj/item/storage/box/zipcuffs/small name = "small box of zip cuffs" @@ -381,13 +395,13 @@ w_class = SIZE_MEDIUM /obj/item/storage/box/zipcuffs/fill_preset_inventory() - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) - new /obj/item/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) + new /obj/item/restraint/handcuffs/zip(src) /obj/item/storage/box/tapes name = "box of regulation tapes" diff --git a/code/game/objects/items/tools/maintenance_tools.dm b/code/game/objects/items/tools/maintenance_tools.dm index 574d08e6a15b..de85ad682731 100644 --- a/code/game/objects/items/tools/maintenance_tools.dm +++ b/code/game/objects/items/tools/maintenance_tools.dm @@ -141,7 +141,7 @@ icon_state = "tac_cutters" /obj/item/tool/wirecutters/attack(mob/living/carbon/C, mob/user) - if((C.handcuffed) && (istype(C.handcuffed, /obj/item/handcuffs/cable))) + if((C.handcuffed) && (istype(C.handcuffed, /obj/item/restraint/adjustable/cable))) user.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\ "You cut \the [C]'s restraints with \the [src]!",\ "You hear cable being cut.") diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cm_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/cm_closets.dm index 6c711a7bcabe..baa9e9bd8cc9 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cm_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cm_closets.dm @@ -170,7 +170,7 @@ GLOBAL_LIST_EMPTY(co_secure_boxes) new /obj/item/weapon/gun/energy/taser(src) new /obj/item/weapon/baton(src) new /obj/item/device/flash(src) - new /obj/item/handcuffs(src) + new /obj/item/restraint/handcuffs(src) new /obj/item/reagent_container/spray/pepper(src) new /obj/item/storage/pouch/general/medium(src) if(prob(50)) @@ -205,7 +205,7 @@ GLOBAL_LIST_EMPTY(co_secure_boxes) new /obj/item/storage/backpack/satchel/sec(src) new /obj/item/device/flash(src) new /obj/item/reagent_container/spray/pepper(src) - new /obj/item/handcuffs(src) + new /obj/item/restraint/handcuffs(src) new /obj/item/storage/pouch/general/large(src) /obj/structure/closet/secure_closet/military_officer_spare diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 4318e1a3b184..7d6c8ed3d5dc 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -68,32 +68,47 @@ /obj/item/clothing/shoes/orange name = "orange shoes" icon_state = "orange" - var/obj/item/handcuffs/chained = null + var/obj/item/restraint/handcuffs/chained = null -/obj/item/clothing/shoes/orange/proc/attach_cuffs(obj/item/handcuffs/cuffs, mob/user as mob) - if (src.chained) return +/obj/item/clothing/shoes/orange/proc/attach_cuffs(obj/item/restraint/cuffs, mob/user as mob) + if(chained) + return FALSE user.drop_held_item() cuffs.forceMove(src) - src.chained = cuffs - src.slowdown = 15 - src.icon_state = "orange1" + chained = cuffs + slowdown = 15 + icon_state = "orange1" + time_to_equip = (cuffs.breakouttime / 4) + time_to_unequip = cuffs.breakouttime + return TRUE /obj/item/clothing/shoes/orange/proc/remove_cuffs(mob/user as mob) - if (!src.chained) return + if(!chained) + return FALSE - user.put_in_hands(src.chained) - src.chained.add_fingerprint(user) + user.put_in_hands(chained) + chained.add_fingerprint(user) - src.slowdown = initial(slowdown) - src.icon_state = "orange" - src.chained = null + slowdown = initial(slowdown) + icon_state = "orange" + chained = null + time_to_equip = initial(time_to_equip) + time_to_unequip = initial(time_to_unequip) + return TRUE /obj/item/clothing/shoes/orange/attack_self(mob/user as mob) ..() remove_cuffs(user) -/obj/item/clothing/shoes/orange/attackby(H as obj, mob/user as mob) +/obj/item/clothing/shoes/orange/attackby(attacking_object as obj, mob/user as mob) ..() - if (istype(H, /obj/item/handcuffs)) - attach_cuffs(H, user) + if(istype(attacking_object, /obj/item/restraint)) + var/obj/item/restraint/cuffs = attacking_object + if(cuffs.target_zone == SLOT_LEGS) + attach_cuffs(cuffs, user) + +/obj/item/clothing/shoes/orange/get_examine_text(mob/user) + . = ..() + if(chained) + . += SPAN_RED("They are chained with [chained].") diff --git a/code/modules/clothing/spacesuits/captain.dm b/code/modules/clothing/spacesuits/captain.dm index 26bc03eed608..2643e43b2b6a 100644 --- a/code/modules/clothing/spacesuits/captain.dm +++ b/code/modules/clothing/spacesuits/captain.dm @@ -24,7 +24,7 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_FEET|BODY_FLAG_ARMS - allowed = list(/obj/item/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun, /obj/item/ammo_magazine, /obj/item/weapon/baton,/obj/item/handcuffs) + allowed = list(/obj/item/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun, /obj/item/ammo_magazine, /obj/item/weapon/baton,/obj/item/restraint/handcuffs) slowdown = 1.5 armor_melee = CLOTHING_ARMOR_MEDIUMHIGH armor_bullet = CLOTHING_ARMOR_MEDIUMHIGH diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index dd540033b2a2..36dd5f4f04c8 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -43,7 +43,7 @@ icon_state = "pirate" item_state = "pirate" w_class = SIZE_MEDIUM - allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/baton,/obj/item/handcuffs,/obj/item/tank/emergency_oxygen) + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/baton,/obj/item/restraint/handcuffs,/obj/item/tank/emergency_oxygen) slowdown = 0 armor_melee = CLOTHING_ARMOR_MEDIUM armor_bullet = CLOTHING_ARMOR_MEDIUM @@ -93,7 +93,7 @@ /obj/item/clothing/suit/space/compression/uscm name = "\improper MK.50 compression suit" desc = "A heavy, bulky civilian space suit, fitted with armored plates. This specific suit has found its way into the ragtag inventory of the USCM's patrol boat requisitions system." - allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/baton,/obj/item/handcuffs,/obj/item/tank) + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/baton,/obj/item/restraint/handcuffs,/obj/item/tank) // Souto man diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 82d461c5ca55..7e9a41c6becc 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -47,7 +47,7 @@ /obj/item/device/flashlight, /obj/item/ammo_magazine/, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/binoculars, /obj/item/storage/large_holster/machete, /obj/item/storage/belt/gun/m4a3, @@ -81,7 +81,7 @@ /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/explosive/grenade, /obj/item/device/binoculars, /obj/item/attachable/bayonet, @@ -250,7 +250,7 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_FEET|BODY_FLAG_ARMS - allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/baton,/obj/item/handcuffs,/obj/item/tank/emergency_oxygen) + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/baton,/obj/item/restraint/handcuffs,/obj/item/tank/emergency_oxygen) slowdown = 1 armor_melee = CLOTHING_ARMOR_HIGH armor_bullet = CLOTHING_ARMOR_HIGH @@ -355,7 +355,7 @@ item_state = "centcom" w_class = SIZE_LARGE//bulky item flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_FEET|BODY_FLAG_ARMS|BODY_FLAG_HANDS - allowed = list(/obj/item/weapon/gun,/obj/item/weapon/baton,/obj/item/handcuffs,/obj/item/tank/emergency_oxygen) + allowed = list(/obj/item/weapon/gun,/obj/item/weapon/baton,/obj/item/restraint/handcuffs,/obj/item/tank/emergency_oxygen) flags_inventory = NO_FLAGS flags_inv_hide = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT flags_cold_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_FEET|BODY_FLAG_ARMS|BODY_FLAG_HANDS diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 59e0918550ed..eb99005328bc 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -51,7 +51,7 @@ item_state = "bio_suit" allowed = list( /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/binoculars, /obj/item/attachable/bayonet, diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 5b97051852a6..589fb3b97221 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -181,11 +181,11 @@ /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/binoculars, /obj/item/attachable/bayonet, /obj/item/storage/belt/gun/m4a3, @@ -245,7 +245,7 @@ /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/binoculars, /obj/item/attachable/bayonet, /obj/item/storage/belt/gun/m4a3, @@ -310,7 +310,7 @@ /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/binoculars, /obj/item/attachable/bayonet, /obj/item/storage/belt/gun/m4a3, @@ -409,7 +409,7 @@ /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/binoculars, /obj/item/attachable/bayonet, diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 1bdb4ca31176..d0f6d1cc868a 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -20,7 +20,7 @@ /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/binoculars, /obj/item/attachable/bayonet, @@ -185,7 +185,7 @@ /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/binoculars, /obj/item/attachable/bayonet, /obj/item/storage/belt/gun/m4a3, diff --git a/code/modules/clothing/suits/marine_armor/_marine_armor.dm b/code/modules/clothing/suits/marine_armor/_marine_armor.dm index e2facb987959..78ea29108e68 100644 --- a/code/modules/clothing/suits/marine_armor/_marine_armor.dm +++ b/code/modules/clothing/suits/marine_armor/_marine_armor.dm @@ -270,7 +270,7 @@ /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/explosive/grenade, /obj/item/device/binoculars, /obj/item/attachable/bayonet, diff --git a/code/modules/clothing/suits/marine_armor/ert.dm b/code/modules/clothing/suits/marine_armor/ert.dm index 106b09961103..90fb962ffa93 100644 --- a/code/modules/clothing/suits/marine_armor/ert.dm +++ b/code/modules/clothing/suits/marine_armor/ert.dm @@ -41,7 +41,7 @@ /obj/item/device/flashlight, /obj/item/ammo_magazine/, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/explosive/grenade, @@ -515,7 +515,7 @@ /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/binoculars, /obj/item/attachable/bayonet, /obj/item/device/flashlight, @@ -576,7 +576,7 @@ /obj/item/device/flashlight, /obj/item/ammo_magazine/, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/explosive/grenade, @@ -611,7 +611,7 @@ /obj/item/device/flashlight, /obj/item/ammo_magazine/, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/explosive/grenade, @@ -714,7 +714,7 @@ /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/explosive/grenade, /obj/item/device/binoculars, /obj/item/attachable/bayonet, @@ -778,7 +778,7 @@ /obj/item/device/flashlight, /obj/item/ammo_magazine/, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/explosive/grenade, diff --git a/code/modules/clothing/suits/marine_coat.dm b/code/modules/clothing/suits/marine_coat.dm index 2dd93eb66aee..78c8154e1810 100644 --- a/code/modules/clothing/suits/marine_coat.dm +++ b/code/modules/clothing/suits/marine_coat.dm @@ -24,7 +24,7 @@ /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/binoculars, /obj/item/attachable/bayonet, /obj/item/storage/belt/gun/m4a3, diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 54148d4f7076..252b99e124bc 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -128,7 +128,7 @@ /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/device/taperecorder, @@ -153,7 +153,7 @@ /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/device/taperecorder, @@ -290,7 +290,7 @@ item_state = "webbing" allowed = list( /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/binoculars, /obj/item/attachable/bayonet, @@ -318,7 +318,7 @@ item_state = "synth_utility_vest" allowed = list( /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/binoculars, /obj/item/attachable/bayonet, @@ -455,7 +455,7 @@ /obj/item/storage/fancy/cigarettes, /obj/item/tool/lighter, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/binoculars, /obj/item/attachable/bayonet, diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 133265b34b7e..3b415cf0f9e8 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -112,7 +112,7 @@ allowed = list( /obj/item/weapon/gun, /obj/item/weapon/baton, - /obj/item/handcuffs, + /obj/item/restraint/handcuffs, /obj/item/device/flashlight, /obj/item/device/healthanalyzer, diff --git a/code/modules/gear_presets/cmb.dm b/code/modules/gear_presets/cmb.dm index d568e2838ae2..8be44f94a2e8 100644 --- a/code/modules/gear_presets/cmb.dm +++ b/code/modules/gear_presets/cmb.dm @@ -96,7 +96,7 @@ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/pump/dual_tube/cmb, WEAR_J_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/large, WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/buckshot, WEAR_IN_R_STORE) @@ -112,7 +112,7 @@ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/highpower, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/highpower, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/pump/dual_tube/cmb, WEAR_J_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge/rubber, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/large, WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/buckshot, WEAR_IN_R_STORE) @@ -128,7 +128,7 @@ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/mp5, WEAR_J_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector, WEAR_L_HAND) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/large, WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp5, WEAR_IN_R_STORE) @@ -278,8 +278,8 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full, WEAR_L_HAND) //pouches new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large, WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/flashbang, WEAR_IN_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas, WEAR_IN_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/tactical, WEAR_R_STORE) diff --git a/code/modules/gear_presets/survivors/fiorina_sciannex/riot_in_progress_insert_fiorina_nightmare.dm b/code/modules/gear_presets/survivors/fiorina_sciannex/riot_in_progress_insert_fiorina_nightmare.dm index 657439a13f50..3fdbe72c05be 100644 --- a/code/modules/gear_presets/survivors/fiorina_sciannex/riot_in_progress_insert_fiorina_nightmare.dm +++ b/code/modules/gear_presets/survivors/fiorina_sciannex/riot_in_progress_insert_fiorina_nightmare.dm @@ -50,7 +50,7 @@ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/pump/dual_tube/cmb, WEAR_J_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun, WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/buckshot, WEAR_IN_R_STORE) @@ -63,7 +63,7 @@ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/highpower, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/highpower, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/pump/dual_tube/cmb, WEAR_J_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge/rubber, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun, WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/handful/shotgun/buckshot, WEAR_IN_R_STORE) @@ -76,7 +76,7 @@ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/cmb/normalpoint, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/mp5, WEAR_J_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector, WEAR_L_HAND) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine, WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/mp5, WEAR_IN_R_STORE) @@ -120,8 +120,8 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/holobadge/cord, WEAR_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/droppouch, WEAR_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/upgraded, WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/candy, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/imidazoline, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/CMB, WEAR_JACKET) @@ -163,8 +163,8 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/ua_riot, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/prop/helmetgarb/riot_shield, WEAR_IN_HELMET) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/flashlight, WEAR_IN_BACK) @@ -240,8 +240,8 @@ /datum/equipment_preset/synth/survivor/cmb/ua_synth/load_gear(mob/living/carbon/human/new_human) //backpack new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/baton_slug, WEAR_IN_BACK) @@ -256,9 +256,9 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/ua_riot, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/holobadge/cord, WEAR_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/droppouch, WEAR_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/storage/box/flashbangs, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/ua_riot/synth, WEAR_JACKET) diff --git a/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm b/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm index 8cd72c58ad80..44d029d44c87 100644 --- a/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm +++ b/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm @@ -159,7 +159,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/droppouch, WEAR_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/scalpel/manager, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/flask/weylandyutani, WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/pmc/light/synth, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/weapon/telebaton, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/nailgun, WEAR_IN_JACKET) diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index 4eb674cf3796..9bfa2335e94a 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -461,8 +461,8 @@ WEAR_EYES = /obj/item/clothing/glasses/sunglasses/sechud, WEAR_BODY = /obj/item/clothing/under/colonist/white_service, WEAR_BACK = /obj/item/storage/backpack/satchel/sec, - WEAR_IN_BACK = /obj/item/handcuffs/zip, - WEAR_IN_BACK = /obj/item/handcuffs/zip, + WEAR_IN_BACK = /obj/item/restraint/handcuffs, + WEAR_IN_BACK = /obj/item/restraint/handcuffs, WEAR_JACKET = /obj/item/clothing/suit/storage/webbing, WEAR_WAIST = /obj/item/storage/belt/security/MP/full/synth, WEAR_IN_JACKET = /obj/item/weapon/telebaton, @@ -800,7 +800,7 @@ new_human.equip_to_slot_or_del(new /obj/item/stack/nanopaste(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/stack/nanopaste(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/tranquilizer(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset(new_human), WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/full(new_human), WEAR_R_STORE) diff --git a/code/modules/gear_presets/upp.dm b/code/modules/gear_presets/upp.dm index cdb955bd9696..450662ba25c3 100644 --- a/code/modules/gear_presets/upp.dm +++ b/code/modules/gear_presets/upp.dm @@ -2671,8 +2671,8 @@ new_human.equip_to_slot_or_del(UPP, WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/faction/UPP/support/synth, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/weapon/telebaton, WEAR_IN_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked, WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp, WEAR_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/upp/naval, WEAR_ACCESSORY) @@ -3014,8 +3014,8 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/large, WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full, WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) spawn_weapon(/obj/item/weapon/gun/rifle/type71/carbine/commando, /obj/item/ammo_magazine/rifle/type71, new_human, 0, 8) @@ -3143,8 +3143,8 @@ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/explosive/C4, WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_JACKET) spawn_weapon(/obj/item/weapon/gun/rifle/type71/carbine/commando, /obj/item/ammo_magazine/rifle/type71, new_human, 0, 5) @@ -3304,8 +3304,8 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/large, WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/explosive/C4, WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/handcuffs, WEAR_IN_BACK) spawn_weapon(/obj/item/weapon/gun/rifle/type71/carbine/commando, /obj/item/ammo_magazine/rifle/type71, new_human, 0, 7) @@ -3445,8 +3445,8 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/large, WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full, WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) spawn_weapon(/obj/item/weapon/gun/rifle/type71/carbine/commando, /obj/item/ammo_magazine/rifle/type71, new_human, 0, 8) @@ -3485,8 +3485,8 @@ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/explosive/C4, WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_JACKET) spawn_weapon(/obj/item/weapon/gun/rifle/type71/carbine/commando, /obj/item/ammo_magazine/rifle/type71, new_human, 0, 5) @@ -3518,8 +3518,8 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/large, WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/explosive/C4, WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/handcuffs, WEAR_IN_BACK) //*****************************************************************************************************/ diff --git a/code/modules/gear_presets/uscm_event.dm b/code/modules/gear_presets/uscm_event.dm index 3ab1dbc99b4e..eb206c8259bf 100644 --- a/code/modules/gear_presets/uscm_event.dm +++ b/code/modules/gear_presets/uscm_event.dm @@ -98,7 +98,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/MP/general(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/cotablet(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/mateba_case/general(new_human.back), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs(new_human.back), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs(new_human.back), WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/weapon/telebaton, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/device/flash, WEAR_IN_JACKET) @@ -174,7 +174,7 @@ //TODO: preload all of those items before equipping the backpack //Otherwise, if you spawn the spy next to other people //they will see messages for them putting guns and explosives into their backpack... - new_human.equip_to_slot_or_del(new /obj/item/handcuffs(new_human.back), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/np92/suppressed/tranq(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/np92/tranq(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/np92/tranq(new_human.back), WEAR_IN_BACK) @@ -241,7 +241,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/flash(new_human), WEAR_IN_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs(new_human), WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/combat(new_human), WEAR_J_STORE) /datum/equipment_preset/uscm_event/provost/tml @@ -288,7 +288,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/flash(new_human), WEAR_IN_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs(new_human), WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/combat(new_human), WEAR_J_STORE) /datum/equipment_preset/uscm_event/provost/inspector @@ -329,7 +329,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/MP/provost/light/flexi(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/flash(new_human), WEAR_IN_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs(new_human), WEAR_IN_JACKET) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs(new_human), WEAR_IN_JACKET) /datum/equipment_preset/uscm_event/provost/inspector/advisor name = "Provost Advisor" diff --git a/code/modules/gear_presets/uscm_police.dm b/code/modules/gear_presets/uscm_police.dm index 14e35d990348..76df4d6de2be 100644 --- a/code/modules/gear_presets/uscm_police.dm +++ b/code/modules/gear_presets/uscm_police.dm @@ -226,8 +226,8 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas(new_human.back), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs(new_human.back), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs(new_human.back), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs(new_human.back), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/large/beanbag/riot(new_human), WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/large/beanbag/riot(new_human), WEAR_R_STORE) if(new_human.disabilities & NEARSIGHTED) diff --git a/code/modules/gear_presets/wy_goons.dm b/code/modules/gear_presets/wy_goons.dm index 7867016491dc..9207b9d55a2d 100644 --- a/code/modules/gear_presets/wy_goons.dm +++ b/code/modules/gear_presets/wy_goons.dm @@ -74,9 +74,9 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/weapon/baton, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/m4a3/mod88, WEAR_WAIST) @@ -108,7 +108,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/engineerpack/ert, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/weapon/baton, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle, WEAR_IN_BACK) @@ -145,9 +145,9 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/weapon/baton, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/restraint/handcuffs/zip, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/m4a3/mod88, WEAR_WAIST) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 6ff2a96b72f0..03a8abef22af 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -5,7 +5,7 @@ var/life_tick = 0 // The amount of life ticks that have processed on this mob. - var/obj/item/handcuffs/handcuffed = null //Whether or not the mob is handcuffed + var/obj/item/restraint/handcuffs/handcuffed = null //Whether or not the mob is handcuffed var/overeat_cooldown = 0 diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 44286b5fabe0..4b3d2257eb9e 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -163,7 +163,7 @@ var/datum/skills/skills = null //the knowledge you have about certain abilities and actions (e.g. do you how to do surgery?) //see skills.dm in #define folder and code/datums/skills.dm for more info - var/obj/item/legcuffs/legcuffed = null //Same as handcuffs but for legs. Bear traps use this. + var/obj/item/restraint/legcuffs/legcuffed = null //Same as handcuffs but for legs. Bear traps use this. var/list/viruses = list() //List of active diseases diff --git a/maps/map_files/BigRed/BigRed.dmm b/maps/map_files/BigRed/BigRed.dmm index 82e04ca58330..422a143de94a 100644 --- a/maps/map_files/BigRed/BigRed.dmm +++ b/maps/map_files/BigRed/BigRed.dmm @@ -2905,7 +2905,7 @@ /area/bigredv2/outside/marshal_office) "aiG" = ( /obj/structure/surface/table, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/structure/transmitter/colony_net/rotary{ phone_category = "Solaris Ridge"; phone_color = "red"; @@ -2955,7 +2955,7 @@ /area/bigredv2/outside/marshal_office) "aiM" = ( /obj/structure/surface/table, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, /turf/open/floor, /area/bigredv2/outside/marshal_office) @@ -16219,7 +16219,7 @@ /area/bigredv2/outside/general_store) "aVL" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/handcuffs/cable, +/obj/item/restraint/adjustable/cable, /turf/open/floor, /area/bigredv2/outside/general_store) "aVM" = ( @@ -16667,7 +16667,7 @@ /area/bigredv2/outside/general_store) "aWY" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/handcuffs/cable/cyan, +/obj/item/restraint/adjustable/cable/cyan, /turf/open/floor, /area/bigredv2/outside/general_store) "aXb" = ( @@ -26626,7 +26626,7 @@ /area/bigredv2/caves/mining) "cry" = ( /obj/structure/surface/table/reinforced, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor{ dir = 9; icon_state = "redfull" diff --git a/maps/map_files/BigRed/sprinkles/20.etatunnel_open.dmm b/maps/map_files/BigRed/sprinkles/20.etatunnel_open.dmm index 633a79f6acb9..8f155a1eabef 100644 --- a/maps/map_files/BigRed/sprinkles/20.etatunnel_open.dmm +++ b/maps/map_files/BigRed/sprinkles/20.etatunnel_open.dmm @@ -250,7 +250,7 @@ pixel_x = -11; pixel_y = 1 }, -/obj/item/handcuffs{ +/obj/item/restraint/handcuffs{ pixel_x = 1; pixel_y = 5 }, @@ -432,7 +432,7 @@ /area/bigredv2/caves_sw) "OV" = ( /obj/structure/surface/rack, -/obj/item/handcuffs{ +/obj/item/restraint/handcuffs{ pixel_x = 1; pixel_y = 5 }, @@ -509,7 +509,7 @@ "Ue" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/paper_bundle, -/obj/item/handcuffs{ +/obj/item/restraint/handcuffs{ pixel_y = -3 }, /turf/open/floor/plating{ diff --git a/maps/map_files/BigRed/sprinkles/40.viro_open.dmm b/maps/map_files/BigRed/sprinkles/40.viro_open.dmm index 05e058c4071a..f58cfc3b7977 100644 --- a/maps/map_files/BigRed/sprinkles/40.viro_open.dmm +++ b/maps/map_files/BigRed/sprinkles/40.viro_open.dmm @@ -493,7 +493,7 @@ /area/bigredv2/outside/virology) "bH" = ( /obj/structure/surface/table/almayer, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor{ dir = 6; icon_state = "asteroidwarning" diff --git a/maps/map_files/BigRed/sprinkles/70.se-checkpoint.dmm b/maps/map_files/BigRed/sprinkles/70.se-checkpoint.dmm index 8907ab630fcb..7a3bdb9df798 100644 --- a/maps/map_files/BigRed/sprinkles/70.se-checkpoint.dmm +++ b/maps/map_files/BigRed/sprinkles/70.se-checkpoint.dmm @@ -44,7 +44,7 @@ /area/bigredv2/outside/filtration_cave_cas) "el" = ( /obj/structure/surface/table/almayer, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor, /area/bigred/ground/security) "ge" = ( diff --git a/maps/map_files/BigRed/standalone/crashlanding-eva.dmm b/maps/map_files/BigRed/standalone/crashlanding-eva.dmm index 33eefe09518f..ad059bf053f2 100644 --- a/maps/map_files/BigRed/standalone/crashlanding-eva.dmm +++ b/maps/map_files/BigRed/standalone/crashlanding-eva.dmm @@ -448,7 +448,7 @@ /area/bigredv2/outside/general_offices) "cb" = ( /obj/structure/surface/rack, -/obj/item/restraints, +/obj/item/xeno_restraints, /turf/open/shuttle/dropship/can_surgery/dark_grey, /area/bigredv2/outside/general_offices) "cc" = ( diff --git a/maps/map_files/BigRed/standalone/crashlanding-offices.dmm b/maps/map_files/BigRed/standalone/crashlanding-offices.dmm index 48bac15b3127..0a52f3f9d17d 100644 --- a/maps/map_files/BigRed/standalone/crashlanding-offices.dmm +++ b/maps/map_files/BigRed/standalone/crashlanding-offices.dmm @@ -254,7 +254,7 @@ /area/bigredv2/outside/office_complex) "aU" = ( /obj/structure/surface/rack, -/obj/item/restraints, +/obj/item/xeno_restraints, /turf/open/shuttle/dropship/can_surgery/dark_grey, /area/bigredv2/outside/office_complex) "aV" = ( diff --git a/maps/map_files/CORSAT/Corsat.dmm b/maps/map_files/CORSAT/Corsat.dmm index 6c179dbc8b2c..28db8fa8831f 100644 --- a/maps/map_files/CORSAT/Corsat.dmm +++ b/maps/map_files/CORSAT/Corsat.dmm @@ -4894,7 +4894,7 @@ /area/corsat/gamma/airlock/north) "aoq" = ( /obj/structure/surface/table/almayer, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/corsat{ dir = 4; icon_state = "red" @@ -13705,7 +13705,7 @@ /area/corsat/omega/airlocknorth/id) "aMA" = ( /obj/structure/surface/table/reinforced, -/obj/item/restraints, +/obj/item/xeno_restraints, /turf/open/floor/corsat{ icon_state = "plate" }, @@ -27154,7 +27154,7 @@ /area/corsat/gamma/medbay) "byJ" = ( /obj/structure/surface/rack, -/obj/item/restraints, +/obj/item/xeno_restraints, /turf/open/floor/corsat{ dir = 1; icon_state = "purplewhite" @@ -28908,7 +28908,7 @@ /area/corsat/sigma/south/security) "bDu" = ( /obj/structure/surface/table/almayer, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/corsat{ dir = 8; icon_state = "red" @@ -29586,8 +29586,8 @@ /area/corsat/gamma/security) "bFF" = ( /obj/structure/surface/table/almayer, -/obj/item/handcuffs, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/corsat{ dir = 8; icon_state = "red" @@ -33064,8 +33064,8 @@ /area/corsat/omega/checkpoint) "bRn" = ( /obj/structure/surface/rack, -/obj/item/handcuffs, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/corsat{ dir = 4; icon_state = "red" @@ -33269,7 +33269,7 @@ "bSb" = ( /obj/structure/surface/table/almayer, /obj/item/clipboard, -/obj/item/handcuffs/zip, +/obj/item/restraint/handcuffs/zip, /turf/open/floor/corsat{ icon_state = "plate" }, @@ -33308,8 +33308,8 @@ name = "riot cabinet"; req_access_txt = "100" }, -/obj/item/handcuffs, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/corsat{ icon_state = "red" }, @@ -35399,7 +35399,7 @@ dir = 8 }, /obj/structure/surface/table/reinforced, -/obj/item/restraints, +/obj/item/xeno_restraints, /turf/open/floor/corsat{ dir = 8; icon_state = "red" @@ -44668,8 +44668,8 @@ name = "riot cabinet"; req_access_txt = "100" }, -/obj/item/restraints, -/obj/item/restraints, +/obj/item/xeno_restraints, +/obj/item/xeno_restraints, /turf/open/floor/corsat{ dir = 6; icon_state = "red" @@ -63062,7 +63062,7 @@ /area/corsat/omega/hangar) "wrd" = ( /obj/structure/surface/rack, -/obj/item/restraints, +/obj/item/xeno_restraints, /turf/open/shuttle/dropship{ icon_state = "rasputin15" }, @@ -63828,7 +63828,7 @@ /area/corsat/omega/complex) "wUd" = ( /obj/structure/surface/table/almayer, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/corsat{ dir = 8; icon_state = "red" diff --git a/maps/map_files/DesertDam/Desert_Dam.dmm b/maps/map_files/DesertDam/Desert_Dam.dmm index fff406145a3a..3c4125023686 100644 --- a/maps/map_files/DesertDam/Desert_Dam.dmm +++ b/maps/map_files/DesertDam/Desert_Dam.dmm @@ -18539,7 +18539,7 @@ }, /area/desert_dam/interior/dam_interior/north_tunnel) "bfk" = ( -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/item/weapon/baton, /obj/structure/surface/table/woodentable/fancy, /turf/open/floor/interior/wood/alt, @@ -26207,7 +26207,7 @@ /area/desert_dam/exterior/valley/valley_mining) "bFf" = ( /obj/structure/surface/table, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/prison{ dir = 10; icon_state = "darkred2" @@ -37633,7 +37633,7 @@ /area/desert_dam/building/warehouse/breakroom) "cqj" = ( /obj/structure/surface/table, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/prison{ icon_state = "darkred2" }, diff --git a/maps/map_files/DesertDam/sprinkles/10.damtemple_intact.dmm b/maps/map_files/DesertDam/sprinkles/10.damtemple_intact.dmm index d0ebbc5039d5..6c7e859826db 100644 --- a/maps/map_files/DesertDam/sprinkles/10.damtemple_intact.dmm +++ b/maps/map_files/DesertDam/sprinkles/10.damtemple_intact.dmm @@ -139,7 +139,7 @@ /obj/structure/surface/table/reinforced/prison{ color = "#6b675e" }, -/obj/item/legcuffs/beartrap{ +/obj/item/restraint/legcuffs/beartrap{ pixel_x = -1; pixel_y = 8 }, diff --git a/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm b/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm index a03946d3c6cf..d1dd76922ee1 100644 --- a/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm +++ b/maps/map_files/FOP_v2_Cellblocks/Prison_Station_FOP.dmm @@ -3451,10 +3451,10 @@ /area/prison/research/secret) "aiZ" = ( /obj/structure/surface/rack, -/obj/item/handcuffs, -/obj/item/handcuffs, -/obj/item/handcuffs, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/prison{ dir = 8; icon_state = "darkpurple2" @@ -13789,7 +13789,7 @@ /area/prison/command/secretary_office) "aMK" = ( /obj/structure/closet, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/item/clothing/mask/muzzle, /obj/item/weapon/chainofcommand, /turf/open/floor/prison{ diff --git a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm index f6e85338a637..fcbdcc4fdc33 100644 --- a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm +++ b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm @@ -444,7 +444,7 @@ "anl" = ( /obj/item/pamphlet/engineer, /obj/structure/closet, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/effect/landmark/objective_landmark/close, /turf/open/floor/prison{ icon_state = "darkredfull2" @@ -2947,7 +2947,7 @@ /area/fiorina/lz/near_lzI) "bMG" = ( /obj/structure/surface/rack, -/obj/item/handcuffs/zip, +/obj/item/restraint/handcuffs/zip, /turf/open/floor/prison{ icon_state = "darkredfull2" }, @@ -18049,7 +18049,7 @@ /area/fiorina/tumor/civres) "kWv" = ( /obj/structure/surface/table/reinforced/prison, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/prison, /area/fiorina/station/security) "kWx" = ( @@ -19576,7 +19576,7 @@ }, /area/fiorina/station/lowsec) "lNv" = ( -/obj/item/handcuffs/cable/pink, +/obj/item/restraint/adjustable/cable/pink, /turf/open/floor/prison/chapel_carpet{ dir = 1; icon_state = "doubleside" @@ -31005,7 +31005,7 @@ /area/fiorina/tumor/ice_lab) "sQC" = ( /obj/structure/surface/rack, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/prison{ icon_state = "darkredfull2" }, @@ -38287,7 +38287,7 @@ /area/fiorina/station/chapel) "xoK" = ( /obj/structure/closet, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/item/clothing/mask/muzzle, /obj/item/weapon/chainofcommand, /turf/open/floor/wood, diff --git a/maps/map_files/FOP_v3_Sciannex/sprinkles/20.yardbasketball.dmm b/maps/map_files/FOP_v3_Sciannex/sprinkles/20.yardbasketball.dmm index 6662ebf081f0..ce60474959f1 100644 --- a/maps/map_files/FOP_v3_Sciannex/sprinkles/20.yardbasketball.dmm +++ b/maps/map_files/FOP_v3_Sciannex/sprinkles/20.yardbasketball.dmm @@ -36,7 +36,7 @@ "f" = ( /obj/effect/landmark/corpsespawner/ua_riot, /obj/effect/decal/cleanable/blood, -/obj/item/handcuffs/zip{ +/obj/item/restraint/handcuffs/zip{ pixel_y = -12 }, /turf/open/floor/wood, diff --git a/maps/map_files/FOP_v3_Sciannex/sprinkles/25.researchprestine.dmm b/maps/map_files/FOP_v3_Sciannex/sprinkles/25.researchprestine.dmm index 8df7c92de478..9ff0e6e4a246 100644 --- a/maps/map_files/FOP_v3_Sciannex/sprinkles/25.researchprestine.dmm +++ b/maps/map_files/FOP_v3_Sciannex/sprinkles/25.researchprestine.dmm @@ -696,11 +696,11 @@ dir = 1; pixel_y = 21 }, -/obj/item/handcuffs{ +/obj/item/restraint/handcuffs{ pixel_x = -3; pixel_y = 10 }, -/obj/item/handcuffs{ +/obj/item/restraint/handcuffs{ pixel_x = 4 }, /turf/open/floor/prison{ diff --git a/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm b/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm index 74d5921e30de..5326d72de2a8 100644 --- a/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm +++ b/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm @@ -12163,7 +12163,7 @@ /area/ice_colony/surface/command/crisis) "aIv" = ( /obj/structure/surface/table/woodentable, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/item/tool/stamp, /turf/open/floor/wood, /area/ice_colony/surface/command/crisis) @@ -28871,7 +28871,7 @@ /area/ice_colony/underground/security/interrogation) "bJH" = ( /obj/structure/surface/table/reinforced, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/structure/machinery/flasher_button{ id = "sec_checkpoint"; pixel_y = 24 @@ -30138,7 +30138,7 @@ "bMX" = ( /obj/item/book/manual/marine_law, /obj/structure/surface/table/reinforced, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor{ dir = 1; icon_state = "darkred2" @@ -33966,7 +33966,7 @@ /area/ice_colony/underground/medical/storage) "bXR" = ( /obj/structure/surface/table/woodentable, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/item/weapon/baton, /turf/open/floor/wood, /area/ice_colony/underground/security/marshal) diff --git a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm index 1514e8023b99..b1ce353976c2 100644 --- a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm +++ b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm @@ -2249,7 +2249,7 @@ /area/shiva/interior/colony/medseceng) "akT" = ( /obj/structure/surface/table/woodentable, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/item/weapon/baton, /turf/open/floor/wood, /area/shiva/interior/colony/medseceng) @@ -20198,7 +20198,7 @@ "pCJ" = ( /obj/item/book/manual/marine_law, /obj/structure/surface/table/reinforced/prison, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/shiva{ dir = 1; icon_state = "red" @@ -22216,7 +22216,7 @@ /area/shiva/interior/colony/medseceng) "rMe" = ( /obj/structure/surface/table, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/item/tool/stamp, /turf/open/floor/shiva{ icon_state = "bluefull" @@ -26358,7 +26358,7 @@ /turf/open/shuttle/dropship/can_surgery/medium_grey_single_wide_left_to_right, /area/shiva/interior/aerodrome) "vWf" = ( -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/shiva{ dir = 8; icon_state = "redfull" diff --git a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm index bdf58d54fb34..94c7420a6da4 100644 --- a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm +++ b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm @@ -17205,8 +17205,8 @@ /area/lv522/atmos/cargo_intake) "hlH" = ( /obj/structure/surface/table/reinforced/prison, -/obj/item/handcuffs/cable/white, -/obj/item/handcuffs/cable/white{ +/obj/item/restraint/adjustable/cable/white, +/obj/item/restraint/adjustable/cable/white{ pixel_y = 4 }, /turf/open/floor/strata{ @@ -18239,13 +18239,13 @@ /area/lv522/indoors/c_block/casino) "hIz" = ( /obj/structure/surface/table/almayer, -/obj/item/handcuffs{ +/obj/item/restraint/handcuffs{ pixel_y = 12 }, -/obj/item/handcuffs{ +/obj/item/restraint/handcuffs{ pixel_y = 6 }, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/item/weapon/classic_baton, /turf/open/floor/prison{ icon_state = "darkredfull2" diff --git a/maps/map_files/LV624/LV624.dmm b/maps/map_files/LV624/LV624.dmm index 46f5a179a50e..a9baa8a1efc7 100644 --- a/maps/map_files/LV624/LV624.dmm +++ b/maps/map_files/LV624/LV624.dmm @@ -9358,7 +9358,7 @@ /area/lv624/lazarus/security) "aPv" = ( /obj/structure/surface/table/reinforced/prison, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/item/storage/firstaid/adv, /obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot, /turf/open/floor{ @@ -24636,10 +24636,10 @@ /area/lv624/ground/caves/east_caves) "xwQ" = ( /obj/structure/surface/table/reinforced/prison, -/obj/item/handcuffs/cable/white{ +/obj/item/restraint/adjustable/cable/white{ pixel_y = 4 }, -/obj/item/handcuffs/cable/white, +/obj/item/restraint/adjustable/cable/white, /turf/open/floor{ icon_state = "whiteyellow" }, diff --git a/maps/map_files/LV624/maintemple/1.intact.dmm b/maps/map_files/LV624/maintemple/1.intact.dmm index 8f7c741d80c6..ea69a6c4c787 100644 --- a/maps/map_files/LV624/maintemple/1.intact.dmm +++ b/maps/map_files/LV624/maintemple/1.intact.dmm @@ -515,7 +515,7 @@ /obj/structure/surface/table/reinforced/prison{ color = "#6b675e" }, -/obj/item/restraints, +/obj/item/xeno_restraints, /obj/effect/landmark/objective_landmark/close, /turf/open/floor/strata{ color = "#5e5d5d"; diff --git a/maps/map_files/LV624/standalone/clfship.dmm b/maps/map_files/LV624/standalone/clfship.dmm index 34032943b1c1..090ad40084f7 100644 --- a/maps/map_files/LV624/standalone/clfship.dmm +++ b/maps/map_files/LV624/standalone/clfship.dmm @@ -1328,11 +1328,11 @@ "IP" = ( /obj/structure/bed, /obj/item/bedsheet/yellow, -/obj/item/handcuffs{ +/obj/item/restraint/handcuffs{ pixel_x = 4; pixel_y = 4 }, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/almayer{ dir = 6; icon_state = "green" diff --git a/maps/map_files/LV624/standalone/corporatedome.dmm b/maps/map_files/LV624/standalone/corporatedome.dmm index 0778d0c61564..9c3eddbac441 100644 --- a/maps/map_files/LV624/standalone/corporatedome.dmm +++ b/maps/map_files/LV624/standalone/corporatedome.dmm @@ -1216,7 +1216,7 @@ "ZG" = ( /obj/effect/decal/cleanable/blood, /obj/effect/landmark/corpsespawner/scientist, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor{ icon_state = "dark" }, diff --git a/maps/map_files/New_Varadero/New_Varadero.dmm b/maps/map_files/New_Varadero/New_Varadero.dmm index 1450edbbd180..e0d689cf1c8c 100644 --- a/maps/map_files/New_Varadero/New_Varadero.dmm +++ b/maps/map_files/New_Varadero/New_Varadero.dmm @@ -2317,7 +2317,7 @@ pixel_x = -5; pixel_y = 1 }, -/obj/item/handcuffs{ +/obj/item/restraint/handcuffs{ pixel_x = 2; pixel_y = 16 }, @@ -2875,7 +2875,7 @@ }, /area/varadero/interior/chapel) "bPL" = ( -/obj/item/handcuffs{ +/obj/item/restraint/handcuffs{ pixel_x = 2; pixel_y = 16 }, @@ -21989,7 +21989,7 @@ /area/varadero/interior/hall_SE) "ohi" = ( /obj/structure/surface/table/reinforced/prison, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/structure/machinery/flasher_button{ id = "sec_checkpoint"; pixel_y = 24 @@ -28062,7 +28062,7 @@ /area/varadero/interior/caves/east) "rTu" = ( /obj/structure/surface/table/woodentable, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/item/weapon/baton, /turf/open/floor/wood, /area/varadero/interior/security) @@ -33846,7 +33846,7 @@ "vEa" = ( /obj/structure/closet/crate/medical, /obj/item/tool/wirecutters/clippers, -/obj/item/handcuffs/zip, +/obj/item/restraint/handcuffs/zip, /obj/item/tool/surgery/surgicaldrill, /obj/item/storage/firstaid/adv, /turf/open/floor/shiva{ diff --git a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm index 6b8b6b82e284..db1f07a8b3b1 100644 --- a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm +++ b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm @@ -40149,7 +40149,7 @@ "ulv" = ( /obj/structure/surface/rack, /obj/item/weapon/gun/pistol/t73, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/strata{ icon_state = "red1" }, diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index c87ab7b4c09a..40aab722447d 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -33975,9 +33975,9 @@ /area/almayer/hallways/lower/port_midship_hallway) "hAG" = ( /obj/structure/closet/crate/internals, -/obj/item/handcuffs/cable/blue, -/obj/item/handcuffs/cable/blue, -/obj/item/handcuffs/cable/cyan, +/obj/item/restraint/adjustable/cable/blue, +/obj/item/restraint/adjustable/cable/blue, +/obj/item/restraint/adjustable/cable/cyan, /obj/effect/spawner/random/toolbox, /turf/open/shuttle/dropship{ icon_state = "rasputin3" @@ -54633,7 +54633,7 @@ "oFn" = ( /obj/structure/surface/table/almayer, /obj/item/tool/wirecutters/clippers, -/obj/item/handcuffs/zip, +/obj/item/restraint/handcuffs/zip, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -67491,7 +67491,7 @@ pixel_x = -5; pixel_y = 5 }, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/item/storage/firstaid/regular, /obj/structure/machinery/light{ dir = 8 @@ -77926,7 +77926,7 @@ pixel_y = 5 }, /obj/item/paper, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/item/clothing/mask/cigarette/cigar/classic, /obj/item/coin/silver{ desc = "A small coin, bearing the falling falcons insignia."; diff --git a/maps/map_files/generic/Admin_level.dmm b/maps/map_files/generic/Admin_level.dmm index d085d7a99b0c..36538b22cb60 100644 --- a/maps/map_files/generic/Admin_level.dmm +++ b/maps/map_files/generic/Admin_level.dmm @@ -1264,7 +1264,7 @@ "Dw" = ( /obj/structure/closet/secure_closet/brig, /obj/item/book/manual/marine_law, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/almayer{ dir = 4; icon_state = "red" diff --git a/maps/predship/huntership.dmm b/maps/predship/huntership.dmm index 113f6448d3a8..433d9057dc70 100644 --- a/maps/predship/huntership.dmm +++ b/maps/predship/huntership.dmm @@ -2907,30 +2907,30 @@ /obj/structure/surface/table/reinforced/prison{ color = "#6b675e" }, -/obj/item/legcuffs{ +/obj/item/restraint/legcuffs{ pixel_y = 5 }, -/obj/item/legcuffs{ +/obj/item/restraint/legcuffs{ pixel_y = 5 }, -/obj/item/legcuffs{ +/obj/item/restraint/legcuffs{ pixel_y = 5 }, -/obj/item/legcuffs{ +/obj/item/restraint/legcuffs{ pixel_y = 5 }, -/obj/item/legcuffs{ +/obj/item/restraint/legcuffs{ pixel_y = 5 }, -/obj/item/legcuffs{ +/obj/item/restraint/legcuffs{ pixel_y = 5 }, -/obj/item/handcuffs, -/obj/item/handcuffs, -/obj/item/handcuffs, -/obj/item/handcuffs, -/obj/item/handcuffs, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/shuttle/predship, /area/yautja) "GM" = ( @@ -3447,12 +3447,12 @@ /obj/structure/surface/table/reinforced/prison{ color = "#6b675e" }, -/obj/item/restraints, -/obj/item/restraints, -/obj/item/restraints, -/obj/item/restraints, -/obj/item/restraints, -/obj/item/restraints, +/obj/item/xeno_restraints, +/obj/item/xeno_restraints, +/obj/item/xeno_restraints, +/obj/item/xeno_restraints, +/obj/item/xeno_restraints, +/obj/item/xeno_restraints, /turf/open/shuttle/predship, /area/yautja) "VT" = ( diff --git a/maps/predship/regular.dmm b/maps/predship/regular.dmm index 895e8ae84c91..984bd4e7c65a 100644 --- a/maps/predship/regular.dmm +++ b/maps/predship/regular.dmm @@ -1136,12 +1136,12 @@ /area/yautja) "dk" = ( /obj/structure/surface/table/reinforced, -/obj/item/handcuffs, -/obj/item/handcuffs, -/obj/item/handcuffs, -/obj/item/handcuffs, -/obj/item/handcuffs, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/holofloor{ dir = 2; icon_state = "cult" @@ -1149,12 +1149,12 @@ /area/yautja) "dl" = ( /obj/structure/surface/table/reinforced, -/obj/item/legcuffs, -/obj/item/legcuffs, -/obj/item/legcuffs, -/obj/item/legcuffs, -/obj/item/legcuffs, -/obj/item/legcuffs, +/obj/item/restraint/legcuffs, +/obj/item/restraint/legcuffs, +/obj/item/restraint/legcuffs, +/obj/item/restraint/legcuffs, +/obj/item/restraint/legcuffs, +/obj/item/restraint/legcuffs, /turf/open/floor/holofloor{ dir = 2; icon_state = "cult" diff --git a/maps/shuttles/ert_shuttle_big.dmm b/maps/shuttles/ert_shuttle_big.dmm index f3983899e249..a07c57e00a20 100644 --- a/maps/shuttles/ert_shuttle_big.dmm +++ b/maps/shuttles/ert_shuttle_big.dmm @@ -84,9 +84,9 @@ pixel_x = -2; pixel_y = 3 }, -/obj/item/handcuffs, -/obj/item/handcuffs, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/almayer{ icon_state = "plate" }, diff --git a/maps/templates/lazy_templates/clf_ert_station.dmm b/maps/templates/lazy_templates/clf_ert_station.dmm index 908f8de06dcb..3aa8c800327f 100644 --- a/maps/templates/lazy_templates/clf_ert_station.dmm +++ b/maps/templates/lazy_templates/clf_ert_station.dmm @@ -804,7 +804,7 @@ "sx" = ( /obj/structure/surface/table/woodentable/poor, /obj/item/clothing/glasses/sunglasses/blindfold, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/wood, /area/adminlevel/ert_station/clf_station) "sC" = ( @@ -1817,8 +1817,8 @@ "Ro" = ( /obj/structure/surface/table/woodentable/poor, /obj/item/clothing/glasses/sunglasses/blindfold, -/obj/item/handcuffs, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/wood, /area/adminlevel/ert_station/clf_station) "Rr" = ( diff --git a/maps/templates/lazy_templates/freelancer_ert_station.dmm b/maps/templates/lazy_templates/freelancer_ert_station.dmm index bf9709e2150d..74c368e4f0b6 100644 --- a/maps/templates/lazy_templates/freelancer_ert_station.dmm +++ b/maps/templates/lazy_templates/freelancer_ert_station.dmm @@ -811,7 +811,7 @@ "Hg" = ( /obj/structure/closet/secure_closet/brig, /obj/item/book/manual/marine_law, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/almayer{ dir = 4; icon_state = "red" diff --git a/maps/templates/lazy_templates/twe_ert_station.dmm b/maps/templates/lazy_templates/twe_ert_station.dmm index 2c9c696d7842..10e175eae24c 100644 --- a/maps/templates/lazy_templates/twe_ert_station.dmm +++ b/maps/templates/lazy_templates/twe_ert_station.dmm @@ -1465,11 +1465,11 @@ }, /area/adminlevel/ert_station/royal_marines_station) "Cm" = ( -/obj/item/handcuffs{ +/obj/item/restraint/handcuffs{ pixel_y = 12 }, /obj/structure/surface/table/almayer, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/item/weapon/baton{ pixel_x = -12 }, @@ -2658,11 +2658,11 @@ "VL" = ( /obj/structure/surface/table/almayer, /obj/item/clothing/suit/straight_jacket, -/obj/item/handcuffs{ +/obj/item/restraint/handcuffs{ pixel_x = -4; pixel_y = 1 }, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /obj/effect/decal/cleanable/dirt, /turf/open/floor/almayer{ icon_state = "redfull" diff --git a/maps/templates/lazy_templates/upp_ert_station.dmm b/maps/templates/lazy_templates/upp_ert_station.dmm index ae2a8ad40c47..fd1e6186bf73 100644 --- a/maps/templates/lazy_templates/upp_ert_station.dmm +++ b/maps/templates/lazy_templates/upp_ert_station.dmm @@ -828,11 +828,11 @@ "me" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/clothing/suit/straight_jacket, -/obj/item/handcuffs{ +/obj/item/restraint/handcuffs{ pixel_x = -4; pixel_y = 1 }, -/obj/item/handcuffs, +/obj/item/restraint/handcuffs, /turf/open/floor/strata{ icon_state = "red1" }, From 8df635a5ae91742a0c0eb3c3d4aff8736d71778c Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 9 May 2024 21:28:24 +0100 Subject: [PATCH 49/50] Automatic changelog for PR #5696 [ci skip] --- html/changelogs/AutoChangeLog-pr-5696.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5696.yml diff --git a/html/changelogs/AutoChangeLog-pr-5696.yml b/html/changelogs/AutoChangeLog-pr-5696.yml new file mode 100644 index 000000000000..072a82d6a7e5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5696.yml @@ -0,0 +1,9 @@ +author: "realforest2001" +delete-after: True +changes: + - code_imp: "Repaths handcuffs and legcuffs to have a shared parent." + - code_imp: "Repaths xeno restraints to reduce confusion from the typepath." + - rscadd: "Legcuffs work appropriately now, and can be found in small numbers within security vendors." + - rscadd: "Cable restraints can now be adjusted via right-click to fit on wrists or ankles." + - rscadd: "Prison shoe chains now require ankle restraints rather than handcuffs." + - rscadd: "Prison shoes that have been chained now have an equp and unequip delay to account for the chains, proportionate to the breakout time of the item used in the chains." \ No newline at end of file From 2478f9efed6df9042f9b7f5150f3a49a4033ec4a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 10 May 2024 01:12:23 +0000 Subject: [PATCH 50/50] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5696.yml | 9 --------- html/changelogs/archive/2024-05.yml | 12 ++++++++++++ 2 files changed, 12 insertions(+), 9 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5696.yml diff --git a/html/changelogs/AutoChangeLog-pr-5696.yml b/html/changelogs/AutoChangeLog-pr-5696.yml deleted file mode 100644 index 072a82d6a7e5..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5696.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - code_imp: "Repaths handcuffs and legcuffs to have a shared parent." - - code_imp: "Repaths xeno restraints to reduce confusion from the typepath." - - rscadd: "Legcuffs work appropriately now, and can be found in small numbers within security vendors." - - rscadd: "Cable restraints can now be adjusted via right-click to fit on wrists or ankles." - - rscadd: "Prison shoe chains now require ankle restraints rather than handcuffs." - - rscadd: "Prison shoes that have been chained now have an equp and unequip delay to account for the chains, proportionate to the breakout time of the item used in the chains." \ No newline at end of file diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml index af586d5033c1..ae04a832ea51 100644 --- a/html/changelogs/archive/2024-05.yml +++ b/html/changelogs/archive/2024-05.yml @@ -90,3 +90,15 @@ 2024-05-07: Zonespace, d.1.n.a. (original sprites), esselnek (new sprites): - rscadd: Added the M540-B Armored Recon Carrier as a t1 intel purchase. +2024-05-10: + realforest2001: + - code_imp: Repaths handcuffs and legcuffs to have a shared parent. + - code_imp: Repaths xeno restraints to reduce confusion from the typepath. + - rscadd: Legcuffs work appropriately now, and can be found in small numbers within + security vendors. + - rscadd: Cable restraints can now be adjusted via right-click to fit on wrists + or ankles. + - rscadd: Prison shoe chains now require ankle restraints rather than handcuffs. + - rscadd: Prison shoes that have been chained now have an equp and unequip delay + to account for the chains, proportionate to the breakout time of the item used + in the chains.