From cbfb9f31da9d858240ab9f543c37d0171e4825c7 Mon Sep 17 00:00:00 2001 From: fira Date: Wed, 22 Nov 2023 20:08:17 +0100 Subject: [PATCH 01/84] Makes Thunderdome Floor Explosion-Proof (#4994) # About the pull request Explosions could permanently mess with the tdome floor. This looks ugly and happens frequently with the amount of abombs thrown in it. # Explain why it's good for the game Admin level looks cleaner and clearer. # Testing Photographs and Procedure Drop-Bomb enter enter DMM edited in-place via regex, shouldn't be any mapmerging issues # Changelog :cl: fix: The Thunderdome floor is now explosion-proof. /:cl: --- code/game/turfs/floor_types.dm | 7 ++++ maps/map_files/generic/Admin_level.dmm | 52 +++++++++++++------------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/code/game/turfs/floor_types.dm b/code/game/turfs/floor_types.dm index 4e47fd004f74..e9c6b9a2048e 100644 --- a/code/game/turfs/floor_types.dm +++ b/code/game/turfs/floor_types.dm @@ -203,6 +203,13 @@ icon_state = "default" plating_type = /turf/open/floor/plating/almayer +/// Admin level thunderdome floor. Doesn't get damaged by explosions and such for pristine testing +/turf/open/floor/tdome + icon = 'icons/turf/almayer.dmi' + icon_state = "plating" + plating_type = /turf/open/floor/tdome + hull_floor = TRUE + //Cargo elevator /turf/open/floor/almayer/empty name = "empty space" diff --git a/maps/map_files/generic/Admin_level.dmm b/maps/map_files/generic/Admin_level.dmm index 43b3d26ec3f9..d085d7a99b0c 100644 --- a/maps/map_files/generic/Admin_level.dmm +++ b/maps/map_files/generic/Admin_level.dmm @@ -12,7 +12,7 @@ /turf/open/floor/wood/ship, /area/adminlevel/ert_station) "ad" = ( -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -27,7 +27,7 @@ id = "tdome_observer"; name = "\improper Observer Shutters" }, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -63,7 +63,7 @@ /obj/effect/decal/warning_stripes{ icon_state = "W" }, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -72,7 +72,7 @@ /obj/effect/decal/warning_stripes{ icon_state = "E" }, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -83,7 +83,7 @@ id = "tdome_t2"; name = "\improper Team 2 Shutters" }, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ icon_state = "test_floor4" }, /area/tdome) @@ -101,7 +101,7 @@ /turf/open/space, /area/space) "aE" = ( -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 1; icon_state = "w-y0" }, @@ -683,7 +683,7 @@ /obj/item/device/binoculars{ pixel_y = 4 }, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -896,7 +896,7 @@ }, /area/adminlevel/ert_station/shuttle_dispatch) "wj" = ( -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 1; icon_state = "w-y2" }, @@ -921,7 +921,7 @@ /area/adminlevel/ert_station) "wv" = ( /obj/structure/machinery/vending/snack, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -1147,7 +1147,7 @@ /obj/effect/decal/warning_stripes{ icon_state = "E" }, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -1163,7 +1163,7 @@ /obj/structure/flora/pottedplant{ icon_state = "pottedplant_20" }, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -1277,13 +1277,13 @@ /turf/open/floor/plating/almayer, /area/adminlevel/ert_station/shuttle_dispatch) "DV" = ( -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ icon_state = "tcomms" }, /area/tdome) "Ee" = ( /obj/effect/landmark/thunderdome/one, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -1375,7 +1375,7 @@ "Fw" = ( /obj/structure/surface/table/almayer, /obj/item/storage/fancy/cigar, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -1639,7 +1639,7 @@ /turf/closed/wall/mineral/gold, /area/adminlevel/ert_station) "Kq" = ( -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ icon_state = "redfull" }, /area/tdome/tdome2) @@ -1738,7 +1738,7 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -1871,7 +1871,7 @@ /area/adminlevel/ert_station) "NU" = ( /obj/structure/machinery/vending/cola, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -1937,7 +1937,7 @@ /obj/effect/decal/warning_stripes{ icon_state = "W" }, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -1967,13 +1967,13 @@ /area/adminlevel/simulation) "PF" = ( /obj/effect/landmark/thunderdome/two, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, /area/tdome/tdome2) "PJ" = ( -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 1; icon_state = "w-y1" }, @@ -2041,7 +2041,7 @@ /area/adminlevel/ert_station) "QL" = ( /obj/structure/bed/chair/comfy/black, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ icon_state = "tcomms" }, /area/tdome/tdomeobserve) @@ -2095,7 +2095,7 @@ id = "tdome_t1"; name = "\improper Team 1 Shutters" }, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ icon_state = "test_floor4" }, /area/tdome) @@ -2165,7 +2165,7 @@ name = "Observer Shutters"; pixel_y = 9 }, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -2313,7 +2313,7 @@ /area/adminlevel/ert_station) "VD" = ( /obj/structure/machinery/vending/cigarette/free, -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -2483,7 +2483,7 @@ }, /area/adminlevel/ert_station) "YP" = ( -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ dir = 5; icon_state = "plating" }, @@ -2498,7 +2498,7 @@ /turf/open/floor/plating/plating_catwalk, /area/adminlevel/ert_station) "Zd" = ( -/turf/open/floor/almayer{ +/turf/open/floor/tdome{ icon_state = "bluefull" }, /area/tdome/tdome1) From 876259e9e0f21cd24e2ea0a1d188bf3187bfb37c Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 22 Nov 2023 19:23:53 +0000 Subject: [PATCH 02/84] Automatic changelog for PR #4994 [ci skip] --- html/changelogs/AutoChangeLog-pr-4994.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4994.yml diff --git a/html/changelogs/AutoChangeLog-pr-4994.yml b/html/changelogs/AutoChangeLog-pr-4994.yml new file mode 100644 index 000000000000..2ace9428aaef --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4994.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "The Thunderdome floor is now explosion-proof." \ No newline at end of file From fa6ee9c0498a15d07664297c2127081f1e3799f6 Mon Sep 17 00:00:00 2001 From: Sort1eEnMer <151575280+Sort1eEnMer@users.noreply.github.com> Date: Wed, 22 Nov 2023 13:20:12 -0600 Subject: [PATCH 03/84] Match Unlock Time in Nuke Timelock Message with Nuke Techtree Description (#4987) # About the pull request Matches the unlock time given in the refused nuke timelock message with the time given in the nuke's techtree description. # Explain why it's good for the game It was confusing seeing two different numbers for when the nuke would be unlocked. # Testing Photographs and Procedure Gave myself tech points, tried to unlock nuke early, time was correct after commit. # Changelog :cl: SortieEnMer qol: Match Unlock Time in Nuke Timelock Message with Nuke Techtree Description / :cl: --- code/modules/cm_tech/techs/marine/tier4/nuke.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cm_tech/techs/marine/tier4/nuke.dm b/code/modules/cm_tech/techs/marine/tier4/nuke.dm index f970f37a3fab..932caa4a6853 100644 --- a/code/modules/cm_tech/techs/marine/tier4/nuke.dm +++ b/code/modules/cm_tech/techs/marine/tier4/nuke.dm @@ -36,7 +36,7 @@ return if(ROUND_TIME < NUKE_UNLOCK_TIME) - to_chat(unlocking_mob, SPAN_WARNING("You cannot purchase this node before [NUKE_UNLOCK_TIME / (1 MINUTES)] minutes into the operation.")) + to_chat(unlocking_mob, SPAN_WARNING("You cannot purchase this node before [Ceiling((NUKE_UNLOCK_TIME + SSticker.round_start_time) / (1 MINUTES))] minutes into the operation.")) return FALSE return TRUE From 43d197a373d5968979ebdbc51bd1a5a7a764646e Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 22 Nov 2023 19:39:34 +0000 Subject: [PATCH 04/84] Automatic changelog for PR #4987 [ci skip] --- html/changelogs/AutoChangeLog-pr-4987.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4987.yml diff --git a/html/changelogs/AutoChangeLog-pr-4987.yml b/html/changelogs/AutoChangeLog-pr-4987.yml new file mode 100644 index 000000000000..ef48b7dd6e62 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4987.yml @@ -0,0 +1,4 @@ +author: "SortieEnMer" +delete-after: True +changes: + - qol: "Match Unlock Time in Nuke Timelock Message with Nuke Techtree Description" \ No newline at end of file From 2dfbb94db367141b5ce511c1bcf42b6946adb9be Mon Sep 17 00:00:00 2001 From: zzzmike <85382350+zzzmike@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:21:11 -0800 Subject: [PATCH 05/84] Clarity on hijack announcements (#4989) # About the pull request Makes it clear that pods will also not crash at 100% fuel. And minor change to make the announcement flow a bit better. # Explain why it's good for the game Makes game mechanics a bit more clear for new players. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: qol: ARES hijack announcement specifies that pods will not crash at 100% fuel /:cl: --- code/controllers/subsystem/hijack.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystem/hijack.dm b/code/controllers/subsystem/hijack.dm index 55b5aa75caf8..a256a7f2a8b2 100644 --- a/code/controllers/subsystem/hijack.dm +++ b/code/controllers/subsystem/hijack.dm @@ -216,13 +216,13 @@ SUBSYSTEM_DEF(hijack) switch(announce) if(1) - marine_announcement("Emergency fuel replenishment at 25 percent. Lifeboat emergency early launch now available.[marine_warning_areas ? "\nTo increase speed restore power to the following areas: [marine_warning_areas]" : " All fueling areas operational."]", HIJACK_ANNOUNCE) + marine_announcement("Emergency fuel replenishment is at 25 percent. Lifeboat emergency early launch is now available.[marine_warning_areas ? "\nTo increase speed, restore power to the following areas: [marine_warning_areas]" : " All fueling areas operational."]", HIJACK_ANNOUNCE) if(2) - marine_announcement("Emergency fuel replenishment at 50 percent.[marine_warning_areas ? "\nTo increase speed restore power to the following areas: [marine_warning_areas]" : " All fueling areas operational."]", HIJACK_ANNOUNCE) + marine_announcement("Emergency fuel replenishment is at 50 percent.[marine_warning_areas ? "\nTo increase speed, restore power to the following areas: [marine_warning_areas]" : " All fueling areas operational."]", HIJACK_ANNOUNCE) if(3) - marine_announcement("Emergency fuel replenishment at 75 percent.[marine_warning_areas ? "\nTo increase speed restore power to the following areas: [marine_warning_areas]" : " All fueling areas operational."]", HIJACK_ANNOUNCE) + marine_announcement("Emergency fuel replenishment is at 75 percent.[marine_warning_areas ? "\nTo increase speed, restore power to the following areas: [marine_warning_areas]" : " All fueling areas operational."]", HIJACK_ANNOUNCE) if(4) - marine_announcement("Emergency fuel replenishment at 100 percent. Safe utilization of lifeboats now possible.", HIJACK_ANNOUNCE) + marine_announcement("Emergency fuel replenishment is at 100 percent. Safe utilization of lifeboats and pods is now possible.", HIJACK_ANNOUNCE) if(!admin_sd_blocked) addtimer(CALLBACK(src, PROC_REF(unlock_self_destruct)), 8 SECONDS) From 8d5f3d38ddee66c1d1a05e36e7843518023ee64c Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 22 Nov 2023 20:01:05 +0000 Subject: [PATCH 06/84] Automatic changelog for PR #4989 [ci skip] --- html/changelogs/AutoChangeLog-pr-4989.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4989.yml diff --git a/html/changelogs/AutoChangeLog-pr-4989.yml b/html/changelogs/AutoChangeLog-pr-4989.yml new file mode 100644 index 000000000000..062eaf000f63 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4989.yml @@ -0,0 +1,4 @@ +author: "zzzmike" +delete-after: True +changes: + - qol: "ARES hijack announcement specifies that pods will not crash at 100% fuel" \ No newline at end of file From c2aeb60871c36165ff4e7bf91df0f8749d833bad Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:21:31 -0800 Subject: [PATCH 07/84] Fix resin doors not closing on mob/living if they are merged with weeds (#4990) # About the pull request This PR simply changes the mob/living check in `/obj/structure/mineral_door/resin/Close()` to also account for whether they are merged with the weeds. As soon as xeno corpses are also merging with weeds this will handle them too. # Explain why it's good for the game Although I think this is a very rare situation, it can be especially confusing if a fully weeded corpse that intentionally is hard to see is causing a door to not close (seemingly arbitrarily). # Testing Photographs and Procedure
Screenshots & Videos https://github.com/cmss13-devs/cmss13/assets/76988376/4770ff65-c484-4e88-9381-19dfad22ffae
# Changelog :cl: Drathek fix: Resin doors will now close on dead mobs that are merged with weeds (currently only human). fix: Resin doors will now restart their closing timer each open making the delay to close consistent. code: Added a TRAIT_MERGED_WITH_WEEDS that is set whenever the mob is currently merged with weeds. /:cl: --- code/__DEFINES/traits.dm | 2 ++ code/datums/components/weed_food.dm | 2 ++ code/modules/cm_aliens/XenoStructures.dm | 31 ++++++++++++++---------- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index af8af22ca707..7f69a4acc4d6 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -147,6 +147,8 @@ #define TRAIT_IMMOBILIZED "immobilized" /// Apply this to make a mob not dense, and remove it when you want it to no longer make them undense, other sorces of undesity will still apply. Always define a unique source when adding a new instance of this! #define TRAIT_UNDENSE "undense" +/// Apply this to identify a mob as merged with weeds +#define TRAIT_MERGED_WITH_WEEDS "merged_with_weeds" // SPECIES TRAITS /// Knowledge of Yautja technology diff --git a/code/datums/components/weed_food.dm b/code/datums/components/weed_food.dm index 16be8665f55b..648478aa6140 100644 --- a/code/datums/components/weed_food.dm +++ b/code/datums/components/weed_food.dm @@ -260,6 +260,7 @@ merged = TRUE ADD_TRAIT(parent_mob, TRAIT_UNDENSE, XENO_WEED_TRAIT) + ADD_TRAIT(parent_mob, TRAIT_MERGED_WITH_WEEDS, XENO_WEED_TRAIT) parent_mob.anchored = TRUE parent_mob.mouse_opacity = MOUSE_OPACITY_TRANSPARENT parent_mob.plane = FLOOR_PLANE @@ -288,6 +289,7 @@ UnregisterSignal(absorbing_weeds, COMSIG_PARENT_QDELETING) absorbing_weeds = null + REMOVE_TRAIT(parent_mob, TRAIT_MERGED_WITH_WEEDS, XENO_WEED_TRAIT) parent_mob.anchored = FALSE parent_mob.mouse_opacity = MOUSE_OPACITY_ICON parent_mob.plane = GAME_PLANE diff --git a/code/modules/cm_aliens/XenoStructures.dm b/code/modules/cm_aliens/XenoStructures.dm index 73ced8099427..211f53a0ec7a 100644 --- a/code/modules/cm_aliens/XenoStructures.dm +++ b/code/modules/cm_aliens/XenoStructures.dm @@ -418,18 +418,23 @@ update_icon() isSwitchingStates = 0 layer = DOOR_OPEN_LAYER - spawn(close_delay) - if(!isSwitchingStates && state == 1) - Close() + addtimer(CALLBACK(src, PROC_REF(Close)), close_delay, TIMER_UNIQUE|TIMER_OVERRIDE) + +/obj/structure/mineral_door/resin/proc/close_blocked() + for(var/turf/turf in locs) + for(var/mob/living/living_mob in turf) + if(!HAS_TRAIT(living_mob, TRAIT_MERGED_WITH_WEEDS)) + return TRUE + return FALSE /obj/structure/mineral_door/resin/Close() - if(!state || !loc) return //already closed + if(!state || !loc || isSwitchingStates) + return //already closed or changing //Can't close if someone is blocking it - for(var/turf/turf in locs) - if(locate(/mob/living) in turf) - spawn (close_delay) - Close() - return + if(close_blocked()) + addtimer(CALLBACK(src, PROC_REF(Close)), close_delay, TIMER_UNIQUE|TIMER_OVERRIDE) + return + isSwitchingStates = 1 playsound(loc, "alien_resin_move", 25) flick("[mineralType]closing",src) @@ -440,10 +445,10 @@ update_icon() isSwitchingStates = 0 layer = DOOR_CLOSED_LAYER - for(var/turf/turf in locs) - if(locate(/mob/living) in turf) - Open() - return + + if(close_blocked()) + Open() + return /obj/structure/mineral_door/resin/Dismantle(devastated = 0) qdel(src) From 35d5071c5240a37a4e4a79eb588f24cbd6de70de Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 22 Nov 2023 20:21:33 +0000 Subject: [PATCH 08/84] Automatic changelog for PR #4990 [ci skip] --- html/changelogs/AutoChangeLog-pr-4990.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4990.yml diff --git a/html/changelogs/AutoChangeLog-pr-4990.yml b/html/changelogs/AutoChangeLog-pr-4990.yml new file mode 100644 index 000000000000..8f54dcade5d8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4990.yml @@ -0,0 +1,6 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Resin doors will now close on dead mobs that are merged with weeds (currently only human)." + - bugfix: "Resin doors will now restart their closing timer each open making the delay to close consistent." + - code_imp: "Added a TRAIT_MERGED_WITH_WEEDS that is set whenever the mob is currently merged with weeds." \ No newline at end of file From fa3745bf4137a5747a9ec399b4fd284fcca01ba7 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:31:39 -0800 Subject: [PATCH 09/84] Fix buried larva spawn grace period at start of round (#4988) # About the pull request Looking at the code again, #4502 is unintentionally eliminating the buried larva grace period when there is no core. The first 30 minutes should have a core be optional (because the hive is still being established), but the queue requires a core (or nested bodies) to dequeue players from the queue. So as soon as there is one player in queue, buried spawns during the no-core grace period would be stopped. This PR makes it so the queue will only prevent manual buried spawns when there is a core. # Explain why it's good for the game Fixes a situation that needlessly hinders xeno start if the hive puts off creating a core. Also the logic was getting fairly complex here so the early returns should make it more manageable. # 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 buried larva spawn grace period at start of round if there is a queue: Now join as xeno when there's a queue will only prevent buried larva spawns if there is no core. /:cl: --- code/game/gamemodes/cm_initialize.dm | 36 ++++++++++++++++------------ 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm index 17a255009089..519ce4ed4f6f 100644 --- a/code/game/gamemodes/cm_initialize.dm +++ b/code/game/gamemodes/cm_initialize.dm @@ -356,21 +356,27 @@ Additional game mode variables. else available_xenos_non_ssd += cur_xeno - // Only offer buried larva if there is no queue: - // This basically means this block of code will almost never execute, because we are instead relying on the hive cores/larva pops to handle their larva - // Technically this should be after a get_alien_candidates() call to be accurate, but we are intentionally trying to not call that proc as much as possible - if(GLOB.xeno_queue_candidate_count < 1) - var/datum/hive_status/hive - for(var/hivenumber in GLOB.hive_datum) - hive = GLOB.hive_datum[hivenumber] - if(!hive.hardcore && hive.stored_larva && (hive.hive_location || (world.time < XENO_BURIED_LARVA_TIME_LIMIT + SSticker.round_start_time))) - if(SSticker.mode && (SSticker.mode.flags_round_type & MODE_RANDOM_HIVE)) - available_xenos |= "any buried larva" - LAZYADD(available_xenos["any buried larva"], hive) - else - var/larva_option = "buried larva ([hive])" - available_xenos += larva_option - available_xenos[larva_option] = list(hive) + var/datum/hive_status/hive + for(var/hivenumber in GLOB.hive_datum) + hive = GLOB.hive_datum[hivenumber] + if(hive.hardcore) + continue + if(!hive.stored_larva) + continue + // Only offer buried larva if there is no queue because we are instead relying on the hive cores/larva pops to handle their larva: + // Technically this should be after a get_alien_candidates() call to be accurate, but we are intentionally trying to not call that proc as much as possible + if(hive.hive_location && GLOB.xeno_queue_candidate_count > 0) + continue + if(!hive.hive_location && (world.time > XENO_BURIED_LARVA_TIME_LIMIT + SSticker.round_start_time)) + continue + + if(SSticker.mode && (SSticker.mode.flags_round_type & MODE_RANDOM_HIVE)) + available_xenos |= "any buried larva" + LAZYADD(available_xenos["any buried larva"], hive) + else + var/larva_option = "buried larva ([hive])" + available_xenos += larva_option + available_xenos[larva_option] = list(hive) if(!available_xenos.len || (instant_join && !available_xenos_non_ssd.len)) if(!xeno_candidate.client || !xeno_candidate.client.prefs || !(xeno_candidate.client.prefs.be_special & BE_ALIEN_AFTER_DEATH)) From 91d3dd68c6b3870acdbf18d44b667fe30ffbe786 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 22 Nov 2023 20:35:40 +0000 Subject: [PATCH 10/84] Automatic changelog for PR #4988 [ci skip] --- html/changelogs/AutoChangeLog-pr-4988.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4988.yml diff --git a/html/changelogs/AutoChangeLog-pr-4988.yml b/html/changelogs/AutoChangeLog-pr-4988.yml new file mode 100644 index 000000000000..ba67e425bd74 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4988.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fixed buried larva spawn grace period at start of round if there is a queue: Now join as xeno when there's a queue will only prevent buried larva spawns if there is no core." \ No newline at end of file From 7e7db48664cf2a48f6e3eb643106a87f7e45ffff Mon Sep 17 00:00:00 2001 From: ihatethisengine <115417687+ihatethisengine@users.noreply.github.com> Date: Wed, 22 Nov 2023 22:33:50 +0300 Subject: [PATCH 11/84] Oppressor XvX nerf (#4981) # About the pull request Oppressor no longer can abduct "big" xenos (Queen, T3s, hivelord, carrier, defender). # Explain why it's good for the game Way too strong in XvX to abduct an enemy queen. # 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: Oppressor no longer can abduct big xenos. /:cl: --- .../abilities/praetorian/praetorian_powers.dm | 120 +++++++++--------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm index 0d7a86c58318..400a4a80ba49 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm @@ -234,16 +234,16 @@ xeno_attack_delay(stabbing_xeno) return ..() -/datum/action/xeno_action/activable/prae_abduct/use_ability(atom/A) - var/mob/living/carbon/xenomorph/X = owner +/datum/action/xeno_action/activable/prae_abduct/use_ability(atom/atom) + var/mob/living/carbon/xenomorph/xeno = owner - if(!A || A.layer >= FLY_LAYER || !isturf(X.loc)) + if(!atom || atom.layer >= FLY_LAYER || !isturf(xeno.loc)) return - if(!action_cooldown_check() || X.action_busy) + if(!action_cooldown_check() || xeno.action_busy) return - if(!X.check_state()) + if(!xeno.check_state()) return if(!check_plasma_owner()) @@ -252,11 +252,11 @@ // Build our turflist var/list/turf/turflist = list() var/list/telegraph_atom_list = list() - var/facing = get_dir(X, A) - var/turf/T = X.loc - var/turf/temp = X.loc - for(var/x in 0 to max_distance) - temp = get_step(T, facing) + var/facing = get_dir(xeno, atom) + var/turf/turf = xeno.loc + var/turf/temp = xeno.loc + for(var/distance in 0 to max_distance) + temp = get_step(turf, facing) if(facing in diagonals) // check if it goes through corners var/reverse_face = reverse_dir[facing] var/turf/back_left = get_step(temp, turn(reverse_face, 45)) @@ -267,103 +267,103 @@ break var/blocked = FALSE - for(var/obj/structure/S in temp) - if(S.opacity || ((istype(S, /obj/structure/barricade) || istype(S, /obj/structure/girder) && S.density || istype(S, /obj/structure/machinery/door)) && S.density)) + for(var/obj/structure/structure in temp) + if(structure.opacity || ((istype(structure, /obj/structure/barricade) || istype(structure, /obj/structure/girder) && structure.density || istype(structure, /obj/structure/machinery/door)) && structure.density)) blocked = TRUE break if(blocked) break - T = temp + turf = temp - if (T in turflist) + if (turf in turflist) break - turflist += T - facing = get_dir(T, A) - telegraph_atom_list += new /obj/effect/xenomorph/xeno_telegraph/brown/abduct_hook(T, windup) + turflist += turf + facing = get_dir(turf, atom) + telegraph_atom_list += new /obj/effect/xenomorph/xeno_telegraph/brown/abduct_hook(turf, windup) if(!length(turflist)) - to_chat(X, SPAN_XENOWARNING("You don't have any room to do your abduction!")) + to_chat(xeno, SPAN_XENOWARNING("You don't have any room to do your abduction!")) return - X.visible_message(SPAN_XENODANGER("\The [X]'s segmented tail starts coiling..."), SPAN_XENODANGER("You begin coiling your tail, aiming towards \the [A]...")) - X.emote("roar") + xeno.visible_message(SPAN_XENODANGER("\The [xeno]'s segmented tail starts coiling..."), SPAN_XENODANGER("You begin coiling your tail, aiming towards \the [atom]...")) + xeno.emote("roar") - var/throw_target_turf = get_step(X.loc, facing) + var/throw_target_turf = get_step(xeno.loc, facing) - ADD_TRAIT(X, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Abduct")) - X.update_canmove() - if(!do_after(X, windup, INTERRUPT_NO_NEEDHAND, BUSY_ICON_HOSTILE, numticks = 1)) - to_chat(X, SPAN_XENOWARNING("You relax your tail.")) + ADD_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Abduct")) + xeno.update_canmove() + if(!do_after(xeno, windup, INTERRUPT_NO_NEEDHAND, BUSY_ICON_HOSTILE, numticks = 1)) + to_chat(xeno, SPAN_XENOWARNING("You relax your tail.")) apply_cooldown() - for (var/obj/effect/xenomorph/xeno_telegraph/XT in telegraph_atom_list) - telegraph_atom_list -= XT - qdel(XT) + for (var/obj/effect/xenomorph/xeno_telegraph/xenotelegraph in telegraph_atom_list) + telegraph_atom_list -= xenotelegraph + qdel(xenotelegraph) - REMOVE_TRAIT(X, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Abduct")) - X.update_canmove() + REMOVE_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Abduct")) + xeno.update_canmove() return if(!check_and_use_plasma_owner()) return - REMOVE_TRAIT(X, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Abduct")) - X.update_canmove() + REMOVE_TRAIT(xeno, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Abduct")) + xeno.update_canmove() - playsound(get_turf(X), 'sound/effects/bang.ogg', 25, 0) - X.visible_message(SPAN_XENODANGER("\The [X] suddenly uncoils its tail, firing it towards [A]!"), SPAN_XENODANGER("You uncoil your tail, sending it out towards \the [A]!")) + playsound(get_turf(xeno), 'sound/effects/bang.ogg', 25, 0) + xeno.visible_message(SPAN_XENODANGER("\The [xeno] suddenly uncoils its tail, firing it towards [atom]!"), SPAN_XENODANGER("You uncoil your tail, sending it out towards \the [atom]!")) var/list/targets = list() for (var/turf/target_turf in turflist) - for (var/mob/living/carbon/H in target_turf) - if(!isxeno_human(H) || X.can_not_harm(H) || H.is_dead() || H.is_mob_incapacitated(TRUE)) + for (var/mob/living/carbon/target in target_turf) + if(!isxeno_human(target) || xeno.can_not_harm(target) || target.is_dead() || target.is_mob_incapacitated(TRUE) || target.mob_size >= MOB_SIZE_BIG) continue - targets += H + targets += target if (LAZYLEN(targets) == 1) - X.balloon_alert(X, "your tail catches and slows one target!", text_color = "#51a16c") + xeno.balloon_alert(xeno, "your tail catches and slows one target!", text_color = "#51a16c") else if (LAZYLEN(targets) == 2) - X.balloon_alert(X, "your tail catches and roots two targets!", text_color = "#51a16c") + xeno.balloon_alert(xeno, "your tail catches and roots two targets!", text_color = "#51a16c") else if (LAZYLEN(targets) >= 3) - X.balloon_alert(X, "your tail catches and stuns [LAZYLEN(targets)] targets!", text_color = "#51a16c") + xeno.balloon_alert(xeno, "your tail catches and stuns [LAZYLEN(targets)] targets!", text_color = "#51a16c") - for (var/mob/living/carbon/H in targets) - X.visible_message(SPAN_XENODANGER("\The [X]'s hooked tail coils itself around [H]!"), SPAN_XENODANGER("Your hooked tail coils itself around [H]!")) + for (var/mob/living/carbon/target in targets) + xeno.visible_message(SPAN_XENODANGER("\The [xeno]'s hooked tail coils itself around [target]!"), SPAN_XENODANGER("Your hooked tail coils itself around [target]!")) - H.apply_effect(0.2, WEAKEN) + target.apply_effect(0.2, WEAKEN) if (LAZYLEN(targets) == 1) - new /datum/effects/xeno_slow(H, X, , ,25) - H.apply_effect(1, SLOW) + new /datum/effects/xeno_slow(target, xeno, , ,25) + target.apply_effect(1, SLOW) else if (LAZYLEN(targets) == 2) - ADD_TRAIT(H, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Abduct")) - H.update_canmove() - if (ishuman(H)) - var/mob/living/carbon/human/Hu = H - Hu.update_xeno_hostile_hud() - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(unroot_human), H), get_xeno_stun_duration(H, 25)) - to_chat(H, SPAN_XENOHIGHDANGER("[X] has pinned you to the ground! You cannot move!")) + ADD_TRAIT(target, TRAIT_IMMOBILIZED, TRAIT_SOURCE_ABILITY("Abduct")) + target.update_canmove() + if (ishuman(target)) + var/mob/living/carbon/human/human = target + human.update_xeno_hostile_hud() + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(unroot_human), target), get_xeno_stun_duration(target, 25)) + to_chat(target, SPAN_XENOHIGHDANGER("[xeno] has pinned you to the ground! You cannot move!")) - H.set_effect(2, DAZE) + target.set_effect(2, DAZE) else if (LAZYLEN(targets) >= 3) - H.apply_effect(get_xeno_stun_duration(H, 1.3), WEAKEN) - to_chat(H, SPAN_XENOHIGHDANGER("You are slammed into the other victims of [X]!")) + target.apply_effect(get_xeno_stun_duration(target, 1.3), WEAKEN) + to_chat(target, SPAN_XENOHIGHDANGER("You are slammed into the other victims of [xeno]!")) - shake_camera(H, 10, 1) + shake_camera(target, 10, 1) - var/obj/effect/beam/tail_beam = X.beam(H, "oppressor_tail", 'icons/effects/beam.dmi', 0.5 SECONDS, 8) + var/obj/effect/beam/tail_beam = xeno.beam(target, "oppressor_tail", 'icons/effects/beam.dmi', 0.5 SECONDS, 8) var/image/tail_image = image('icons/effects/status_effects.dmi', "hooked") - H.overlays += tail_image + target.overlays += tail_image - H.throw_atom(throw_target_turf, get_dist(throw_target_turf, H)-1, SPEED_VERY_FAST) + target.throw_atom(throw_target_turf, get_dist(throw_target_turf, target)-1, SPEED_VERY_FAST) qdel(tail_beam) // hook beam catches target, throws them back, is deleted (throw_atom has sleeps), then hook beam catches another target, repeat - addtimer(CALLBACK(src, /datum/action/xeno_action/activable/prae_abduct/proc/remove_tail_overlay, H, tail_image), 0.5 SECONDS) //needed so it can actually be seen as it gets deleted too quickly otherwise. + addtimer(CALLBACK(src, /datum/action/xeno_action/activable/prae_abduct/proc/remove_tail_overlay, target, tail_image), 0.5 SECONDS) //needed so it can actually be seen as it gets deleted too quickly otherwise. apply_cooldown() return ..() From d97e87ae249c17e7c9d0d98d3940beee31febfb6 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 22 Nov 2023 20:48:54 +0000 Subject: [PATCH 12/84] Automatic changelog for PR #4981 [ci skip] --- html/changelogs/AutoChangeLog-pr-4981.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4981.yml diff --git a/html/changelogs/AutoChangeLog-pr-4981.yml b/html/changelogs/AutoChangeLog-pr-4981.yml new file mode 100644 index 000000000000..6edc5e60a381 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4981.yml @@ -0,0 +1,4 @@ +author: "ihatethisengine" +delete-after: True +changes: + - balance: "Oppressor no longer can abduct big xenos." \ No newline at end of file From b28e9e5d3b97befc03c05166668d84d1581b34e7 Mon Sep 17 00:00:00 2001 From: zzzmike <85382350+zzzmike@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:34:09 -0800 Subject: [PATCH 13/84] Location name standardization (#4980) # About the pull request The most noticeable thing about this PR is that it converts east/west/north/south references from fuel pumps into port/starboard/etc. Which will be quite noticeable during the hijack announcements when they go online or offline. It also makes it a bit more clear on crew monitor when something is on the upper deck or lower deck, and introduces some standardization for location names. Also ![Screenshot 2023-11-20 063208](https://github.com/cmss13-devs/cmss13/assets/85382350/01e3beff-d009-491d-877e-96e1818538cf) # Explain why it's good for the game I GET IT. It's much easier, especially for new players, if you could refer to things the way they are OOCly on your monitor. But it's also a disservice to have it both ways ingame. The crew monitor never refers to "North Lifeboat". It's starboard. PSA to anyone not good with the directional structure on crew monitor - (I'm not good with it either, don't worry) The engines are on the rear of the ship, in engineering. That's why it must be aft (or stern), and everything else must oriented from that perspective. If someone yells to get on starboard lifeboat, go north. Port? Go south. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: qol: Location name standardization. So, North is now Starboard. This is already how it is for everything except pumps. /:cl: --- code/game/area/almayer.dm | 139 +++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 69 deletions(-) diff --git a/code/game/area/almayer.dm b/code/game/area/almayer.dm index 742ae7a1addb..d9ff42f4f55c 100644 --- a/code/game/area/almayer.dm +++ b/code/game/area/almayer.dm @@ -29,12 +29,12 @@ SShijack.progress_areas[src] = power_equip /area/shuttle/almayer/elevator_maintenance/upperdeck - name = "\improper Maintenance Elevator" + name = "\improper Upper Deck Maintenance Elevator" icon_state = "shuttle" fake_zlevel = 1 /area/shuttle/almayer/elevator_maintenance/lowerdeck - name = "\improper Maintenance Elevator" + name = "\improper Lower Deck Maintenance Elevator" icon_state = "shuttle" fake_zlevel = 2 @@ -98,23 +98,23 @@ resin_construction_allowed = FALSE /area/almayer/command/securestorage - name = "\improper Secure Storage" + name = "\improper Upper Deck Secure Storage" icon_state = "corporatespace" - fake_zlevel = 2 // lowerdeck + fake_zlevel = 1 // upperdeck /area/almayer/command/computerlab - name = "\improper Computer Lab" + name = "\improper Upper Deck Computer Lab" icon_state = "ceroom" - fake_zlevel = 2 // lowerdeck + fake_zlevel = 1 // upperdeck /area/almayer/command/telecomms - name = "\improper Telecommunications" + name = "\improper Upper Deck Telecommunications" icon_state = "tcomms" fake_zlevel = 1 // upperdeck flags_area = AREA_NOTUNNEL /area/almayer/command/self_destruct - name = "\improper Self-Destruct Core Room" + name = "\improper Upper Deck Self-Destruct Core Room" icon_state = "selfdestruct" fake_zlevel = 1 // upperdeck flags_area = AREA_NOTUNNEL @@ -125,7 +125,7 @@ fake_zlevel = 1 // upperdeck /area/almayer/command/combat_correspondent - name = "\improper Combat Correspondent Office" + name = "\improper Upper Deck Combat Correspondent Office" icon_state = "selfdestruct" fake_zlevel = 1 // upperdeck @@ -133,36 +133,36 @@ minimap_color = MINIMAP_AREA_ENGI /area/almayer/engineering/upper_engineering - name = "\improper Upper Engineering" + name = "\improper Upper Deck Engineering" icon_state = "upperengineering" fake_zlevel = 1 // upperdeck /area/almayer/engineering/upper_engineering/starboard - name = "\improper Starboard Upper Engineering" + name = "\improper Upper Deck Starboard Engineering" /area/almayer/engineering/upper_engineering/port - name = "\improper Port Upper Engineering" + name = "\improper Upper Deck Port Engineering" /area/almayer/engineering/upper_engineering/notunnel flags_area = AREA_NOTUNNEL /area/almayer/engineering/ce_room - name = "\improper Chief Engineer Office" + name = "\improper Upper Deck Chief Engineer Office" icon_state = "ceroom" fake_zlevel = 1 // upperdeck /area/almayer/engineering/lower_engine_monitoring - name = "\improper Engine Reactor Monitoring" + name = "\improper Lower Deck Engine Reactor Monitoring" icon_state = "lowermonitoring" fake_zlevel = 2 // lowerdeck /area/almayer/engineering/lower_engineering - name = "\improper Engineering Lower" + name = "\improper Lower Deck Engineering" icon_state = "lowerengineering" fake_zlevel = 2 // lowerdeck /area/almayer/engineering/engineering_workshop - name = "\improper Engineering Workshop" + name = "\improper Lower Deck Engineering Workshop" icon_state = "workshop" fake_zlevel = 2 // lowerdeck @@ -180,17 +180,17 @@ hijack_evacuation_type = EVACUATION_TYPE_ADDITIVE /area/almayer/engineering/starboard_atmos - name = "\improper Atmospherics Starboard" + name = "\improper Upper Deck Starboard Atmospherics" icon_state = "starboardatmos" fake_zlevel = 1 // upperdeck /area/almayer/engineering/port_atmos - name = "\improper Atmospherics Port" + name = "\improper Upper Deck Port Atmospherics" icon_state = "portatmos" fake_zlevel = 1 // upperdeck /area/almayer/engineering/laundry - name = "\improper Laundry Room" + name = "\improper Upper Deck Laundry Room" icon_state = "laundry" fake_zlevel = 1 // upperdeck @@ -211,17 +211,17 @@ fake_zlevel = 2 // lowerdeck /area/almayer/shipboard/starboard_missiles - name = "\improper Missile Tubes Starboard" + name = "\improper Upper Deck Starboard Missile Tubes" icon_state = "starboardmissile" fake_zlevel = 1 // upperdeck /area/almayer/shipboard/port_missiles - name = "\improper Missile Tubes Port" + name = "\improper Upper Deck Port Missile Tubes" icon_state = "portmissile" fake_zlevel = 1 // upperdeck /area/almayer/shipboard/weapon_room - name = "\improper Weapon Control Room" + name = "\improper Lower Deck Weapon Control" icon_state = "weaponroom" fake_zlevel = 2 // lowerdeck @@ -229,12 +229,12 @@ flags_area = AREA_NOTUNNEL /area/almayer/shipboard/starboard_point_defense - name = "\improper Point Defense Starboard" + name = "\improper Lower Deck Starboard Point Defense" icon_state = "starboardpd" fake_zlevel = 2 // lowerdeck /area/almayer/shipboard/port_point_defense - name = "\improper Point Defense Port" + name = "\improper Lower Deck Port Point Defense" icon_state = "portpd" fake_zlevel = 2 // lowerdeck @@ -300,7 +300,7 @@ icon_state = "chiefmpoffice" /area/almayer/shipboard/sea_office - name = "\improper Senior Enlisted Advisor Office" + name = "\improper Lower Deck Senior Enlisted Advisor Office" icon_state = "chiefmpoffice" fake_zlevel = 2 // lowerdeck @@ -326,7 +326,7 @@ soundscape_interval = 50 /area/almayer/hallways/vehiclehangar - name = "\improper Vehicle Storage" + name = "\improper Lower Deck Vehicle Storage" icon_state = "exoarmor" fake_zlevel = 2 @@ -334,135 +334,136 @@ minimap_color = MINIMAP_AREA_COLONY /area/almayer/living/tankerbunks - name = "\improper Vehicle Crew Bunks" + name = "\improper Lower Deck Vehicle Crew Bunks" icon_state = "livingspace" fake_zlevel = 2 /area/almayer/living/auxiliary_officer_office - name = "\improper Auxiliary Support Officer office" + name = "\improper Lower Deck Auxiliary Support Officer office" icon_state = "livingspace" fake_zlevel = 2 /area/almayer/squads/tankdeliveries - name = "\improper Vehicle ASRS" + name = "\improper Lower Deck Vehicle ASRS" icon_state = "req" fake_zlevel = 2 /area/almayer/hallways/exoarmor - name = "\improper Vehicle Armor Storage" + name = "\improper Lower Deck Vehicle Armor Storage" icon_state = "exoarmor" fake_zlevel = 2 // lowerdeck /area/almayer/hallways/repair_bay - name = "\improper Deployment Workshop" + name = "\improper Lower Deck Deployment Workshop" icon_state = "dropshiprepair" fake_zlevel = 2 // lowerdeck /area/almayer/hallways/mission_planner - name = "\improper Dropship Central Computer Room" + name = "\improper Lower Deck Dropship Central Computer Room" icon_state = "missionplanner" fake_zlevel = 2 // lowerdeck /area/almayer/hallways/starboard_umbilical - name = "\improper Umbilical Starboard" + name = "\improper Lower Deck Starboard Umbilical Hallway" icon_state = "starboardumbilical" fake_zlevel = 2 // lowerdeck /area/almayer/hallways/port_umbilical - name = "\improper Umbilical Port" + name = "\improper Lower Deck Port Umbilical Hallway" icon_state = "portumbilical" fake_zlevel = 2 // lowerdeck /area/almayer/hallways/aft_hallway - name = "\improper Hallway Aft" + name = "\improper Upper Deck Aft Hallway" icon_state = "aft" fake_zlevel = 1 // upperdeck /area/almayer/hallways/stern_hallway - name = "\improper Hallway Stern" + name = "\improper Upper Deck Stern Hallway" icon_state = "stern" fake_zlevel = 1 // upperdeck /area/almayer/hallways/port_hallway - name = "\improper Hallway Port" + name = "\improper Lower Deck Port Hallway" icon_state = "port" fake_zlevel = 2 // lowerdeck /area/almayer/hallways/starboard_hallway - name = "\improper Hallway Starboard" + name = "\improper Lower Deck Starboard Hallway" icon_state = "starboard" fake_zlevel = 2 // lowerdeck /area/almayer/stair_clone - name = "\improper Stairs" + name = "\improper Lower Deck Stairs" icon_state = "stairs_lowerdeck" fake_zlevel = 2 // lowerdeck resin_construction_allowed = FALSE /area/almayer/stair_clone/upper + name = "\improper Upper Deck Stairs" icon_state = "stairs_upperdeck" fake_zlevel = 1 // upperdeck /area/almayer/hull/lower_hull - name = "\improper Hull Lower" + name = "\improper Lower Deck Hull" icon_state = "lowerhull" fake_zlevel = 2 // lowerdeck /area/almayer/hull/upper_hull - name = "\improper Hull Upper" + name = "\improper Upper Deck Hull" icon_state = "upperhull" fake_zlevel = 1 // upperdeck /area/almayer/hull/upper_hull/u_f_s - name = "\improper Upper Fore-Starboard Hull" + name = "\improper Upper Deck Fore-Starboard Hull" icon_state = "upperhull" /area/almayer/hull/upper_hull/u_m_s - name = "\improper Upper Midship-Starboard Hull" + name = "\improper Upper Deck Starboard-Midship Hull" icon_state = "upperhull" /area/almayer/hull/upper_hull/u_a_s - name = "\improper Upper Aft-Starboard Hull" + name = "\improper Upper Deck Starboard-Aft Hull" icon_state = "upperhull" /area/almayer/hull/upper_hull/u_f_p - name = "\improper Upper Fore-Port Hull" + name = "\improper Upper Deck Port-Fore Hull" icon_state = "upperhull" /area/almayer/hull/upper_hull/u_m_p - name = "\improper Upper Midship-Port Hull" + name = "\improper Upper Deck Port-Midship Hull" icon_state = "upperhull" /area/almayer/hull/upper_hull/u_a_p - name = "\improper Upper Aft-Port Hull" + name = "\improper Upper Deck Port-Aft Hull" icon_state = "upperhull" /area/almayer/hull/lower_hull/l_f_s - name = "\improper Lower Fore-Starboard Hull" + name = "\improper Lower Deck Starboard-Fore Hull" icon_state = "upperhull" /area/almayer/hull/lower_hull/l_m_s - name = "\improper Lower Midship-Starboard Hull" + name = "\improper Lower Deck Starboard-Midship Hull" icon_state = "upperhull" /area/almayer/hull/lower_hull/l_a_s - name = "\improper Lower Aft-Starboard Hull" + name = "\improper Lower Deck Starboard Hull" icon_state = "upperhull" /area/almayer/hull/lower_hull/l_f_p - name = "\improper Lower Fore-Port Hull" + name = "\improper Lower Deck Port-Fore Hull" icon_state = "upperhull" /area/almayer/hull/lower_hull/l_m_p - name = "\improper Lower Midship-Port Hull" + name = "\improper Lower Deck Port-Midship Hull" icon_state = "upperhull" /area/almayer/hull/lower_hull/l_a_p - name = "\improper Lower Aft-Port Hull" + name = "\improper Lower Deck Port-Aft Hull" icon_state = "upperhull" /area/almayer/living/cryo_cells - name = "\improper Cryo Cells" + name = "\improper Lower Deck Cryo Cells" icon_state = "cryo" fake_zlevel = 2 // lowerdeck @@ -472,22 +473,22 @@ fake_zlevel = 2 // lowerdeck /area/almayer/living/port_emb - name = "\improper Extended Mission Bunks" + name = "\improper Lower Deck Port Extended Mission Bunks" icon_state = "portemb" fake_zlevel = 2 // lowerdeck /area/almayer/living/starboard_emb - name = "\improper Extended Mission Bunks" + name = "\improper Lower Deck Starboard Extended Mission Bunks" icon_state = "starboardemb" fake_zlevel = 2 // lowerdeck /area/almayer/living/port_garden - name = "\improper Garden" + name = "\improper Port Garden" icon_state = "portemb" fake_zlevel = 1 // upperdeck /area/almayer/living/starboard_garden - name = "\improper Garden" + name = "\improper Starboard Garden" icon_state = "starboardemb" fake_zlevel = 1 // upperdeck @@ -502,12 +503,12 @@ fake_zlevel = 2 // lowerdeck /area/almayer/living/officer_rnr - name = "\improper Officer's Lounge" + name = "\improper Upper Deck Officer's Lounge" icon_state = "officerrnr" fake_zlevel = 1 // upperdeck /area/almayer/living/officer_study - name = "\improper Officer's Study" + name = "\improper Upper Deck Officer's Study" icon_state = "officerstudy" fake_zlevel = 1 // upperdeck @@ -522,17 +523,17 @@ fake_zlevel = 2 // lowerdeck /area/almayer/living/gym - name = "\improper Gym" + name = "\improper Lower Deck Gym" icon_state = "officerrnr" fake_zlevel = 2 // lowerdeck /area/almayer/living/cafeteria_officer - name = "\improper Officer Cafeteria" + name = "\improper Upper Deck Officer Cafeteria" icon_state = "food" fake_zlevel = 1 // upperdeck /area/almayer/living/offices - name = "\improper Conference Office" + name = "\improper Lower Deck Conference Office" icon_state = "briefing" fake_zlevel = 2 // lowerdeck @@ -560,7 +561,7 @@ fake_zlevel = 1 // upperdeck /area/almayer/living/synthcloset - name = "\improper Synthetic Storage Closet" + name = "\improper Upper Deck Synthetic Storage Closet" icon_state = "livingspace" fake_zlevel = 1 // upperdeck @@ -738,16 +739,16 @@ hijack_evacuation_type = EVACUATION_TYPE_ADDITIVE /area/almayer/lifeboat_pumps/north1 - name = "North West Lifeboat Fuel Pump" + name = "Starboard Fore Lifeboat Fuel Pump" /area/almayer/lifeboat_pumps/north2 - name = "North East Lifeboat Fuel Pump" + name = "Starboard Aft Lifeboat Fuel Pump" /area/almayer/lifeboat_pumps/south1 - name = "South West Lifeboat Fuel Pump" + name = "Port Fore Lifeboat Fuel Pump" /area/almayer/lifeboat_pumps/south2 - name = "South East Lifeboat Fuel Pump" + name = "Port Aft Lifeboat Fuel Pump" /area/almayer/command/lifeboat name = "\improper Lifeboat Docking Port" @@ -760,7 +761,7 @@ flags_area = AREA_NOTUNNEL /area/space/almayer/lifeboat_dock - name = "\improper Lifeboat Docking Port" + name = "\improper Port Lifeboat Docking" icon_state = "lifeboat" fake_zlevel = 1 // upperdeck flags_area = AREA_NOTUNNEL From 7667a45fb8dbcf4788c210133db179c4ec12f5a3 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 22 Nov 2023 21:03:59 +0000 Subject: [PATCH 14/84] Automatic changelog for PR #4980 [ci skip] --- html/changelogs/AutoChangeLog-pr-4980.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4980.yml diff --git a/html/changelogs/AutoChangeLog-pr-4980.yml b/html/changelogs/AutoChangeLog-pr-4980.yml new file mode 100644 index 000000000000..67fc216fe995 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4980.yml @@ -0,0 +1,4 @@ +author: "zzzmike" +delete-after: True +changes: + - qol: "Location name standardization. So, North is now Starboard. This is already how it is for everything except pumps." \ No newline at end of file From 148a189066f7156984b2ef8765caee6efe457484 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Wed, 22 Nov 2023 19:39:20 +0000 Subject: [PATCH 15/84] Lesser drones now die upon ghosting (#4978) # About the pull request https://forum.cm-ss13.com/t/ghosted-lesser-drones-should-just-die/4356/10 Lessers now die upon ghosting and are not offered to observers. # Explain why it's good for the game Nobody likes trying to join as xeno or see their position in the queue only to see Lesser Drone (420) Lesser Drone (69) # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: del: Lesser drones die upon ghosting and are not offered to observers. /:cl: --------- Co-authored-by: harryob --- .../mob/living/carbon/xenomorph/castes/lesser_drone.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/lesser_drone.dm b/code/modules/mob/living/carbon/xenomorph/castes/lesser_drone.dm index 48bf0d95ddcf..3eb11d155c74 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/lesser_drone.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/lesser_drone.dm @@ -95,3 +95,11 @@ if (PF) PF.flags_pass = PASS_MOB_IS_XENO|PASS_MOB_THRU_XENO PF.flags_can_pass_all = PASS_MOB_IS_XENO|PASS_MOB_THRU_XENO + +/mob/living/carbon/xenomorph/lesser_drone/ghostize(can_reenter_corpse = FALSE, aghosted = FALSE) + . = ..() + if(. && !aghosted) + gib() + +/mob/living/carbon/xenomorph/lesser_drone/handle_ghost_message() + return From b98d6032d5aca3302a8886b88f7b6102fc5f5368 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 22 Nov 2023 21:19:43 +0000 Subject: [PATCH 16/84] Automatic changelog for PR #4978 [ci skip] --- html/changelogs/AutoChangeLog-pr-4978.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4978.yml diff --git a/html/changelogs/AutoChangeLog-pr-4978.yml b/html/changelogs/AutoChangeLog-pr-4978.yml new file mode 100644 index 000000000000..fc04901a02a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4978.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - rscdel: "Lesser drones die upon ghosting and are not offered to observers." \ No newline at end of file From 81f55a30a3d539ac398d84e8141cb92ed67c196c Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Wed, 22 Nov 2023 20:41:28 +0000 Subject: [PATCH 17/84] Adds explosion handling to experimental sensor tower (#4984) # About the pull request Fixes #4958 Adds explosion handling to sensor tower. # 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: add: Explosion handling logic to experimental sensor tower. fix: Explosions no longer delete experimental sensor tower. /:cl: --- .../desert_dam/motion_sensor/sensortower.dm | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/code/modules/desert_dam/motion_sensor/sensortower.dm b/code/modules/desert_dam/motion_sensor/sensortower.dm index 4ef11c32245d..6a718607aaf6 100644 --- a/code/modules/desert_dam/motion_sensor/sensortower.dm +++ b/code/modules/desert_dam/motion_sensor/sensortower.dm @@ -233,6 +233,25 @@ ..() update_icon() +/* Decreases the buildstate of the sensor tower and switches it off if affected by any explosion. +Higher severity explosion will damage the sensor tower more +*/ +/obj/structure/machinery/sensortower/ex_act(severity) + if(buildstate == SENSORTOWER_BUILDSTATE_WRENCH) + return + switch(severity) + if(0 to EXPLOSION_THRESHOLD_LOW) + buildstate += 1 + if(EXPLOSION_THRESHOLD_LOW to EXPLOSION_THRESHOLD_MEDIUM) + buildstate = clamp(buildstate + 2, SENSORTOWER_BUILDSTATE_WORKING, SENSORTOWER_BUILDSTATE_WRENCH) + if(EXPLOSION_THRESHOLD_HIGH to INFINITY) + buildstate = 3 + if(is_on) + is_on = FALSE + cur_tick = 0 + stop_processing() + update_icon() + #undef SENSORTOWER_BUILDSTATE_WORKING #undef SENSORTOWER_BUILDSTATE_BLOWTORCH #undef SENSORTOWER_BUILDSTATE_WIRECUTTERS From 32b992b0a599ae0833552218cdbc53b83f537bab Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 22 Nov 2023 21:36:27 +0000 Subject: [PATCH 18/84] Automatic changelog for PR #4984 [ci skip] --- html/changelogs/AutoChangeLog-pr-4984.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4984.yml diff --git a/html/changelogs/AutoChangeLog-pr-4984.yml b/html/changelogs/AutoChangeLog-pr-4984.yml new file mode 100644 index 000000000000..a2ddcbb933ca --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4984.yml @@ -0,0 +1,5 @@ +author: "Birdtalon" +delete-after: True +changes: + - rscadd: "Explosion handling logic to experimental sensor tower." + - bugfix: "Explosions no longer delete experimental sensor tower." \ No newline at end of file From 123019107d9dce6a5340d2ef7a9d609a7a07f226 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Wed, 22 Nov 2023 20:42:53 +0000 Subject: [PATCH 19/84] Differentiates pylons in same area when spawning as lesser drone (#4985) # About the pull request Adds a (1) to duplicate named pylons if they reside in the same area when trying to spawn at pylon as lesser drone. Fixes #4424 # 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: fix: Pylons now differentiated in the input list with a (1) if in the same area. /:cl: --- code/game/gamemodes/cm_initialize.dm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm index 519ce4ed4f6f..f047c4a5bf57 100644 --- a/code/game/gamemodes/cm_initialize.dm +++ b/code/game/gamemodes/cm_initialize.dm @@ -597,7 +597,14 @@ Additional game mode variables. for(var/obj/effect/alien/resin/special/pylon/cycled_pylon as anything in hive.hive_structures[XENO_STRUCTURE_PYLON]) if(cycled_pylon.lesser_drone_spawns >= 1) - selection_list += "[cycled_pylon.name] at [get_area(cycled_pylon)]" + var/pylon_number = 1 + var/pylon_name = "[cycled_pylon.name] at [get_area(cycled_pylon)]" + //For renaming the pylon if we have duplicates + var/pylon_selection_name = pylon_name + while(pylon_selection_name in selection_list) + pylon_selection_name = "[pylon_name] ([pylon_number])" + pylon_number ++ + selection_list += pylon_selection_name selection_list_structure += cycled_pylon if(!length(selection_list)) From 643c05d0500e3ec059e1db667dec2f471f1b8505 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 22 Nov 2023 21:49:20 +0000 Subject: [PATCH 20/84] Automatic changelog for PR #4985 [ci skip] --- html/changelogs/AutoChangeLog-pr-4985.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4985.yml diff --git a/html/changelogs/AutoChangeLog-pr-4985.yml b/html/changelogs/AutoChangeLog-pr-4985.yml new file mode 100644 index 000000000000..9d8216e9eb7b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4985.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - bugfix: "Pylons now differentiated in the input list with a (1) if in the same area." \ No newline at end of file From 15086ae683f727d9a990e05f8ce9a08e43731207 Mon Sep 17 00:00:00 2001 From: fira Date: Wed, 22 Nov 2023 23:22:30 +0100 Subject: [PATCH 21/84] Allow playing uploaded sounds through the music player w/ Webroot (#4934) # About the pull request Too long have we suffered at the hands of admin auditive abuse. The prophet, spookydonut, once said, "You shouldn't be using this lol". And he was right. Using "Play MIDI sound" both reduces usability for our users, and can cause performance issues by freezing up the game for a while as the data is transfered to these 200 poor CM addicts. So we sought to alienate it with "Play Internet Sound" backed by youtube-dl. Unfortunately, some things are subject to geo blocking or simply not available on Youtube. Thus the regime of terror of Admins continues. This PR brings us one step closer to our goal: it allows to use the now renamed "Play Admin Sound" to (also) upload a sound file to Webroot and have it played through CDN. It also works with simple transport but that mostly defeats the point. Also reduced default volume for new players from 50% to 20%... Don't worry, It's still way more than enough to get them to quit the server, i have mine at 2-10% max # Explain why it's good for the game * Less new player abuse by reducing default volume * More performance by allowing big or custom songs to be backed by CDN * Better UX: People can easily see the song name and more easily stop it * Admins can now hide the name of played songs if they want to. Don't ask me why. # Testing Photographs and Procedure ![image](https://github.com/cmss13-devs/cmss13/assets/604624/4f00c45d-76ca-47e2-860a-2f26d55de2a4) You'll have to believe me on the sound working # Changelog :cl: balance: Default Web Music Player volume is now 20% down from 50%. It was found too effective against new players. admin: "Play Internet Sound" is now "Play Admin Sound" and optionally allow to hide the track name. admin: "Play Admin Sound" can now be used with uploaded tracks, which use CDN delivery and the in-chat music player, granting players more control over them. admin: Removed "Play Midi Sound". /:cl: --- code/__DEFINES/__game.dm | 2 +- code/__DEFINES/sounds.dm | 2 +- code/datums/soundOutput.dm | 5 - code/modules/admin/admin_verbs.dm | 6 +- code/modules/admin/verbs/playsound.dm | 226 ++++++++----------- code/modules/client/preferences.dm | 10 +- code/modules/client/preferences_toggles.dm | 21 +- code/modules/tgui_panel/audio.dm | 7 +- code/modules/tgui_panel/tgui_panel.dm | 7 +- tgui/packages/tgui-panel/settings/reducer.js | 2 +- 10 files changed, 119 insertions(+), 169 deletions(-) diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm index f1424f5560ec..765603df629c 100644 --- a/code/__DEFINES/__game.dm +++ b/code/__DEFINES/__game.dm @@ -103,7 +103,7 @@ block( \ #define SOUND_MIDI (1<<1) #define SOUND_AMBIENCE (1<<2) #define SOUND_LOBBY (1<<3) -#define SOUND_INTERNET (1<<4) +#define SOUND_INTERNET (1<<4) // Unused currently. Kept for default prefs compat only #define SOUND_REBOOT (1<<5) #define SOUND_ADMIN_MEME (1<<6) #define SOUND_ADMIN_ATMOSPHERIC (1<<7) diff --git a/code/__DEFINES/sounds.dm b/code/__DEFINES/sounds.dm index a6bb381100e7..541d95d28189 100644 --- a/code/__DEFINES/sounds.dm +++ b/code/__DEFINES/sounds.dm @@ -27,7 +27,7 @@ #define SOUND_CHANNEL_AMBIENCE 1019 #define SOUND_CHANNEL_WALKMAN 1020 #define SOUND_CHANNEL_SOUNDSCAPE 1021 -#define SOUND_CHANNEL_ADMIN_MIDI 1022 +//#define SOUND_CHANNEL_ADMIN_MIDI 1022 #define SOUND_CHANNEL_LOBBY 1023 #define SOUND_CHANNEL_Z 1024 diff --git a/code/datums/soundOutput.dm b/code/datums/soundOutput.dm index bc5ffd8efcfb..1f4512b28d59 100644 --- a/code/datums/soundOutput.dm +++ b/code/datums/soundOutput.dm @@ -152,11 +152,6 @@ adjust_volume_prefs(VOLUME_AMB, "Set the volume for ambience and soundscapes", 0) soundOutput.update_ambience(null, null, TRUE) -/client/verb/adjust_volume_admin_music() - set name = "Adjust Volume Admin MIDIs" - set category = "Preferences.Sound" - adjust_volume_prefs(VOLUME_ADM, "Set the volume for admin MIDIs", SOUND_CHANNEL_ADMIN_MIDI) - /client/verb/adjust_volume_lobby_music() set name = "Adjust Volume LobbyMusic" set category = "Preferences.Sound" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 5d02917f70ee..207eebd3e409 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -100,10 +100,8 @@ var/list/admin_verbs_ban = list( ) var/list/admin_verbs_sounds = list( - /client/proc/play_web_sound, - /client/proc/play_sound, - /client/proc/stop_web_sound, - /client/proc/stop_sound, + /client/proc/play_admin_sound, + /client/proc/stop_admin_sound, /client/proc/cmd_admin_vox_panel ) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 9d622fce501b..0763a0e10795 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -1,45 +1,83 @@ -/client/proc/play_web_sound() +/client/proc/play_admin_sound() set category = "Admin.Fun" - set name = "Play Internet Sound" + set name = "Play Admin Sound" if(!check_rights(R_SOUNDS)) return - var/ytdl = CONFIG_GET(string/invoke_youtubedl) - if(!ytdl) - to_chat(src, SPAN_BOLDWARNING("Youtube-dl was not configured, action unavailable"), confidential = TRUE) //Check config.txt for the INVOKE_YOUTUBEDL value + var/sound_mode = tgui_input_list(src, "Play a sound from which source?", "Select Source", list("Web", "Upload")) + if(!sound_mode) return - var/web_sound_input = input("Enter content URL (supported sites only)", "Play Internet Sound via youtube-dl") as text|null - if(!istext(web_sound_input) || !length(web_sound_input)) - return + var/list/data = list() + var/log_title = TRUE + var/web_sound_input + var/asset_name + var/must_send_assets = FALSE + var/announce_title = TRUE + + if(sound_mode == "Web") + var/ytdl = CONFIG_GET(string/invoke_youtubedl) + if(!ytdl) + to_chat(src, SPAN_BOLDWARNING("Youtube-dl was not configured, action unavailable"), confidential = TRUE) //Check config.txt for the INVOKE_YOUTUBEDL value + return - web_sound_input = trim(web_sound_input) + web_sound_input = input("Enter content URL (supported sites only)", "Play Internet Sound via youtube-dl") as text|null + if(!istext(web_sound_input) || !length(web_sound_input)) + return - if(findtext(web_sound_input, ":") && !findtext(web_sound_input, GLOB.is_http_protocol)) - to_chat(src, SPAN_WARNING("Non-http(s) URIs are not allowed.")) - to_chat(src, SPAN_WARNING("For youtube-dl shortcuts like ytsearch: please use the appropriate full url from the website.")) - return + web_sound_input = trim(web_sound_input) - var/web_sound_url = "" - var/list/music_extra_data = list() - var/title + if(findtext(web_sound_input, ":") && !findtext(web_sound_input, GLOB.is_http_protocol)) + to_chat(src, SPAN_WARNING("Non-http(s) URIs are not allowed.")) + to_chat(src, SPAN_WARNING("For youtube-dl shortcuts like ytsearch: please use the appropriate full url from the website.")) + return - var/list/output = world.shelleo("[ytdl] --geo-bypass --format \"bestaudio\[ext=mp3]/best\[ext=mp4]\[height<=360]/bestaudio\[ext=m4a]/bestaudio\[ext=aac]\" --dump-single-json --no-playlist -- \"[shell_url_scrub(web_sound_input)]\"") - var/errorlevel = output[SHELLEO_ERRORLEVEL] - var/stdout = output[SHELLEO_STDOUT] - var/stderr = output[SHELLEO_STDERR] + var/list/output = world.shelleo("[ytdl] --geo-bypass --format \"bestaudio\[ext=mp3]/best\[ext=mp4]\[height<=360]/bestaudio\[ext=m4a]/bestaudio\[ext=aac]\" --dump-single-json --no-playlist -- \"[shell_url_scrub(web_sound_input)]\"") + var/errorlevel = output[SHELLEO_ERRORLEVEL] + var/stdout = output[SHELLEO_STDOUT] + var/stderr = output[SHELLEO_STDERR] - if(errorlevel) - to_chat(src, SPAN_WARNING("Youtube-dl URL retrieval FAILED: [stderr]")) - return + if(errorlevel) + to_chat(src, SPAN_WARNING("Youtube-dl URL retrieval FAILED: [stderr]")) + return - var/list/data = list() - try - data = json_decode(stdout) - catch(var/exception/e) - to_chat(src, SPAN_WARNING("Youtube-dl JSON parsing FAILED: [e]: [stdout]")) - return + try + data = json_decode(stdout) + catch(var/exception/e) + to_chat(src, SPAN_WARNING("Youtube-dl JSON parsing FAILED: [e]: [stdout]")) + return + + else if(sound_mode == "Upload") + var/current_transport = CONFIG_GET(string/asset_transport) + if(!current_transport || current_transport == "simple") + if(tgui_alert(usr, "WARNING: Your server is using simple asset transport. Sounds will have to be sent directly to players, which may freeze the game for long durations. Are you SURE?", "Really play direct sound?", list("Yes", "No")) != "Yes") + return + must_send_assets = TRUE + + var/soundfile = input(usr, "Choose a sound file to play", "Upload Sound") as null|file + if(!soundfile) + return + + var/static/regex/only_extension = regex(@{"^.*\.([a-z0-9]{1,5})$"}, "gi") + var/extension = only_extension.Replace("[soundfile]", "$1") + if(!length(extension)) + to_chat(src, SPAN_WARNING("Invalid filename extension.")) + return + + var/static/playsound_notch = 1 + asset_name = "admin_sound_[playsound_notch++].[extension]" + SSassets.transport.register_asset(asset_name, soundfile) + message_admins("[key_name_admin(src)] uploaded admin sound '[soundfile]' to asset transport.") + + var/static/regex/remove_extension = regex(@{"\.[a-z0-9]+$"}, "gi") + data["title"] = remove_extension.Replace("[soundfile]", "") + data["url"] = SSassets.transport.get_asset_url(asset_name) + web_sound_input = "[soundfile]" + log_title = FALSE + var/title + var/web_sound_url = "" + var/list/music_extra_data = list() if(data["url"]) music_extra_data["link"] = data["url"] music_extra_data["title"] = data["title"] @@ -48,19 +86,28 @@ music_extra_data["start"] = data["start_time"] music_extra_data["end"] = data["end_time"] - if(web_sound_url && !findtext(web_sound_url, GLOB.is_http_protocol)) + if(!must_send_assets && web_sound_url && !findtext(web_sound_url, GLOB.is_http_protocol)) to_chat(src, SPAN_BOLDWARNING("BLOCKED: Content URL not using http(s) protocol"), confidential = TRUE) to_chat(src, SPAN_WARNING("The media provider returned a content URL that isn't using the HTTP or HTTPS protocol"), confidential = TRUE) return + switch(tgui_alert(src, "Show the name of this sound to the players?", "Sound Name", list("Yes","No","Cancel"))) + if("No") + music_extra_data["title"] = "Admin sound" + announce_title = FALSE + if("Cancel") + return + var/list/targets = list() var/list/sound_type_list = list( "Meme" = SOUND_ADMIN_MEME, "Atmospheric" = SOUND_ADMIN_ATMOSPHERIC ) - var/style = tgui_input_list(src, "Who do you want to play this to?", "Select Listeners", list("Globally", "Xenos", "Marines", "Ghosts", "All Inview", "Single Inview")) + + var/style = tgui_input_list(src, "Who do you want to play this to?", "Select Listeners", list("Globally", "Xenos", "Marines", "Ghosts", "All In View Range", "Single Mob")) var/sound_type = tgui_input_list(src, "What kind of sound is this?", "Select Sound Type", sound_type_list) sound_type = sound_type_list[sound_type] + switch(style) if("Globally") targets = GLOB.mob_list @@ -70,30 +117,40 @@ targets = GLOB.human_mob_list + GLOB.dead_mob_list if("Ghosts") targets = GLOB.observer_list + GLOB.dead_mob_list - if("All Inview") - targets = viewers(usr.client.view, src) - if("Single Inview") - var/mob/choice = tgui_input_list(src, "Select the mob to play to:","Select Mob", sortmobs()) + if("All In View Range") + var/list/atom/ranged_atoms = urange(usr.client.view, get_turf(usr)) + for(var/mob/receiver in ranged_atoms) + targets += receiver + if("Single Mob") + var/list/mob/all_mobs = sortmobs() + var/list/mob/all_client_mobs = list() + for(var/mob/mob in all_mobs) + if(mob.client) + all_client_mobs += mob + var/mob/choice = tgui_input_list(src, "Select the mob to play to:","Select Mob", all_client_mobs) if(QDELETED(choice)) return targets.Add(choice) else return - for(var/i in targets) - var/mob/M = i - var/client/client = M?.client - if((client?.prefs.toggles_sound & SOUND_INTERNET) && (client?.prefs.toggles_sound & sound_type)) + for(var/mob/mob as anything in targets) + var/client/client = mob?.client + if((client?.prefs?.toggles_sound & SOUND_MIDI) && (client?.prefs?.toggles_sound & sound_type)) + if(must_send_assets) + SSassets.transport.send_assets(client, asset_name) client?.tgui_panel?.play_music(web_sound_url, music_extra_data) + if(announce_title) + to_chat(client, SPAN_BOLDANNOUNCE("An admin played: [music_extra_data["title"]]"), confidential = TRUE) else client?.tgui_panel?.stop_music() - log_admin("[key_name(src)] played web sound: [web_sound_input] - [title] - [style]") - message_admins("[key_name_admin(src)] played web sound: [web_sound_input] - [title] - [style]") + log_admin("[key_name(src)] played admin sound: [web_sound_input] -[log_title ? " [title] -" : ""] [style]") + message_admins("[key_name_admin(src)] played admin sound: [web_sound_input] -[log_title ? " [title] -" : ""] [style]") -/client/proc/stop_web_sound() +/client/proc/stop_admin_sound() set category = "Admin.Fun" - set name = "Stop Internet Sounds" + set name = "Stop Admin Sounds" if(!check_rights(R_SOUNDS)) return @@ -105,86 +162,3 @@ log_admin("[key_name(src)] stopped the currently playing web sounds.") message_admins("[key_name_admin(src)] stopped the currently playing web sounds.") -/client/proc/play_sound(S as sound) - set category = "Admin.Fun" - set name = "Play Midi Sound" - if(!check_rights(R_SOUNDS)) - return - - var/freq = 1 - var/vol = tgui_input_number(src, "What volume would you like the sound to play at?", "Volume", 25, 100, 1) - if(!vol) - return - vol = clamp(vol, 1, 100) - - var/sound/admin_sound = new() - admin_sound.file = S - admin_sound.priority = 250 - admin_sound.channel = SOUND_CHANNEL_ADMIN_MIDI - admin_sound.frequency = freq - admin_sound.wait = 1 - admin_sound.repeat = FALSE - admin_sound.status = SOUND_STREAM - admin_sound.volume = vol - - var/showtitle = FALSE - var/res = alert(src, "Show the title of this song to the players?",, "Yes","No", "Cancel") - switch(res) - if("Yes") - showtitle = TRUE - if("Cancel") - return - - var/list/targets = list() - var/list/sound_type_list = list( - "Meme" = SOUND_ADMIN_MEME, - "Atmospheric" = SOUND_ADMIN_ATMOSPHERIC - ) - var/style = tgui_input_list(src, "Who do you want to play this to?", "Select Listeners", list("Globally", "Xenos", "Marines", "Ghosts", "All Inview", "Single Inview")) - var/sound_type = tgui_input_list(src, "What kind of sound is this?", "Select Sound Type", sound_type_list) - sound_type = sound_type_list[sound_type] - switch(style) - if("Globally") - targets = GLOB.mob_list - if("Xenos") - targets = GLOB.xeno_mob_list + GLOB.dead_mob_list - if("Marines") - targets = GLOB.human_mob_list + GLOB.dead_mob_list - if("Ghosts") - targets = GLOB.observer_list + GLOB.dead_mob_list - if("All Inview") - targets = viewers(usr.client.view, src) - if("Single Inview") - var/mob/choice = tgui_input_list(src, "Select the mob to play to:","Select Mob", sortmobs()) - if(QDELETED(choice)) - return - targets.Add(choice) - else - return - - for(var/items in targets) - var/mob/Mob = items - var/client/client = Mob?.client - if((client?.prefs.toggles_sound & SOUND_INTERNET) && (client?.prefs.toggles_sound & sound_type)) - admin_sound.volume = vol * client?.admin_music_volume - SEND_SOUND(Mob, admin_sound) - admin_sound.volume = vol - if(showtitle) - to_chat(client, SPAN_BOLDANNOUNCE("An admin played: [S]"), confidential = TRUE) - - log_admin("[key_name(src)] played midi sound [S] - [style]") - message_admins("[key_name_admin(src)] played midi sound [S] - [style]") - -/client/proc/stop_sound() - set category = "Admin.Fun" - set name = "Stop Midi Sounds" - - if(!check_rights(R_SOUNDS)) - return - - for(var/mob/M in GLOB.player_list) - if(M.client) - SEND_SOUND(M, sound(null)) - - log_admin("[key_name(src)] stopped midi sounds.") - message_admins("[key_name_admin(src)] stopped midi sounds.") diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 04b82628e3c6..ad12cb99b50e 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -586,8 +586,7 @@ var/const/MAX_SAVE_SLOTS = 10 dat += "Tooltips: [tooltips ? "Enabled" : "Disabled"]
" dat += "tgui Window Mode: [(tgui_fancy) ? "Fancy (default)" : "Compatible (slower)"]
" dat += "tgui Window Placement: [(tgui_lock) ? "Primary monitor" : "Free (default)"]
" - dat += "Play Admin Midis: [(toggles_sound & SOUND_MIDI) ? "Yes" : "No"]
" - dat += "Play Admin Internet Sounds: [(toggles_sound & SOUND_INTERNET) ? "Yes" : "No"]
" + dat += "Play Admin Sounds: [(toggles_sound & SOUND_MIDI) ? "Yes" : "No"]
" dat += "Toggle Meme or Atmospheric Sounds: Toggle
" dat += "Set Eye Blur Type: Set
" dat += "Play Lobby Music: [(toggles_sound & SOUND_LOBBY) ? "Yes" : "No"]
" @@ -1807,11 +1806,10 @@ var/const/MAX_SAVE_SLOTS = 10 if("rand_body") be_random_body = !be_random_body - if("hear_midis") + if("hear_admin_sounds") toggles_sound ^= SOUND_MIDI - - if("hear_internet") - toggles_sound ^= SOUND_INTERNET + if(!(toggles_sound & SOUND_MIDI)) + user?.client?.tgui_panel?.stop_music() if("lobby_music") toggles_sound ^= SOUND_LOBBY diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 6f9026a437dd..080f071823f8 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -48,25 +48,10 @@ to_chat(src, "You will [(prefs.toggles_sound & SOUND_REBOOT) ? "now" : "no longer"] hear server reboot sounds.") /client/verb/togglemidis() - set name = "Silence Current Midi" + set name = "Silence Current Admin Sound" set category = "Preferences.Sound" - set desc = "Toggles hearing sounds uploaded by admins" - // prefs.toggles_sound ^= SOUND_MIDI // Toggle on/off - // prefs.save_preferences() // We won't save the change - it'll be a temporary switch instead of permanent, but they can still make it permanent in character setup. - if(prefs.toggles_sound & SOUND_MIDI) // Not using && midi_playing here - since we can't tell how long an admin midi is, the user should always be able to turn it off at any time. - to_chat(src, SPAN_BOLDNOTICE("The currently playing midi has been silenced.")) - var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = SOUND_CHANNEL_ADMIN_MIDI) - break_sound.priority = 250 - src << break_sound //breaks the client's sound output on SOUND_CHANNEL_ADMIN_MIDI - if(src.mob.client.midi_silenced) return - if(midi_playing) - total_silenced++ - message_admins("A player has silenced the currently playing midi. Total: [total_silenced] player(s).", 1) - src.mob.client.midi_silenced = 1 - spawn(30 SECONDS) // Prevents message_admins() spam. Should match with the midi_playing_timer spawn() in playsound.dm - src.mob.client.midi_silenced = 0 - else - to_chat(src, SPAN_BOLDNOTICE("You have 'Play Admin Midis' disabled in your Character Setup, so this verb is useless to you.")) + set desc = "Stops the current admin sound. You can also use the STOP icon in the player above tgchat." + tgui_panel?.stop_music() /client/verb/togglechat() set name = "Toggle Abovehead Chat" diff --git a/code/modules/tgui_panel/audio.dm b/code/modules/tgui_panel/audio.dm index 680696159943..d66421df5348 100644 --- a/code/modules/tgui_panel/audio.dm +++ b/code/modules/tgui_panel/audio.dm @@ -3,8 +3,6 @@ * SPDX-License-Identifier: MIT */ -/// Admin music volume, from 0 to 1. -/client/var/admin_music_volume = 1 /** * public @@ -22,8 +20,9 @@ /datum/tgui_panel/proc/play_music(url, extra_data) if(!is_ready()) return - if(!findtext(url, GLOB.is_http_protocol)) - return + // Commented to allow playing via simple asset transport. Just check when calling. +// if(!findtext(url, GLOB.is_http_protocol)) +// return var/list/payload = list() if(length(extra_data) > 0) for(var/key in extra_data) diff --git a/code/modules/tgui_panel/tgui_panel.dm b/code/modules/tgui_panel/tgui_panel.dm index 9fb8b02b0196..f33f190d80e0 100644 --- a/code/modules/tgui_panel/tgui_panel.dm +++ b/code/modules/tgui_panel/tgui_panel.dm @@ -85,9 +85,10 @@ ), )) return TRUE - if(type == "audio/setAdminMusicVolume") - client.admin_music_volume = payload["volume"] - return TRUE +// Deprecated due to removal of old sound play commands +// if(type == "audio/setAdminMusicVolume") +// client.admin_music_volume = payload["volume"] +// return TRUE if(type == "telemetry") analyze_telemetry(payload) return TRUE diff --git a/tgui/packages/tgui-panel/settings/reducer.js b/tgui/packages/tgui-panel/settings/reducer.js index 42d799fd6597..0c93a5b94d4e 100644 --- a/tgui/packages/tgui-panel/settings/reducer.js +++ b/tgui/packages/tgui-panel/settings/reducer.js @@ -16,7 +16,7 @@ const initialState = { fontFamily: FONTS[0], lineHeight: 1.2, theme: 'light', - adminMusicVolume: 0.5, + adminMusicVolume: 0.2, // Keep these two state vars for compatibility with other servers highlightText: '', highlightColor: '#ffdd44', From 7947f362f80b6c553586ef551bc0a482159b0461 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 22 Nov 2023 22:32:48 +0000 Subject: [PATCH 22/84] Automatic changelog for PR #4934 [ci skip] --- html/changelogs/AutoChangeLog-pr-4934.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4934.yml diff --git a/html/changelogs/AutoChangeLog-pr-4934.yml b/html/changelogs/AutoChangeLog-pr-4934.yml new file mode 100644 index 000000000000..f3b1e179d8cb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4934.yml @@ -0,0 +1,7 @@ +author: "fira" +delete-after: True +changes: + - balance: "Default Web Music Player volume is now 20% down from 50%. It was found too effective against new players." + - admin: "\"Play Internet Sound\" is now \"Play Admin Sound\" and optionally allow to hide the track name." + - admin: "\"Play Admin Sound\" can now be used with uploaded tracks, which use CDN delivery and the in-chat music player, granting players more control over them." + - admin: "Removed \"Play Midi Sound\"." \ No newline at end of file From 170f3cd8759141ba4ec245975895531c66b37e0d Mon Sep 17 00:00:00 2001 From: QuickLode <63271983+QuickLode@users.noreply.github.com> Date: Wed, 22 Nov 2023 15:49:09 -0800 Subject: [PATCH 23/84] Synthetic internal powercell (#4559) # About the pull request This PR should tackle two things: 1. Synths shouldn't lose blood 2. Synths shouldn't feel woozy (RP) revives #3589 from ghostsheet # Explain why it's good for the game Synthetics should not be feeling woozy. They also shouldn't be going blind from bloodloss. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags. https://cdn.discordapp.com/attachments/490668342357786645/1157856898834497536/image.png?ex=651a21c4&is=6518d044&hm=813abcc8be5fd02367499e24651c97b7f840d8bcbc557364c534f1c0a61f25f5& https://cdn.discordapp.com/attachments/490668342357786645/1157856899132305529/image.png?ex=651a21c4&is=6518d044&hm=d9fb14dcaa5eb9fa8ad1280636a5f8f188a72e0e5045b892fc29192046acd139&
# Changelog :cl: add: Damage to Synthetic's internal causes debuffs, eventual powercell failure.(death) fix: Synthetic's should no longer lose blood. code: moves blood proc to human.dm from blood.dm with above changes. /:cl: --------- Co-authored-by: harryob --- code/modules/mob/living/blood.dm | 78 +----------------- .../mob/living/carbon/human/species/human.dm | 82 +++++++++++++++++++ 2 files changed, 84 insertions(+), 76 deletions(-) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index ab3ce823c68e..dea179e6ad48 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -2,80 +2,6 @@ BLOOD SYSTEM */ -/mob/living/proc/handle_blood() - return - -// Takes care blood loss and regeneration -/mob/living/carbon/human/handle_blood() - if(NO_BLOOD in species.flags) - return - - if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood. - //Blood regeneration if there is some space - if(blood_volume < max_blood && nutrition >= 1) - blood_volume += 0.1 // regenerate blood VERY slowly - nutrition -= 0.25 - else if(blood_volume > max_blood) - blood_volume -= 0.1 // The reverse in case we've gotten too much blood in our body - if(blood_volume > limit_blood) - blood_volume = limit_blood // This should never happen, but lets make sure - - var/b_volume = blood_volume - - // Damaged heart virtually reduces the blood volume, as the blood isn't - // being pumped properly anymore. - if(species && species.has_organ["heart"]) - var/datum/internal_organ/heart/heart = internal_organs_by_name["heart"] - if(!heart) - b_volume = 0 - else if(chem_effect_flags & CHEM_EFFECT_ORGAN_STASIS) - b_volume *= 1 - else if(heart.damage >= heart.organ_status >= ORGAN_BRUISED) - b_volume *= Clamp(100 - (2 * heart.damage), 30, 100) / 100 - - //Effects of bloodloss - if(b_volume <= BLOOD_VOLUME_SAFE) - /// The blood volume turned into a %, with BLOOD_VOLUME_NORMAL being 100% - var/blood_percentage = b_volume / (BLOOD_VOLUME_NORMAL / 100) - /// How much oxyloss will there be from the next time blood processes - var/additional_oxyloss = (100 - blood_percentage) / 5 - /// The limit of the oxyloss gained, ignoring oxyloss from the switch statement - var/maximum_oxyloss = Clamp((100 - blood_percentage) / 2, oxyloss, 100) - if(oxyloss < maximum_oxyloss) - oxyloss += round(max(additional_oxyloss, 0)) - - switch(b_volume) - if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) - if(prob(1)) - var/word = pick("dizzy","woozy","faint") - to_chat(src, SPAN_DANGER("You feel [word].")) - if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) - if(eye_blurry < 50) - AdjustEyeBlur(6) - oxyloss += 3 - if(prob(15)) - apply_effect(rand(1,3), PARALYZE) - var/word = pick("dizzy","woozy","faint") - to_chat(src, SPAN_DANGER("You feel very [word].")) - if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) - if(eye_blurry < 50) - AdjustEyeBlur(6) - oxyloss += 8 - toxloss += 3 - if(prob(15)) - apply_effect(rand(1,3), PARALYZE) - var/word = pick("dizzy","woozy","faint") - to_chat(src, SPAN_DANGER("You feel extremely [word].")) - if(0 to BLOOD_VOLUME_SURVIVE) - death(create_cause_data("blood loss")) - -// Xeno blood regeneration -/mob/living/carbon/xenomorph/handle_blood() - if(stat != DEAD) //Only living xenos regenerate blood - //Blood regeneration if there is some space - if(blood_volume < max_blood) - blood_volume = min(blood_volume + 1, max_blood) - //Makes a blood drop, leaking amt units of blood from the mob /mob/living/carbon/proc/drip(amt) if(!blood_volume) @@ -91,7 +17,7 @@ /mob/living/carbon/human/drip(amt) if(in_stasis) // stasis now stops bloodloss return - if(NO_BLOOD in species.flags) + if((species.flags & NO_BLOOD) && !(species.flags & IS_SYNTHETIC)) return ..() @@ -272,7 +198,7 @@ return "xenoblood" /mob/living/carbon/human/get_blood_id() - if((NO_BLOOD in species.flags)) + if(species.flags & NO_BLOOD) return if(special_blood) return special_blood diff --git a/code/modules/mob/living/carbon/human/species/human.dm b/code/modules/mob/living/carbon/human/species/human.dm index 6a59e97af867..add78365a350 100644 --- a/code/modules/mob/living/carbon/human/species/human.dm +++ b/code/modules/mob/living/carbon/human/species/human.dm @@ -1,3 +1,85 @@ +// handles all blood related problems for humans and synthetics, moved from blood.dm +/mob/living/proc/handle_blood() + return + +// Takes care blood loss and regeneration +/mob/living/carbon/human/handle_blood() + if((species.flags & NO_BLOOD) && !(species.flags & IS_SYNTHETIC)) + return + + if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood. + //Blood regeneration if there is some space + if(blood_volume < max_blood && nutrition >= 1) + blood_volume += 0.1 // regenerate blood VERY slowly + nutrition -= 0.25 + else if(blood_volume > max_blood) + blood_volume -= 0.1 // The reverse in case we've gotten too much blood in our body + if(blood_volume > limit_blood) + blood_volume = limit_blood // This should never happen, but lets make sure + + var/b_volume = blood_volume + + // Damaged heart virtually reduces the blood volume, as the blood isn't + // being pumped properly anymore. + if(species && species.has_organ["heart"]) + var/datum/internal_organ/heart/heart = internal_organs_by_name["heart"] + if(!heart) + b_volume = 0 + else if(chem_effect_flags & CHEM_EFFECT_ORGAN_STASIS) + b_volume *= 1 + else if(heart.damage >= heart.organ_status >= ORGAN_BRUISED) + b_volume *= Clamp(100 - (2 * heart.damage), 30, 100) / 100 + + //Effects of bloodloss + if(b_volume <= BLOOD_VOLUME_SAFE) + /// The blood volume turned into a %, with BLOOD_VOLUME_NORMAL being 100% + var/blood_percentage = b_volume / (BLOOD_VOLUME_NORMAL / 100) + /// How much oxyloss will there be from the next time blood processes + var/additional_oxyloss = (100 - blood_percentage) / 5 + /// The limit of the oxyloss gained, ignoring oxyloss from the switch statement + var/maximum_oxyloss = Clamp((100 - blood_percentage) / 2, oxyloss, 100) + if(oxyloss < maximum_oxyloss) + oxyloss += round(max(additional_oxyloss, 0)) + + switch(b_volume) + if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) + if(species.flags & IS_SYNTHETIC) + if(prob(1)) + to_chat(src, SPAN_DANGER("Subdermal damage detected in critical region. Operational impact minimal. Diagnosis queued for maintenance cycle.")) + else + if(prob(1)) + var/word = pick("dizzy","woozy","faint") + to_chat(src, SPAN_DANGER("You feel [word].")) + if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) + if(species.flags & IS_SYNTHETIC) + if(prob(3)) + apply_effect(rand(1, 2), WEAKEN) + to_chat(src, SPAN_DANGER("Internal power cell fault detected.\nSeek nearest recharging station.")) + else + if(eye_blurry < 50) + AdjustEyeBlur(6) + oxyloss += 3 + if(prob(15)) + apply_effect(rand(1,3), PARALYZE) + var/word = pick("dizzy","woozy","faint") + to_chat(src, SPAN_DANGER("You feel very [word].")) + if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) + if(species.flags & IS_SYNTHETIC) + if(prob(5)) + apply_effect(rand(1, 2), PARALYZE) + to_chat(src, SPAN_DANGER("Critical power cell failure detected.\nSeek recharging station immediately.")) + else + if(eye_blurry < 50) + AdjustEyeBlur(6) + oxyloss += 8 + toxloss += 3 + if(prob(15)) + apply_effect(rand(1, 3), PARALYZE) + var/word = pick("dizzy", "woozy", "faint") + to_chat(src, SPAN_DANGER("You feel extremely [word].")) + if(0 to BLOOD_VOLUME_SURVIVE) + death(create_cause_data(species.flags & IS_SYNTHETIC ? "power failure" : "blood loss")) + /datum/species/human group = SPECIES_HUMAN name = "Human" From 446f6f1e81478d1e684f6dd1e827acfbd0a71a73 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 22 Nov 2023 23:57:18 +0000 Subject: [PATCH 24/84] Automatic changelog for PR #4559 [ci skip] --- html/changelogs/AutoChangeLog-pr-4559.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4559.yml diff --git a/html/changelogs/AutoChangeLog-pr-4559.yml b/html/changelogs/AutoChangeLog-pr-4559.yml new file mode 100644 index 000000000000..4bc42904d0fa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4559.yml @@ -0,0 +1,6 @@ +author: "QuickLode" +delete-after: True +changes: + - rscadd: "Damage to Synthetic's internal causes debuffs, eventual powercell failure.(death)" + - bugfix: "Synthetic's should no longer lose blood." + - code_imp: "moves blood proc to human.dm from blood.dm with above changes." \ No newline at end of file From 236a44319009607869c05698d3215a3a1ebe9d40 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 23 Nov 2023 01:11:08 +0000 Subject: [PATCH 25/84] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4559.yml | 6 --- html/changelogs/AutoChangeLog-pr-4827.yml | 4 -- html/changelogs/AutoChangeLog-pr-4934.yml | 7 --- html/changelogs/AutoChangeLog-pr-4944.yml | 4 -- html/changelogs/AutoChangeLog-pr-4953.yml | 4 -- html/changelogs/AutoChangeLog-pr-4978.yml | 4 -- html/changelogs/AutoChangeLog-pr-4980.yml | 4 -- html/changelogs/AutoChangeLog-pr-4981.yml | 4 -- html/changelogs/AutoChangeLog-pr-4984.yml | 5 --- html/changelogs/AutoChangeLog-pr-4985.yml | 4 -- html/changelogs/AutoChangeLog-pr-4987.yml | 4 -- html/changelogs/AutoChangeLog-pr-4988.yml | 4 -- html/changelogs/AutoChangeLog-pr-4989.yml | 4 -- html/changelogs/AutoChangeLog-pr-4990.yml | 6 --- html/changelogs/AutoChangeLog-pr-4994.yml | 4 -- html/changelogs/archive/2023-11.yml | 52 +++++++++++++++++++++++ 16 files changed, 52 insertions(+), 68 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4559.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4827.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4934.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4944.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4953.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4978.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4980.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4981.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4984.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4985.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4987.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4988.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4989.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4990.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4994.yml diff --git a/html/changelogs/AutoChangeLog-pr-4559.yml b/html/changelogs/AutoChangeLog-pr-4559.yml deleted file mode 100644 index 4bc42904d0fa..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4559.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "QuickLode" -delete-after: True -changes: - - rscadd: "Damage to Synthetic's internal causes debuffs, eventual powercell failure.(death)" - - bugfix: "Synthetic's should no longer lose blood." - - code_imp: "moves blood proc to human.dm from blood.dm with above changes." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4827.yml b/html/changelogs/AutoChangeLog-pr-4827.yml deleted file mode 100644 index b95ce40e4607..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4827.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LC4492" -delete-after: True -changes: - - maptweak: "Changes to the CO office: The bathroom now faces into the CO's bedroom, and not to his main office. Victory cabinet have been moved to the Officer's mess because of logical issues. Extra-detail to the office, including an exclusive stamp, table flags and others. The safe is now inside the CO's bedroom, and not in his office. The energy APC is now inside the CO's bedroom, and not in his office. Jones finally have a BED again, or something like that. Other minor changes to objects, such the addition of a cane, a box of glasses for serving guests, etc." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4934.yml b/html/changelogs/AutoChangeLog-pr-4934.yml deleted file mode 100644 index f3b1e179d8cb..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4934.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "fira" -delete-after: True -changes: - - balance: "Default Web Music Player volume is now 20% down from 50%. It was found too effective against new players." - - admin: "\"Play Internet Sound\" is now \"Play Admin Sound\" and optionally allow to hide the track name." - - admin: "\"Play Admin Sound\" can now be used with uploaded tracks, which use CDN delivery and the in-chat music player, granting players more control over them." - - admin: "Removed \"Play Midi Sound\"." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4944.yml b/html/changelogs/AutoChangeLog-pr-4944.yml deleted file mode 100644 index 0c8af20f86c8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4944.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Steelpoint" -delete-after: True -changes: - - maptweak: "Secure Storage on LV-624 has been broken open, making it far less defendable but easier to access." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4953.yml b/html/changelogs/AutoChangeLog-pr-4953.yml deleted file mode 100644 index 4dd8c48e8206..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4953.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Tweaked larva queue spawning: Now spawns as many larva as possible each cycle rather than one." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4978.yml b/html/changelogs/AutoChangeLog-pr-4978.yml deleted file mode 100644 index fc04901a02a0..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4978.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - rscdel: "Lesser drones die upon ghosting and are not offered to observers." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4980.yml b/html/changelogs/AutoChangeLog-pr-4980.yml deleted file mode 100644 index 67fc216fe995..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4980.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zzzmike" -delete-after: True -changes: - - qol: "Location name standardization. So, North is now Starboard. This is already how it is for everything except pumps." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4981.yml b/html/changelogs/AutoChangeLog-pr-4981.yml deleted file mode 100644 index 6edc5e60a381..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4981.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ihatethisengine" -delete-after: True -changes: - - balance: "Oppressor no longer can abduct big xenos." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4984.yml b/html/changelogs/AutoChangeLog-pr-4984.yml deleted file mode 100644 index a2ddcbb933ca..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4984.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - rscadd: "Explosion handling logic to experimental sensor tower." - - bugfix: "Explosions no longer delete experimental sensor tower." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4985.yml b/html/changelogs/AutoChangeLog-pr-4985.yml deleted file mode 100644 index 9d8216e9eb7b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4985.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - bugfix: "Pylons now differentiated in the input list with a (1) if in the same area." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4987.yml b/html/changelogs/AutoChangeLog-pr-4987.yml deleted file mode 100644 index ef48b7dd6e62..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4987.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SortieEnMer" -delete-after: True -changes: - - qol: "Match Unlock Time in Nuke Timelock Message with Nuke Techtree Description" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4988.yml b/html/changelogs/AutoChangeLog-pr-4988.yml deleted file mode 100644 index ba67e425bd74..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4988.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fixed buried larva spawn grace period at start of round if there is a queue: Now join as xeno when there's a queue will only prevent buried larva spawns if there is no core." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4989.yml b/html/changelogs/AutoChangeLog-pr-4989.yml deleted file mode 100644 index 062eaf000f63..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4989.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zzzmike" -delete-after: True -changes: - - qol: "ARES hijack announcement specifies that pods will not crash at 100% fuel" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4990.yml b/html/changelogs/AutoChangeLog-pr-4990.yml deleted file mode 100644 index 8f54dcade5d8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4990.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Resin doors will now close on dead mobs that are merged with weeds (currently only human)." - - bugfix: "Resin doors will now restart their closing timer each open making the delay to close consistent." - - code_imp: "Added a TRAIT_MERGED_WITH_WEEDS that is set whenever the mob is currently merged with weeds." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4994.yml b/html/changelogs/AutoChangeLog-pr-4994.yml deleted file mode 100644 index 2ace9428aaef..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4994.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "The Thunderdome floor is now explosion-proof." \ No newline at end of file diff --git a/html/changelogs/archive/2023-11.yml b/html/changelogs/archive/2023-11.yml index 66eaccb86d87..89f61d356258 100644 --- a/html/changelogs/archive/2023-11.yml +++ b/html/changelogs/archive/2023-11.yml @@ -279,3 +279,55 @@ game hislittlecuzingames: - rscadd: Launch Announcement Alarm for dropships to notify ground forces of departure. +2023-11-23: + Birdtalon: + - rscdel: Lesser drones die upon ghosting and are not offered to observers. + - rscadd: Explosion handling logic to experimental sensor tower. + - bugfix: Explosions no longer delete experimental sensor tower. + - bugfix: Pylons now differentiated in the input list with a (1) if in the same + area. + Drathek: + - bugfix: Resin doors will now close on dead mobs that are merged with weeds (currently + only human). + - bugfix: Resin doors will now restart their closing timer each open making the + delay to close consistent. + - code_imp: Added a TRAIT_MERGED_WITH_WEEDS that is set whenever the mob is currently + merged with weeds. + - bugfix: 'Fixed buried larva spawn grace period at start of round if there is a + queue: Now join as xeno when there''s a queue will only prevent buried larva + spawns if there is no core.' + - bugfix: 'Tweaked larva queue spawning: Now spawns as many larva as possible each + cycle rather than one.' + LC4492: + - maptweak: 'Changes to the CO office: The bathroom now faces into the CO''s bedroom, + and not to his main office. Victory cabinet have been moved to the Officer''s + mess because of logical issues. Extra-detail to the office, including an exclusive + stamp, table flags and others. The safe is now inside the CO''s bedroom, and + not in his office. The energy APC is now inside the CO''s bedroom, and not in + his office. Jones finally have a BED again, or something like that. Other minor + changes to objects, such the addition of a cane, a box of glasses for serving + guests, etc.' + QuickLode: + - rscadd: Damage to Synthetic's internal causes debuffs, eventual powercell failure.(death) + - bugfix: Synthetic's should no longer lose blood. + - code_imp: moves blood proc to human.dm from blood.dm with above changes. + SortieEnMer: + - qol: Match Unlock Time in Nuke Timelock Message with Nuke Techtree Description + Steelpoint: + - maptweak: Secure Storage on LV-624 has been broken open, making it far less defendable + but easier to access. + fira: + - bugfix: The Thunderdome floor is now explosion-proof. + - balance: Default Web Music Player volume is now 20% down from 50%. It was found + too effective against new players. + - admin: '"Play Internet Sound" is now "Play Admin Sound" and optionally allow to + hide the track name.' + - admin: '"Play Admin Sound" can now be used with uploaded tracks, which use CDN + delivery and the in-chat music player, granting players more control over them.' + - admin: Removed "Play Midi Sound". + ihatethisengine: + - balance: Oppressor no longer can abduct big xenos. + zzzmike: + - qol: ARES hijack announcement specifies that pods will not crash at 100% fuel + - qol: Location name standardization. So, North is now Starboard. This is already + how it is for everything except pumps. From ceaec32965be4fee449b32811819798a9b7467f9 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Fri, 24 Nov 2023 10:13:31 +0000 Subject: [PATCH 26/84] More readable colour for the 'Maintainer' section in staffwho (#5010) # About the pull request Changes the colour of the Maintainer section in the staffwho interface from '`blue`' (`#0000FF`) to '`dodgerblue`' (`#1E90FF`). # Explain why it's good for the game It varies slightly between my monitors, but on both of them it's very hard to make out what the text actually says because of the bad contrast between its colour and the background. # Testing Photographs and Procedure
Screenshots **Before:** ![before](https://github.com/cmss13-devs/cmss13/assets/57483089/56843789-b05d-4f35-8323-bf5fdb5c60ca) **After:** ![after](https://github.com/cmss13-devs/cmss13/assets/57483089/1b65994a-6856-4060-b1ee-c0955fb0e5b4)
*(See also: [Before](https://webaim.org/resources/contrastchecker/?fcolor=0000FF&bcolor=272727) vs [After](https://webaim.org/resources/contrastchecker/?fcolor=1E90FF&bcolor=272727) using WebAIM's contrast checker.)* # Changelog :cl: ui: Tweaked the colour of the 'Maintainer' category in staffwho. /:cl: --- code/game/verbs/who.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index 8a249d297cbe..faa857f8518f 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -160,7 +160,7 @@ if(CONFIG_GET(flag/show_manager)) LAZYSET(mappings, "Management", R_PERMISSIONS) if(CONFIG_GET(flag/show_devs)) - LAZYSET(mappings, "Maintainers", R_PROFILER) + LAZYSET(mappings, "Maintainers", R_PROFILER) LAZYSET(mappings, "Admins", R_ADMIN) if(CONFIG_GET(flag/show_mods)) LAZYSET(mappings, "Moderators", R_MOD) From 3ddbc741b988c4d8b3d5ebbae75516c3c2ce8c14 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 24 Nov 2023 10:21:23 +0000 Subject: [PATCH 27/84] Automatic changelog for PR #5010 [ci skip] --- html/changelogs/AutoChangeLog-pr-5010.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5010.yml diff --git a/html/changelogs/AutoChangeLog-pr-5010.yml b/html/changelogs/AutoChangeLog-pr-5010.yml new file mode 100644 index 000000000000..7533b06d42a5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5010.yml @@ -0,0 +1,4 @@ +author: "SabreML" +delete-after: True +changes: + - ui: "Tweaked the colour of the 'Maintainer' category in staffwho." \ No newline at end of file From 2b3cf3f6d2c4e04692934b231367b31ffcf668cf Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Fri, 24 Nov 2023 10:13:46 +0000 Subject: [PATCH 28/84] Fixes runtime with fire extinguisher cabinets on lifeboats (#5009) # About the pull request Fixes #3998 Fire extinguisher cabinets now new() a fire extinguisher properly in `Intialize()` # 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: fix: Lifeboats fire extinguisher runtime. /:cl: --- code/game/objects/structures/extinguisher.dm | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 7b54f0447fae..e4ee4a1b662b 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -5,13 +5,15 @@ icon_state = "extinguisher" anchored = TRUE density = FALSE - var/obj/item/tool/extinguisher/has_extinguisher = new/obj/item/tool/extinguisher + var/obj/item/tool/extinguisher/has_extinguisher var/opened = 0 var/base_icon /obj/structure/extinguisher_cabinet/Initialize() . = ..() base_icon = initial(icon_state) + has_extinguisher = new /obj/item/tool/extinguisher() + has_extinguisher.forceMove(src) /obj/structure/extinguisher_cabinet/lifeboat name = "extinguisher cabinet" @@ -21,15 +23,15 @@ /obj/structure/extinguisher_cabinet/alt icon_state = "extinguisher_alt" -/obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user) +/obj/structure/extinguisher_cabinet/attackby(obj/item/item, mob/user) if(isrobot(user)) return - if(istype(O, /obj/item/tool/extinguisher)) + if(istype(item, /obj/item/tool/extinguisher)) if(!has_extinguisher && opened) user.drop_held_item() - contents += O - has_extinguisher = O - to_chat(user, SPAN_NOTICE("You place [O] in [src].")) + item.forceMove(src) + has_extinguisher = item + to_chat(user, SPAN_NOTICE("You place [item] in [src].")) else opened = !opened else @@ -45,7 +47,7 @@ user.put_in_hands(has_extinguisher) to_chat(user, SPAN_NOTICE("You take [has_extinguisher] from [src].")) has_extinguisher = null - opened = 1 + opened = TRUE else opened = !opened update_icon() From 5bf403306a31795d9c866a3caac9de7f55f08160 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 24 Nov 2023 10:35:23 +0000 Subject: [PATCH 29/84] Automatic changelog for PR #5009 [ci skip] --- html/changelogs/AutoChangeLog-pr-5009.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5009.yml diff --git a/html/changelogs/AutoChangeLog-pr-5009.yml b/html/changelogs/AutoChangeLog-pr-5009.yml new file mode 100644 index 000000000000..094bc7ccfee3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5009.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - bugfix: "Lifeboats fire extinguisher runtime." \ No newline at end of file From e5e18a550ac97a6638e102688b9cf530a9c5e87f Mon Sep 17 00:00:00 2001 From: ihatethisengine <115417687+ihatethisengine@users.noreply.github.com> Date: Fri, 24 Nov 2023 13:13:55 +0300 Subject: [PATCH 30/84] Lockdown actually closes doors on DS (#5015) # About the pull request Lockdown actually closes doors on DS. # Explain why it's good for the game It used to be the case before the gui rework. I think. Anyway DP should be able to control doors, hunting for the moment when all doors are closed to lock them is extremely not fun. # Testing Photographs and Procedure
:)
# Changelog :cl: ihatethisengine add: Locking down dropship's doors closes them before locking. /:cl: --- code/game/machinery/door_control.dm | 2 +- tgui/packages/tgui/interfaces/DropshipFlightControl.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 8b73588f1d0b..5d6c66309d48 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -64,7 +64,7 @@ if(is_mainship_level(z)) // on the almayer return - shuttle.control_doors("lock", "all", force=FALSE) + shuttle.control_doors("force-lock", "all", force=FALSE) /obj/structure/machinery/door_control/proc/handle_door() for(var/obj/structure/machinery/door/airlock/D in range(range)) diff --git a/tgui/packages/tgui/interfaces/DropshipFlightControl.tsx b/tgui/packages/tgui/interfaces/DropshipFlightControl.tsx index bbb7fea96d2c..4c1c463e65dd 100644 --- a/tgui/packages/tgui/interfaces/DropshipFlightControl.tsx +++ b/tgui/packages/tgui/interfaces/DropshipFlightControl.tsx @@ -45,7 +45,7 @@ const DropshipDoorControl = (_, context) => { disabled={disable_door_controls} onClick={() => act('door-control', { - interaction: 'lock', + interaction: 'force-lock', location: 'all', }) } @@ -81,7 +81,7 @@ const DropshipDoorControl = (_, context) => {