From 5e4943dd22a87437797110d9dcf85e5d6c62775c Mon Sep 17 00:00:00 2001 From: Bloop <13398309+vinylspiders@users.noreply.github.com> Date: Wed, 17 Sep 2025 19:12:02 -0400 Subject: [PATCH 001/109] Fixes spurious runtime on tramstation (#93007) ## About The Pull Request Fixes #92374 image Fixes this, one of the modules makes a door in the rec room which was missing a firelock sanity marker. ## Why It's Good For The Game Less flaky CI ## Changelog Not player facing --- .../tramstation/maintenance_modules/dormmedupper_3.dmm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/_maps/map_files/tramstation/maintenance_modules/dormmedupper_3.dmm b/_maps/map_files/tramstation/maintenance_modules/dormmedupper_3.dmm index 69b84841086..4e29c62a599 100644 --- a/_maps/map_files/tramstation/maintenance_modules/dormmedupper_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/dormmedupper_3.dmm @@ -256,6 +256,10 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/crew_quarters/dorms) +"Gv" = ( +/obj/effect/landmark/firealarm_sanity, +/turf/open/floor/grass, +/area/station/asteroid) "GE" = ( /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, @@ -1082,7 +1086,7 @@ GE vg ci rO -rO +Gv rO rO Cp From 19874a66f1f27e1e5c752fd072d3e51bab36b466 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Thu, 18 Sep 2025 00:27:06 +0000 Subject: [PATCH 002/109] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-92980.yml | 4 ---- html/changelogs/AutoChangeLog-pr-92981.yml | 5 ----- html/changelogs/AutoChangeLog-pr-93002.yml | 4 ---- html/changelogs/archive/2025-09.yml | 9 +++++++++ 4 files changed, 9 insertions(+), 13 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-92980.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92981.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93002.yml diff --git a/html/changelogs/AutoChangeLog-pr-92980.yml b/html/changelogs/AutoChangeLog-pr-92980.yml deleted file mode 100644 index 3fcdfacb5ee..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92980.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Pickle-Coding" -delete-after: True -changes: - - code_imp: "Caches individual gases for gas reactions." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92981.yml b/html/changelogs/AutoChangeLog-pr-92981.yml deleted file mode 100644 index 9a591d50ad9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92981.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "RealWinterFrost & TheSelfish" -delete-after: True -changes: - - rscadd: "Multicolours ushankas, woo!" - - rscadd: "Security now has a hat to fight off the frost." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93002.yml b/html/changelogs/AutoChangeLog-pr-93002.yml deleted file mode 100644 index 911ae678893..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93002.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - bugfix: "'a box full of shotgun darts with increased chemical storage capacity' now has a shorter name" \ No newline at end of file diff --git a/html/changelogs/archive/2025-09.yml b/html/changelogs/archive/2025-09.yml index 272e375efd6..bb0e14210f3 100644 --- a/html/changelogs/archive/2025-09.yml +++ b/html/changelogs/archive/2025-09.yml @@ -486,3 +486,12 @@ materials being processed with a tool. SyncIt21: - bugfix: ORM's smelt ores correctly when inserted by hand/bag +2025-09-18: + LT3: + - bugfix: '''a box full of shotgun darts with increased chemical storage capacity'' + now has a shorter name' + Pickle-Coding: + - code_imp: Caches individual gases for gas reactions. + RealWinterFrost & TheSelfish: + - rscadd: Multicolours ushankas, woo! + - rscadd: Security now has a hat to fight off the frost. From beb50296b66503e485ee8459b7a7df02c2051c0a Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Thu, 18 Sep 2025 06:58:40 +0530 Subject: [PATCH 003/109] Ensures uniform distribution of minerals across ore vents & non zero material boulders (#92996) ## About The Pull Request - Fixes #92972 There were multiple problems with code that I can't be asked to explain but here is the intended output(`ore_vent_minerals` contains the copy of the list `ore_vent_minerals_lavaland` which we actually modify & not the global list itself) Screenshot (512) All ore vents will now have at most 4 minerals but because we use an associative list it is possible for a mineral to get picked more than once in the same iteration resulting in old values getting replaced which isn't a problem but just a point to be known so you don't always get vents with 4 minerals Another problem i ran into debugging is that some vents churn out 0 material boulders. That had to do with rounding down of the logarithmic function which returned 0. We now ensure that never happens ## Changelog :cl: fix: ore vents have unique distribution of at most 4 minerals without rare ones being repeated fix: ore vents should no longer be produce 0 material boulders /:cl: --- code/controllers/subsystem/ore_generation.dm | 22 ++----- .../objects/structures/lavaland/ore_vent.dm | 57 ++++++++++++------- 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/code/controllers/subsystem/ore_generation.dm b/code/controllers/subsystem/ore_generation.dm index 97fd6057d65..b364bfe0487 100644 --- a/code/controllers/subsystem/ore_generation.dm +++ b/code/controllers/subsystem/ore_generation.dm @@ -21,26 +21,12 @@ SUBSYSTEM_DEF(ore_generation) */ var/list/ore_vent_minerals = list() - /// A tracker of how many of each ore vent size we have in the game. Useful for tracking purposes. - /datum/controller/subsystem/ore_generation/Initialize() //Basically, we're going to round robin through the list of ore vents and assign a mineral to them until complete. - while(length(ore_vent_minerals) > 0) //Keep looping if there's more to assign - var/stallbreaker = 0 - for(var/obj/structure/ore_vent/vent as anything in possible_vents) - if(length(ore_vent_minerals) <= 0) //But break early if there's none left. - break - if(vent.unique_vent) - continue //Ya'll already got your minerals. - if(length(difflist(first = ore_vent_minerals, second = vent.mineral_breakdown, skiprep = 1))) - vent.generate_mineral_breakdown(new_minerals = 1, map_loading = TRUE) - else - stallbreaker++ - if(stallbreaker >= length(possible_vents)) - break //We've done all we can here. break inner loop - continue - if(stallbreaker >= length(possible_vents)) - break //We've done all we can here. break outer loop + for(var/obj/structure/ore_vent/vent as anything in possible_vents) + if(vent.unique_vent) + continue //Ya'll already got your minerals. + vent.generate_mineral_breakdown(map_loading = TRUE) /// Handles roundstart logging logger.Log( diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index c6afbc362a1..2e00a08a600 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -3,6 +3,7 @@ #define OVERLAY_OFFSET_START 0 #define OVERLAY_OFFSET_EACH 5 #define MINERALS_PER_BOULDER 3 +#define MAX_MINERAL_PICK_ATTEMPTS 10 /obj/structure/ore_vent name = "ore vent" @@ -171,26 +172,37 @@ /obj/structure/ore_vent/proc/generate_mineral_breakdown(new_minerals = MINERAL_TYPE_OPTIONS_RANDOM, map_loading = FALSE) if(new_minerals < 1) CRASH("generate_mineral_breakdown called with new_minerals < 1.") - var/list/available_mats = difflist(first = SSore_generation.ore_vent_minerals, second = mineral_breakdown, skiprep = 1) - for(var/i in 1 to new_minerals) - if(!length(SSore_generation.ore_vent_minerals) && map_loading) - // We should prevent this from happening in SSore_generation, but if not then we crash here - CRASH("No minerals left to pick from! We may have spawned too many ore vents in init, or the map config in seedRuins may not have enough resources for the mineral budget.") - var/datum/material/new_material - if(map_loading) - if(length(available_mats)) - new_material = pick(GLOB.ore_vent_minerals_lavaland) - var/datum/material/surrogate_mat = pick(SSore_generation.ore_vent_minerals) - available_mats -= surrogate_mat - SSore_generation.ore_vent_minerals -= surrogate_mat - else - new_material = pick(available_mats) - available_mats -= new_material - SSore_generation.ore_vent_minerals -= new_material - else - new_material = pick(GLOB.ore_vent_minerals_lavaland) - mineral_breakdown[new_material] = rand(1, 4) + //should have enough minerals for the vent during round start + var/list/available_minerals = SSore_generation.ore_vent_minerals + if(map_loading && available_minerals.len < new_minerals) + CRASH("No minerals left to pick from! We may have spawned too many ore vents in init, or the map config in seedRuins may not have enough resources for the mineral budget.") + + var/list/datum/material/picked_minerals = list() + for(var/_ in 1 to new_minerals) + var/datum/material/mineral + + //pick an unique mineral but try only MAX_MINERAL_PICK_ATTEMPTS times before giving up else we could be stuck here forever + var/attempts = 0 + do + mineral = length(mineral_breakdown) ? pick_weight(mineral_breakdown) : null + if(map_loading) + if(!mineral || !available_minerals.Find(mineral)) + mineral = pick(available_minerals) + else + mineral = mineral || pick_weight(GLOB.ore_vent_minerals_lavaland) + attempts += 1 + while(attempts < MAX_MINERAL_PICK_ATTEMPTS && picked_minerals.Find(mineral)) + + //register the picked mineral, removing it from the round start available minerals if nessassary + if(map_loading) + available_minerals -= mineral + picked_minerals |= mineral + + //assign random weights to picked minerals + mineral_breakdown.Cut() + for(var/datum/material/mineral as anything in picked_minerals) + mineral_breakdown[mineral] = rand(1, new_minerals) /** * Returns the quantity of mineral sheets in each ore vent's boulder contents roll. @@ -201,7 +213,7 @@ * @params ore_floor The number of minerals already rolled. Used to scale the logarithmic function. */ /obj/structure/ore_vent/proc/ore_quantity_function(ore_floor) - return SHEET_MATERIAL_AMOUNT * round(boulder_size * (log(rand(1 + ore_floor, 4 + ore_floor)) ** -1)) + return SHEET_MATERIAL_AMOUNT * max(round(boulder_size * (log(rand(1 + ore_floor, 4 + ore_floor)) ** -1)), 1) /** * This confirms that the user wants to start the wave defense event, and that they can start it. @@ -472,8 +484,8 @@ unique_vent = TRUE boulder_size = BOULDER_SIZE_SMALL mineral_breakdown = list( - /datum/material/iron = 50, - /datum/material/glass = 50, + /datum/material/iron = 1, + /datum/material/glass = 1, ) /obj/structure/ore_vent/random @@ -614,3 +626,4 @@ #undef OVERLAY_OFFSET_START #undef OVERLAY_OFFSET_EACH #undef MINERALS_PER_BOULDER +#undef MAX_MINERAL_PICK_ATTEMPTS From 37324b69db60ae16a686b806c5a016827a5b8532 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Thu, 18 Sep 2025 01:28:58 +0000 Subject: [PATCH 004/109] Automatic changelog for PR #92996 [ci skip] --- html/changelogs/AutoChangeLog-pr-92996.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92996.yml diff --git a/html/changelogs/AutoChangeLog-pr-92996.yml b/html/changelogs/AutoChangeLog-pr-92996.yml new file mode 100644 index 00000000000..7829c0106ed --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92996.yml @@ -0,0 +1,5 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "ore vents have unique distribution of at most 4 minerals without rare ones being repeated" + - bugfix: "ore vents should no longer be produce 0 material boulders" \ No newline at end of file From 2075a27dc62d432de940a66ed4ae20bc9aae4eb2 Mon Sep 17 00:00:00 2001 From: Bloop <13398309+vinylspiders@users.noreply.github.com> Date: Wed, 17 Sep 2025 23:43:39 -0400 Subject: [PATCH 005/109] Makes the regex for the 'fix' label detection a bit more lenient (#93008) ## About The Pull Request Currently, for detecting issue-closing fixes, the labeler regex matches strictly things like: `Fixes #some_number_here` but sometimes people will paste the full issues url, which github renders as the issue number. Problem is the raw text still has the url, so it will not match when passed through the rest api. This PR just makes it a bit less restrictive, so that something like this: ``Fixes https://github.com/tgstation/tgstation/issues/some_number_here` will correctly get registered as a fix. ## Why It's Good For The Game More PRs getting autolabeled more correctly ## Changelog Not player-facing --- tools/pull_request_hooks/autoLabel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pull_request_hooks/autoLabel.js b/tools/pull_request_hooks/autoLabel.js index d898c4587b7..b995bdc19d5 100644 --- a/tools/pull_request_hooks/autoLabel.js +++ b/tools/pull_request_hooks/autoLabel.js @@ -48,7 +48,7 @@ function check_body_for_labels(body) { const labels_to_add = []; // detect "fixes #1234" or "resolves #1234" in body - const fix_regex = /\b(?:fix(?:es|ed)?|resolve[sd]?)\s*#\d+\b/gim; + const fix_regex = /\b(?:fix(?:es|ed)?|resolve[sd]?)\s*(?:#\d+|https:\/\/github\.com\/\S+\/issues\/\d+)/gim; if (fix_regex.test(body)) { labels_to_add.push("Fix"); } From fe1974618381ac156e7bfa058f5e2c2606581ff6 Mon Sep 17 00:00:00 2001 From: Cursor <102828457+theselfish@users.noreply.github.com> Date: Thu, 18 Sep 2025 15:23:14 +0100 Subject: [PATCH 006/109] [nogbp] wrong armor type fixy wixy (#93012) --- code/modules/clothing/head/hat.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/head/hat.dm b/code/modules/clothing/head/hat.dm index b206383ffa0..a6402607781 100644 --- a/code/modules/clothing/head/hat.dm +++ b/code/modules/clothing/head/hat.dm @@ -368,7 +368,7 @@ icon_state = "/obj/item/clothing/head/costume/ushanka/sec" desc = "A warm and comfortable ushanka, dyed with 'all natural flavors' according to the tag." greyscale_colors = "#C7B08B#A52F29" - armor_type = /datum/armor/head_helmet + armor_type = /datum/armor/cosmetic_sec flags_1 = null /obj/item/clothing/head/costume/nightcap From 350ab11b7770fd58b93ab0ff621f79b80f3c28d4 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Thu, 18 Sep 2025 14:23:34 +0000 Subject: [PATCH 007/109] Automatic changelog for PR #93012 [ci skip] --- html/changelogs/AutoChangeLog-pr-93012.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93012.yml diff --git a/html/changelogs/AutoChangeLog-pr-93012.yml b/html/changelogs/AutoChangeLog-pr-93012.yml new file mode 100644 index 00000000000..814af0edbfa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93012.yml @@ -0,0 +1,4 @@ +author: "theselfish" +delete-after: True +changes: + - balance: "a ushanka no longer can protect brainy as much as a metal helmet" \ No newline at end of file From f960fac5b7cd54ccac324dda39919c39f74d9085 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 00:28:34 +0000 Subject: [PATCH 008/109] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-92996.yml | 5 ----- html/changelogs/AutoChangeLog-pr-93012.yml | 4 ---- html/changelogs/archive/2025-09.yml | 7 +++++++ 3 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-92996.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93012.yml diff --git a/html/changelogs/AutoChangeLog-pr-92996.yml b/html/changelogs/AutoChangeLog-pr-92996.yml deleted file mode 100644 index 7829c0106ed..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92996.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "ore vents have unique distribution of at most 4 minerals without rare ones being repeated" - - bugfix: "ore vents should no longer be produce 0 material boulders" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93012.yml b/html/changelogs/AutoChangeLog-pr-93012.yml deleted file mode 100644 index 814af0edbfa..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93012.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "theselfish" -delete-after: True -changes: - - balance: "a ushanka no longer can protect brainy as much as a metal helmet" \ No newline at end of file diff --git a/html/changelogs/archive/2025-09.yml b/html/changelogs/archive/2025-09.yml index bb0e14210f3..d5d01917de6 100644 --- a/html/changelogs/archive/2025-09.yml +++ b/html/changelogs/archive/2025-09.yml @@ -495,3 +495,10 @@ RealWinterFrost & TheSelfish: - rscadd: Multicolours ushankas, woo! - rscadd: Security now has a hat to fight off the frost. +2025-09-19: + SyncIt21: + - bugfix: ore vents have unique distribution of at most 4 minerals without rare + ones being repeated + - bugfix: ore vents should no longer be produce 0 material boulders + theselfish: + - balance: a ushanka no longer can protect brainy as much as a metal helmet From 37fe8b61e0d2f75c28ed705d3fe5ebf285589bc9 Mon Sep 17 00:00:00 2001 From: Leland Kemble <70413276+lelandkemble@users.noreply.github.com> Date: Thu, 18 Sep 2025 20:35:48 -0400 Subject: [PATCH 009/109] Switches the Delta Station bottom two telecomms busses around (#93009) ## About The Pull Request The bottom left bus is connected to the engi and common servers, but next to the service and supply servers, and vice versa for the bottom right one. They're not in the places they should be based on what they're connected to. ## Why It's Good For The Game No more extremely confusing telecomms failures in seemingly undamaged channels Consistency ## Changelog :cl: qol: Switched the engi/common and service/supply telecomms busses around on Delta Station /:cl: --- _maps/map_files/Deltastation/DeltaStation2.dmm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 5740dabcd25..121f701bbba 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -15709,10 +15709,10 @@ }, /area/station/hallway/primary/fore) "dRh" = ( -/obj/machinery/telecomms/bus/preset_four, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 1 }, +/obj/machinery/telecomms/bus/preset_two, /turf/open/floor/iron/telecomms, /area/station/tcommsat/server) "dRo" = ( @@ -39973,10 +39973,10 @@ /turf/open/floor/iron, /area/station/security/range) "jPC" = ( -/obj/machinery/telecomms/bus/preset_two, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 4 }, +/obj/machinery/telecomms/bus/preset_four, /turf/open/floor/iron/telecomms, /area/station/tcommsat/server) "jPE" = ( From 379bd3cd66b0a0217711e8a9ba62e212199e6bc0 Mon Sep 17 00:00:00 2001 From: Aliceee2ch <160794176+Aliceee2ch@users.noreply.github.com> Date: Fri, 19 Sep 2025 03:35:57 +0300 Subject: [PATCH 010/109] Removing rogue decal in DeltaStation garden (#93016) ## About The Pull Request title ## Why It's Good For The Game we hate bad decals :( ## Changelog :cl: fix: Removed rogue decal in DeltaStation garden /:cl: --- _maps/map_files/Deltastation/DeltaStation2.dmm | 3 --- 1 file changed, 3 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 121f701bbba..2190c7772c4 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -47677,9 +47677,6 @@ /area/station/engineering/atmos/mix) "lKk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/green/corner{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, /turf/open/floor/iron, From 2526bfe9a315a28c4f1a75a50ea8e40d55e04802 Mon Sep 17 00:00:00 2001 From: Aliceee2ch <160794176+Aliceee2ch@users.noreply.github.com> Date: Fri, 19 Sep 2025 03:36:07 +0300 Subject: [PATCH 011/109] Adds RD computers on Catwalk (#93017) ## About The Pull Request adds rd computer to rd office and replaces one of two rnd consoles on bridge with rd computer ## Why It's Good For The Game rd has rd computer by default + bridge has 2 rnd consoles that were placed by mistake i guess ## Changelog :cl: fix: Added missing RD computer in RD office (Catwalk) map: Replaced one of RND consoles on bridge with RD computer (Catwalk) /:cl: --- .../map_files/CatwalkStation/CatwalkStation_2023.dmm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm index 6e6507bdc53..a417d739af5 100644 --- a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm +++ b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm @@ -36027,12 +36027,9 @@ /turf/open/floor/plating, /area/station/engineering/atmos/project) "kpz" = ( -/obj/structure/rack, -/obj/item/aicard, -/obj/item/pai_card, -/obj/item/circuitboard/aicore, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, +/obj/machinery/modular_computer/preset/research, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) "kpC" = ( @@ -40037,6 +40034,10 @@ /area/station/commons/fitness/recreation) "lAu" = ( /obj/structure/cable, +/obj/structure/rack, +/obj/item/aicard, +/obj/item/pai_card, +/obj/item/circuitboard/aicore, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) "lAE" = ( @@ -82617,7 +82618,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/aft) "xZp" = ( -/obj/machinery/computer/rdconsole, +/obj/machinery/modular_computer/preset/research, /turf/open/floor/carpet, /area/station/command/bridge) "xZG" = ( From 6853917f59091857e3ff5def9a7c8a0ba6aa7542 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 00:36:16 +0000 Subject: [PATCH 012/109] Automatic changelog for PR #93016 [ci skip] --- html/changelogs/AutoChangeLog-pr-93016.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93016.yml diff --git a/html/changelogs/AutoChangeLog-pr-93016.yml b/html/changelogs/AutoChangeLog-pr-93016.yml new file mode 100644 index 00000000000..8a849bca26c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93016.yml @@ -0,0 +1,4 @@ +author: "Aliceee2ch" +delete-after: True +changes: + - bugfix: "Removed rogue decal in DeltaStation garden" \ No newline at end of file From 96f319c3d2cb5775a2276654d16301c7988cfbcb Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 00:36:26 +0000 Subject: [PATCH 013/109] Automatic changelog for PR #93017 [ci skip] --- html/changelogs/AutoChangeLog-pr-93017.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93017.yml diff --git a/html/changelogs/AutoChangeLog-pr-93017.yml b/html/changelogs/AutoChangeLog-pr-93017.yml new file mode 100644 index 00000000000..e73ec8b3d5b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93017.yml @@ -0,0 +1,5 @@ +author: "Aliceee2ch" +delete-after: True +changes: + - bugfix: "Added missing RD computer in RD office (Catwalk)" + - map: "Replaced one of RND consoles on bridge with RD computer (Catwalk)" \ No newline at end of file From c0f8e7bb5caf95a3dba1bd91ce0086e43d7daf9f Mon Sep 17 00:00:00 2001 From: Hatterhat <31829017+Hatterhat@users.noreply.github.com> Date: Fri, 19 Sep 2025 17:10:35 -0500 Subject: [PATCH 014/109] Multiload Second Pass (ft. Speedloaders Will Be Real In 2025) (#92854) ## About The Pull Request Gets, yet again, more granular with multiload capabilities, by introducing `AMMO_BOX_MULTILOAD_OUT_LOADED`; ammo boxes flagged with this can speed-load ammo boxes that are currently inside another gun, like revolver cylinders or internal magazines. To accomodate for this, the previous flag that covered this, `AMMO_BOX_MULTILOAD_OUT` can no longer speedload into currently loaded magazines (e.g. internal magazines, including revolver cylinders). Also implements a base type for speedloaders, moving .38 and .357 speedloaders along with .310 stripper clips to this type, instead of being ammo boxes. Also features an UpdatePaths script for mappers, which is why there's so many files touched - repathing is a pain. Also also adds fancy types for ammo boxes, magazines, and speedloaders, which isn't particularly player-facing. Also also also makes the lionhunter ammo strip for the lionhunter rifle visually three rounds only instead of being perpetually half-full (or half-empty, depending on your pessimism). ## Why It's Good For The Game The hypothetical case of "ammo box that holds shotgun ammo" should probably... not... teleport as much of its ammo as possible into a tube-fed shotgun, but should probably still be okay at reloading magazines that actually go into shotguns. Or something. More relevant, reloading BR-38 magazines with speedloaders, while funny, probably also shouldn't be teleporting in six fresh rounds. ## Changelog :cl: balance: General ammo boxes (not speedloaders, not stripper clips) can no longer multiload into currently loaded magazines (revolver cylinders, internal magazines). balance: Speedloaders are now a separate type from ammo boxes, and can only multiload into currently loaded magazines e.g. revolver cylinders. qol: Ammo boxes, magazines, and speedloaders now have fancier types for spawning in by admins. sprite: Lionhunter ammo clips are visually smaller now. /:cl: --------- Co-authored-by: Hatterhat --- .../SpaceRuins/dangerous_research.dmm | 6 +- _maps/RandomRuins/SpaceRuins/oldstation.dmm | 4 +- _maps/RandomZLevels/snowdin.dmm | 4 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 2 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- _maps/map_files/generic/CentCom.dmm | 4 +- _maps/map_files/tramstation/tramstation.dmm | 2 +- _maps/minigame/basketball/soviet_bear.dmm | 12 +- _maps/minigame/deathmatch/arena_station.dmm | 2 +- _maps/minigame/deathmatch/train.dmm | 8 +- .../minigame/deathmatch/underground_arena.dmm | 2 +- _maps/modular_generic/jungle_m_armory.dmm | 2 +- _maps/modular_generic/station_s_vault.dmm | 2 +- _maps/shuttles/hunter_psyker.dmm | 12 +- _maps/shuttles/hunter_russian.dmm | 10 +- _maps/shuttles/pirate_silverscale.dmm | 8 +- _maps/templates/battlecruiser_starfury.dmm | 6 +- _maps/virtual_domains/meta_central.dmm | 2 +- code/__DEFINES/combat.dm | 12 +- code/__HELPERS/type_processing.dm | 3 + code/datums/storage/subtypes/belts.dm | 2 +- code/datums/storage/subtypes/holsters.dm | 12 +- code/datums/storage/subtypes/pockets.dm | 4 +- .../spawners/random/russian_rifle_spawner.dm | 4 +- code/game/objects/items/storage/holsters.dm | 4 +- .../items/storage/toolboxes/weapons.dm | 6 +- .../game/objects/items/storage/uplink_kits.dm | 4 +- .../crates_lockers/closets/secure/misc.dm | 4 +- .../fugitive/hunters/hunter_outfits.dm | 2 +- .../antagonists/heretic/items/hunter_rifle.dm | 4 +- .../heretic/knowledge/side_blade_rust.dm | 2 +- code/modules/bitrunning/outfits.dm | 2 +- code/modules/cargo/goodies.dm | 6 +- code/modules/cargo/packs/imports.dm | 4 +- code/modules/cargo/packs/security.dm | 8 +- code/modules/clothing/outfits/ert.dm | 6 +- code/modules/clothing/outfits/standard.dm | 4 +- .../modules/deathmatch/deathmatch_loadouts.dm | 6 +- code/modules/jobs/job_types/detective.dm | 12 +- code/modules/jobs/job_types/janitor.dm | 4 +- .../boxes_magazines/_box_magazine.dm | 14 +- .../projectiles/boxes_magazines/ammo_boxes.dm | 124 ---------------- .../boxes_magazines/speedloaders.dm | 134 ++++++++++++++++++ .../designs/autolathe/security_designs.dm | 2 +- .../research/designs/weapon_designs.dm | 12 +- .../modules/uplink/uplink_items/ammunition.dm | 2 +- code/modules/uplink/uplink_items/nukeops.dm | 6 +- icons/obj/weapons/guns/ammo.dmi | Bin 31173 -> 31279 bytes tgstation.dme | 1 + tools/UpdatePaths/92854_speedloaders.txt | 3 + .../Scripts/92854_speedloaders.txt | 3 + 51 files changed, 268 insertions(+), 238 deletions(-) create mode 100644 code/modules/projectiles/boxes_magazines/speedloaders.dm create mode 100644 tools/UpdatePaths/92854_speedloaders.txt create mode 100644 tools/UpdatePaths/Scripts/92854_speedloaders.txt diff --git a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm index 10fde28bef9..a2baaa8dc20 100644 --- a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm @@ -1643,8 +1643,8 @@ /obj/structure/rack, /obj/effect/decal/cleanable/dirt, /obj/item/storage/toolbox/mechanical, -/obj/item/ammo_box/c38, -/obj/item/ammo_box/c38, +/obj/item/ammo_box/speedloader/c38, +/obj/item/ammo_box/speedloader/c38, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 1 }, @@ -3666,7 +3666,7 @@ /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/spawner/random/contraband/permabrig_weapon, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/ammo_box/c38, +/obj/item/ammo_box/speedloader/c38, /obj/effect/turf_decal/tile/dark_red/anticorner, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research) diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index acfff23fc4d..f6091bb08a6 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -5135,8 +5135,8 @@ /obj/item/spess_knife, /obj/item/clothing/suit/armor/vest/old, /obj/item/gun/ballistic/rifle/boltaction, -/obj/item/ammo_box/strilka310, -/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/speedloader/strilka310, +/obj/item/ammo_box/speedloader/strilka310, /turf/open/floor/plating, /area/ruin/space/ancientstation/delta/hall) "BU" = ( diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 4921760709f..b656d7b4a94 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -2113,8 +2113,8 @@ /area/awaymission/snowdin/post/hydro) "hZ" = ( /obj/item/gun/ballistic/rifle/boltaction, -/obj/item/ammo_box/strilka310, -/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/speedloader/strilka310, +/obj/item/ammo_box/speedloader/strilka310, /obj/structure/closet/secure_closet{ icon_state = "sec"; name = "security officer's locker"; diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 30382d60bb4..dc12a19cd57 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -27753,7 +27753,7 @@ /obj/item/reagent_containers/cup/glass/drinkingglass/shotglass, /obj/item/reagent_containers/cup/glass/drinkingglass/shotglass, /obj/item/gun/ballistic/revolver/russian, -/obj/item/ammo_box/a357, +/obj/item/ammo_box/speedloader/c357, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka, /obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/tile/neutral/fourcorners, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index f9e4027e127..f79ba93d622 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -43380,7 +43380,7 @@ /obj/item/lazarus_injector, /obj/item/gun/energy/disabler, /obj/item/gun/ballistic/revolver/russian, -/obj/item/ammo_box/a357, +/obj/item/ammo_box/speedloader/c357, /obj/item/clothing/neck/stethoscope, /obj/item/book{ desc = "An undeniably handy book."; diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index dfcce8dc3b2..11fb4bc5caa 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -9129,8 +9129,8 @@ /area/centcom/central_command_areas/courtroom) "QY" = ( /obj/item/storage/box/handcuffs, -/obj/item/ammo_box/a357, -/obj/item/ammo_box/a357, +/obj/item/ammo_box/speedloader/c357, +/obj/item/ammo_box/speedloader/c357, /obj/item/gun/ballistic/revolver/mateba, /obj/structure/table/reinforced, /obj/machinery/firealarm/directional/south, diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 0a3c0e39fec..cf5ca9feafe 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -45154,7 +45154,7 @@ /obj/structure/safe/vault, /obj/item/clothing/head/costume/bearpelt, /obj/item/gun/ballistic/revolver/russian, -/obj/item/ammo_box/a357, +/obj/item/ammo_box/speedloader/c357, /obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/dim/directional/east, diff --git a/_maps/minigame/basketball/soviet_bear.dmm b/_maps/minigame/basketball/soviet_bear.dmm index a612daa3653..f636344c4c0 100644 --- a/_maps/minigame/basketball/soviet_bear.dmm +++ b/_maps/minigame/basketball/soviet_bear.dmm @@ -6,9 +6,9 @@ /area/centcom/basketball) "aw" = ( /obj/structure/table, -/obj/item/ammo_box/strilka310, -/obj/item/ammo_box/strilka310, -/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/speedloader/strilka310, +/obj/item/ammo_box/speedloader/strilka310, +/obj/item/ammo_box/speedloader/strilka310, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -348,9 +348,9 @@ /area/centcom/basketball) "Bd" = ( /obj/structure/table, -/obj/item/ammo_box/strilka310, -/obj/item/ammo_box/strilka310, -/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/speedloader/strilka310, +/obj/item/ammo_box/speedloader/strilka310, +/obj/item/ammo_box/speedloader/strilka310, /turf/open/floor/iron/dark, /area/centcom/basketball) "BJ" = ( diff --git a/_maps/minigame/deathmatch/arena_station.dmm b/_maps/minigame/deathmatch/arena_station.dmm index 1e2b1b57be7..c3fb3ed3903 100644 --- a/_maps/minigame/deathmatch/arena_station.dmm +++ b/_maps/minigame/deathmatch/arena_station.dmm @@ -876,7 +876,7 @@ /area/deathmatch) "Kz" = ( /obj/effect/spawner/random/trash/box, -/obj/item/ammo_box/a357, +/obj/item/ammo_box/speedloader/c357, /turf/open/indestructible/plating, /area/deathmatch) "KC" = ( diff --git a/_maps/minigame/deathmatch/train.dmm b/_maps/minigame/deathmatch/train.dmm index 3f0619d1ab4..d35de7b1a6e 100644 --- a/_maps/minigame/deathmatch/train.dmm +++ b/_maps/minigame/deathmatch/train.dmm @@ -34,7 +34,7 @@ locked = 0 }, /obj/effect/decal/cleanable/fuel_pool/hivis, -/obj/item/ammo_box/c38, +/obj/item/ammo_box/speedloader/c38, /obj/effect/turf_decal/stripes/asteroid/line{ dir = 6 }, @@ -242,7 +242,7 @@ locked = 0 }, /obj/effect/decal/cleanable/fuel_pool/hivis, -/obj/item/ammo_box/c38, +/obj/item/ammo_box/speedloader/c38, /obj/effect/turf_decal/stripes/asteroid/line{ dir = 4 }, @@ -617,7 +617,7 @@ /area/deathmatch) "EX" = ( /obj/structure/lattice/catwalk, -/obj/item/ammo_box/c38/match, +/obj/item/ammo_box/speedloader/c38/match, /turf/open/chasm/true/no_smooth/fake_motion_sand/fast, /area/deathmatch) "Fa" = ( @@ -932,7 +932,7 @@ locked = 0 }, /obj/effect/decal/cleanable/fuel_pool/hivis, -/obj/item/ammo_box/c38, +/obj/item/ammo_box/speedloader/c38, /obj/effect/turf_decal/stripes/asteroid/line{ dir = 4 }, diff --git a/_maps/minigame/deathmatch/underground_arena.dmm b/_maps/minigame/deathmatch/underground_arena.dmm index 4d776acb0b4..cd8d535ad71 100644 --- a/_maps/minigame/deathmatch/underground_arena.dmm +++ b/_maps/minigame/deathmatch/underground_arena.dmm @@ -564,7 +564,7 @@ /area/deathmatch) "Kb" = ( /obj/structure/table/reinforced, -/obj/item/ammo_box/strilka310/surplus, +/obj/item/ammo_box/speedloader/strilka310/surplus, /turf/open/indestructible/dark/smooth_large, /area/deathmatch) "Kr" = ( diff --git a/_maps/modular_generic/jungle_m_armory.dmm b/_maps/modular_generic/jungle_m_armory.dmm index 39090181945..0ba60740059 100644 --- a/_maps/modular_generic/jungle_m_armory.dmm +++ b/_maps/modular_generic/jungle_m_armory.dmm @@ -242,7 +242,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/speedloader/strilka310, /obj/effect/decal/cleanable/dirt, /obj/structure/railing/corner/end/flip{ dir = 8 diff --git a/_maps/modular_generic/station_s_vault.dmm b/_maps/modular_generic/station_s_vault.dmm index 774d50d3152..3a621492bb2 100644 --- a/_maps/modular_generic/station_s_vault.dmm +++ b/_maps/modular_generic/station_s_vault.dmm @@ -77,7 +77,7 @@ /obj/effect/turf_decal/trimline/dark_blue/corner{ dir = 8 }, -/obj/item/ammo_box/a357, +/obj/item/ammo_box/speedloader/c357, /obj/item/gun/ballistic/revolver/golden, /turf/open/floor/iron/smooth_corner{ dir = 8 diff --git a/_maps/shuttles/hunter_psyker.dmm b/_maps/shuttles/hunter_psyker.dmm index 476e58ce6f8..2c744e09ec0 100644 --- a/_maps/shuttles/hunter_psyker.dmm +++ b/_maps/shuttles/hunter_psyker.dmm @@ -147,25 +147,25 @@ "gE" = ( /obj/effect/turf_decal/tile/dark_blue/diagonal_edge, /obj/structure/table/reinforced/plasmarglass, -/obj/item/ammo_box/c38/match{ +/obj/item/ammo_box/speedloader/c38/match{ pixel_x = -5; pixel_y = 4 }, -/obj/item/ammo_box/c38/match{ +/obj/item/ammo_box/speedloader/c38/match{ pixel_x = -1; pixel_y = 4 }, -/obj/item/ammo_box/c38/match{ +/obj/item/ammo_box/speedloader/c38/match{ pixel_x = 3; pixel_y = 4 }, -/obj/item/ammo_box/c38/match{ +/obj/item/ammo_box/speedloader/c38/match{ pixel_x = -8 }, -/obj/item/ammo_box/c38/match{ +/obj/item/ammo_box/speedloader/c38/match{ pixel_x = -4 }, -/obj/item/ammo_box/c38/match, +/obj/item/ammo_box/speedloader/c38/match, /turf/open/floor/iron/white/diagonal, /area/shuttle/hunter) "gW" = ( diff --git a/_maps/shuttles/hunter_russian.dmm b/_maps/shuttles/hunter_russian.dmm index 3f3f24fee57..46840f7cdd7 100644 --- a/_maps/shuttles/hunter_russian.dmm +++ b/_maps/shuttles/hunter_russian.dmm @@ -173,10 +173,10 @@ /obj/structure/closet/crate/secure/weapon{ name = "surplus crate" }, -/obj/item/ammo_box/strilka310, -/obj/item/ammo_box/strilka310, -/obj/item/ammo_box/strilka310, -/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/speedloader/strilka310, +/obj/item/ammo_box/speedloader/strilka310, +/obj/item/ammo_box/speedloader/strilka310, +/obj/item/ammo_box/speedloader/strilka310, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) "qF" = ( @@ -611,7 +611,7 @@ /obj/effect/decal/cleanable/dirt, /obj/item/gun/ballistic/automatic/pistol, /obj/item/ammo_box/magazine/m9mm, -/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/speedloader/strilka310, /obj/item/crowbar, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) diff --git a/_maps/shuttles/pirate_silverscale.dmm b/_maps/shuttles/pirate_silverscale.dmm index b95c32be7d1..e5780fed0cb 100644 --- a/_maps/shuttles/pirate_silverscale.dmm +++ b/_maps/shuttles/pirate_silverscale.dmm @@ -802,18 +802,18 @@ dir = 8 }, /obj/effect/turf_decal/bot, -/obj/item/ammo_box/strilka310/phasic{ +/obj/item/ammo_box/speedloader/strilka310/phasic{ pixel_y = -5; pixel_x = 5 }, -/obj/item/ammo_box/strilka310/phasic{ +/obj/item/ammo_box/speedloader/strilka310/phasic{ pixel_x = 5 }, -/obj/item/ammo_box/strilka310/phasic{ +/obj/item/ammo_box/speedloader/strilka310/phasic{ pixel_x = -5; pixel_y = -5 }, -/obj/item/ammo_box/strilka310/phasic{ +/obj/item/ammo_box/speedloader/strilka310/phasic{ pixel_x = -5 }, /obj/item/gun/ballistic/rifle/boltaction/prime{ diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index 7f8ab9909db..5dd8929572b 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -2221,11 +2221,11 @@ pixel_y = 4 }, /obj/item/ammo_box/c10mm, -/obj/item/ammo_box/a357{ +/obj/item/ammo_box/speedloader/c357{ icon_state = "357-7"; pixel_y = 3 }, -/obj/item/ammo_box/a357{ +/obj/item/ammo_box/speedloader/c357{ icon_state = "357-7"; pixel_x = 2 }, @@ -2376,7 +2376,7 @@ /obj/item/storage/lockbox/medal{ req_access = list("syndicate_leader") }, -/obj/item/ammo_box/a357{ +/obj/item/ammo_box/speedloader/c357{ icon_state = "357-7"; pixel_x = 2 }, diff --git a/_maps/virtual_domains/meta_central.dmm b/_maps/virtual_domains/meta_central.dmm index ee1bfe8d10f..a9879576f73 100644 --- a/_maps/virtual_domains/meta_central.dmm +++ b/_maps/virtual_domains/meta_central.dmm @@ -4083,7 +4083,7 @@ /area/virtual_domain) "Il" = ( /obj/structure/lattice, -/obj/item/ammo_box/strilka310/surplus, +/obj/item/ammo_box/speedloader/strilka310/surplus, /turf/open/space/basic, /area/virtual_domain) "Io" = ( diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index a340e522896..7d9276b08c7 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -236,16 +236,22 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( // Ammo box multiload defines /// Ammo box does not accept multiload in or out, e.g. ammo box CANNOT transfer multiple casings in one action, either IN or OUT. #define AMMO_BOX_MULTILOAD_NONE 0 -/// Ammo box accepts multiload going in, e.g. ammo box can transfer multiple casings IN at once. +/// Ammo box accepts multiload going in, e.g. a magazine being fed from a stripper clip. #define AMMO_BOX_MULTILOAD_IN (1 << 0) -/// Ammo box accepts multiload going out, e.g. ammo box can transfer multiple casings OUT at once. +/// Ammo box can multiload going out to other ammo boxes, but not loaded magazines, e.g. an ammo box feeding into an unloaded magazine. #define AMMO_BOX_MULTILOAD_OUT (1 << 1) +/// Ammo box can multiload going out into loaded magazines, e.g. a speedloader feeding into a revolver's cylinder or a stripper clip feeding into a loaded magazine. +#define AMMO_BOX_MULTILOAD_OUT_LOADED (1 << 2) /// Ammo box accepts multiload in AND out, e.g. ammo box can transfer multiple casings IN at once *and* OUT at once. -#define AMMO_BOX_MULTILOAD_BOTH AMMO_BOX_MULTILOAD_IN | AMMO_BOX_MULTILOAD_OUT +/// Ammo boxes are assumed to have some variety of magazine loading assistance. +#define AMMO_BOX_MULTILOAD_BOTH (AMMO_BOX_MULTILOAD_IN | AMMO_BOX_MULTILOAD_OUT) +/// Ammo box can accept multiloads, AND can give multiloads to boxes that are loaded or not loaded. Individual stripper clips would count for this. +#define AMMO_BOX_MULTILOAD_ALL (AMMO_BOX_MULTILOAD_IN | AMMO_BOX_MULTILOAD_OUT | AMMO_BOX_MULTILOAD_OUT_LOADED) DEFINE_BITFIELD(ammo_box_multiload, list( "LOAD_IN" = AMMO_BOX_MULTILOAD_IN, "LOAD_OUT" = AMMO_BOX_MULTILOAD_OUT, + "LOAD_OUT_LOADED" = AMMO_BOX_MULTILOAD_OUT_LOADED, )) #define SUPPRESSED_NONE 0 diff --git a/code/__HELPERS/type_processing.dm b/code/__HELPERS/type_processing.dm index 40f21f4b189..180079cf65a 100644 --- a/code/__HELPERS/type_processing.dm +++ b/code/__HELPERS/type_processing.dm @@ -29,6 +29,9 @@ /obj/item/organ = "ORGAN", /obj/item/mod/control = "MODSUIT", /obj/item/mod/module = "MODSUIT_MOD", + /obj/item/ammo_box = "AMMOBOX", + /obj/item/ammo_box/magazine = "AMMOBOX_MAGAZINE", + /obj/item/ammo_box/speedloader = "AMMOBOX_SPEEDLOADER", /obj/item/gun = "GUN", /obj/item/gun/magic = "GUN_MAGIC", /obj/item/gun/energy = "GUN_ENERGY", diff --git a/code/datums/storage/subtypes/belts.dm b/code/datums/storage/subtypes/belts.dm index 37b47169c28..3f3470a0e4c 100644 --- a/code/datums/storage/subtypes/belts.dm +++ b/code/datums/storage/subtypes/belts.dm @@ -323,7 +323,7 @@ /datum/storage/unfathomable_curio/New(atom/parent, max_slots, max_specific_storage, max_total_storage, rustle_sound, remove_rustle_sound) . = ..() set_holdable(list( - /obj/item/ammo_box/strilka310/lionhunter, + /obj/item/ammo_box/speedloader/strilka310/lionhunter, /obj/item/heretic_labyrinth_handbook, /obj/item/bodypart, // Bodyparts are often used in rituals. /obj/item/clothing/neck/eldritch_amulet, diff --git a/code/datums/storage/subtypes/holsters.dm b/code/datums/storage/subtypes/holsters.dm index b3a3189f9ad..e82007fea71 100644 --- a/code/datums/storage/subtypes/holsters.dm +++ b/code/datums/storage/subtypes/holsters.dm @@ -55,9 +55,7 @@ /obj/item/ammo_box/magazine/m45, /obj/item/ammo_box/magazine/m50, /obj/item/gun/ballistic/revolver, - /obj/item/ammo_box/c38, // Revolver speedloaders. - /obj/item/ammo_box/a357, - /obj/item/ammo_box/strilka310, + /obj/item/ammo_box/speedloader, // Speedloaders, which includes stripper clips on a technicality. /obj/item/ammo_box/magazine/toy/pistol, /obj/item/gun/energy/e_gun/mini, /obj/item/gun/energy/disabler, @@ -84,9 +82,7 @@ /obj/item/ammo_box/magazine/m45, /obj/item/ammo_box/magazine/m50, /obj/item/gun/ballistic/revolver, - /obj/item/ammo_box/c38, - /obj/item/ammo_box/a357, - /obj/item/ammo_box/strilka310, + /obj/item/ammo_box/speedloader, /obj/item/ammo_box/magazine/toy/pistol, /obj/item/gun/energy/recharge/ebow, /obj/item/gun/energy/e_gun/mini, @@ -107,9 +103,7 @@ holdables = list( /obj/item/gun, // ALL guns. /obj/item/ammo_box/magazine, // ALL magazines. - /obj/item/ammo_box/c38, //There isn't a speedloader parent type, so I just put these three here by hand. - /obj/item/ammo_box/a357, //I didn't want to just use /obj/item/ammo_box, because then this could hold huge boxes of ammo. - /obj/item/ammo_box/strilka310, + /obj/item/ammo_box/speedloader, // ALL speedloaders (there's 3 types at time of writing so it's probably fine) /obj/item/ammo_casing, // For shotgun shells, rockets, launcher grenades, and a few other things. /obj/item/grenade, // All regular grenades, the big grenade launcher fires these. ) diff --git a/code/datums/storage/subtypes/pockets.dm b/code/datums/storage/subtypes/pockets.dm index 9fc26b542d1..20772274674 100644 --- a/code/datums/storage/subtypes/pockets.dm +++ b/code/datums/storage/subtypes/pockets.dm @@ -213,7 +213,7 @@ /obj/item/reagent_containers/cup/glass/bottle/vodka, /obj/item/reagent_containers/cup/glass/bottle/molotov, /obj/item/reagent_containers/cup/glass/drinkingglass, - /obj/item/ammo_box/strilka310 + /obj/item/ammo_box/speedloader/strilka310 )) ///Void cloak pocket @@ -231,7 +231,7 @@ . = ..() set_holdable( can_hold_list = list( - /obj/item/ammo_box/strilka310/lionhunter, + /obj/item/ammo_box/speedloader/strilka310/lionhunter, /obj/item/bodypart, // Bodyparts are often used in rituals. They're also often normal sized, so you can only fit one. /obj/item/clothing/neck/eldritch_amulet, /obj/item/clothing/neck/heretic_focus, diff --git a/code/game/objects/effects/spawners/random/russian_rifle_spawner.dm b/code/game/objects/effects/spawners/random/russian_rifle_spawner.dm index 84b19f59ee0..bebdab726b0 100644 --- a/code/game/objects/effects/spawners/random/russian_rifle_spawner.dm +++ b/code/game/objects/effects/spawners/random/russian_rifle_spawner.dm @@ -10,7 +10,7 @@ /obj/effect/spawner/random/sakhno/ammo name = ".310 Strilka stripper clip spawner" loot = list( - /obj/item/ammo_box/strilka310/surplus = 80, - /obj/item/ammo_box/strilka310 = 10, + /obj/item/ammo_box/speedloader/strilka310/surplus = 80, + /obj/item/ammo_box/speedloader/strilka310 = 10, /obj/item/food/rationpack = 1, ) diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm index 6461a76d040..379d8b1c3bf 100644 --- a/code/game/objects/items/storage/holsters.dm +++ b/code/game/objects/items/storage/holsters.dm @@ -57,7 +57,7 @@ /obj/item/storage/belt/holster/detective/full/PopulateContents() generate_items_inside(list( - /obj/item/ammo_box/c38 = 2, + /obj/item/ammo_box/speedloader/c38 = 2, /obj/item/gun/ballistic/revolver/c38/detective = 1, ), src) @@ -99,7 +99,7 @@ /obj/item/storage/belt/holster/nukie/cowboy/full/PopulateContents() generate_items_inside(list( - /obj/item/ammo_box/a357 = 2, + /obj/item/ammo_box/speedloader/c357 = 2, /obj/item/gun/ballistic/revolver/cowboy/nuclear = 1, ), src) diff --git a/code/game/objects/items/storage/toolboxes/weapons.dm b/code/game/objects/items/storage/toolboxes/weapons.dm index a16e4b9cfbf..b1e13ba58b5 100644 --- a/code/game/objects/items/storage/toolboxes/weapons.dm +++ b/code/game/objects/items/storage/toolboxes/weapons.dm @@ -39,10 +39,10 @@ name = ".310 Strilka ammo box (Surplus?)" desc = "It contains a few clips. Goddamn, this thing smells awful. \ Has this been sitting in a warehouse for the last several centuries?" - ammo_to_spawn = /obj/item/ammo_box/strilka310 + ammo_to_spawn = /obj/item/ammo_box/speedloader/strilka310 /obj/item/storage/toolbox/ammobox/strilka310/surplus - ammo_to_spawn = /obj/item/ammo_box/strilka310/surplus + ammo_to_spawn = /obj/item/ammo_box/speedloader/strilka310/surplus /obj/item/storage/toolbox/ammobox/wt550m9 name = "4.6x30mm ammo box" @@ -196,7 +196,7 @@ /obj/item/storage/toolbox/guncase/revolver name = "revolver gun case" weapon_to_spawn = /obj/item/gun/ballistic/revolver/badass/nuclear - extra_to_spawn = /obj/item/ammo_box/a357 + extra_to_spawn = /obj/item/ammo_box/speedloader/c357 /obj/item/storage/toolbox/guncase/sword_and_board name = "energy sword and shield weapon case" diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 709f3e190b3..53548989384 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -79,8 +79,8 @@ if(KIT_GUN) new /obj/item/gun/ballistic/revolver(src) // 13 tc - new /obj/item/ammo_box/a357(src) // 4tc - new /obj/item/ammo_box/a357(src) + new /obj/item/ammo_box/speedloader/c357(src) // 4tc + new /obj/item/ammo_box/speedloader/c357(src) new /obj/item/storage/belt/holster/chameleon(src) // 1 tc new /obj/item/card/emag/doorjack(src) // 3 tc replaced the emag with the doorjack new /obj/item/grenade/c4(src) // 1 tc diff --git a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm index a0a811fc6c8..c82d4230b0a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm @@ -14,8 +14,8 @@ new /obj/item/ammo_box/magazine/m50(src) new /obj/item/gun/ballistic/automatic/pistol/deagle(src) else - new /obj/item/ammo_box/a357(src) - new /obj/item/ammo_box/a357(src) + new /obj/item/ammo_box/speedloader/c357(src) + new /obj/item/ammo_box/speedloader/c357(src) new /obj/item/gun/ballistic/revolver/mateba(src) /obj/structure/closet/secure_closet/ert_com/populate_contents_immediate() diff --git a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm index 422c576ed9e..65e22b1ed6c 100644 --- a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm +++ b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm @@ -42,7 +42,7 @@ gloves = /obj/item/clothing/gloves/tackler/combat head = /obj/item/clothing/head/helmet/alt shoes = /obj/item/clothing/shoes/russian - l_pocket = /obj/item/ammo_box/strilka310 + l_pocket = /obj/item/ammo_box/speedloader/strilka310 r_pocket = /obj/item/restraints/handcuffs/cable/zipties id = /obj/item/card/id/advanced/bountyhunter diff --git a/code/modules/antagonists/heretic/items/hunter_rifle.dm b/code/modules/antagonists/heretic/items/hunter_rifle.dm index 43f55b8b77f..b328c3215fc 100644 --- a/code/modules/antagonists/heretic/items/hunter_rifle.dm +++ b/code/modules/antagonists/heretic/items/hunter_rifle.dm @@ -174,10 +174,10 @@ return ..() // Extra ammunition can be made with a heretic ritual. -/obj/item/ammo_box/strilka310/lionhunter +/obj/item/ammo_box/speedloader/strilka310/lionhunter name = "stripper clip (.310 hunter)" desc = "A stripper clip of mysterious, atypical ammo. It doesn't fit into normal ballistic rifles." - icon_state = "310_strip" + icon_state = "lionhunter_strip" ammo_type = /obj/item/ammo_casing/strilka310/lionhunter max_ammo = 3 multiple_sprites = AMMO_BOX_PER_BULLET diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm index 814e8522cdd..8f9a595859f 100644 --- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm +++ b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm @@ -79,7 +79,7 @@ required_atoms = list( /obj/item/ammo_casing = 3, ) - result_atoms = list(/obj/item/ammo_box/strilka310/lionhunter) + result_atoms = list(/obj/item/ammo_box/speedloader/strilka310/lionhunter) cost = 0 research_tree_icon_path = 'icons/obj/weapons/guns/ammo.dmi' diff --git a/code/modules/bitrunning/outfits.dm b/code/modules/bitrunning/outfits.dm index 0da85853f51..f17d02903ec 100644 --- a/code/modules/bitrunning/outfits.dm +++ b/code/modules/bitrunning/outfits.dm @@ -43,7 +43,7 @@ /// Corresponding ammo var/list/corresponding_ammo = list( /obj/item/ammo_box/magazine/m9mm, - /obj/item/ammo_box/strilka310, + /obj/item/ammo_box/speedloader/strilka310, /obj/item/ammo_box/magazine/uzim9mm, /obj/item/ammo_box/magazine/m50, /obj/item/food/pizzaslice/dank, // more silly, less destructive diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index a19a544e22d..4e05e97b3fa 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -17,21 +17,21 @@ desc = "Contains one speedloader of .38 DumDum ammunition, good for embedding in soft targets." cost = PAYCHECK_CREW * 2 access_view = ACCESS_WEAPONS - contains = list(/obj/item/ammo_box/c38/dumdum) + contains = list(/obj/item/ammo_box/speedloader/c38/dumdum) /datum/supply_pack/goody/match38 name = ".38 Match Grade Speedloader Single-Pack" desc = "Contains one speedloader of match grade .38 ammunition, perfect for showing off trickshots." cost = PAYCHECK_CREW * 2 access_view = ACCESS_WEAPONS - contains = list(/obj/item/ammo_box/c38/match) + contains = list(/obj/item/ammo_box/speedloader/c38/match) /datum/supply_pack/goody/rubber name = ".38 Rubber Speedloader Single-Pack" desc = "Contains one speedloader of bouncy rubber .38 ammunition, for when you want to bounce your shots off anything and everything." cost = PAYCHECK_CREW * 1.5 access_view = ACCESS_WEAPONS - contains = list(/obj/item/ammo_box/c38/match/bouncy) + contains = list(/obj/item/ammo_box/speedloader/c38/match/bouncy) /datum/supply_pack/goody/dumdum38br name = ".38 DumDum Magazine Single-Pack" diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm index ccbca24f818..d98d1b2ee11 100644 --- a/code/modules/cargo/packs/imports.dm +++ b/code/modules/cargo/packs/imports.dm @@ -224,8 +224,8 @@ cost = CARGO_CRATE_VALUE * 12 contains = list( /obj/item/food/rationpack, - /obj/item/ammo_box/strilka310, - /obj/item/ammo_box/strilka310/surplus, + /obj/item/ammo_box/speedloader/strilka310, + /obj/item/ammo_box/speedloader/strilka310/surplus, /obj/effect/spawner/random/armory/strilka, /obj/item/gun_maintenance_supplies, /obj/item/clothing/suit/armor/vest/russian, diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index 409c746aad5..41942e1ba47 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -11,9 +11,9 @@ access_view = ACCESS_ARMORY contains = list(/obj/item/storage/box/beanbag = 3, /obj/item/storage/box/rubbershot = 3, - /obj/item/ammo_box/c38/trac, - /obj/item/ammo_box/c38/hotshot, - /obj/item/ammo_box/c38/iceblox, + /obj/item/ammo_box/speedloader/c38/trac, + /obj/item/ammo_box/speedloader/c38/hotshot, + /obj/item/ammo_box/speedloader/c38/iceblox, ) crate_name = "ammo crate" @@ -321,7 +321,7 @@ desc = "Contains four tracking implants and three tracking speedloaders of tracing .38 ammo." cost = CARGO_CRATE_VALUE * 4.5 contains = list(/obj/item/storage/box/trackimp, - /obj/item/ammo_box/c38/trac = 3, + /obj/item/ammo_box/speedloader/c38/trac = 3, ) crate_name = "tracking implant crate" diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index f6774e9b2aa..62655f3153c 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -304,8 +304,8 @@ glasses = /obj/item/clothing/glasses/sunglasses gloves = /obj/item/clothing/gloves/color/black shoes = /obj/item/clothing/shoes/sneakers/black - l_pocket = /obj/item/ammo_box/strilka310 - r_pocket = /obj/item/ammo_box/strilka310 + l_pocket = /obj/item/ammo_box/speedloader/strilka310 + r_pocket = /obj/item/ammo_box/speedloader/strilka310 l_hand = /obj/item/gun/ballistic/rifle/boltaction /datum/outfit/centcom/centcom_intern/post_equip(mob/living/carbon/human/H, visuals_only = FALSE) @@ -434,7 +434,7 @@ back = /obj/item/mod/control/pre_equipped/apocryphal box = /obj/item/storage/box/survival/centcom backpack_contents = list( - /obj/item/ammo_box/a357 = 1, + /obj/item/ammo_box/speedloader/c357 = 1, /obj/item/flashlight = 1, /obj/item/grenade/c4/x4 = 1, /obj/item/storage/box/flashbangs = 1, diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 2aa79e3706b..2730af4c636 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -221,7 +221,7 @@ sec_briefcase.contents += new /obj/item/stack/spacecash/c1000 sec_briefcase.contents += new /obj/item/gun/energy/recharge/ebow sec_briefcase.contents += new /obj/item/gun/ballistic/revolver/mateba - sec_briefcase.contents += new /obj/item/ammo_box/a357 + sec_briefcase.contents += new /obj/item/ammo_box/speedloader/c357 sec_briefcase.contents += new /obj/item/grenade/c4/x4 var/obj/item/modular_computer/pda/heads/pda = H.belt @@ -247,7 +247,7 @@ head = /obj/item/clothing/head/hats/centhat mask = /obj/item/cigarette/cigar/cohiba shoes = /obj/item/clothing/shoes/combat/swat - l_pocket = /obj/item/ammo_box/a357 + l_pocket = /obj/item/ammo_box/speedloader/c357 r_pocket = /obj/item/lighter /datum/outfit/centcom/commander/post_equip(mob/living/carbon/human/H, visuals_only = FALSE) diff --git a/code/modules/deathmatch/deathmatch_loadouts.dm b/code/modules/deathmatch/deathmatch_loadouts.dm index 32d66ba3831..bc27f6b0282 100644 --- a/code/modules/deathmatch/deathmatch_loadouts.dm +++ b/code/modules/deathmatch/deathmatch_loadouts.dm @@ -176,7 +176,7 @@ backpack_contents = list( /obj/item/grenade/smokebomb = 2, - /obj/item/ammo_box/strilka310 = 2, + /obj/item/ammo_box/speedloader/strilka310 = 2, ) /datum/outfit/deathmatch_loadout/battler/druid @@ -1071,8 +1071,8 @@ belt = /obj/item/storage/belt/unfathomable_curio gloves = null shoes = /obj/item/clothing/shoes/winterboots/ice_boots - l_pocket = /obj/item/ammo_box/strilka310/lionhunter - r_pocket = /obj/item/ammo_box/strilka310/lionhunter + l_pocket = /obj/item/ammo_box/speedloader/strilka310/lionhunter + r_pocket = /obj/item/ammo_box/speedloader/strilka310/lionhunter back = /obj/item/gun/ballistic/rifle/lionhunter // for his neutral b, he wields a gun diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index 31307efcde1..cb987f0cc91 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -29,12 +29,12 @@ mail_goodies = list( /obj/item/storage/fancy/cigarettes = 25, - /obj/item/ammo_box/c38 = 20, - /obj/item/ammo_box/c38/dumdum = 5, - /obj/item/ammo_box/c38/hotshot = 5, - /obj/item/ammo_box/c38/iceblox = 5, - /obj/item/ammo_box/c38/match = 5, - /obj/item/ammo_box/c38/trac = 5, + /obj/item/ammo_box/speedloader/c38 = 20, + /obj/item/ammo_box/speedloader/c38/dumdum = 5, + /obj/item/ammo_box/speedloader/c38/hotshot = 5, + /obj/item/ammo_box/speedloader/c38/iceblox = 5, + /obj/item/ammo_box/speedloader/c38/match = 5, + /obj/item/ammo_box/speedloader/c38/trac = 5, /obj/item/card/id/advanced/plainclothes = 5, /obj/item/storage/belt/holster/detective/full = 1, ) diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index 13a3496c609..2cf5997d32b 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -47,10 +47,10 @@ . = ..() if(check_holidays(GARBAGEDAY)) backpack_contents += list(/obj/item/gun/ballistic/revolver) - r_pocket = /obj/item/ammo_box/a357 + r_pocket = /obj/item/ammo_box/speedloader/c357 /datum/outfit/job/janitor/get_types_to_preload() . = ..() if(check_holidays(GARBAGEDAY)) . += /obj/item/gun/ballistic/revolver - . += /obj/item/ammo_box/a357 + . += /obj/item/ammo_box/speedloader/c357 diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index f708ec04f6c..f5c123866b3 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -30,7 +30,7 @@ var/multiple_sprite_use_base = FALSE ///String, used for checking if ammo of different types but still fits can fit inside it; generally used for magazines var/caliber - /// Determines whether ammo boxes can multiload in or out. + /// Determines whether ammo boxes can multiload in or out. See code/__DEFINES/combat.dm for details. var/ammo_box_multiload = AMMO_BOX_MULTILOAD_BOTH ///Whether the magazine should start with nothing in it @@ -189,7 +189,17 @@ if(did_load) other_box.stored_ammo -= casing num_loaded++ - if(!did_load || !(ammo_box_multiload & AMMO_BOX_MULTILOAD_IN) || !(other_box.ammo_box_multiload & AMMO_BOX_MULTILOAD_OUT)) + // failed to load (full already? ran out of ammo?) + if(!did_load) + break + // this box can't accept being multiloaded into + if(!(ammo_box_multiload & AMMO_BOX_MULTILOAD_IN)) + break + // the other box can't give multiple bullets in one go to an unloaded magazine + if(!isgun(loc) && !(other_box.ammo_box_multiload & AMMO_BOX_MULTILOAD_OUT)) + break + // the other box can't give multiple bullets in one go to a loaded magazine + if(isgun(loc) && !(other_box.ammo_box_multiload & AMMO_BOX_MULTILOAD_OUT_LOADED)) break if(num_loaded) diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index 42e0ee45e88..4d099d7f34f 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -1,108 +1,3 @@ -/obj/item/ammo_box/a357 - name = "speed loader (.357)" - desc = "Designed to quickly reload revolvers." - icon_state = "357" - ammo_type = /obj/item/ammo_casing/c357 - max_ammo = 7 - caliber = CALIBER_357 - multiple_sprites = AMMO_BOX_PER_BULLET - item_flags = NO_MAT_REDEMPTION - ammo_band_icon = "+357_ammo_band" - ammo_band_color = null - -/obj/item/ammo_box/a357/match - name = "speed loader (.357 Match)" - desc = "Designed to quickly reload revolvers. These rounds are manufactured within extremely tight tolerances, making them easy to show off trickshots with." - ammo_type = /obj/item/ammo_casing/c357/match - ammo_band_color = "#77828a" - -/obj/item/ammo_box/a357/phasic - name = "speed loader (.357 Phasic)" - desc = "Designed to quickly reload revolvers. Holds phasic ammo, also known as 'Ghost Lead', allowing it to pass through non-organic material." - ammo_type = /obj/item/ammo_casing/c357/phasic - ammo_band_color = "#693a6a" - -/obj/item/ammo_box/a357/heartseeker - name = "speed loader (.357 Heartseeker)" - desc = "Designed to quickly reload revolvers. Holds heartseeker ammo, which veers into targets with exceptional precision using \ - an unknown method. It apparently predicts movement using neural pulses in the brain, but that's less marketable. \ - As seen in the hit NTFlik horror-space western film, Forget-Me-Not! Brought to you by Roseus Galactic!" - ammo_type = /obj/item/ammo_casing/c357/heartseeker - ammo_band_color = "#a91e1e" - -/obj/item/ammo_box/c38 - name = "speed loader (.38)" - desc = "Designed to quickly reload revolvers." - icon_state = "38" - base_icon_state = "38" - ammo_type = /obj/item/ammo_casing/c38 - max_ammo = 6 - caliber = CALIBER_38 - multiple_sprites = AMMO_BOX_PER_BULLET - custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) - ammo_band_icon = "+38_ammo_band" - ammo_band_color = null - -/obj/item/ammo_box/c38/update_icon_state() - . = ..() - icon_state = "[base_icon_state]-base" - -/obj/item/ammo_box/c38/update_overlays() - . = ..() - if(!LAZYLEN(stored_ammo)) - return - for(var/inserted_ammo in 1 to stored_ammo.len) - var/obj/item/ammo_casing/c38/boolet = stored_ammo[inserted_ammo] - . += "38-[boolet::lead_or_laser]-[inserted_ammo]" - -/obj/item/ammo_box/c38/trac - name = "speed loader (.38 TRAC)" - desc = "Designed to quickly reload revolvers. TRAC bullets embed a tracking implant within the target's body." - ammo_type = /obj/item/ammo_casing/c38/trac - ammo_band_color = COLOR_AMMO_TRACK - -/obj/item/ammo_box/c38/match - name = "speed loader (.38 Match)" - desc = "Designed to quickly reload revolvers. These rounds are manufactured within extremely tight tolerances, making them easy to show off trickshots with." - ammo_type = /obj/item/ammo_casing/c38/match - ammo_band_color = COLOR_AMMO_MATCH - -/obj/item/ammo_box/c38/match/bouncy - name = "speed loader (.38 Rubber)" - desc = "Designed to quickly reload revolvers. These rounds are incredibly bouncy and MOSTLY nonlethal, making them great to show off trickshots with." - ammo_type = /obj/item/ammo_casing/c38/match/bouncy - ammo_band_color = COLOR_AMMO_RUBBER - -/obj/item/ammo_box/c38/true - name = "speed loader (.38 True Strike)" - desc = "Designed to quickly reload revolvers. Bullets bounce towards new targets with surprising accuracy." - ammo_type = /obj/item/ammo_casing/c38/match/true - ammo_band_color = COLOR_AMMO_TRUESTRIKE - -/obj/item/ammo_box/c38/dumdum - name = "speed loader (.38 DumDum)" - desc = "Designed to quickly reload revolvers. These rounds expand on impact, allowing them to shred the target and cause massive bleeding. Very weak against armor and distant targets." - ammo_type = /obj/item/ammo_casing/c38/dumdum - ammo_band_color = COLOR_AMMO_DUMDUM - -/obj/item/ammo_box/c38/hotshot - name = "speed loader (.38 Hot Shot)" - desc = "Designed to quickly reload revolvers. Hot Shot bullets contain an incendiary payload." - ammo_type = /obj/item/ammo_casing/c38/hotshot - ammo_band_color = COLOR_AMMO_HOTSHOT - -/obj/item/ammo_box/c38/iceblox - name = "speed loader (.38 Iceblox)" - desc = "Designed to quickly reload revolvers. Iceblox bullets contain a cryogenic payload." - ammo_type = /obj/item/ammo_casing/c38/iceblox - ammo_band_color = COLOR_AMMO_ICEBLOX - -/obj/item/ammo_box/c38/flare - name = "speed loader (.38 Flare)" - desc = "Designed to quickly reload revolvers. Flare casings launch a concentrated particle beam towards a target, lighting them up for everyone to see." - ammo_type = /obj/item/ammo_casing/c38/flare - ammo_band_color = COLOR_AMMO_HELLFIRE - /obj/item/ammo_box/c9mm name = "ammo box (9mm)" icon_state = "9mmbox" @@ -142,25 +37,6 @@ /obj/item/ammo_box/rocket/can_load(mob/user) return FALSE -/obj/item/ammo_box/strilka310 - name = "stripper clip (.310 Strilka)" - desc = "A stripper clip." - icon_state = "310_strip" - ammo_type = /obj/item/ammo_casing/strilka310 - max_ammo = 5 - caliber = CALIBER_STRILKA310 - multiple_sprites = AMMO_BOX_PER_BULLET - -/obj/item/ammo_box/strilka310/surplus - name = "stripper clip (.310 Surplus)" - ammo_type = /obj/item/ammo_casing/strilka310/surplus - -/obj/item/ammo_box/strilka310/phasic - name = "stripper clip (.310 Phasic)" - desc = "A stripper clip filled with phasic bullets, hastily developed after an incident where a misfire resulted in the destruction of Atrakor Silverscale's priceless Vigoxian Fabergé egg. \ - These fancy bullets pass right though valuables until they end up in a far less expensive human skull." - ammo_type = /obj/item/ammo_casing/strilka310/phasic - /obj/item/ammo_box/n762 name = "ammo box (7.62x38mmR)" icon_state = "10mmbox" diff --git a/code/modules/projectiles/boxes_magazines/speedloaders.dm b/code/modules/projectiles/boxes_magazines/speedloaders.dm new file mode 100644 index 00000000000..0fe437f05b9 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/speedloaders.dm @@ -0,0 +1,134 @@ +/obj/item/ammo_box/speedloader + name = "speed loader (base type)" + desc = "This shouldn't be here. Report this to a coder, thanks!" + multiple_sprites = AMMO_BOX_PER_BULLET + ammo_box_multiload = (AMMO_BOX_MULTILOAD_IN | AMMO_BOX_MULTILOAD_OUT_LOADED) + // You can feed ammo in from a box (assuming someone ever codes a relevant ammo box), + // you can feed ammo out to a revolver's cylinder, + // but you can't use it to teleport six bullets into a detached rifle magazine. + +/obj/item/ammo_box/speedloader/c357 + name = "speed loader (.357)" + desc = "Designed to quickly reload seven-chamber .357 revolvers." + icon_state = "357" + ammo_type = /obj/item/ammo_casing/c357 + max_ammo = 7 + caliber = CALIBER_357 + item_flags = NO_MAT_REDEMPTION + ammo_band_icon = "+357_ammo_band" + ammo_band_color = null + +/obj/item/ammo_box/speedloader/c357/match + name = "speed loader (.357 Match)" + desc = parent_type::desc + " Match rounds are manufactured within extremely tight tolerances, making them easy to show off trickshots with." + ammo_type = /obj/item/ammo_casing/c357/match + ammo_band_color = "#77828a" + +/obj/item/ammo_box/speedloader/c357/phasic + name = "speed loader (.357 Phasic)" + desc = parent_type::desc + " Phasic rounds, also known as 'Ghost Lead', are specially manufactured to pass through non-organic material. Somehow." + ammo_type = /obj/item/ammo_casing/c357/phasic + ammo_band_color = "#693a6a" + +/obj/item/ammo_box/speedloader/c357/heartseeker + name = "speed loader (.357 Heartseeker)" + desc = parent_type::desc + " Heartseeker rounds veer into targets with exceptional precision using an unknown method. \ + It apparently predicts movement using neural pulses in the brain, but that's less marketable. \ + As seen in the hit NTFlik horror-space western film, Forget-Me-Not, brought to you by Roseus Galactic!" + ammo_type = /obj/item/ammo_casing/c357/heartseeker + ammo_band_color = "#a91e1e" + +/obj/item/ammo_box/speedloader/c38 + name = "speed loader (.38)" + desc = "Designed to quickly reload six-chamber .38 Special revolvers." + icon_state = "38" + base_icon_state = "38" + ammo_type = /obj/item/ammo_casing/c38 + max_ammo = 6 + caliber = CALIBER_38 + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) + ammo_band_icon = "+38_ammo_band" + ammo_band_color = null + +/obj/item/ammo_box/speedloader/c38/update_icon_state() + . = ..() + icon_state = "[base_icon_state]-base" + +/obj/item/ammo_box/speedloader/c38/update_overlays() + . = ..() + if(!LAZYLEN(stored_ammo)) + return + for(var/inserted_ammo in 1 to stored_ammo.len) + var/obj/item/ammo_casing/c38/boolet = stored_ammo[inserted_ammo] + . += "38-[boolet::lead_or_laser]-[inserted_ammo]" + +/obj/item/ammo_box/speedloader/c38/trac + name = "speed loader (.38 TRAC)" + desc = parent_type::desc + " TRAC bullets embed a tracking implant within the target's body." + ammo_type = /obj/item/ammo_casing/c38/trac + ammo_band_color = COLOR_AMMO_TRACK + +/obj/item/ammo_box/speedloader/c38/match + name = "speed loader (.38 Match)" + desc = parent_type::desc + " Match bullets are manufactured within extremely tight tolerances, making them easy to show off trickshots with." + ammo_type = /obj/item/ammo_casing/c38/match + ammo_band_color = COLOR_AMMO_MATCH + +/obj/item/ammo_box/speedloader/c38/match/bouncy + name = "speed loader (.38 Rubber)" + desc = parent_type::desc + " Rubber rounds are incredibly bouncy and MOSTLY less-lethal, making them great to show off trickshots with." + ammo_type = /obj/item/ammo_casing/c38/match/bouncy + ammo_band_color = COLOR_AMMO_RUBBER + +/obj/item/ammo_box/speedloader/c38/true + name = "speed loader (.38 True Strike)" + desc = parent_type::desc + " True Strike bullets bounce towards new targets with surprising accuracy after ricocheting." + ammo_type = /obj/item/ammo_casing/c38/match/true + ammo_band_color = COLOR_AMMO_TRUESTRIKE + +/obj/item/ammo_box/speedloader/c38/dumdum + name = "speed loader (.38 DumDum)" + desc = parent_type::desc + " DumDum bullets expand on impact, reducing outright stopping power but \ + shredding targets and causing massive bleeding in close range, \ + at the cost of suffering greatly against armor and distant targets." + ammo_type = /obj/item/ammo_casing/c38/dumdum + ammo_band_color = COLOR_AMMO_DUMDUM + +/obj/item/ammo_box/speedloader/c38/hotshot + name = "speed loader (.38 Hot Shot)" + desc = parent_type::desc + " Hot Shot bullets contain an incendiary payload that ignites struck targets." + ammo_type = /obj/item/ammo_casing/c38/hotshot + ammo_band_color = COLOR_AMMO_HOTSHOT + +/obj/item/ammo_box/speedloader/c38/iceblox + name = "speed loader (.38 Iceblox)" + desc = parent_type::desc + " Iceblox bullets contain a cryogenic payload that lower the body temperature of struck targets." + ammo_type = /obj/item/ammo_casing/c38/iceblox + ammo_band_color = COLOR_AMMO_ICEBLOX + +/obj/item/ammo_box/speedloader/c38/flare + name = "speed loader (.38 Flare)" + desc = parent_type::desc + " Flare casings launch a concentrated particle beam towards a target, lighting them up for everyone to see." + ammo_type = /obj/item/ammo_casing/c38/flare + ammo_band_color = COLOR_AMMO_HELLFIRE + +/obj/item/ammo_box/speedloader/strilka310 + name = "stripper clip (.310 Strilka)" + desc = "A five-round stripper clip for .310 Strilka rifles." + icon_state = "310_strip" + ammo_type = /obj/item/ammo_casing/strilka310 + max_ammo = 5 + ammo_box_multiload = AMMO_BOX_MULTILOAD_ALL + caliber = CALIBER_STRILKA310 + +/obj/item/ammo_box/speedloader/strilka310/surplus + name = "stripper clip (.310 Surplus)" + desc = parent_type::desc + " This one has a few spots of rust where there's not excessive amounts of gun grease." + ammo_type = /obj/item/ammo_casing/strilka310/surplus + +/obj/item/ammo_box/speedloader/strilka310/phasic + name = "stripper clip (.310 Phasic)" + desc = parent_type::desc + " These should come with phasic bullets, \ + hastily developed after an incident where a misfire resulted in the destruction of Atrakor Silverscale's priceless Vigoxian Fabergé egg. \ + These fancy bullets pass right though valuables until they end up in a far less expensive human skull." + ammo_type = /obj/item/ammo_casing/strilka310/phasic diff --git a/code/modules/research/designs/autolathe/security_designs.dm b/code/modules/research/designs/autolathe/security_designs.dm index 4115a33f424..c6a96542ef3 100644 --- a/code/modules/research/designs/autolathe/security_designs.dm +++ b/code/modules/research/designs/autolathe/security_designs.dm @@ -27,7 +27,7 @@ id = "c38" build_type = AUTOLATHE materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*3) - build_path = /obj/item/ammo_box/c38 + build_path = /obj/item/ammo_box/speedloader/c38 category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index d0a54cb7d4a..66f550b9055 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -21,7 +21,7 @@ /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, ) - build_path = /obj/item/ammo_box/c38/trac + build_path = /obj/item/ammo_box/speedloader/c38/trac category = list( RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO ) @@ -36,7 +36,7 @@ /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 3, /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT * 1.5, ) - build_path = /obj/item/ammo_box/c38/hotshot + build_path = /obj/item/ammo_box/speedloader/c38/hotshot category = list( RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO ) @@ -51,7 +51,7 @@ /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 3, /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT * 1.5, ) - build_path = /obj/item/ammo_box/c38/iceblox + build_path = /obj/item/ammo_box/speedloader/c38/iceblox category = list( RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO ) @@ -63,7 +63,7 @@ id = "c38_rubber" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 3) - build_path = /obj/item/ammo_box/c38/match/bouncy + build_path = /obj/item/ammo_box/speedloader/c38/match/bouncy category = list( RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO ) @@ -78,7 +78,7 @@ /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 3, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT * 1.5, ) - build_path = /obj/item/ammo_box/c38/true + build_path = /obj/item/ammo_box/speedloader/c38/true category = list( RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO ) @@ -94,7 +94,7 @@ /datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, ) - build_path = /obj/item/ammo_box/c38/flare + build_path = /obj/item/ammo_box/speedloader/c38/flare category = list( RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO ) diff --git a/code/modules/uplink/uplink_items/ammunition.dm b/code/modules/uplink/uplink_items/ammunition.dm index 7000fb7e9a7..63853d55745 100644 --- a/code/modules/uplink/uplink_items/ammunition.dm +++ b/code/modules/uplink/uplink_items/ammunition.dm @@ -51,7 +51,7 @@ name = ".357 Speed Loader" desc = "A speed loader that contains seven additional .357 Magnum rounds; usable with the Syndicate revolver. \ For when you really need a lot of things dead." - item = /obj/item/ammo_box/a357 + item = /obj/item/ammo_box/speedloader/c357 cost = 4 purchasable_from = ~(UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) //nukies get their own version uplink_item_flags = SYNDIE_TRIPS_CONTRABAND diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index ed38ef0ac8e..1b83a572ddd 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -218,7 +218,7 @@ name = ".357 Speed Loader (Revolver)" desc = "A speed loader that contains seven additional .357 Magnum rounds; usable with the Syndicate revolver. \ For when you really need a lot of things dead. Unlike field agents, operatives get a premium price for their speedloaders!" - item = /obj/item/ammo_box/a357 + item = /obj/item/ammo_box/speedloader/c357 purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/special/revolver/phasic @@ -226,7 +226,7 @@ desc = "A speed loader that contains seven additional .357 Magnum phasic rounds; usable with the Syndicate revolver. \ These bullets are made from an experimental alloy, 'Ghost Lead', that allows it to pass through almost any non-organic material. \ The name is a misnomer. It doesn't contain any lead whatsoever!" - item = /obj/item/ammo_box/a357/phasic + item = /obj/item/ammo_box/speedloader/c357/phasic purchasable_from = parent_type::purchasable_from | UPLINK_SPY /datum/uplink_item/ammo_nuclear/special/revolver/heartseeker @@ -234,7 +234,7 @@ desc = "A speed loader that contains seven additional .357 Magnum heartseeker rounds; usable with the Syndicate revolver. \ Able to veer straight into targets! Don't miss a shot with heartseeker! As seen in the hit NTFlik horror-space western film, Forget-Me-Not! \ Brought to you by Roseus Galactic!" - item = /obj/item/ammo_box/a357/heartseeker + item = /obj/item/ammo_box/speedloader/c357/heartseeker cost = 3 purchasable_from = parent_type::purchasable_from | UPLINK_SPY diff --git a/icons/obj/weapons/guns/ammo.dmi b/icons/obj/weapons/guns/ammo.dmi index 37533a6cdeb49e7148087888b098976d7e362047..79250688cc415fbb6bc8152057c5b6c7d82b27f8 100644 GIT binary patch literal 31279 zcmcG#2{=^m|2KXHg~XsmWsQ6&Yf<(YNhw4^$TB2JvXq@+NJ7ezJu#M|6ryCGnJif| zmZGu@Sq2ls3~?AU&zbsuf6woFuHW@s&-45LAJ=u}IQMHp zh=13iT>t>^UpQ}g82~sUp~IPHCscAMexLvVcDxI z`i_vv$r8koi3&Id!w}YuUZKMI<0s+ z$LCEIchB_4_UEeBa{CXo_UxK{wGsT|UVn|mxiQUvtnZIociUur?P|FmoqfCU;zCTF zZ&tq$o&N1^z|T8h_`Q$(21T8o;=*XHl}T@H`e8HsCtZ?au;#XP5M z;q8Ys`-sLzYuh+J8Gj!?7VdbrycRGGv_<8K7$O-s`{FYog$w?dtkg zWK#Cv9$mlC2kvI(D?RgCd0Kj%Y9;O=v#aVvu}gZymF-B2$vYhNlaH#zKZ#6e1}9RZ zS_t1a$FB;uj5^r%n2TJQep-%*-aQ7#Rr?cJDr{21DaXJ?0)bXeBW*3 zr}|TCpKQ*SJy(7j^JvZK-IGuey9=6y2NHR*;`R#*@Fa4Rr1svAKDd>+tS?ZTt;I+5 z{8%X`D)A#;&p)_wXX3^+elbP}fB8Vd$z`U~n>uOk+6O8_4k^(JmwnIfEEkFz7Iv9Z zIO#I=S{*t=$7?m{3>~jeKxgQ9ecWa0D0IA1h0dxjoO7@H!opLc&-kRcrmF87GLV7o z8@k2`+ea`BHj1ex^clodyOeuI?(%HeJ$*Tu(>Q6Dr_kfeu+M~``Ej!MoureURuysn zNu&BpEg79sHOYLuqlU^yd`0V$36G}@IBK3i1*TA)7~cV1t^KN@cNLvCrfmruot2Ti zQtceq2_4s?Dr8QX-D)cLdiI5T;(1;j>AYH9)A7*(lV!nHs*}=Pf{Ol~%MJVeo2zX? zqQ0LCul*DwbA6Mi-na2n%$b-)znEQx^`H2f{Jv|xGU|(6DQzMch8Ug=X*5m?b*;Q} zS;p^6Pe}b+6XEUm4I{D_cJ**K9Jx?=!9DZHQBBDbdB1Bc8&V< zwo)Je-8TQR*Biva_ZLaI#opIpd)7l?f@E`(RbR~2LZjRx^A#%A)=tjBebeqj)0HciZRQO)NC7s&i9FB{8^KF_9;>%s zA${6s70lzS_@veO477Jx5917mIs-<;zL$>qp0U zYds{h2;wQv0T&EUTLnM+ zH5QJxocXA+j7rNa^m@^__vu3==gab{4e2$<-FJ=F@{{k^ohS`EJyvFxdxE^=zV5x| zVz&N$QBO|$S!$Tyre@5?z5ezkl)VdLshRbg1_iu7Xajp6aulDI=NYCO)efYpd!?$A z>z_E`spM4n#mh7uIr8)~RE6IYO(}gt=x?W%$vT&ykdRQyRmDhl!2=iA5ou}Z6TA7O z*rhJEKzv+W-0l{R^HAmWESRJB%D3f@s@1-&+YLSL2>RO09-$N=X})~!pZ6}fm#8~G z-_rdOA`o92Xz(A^$HgXBcEVfdhyu+_JXRlUb~y?!wGVnpPT`qV!-AW%__z*vM*&z8 z^H+Xfufd+bg{g;skE@8eGSAr8T}RNfiRf9ma*9?Y&*J^d9xRgi5%o<1dR7gEifBGm zdib1|P~z#qwcA|m`=B;?$?a$n-^sXNICCpWRV>&;-2L;#uBZW!@PHNhEeucd*$)Z- zr_oGFKQ6)ZV`eXBww*7tlE5B!9F7ruUjtEe%s@kTO(u@EYjR`soGgYHYM1>@sYEgv z5VmN}m^m%Bjkdfw<>xHZcZomEoO9vBgHxv4x{{fvYe{1_Z!;(C@cUg~4*`uA%%pk_z!JeNmrkBYQEhX$BFb#8sC)QheGm))qq`n;Bq^huDnx(@W=qMR3wzHb4xo7Z%x8+qS1?y5a&DCO#X`%? z^wfx3>at@j?x5kw;%Lsh_ zegKEt(w9Hcw|j!P3*owA3J#`IUoFSEaNk;~FgdfsG($zb8W_(>Ps2~1F+j2?11(*2 zy?qjulVPIG!){=yw{4Q=5E^9_Mxb53#wK35EI@T3zGuSlINB!3bf%2a- z>G*1A*_})`?OkRY08k+iYG?;iIu1ttvP|FA9) z&aYy8R&k6>nVEvkDPg>8L@}F#Sm31+=EaK_z71o*Y6h}qB)){D@t*lw5z{71P&a=G z6jz}G?E&-MIy(NeTJic3-V@O59?m3jLh7`!9if?P2K_pO_mw=u@PbqsTP zl|jO=wvD?okC@~?FJ)Zlr(;Os2-z9)C$g7}t-)V+xZa{C-=<*_ZIh_y*|x4i1uvpp zqtIBr91_0JMLbx=RjQ16vIJ(zUJ3wH{d-uPaHP~j75Q@k0VgBgtymJi8MwuU7tK2{ z|Cc+7c*Uq!Vj;hNN9Pxf1*1skWFpp3;ahQhe@$#u-#Ow;Ag|I4H=(M=trGH-nrOkkUip9|F-dUOB$Ooyw(j^$5VX8F#)Yym=+J(57%2UBd4)hLf_ zg2#?uq!qbGvcjxQF7N65V*zpLA839L%4u@*c^JnT^UGQ+yd5aYT^=i+>+tYF&>@52 z6;bPzGH5Fq0H_`Dhg|)Lhx_cML6YS@9wTn*jO+P4gH!WI-rG>6SA-qlhv5 z9f#f%w|A}DDq0}7xjHFt!Lo0PglM4WKIV;3+Rw(27|_u03$;x-5}26(orjALBDef~ zosiI)=a`5-gs0LAnY{ygFgC(I-~V4i>w*1$?rV7q2t&Yo@WGB`2zNVF|4&f)-;X|j z4m@mHPq5Mzpl4&_!N=q0ipW^-Mg@kAT54*@lQNO~Uj^kp%!LU10H4`<1!|5iZai1qnaUL>}3Q{hT{hYF26zH zow`x?>i@PspN6Wg6Dl>a)t;e5Ftf2C6byEkbMTZ#DTjP6Tz9Rg&+8!s!rJti1ma>~ z(fjv%Po6xB?d%u42IDd)3kG-!yc4b!dX;REcTdploGs0gnobcem&b|Bh7ruCLw(}eTQtS1g ztM5PKml&_f0wSmemX|Bt(K|DEHrxGu8Rjgu&eRjP1WIZJKIy0XghpWOSmK?#ZBe@0 z|5&W`%S=)<^i*|L&x~Esj0pacvLSQh3iE-vft6L>NXQvby@>Wlx~+S1k3Y9JFJ2qa zFln)&wuJ)vCMJB|b>RLH_Pczwb32GcqwsLOM!fv)v4We-05VE1s8(JSBcPo9t z+na!vxsr}J0bKZAK=p1{-MMLdEGwtH>y)x2Uk%@F5|3#q;ki%7wXK|j9GgeMh9Mwl zCM1;!qkF`*gr zH987~!d9&zm;3+-y$@?JBC}_R+N^&vkXkGa$8_-sCZ4f$v5Sl{!mYifLW6Kj2?I>f zH^qib!oy!OvMwQ1znjWii7UhQ1{nfDDxf9?K|7~r{tamjADZO2f?arkk&12+r zY3_QzUWZOstj!Ed3v88kWzt!z9eo`oiL{`pB8{I=r@WsIJEl8HBh$hBsU)N)m`Z;3 zDq_2PF?j*x*6t=Pw+$EKa1zl1q3IQ@z%*7Z90uLrOkIz)Uw>IZ|MCk>j8l&43S_z) z5?Nh-;kVA^^~Ncm?h**gbNR*a)crLgnmHnCC9#>@#@UBr0@ZZP+UVr9@BHu5Bm;k2 z1si&KDFHVXFqOT~kkMb4l`Y=wP3@wIP@W;v=_;h#FQ(qQ`-7f0ZxU!T-PMiEmRQU_ zau+i4Z87gzJX02MUPm(DTtD>7iM2aQAl`S9hWTo3fXazu8zQ7|s zV}8P$NlYWWRhP$TvvJT7GAfrWn9t`@g7g<9QCE#3#04dixa()}(@4Cm8Pc9FSB6AO z@)oE2e9kb1bV!%$O(_F*sfsDLrWI*;E=9I)nPwC^ClNBNO`}96Q$u%tA+j7*mf+u4#omBWf@GTA!5-LS9yI%xs4?czSnRn)c>lhz`x*R*8{gz4);(cLB+_l%KbJ<0u@cKZOX3D zY%=#W8GeFdH-}x062i=s=X+yBje+VUsZ;(h=l%62fJ~Ulos;rVFaN zJ#Vv4XuG$APc?!Oth-F$>|)!0c?E@*juaUSOUvl0s;XX{F~LA87kg=ulcNG|Gna{| z&4J8jq){epRt=evwwG|ur%3)zro3d73-r={$a2h~-aN+G+lwAkP=Eo@hz1`~|G;GC z);PDEmH6WQ=Hhqtz)Y0AJzrA$o*xIl*X}VM1|g`w*ip0jr3W+dco@l<|86(5l+`KB zBEjjFmjTg3honXg81lp@x7dQlICXV(=kL3D#J~601 z84oZu1qCpZ#Jw(I5eQw#^LUu69|TrcR|A5|QD!BB8NylR5QNX>B*XnBmIZXxuwGtCscmzOVgaobIutCf8V;4Awo`{VO?XJl{c!H40i0Phr zsPT_1=s8@z_=KvnoBPshU6is&IuTkpb=PdINvco^^u@EV+293?pnnYK&usU+sFB47 z!<4gU&T#JHi3c7LwfyMJ8h{1}MGN5pMJe*}+pxG56pmADb(g~hk#Zf>%WLe-B-5P9@< z!7=gQ)#DNrR+~&J-SUoRBIIs?n^ZH5HtP|%N#CO!xlbUDm2d(rv~~a*3~244h{B0M zqi@`e)rC);fG?9{OjcSSQWZitA1*OSD5N1ks7i2Z(`n$W-97lYYxpB|z39!G-D_)W zj!W+(0(UjMq$j75s8n5lf3@VE$-X>VgAQ3Goy>9L8qPtvJ`XdSlTz_>&HQ@i{ayJ` z|H>$IFBesNw#>kJn)I#M2xm0Wqw|bTr?-Ge(R$JDz3JxQeot|5geod~>C0N6B`x5N zcJ6TvraqMnz~<;i2CHeLF;V1Y@PXj0T%Kg5(@k4u@iZl3`&9?^VsRek6XT0*^{suS zrKL|c@prJCwv+lBi`4!Z;u5@R)hhTtB*ajVlO5eUkul#viXh4NuUwiA`q21JC$jTw zU2SL6*-i$f*XA>MO>2Qdfxzlo_=n3ryF#6<<9I=PP=_-6L7to&Ik9}hM?vS3d zwEL*^GXF*)L*_4N6;f%&l{DnWCAIJy*T{E#D1LeDab%rCIidpFW3G%ZNjbc)o0Ntg zt3Wo;%ifSNXD!2-2kBcz5f!nKuDNvXmkLNib`7Z;UL7Fgu+y4s?_-&b+&HDFEpd-$ zJ4_!akS;DocQPD5TGXm;0aj$nmyr`0a`)^X*9PslK?>m;D)ckT`t=E4!?2ZWUSH!s z&_fMF2)c@E}SqA0N>4a zi$6?ce5^Sual_gXx0AFpRuQ93E1GAj-aMMuq92Iny1zI4fbzarWHz=Ae6`7w7Ci67 zx=5^%*!A^v5N_>~Jblmb6wib)sjgNcLQ_woY=&s;9?^RK`MG|#OK#<2@n2Hl0E8cb z9W8`ZIrC3HOWO=)hCkXFMdzByNrcWF9t|Av(u>$@Xkud0g%gs}meg-`(bSSod)R{Q zAvU5L@F~(`LzqEYRELK6oHoleFQ`}tuR_KjM<)6K(TUP47lx(0WPA)OJA`=vY9l={ zgUXemGclLiYTan|2UAi>l0>8{j>&K$!g}^Mh5)v^ zDEHZzRtFls5*#K24-m60?(6RbWewL}qSVJkL)n3W+1Wj7)&ry+rfhdL`)E1wPe@oV z!{ObLa=mIta=~#tX7=5`AUyUDr2jiW{BKwEzeef*I<~BqufhtkbhOT-3WaPU>0cHxde|c}4_^B`kGt0Pm}-4@1{pUS90R`8!xslB~FH z75r!i!>v1`;Myp$a;0em25^@8oawyBd(#1|NT9akbz)|x5X(trx! zJf%=p%S)JbT;$cea+%7J5i6OHkkB$?a#uSSf*O%DF{WuO+74&hvA(r^)6?@zn+6B_ zWN&Z3acZ9e&bywBbfnEZFkh#UHduGl-Pw^c`1i&THTubVCLOatcU^XMmUpSw(1p4J zGX`pFpp|P(I)s)U`uHaz{zlRu|H>YIh8;nN&p;wZgNJC;+9?5m&?SQB0lwAJ%tqBq zfSjP}sYLQq;VyH#Ki%+rq2Ni?t*^&s6{IzEiwE>r^>j!MxiQ%+2s|#V&+VbBVOHUD zuCVtRiF0QvkJ-|T;4vpihUGW%Xde4GsTU1=YY0*S!go9a=Tj;ua6xEcCr-0Gxyij+ z06Yz4=DY&yHJJ4;x)VrW(4EwEPdzRodK=U>Kkba52h3`mI#v9Oft32l@p6ly21z^I zv@(2gJ%O}}zOXKNxR^{~%0xm79xbHOIiSg{X@UPHvBIm4R0vOVP!cQ=EN`V!}sf`B;r1HaZKxxl$wEJl~b?0a+(} z*fA7fU*ol}Y|Fky1W0BrT>Bv)HAV~YWsR7PrRqPA5!>O4Ly*Ec(yQ9xXDwGW@*v-44UbbD`5-c4w;YkI6d!_~PLxfjSFC zONsbS@EDT-b#OM3;ooCkJlYn$Bl&0H){cB=*fjL8adDRus2u;WvtFhKWZ)A$EHF3r z6S@hC>KT5)v^xIDfW5>_9Cl_0^8UXB=-5`#V!&ymXq=ilkZYdyYUhzH$u^UH9DDql zhgqQ{dmxgi_rbn1s2`eQ|B(00pQ1n61p|<)H(vEas#8w(>teV7uBGqj(^OS#6cbkH{kp` z1SU(w)X!Epv2=&^x(-}O0+j7P?A|vOk@%Q8CJ~yyFmkENnd8u~q}lh@<5+P188UzK z6k3;cScd-MVt_RVfcstD$1}&u&Ld4x*K5!oqpcS>fbo&av6mda&?~B{cFHJtsshd} zv32LjDo(yJ&b-e}Q>MsL6P>_~5CmqDPJ85Q4ymYG8^JgzYlXJrkXrgbJS%JA8)(Hv&z zDry1g1S=)h{a%=92_0`r)L3C#6eNpiygq3@NDtWuz=P?uq17`|_v$9X7O@y_5y4H$r1Pv+B?x$23%9LP*LNkRr5 z?(1O3{X8YVeZFXnrR%Kpu(l*u@2?@FEruaxpR z2gM?-A4g{AL0(2J5%%7X+zh=08BPz73=39D{x=tZsji0EBnNDGgN!HyJ4G}X8^xc1p`OtmMqZ>&t+`FT@+o;~^jVcTCHCuaOk0_G0xP}9S9 zD6{hnUu5j=O`lzx%bW)d1LL+_o#Q%gV~?@YfJlvn@xCfLbYq-+`o9?gX9(=&;s2g5 z@ZVVuvZ)3aLVo4EYjY(%Q}Q?G77~(8gt8$gjO+Ii{c|Lw3xii*0asLr`*faW-W*x> zDt$eG>%SQ5(RX&8#tr0x^<>AIUwkz#U1depGbJsaD&obbMR3f|5!)0e=KS&xlUR?r zgh%2q^k%!3w9kg~qG)8}Wc12vl3&`zXfZEn<{d$IuBNNn-TiK(LbOJ(PFN0a*1Re| zc1^tR_^$NKDgE)~kH=(S06W5z5oC;GGe525w$uiIwACJ9>QRNf)T$%Xe7Y zJ6HXx+}JsIE+h-Dp3eZWcy&Q1)~T=7@pdz>)6C9Tu3>$Tv>);q+C>;fqFCqfOnwv- zyC9`Xq1R4Uo?HKRgJM_jo+gXK!fQj*yEbbDo0PwNMkRYL6) zx*O_mp0HrD7F~DEXiyl(g`L3@8kZP|@lcN{<}<7)eb}Sr zM~-73U1!rLF#%q2OO151H;xTgjMO9h&i6&b5j^5L1^bfT2*ME?QvQz_>Y<`CL$Erh zm(LzRB|z-cr&i}U0H+XeU;F)oY7=Xr)p{)bo7BQSiL$_!#<1WYilaQQT&M~QhMHBzYR;1QGq~*4KcDRh}Ue4 zDPALQj*DGG_~?ef$%%4D$SdJv*;`r` z9YfqJ=K$`Xb3&+L5KIfl$M)X1vmk|)k>hiRQB;2jn~juAPdJudfq@c@LX=1c6{~@h z96W&M@S6a3$3yif6WGnwQxArb)==2z#UMq{ zhH?fbuC7J4mDgg1z@hAlu<-zte-l$9-&9d_m(ursk)(E+4E~sJktY@hpY*iBqNY2~ zBt8_tco6?g%oGktO@+9F7Mn*J*5w_kC3_vEtRw;{kITtX=S!ebu+Vug(JgRhK9oIB zWgRWIEwKA5YM_ea{IMxYfhBFLN2JxD^t4C&&okG{{S~gI)#CR3$xC->9^Cpzki7sl z7WjXazy8^O>ka|HtH78>z0QpXK68Znb)V0tB6(YJG1_o=;}tYLIdMR^*Wb0JVM3($U6t8 zi+2YuL+J~-fK4l)=8t+?o>aPHQuDL!qs2ePld4s1-m-%-L5*XTezCeiKcpHP*9T$jwm%t^`saHFTQ>#^xw`f&<5e*EYt!|NOyiKrag&cS8Wzv3nj`+j02R z-u2bg*+{u$$$@7*30{4j`Lo%D&}hUuRKK{4xDKZtYM3q2DtrM)z4YZZ(D}(3)C2<# ztWBB6P)%k}fx+>!CB{`?<*Z3i#EHS{K@mQK&t>o`6zqjfe}M@V1;=l`DRS0>!WwqE zQ0_FKtVk4^*Jl^|LT{hVtLmX51pW6W`a3_PE2cf-b^N47G?+Xe`=mb$e7CcmVfW%B z^0Ux)vZiyBzlL_UaZU}^(0}PEc2?dI?gomIbrqh8zs~w`_C^`#k$3>Qy!O;;)*U-V zn25@K-Jp0Qu{n&ajI!O>^JcKp0px9Gv~?B6pVOpC%K z{E-#)nbq?Y?6L4eFvj8!rP?0LXN4EyNw+Pi%TOLNA_8$QQM%yPw9?f+izDT)xK24t zf2?|3-Bmof((rCa?>rN+ujsT5`ji#J?4O9xGscG0=~9gV`R<4iO8kK~n~SWJv#+l| zVvKx-J>ztfv8e2_>CAf9SG%rm^@t0x(bU&51$|hY?b-I;6vEs+t>xSL2v$NwpEpH* zxdy`;&Z>c%j^*r=frRGW5H&#Rm~5f#i~IH9^;ny+?yKvY8q)Y2@!P_`PaVPeXe+41 zP@}!8=fwz~$4WT8yuw4`o`3az6A*k%_vh2DdE1qa^)@99QsH~9Q=y`5C)0xpp^Q!S zu5QT~+aNTQIdlY5A>r?vygfFQg6zC%@Jl(WvJ2}VF!juRQV(A*toiMGHm1#;dusYs z--&D;FToq5da5(Tk5fVJ3BNoNeZfq+5*Cv#lYe&=ZUi66ob(|Sp_=xRm|v#|xSFkq z|0Ma;rpPE}m(CSDw(#JEXGK%t&o+jsm)C>!Mu$r{f~igGg~i1?t6wg5w;U-8bS-mj zlTk>^L;_HrP4i0d>UH~0TG7u-zpB?EFsW}K{^nK9QalhNbH<$BX<0xMa*SBig)jXG zyO%g;p=yVleqSxN_d^DOnx{ow)?>{t%fIZY*>dMh&fB_q{peNwokICc+p+jvZ#ijzA)58E@ zB4Nh-QYGij{~2TMHc&9vvF}CSpKkFJ8^axJDL+w6|18%(=pw#@QyUH&***u@MHcd{ zLm@%qS(I{^7KgjuYT4#RL47j4@6P3K^-E_HB>2<8$Z*V~)2L)xNk z$o>L%+rpZvU-2qXwc*?-kVg)sb8y|WKcrKoHS%X&?eA9u2r}{x#f3c(6PPs}#y`o- zBap*4a>Mk{P5a{Vq^-CYQ`fJHJYHM6-q4eK>ZJ+J_+t{6ui3PAKF#%#MA!!zU1526 zLn&HBQ&3CTR&&553`|YhhRlxvf~CZLHu&nVuH9Q}0Rm`>hIFWv%n)6fl%97xZ7IkU zikr+|>nW4G&l=lWUcO&m6Jdj4&bR0#IadKU^78`kCY{~}eYF)gPlshDMP(oN$X}!* zT?YutI%Bvc-#so$hpSdgnY(rK-*H{-#x4v3*Lh6?-zyxvD^ZQ!`Lm*e@+81Z1OFp) zzMhNV4tsR;!fzq%MK3O9Vk>ed6j&cl_YvN&-=%q%Ts+m-vUI|FKg^T&3zV6MjJ9u2 zZCHNt;B(hQ*LlCBm&w?~U|66NgSzM{%}i&m|2__(9KKg$2c9oWp3^bRye~z-r}0AU ze4j<@rXNU2ToQ+(5azGigdjX#Xx3gB7z-cj&t8gPo_nI>4GowL(~gP}W7c_W`w6Yf z-W}W2jMu#Lk}l2)??m3YiApL$vwgh1rxQP{zTdMnFX;GY1oCH1J2NvXcS zrrfBFP%jBYiKdew|M5?rfQVLG$8S4c#q1kRC8C{bjcL9!GomS}shq&_snExEyxhdi z>bV0oJUc4VZf3K1*RA6?P2f`90fr{Hr5SdVfz35-U@7_T=b0Tzg$U@&d$hhEt%&id z=HBzvm(oQJY=8k!x>r6*wScXNiC|3zQXH($M6!dq&|p)UH3U1UEFV-v4H-~2o|LuN z(aW*&6RT~5qtWg=&Xiqlzw~dS!0uYC>EQEYL0rrotB|L)(w3jl=T=qigM$P|HiDix&u%0xy_Ve zDV`m>&%Zf~`EqRI^2n`kkqz2L;y8ew@3fd~j?mZ&&3k#;4P~ ze>N-XBem>f&uR1T+N?_2He9@YrE2g%HG1#4uRJs0F}9ju%Ry4z$An+MZm(5f@RIs- zMMt6K=pc=BaMjEIk^OyI?z^=fmNfD$mv1k1gwd`T>FTv1Mkq$?)z@d8`}R;aSvDC` z(%gzLIVf_L^Nb{E>|C>Bc|}bovYJ2kN#0HKc~yW=9cH##2XJg^G+$ASQjCIz+~_Ct z8b7*P6Bk6UrXsd(|6(qm+51R5!Nh50;;UBmV953+cTrdL?Ero^{EU8azuMD_|?v=T73Z#)Ic; z4Ur8+VRF~oggb;g&^Vp6zX{Ils~l=o?8fi?X?#9|2=8`d4;(s!kVjMdz^?i$wW13o z|KEu%e1OCVvIjK${qJMEud*Ck!{Z%l5Q*ZUBfOji>8E4zjPo6{o6_|O;~=$+YoWuY zjuEEdqD?CkJ^g1=yW{H7ki}2&QHpAUDD+Cs;6wclvchrQ0?Iq#r|HunkOl_D+e3;D zXujL?TUux903dZ>cVSbLW9R!0;hXOB3Hv>n{TrO7J-s`fS&a4`ywYl-sUtL|m>!V( zJw(?1YXB^9>lW9kVa6!tA*qJ?b&&eo)fut1(taR_p;?T~`cIa*<@oFn{3i}K(*SGC zOpn3C4rDGlh~{1kPG(|fJvn8Nk?IfxIzwoB}Jg*^!B?bipO#)1d-tU6uU z56CM->XTEQ#dn@6U|e9+e*g9tG<7f$pV0dpq^DB>!plFT?f==zIC%VzuPC&JI=FpY zl^rik)BNxAoU>r{a*=Uy*Y+rMw^`lh1im;@RhK-K;yVy*4DdMrMo~nbd!fsY5huSE z3~gML|J*?%%U8I9GSc>%QvT)~LKdM4sH0r)kHQw1W(Y^ScxDu0GLSZHU3V+X(4~nt zrKLxFxsv047JD9f6l)j{C59mC+QCn)DXQ(zaw7vNePRqQm+}1e7EwsQaJRHkbMcVZ zRQo+ap@W9rEEdJ{G~>FFE4GFO1z(MyB&KMxpZWsRm3tg_9&44@+GgU-qHZ|`-jYa? ziA?JZHajGgk{zL0Y54rw5k-q_w=E*a`GX0uXX4{}(iU0@{`q;>*_c;CKvw#MB}P;1 zmUJTUTSiyR*zo#45&|y_D}mp8{^RQUvfx|(V9m6+4pXQsyO5L!(0t{g=Ap8eK_B+( zXQ)a`t5x0?dZ970OA2-0(D263-&pzWwUNJZ+`Xdgp!46T*#94CuK$X{Zt8c5&WD-KPiJE7~o2AyxUP5Z`{(p*thovEy)7V?}`ZG^UnII$hKS3T_YTv7k^uX9b@5 zXosp9@|mr4MAexw7hrGNQtRWk6Ty>%RMVPB2X6A#pY;2dJ-{EFV)%&*9CG%7S}W| zWf6g0JPkjyus8lC6|$c3N@AN*4sk&*b2KPmToZ^NL&^;RLM(2-m-cW{PtSoE-BXwkX7RFh5?iRP*FuC9c6Yj`QmrpC?n_&xo1D(J18&qjTxO3T`X2=@^?Kivt>jrK8C9ch*mE#N@*gQJ1T1xq3vYg z3;5f5gs2)qLoA{Dp6!WBTgWj!&Qd{gCkqGuvYk^w99~5~fD%B!TM``F7kEf?b(&9d z;^|T|wbIyxxy5|9{Qbhz%975lQ!Ws`$26|`v!Jwh`kTF_kY$}uXGOo*vqH62TZWGJ z(~>Nn1A2-gQ7yOHqamW|em1{|O=el6439)?3`1HJLZ5{J&&=c;{_~y#G_Ef$M=_j+ z!V-rUbJQ#Ib+mlej%48*O8QrZT8esV zh9mH}ex#H-$HvzD-Bt5#yTjBi;=rlRCjwCFejdb(_zE|mx2k8LZs;;14ID+C#FLVs zdGlp>IH=A%1HV*0l8diL=+GWm6i|>A0=5X@Vy)S!D&TUnS+4dzCOFq$)MF#Hsa9*1 z1e_zkmViC#wbA3SRISf%Z*tsV_Wz!yKw4ll3)QGW)~00e;5#%d?f~pjz}OO+0x>{(IKRnNPu`C_lOif0{>w+{*(4@PrY?> z31<4RqjKgV2y<)j^;#{QyU08)KZ%^BM-$W_ap1IH47pCQ+}0 zOa#N-xA#Vf%R~;L|NM-}T+)UR-4mB6q{;q~XR}FO)JVH;Z$Lrh)F&E|N1mtAFS7o~I-#B{lnFVC)eG|8wGlQ}Dm0P6_;t8aw#)4|Gf`I}qA1Urc9WGkZ& znOEcaRhPd0*n8IGb$@wHHwZm$gh2*S>kTP(1e(82yk!bSj;QDxp*ZVRp8SQ!KI~t{ zoRDhjpUq-LMv>4u(R$it0?MAd(xy9Y9jd<#wGjH>kY_vTv_d4at(VG?n2tZx`y9u6 zA5xgY!ckTHYdmZ1aU6Bz*OD0Fx3kf(s8XRzBS3BMdqd_} zaMlxnXz5t;-MZT<7`++Rs85~Bo4WS)JNi_uRl~g{7c$dUH*bwGZxwloO8y6Q^rDTS z<Dl7uS z2N32JTYGbLQgU*ly+%HK+q??xMYhalbCH9fyv$I!V*)hQUrO+z{XOaq*rNryX6r7U zBF0p& zl`H!p7QU+g+@;+Tx(A}U;h*{n&a~8Y_v`BvyFfiv2yIIP-ujWvrulW?AuYWvkXSGP z+Cut4Vi&Y2(=r#kdUyh2C5!0>t1=*Tfv?em9pU^ZwLNge5* zVUojj9%ZwvX5n$<%r`|Ll>&=HLqp9|EB8&DAq;g;wrLzpK0$JF5^*&eeuLHymj9tR zU)AUXZB*m-UTSpW176x_@d8k>`mxOQiI34jJY3S{_80^NW~DN)`@Idf#w4|;KQx4( zTFq)-ZlHg8k8=Yz$4DGHz1*%5?#zAV@s6|#P5L`tI?N_FrXP+7}YXVk%pf3irO;8Yi_oNW4k~km> z?%4B8i?bnT{ji3H9C~YMHhfZC1(=?lbq=Be zO%Vyndeuv<1iJjT|88oST;FP7B(C-Oyun;-In#e*l9t#Coh&LF#RZHu_$7g6GBXzu zeyBZBoN}2XcK1P!Seby=PXkuZ{upb7*MNZ&U1~2{j(siCADcnVk3@~^B}*b!U1~rY zLWhobLNtw_L$IY}7M{xDWp0$L{m6hO>eOEnsU)Lqop($2g$OtY4PPkp*OI%qZ*Vp<^u`aZxb5(W7(q>F=rZZskq{r5_5tEU zosRpG=Otxi#SsH4BUvUUk|l}ziVO{~Y{w?#>Z9dB6YcS#tNaZ&)nLiX9yg#14~_$xQZ6 znzaufKJ<~db3+h=L6q84x^>;X4 zW#A9Q%adM6r1*WoDAk!-P`XOwtO!UqSL5WeJrcqmbsf*hwQp#nde%vEL#FG_WSn8@ zvxqxi?(Xj!6&nutGcX*$ikTerI#ApB|ks60G`XS%^evPjS5M*aDbN?q|jY? zn?)8a;@7gD0aD4=2Jq~k7aTNsWZ7A|h}3CYq&n?>N*y_{e4hc_B>H7e$?@U$MBt7u zcdYjN({;te15sImbkn~vsi4|I;)Pfkmo8+2KvmO}{|DHn=%W^31s{T{QS9YO{T6%` zC6(Uoz;hZ-!uZfJeqCnKtRw?U533ybw8f2eu>}Ok4E|}yB5uqJ{!Q{~{C^0h{_lMB z@BJ&h_H7Ro%=wfJ@xOBG(5(4xJ;j>vwW@pz%48Wo3+ zTYq88EpaUjkEe$`)YvL$xBzs{aJ5|Q>$kKL`ah8*TBzeHf%`b!D*)J_!HEf48mZ$3 z;Bj%RoJhkGNc-Nsf|84W!c~6)Hz07b8jKoYGJ1lg>^krq#o%WsIg`Zo-Nkg*V6I|P z@1CDe9W@Yt#GZ8N^W4;wiIDmEP??)!)toTQf{_~a?Ho9Z2{OYsVBk z7G4tO@Y7@f1NGBI)|5U|I8|b9ag2i4={#Y%_BeShls6=siM!b=lEj*V_R&I8zkqz^ zHZNFcRV(b8^FX~`x~2p6{SZ)f(ARn_lb;}a%`9>vZAhH@3>4mW;K4s~BQic*Kya{^ z_ORjGLVUZ>8-cJ()8I|{vS^@;uW2pvQRL>tqR;zr9c~Tp#Gqdg%RCG|-Q|qzFl!=5 zJ?m{x+}h7pKk81s)|)a6Y}3MJDihMFHH*l=$2k6}4wUdSXTTti7AEBRCj&yb8g**v zn-(KRQNn5vV{KN&=dBQJG*!(*^*L0xFJsk(c={AQfs@%KU?<>bOYGLw-xbYGq4@~U>vzD1!1(cOS}Cs z3P=Ve)7)wGJ<*k}*R%_G*a{ti?Q*o*h)h-kQUK6R=u@Y;>%S*0M3hfQQip`q#ct1nj_D%zC6-^3z6Y^;tJVTP0h-sdF|F9XxI9+IMbeI)L zh87IpZz|d!cJ++)VbJ>H51G;*!doNxV3hwhp~^505<#!4WM+ zF-f6|Kx+Fgum|%Ns(sSS2%D=u$8y$=!&n_PcvfK2NNPc6ToFXWIsW?nj3;Z$hK?s* z^?X>{1PJ#?vJK$f&$$Wne?hKSPO3^1|EoBP)iB3%TVx5&qn6;dpFv4;x1#is3c(Hr zYm*AsC4N1|G30$^JU;g#UA`5io-jiI;{AKuk(#QEK=#(@c$2k-FDIby|MSAVMQQf^ z$Pwbs7weY!AU8cvWM`}#&@?22YI$!q)`o7gCTiRYtZzg=rX5g4T3BYNX&}FxP!>ee zodbHQmx*~&X6IzHXy@8U1Vf?%I^!?s0_~7XyrF=`VwuV^1s|9pj)dd!IU%G)+#fX& zyNp!^3J<-QdSYT2ALI~8m~r>|i_yM~6mhFEs_AsQ6=cuW-P04p$COZw?GIa88cD3d zo0A5NMee!%ll_it-ac5ey}2DCkCvx8SyE^}xH&>^G5HaewP#+I2l^1xuSVx}fjd~| zKLXeQJd1FMTIez&^6qx@{}mhuuL3R&lHOlpkIricn+`q#naIequ>U`u!~Yae1!+sj zSnYOs{#Em`GGt|Ew#zM_ue9Enr;)owuP^^6XkESST{lFIdivozdCaYAgUl3FsPpqR zSE7M*>u1GI<8uYC^-s+A(pp?XL~|&z1@ypc)LrtRVKaUB)^~#&Po`mNZF`;xLW^G7aVm8iz=mU8JW!R%_Y2n*Z%O&;ZBiYg3zJig9^UZUH zgZF8nM)|Ay`ZQdmg8&jTKz=H#3=qv104DHIwQH2z+&thEDI~x{pX!FVt=y;4^;q~G zP*r7E2Yq73DKig-m)l&@7oiQj_cw5f%5WK(#Y=&E>r?IUvPBX`%{5j^UjBkN(QRXE zwYsG2bx8f$6ZqJX0KzhE`4sY!8&Cpu^AbXX45Oqkvu*nl9E&|Q`8(t_Lo;b+Mv58s&r(G zaHB6N-R+yN=GP2NbS;~W$k*6`eL3iYn7r2pleW%@f4#BF{|egarQOUNL6b$+#_GU$ z=nc|{99$J*8b1k*7h$zvmBI*D3LIJDJI)m;Q&uYo84VtnhN-Hm2Do|)9a-8IbG%$P zz%}%57mm2uHd%MBrn(wsy-h^-XT8{|sf?QhC6{{)7lD-;BZ==B$t2vEZtFBl1+se5 zWWDcZIS2jg#^vg-505q~+&OvWSZk`HD>qs{Uk$%|`QvwSyZ07TP0>NK0`8q8Yf&HW&LZ7gNMSmX~x`==|cRx08< zYswfRjw~&B1*3aXy3XHhel|lT!F`Tw=*)HPT~Afe?*Pm2!;D?$C$6d*%qNgKmr)4s zdyKeo@Vhc~bVk2WUxd>b%{h2t+~#!H#|SN*(|iZww3!~#Wn~|i%80XBJ8_rh367fT zwUhVL5jkXd@RjZ<&>)6DK-qv8y>z6=#$zzYchFj9eXo*6>7&H^bV8A zh>UZ(&>r{hzG)^$<|z`gpz$(vg>-PeX$JjkWkWFSx8>-GM&Di zmz%dK@?$ad?X=_`b2ex_VGL`uooiin4+py7gG&e`{Gi|B0MPPaLw{VYSrt4D1r)lm z%^u@v!vUY20RWF{H#_66-o&VQKI`-Ru&PD|i1TqSeC`kUekP#r;0{{Wt3o!WDdahc z!)K*zu7gbmKf^PjdPK_XkCB zsuOW#ZM6so|JA52YH|bRpXxW)9+bJrgMd%_H!=I^$?o+o`G_?u|Edo34j~->w zB|xo=35S$8L_|tPss_Ts4tO1`F0b;#SMRP!i^^5`F5k8qjJpAE_I2fzjjF2OH^nEH zPC7SPmrY<0=9xP%RakYCdW~z*z_T=nMGk+y#_m%;2LGs>1 zV$2;U$7U>fCopA<4caj_I18Z<>TQH9;^F6!ZFuzVO7-Tp22~Mip^gPHL#IRio8(B$ zKg2tpiJvZKeEa(K^sp+|Z}s_Bxu*Uzv%lORdF#y}ydI(|XG$8qH^VN1nIz@XtnD52H6$@m zoATu8{uv-=2`Oxs3ncc3P$$2Za+#kFVeC;St{o(&*YqIAzHinyu=bSIV6iP$j}aVA z><reB& z`Lx201cf{H%}Hm@*bbH3wtadOR_UNLdYa9^z+eb@%WaQe=E6}eb$yX6)c(bp+r7sV z($m#14iFJKJnkRl!P1)Rot^>UlH8zE>$>4y_)_ohT!O^#cAC5tQO*mN9J>Rd90qU1bii1 zJ%=h2H0clIBdJEDrl8HV>`9WO=rdm6(HnDEUMQZKviZqL-R6F|uxXY-69<$}=X|<# z;gDJq`;WykHP985siOgmpbHIkP6?#4tL=pBp#2+j+?<~o{)W-JEpvnDXg1On`F~&d zTZwh=FU{E%#lOLWw7(7F-~J^ZbqJ8)$T?qWx4MnX^%oAI@U5T&qrN{Bq8Va?Di|&n zc18mp$F^u8h0><2TTn~flO2|Id(;6M->0J%v_w|#t>W$lu@at$goFeLLKkY#Y&V+A z?%wTr9%Plt(Hf#Ui_35~wA$a=pp(KA z`7;9p8>&J%xKF`zI9oiY@*+uWE1XkphzY?-KH|^L$9FzntXW&ld5U${rxmG`bz~LG z&gv^Uu7sQ!Qsroyi8xE&ix-JWSO#(8ozj53 z!wW}}#J_^Hnyk)IkfTW|t~5$5Lo{NoHwbliu9FiOGT_r(BKF!%r7xaw9w}KC z_OGrx1bsCMZf#uUJ0j|8q)EOkaz!~0jHiKxZ*qg-|5 z)3BYwx@F%gVn2vV2-FnoI{(@{0fV2H;YJ2E^1Vtr2%UeD`@3IKNc&u~v)h4&MG2}gIIxpy$1W}bOnS{&RIo2m(v$*+VCGPD}eZnPQ z$|-xmBjZdgh(RBFTkq|07U@a}L+vMKK1?Fv=2XL`kV8!6_0E{wU$sKyrc%(qCue0b z5xI5WWVRil#mPDEiqDfL*1uiQpY{J|M2PvaFUdx$3n^=?$!5A8@}p7&?9B`U9<^uC zUT!PK2nlM13^igK8?SZFUC)_mw*vi+=L#Le7c$F+Wv>BE>)TxX?#)G%jwAgEkiW~> z`Apl*ro9(#WRwLR6Qz|=J@W@@$J6N}%V<^4YI<@Tt+2BH|K8g`MSU)qp1%9X9UMH1 zsgJD;dpc?4;^NYx{HF?QF#*vx5oXkM0IVmSliVtF+@SI8|3Rhw?L1NX+r9Rh|G(FU z8nhm|&&3*!)-4D1+1S`7yy_t6#)@=AC)wY6548DT*JFoT22&aV@yo=n_r7}P>cXzB zDKrOEj{Mh}Ja%nTX73uVYuJ@~@icskfDhdBy;rC6Iz_`VQ%Y9$QUAQs>g^ggAwZ1r z*mrT@RBzdk@nPsn$?`#HXzi<WH6h=Cp~63ZuFT z)SRe*y=4_w1qR%pIwo=>eh$Z-nwrW7M`?_>srPBiU>Vz`)#B#tpI3zpz`}a z&n^>+SZ`KoZgpH=Cgf$Dx7G49!8hB^MKrOGgRyaPnK6lpJhWdUjh551Gf(zhL_r%q zSfhu)=p8s5BZNy+?rQvI_d;Q)_0Ds$5*6&6jJpb3-3Ve6(CdvSuz z;rjEPJ&@$E|7h;=7PkKcSZxvE*)J0_gz}C#cZ{JB0k( zX5PeQ{yH^V_o~46rH6THn0f&ClL-q3w*gl6kaz^5`D<(Ns0P~Xy`t5h9lSV`eg5v8 zf>k}wXSPPV7pHwX*&mZKdgGiJJ^ob>T~|<-Qclxu<2N&1mA z2OArzx@s~bcwxAHd3=!YIMvxXRtiIV^PTINie;mciB|Sez*v#{^IGH;#aDkwb^cfT z{=c_^{$Ht#|Nf)({S7BphRUW z!*_h-bIUmeG4$|)LZ24Aei0VidsCjr+F$N1yvC|a})Zm_Cr`@MBbMdH|wLk+Wt_+kDRo1N?qiP(BOq+V|u4J@X2$yj0GHWvuu;ijDt0NW=;YULtRm=duy689=7v+2~ZFD)JF;neL% zRINYARP%FknrJ?{taMBglX8@QGo*(;)(&6qLvQhgzUHLziJ1#gexxVB{?eIw+?({r z5_{b=?~_Q?S*_^o#5~(XZnTI_{N75Vc2jq5W^HKNECtxC3ZH_}M+uvs6jZGKLyUbI z1_8S+(m=Au2AFwgC+~j&?JssFicHPtgAb3$(UUYAs+8gKM0Q{|(M+>vLO=2g&WksZ zEr@2aUs9|eJQzg!kxbrGXoKD?vyKT3by+VcYM^$5fmgz(;`@)Z3*B}N6+Wg}ex;bw zQ&#Sd*YYJ5nF0M1vMMwK-7+uyEwBKumvC>Xpl$>-I4lI6S8x)mt7k6jd%l2 ztth8RQz@(%s@@C9Q{C)0{S9d|ldqoVz@FtaT?w^S#LuUk&Y5EhF~uJamHz^xH;soC zhI9z--)T-G%Y^O}qimIl_A?Puux|u)DdewWv@Ci5C?Ltu(7Ws4Al=0--VniHSGxRU zN!XcLI5)nRp07RV6`W!9v)jweP)@Pn4$RY&>c~MtZZIW><=E5JkU90CT2C=Z8HU2e zg@-JerI!WmD|f4O;zPGbBObHyw&{@cd8z>gCc#KnZ3d%Xe@rDx@k-q|^!(LVQhhRP z_9In-3V}mpKH~Q7Hj}{A17n}sHxMWILIS}R#j9}H&+nXdzy#B^47D49q#|`mBmb2T zKVWIz?> z6{`FayDXP9{!hn8Q5Q_@e*R7)*?VS2!PuuBx)lg&@+l^*{FI`CpULpfBmyir-<53( zE=Ri1Kvvc4P1`P!RnL4*g6Lz<>Y`B|{??!ntpEra{NYW0d@(9Ndt}PI&OYw)4?B8Q`luM%Vm@mIQK);cJIKrfP3=^a6EvRz2hesQa1h^!7h3$ zMp*Oe>&^LxRa&9YP8UY{GD%-rHlCs)m1!nxjgn!pE;I8}3i||T{A4=#`3Lsvr@1*F zcMWj1sEmbNECy_8(p@lUWUrU|^$biSpyN!?hE(6zA*Zpyk&)={-%Y=p4qibEjWW=DChoW)bv$j0V)vy#jj<3&9F? zad(lVtxPCe0xgVt0n2jo* zo#P=V6oige>U2?e%GAr9{e?mfYY9@w2Vw_tK76Ia@Am<0Yk~WdJ7Jt3hzP ztQ~N6aS2B!r?|+Wr7fodKGxMQRc3mVPaN_*iS^pad~S2Ys;-x;I?Amm5Z2s1M?quF^ED3He!uH4oT- z(fov6?m!@QJxH~Izn}+Zy2U?2-Lh!$dPTf3!Qzi&X+E&(f2j#-yFlY!{hamBLyy{} z@+$j|FWsDNcjLglt7O~_(b8^-PfM5fWiEWy-TayO?2^naAefc^=(S?Bds70TW~RhH z{PEV^Dp<^^_mcSxijL&mTGs`hXg*b1pa4rX)*vfvOKh-|7k%TKmpx1(!wM?4-8mLX zXA62HLl6JPfP%FXLMSSmpaY68=N1%0Faza#-ADmzEos0(NUs*Ok>7G*4zozNcp%G| zvSfKg#%`lmjo@G5qgm>yVY_&iFBhe!r+4M*)eGV`C;L*JyYMb9D7)L$zDjL7x84rF zHEcED-tVuA;gU)}vmov=I*9AhZY|NfBBVx#M>$zF%u!?J9O$4lI37~Zj5qI1(c4_a zZ1}!0KF2TS@iZCsp593geO7m@nAGOVPhw#g_JUj^g3i3;)^c{H??hHfhWYqh1B}}Z zZR?MwG$e-92r{MRz~_mHKQC_d)z6S_4YY5-`ZyBsC?Fym9w?d znjPIYD=CE-^lVXg+|f)sVPcc=;%@OH;qW+n66vCmvGEu30i8DxIG3W|4I^=yaj4!k z{X4lYSNExr7#duAQ1%w75{2*i0&A1NV@s*WAvEcBv#UVz(J!uIXS-k==Z`ZCsVwxz zV@7^oXw8>??SNo`4jq3_$F7fK2}4$GT<(cw{r+ktHcotcbbm#UCwWWT%}=jm4*k=8 zf3NoDUxdchOHuv?$JMqBdJWXI}f$vIsev4Ql=%V&|Ep>W)2?W-NyC+l{ zuxL!>+pUI|Roz$KJDN%l5cNv)GJ{w_8V~r#LdTP0aZhZO>XbIy-U%>M+T4BcY2F^F*4X`?VX|3m}R@! z3`MYpfjE!QX=vGTkzTb#_@dJx8+<-OHxq9bIs7ee{Ouwc{o5*nnO>19?@lLQq&g}D zq)kki!A~#YS7pBw(R(`MR}2bV_i{f6HRA>`3uJRzjuF(8+kjHtSzp`ik$&0z{U6HT z95UOkqH+vA7-hgb=}fICG)4bC=caSBFB%)$iCKM(ScpdEl7(cpCw6VOU=dOQmG0s< z?^qaf0zTmKyt{}GDR2=dCFZcD(ClbEkwS?usAVq{@o~LGz(~xKJ`8J_^dy85L-y&rxomkw8=Dw>)q8UNbT z299m4LAuJp+ztLcdc$-zgN5Mu&OUe&X}$4_@&MtZJncs2?5%R&t}t+J-h8fbVw=SF zYeZ%$(LFnsm||)^nSToAtbed7mi*pzD``Y6tC`Fn-N)CU8>;rsrKYQK3`jYSoSqe^ z46_g2Sp|v`Y_!T9W;oS>llgw2MO#qweQ9F%poXmCq&=18H(}O#>egr3@s#a-x+1?p z+r!N=>S_{%!|NJsX1*wMCU6Q&@Dg5_+ogsSF>3F&rF>-V{_`^vxw#)3q2+B-7nmtx zUHMpS@?_xWocHftr&r?#k?rqtL}l^ShqvQk3a%RpH^E)jPO?Ln-89bVW5w&Sr=@9J zPx*Y~=CfUHU#U}HKzkh~{{=rgRJ&#`qvfU{y=>}(pez`_cD$SY`tG$BC%$o*Z!pEb z$oTp@JXYge;)Ho`jotSOu|lGInt5dKN-Fnrh1;@%TlPOz)I!LELM=X;#DYaNE66T~ zTw)dV&qHQC&92BZX}k+c?!cbV4Z2(}C+0TrP=y6HZXrQc4ON*4R*b?CcaKK|_EnJi zzbU?Zo|?)GIXxKRoF{R{gqKll27b6g}mk_L-vfA9D&&H0afq`fhms7BKm#(jy%qCHG- z1jwJrQ~p*Wj-knev?+;Z{FddsUy^IvmOm_{=-`y0;LQvDAkpP%elOqQywr7r%|sk~zO?@6bgj5m<)MZpfl>Jy@Fq5*(eNOmIBfh=tko zYN4U8zkWH7ojXTbu%@)dU_@UTQc?bHrm5S#NRK#(EI$516L$5s;ZHFS=|L)Zt`@Y} zxv&P;0I}#0NzMGyUwQT*6I81v8}?E65bx24--YMgCH+Lv9UR4!ec0<+n$5)NjDcHR z$e0i_B~>m)!(0_nHMVYj=0sFR7i^sRT;+0L^yJYHxu|EHSAHzwzfXHAwLS!yjRP)j z!0Jn!6zU?K)y;lLr4(Ln)k9<-fr}BJD?LqI)n=jQ32NP`g{Fladppm6P6r51Gh>yN zk9K!=&+4!@=#no~xJ@3u0WIITMlMf=r#kNJL^Pn~-DEO_OlB0!%d9Pc(W}3p6+kEE zu_ApwBXIV;C#IP5%F#vOX>%KI_?Sb!_KDcEh2y$F?>?{V#UvS15?J*G=d8FN71Nt5 z6}1)24-gz5X6)@E_6N3@zT%#up|x4gwpWL-$Xe?f)X^D>11j zqB44}Vf4gnf7ig2hVQf}^5@#}UdB6esDTfIefv6RV#-XxI0?VWGjG3CUQ&X!vng~c zfN#CEFwJ6L`zBWWc}i_9Xs5guuDH#42Jq#qz0O+ zlhJ4p7UJXeqg%=+)3vx`EMsrj9IP?{H-i3SxVi(bg{5hX7cv6**;qk&254A6TN&MI zx5|)T`wA`C;;Ehs@(fZ}Kd2qadQX1;>Yh?r%y7#Lm(x#;Yg-+?up=!<3P`?;oUway zla`y|sWaqlsftF;E@xlVrC&?I3bc*fA3L|gj?(zqK99SIqIgt3pHBw-Cm4h*z*@v@jn2Kw@@;mu#u4y=gZNOLDs|VA&rN-*dX(@JzIJRb#_bO zeBh+)+16%HmK8eCXTeLYuQ-9;S1aeEeD|1s~mW}`|od01dg`JmFKSJp4@ zgD>4&?yG~{$N)}5P@6me&Tupye5}bfbc>$OrpJHyR$MfpW{cw0zC=~m3GmBkDJRm$ zbW=zYq1R{7D*`_YflC${DazUB3B_>nEui?v_TfoKpa8S0x7v?U>r+d>$s;tT+=cq` zBMkjTh$n&Sa=Ea~K=Rz|=UbHGxZK}+>qt#f3KC4-4Mp^B0^-+FXbj-bEX|qL z>c1-iLKc0DF>?%IQ0z^L9Gkw`+j@`@qlGJb4i-W5+E;tW91d#uF7VuJA{+trM)t|r z#LT9?reGEIdI2g7sFCZcEEk(`HHe;B=%*N^aJg zgl(d>ok^Kz#nlw>Cz#g zNtddG9t1*_me2wz|KRhy|9aOs-#X|0&N_#+LMAh_XWz5;z3+BiJM6AL^eFpjb^rj5 z-oB-M4*(bg!H*3a3wY*q*gz@(97^;vHuKPSaJO@N^4#Nzs|x`5Bqk;3xsIzIdD9yY zv;Erkg9#~_Ea+x_ept58i;K#@(l+f=SMuz7>0kyH!9_c5UrETn!h9(HSe~EYur&2{Ugx&of9y?4A8Nkh!!}^=?LJqd#x*G7k`nYXWa@ez5sTG$ z(;qVNzOaBpIM~PAz0}@kk9w6q-6l9#lKqiH&fRs+L+(6Z#^XP;v@~TQY$LBeynxcY zAZz6Nh~s6PdARS>01fAc1p%&f7kP`Vt3s4cqXyIAl63=ie*#3wy%tpFFNlq zs@0ZEIsbUSvd%JjOCbCdR?o!xgQC@ojQi)r4%-%gjQHvPCC)BdP0Jr`vLE7#44fewJhD&GHEgqWh>wGWWHc4<;k-pe9 zYU&tMUeqn)1dBEw!kjJp5^(8}xxY?#>9%p4!-}Lr*Xce}Io#fZAU)T@V*La+yOfwf zH@o6Dfo>_{b(!P*DNjmkYd|`_G4}rf^N_1G7h%KGhg_qd{|e^kvC3Pxap0crGk&!v&Myvl0(hnZ71HL z!4nL#!;Gi;ye>B2c=*Jl;e~pM#?Yy(}hqa9Mx{|s<|wEA;0qK8?=3|-SDl^iE^`5 zd~xqgz>gN+nqmW9az*Wg_-*!0*8TIhOY|Ml=Ou?VGG7>1H4YIUdx}NodpQINz#W2` zic7WX&COHZ6?_>#b^i7qJ^fZ>tolf8OV?&=7csMQOP9ExaHvItA34d6y6qQxl<^p%sxxO5AjD~BDsa{ScCqO!vr9dY{h z6OZ>FMU4%{H@{mN9Vrn}BVV(+-CcZU|M!t{h0yqwYCupPoZZnp@U2`9KTXc)d@-zR+&ulz}f|D6&_PN9*AfHw-_*(r_^k?m{ z#c7c|sTcuQ@Id^1?=z>VmCO~7U#-anskT7!;W7P_j#*j4gw+D!9@#af7I}%4mkSJ^SUu96?SEnYr#znm%OkM+c&OV@dXf;XN6fGBWV`!8dk#NQMC@IgW`YY0CJAjRpjOLg;`xMnIz|$O0v8TgDRpEJms1_SdXL_IO>wvHy=6>}Sd*6dXYV`9_> z|Li}MdB_7i;9u@H##;v`_)ln^1^=3h0bcOzsW*o{gocK;E64;M-2UcNAAuKjROE;e z6SN!K1)o!f!8F0U&eQ>ZqH=K_UiX;XCgxLz+;6pf<$I_}iZ7B!hlalU#r9ssNAzX@ zf_s}zW$rw|dB^YWO3n4FC~XBaxf>U2psjs#QR$Gz66s~II)`3dFMMvf%iz_pf6?=I zG!6#_%IP{VH3?i~OQs{^}d5EP6Q7*>+GS@R=xe z$Wm<}$4&d~fYiM}usOnyTRw&(s+;vPMWAKUKN?x4deC}K8B#*YITxr!^tvW1!pyse zJm_hQ&~|onTDerir;!ixT0;6{guII}F;?N978`H`rzp=iXLHV$e)&s>U~tZ7%uD%! zrBAe0hNd`-AiZs3+^aj6Pk)B^47q-b%kylVqa*t1Y%ivd+mUbuF!A+oM_cEL%nt|2 zyXfsxn$(d`hpNZ{@3t#A;Q^EozLZ z7LMmo8p{yU#B3{JHT*?nsv#K*+k{N3g@Ui(}@S&oRBf=^KA?-d*2Bw<4v0$ zb(bX%4qS#916?s(d|vhY#m{~z{E)l)VgHC} zJj?HCQK>_FUhO~O2^l%x&?`m6bLhC=#RN09964E*onZi;q-0>x^2v&HSi zPaXQ{I^7=@CVxkXxL+#M(S!0f|J{vpFgGT6SIVdn3n239UUP3u=9n5ukzJ*!Yv%%! z-B7!C^xPNfWMGydnD-7LEA)4btDWdPxIr~kFriG*1F;iilYu?e06PY6osK7FOXH1J zd73$YOrc?HClt&veLom4PUd7#j*9S7$Y_}A7mb4(1Q1ncJgj4i^7gi>o_ZmNxErSFPbEIM6@3@%tT>_YZV$!B# zbTs73O8z-mAzgg!%OT)Ptxdo>`whaK2o1zu=G3SCX1j*`Z_Cj!*t$9m$}dYKVDpIF z)z#IUaLEaXGp7YF!w#h&qaZ1t8QDb57}a^}M_e{5_`c4<>SvB+!D5aA!^A|aJ2X!c zBH8sZgYqi&+Z#$%%(pp;b?gmW#1Du5C{W7^7sb)uxt zIuB4!;OeqcRp{lIPew|}B1djCwBK$lW39OU1oMDiK$ccqFB*(QHgNzxo_*IlJ7Lfv zwqtth03hchXU2#Mjr6hPd^y@~L3@iddxtAzivgkuu80oC*_iiCDV3D!2^R{v7s--R zL5YrvYFP1N>a(PcyND<6;iqO`4rFO5mMq`kLkjVPvN1-Vhr=U{FWXl7CiFjmW&(qu z2>WziZJH-FE_#6fe|5gJ79-sGD0cUr2`!_2Yp15}X(!qvi&>{LE2%g10sV{+LX5xx z6jpDa-k7aL-+&H<_Bo(OeUnPzTJ-JMf3?HzfHo&e{&tMkZ4>gRvp9P4Se;HM`uv@g zs4v8k88(}dCfnO|!4hG75L zYyRt+h8}ucAy!}4If4_@2r-pL71_z7L`bjVtsHc@OUvQr-8RH6$ z@St7|5O}})9l5!3PVR3T%Ni{2Cs%pru_OeD5qe{1-ZOR$N@m(Dg3uU4=)7z~1g^VS z8t#Grdx-?ttGTP+CE_0hJFQA$}$h5Wd> zg)^a@pIAo!eli~i1u_*mFf3nuzL4gvks>~x`bRB3CjgrP$AbS%F8pjXqLSzx;Z#_E zletTTN6g5F;Y*MmYTkH3HREx@5JX^Wezlz^H0~e26cubn3;oSQyTC0u?Uc(Rr1m;r zMDu5M3KZ+@HLor(L$Q!Ka5wCvu+SWQxHZ7gFt~ClfN!}cCVZ7?Z< zsf$bC5^szSxn>PHmyMsn8XQvCoK`6nl!)ij*chC0cnglH8j0|!cf~6`BZK+p&!1+M zh$O}3UU-=ZGB*zSYYmtC)}RAEu>&CuE^nZpGt@oaJ35VnjB~>`)Qfp?iWoby7|Jc9 z>)4ih@as?5ez-VbQpsjjR^t(ep4U!1e)dc|AmA!HJA2>2K-%n$27=e&ogK@s1=v-J z^gQQDeBF+a9m&ci)@N@qyZkDR9pW7}1P2vI{n5w%Wmi80(wCynd#V@%_L@eV3Ar}! zTIK4s9x__+oHCnpj%KM_L^+CnBT=MUNeV7~a+3hNNM+gBIfN4UjCwuxEn_X}RnO%6 zEg&!^=ES(ij9$fj?YP`854FhH*pQkUwTrYoQJ>doTeu`7VffWZyi-W+gB1rZ46u3oL%$B^Y?9n6@MKp>&`vp0ENTC$I@{EJFKQ*8$ zOEB<6*ptsl?Rbe9%!C$IXR5si8GG4jhAfPt_(g|#J}-@NMr?^ zot@Xo@W&6PjjU-N1ehg4@T5UUOL62(3C-0r$A8UESirq5RuX`dA==*6J zV5ATqCtr!B;1)fk0w`U?Sjf)VuNcbdw=66J+Z!UL44YB@Eooer-}H15w|dhAHb!G$ zPSVIc;#Goh$p*(C4?K+Fi=!GmJ~#{7jlIRGa9YphsfcP$!g7%`EP~>UtP?I}PW#H7 zlg~P&S9%Fg@OpjKsK5Y$?qzjNHwB}fXpw4~iMK(+9`+{#ur#^PZ%|K3jUi?$;rFJw zM2%_2&dB8+F0C9&E}UZJ+ZUegW;H5IHx=HTPEGyP)QRq-JSKES!K;q|;EyE=U-fD+ zF?)|zl%IcRbOthK2Y}L^f$cIVccDG0dNN2is%zC*We+-XrCuPa2pa)k{<;P#6X+L# zDd$bKFWEIUHe|(A3WF66Nn258h%=>~7b3_bS8wq9e}4&VMq^h<$JnqSZ)Bn=wG>!PX&;#-N`&Ng~lMLonJ< z)crVCrx*qzK0$grt~v zp*7}ow@5GyXRb9erHpbE2EVklw4|_LlTK{I3K1Z4k~U!6whPDHT^7FLk(`jUb}CZr z?nn>)UHcZyx6t%^`yhDY*2vfSQ>}&A)+hMMs&Tngx25YRxU`UDrXPj$X!nqC2i*62 znk&C0cR~{qP6K`SX=y^FY`1w+Bcnk=oOm=repC@Dg@a*6blSc;+LQB(irR>Tu5u0f z^+D`gcY=tP+2E@tJnb}4yuXE&FlVV1p}!DfdVG}=+7|wg8}_F<9KL5oJ3ljo{N)ui zz^hxM;N!JFvvo5D;*_=YBsMwb#+Fihq*gS+V3oqKHHdNZS3!3(ryxdgU<_A=&jSZ< z(F~c?Mlt8AEzxB0cu#?Wi+!{ctsjYG&XqxWLFhAxlf@Ayt@FdP@S+}3klQ?8(K-0I!A9Up>D|gOowG#8*o%`taLSeDiM$E%G}z>z9hn}MruRM z_!W@V){wDXVzamB_XGlh15n6_zthPJzt$KpfbK1Av*kZ=X#X8w_$YAokSO@%-Di0P z$0B3vNmGaiJG(5bVBW~VS~JcJdeh82F;m&a(s|5w7H1uJ9Vo7UrGQ1wmI3!hEgn>> zZZ25WKP~@=t@#25Uq2jCmHqkl<_D3|=XmUFp4h{dP@cF;PWKl|=g~;b-`>LeRJ#gU zR?XPYo2sDNP^wq0N}V;{@YKr0LyQ?Qt; zAv~2jHN3}KiGOwUq~G1Lk_%6|hOH2KdPg;c4W2vN&*)2-;J`dmTHy@Dl8`J&PXG@Bno75|WaQdt1wf)zu8`lJ_mNhrlFt zPWHiDUkPo8nLC}(rnn+aB(BiP3%Z$8P;eAXZERx;tZGjjKYsl2lP8C3DJQRcrxz4R zpXv6 zo7)+re2WhMHrw$@5kc|!0>e&jFT%h`VD9^8R#DZjt8TTg1{bxht%X5z`MgWEG9@Ji zAkBT}NCIP?=VOuAW(fq_mC-?_FLhqV{xh>IY*)h^V~ z<6UoJ-p)fJt)`^{!8~a8e$;ff6Yfo?2sb9r;|5}(hCdaE>ihc%A)<$hjQfGfNvjNsSB}Y zawt|3U#~%{;^S@u>O4A$T))WGhR$@Sf&JdQ0O=>Pw(OcbPqm{JTl$ij)S#2Ick2q_ z=2|B6mR-2QhW6s+3)HqC1ll!o=DjG<(KQ{%v!bxtP?iYC8w4N9M32%W;RGIPs3%9hI@)oRVpl74&^_*pDSTe~May#uqob51sP;Hh&QBz%hTs*kg!o;N!Xz5a&*@g-R?bz*66-Mnj zCbrLSKApSP5l6E}>=DMO?~mnf@2bd(uptM73TJv}UpUr~_T4A~Bs*0Wg(-<+Xs@FK zmx(uzy_X3B)>muSo|5%#s+l4*Zaw%$dUcR(ULjLAK>b?oUEAVs&@CA&kzt*d+(c+F zM@qS!ziWz^eUUme^W9j(;BWV15OqW`fYWB(PP5KSp2P5gF>3F|0QK5INfbX0Ps8Z! z)&?GAo)TBTZC*LZU^Ci2=Et;r&8}Ehy*Rhi3;!pHea;>S-u3?%i2pkt`(L$XradBB z<>!4bvT&rg@HlE&7@snGr&O<391Ik6w3}duPOj807S`u7t!Y$=0MF$A>RwB5#qDtO zW}XJq(}tEWedO3xUjbnK8`MkMm-8TZS5bjg+7}?v>{FpU=M20}agj;+*8p=5C%zSxM{A{y}{}lVqewUtJ8@Ap7GZu3!y}8h|Mh`5FYdl@B{g z6*Ry3y9w@jPyv((0j4S+Sa{6UoVDFyf~kN>Bs=-4Rgv31Xew;K%SYJtJD&mqD=IF7 zCONgB;Qhh;Fp!aZgXrgrnX#wivCl@7qEJ+^%NV3IV59X@R>E3=;pj3~o2Pn!Tp&80 ztTqXsaR=18LI)RrFMrR{J6OD+(RiYZSrx~))Zie;iJq8sh9ne;=*m=jq^s)-lKY^D zyM`qzKk8vlQaRkyru62uuels z`Tki&8J6yZ-JI9Nvp`thOlR%ChJs^Jqz;?sKzFV1y1lBUj3uRW>1Xq4qPakmRWR6h zFv>3vWVFG&p^UlI9tDbtuZsZSa$%j2N_R)woYhLz%1Blf@zZ?(qD#DjX`(9(cmz_ zcEVAsa4qEFN17zh0VkKDPpFX_@r-*!b#rU{s!?k8#f=qRrS%!lC!01|EnO^>dI@E4$vR)PO zyJ}^PaiYdKUzJWFU7sgG3F;O*m2WAAEkJW9YVF)$j-53R~uHFhlef&h*6jO@NrnHGFWI14 zzEm;x?uJ8DsqtIN1@VU)hh%{fC!N_t(&bj_V!0ufM>fBV+)jT9CCazK~ZwNQh}f~c>n(W<7X81z?(or ztEt5croivDqo1mLK%j1E&W`e4E8UkokTt4vCL9;1Xa@lF`pk|vcuLuB2VD1+LOHV% zTB3e)QBM?ySnTbv-~^>}5vvt`h`C@VuFs37%#HCYKRVL-?$pclpuiX8gOfGH0#K8r z0{C7f(xL{FwThX`D_Q&C3+LweGQ+B%02r26tyGKwfHZ8E9k7|{9DC862!A&DGh!^+ zxpb=t23FehyMmgp<>Zt@X-9reNQe?*a`eOesKJ`dqBjNe=3|gTJHTjhSALMBr*RNxqv&M=SE*0@G_#T4 ze}1Kn^!0{}9lD$K!uH~@v8AMfh7Y70wq!~ZjKls|%dwz+;V+wVI=J#Ey5L^Tk&aQ? zi}%3lMD58yOn;Ga2kz1yXyKN-#mg3xX&0~JpVIDOuO}DQrCW80Fn|x{MCQz6;!G+! zH|F?yA4?(!D4B@1&juPyAUg3#+-|>(DmV4!4a=8Tn3>*tXGFg3MPNbP*psk)@HEKr zcvWhG4q5F`c$?IBvR`JC(&mk8ZNQQyt$_L(eE{_0ZtZMlFOm~!VriJSzRU{X+OPWc zMgRaH@Pb%K8DF%#3sDMRT{IXZh5i1}$Cgs|#A;z4R6fI6 z=t}m~!6QvS7y0iEZc>ah4!#aTp&VeZRYrH)?ZE69e1cC5qO<1R_hLgoHU{xS{>pND z>QaQQemeHon03_OxJqS2;G%?9*1Tn|T;PNrGVe5l@>O)ZoT3QRyZN?~gDSa@Xg${z%6s#sLMwa-eH#!>jxrF%4BOW)xh;RTEX0 zOx3`-$GEuG)%1fJs|Z|8w*mVcd3}KM`<=h@K_gd~ssswlsfavsgeQJQ*#XT1tUp@$ zY~h7Cu#{qa{{R!Jhjc-M`M=={{JYuvZ-5z5AD|eJtwT&2xwhlR&0|ObQ4ooO42uoj za>ALjZ*QR4ZGIA;m4GT=aT23f9z6>4FtR=6(O*wx&~n7Adg5f=DVKGteWNNU#y+c{ z+AK89V@G+hvBfii{OH>v{JP;~HXw7xX95@mt&>SaZaj*u#hYcAc<5 zhLk7NvMTUe=7^H1+PGYx($707IMDb7{c7B|1=kaCA4$81T-c}tjc&J;Wv0ieggn~2 zbLK<0%7g(pjYM|cB;nUrdgqa)71&#p%^z0g4+krB`eVlymUEYA&z#9>Wk$a;oc1Ba zm67R4*WMEb6VaJe8gi*n=1eSfr!+^?WCAVgby4;g3E%f=6-PJrr7c^t7*#@;(e!|; zS46ds?spN|YXT}KUYda6QBmLaxdU%Z3<)=t!3B3~F-rnu<>G-Ez*MFe&B%aIfKYB+TAK#dH@f;`jfL^~`j;9|FmuhLWs{Npjs9U{Z z7|~1LMAEXi*ivL{OuEXVUD@Ju^O;@1s-}8E>??h>o2hQ4f(Lr*VE-X*$!Do>XL4&FF+I$?eq%1N+Pww*Xn#w4+lQ^O4t2p&y}nr0-iKZcoVwLV-NADSsiz+2 zD&XG1BOzer`QpXPudcGp&RioX!FPX!sQ&nop~MTUcXk!2Ug(Ys0tp??I}mO-NRiMK zte$C`iH?OC5-D7&?B7_RxjAOWXBZ={rK9N#(9|mG_E`B1tRP11wo4eHe*n<9S!9GEH?J?H`T}>yY`h`D{i;bvV!gs+9*FKzuz3&Fz+S&zrH_q{J~#R1QP7Jd^XHth2q|d4Jr$!pot?ef z$@{s&1I`R-Y$Xl>%<%z8LqX^IQa&owZ zQBZP#f@6=MA|aTgCGm>;S3EuUt4yB3(W9W^yghD#v;1Sr0tU7y_`rK5&m_LuLz6Xx zQD&EqJ!H};m%npXoRyhZJX`R%9`Z@=ihiCfS0v+s60>@*G^y9_NCb=?$Cb`S3L7IiuhDVT3TKADG$?M0^Wr ze~^2>MFJ5Z{RhB~@*3FI6FrEL|DP}IZeW5#OIthl*BB>Tt;;^0SrGJ?QuCkx6bt}B z9iW)LaC3FP!?Z3AMt(<$dVkRIGnS`8@9R#|YdU}y&eTBffIsiOJaB9Pz{l{e@|Tx4 z!*C~RuE6xWpx!+SuR-jby=8UP&oOJbj%xp7 z`H}AFP+FC;uEP#p!3b#JS{-!9F83fedu(W)v0Num8iT1GrwVJ~#SQ1biLFEBy{=qd z=sy$dO)k%0V^>|J+h*OeudPd%N)zKC#TzVb<^nE%)LYES{9(+~Z|*PCjdh!C?cYx5 z#6VYlYVGDZeOJH!<>R{?CKr21vtos59JEC$=D?TVlc&66;}zekQYo}}H z=FQVGxnMcZ6@%5MnY`-`1N>wd`mj}Oy9051`ny4lHYvRzc9o(X)3HjKjJXX(z=V+( z76%mrv4ziVn_nl}%iig>-vII7ALS7)#xi-_m#!}tAHUM6gnSNbF#NFGU^Z_qAuOcv z-ZS}i@Pm+#{c+?n7AVy`^Ae<&H-28#=BlTPTD59Y699(GC;7Cs50bxUqanN zu{^xnf<%&01b+@I<#zXKv;{RXsf(RF*HIASQbk8F%-~EuV*FOWY3UtsP10`31s|AlV8u zhu40#TV{as{=kIcSykUl2LY!j+2(ZbN9>7%R8Og!FXi^(#k)!G=<9DXLdQEyoR{v# zP>Dl)hHr}!Xy?N3Z#*Vfer8f-?YxsdW<ZD*vVgYF4*5t zIa~Bu=o#boP#e}&O1;w7bgPW?=0lbglbX{GebeQ66VGNtc3Z5f(%uge&Bm zO;I7(jYIG?6%^zC{hk1q{s7)#*J7+dwlKF4=o|zTg%`P)KB|1%lR{T-kbV z1=jy2yz%dsmY)7d$&y$3RGjesQUvJq?po7;lwqsiX21GBIg53n-sTR2D<`7P!#in( z!$!eef!*z;HwhGt$YYLJ(coNNs%4C5Hw2l2v!&&N$0}kPL=vy8t_R>3`y_I@EBDQQ zG_*0gXCGyE=;YnSta&^hdB(x27LI4Z06AUD(A2TDmJ@l>mM_uf)FOZQ&}=`_EtzasmTj$aX#)3@31BS{55>YuS; z1~a9rA^?l^#k;dTS6Fd09JF0TndKyQx-s8fjkWsWRs86WSJB>yAuo&I?>-eJy(3pI z)a{x+)arlmfU12PO%kakE9g^5w|A|nn%Kh`kT4k}vGmj@meH8pXnV!_pyW& zHra5i_%qo0)}S?-zIMb@?OHscc7X5w05#$^Xsu1&VaUyWSbq^gVH|l#WT6)lP&Ln^ zd!pguk3s!ao*amO5;B8>H5W-fUMEia6!XdCV=|L*}JSP)(`lY~Feic08P3@98m& z9iUIDC4lu?964*sn}IJg^}v$f`}JNWw^&f^tr=1dIniG~bjqQh>btyT+%-(p6kooYNCCgOw+XbFM7Eh(aCs!lw5A zm}IY}t9t!6Y7@bHHWvPb%#K``?^4t#B$e$&eYt@CbK5frX{|U*Xc#evr|(c>n|fSX zi#Lb*ZRgXidO#m)iTS#j_3WMb`lX8n$P@k|@75?WBD?-veTluj2Mjh~4-x{_y$xRX zG6<4$r&uw_onPsP9YIWMo)O@z3pl&l%b<}Y1n1b?LXxjFk+Ie1cef%P$pST0L9GL9 zfsuQhVa#)^VL!oefqkc4VZ|8zWa};asPGFpscmSxH-3x zjXfWM9cK8G&nY64bdZW5ar-*{=RnC~Z6^-dbd``wNurk+`eIgB4geCc44~ppAH!#E znl@ggZN|RJS7nWb)$o{`n*)KZZ*JNNzk2CNz3=hP>J`QGZTT1aEC0@KL7A){eyOE_ zVBq!vnH_x2@&tWOopgw_(t%QA+|B*coq=nr9AkPRTea0V?^VkHfQ563HwvlD7F}qN zw-EyoBG*)cQ2T)hur-mhQa;(5jm9T=;&V!8X*Jlq%rW_4#dO9 zi?A_A&6!#oO4^fcF#%-B{R`aa-Vh?ujhT_*f!TeOqzXzYkJ$o8@1VkNwhiCVxs!4U z`4eZ|0={TejMl_IPco8(IUGLhPlc7UYodFHDIqk&;L*bZn+5cClXa7kGTOw6hTyVZ z{ZUD4aQHx!{#Eb%%dwT#mskxp*JfKg9h=!bl*_InvE`A2n1T}C_YRBFQqR5njGnH@ zzp4H)MQP01U0BM%`%ay^u{dNlAMoxw8a{1%1c7{C$~){p#i<6h+1xp-+riTS&Q8ec zNrt4f0&FKQzbq)*k9z9Ch-SNBCe(ke5>29ubBeI+ceqKlbNMnshB$l{Z`{X2+EYt2sLZq;FZhFUxU;ny=x1_j#z4FLrecwsJy^pV=5cw63XKH&< zw|ViVoJd&Y&uhMz&I3gSi@Q5TPTG$iW$n#lds#(y`;UQT^C#pr&OKqZR=H~-nURTKyy)9R}vjHRdmWTBFs-GPVaQXwGN{LYaD^>8`Y51Nw!}t4!$y zHU3O&c>ag0K^xukwbu`(?eiyekL!`!i{1?0&>j8uzeR?7OB}2cchX=vbC$!OhyM}H zNER&;bFga#O_m9|O2~FTxb(Nw=1rSewu6NY&Z^C`WxO-PcwaxyUNxAk+Ty;sPx`5Q zEjWuGVHP7BH7nub)CJFl9VZb z@9P${8KtPG%oj*q7P&-^nNnBsB;=3N3~?fTHMBoVv=^>Ne$REz9nZH%!~yXp^+m`^ z5hfDZK(ldprcIGb`#0+>7}2kSluJbe&~X(3u1F*KWywxx47UHq!rteLvDy4`^#2OENRR zko8aiNZGasc>!~}t-XEFTIa8a4)I#2?pn4^L$y2FByG;79RpcZ>0e?9sL*G>0{iOO zz`U~HStfU4uvi-H)ww|Js1u#{*=3Q1Z=)R^T8EdqjXKROrehdfi zdeYhwsnAwl&KUzat2AM7;e`0g7W&}4cEl^af{9ktp)+TdLg7?8%9UlkOz3C;f;!J8 zY8dSCuH{N$foIBzDa9w++I#2S&&%B>Zqbv)l|Q-r3o>MQwAu}XhIVg$3j22U)H&OY zCHW${Okh-ns*sMheU`mJNJ6MlL)5WEPO-B}M#wnMOFU3upGQB0mnS}KF!h-Hi3UXQ zV5+wEqiGKbv0$Ty%Tpc_JdyEW^TjlL1mLC?722)~wq8mqIP^j69r#1WRy+551!KGT z8SuW{J%gydy_I7MAUlrdMw?0yH~9TOZuQm>*GNc+CL6V`$kSjKS;c=gUcM=7{s6KDEx;!60Nh#Y~GV3gE~^x7xIbw|)ZkIx%9W$WKfF zlURk@Uu5`vcz5HMrjEJy&&$8v3*5&^C&npcF|leM(M-hn5tJ*QrLPiU`}w7zc+*qO*aKiEm|3L6->H#;|%R#S62 zGc(hy)=O4ON(xYUH6f;8K@*(cZ}n9xmC%XXiH~=F{*G&i|Hj=qGNF3!$ZX-KNzvpl?$jhiz%oJ!NYu zNHTi&&zM4EAV1TQ6VVVrN5{sS;HukyMYY!i0CwBQf@f}IKffr=1#%u13Yl9?0Q07W zAGt>B`&1whgdyG_gw?%dSdN~41p>I~H8nNapKTDlQHhnxo9C7uR7b1=niVNjiYkLCA~VRh#t+f!XTuj+&njpJEM-I>9wmN~`r+xtILp=g`oJ z?XtF+zy9Vn4twSiO)DK9Dl%%7sd$hrzeD>jmlm|~G*oG_w7zgIc$gLRNJ|70k$p30U{hu$?y{$jcqIdGSQl13?NG zdFW|%;Sv0W>WNsEV*7`YAUiUR1_Sp7ep?wXnS#NuEs&3#86+{-V7Vkdvt0bK+;P&n z;nKuwh)r}1g$wTZi}b1WSH1Vox>x0^uE&W#2DdCLolS@-cfrvyD4>YQCxs#l5`(}` zsu+E@ts%#DWL@OGy71R3w~{ywU!_)*2nyVWF{VjfcB^fv^96VAfiVNfV^dAiKOmkI z7IIp_jD(yR9)p!A~a`!N>%XDA5SLBz*`xl=Kq zKaz3}L#cbu?_SI9F4Mn+olLE)j)FS?(7iZ<_ZK5<h;pc-h3J+Occq2 zqi|Pq58PyuM+Sr2n3%M}!on`kQi`Yd=@CjTsv=AlJYH!_zbi7iMa= z1ALDpR<||8Ct&@4J`JI;d^p5$0*L1J!tiLvD2S>ab-D_(usBT-Dyr;K43vwNmc+9S zSkmP4m!2=f*ZH+{j!p=Pv{5i+2zG1)kCqeW&%ae32_cX%a|zbQmU!^*7|4EE9S2p5vSNZ5Pa!$E^18v0w zj~6eBdWTkuE)Q={+kw#NfkuNHoeVnK{-LOsP2Pka)V=@S1D*9h`LzFhgVz7Psg88I zJiqK0@#qnwZ2gnKx+!bRbxyWrhYN%qFLPw?N$#}NlE22N=yw#&<60m$I4x<Z-hK7bgAadd(P#@9aa^(e=yex<1=kM}}(5%SU zIU{E2aPv@O%Z)zv60a4DZbUwdfZV3dw&kUDLCJ5=4BOfunODszfatk%OxNEWVE_cx zy^ge@L|6ehu|s^g*0IPLh=Eqex7ah>mi)qKAgG!OghMIe!o@V zv!R&>B6gW0yr)gT^;ty$vjSF`eq}8}4hNZ^uYD%0A`%y!@d|6;BK}X5Aa-S^rBSd&Q#;e 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
Date: Fri, 19 Sep 2025 22:10:54 +0000 Subject: [PATCH 015/109] Automatic changelog for PR #92854 [ci skip] --- html/changelogs/AutoChangeLog-pr-92854.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92854.yml diff --git a/html/changelogs/AutoChangeLog-pr-92854.yml b/html/changelogs/AutoChangeLog-pr-92854.yml new file mode 100644 index 00000000000..de04d2e14b1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92854.yml @@ -0,0 +1,6 @@ +author: "Hatterhat" +delete-after: True +changes: + - balance: "General ammo boxes (not speedloaders, not stripper clips) can no longer multiload into currently loaded magazines (revolver cylinders, internal magazines)." + - balance: "Speedloaders are now a separate type from ammo boxes, and can only multiload into currently loaded magazines e.g. revolver cylinders." + - qol: "Ammo boxes, magazines, and speedloaders now have fancier types for spawning in by admins." \ No newline at end of file From 149ff6f8c313af86fe8ffc273dfb3eec375a2846 Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Sat, 20 Sep 2025 04:19:37 +0530 Subject: [PATCH 016/109] Multitooling pod door controllers now picks from a list & auto generates new IDs (#92494) ## About The Pull Request Using a multitool on a pod door assembly controller now displays a list of doors to choose from instead of typing an ID from `0->100`. You can only control doors that you have either crafted/linked with an assembly controller It can also auto generate a unique ID for you to assemble new doors https://github.com/user-attachments/assets/0918f1e3-1f22-4cde-b20e-0eb8bb6ba953 ## Why It's Good For The Game Having to no longer remember the ID of doors you created cause the game now displays that list for you is very convenient. Also generating new unique IDs without player intervention (which results in errors if you can't remember the door IDs you typed before) is faster as well. Not to mention currently if you have created 100 doors you run out of unique ID's. Now that's no longer the case ## Changelog :cl: qol: Multitooling a pod door controller now picks from a list of doors available for that player(crafted, set via controller) only and can auto generate new IDs for you /:cl: --- code/game/machinery/doors/poddoor.dm | 52 +++++++++++--------- code/modules/assembly/doorcontrol.dm | 57 +++++++++++++++++++--- code/modules/transport/tram/tram_remote.dm | 2 +- 3 files changed, 80 insertions(+), 31 deletions(-) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index b7ae0c9876a..b3804ff010b 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -19,16 +19,22 @@ /// The current deconstruction step var/deconstruction = BLASTDOOR_FINISHED /// The door's ID (used for buttons, etc to control the door) - var/id = 1 + var/id = null /// The sound that plays when the door opens/closes var/animation_sound = 'sound/machines/blastdoor.ogg' var/show_nav_computer_icon = TRUE + ///The mob who crafted this blastdoor + var/datum/weakref/owner /obj/machinery/door/poddoor/Initialize(mapload) . = ..() if(show_nav_computer_icon) AddElement(/datum/element/nav_computer_icon, 'icons/effects/nav_computer_indicators.dmi', "airlock", TRUE) +/obj/machinery/door/poddoor/Destroy() + owner = null + return ..() + /datum/armor/door_poddoor melee = 50 bullet = 100 @@ -46,7 +52,7 @@ if(panel_open) if(deconstruction == BLASTDOOR_FINISHED) . += span_notice("The maintenance panel is opened and the electronics could be pried out.") - . += span_notice("\The [src] could be calibrated to a blast door controller ID with a multitool or a blast door controller.") + . += span_notice("\The [src] could be calibrated to a blast door controller ID with a blast door controller.") else if(deconstruction == BLASTDOOR_NEEDS_ELECTRONICS) . += span_notice("The electronics are missing and there are some wires sticking out.") else if(deconstruction == BLASTDOOR_NEEDS_WIRES) @@ -71,9 +77,6 @@ if(TOOL_SCREWDRIVER) context[SCREENTIP_CONTEXT_LMB] = "Open panel" return CONTEXTUAL_SCREENTIP_SET - if(TOOL_MULTITOOL) - context[SCREENTIP_CONTEXT_LMB] = "Calibrate ID" - return CONTEXTUAL_SCREENTIP_SET if(TOOL_CROWBAR) context[SCREENTIP_CONTEXT_LMB] = "Remove electronics" return CONTEXTUAL_SCREENTIP_SET @@ -84,6 +87,10 @@ context[SCREENTIP_CONTEXT_LMB] = "Disassemble" return CONTEXTUAL_SCREENTIP_SET +/obj/machinery/door/poddoor/on_craft_completion(list/components, datum/crafting_recipe/current_recipe, atom/crafter) + . = ..() + owner = WEAKREF(crafter) + /obj/machinery/door/poddoor/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if(deconstruction == BLASTDOOR_NEEDS_WIRES && istype(tool, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = tool @@ -117,8 +124,22 @@ balloon_alert(user, "open the panel first!") return ITEM_INTERACT_BLOCKING var/obj/item/assembly/control/controller_item = tool + if(controller_item.id == -1) + //collect existing ids + var/list/door_ids = list() + for(var/obj/machinery/door/poddoor/M as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/poddoor)) + if(!M.id || (M.id in door_ids)) + continue + door_ids += "[M.id]" + + //create new id + var/new_id = 0 + while("[new_id]" in door_ids) + new_id += 1 + controller_item.id = "[new_id]" id = controller_item.id - balloon_alert(user, "id changed") + owner = WEAKREF(user) + balloon_alert(user, "id changed to [id]") return ITEM_INTERACT_SUCCESS return NONE @@ -131,24 +152,6 @@ else if (default_deconstruction_screwdriver(user, icon_state, icon_state, tool)) return ITEM_INTERACT_SUCCESS -/obj/machinery/door/poddoor/multitool_act(mob/living/user, obj/item/tool) - . = ..() - if (density) - balloon_alert(user, "open the door first!") - return ITEM_INTERACT_SUCCESS - if (!panel_open) - balloon_alert(user, "open the panel first!") - return ITEM_INTERACT_SUCCESS - if (deconstruction != BLASTDOOR_FINISHED) - return - var/change_id = tgui_input_number(user, "Set the door controllers ID (Current: [id])", "Door Controller ID", isnum(id) ? id : null, 100) - if(!change_id || QDELETED(usr) || QDELETED(src) || !usr.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return - id = change_id - to_chat(user, span_notice("You change the ID to [id].")) - balloon_alert(user, "id changed") - return ITEM_INTERACT_SUCCESS - /obj/machinery/door/poddoor/crowbar_act(mob/living/user, obj/item/tool) . = ..() if(machine_stat & NOPOWER) @@ -166,6 +169,7 @@ if(tool.use_tool(src, user, 10 SECONDS, volume = 50)) new /obj/item/electronics/airlock(loc) id = null + owner = null deconstruction = BLASTDOOR_NEEDS_ELECTRONICS balloon_alert(user, "removed airlock electronics") return ITEM_INTERACT_SUCCESS diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm index 33610283502..3e658d84770 100644 --- a/code/modules/assembly/doorcontrol.dm +++ b/code/modules/assembly/doorcontrol.dm @@ -3,23 +3,68 @@ desc = "A small electronic device able to control a blast door remotely." icon_state = "control" /// The ID of the blast door electronics to match to the ID of the blast door being used. - var/id = null + var/id = -1 /// Cooldown of the door's controller. Updates when pressed (activate()) var/cooldown = FALSE + /// Should we toggle open/close of doors based on their current state var/sync_doors = TRUE +/obj/item/assembly/control/Initialize(mapload) + . = ..() + register_context() + +/obj/item/assembly/control/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = NONE + if(istype(held_item, /obj/item/assembly/control)) + context[SCREENTIP_CONTEXT_LMB] = "Copy ID" + return CONTEXTUAL_SCREENTIP_SET + /obj/item/assembly/control/examine(mob/user) . = ..() if(id) - . += span_notice("Its channel ID is '[id]'.") + if(id != -1) + . += span_notice("Its channel ID is '[id]'.") + else + . += span_notice("Interact with pod door to generate an new id") + . += span_notice("You can interact with another controller to copy its ID.") /obj/item/assembly/control/multitool_act(mob/living/user) - var/change_id = tgui_input_number(user, "Set the door controllers ID", "Door ID", id, 100) - if(!change_id || QDELETED(user) || QDELETED(src) || !usr.can_perform_action(src, FORBID_TELEKINESIS_REACH)) + var/list/door_ids = list() + var/list/display_ids = list("UNIQUE") + for(var/obj/machinery/door/poddoor/M as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/poddoor)) + if(!M.id || (M.id in door_ids)) + continue + door_ids += "[M.id]" + if(M.owner?.resolve() != user) + continue + var/area/door_area = get_area(M) + display_ids += "[door_area.name]([M.id])" + + var/change_id = tgui_input_list(user, "Set Controller ID", "Controller ID", display_ids) + if(!change_id || QDELETED(user) || QDELETED(src) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) return - id = change_id + + if(change_id == "UNIQUE") + id = -1 + else + var/start = findtext(change_id, "(") + 1 + var/end = length(change_id) - 1 + if(start == end) + id = "[change_id[start]]" + else + id = copytext(change_id, start, end) balloon_alert(user, "id changed") - to_chat(user, span_notice("You change the ID to [id].")) + if(id != -1) + to_chat(user, span_notice("You change the ID to [id].")) + else + to_chat(user, span_notice("You now must interact with an pod door to generate an unique ID.")) + +/obj/item/assembly/control/interact_with_atom(obj/item/assembly/control/interacting_with, mob/living/user, list/modifiers) + . = NONE + if(istype(interacting_with)) + id = interacting_with.id + balloon_alert(user, "id changed") + return ITEM_INTERACT_SUCCESS /obj/item/assembly/control/activate() var/openclose diff --git a/code/modules/transport/tram/tram_remote.dm b/code/modules/transport/tram/tram_remote.dm index 65c2cff8727..789a4f3cd47 100644 --- a/code/modules/transport/tram/tram_remote.dm +++ b/code/modules/transport/tram/tram_remote.dm @@ -17,9 +17,9 @@ if(!id_tag) id_tag = assign_random_name() SStransport.hello(src, name, id_tag) - register_context() /obj/item/assembly/control/transport/remote/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = NONE if(!specific_transport_id) context[SCREENTIP_CONTEXT_LMB] = "Link tram" return CONTEXTUAL_SCREENTIP_SET From c75d8ef6415d560c611a9e7df69711dc345d0aa7 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 22:49:55 +0000 Subject: [PATCH 017/109] Automatic changelog for PR #92494 [ci skip] --- html/changelogs/AutoChangeLog-pr-92494.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92494.yml diff --git a/html/changelogs/AutoChangeLog-pr-92494.yml b/html/changelogs/AutoChangeLog-pr-92494.yml new file mode 100644 index 00000000000..e4650c7d178 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92494.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - qol: " Multitooling a pod door controller now picks from a list of doors available for that player(crafted, set via controller) only and can auto generate new IDs for you" \ No newline at end of file From c4193d6a511f978ce5262d55fd6e7dd506819a31 Mon Sep 17 00:00:00 2001 From: Cursor <102828457+theselfish@users.noreply.github.com> Date: Fri, 19 Sep 2025 23:52:19 +0100 Subject: [PATCH 018/109] Capitalizes HDD in Server opening (#93014) ## About The Pull Request Title. ## Why It's Good For The Game I think lowercase looks bad. image image It's an initialisation. It gets capitalized. ## Changelog :cl: spellcheck: HDD has been properly capitalised in the server robbery thing. /:cl: --- code/modules/research/server.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 70c37d3d066..2c591e0fe11 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -146,13 +146,13 @@ if(HDD_PANEL_CLOSED) . += "The front panel is closed. You can see some recesses which may have screws." if(HDD_PANEL_OPEN) - . += "The front panel is dangling open. The hdd is in a secure housing. Looks like you'll have to pry it loose." + . += "The front panel is dangling open. The HDD is in a secure housing. Looks like you'll have to pry it loose." if(HDD_PRIED) - . += "The front panel is dangling open. The hdd has been pried from its housing. It is still connected by wires." + . += "The front panel is dangling open. The HDD has been pried from its housing. It is still connected by wires." if(HDD_CUT_LOOSE) . += "The front panel is dangling open. All you can see inside are cut wires and mangled metal." if(HDD_OVERLOADED) - . += "The front panel is dangling open. The hdd inside is destroyed and the wires are all burned." + . += "The front panel is dangling open. The HDD inside is destroyed and the wires are all burned." /obj/machinery/rnd/server/master/tool_act(mob/living/user, obj/item/tool, list/modifiers) if(!tool.tool_behaviour) @@ -175,10 +175,10 @@ balloon_alert(user, "you weren't trained to install this!") return TRUE if(HDD_PRIED) - balloon_alert(user, "the hdd housing is completely broken, it won't fit!") + balloon_alert(user, "the HDD housing is completely broken, it won't fit!") return TRUE if(HDD_CUT_LOOSE) - balloon_alert(user, "the hdd housing is completely broken and all the wires are cut!") + balloon_alert(user, "the HDD housing is completely broken and all the wires are cut!") return TRUE if(HDD_OVERLOADED) balloon_alert(user, "the inside is scorched and all the wires are burned!") From c40a7852a29126597906f206c1c116ddfdf5652d Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 22:52:38 +0000 Subject: [PATCH 019/109] Automatic changelog for PR #93014 [ci skip] --- html/changelogs/AutoChangeLog-pr-93014.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93014.yml diff --git a/html/changelogs/AutoChangeLog-pr-93014.yml b/html/changelogs/AutoChangeLog-pr-93014.yml new file mode 100644 index 00000000000..1df1bc97cf7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93014.yml @@ -0,0 +1,4 @@ +author: "theselfish" +delete-after: True +changes: + - spellcheck: "HDD has been properly capitalised in the server robbery thing." \ No newline at end of file From 11a1b27a50f50b721c459f6f5858c8b5a7b2fdf2 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 19 Sep 2025 18:02:01 -0500 Subject: [PATCH 020/109] Honorifics are not taken into account for voice activators (#93022) ## About The Pull Request After refactoring this, I realized that baking honorifics into all voices had side effects Honorifics only needs to be included in voice when speaking, not when, say, storing names for later use ## Changelog :cl: Melbert fix: Honorifics will no longer interfere with voice detectors and similar things /:cl: --- code/game/atom/atom_examine.dm | 11 ++++++++--- code/game/objects/items/toys.dm | 2 +- code/game/say.dm | 19 +++++++++++++------ code/modules/assembly/voice.dm | 2 +- .../mob/living/carbon/human/human_say.dm | 4 ++-- code/modules/mob/living/silicon/ai/ai.dm | 7 +++---- .../modules/mob/living/silicon/silicon_say.dm | 2 +- code/modules/surgery/bodyparts/head.dm | 2 +- 8 files changed, 30 insertions(+), 19 deletions(-) diff --git a/code/game/atom/atom_examine.dm b/code/game/atom/atom_examine.dm index f4bd109240a..6b1a6725667 100644 --- a/code/game/atom/atom_examine.dm +++ b/code/game/atom/atom_examine.dm @@ -162,7 +162,12 @@ /atom/proc/get_name_chaser(mob/user, list/name_chaser = list()) return name_chaser -/// Used by mobs to determine the name for someone wearing a mask, or with a disfigured or missing face. By default just returns the atom's name. add_id_name will control whether or not we append "(as [id_name])". -/// force_real_name will always return real_name and add (as face_name/id_name) if it doesn't match their appearance -/atom/proc/get_visible_name(add_id_name, force_real_name) +/** + * Used by mobs to determine the name for someone wearing a mask, or with a disfigured or missing face. + * By default just returns the atom's name. + * + * * add_id_name - If TRUE, ID information such as honorifics or name (if mismatched) are appended + * * force_real_name - If TRUE, will always return real_name and add (as face_name/id_name) if it doesn't match their appearance + */ +/atom/proc/get_visible_name(add_id_name = TRUE, force_real_name = FALSE) return name diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 4a39fb5f5d2..55a6ba57957 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1453,7 +1453,7 @@ . = ..() AddElement(/datum/element/toy_talk) -/obj/item/toy/dummy/get_voice() +/obj/item/toy/dummy/get_voice(add_id_name) return doll_name /obj/item/toy/seashell diff --git a/code/game/say.dm b/code/game/say.dm index 423a39498f3..9a00c06d3d3 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -319,14 +319,21 @@ GLOBAL_LIST_INIT(freqtospan, list( return "2" return "0" -/// Get what this atom sounds like when speaking -/atom/proc/get_voice() +/** + * Get what this atom sounds like when speaking + * + * * add_id_name - If TRUE, ID information such as honorifics are added into the voice + */ +/atom/proc/get_voice(add_id_name = FALSE) return "[src]" //Returns the atom's name, prepended with 'The' if it's not a proper noun -/// Get what this atom appears like in chat when speaking -/// visible_name - If TRUE, returns the visible name rather than the voice +/** + * Get what this atom appears like in chat when speaking + * + * * visible_name - If TRUE, returns the visible name rather than the voice + */ /atom/proc/get_message_voice(visible_name) - return visible_name ? get_visible_name() : get_voice() + return visible_name ? get_visible_name(add_id_name = TRUE) : get_voice(add_id_name = TRUE) //HACKY VIRTUALSPEAKER STUFF BEYOND THIS POINT //these exist mostly to deal with the AIs hrefs and job stuff. @@ -349,7 +356,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/virtualspeaker) radio = _radio source = M if(istype(M)) - name = radio.anonymize ? "Unknown" : M.get_voice() + name = radio.anonymize ? "Unknown" : M.get_voice(add_id_name = TRUE) verb_say = M.get_default_say_verb() verb_ask = M.verb_ask verb_exclaim = M.verb_exclaim diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 62375dc0643..5427a0d3ab1 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -90,7 +90,7 @@ return FALSE /obj/item/assembly/voice/proc/send_pulse() - visible_message("clicks", visible_message_flags = EMOTE_MESSAGE) + visible_message("clicks.", visible_message_flags = EMOTE_MESSAGE) playsound(src, 'sound/effects/whirthunk.ogg', 30) addtimer(CALLBACK(src, PROC_REF(pulse)), 2 SECONDS) diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index a962b5d33cc..72bc111a880 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -29,7 +29,7 @@ return "gurgles" return tongue.temp_say_mod || tongue.say_mod || ..() -/mob/living/carbon/human/get_voice() +/mob/living/carbon/human/get_voice(add_id_name = FALSE) if(HAS_TRAIT(src, TRAIT_UNKNOWN_VOICE)) return "Unknown" var/id_name = get_id_name("") @@ -37,7 +37,7 @@ return id_name if(override_voice) return override_voice - if(real_name == id_name) // Allows for "Captain John" to have the voice "Captain Join" and not "John" + if(add_id_name && real_name == id_name) // Allows for "Captain John" to have the voice "Captain Join" and not "John" return get_id_name("", honorifics = TRUE) return real_name diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index a0c117593de..2a44c01bed6 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -1092,11 +1092,10 @@ . = ..() .[/datum/job/ai::title] = minutes -/mob/living/silicon/ai/get_voice() - . = ..() - if(ai_voicechanger && ai_voicechanger.changing_voice) +/mob/living/silicon/ai/get_voice(add_id_name) + if(ai_voicechanger?.changing_voice) return ai_voicechanger.say_name - return + return ..() /mob/living/silicon/ai/proc/set_control_disabled(control_disabled) SEND_SIGNAL(src, COMSIG_SILICON_AI_SET_CONTROL_DISABLED, control_disabled) diff --git a/code/modules/mob/living/silicon/silicon_say.dm b/code/modules/mob/living/silicon/silicon_say.dm index c3edff2b94b..b81d44983d6 100644 --- a/code/modules/mob/living/silicon/silicon_say.dm +++ b/code/modules/mob/living/silicon/silicon_say.dm @@ -24,7 +24,7 @@ var/namepart = name // If carbon, use voice to account for voice changers if(iscarbon(src)) - namepart = get_voice() + namepart = get_voice(add_id_name = TRUE) // AI in carbon body should still have its real name var/obj/item/organ/brain/cybernetic/ai/brain = get_organ_slot(ORGAN_SLOT_BRAIN) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 0214198ad8f..79524d43a12 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -210,7 +210,7 @@ . = ..() AddElement(/datum/element/toy_talk) -/obj/item/bodypart/head/get_voice() +/obj/item/bodypart/head/get_voice(add_id_name) return "The head of [real_name]" /obj/item/bodypart/head/update_bodypart_damage_state() From 21d77276f9e087935a8736c5a72c829a087e4869 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 23:02:21 +0000 Subject: [PATCH 021/109] Automatic changelog for PR #93022 [ci skip] --- html/changelogs/AutoChangeLog-pr-93022.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93022.yml diff --git a/html/changelogs/AutoChangeLog-pr-93022.yml b/html/changelogs/AutoChangeLog-pr-93022.yml new file mode 100644 index 00000000000..6d605ce23bb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93022.yml @@ -0,0 +1,4 @@ +author: "Melbert" +delete-after: True +changes: + - bugfix: "Honorifics will no longer interfere with voice detectors and similar things" \ No newline at end of file From 59dac42ec1602648c4ffdf0263f1d6e452b14b33 Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Sat, 20 Sep 2025 05:21:54 +0530 Subject: [PATCH 022/109] Fixes BSOD when clicking table row buttons in controller overview window (#93029) ## About The Pull Request Broken by #92556. `tick_overrun` was not properly renamed to `overtime` in all places ## Changelog :cl: fix: no BSOD when clicking table row buttons in controller overview window /:cl: --- .../tgui/interfaces/ControllerOverview/OverviewSection.tsx | 2 +- .../tgui/interfaces/ControllerOverview/SubsystemDialog.tsx | 4 ++-- tgui/packages/tgui/interfaces/ControllerOverview/index.tsx | 3 +-- tgui/packages/tgui/interfaces/ControllerOverview/types.ts | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tgui/packages/tgui/interfaces/ControllerOverview/OverviewSection.tsx b/tgui/packages/tgui/interfaces/ControllerOverview/OverviewSection.tsx index c8650bd29cd..e15083933a0 100644 --- a/tgui/packages/tgui/interfaces/ControllerOverview/OverviewSection.tsx +++ b/tgui/packages/tgui/interfaces/ControllerOverview/OverviewSection.tsx @@ -17,7 +17,7 @@ export function OverviewSection(props) { let overallOverrun = 0; for (let i = 0; i < subsystems.length; i++) { avgUsage += subsystems[i].usage_per_tick; - overallOverrun += subsystems[i].tick_overrun; + overallOverrun += subsystems[i].overtime; } return ( diff --git a/tgui/packages/tgui/interfaces/ControllerOverview/SubsystemDialog.tsx b/tgui/packages/tgui/interfaces/ControllerOverview/SubsystemDialog.tsx index 7c8b1be6ce1..0212bfecde5 100644 --- a/tgui/packages/tgui/interfaces/ControllerOverview/SubsystemDialog.tsx +++ b/tgui/packages/tgui/interfaces/ControllerOverview/SubsystemDialog.tsx @@ -23,7 +23,7 @@ export function SubsystemDialog(props: Props) { last_fire, name, next_fire, - tick_overrun, + overtime, tick_usage, usage_per_tick, } = subsystem; @@ -54,7 +54,7 @@ export function SubsystemDialog(props: Props) { {usage_per_tick.toFixed(2)}% - {tick_overrun.toFixed(2)}% + {overtime.toFixed(2)}% {initialization_failure_message && ( diff --git a/tgui/packages/tgui/interfaces/ControllerOverview/index.tsx b/tgui/packages/tgui/interfaces/ControllerOverview/index.tsx index 806890ef2c5..264ebe2d368 100644 --- a/tgui/packages/tgui/interfaces/ControllerOverview/index.tsx +++ b/tgui/packages/tgui/interfaces/ControllerOverview/index.tsx @@ -1,9 +1,8 @@ import { useReducer, useState } from 'react'; import { Button, Dropdown, Input, Section, Stack } from 'tgui-core/components'; - import { Window } from '../../layouts'; import { SORTING_TYPES } from './contants'; -import { FilterAction, filterReducer, type FilterState } from './filters'; +import { FilterAction, type FilterState, filterReducer } from './filters'; import { OverviewSection } from './OverviewSection'; import { SubsystemDialog } from './SubsystemDialog'; import { SubsystemViews } from './SubsystemViews'; diff --git a/tgui/packages/tgui/interfaces/ControllerOverview/types.ts b/tgui/packages/tgui/interfaces/ControllerOverview/types.ts index b1ece195d3f..818c8ba38b1 100644 --- a/tgui/packages/tgui/interfaces/ControllerOverview/types.ts +++ b/tgui/packages/tgui/interfaces/ControllerOverview/types.ts @@ -11,7 +11,7 @@ export type SubsystemData = { name: string; next_fire: number; ref: string; - tick_overrun: number; + overtime: number; tick_usage: number; usage_per_tick: number; }; From ccb80574359a785839afe594b0fbfbc5c32408d7 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 23:52:11 +0000 Subject: [PATCH 023/109] Automatic changelog for PR #93029 [ci skip] --- html/changelogs/AutoChangeLog-pr-93029.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93029.yml diff --git a/html/changelogs/AutoChangeLog-pr-93029.yml b/html/changelogs/AutoChangeLog-pr-93029.yml new file mode 100644 index 00000000000..21028b7c0bf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93029.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "no BSOD when clicking table row buttons in controller overview window" \ No newline at end of file From f56811d8dee244cf4071b76ef0944c4d5d58df5a Mon Sep 17 00:00:00 2001 From: SimplyLogan <47579821+loganuk@users.noreply.github.com> Date: Sat, 20 Sep 2025 00:52:53 +0100 Subject: [PATCH 024/109] Fixes unable to place power cables on reinforced catwalk in Lavaland (#93033) image image ## About The Pull Request Great success for #92975 resistance_flags = INDESTRUCTIBLE Prevented cables being placed on that reinforced catwalk Allowed just cables to be placed but the things are still unable to be damaged in testing I also made sure it does not affect regular catwalks | Cannot place cables still | Need to remove cover | |--------|--------| | image | image| ## Why It's Good For The Game - Allows you to fix wire / power issues on Lavaland ## Changelog :cl: fix: Fixes unable to place power cables on reinforced catwalk in Lavaland /:cl: Co-authored-by: loganuk --- code/game/objects/structures/lattice.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 6b84fd10826..d337f600c41 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -154,6 +154,13 @@ desc = "A heavily reinforced catwalk used to build bridges in hostile environments. It doesn't look like anything could make this budge." resistance_flags = INDESTRUCTIBLE +/obj/structure/lattice/catwalk/mining/attackby(obj/item/C, mob/user, list/modifiers, list/attack_modifiers) + // Allow cable placement even though we're indestructible + if(istype(C, /obj/item/stack/cable_coil)) + var/turf/T = get_turf(src) + return T.attackby(C, user) + return ..() + /obj/structure/lattice/catwalk/mining/deconstruction_hints(mob/user) return From 6f8bada518ecce6d1d26525a3c6e45837147e598 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 23:53:11 +0000 Subject: [PATCH 025/109] Automatic changelog for PR #93033 [ci skip] --- html/changelogs/AutoChangeLog-pr-93033.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93033.yml diff --git a/html/changelogs/AutoChangeLog-pr-93033.yml b/html/changelogs/AutoChangeLog-pr-93033.yml new file mode 100644 index 00000000000..5e2ff0134e2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93033.yml @@ -0,0 +1,4 @@ +author: "loganuk" +delete-after: True +changes: + - bugfix: "Fixes unable to place power cables on reinforced catwalk in Lavaland" \ No newline at end of file From 8f7f8a26d2d9f153d1b7a2935c92659d0787957c Mon Sep 17 00:00:00 2001 From: SimplyLogan <47579821+loganuk@users.noreply.github.com> Date: Sat, 20 Sep 2025 00:53:42 +0100 Subject: [PATCH 026/109] Allows health analysers to scan Cyborg MMIs and show a brain (or not) (#93035) ## About The Pull Request Fixes #92892 may not need fixing as looking at the code the feature was only left in for soul But I expanded it a little to work on Cyborgs/MMIs ## Why It's Good For The Game - Preserves soul ## Changelog :cl: fix: Allows health analysers to scan Cyborg MMIs and show a brain (or not) /:cl: --------- Co-authored-by: loganuk --- .../items/devices/scanners/health_analyzer.dm | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index b8e2918734b..90d4d9bcc8f 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -190,7 +190,17 @@ render_list += "Fatigue level: [target.getStaminaLoss()]%.
" else render_list += "Subject appears to be suffering from fatigue.
" - if (!target.get_organ_slot(ORGAN_SLOT_BRAIN)) // kept exclusively for soul purposes + + // Check for brain - both organic (carbon) and synthetic (cyborg MMI) + var/has_brain = FALSE + if(target.get_organ_slot(ORGAN_SLOT_BRAIN)) + has_brain = TRUE + else if(iscyborg(target)) + var/mob/living/silicon/robot/cyborg_target = target + if(cyborg_target.mmi?.brain) + has_brain = TRUE + + if(!has_brain) // kept exclusively for soul purposes render_list += "Subject lacks a brain.
" if(iscarbon(target)) From ce7a2c10654e0744b0c4fbb9e836206a33cc665c Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 23:53:59 +0000 Subject: [PATCH 027/109] Automatic changelog for PR #93035 [ci skip] --- html/changelogs/AutoChangeLog-pr-93035.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93035.yml diff --git a/html/changelogs/AutoChangeLog-pr-93035.yml b/html/changelogs/AutoChangeLog-pr-93035.yml new file mode 100644 index 00000000000..4648232c6b0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93035.yml @@ -0,0 +1,4 @@ +author: "loganuk" +delete-after: True +changes: + - bugfix: "Allows health analysers to scan Cyborg MMIs and show a brain (or not)" \ No newline at end of file From 912daabe187774ef77d430e648950425aac22aa2 Mon Sep 17 00:00:00 2001 From: Y0SH1M4S73R Date: Fri, 19 Sep 2025 19:59:48 -0400 Subject: [PATCH 028/109] Assorted custom shuttle fixes (#93001) ## About The Pull Request This PR makes the following changes to code relevant to shuttle construction. - (Un)welding shuttle engines now only checks if the tool has 1 fuel, which is how much is already used in the process. - Constructed shuttle engines that were built from anchored machine frames start in the wrenched but unwelded state. - Fixes a runtime that occurs when expanding shuttles. - Fixes the incorrect logic in the shuttle blueprint UI responsible for #92986. - Makes several changes to the wording of several functions of the shuttle blueprint UI in the hopes of better conveying what each button does. ## Why It's Good For The Game Fixes #92986, as well as some other issues I may not have found in my brief search. ## Changelog :cl: fix: You no longer need 40 welding fuel to start welding or unwelding shuttle engines, despite only consuming 1. fix: Shuttle engines constructed from anchored machine frames start in the wrenched-but-unwelded state. fix: Expanding custom shuttles from shuttle frames is once again possible without href exploitation. fix: Shuttle expansion now correctly checks for other shuttle docking ports the expanded shuttle's footprint would encroach upon. qol: Tries to make some of the buttons in the custom shuttle UI more indicative of what they actually do. /:cl: --- code/game/shuttle_engines.dm | 5 +++-- .../variants/custom/custom_consoles.dm | 4 +++- .../tgui/interfaces/ShuttleBlueprints.tsx | 16 ++++++++-------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index 35bd07a7f07..7d0a403d3f5 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -46,6 +46,7 @@ /obj/machinery/power/shuttle_engine/on_construction(mob/user) . = ..() if(anchored) + engine_state = ENGINE_WRENCHED connect_to_shuttle(port = SSshuttle.get_containing_shuttle(src)) //connect to a new ship, if needed if(!connected_ship_ref?.resolve()) AddElement(/datum/element/connect_loc, connections) @@ -134,7 +135,7 @@ if(ENGINE_UNWRENCHED) to_chat(user, span_warning("\The [src] needs to be wrenched to the floor!")) if(ENGINE_WRENCHED) - if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5), heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!tool.tool_start_check(user, heat_required = HIGH_TEMPERATURE_REQUIRED)) return TRUE user.visible_message(span_notice("[user.name] starts to weld \the [src] to the floor."), \ @@ -147,7 +148,7 @@ alter_engine_power(engine_power) if(ENGINE_WELDED) - if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5), heat_required = HIGH_TEMPERATURE_REQUIRED)) + if(!tool.tool_start_check(user, heat_required = HIGH_TEMPERATURE_REQUIRED)) return TRUE user.visible_message(span_notice("[user.name] starts to cut \the [src] free from the floor."), \ diff --git a/code/modules/shuttle/mobile_port/variants/custom/custom_consoles.dm b/code/modules/shuttle/mobile_port/variants/custom/custom_consoles.dm index b8a5ddedba0..c28a72c8b23 100644 --- a/code/modules/shuttle/mobile_port/variants/custom/custom_consoles.dm +++ b/code/modules/shuttle/mobile_port/variants/custom/custom_consoles.dm @@ -91,6 +91,8 @@ /obj/machinery/computer/camera_advanced/shuttle_docker/custom/proc/on_shuttle_expanded(obj/docking_port/mobile/source, list/turfs) SIGNAL_HANDLER recalculate_eye_view(source) + var/list/bounds = shuttle_port.return_coords(eyeobj.x - x_offset, eyeobj.y - y_offset, eyeobj.dir) + var/list/overlappers = SSshuttle.get_dock_overlap(bounds[1], bounds[2], bounds[3], bounds[4], eyeobj.z) if(my_port) var/here_x = source.x var/here_y = source.y @@ -122,7 +124,7 @@ target_x += offset_y target_y -= offset_x checked_turf = locate(target_x, target_y, target_z) - if(checkLandingTurf(checked_turf) != SHUTTLE_DOCKER_LANDING_CLEAR) + if(checkLandingTurf(checked_turf, overlappers) != SHUTTLE_DOCKER_LANDING_CLEAR) if(docked) my_port.unregister() my_port.delete_after = TRUE diff --git a/tgui/packages/tgui/interfaces/ShuttleBlueprints.tsx b/tgui/packages/tgui/interfaces/ShuttleBlueprints.tsx index 8c0b2cc6bb3..8cb32617ffe 100644 --- a/tgui/packages/tgui/interfaces/ShuttleBlueprints.tsx +++ b/tgui/packages/tgui/interfaces/ShuttleBlueprints.tsx @@ -320,13 +320,13 @@ const ShuttleConfiguration = () => { tooltip={ onShuttle ? inDefaultArea - ? null - : 'You can only create a new area from the default area.' + ? 'Designate a room within the shuttle as its own area.' + : 'You can only designate a new area from the default area.' : 'You must be on the linked shuttle to do this.' } onClick={() => act('createNewArea', { name: name })} > - Create New Area + Designate New Area @@ -393,14 +393,14 @@ const ShuttleConfiguration = () => { { } onClick={() => act('expandWithFrame')} > - Expand With Shuttle Frame + Expand Shuttle With Connected Frame @@ -455,7 +455,7 @@ const ShuttleConfiguration = () => { } onClick={() => act('releaseArea')} > - Remove Area + Undesignate Area From 3b079398f6240f674cf926b8fd36fd689e91f505 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 00:01:43 +0000 Subject: [PATCH 029/109] Automatic changelog for PR #93001 [ci skip] --- html/changelogs/AutoChangeLog-pr-93001.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93001.yml diff --git a/html/changelogs/AutoChangeLog-pr-93001.yml b/html/changelogs/AutoChangeLog-pr-93001.yml new file mode 100644 index 00000000000..bbe67b834f7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93001.yml @@ -0,0 +1,8 @@ +author: "Y0SH1M4S73R" +delete-after: True +changes: + - bugfix: "You no longer need 40 welding fuel to start welding or unwelding shuttle engines, despite only consuming 1." + - bugfix: "Shuttle engines constructed from anchored machine frames start in the wrenched-but-unwelded state." + - bugfix: "Expanding custom shuttles from shuttle frames is once again possible without href exploitation." + - bugfix: "Shuttle expansion now correctly checks for other shuttle docking ports the expanded shuttle's footprint would encroach upon." + - qol: "Tries to make some of the buttons in the custom shuttle UI more indicative of what they actually do." \ No newline at end of file From 60f91b3beba752fa33fcd4b25e03ca2681e8e5a2 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 00:27:38 +0000 Subject: [PATCH 030/109] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-92494.yml | 4 --- html/changelogs/AutoChangeLog-pr-92854.yml | 6 ---- html/changelogs/AutoChangeLog-pr-93001.yml | 8 ----- html/changelogs/AutoChangeLog-pr-93014.yml | 4 --- html/changelogs/AutoChangeLog-pr-93016.yml | 4 --- html/changelogs/AutoChangeLog-pr-93017.yml | 5 ---- html/changelogs/AutoChangeLog-pr-93022.yml | 4 --- html/changelogs/AutoChangeLog-pr-93029.yml | 4 --- html/changelogs/AutoChangeLog-pr-93033.yml | 4 --- html/changelogs/AutoChangeLog-pr-93035.yml | 4 --- html/changelogs/archive/2025-09.yml | 35 ++++++++++++++++++++++ 11 files changed, 35 insertions(+), 47 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-92494.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92854.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93001.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93014.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93016.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93017.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93022.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93029.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93033.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93035.yml diff --git a/html/changelogs/AutoChangeLog-pr-92494.yml b/html/changelogs/AutoChangeLog-pr-92494.yml deleted file mode 100644 index e4650c7d178..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92494.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - qol: " Multitooling a pod door controller now picks from a list of doors available for that player(crafted, set via controller) only and can auto generate new IDs for you" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92854.yml b/html/changelogs/AutoChangeLog-pr-92854.yml deleted file mode 100644 index de04d2e14b1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92854.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Hatterhat" -delete-after: True -changes: - - balance: "General ammo boxes (not speedloaders, not stripper clips) can no longer multiload into currently loaded magazines (revolver cylinders, internal magazines)." - - balance: "Speedloaders are now a separate type from ammo boxes, and can only multiload into currently loaded magazines e.g. revolver cylinders." - - qol: "Ammo boxes, magazines, and speedloaders now have fancier types for spawning in by admins." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93001.yml b/html/changelogs/AutoChangeLog-pr-93001.yml deleted file mode 100644 index bbe67b834f7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93001.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Y0SH1M4S73R" -delete-after: True -changes: - - bugfix: "You no longer need 40 welding fuel to start welding or unwelding shuttle engines, despite only consuming 1." - - bugfix: "Shuttle engines constructed from anchored machine frames start in the wrenched-but-unwelded state." - - bugfix: "Expanding custom shuttles from shuttle frames is once again possible without href exploitation." - - bugfix: "Shuttle expansion now correctly checks for other shuttle docking ports the expanded shuttle's footprint would encroach upon." - - qol: "Tries to make some of the buttons in the custom shuttle UI more indicative of what they actually do." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93014.yml b/html/changelogs/AutoChangeLog-pr-93014.yml deleted file mode 100644 index 1df1bc97cf7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93014.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "theselfish" -delete-after: True -changes: - - spellcheck: "HDD has been properly capitalised in the server robbery thing." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93016.yml b/html/changelogs/AutoChangeLog-pr-93016.yml deleted file mode 100644 index 8a849bca26c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93016.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Aliceee2ch" -delete-after: True -changes: - - bugfix: "Removed rogue decal in DeltaStation garden" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93017.yml b/html/changelogs/AutoChangeLog-pr-93017.yml deleted file mode 100644 index e73ec8b3d5b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93017.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Aliceee2ch" -delete-after: True -changes: - - bugfix: "Added missing RD computer in RD office (Catwalk)" - - map: "Replaced one of RND consoles on bridge with RD computer (Catwalk)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93022.yml b/html/changelogs/AutoChangeLog-pr-93022.yml deleted file mode 100644 index 6d605ce23bb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93022.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Honorifics will no longer interfere with voice detectors and similar things" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93029.yml b/html/changelogs/AutoChangeLog-pr-93029.yml deleted file mode 100644 index 21028b7c0bf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93029.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "no BSOD when clicking table row buttons in controller overview window" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93033.yml b/html/changelogs/AutoChangeLog-pr-93033.yml deleted file mode 100644 index 5e2ff0134e2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93033.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "loganuk" -delete-after: True -changes: - - bugfix: "Fixes unable to place power cables on reinforced catwalk in Lavaland" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93035.yml b/html/changelogs/AutoChangeLog-pr-93035.yml deleted file mode 100644 index 4648232c6b0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93035.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "loganuk" -delete-after: True -changes: - - bugfix: "Allows health analysers to scan Cyborg MMIs and show a brain (or not)" \ No newline at end of file diff --git a/html/changelogs/archive/2025-09.yml b/html/changelogs/archive/2025-09.yml index d5d01917de6..ea59701518e 100644 --- a/html/changelogs/archive/2025-09.yml +++ b/html/changelogs/archive/2025-09.yml @@ -502,3 +502,38 @@ - bugfix: ore vents should no longer be produce 0 material boulders theselfish: - balance: a ushanka no longer can protect brainy as much as a metal helmet +2025-09-20: + Aliceee2ch: + - bugfix: Removed rogue decal in DeltaStation garden + - bugfix: Added missing RD computer in RD office (Catwalk) + - map: Replaced one of RND consoles on bridge with RD computer (Catwalk) + Hatterhat: + - balance: General ammo boxes (not speedloaders, not stripper clips) can no longer + multiload into currently loaded magazines (revolver cylinders, internal magazines). + - balance: Speedloaders are now a separate type from ammo boxes, and can only multiload + into currently loaded magazines e.g. revolver cylinders. + - qol: Ammo boxes, magazines, and speedloaders now have fancier types for spawning + in by admins. + Melbert: + - bugfix: Honorifics will no longer interfere with voice detectors and similar things + SyncIt21: + - qol: ' Multitooling a pod door controller now picks from a list of doors available + for that player(crafted, set via controller) only and can auto generate new + IDs for you' + - bugfix: no BSOD when clicking table row buttons in controller overview window + Y0SH1M4S73R: + - bugfix: You no longer need 40 welding fuel to start welding or unwelding shuttle + engines, despite only consuming 1. + - bugfix: Shuttle engines constructed from anchored machine frames start in the + wrenched-but-unwelded state. + - bugfix: Expanding custom shuttles from shuttle frames is once again possible without + href exploitation. + - bugfix: Shuttle expansion now correctly checks for other shuttle docking ports + the expanded shuttle's footprint would encroach upon. + - qol: Tries to make some of the buttons in the custom shuttle UI more indicative + of what they actually do. + loganuk: + - bugfix: Fixes unable to place power cables on reinforced catwalk in Lavaland + - bugfix: Allows health analysers to scan Cyborg MMIs and show a brain (or not) + theselfish: + - spellcheck: HDD has been properly capitalised in the server robbery thing. From 0ebdc6335283ec4a9d8c3fe6bf3bf53fdd551c56 Mon Sep 17 00:00:00 2001 From: Pink Date: Fri, 19 Sep 2025 21:12:26 -0500 Subject: [PATCH 031/109] Cyborgs can use intercomms (#93024) ## About The Pull Request Fixes Cyborgs not being able to interact with station intercoms Ai and Humans ## Why It's Good For The Game Seems like a bug no? Silicon Remote interaction should be the same for Ai and Cyborgs. ## Changelog :cl: fix: Intercomms work for Cyborgs /:cl: --- code/game/objects/items/devices/radio/intercom.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index ca8ca44ad2c..fc351719ced 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -102,6 +102,9 @@ /obj/item/radio/intercom/attack_ai(mob/user) interact(user) +/obj/item/radio/intercom/attack_robot(mob/user) + interact(user) + /obj/item/radio/intercom/attack_hand(mob/user, list/modifiers) . = ..() if(.) From 838953ecfac5b8233a1f0a40e5500bdebeaf9c93 Mon Sep 17 00:00:00 2001 From: Leland Kemble <70413276+lelandkemble@users.noreply.github.com> Date: Fri, 19 Sep 2025 22:12:59 -0400 Subject: [PATCH 032/109] Prevent apcs from showing a blue screen when their screen is not visible (#92998) ## About The Pull Request Prevents flicker_hacked_icon() from doing anything unless the apc is closed ## Why It's Good For The Game fixes this https://github.com/user-attachments/assets/f066f98e-65a9-4d02-8a4a-ffc51d565218 ## Changelog :cl: fix: Apcs will no longer bluescreen without a screen /:cl: --- code/modules/power/apc/apc_appearance.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/power/apc/apc_appearance.dm b/code/modules/power/apc/apc_appearance.dm index 41547288a0b..9959c209be8 100644 --- a/code/modules/power/apc/apc_appearance.dm +++ b/code/modules/power/apc/apc_appearance.dm @@ -109,6 +109,8 @@ // Shows a dark-blue interface for a moment. Shouldn't appear on cameras. /obj/machinery/power/apc/proc/flicker_hacked_icon() + if(opened != APC_COVER_CLOSED) + return var/image/hacker_image = image(icon = 'icons/obj/machines/wallmounts.dmi', loc = src, icon_state = "apcemag", layer = FLOAT_LAYER) var/list/mobs_to_show = list() // Collecting mobs the APC can see for this animation, rather than mobs that can see the APC. Important distinction, intended such that mobs on camera / with XRAY cannot see the flicker. From 1a339c33ae30b012e26c6b4c95a3aa9da3181044 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 02:13:08 +0000 Subject: [PATCH 033/109] Automatic changelog for PR #93024 [ci skip] --- html/changelogs/AutoChangeLog-pr-93024.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93024.yml diff --git a/html/changelogs/AutoChangeLog-pr-93024.yml b/html/changelogs/AutoChangeLog-pr-93024.yml new file mode 100644 index 00000000000..6468ff2c35e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93024.yml @@ -0,0 +1,4 @@ +author: "Pink-MB" +delete-after: True +changes: + - bugfix: "Intercomms work for Cyborgs" \ No newline at end of file From a68519dfbd4a5a5027a8dbd1dc3a80aef7b1b255 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 02:13:18 +0000 Subject: [PATCH 034/109] Automatic changelog for PR #92998 [ci skip] --- html/changelogs/AutoChangeLog-pr-92998.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92998.yml diff --git a/html/changelogs/AutoChangeLog-pr-92998.yml b/html/changelogs/AutoChangeLog-pr-92998.yml new file mode 100644 index 00000000000..d8550065dc9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92998.yml @@ -0,0 +1,4 @@ +author: "lelandkemble" +delete-after: True +changes: + - bugfix: "Apcs will no longer bluescreen without a screen" \ No newline at end of file From cdc59c716ea20b49ff9a2f5313f87426101e7583 Mon Sep 17 00:00:00 2001 From: "Bridget (Yaki)" <53800426+YakiAttaki@users.noreply.github.com> Date: Sat, 20 Sep 2025 12:58:00 +1000 Subject: [PATCH 035/109] Stoats can now be picked up and can also breed. (#93027) ## About The Pull Request For a while I've been bugged by the fact you can't pick up stoats. They also couldn't breed, meaning there was a definitive maximum stoats on station and if they all died, tough shit! This fixes that. ## Why It's Good For The Game Makes it so stoats can actually be picked up now! This is good news. Also! Adds stoat kits, which are. VERY adorable.
Baby Soats... Screenshot 2025-09-15 112048 Screenshot 2025-09-15 112053 Screenshot 2025-09-15 112059 Screenshot 2025-09-15 112105
## Proof Of Testing
Screenshots/Videos https://github.com/user-attachments/assets/2c0dae5c-27be-47e6-9450-8967ea1faf80 The main thing needing testing: baby stoats and stoat breeding. Works great! The addition of pickupable stoats was just a few lines of code, that works as expected
## Changelog :cl: add: Added the ability to pick up stoats add: Stoats can now breed! add: Baby stoat mobs are now a thing. Aww, so cute! /:cl: --- code/modules/mob/living/basic/stoats/stoat.dm | 29 ++++++++++++++++++ .../mob/living/basic/stoats/stoat_ai.dm | 21 +++++++++++++ icons/mob/simple/pets.dmi | Bin 93849 -> 89125 bytes 3 files changed, 50 insertions(+) diff --git a/code/modules/mob/living/basic/stoats/stoat.dm b/code/modules/mob/living/basic/stoats/stoat.dm index a401c42d481..25d077dc54b 100644 --- a/code/modules/mob/living/basic/stoats/stoat.dm +++ b/code/modules/mob/living/basic/stoats/stoat.dm @@ -19,6 +19,7 @@ response_help_simple = "pet" verb_say = "chips" verb_ask = "chips curiously" + can_be_held = TRUE verb_exclaim = "chips loudly" verb_yell = "chips loudly" faction = list(FACTION_NEUTRAL) @@ -32,6 +33,8 @@ /datum/pet_command/follow, /datum/pet_command/fetch, ) + //can this mob breed? + var/can_breed = TRUE /mob/living/basic/stoat/Initialize(mapload) . = ..() @@ -45,6 +48,8 @@ ai_controller.set_blackboard_key(BB_BASIC_FOODS, typecacheof(eatable_food)) AddElement(/datum/element/wears_collar) AddComponent(/datum/component/obeys_commands, pet_commands) + if(can_breed) + add_breeding_component() var/static/list/display_emote = list( BB_EMOTE_SAY = list("Chirp chirp chirp!"), @@ -53,3 +58,27 @@ BB_EMOTE_SOUND = list('sound/mobs/non-humanoids/stoat/stoat_sounds.ogg'), ) ai_controller.set_blackboard_key(BB_BASIC_MOB_SPEAK_LINES, display_emote) + +/mob/living/basic/stoat/proc/add_breeding_component() + var/static/list/partner_paths = typecacheof(list(/mob/living/basic/stoat)) + var/static/list/baby_paths = list( + /mob/living/basic/stoat/kit = 100 // Placeholder until we get proper baby stoats + ) + AddComponent(\ + /datum/component/breed,\ + can_breed_with = typecacheof(list(/mob/living/basic/stoat)),\ + baby_paths = baby_paths,\ + ) + +/mob/living/basic/stoat/kit + name = "\improper stoat kit" + real_name = "stoat" + desc = "They're a stoat kit!" + icon_state = "kit_stoat" + icon_living = "kit_stoat" + icon_dead = "kit_stoat_dead" + density = FALSE + pass_flags = PASSMOB + ai_controller = /datum/ai_controller/basic_controller/stoat/kit + mob_size = MOB_SIZE_SMALL + can_breed = FALSE diff --git a/code/modules/mob/living/basic/stoats/stoat_ai.dm b/code/modules/mob/living/basic/stoats/stoat_ai.dm index d592f4cfb36..ecefb0fd93a 100644 --- a/code/modules/mob/living/basic/stoats/stoat_ai.dm +++ b/code/modules/mob/living/basic/stoats/stoat_ai.dm @@ -1,4 +1,25 @@ /datum/ai_controller/basic_controller/stoat + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/of_size/smaller, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_GUILTY_CONSCIOUS_CHANCE = 5, + BB_STEAL_CHANCE = 2, + BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/stoat), + BB_BABIES_CHILD_TYPES = list(/mob/living/basic/stoat/kit), + ) + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/random_speech/blackboard, + /datum/ai_planning_subtree/steal_items, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/make_babies, + ) + +/datum/ai_controller/basic_controller/stoat/kit blackboard = list( BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/of_size/smaller, BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, diff --git a/icons/mob/simple/pets.dmi b/icons/mob/simple/pets.dmi index 3a1f56ede9096726f5fa88251c69836d8325aaba..a760642d7053c17cd36abe1eef9df310523ab90d 100644 GIT binary patch literal 89125 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 N002ovPDHLkV1o3w{3iea literal 93849 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 From 2c4bda5d641fc107e5b629589389c5247c2a64e6 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 02:58:43 +0000 Subject: [PATCH 036/109] Automatic changelog for PR #93027 [ci skip] --- html/changelogs/AutoChangeLog-pr-93027.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93027.yml diff --git a/html/changelogs/AutoChangeLog-pr-93027.yml b/html/changelogs/AutoChangeLog-pr-93027.yml new file mode 100644 index 00000000000..fc6aea35e3f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93027.yml @@ -0,0 +1,6 @@ +author: "YakiAttaki" +delete-after: True +changes: + - rscadd: "Added the ability to pick up stoats" + - rscadd: "Stoats can now breed!" + - rscadd: "Baby stoat mobs are now a thing. Aww, so cute!" \ No newline at end of file From bd1f7911ee5f88c77e7cfd465f2ed0309ca776f5 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sat, 20 Sep 2025 11:50:25 +0200 Subject: [PATCH 037/109] [NO GBP] Fixing issues with sand (#93006) Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> --- code/modules/mining/ores_coins.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 8582a1c3c86..db734992c61 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -107,6 +107,7 @@ singular_name = "sand pile" points = 1 mats_per_unit = list(/datum/material/sand = SHEET_MATERIAL_AMOUNT) + material_type = /datum/material/sand refined_type = /obj/item/stack/sheet/glass w_class = WEIGHT_CLASS_TINY mine_experience = 0 //its sand @@ -123,7 +124,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ AddComponent(/datum/component/storm_hating) /obj/item/stack/ore/glass/on_orm_collection() //we need to smelt the glass beforehand because the silo and orm don't accept sand mats - var/obj/item/stack/sheet/glass = new refined_type(drop_location(), amount) + var/obj/item/stack/sheet/glass = new refined_type(drop_location(), amount, merge = FALSE) //The newly spawned glass should not merge with other stacks on the turf, else it could cause issues. qdel(src) return glass From 55a0cc68fe7584290bd438a3fe3abc681e75e000 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 09:50:44 +0000 Subject: [PATCH 038/109] Automatic changelog for PR #93006 [ci skip] --- html/changelogs/AutoChangeLog-pr-93006.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93006.yml diff --git a/html/changelogs/AutoChangeLog-pr-93006.yml b/html/changelogs/AutoChangeLog-pr-93006.yml new file mode 100644 index 00000000000..3d88bad6b8b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93006.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "You can once again craft custom material stuff like carving blocks and toilets made of sand once again." \ No newline at end of file From 6c02760cf7ea394470e1c9ccfecbcc67412f0b4a Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Sat, 20 Sep 2025 04:52:29 -0500 Subject: [PATCH 039/109] Replaced some OOC IC in feedback messages (#93000) --- code/game/objects/items/rcd/RCD.dm | 4 ++-- code/game/objects/items/rcd/RPLD.dm | 4 ++-- code/modules/mob/living/carbon/alien/adult/alien_powers.dm | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/rcd/RCD.dm b/code/game/objects/items/rcd/RCD.dm index 9098908ef23..8c881dd700b 100644 --- a/code/game/objects/items/rcd/RCD.dm +++ b/code/game/objects/items/rcd/RCD.dm @@ -165,8 +165,8 @@ //check if we can build our window on the grill if(target_turf.is_blocked_turf(exclude_mobs = !is_full_tile, source_atom = null, ignore_atoms = structures_to_ignore, type_list = TRUE)) - playsound(get_turf(user), SFX_TOOL_SWITCH, 20, TRUE) - balloon_alert(user, "something is blocking the turf") + playsound(user, SFX_TOOL_SWITCH, 20, TRUE) + balloon_alert(user, "tile is blocked!") return FALSE /** diff --git a/code/game/objects/items/rcd/RPLD.dm b/code/game/objects/items/rcd/RPLD.dm index bb9e64d5180..043d99125c0 100644 --- a/code/game/objects/items/rcd/RPLD.dm +++ b/code/game/objects/items/rcd/RPLD.dm @@ -199,13 +199,13 @@ var/is_allowed = TRUE if(!checkResource(cost, user) || !(is_allowed = canPlace(destination))) if(!is_allowed) - balloon_alert(user, "turf is blocked!") + balloon_alert(user, "tile is blocked!") return FALSE if(!build_delay(user, cost, target = destination)) return FALSE if(!checkResource(cost, user) || !(is_allowed = canPlace(destination))) if(!is_allowed) - balloon_alert(user, "turf is blocked!") + balloon_alert(user, "tile is blocked!") return FALSE if(!useResource(cost, user)) diff --git a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm index d5bf029f45d..15513e23fac 100644 --- a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm @@ -225,7 +225,7 @@ Doesn't work on other aliens/AI.*/ if(get_dist(owner, target) > 1) return FALSE if(ismob(target)) //If it could corrode mobs, it would one-shot them. - owner.balloon_alert(owner, "doesn't work on mobs!") + owner.balloon_alert(owner, "doesn't work on creatures!") return FALSE return ..() From ac69f60fe40f189e7c66f27ea192f53c2736f4c1 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 09:52:49 +0000 Subject: [PATCH 040/109] Automatic changelog for PR #93000 [ci skip] --- html/changelogs/AutoChangeLog-pr-93000.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93000.yml diff --git a/html/changelogs/AutoChangeLog-pr-93000.yml b/html/changelogs/AutoChangeLog-pr-93000.yml new file mode 100644 index 00000000000..ebbc9d2903a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93000.yml @@ -0,0 +1,4 @@ +author: "Melbert" +delete-after: True +changes: + - spellcheck: "Replaced ooc ic in RCD, RPLD, and alien power feedback" \ No newline at end of file From cd438cf7940340c949f1073fce6e1674304d199c Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Sat, 20 Sep 2025 12:14:43 +0200 Subject: [PATCH 041/109] The direction of your character changes when moving inside a cardboard box (#92985) --- .../objects/structures/crates_lockers/closets/cardboardbox.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 9b07366e546..7773d54e3e4 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -44,7 +44,8 @@ return move_delay = TRUE var/oldloc = loc - try_step_multiz(direction); + try_step_multiz(direction) + user.setDir(dir) if(oldloc != loc) addtimer(CALLBACK(src, PROC_REF(ResetMoveDelay)), CONFIG_GET(number/movedelay/walk_delay) * move_speed_multiplier) else From 7af3eda4a64c9b776c8e6dfe89f2640aefe09845 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 10:15:03 +0000 Subject: [PATCH 042/109] Automatic changelog for PR #92985 [ci skip] --- html/changelogs/AutoChangeLog-pr-92985.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92985.yml diff --git a/html/changelogs/AutoChangeLog-pr-92985.yml b/html/changelogs/AutoChangeLog-pr-92985.yml new file mode 100644 index 00000000000..b9161590db0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92985.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - qol: "The direction of your character changes when moving inside a cardboard box." \ No newline at end of file From 2f2df4308fa69fb0f7368bcc57a6cfa0c1e1c602 Mon Sep 17 00:00:00 2001 From: Leland Kemble <70413276+lelandkemble@users.noreply.github.com> Date: Sat, 20 Sep 2025 06:26:21 -0400 Subject: [PATCH 043/109] Fixes "Can't Rotate!" being repeated infinitely for reflector boxes (#92982) --- code/game/objects/structures/reflector.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 899d3390ddb..ada47e65bc0 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -292,6 +292,7 @@ return if(!can_rotate) user.balloon_alert(user, "can't rotate!") + ui?.close() return ui = SStgui.try_update_ui(user, src, ui) if(!ui) From 413ff51c24c5a5aad25dc54c1cae6826f4c6d2b0 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 10:26:39 +0000 Subject: [PATCH 044/109] Automatic changelog for PR #92982 [ci skip] --- html/changelogs/AutoChangeLog-pr-92982.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92982.yml diff --git a/html/changelogs/AutoChangeLog-pr-92982.yml b/html/changelogs/AutoChangeLog-pr-92982.yml new file mode 100644 index 00000000000..3fd89f1d586 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92982.yml @@ -0,0 +1,4 @@ +author: "lelandkemble" +delete-after: True +changes: + - bugfix: "Locked reflector boxes no longer repeat \"can't rotate\" forever" \ No newline at end of file From 4a618934e98527a732ead11239089f3363f6995d Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Sat, 20 Sep 2025 05:29:40 -0500 Subject: [PATCH 045/109] Removes message arg from Hear, free performance (#93020) ## About The Pull Request The first argument of `Hear` is `message`, the message heard OR SO YOU'D THINK Actually the first argument doesn't do anything but get overridden by ALL implementations of `Hear` No other uses as far as I and Ephe can tell. Removing it makes it a ton easier to understand and gives us some free performance in radio code by not rendering messages twice ## Changelog :cl: Melbert code: Removed some redundant code from core hearing code. Report if you hear anything weird. /:cl: --- .../signals_atom/signals_atom_movable.dm | 19 +++++++++---------- code/datums/brain_damage/imaginary_friend.dm | 7 +++---- code/datums/brain_damage/special.dm | 2 +- code/game/machinery/doors/passworddoor.dm | 2 +- code/game/machinery/hologram.dm | 6 +++--- code/game/machinery/telecomms/broadcasting.dm | 3 +-- .../objects/items/devices/radio/intercom.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 2 +- .../objects/items/devices/taperecorder.dm | 2 +- code/game/say.dm | 4 ++-- code/modules/assembly/voice.dm | 2 +- code/modules/clothing/head/jobs.dm | 2 +- .../mining_loot/megafauna/colossus.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 3 ++- .../modules/mob/dead/observer/observer_say.dm | 4 ++-- .../carbon/human/species_types/dullahan.dm | 5 ++--- code/modules/mob/living/living_say.dm | 9 +++++---- code/modules/mob/living/silicon/ai/ai.dm | 2 +- .../mob/living/silicon/ai/freelook/eye.dm | 4 ++-- code/modules/mob/say_readme.md | 2 +- code/modules/mod/mod_link.dm | 4 ++-- code/modules/unit_tests/say.dm | 5 +---- code/modules/wiremod/components/atom/hear.dm | 2 +- 23 files changed, 45 insertions(+), 50 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm index 75b809b5403..3fbe59a6815 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm @@ -65,16 +65,15 @@ #define COMSIG_MOVABLE_CANCEL_HEARING (1<<0) ///from base of atom/movable/Hear(): (proc args list(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)) #define COMSIG_MOVABLE_HEAR "movable_hear" - #define HEARING_MESSAGE 1 - #define HEARING_SPEAKER 2 - #define HEARING_LANGUAGE 3 - #define HEARING_RAW_MESSAGE 4 - #define HEARING_RADIO_FREQ 5 - #define HEARING_RADIO_FREQ_NAME 6 - #define HEARING_RADIO_FREQ_COLOR 7 - #define HEARING_SPANS 8 - #define HEARING_MESSAGE_MODE 9 - #define HEARING_RANGE 10 + #define HEARING_SPEAKER 1 + #define HEARING_LANGUAGE 2 + #define HEARING_RAW_MESSAGE 3 + #define HEARING_RADIO_FREQ 4 + #define HEARING_RADIO_FREQ_NAME 5 + #define HEARING_RADIO_FREQ_COLOR 6 + #define HEARING_SPANS 7 + #define HEARING_MESSAGE_MODE 8 + #define HEARING_RANGE 9 ///called when space wind can't move a movable. (pressure_difference, pressure_direction) #define COMSIG_MOVABLE_RESISTED_SPACEWIND "movable_resisted_wind" diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 617f590e5fb..42779b5c81a 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -216,7 +216,7 @@ owner.imaginary_group -= src return ..() -/mob/eye/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, freq_name, freq_color, list/spans, list/message_mods = list(), message_range) +/mob/eye/imaginary_friend/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, freq_name, freq_color, list/spans, list/message_mods = list(), message_range) if (safe_read_pref(client, /datum/preference/toggle/enable_runechat) && (safe_read_pref(client, /datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) create_chat_message(speaker, message_language, raw_message, spans) to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, freq_name, freq_color, spans, message_mods)) @@ -257,14 +257,13 @@ log_sayverb_talk(message, message_mods, tag = "imaginary friend", forced_by = forced) var/messagepart = generate_messagepart(message, spans, message_mods) - var/rendered = "[span_name("[name]")] [messagepart]" var/dead_rendered = "[span_name("[name] (Imaginary friend of [owner])")] [messagepart]" var/language = message_language || owner.get_selected_language() - Hear(rendered, src, language, message, null, null, null, spans, message_mods) // We always hear what we say + Hear(src, language, message, null, null, null, spans, message_mods) // We always hear what we say var/group = owner.imaginary_group - src // The people in our group don't, so we have to exclude ourselves not to hear twice for(var/mob/person in group) - person.Hear(null, src, language, message, null, null, null, spans, message_mods, range) + person.Hear(src, language, message, null, null, null, spans, message_mods, range) // Speech bubble, but only for those who have runechat off var/list/speech_bubble_recipients = list() diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index bed2d33626d..b27335ce3fb 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -690,7 +690,7 @@ talk_tuah(pick(hurt_lines)) /datum/brain_trauma/special/axedoration/proc/talk_tuah(sent_message = "Hello World.") - owner.Hear(null, GLOB.bridge_axe, owner.get_selected_language(), sent_message) + owner.Hear(GLOB.bridge_axe, owner.get_selected_language(), sent_message) /datum/brain_trauma/special/axedoration/proc/get_axe_location() if(!GLOB.bridge_axe) diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index cb20b6a44f0..3a7225419b5 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -44,7 +44,7 @@ /obj/machinery/door/password/get_save_vars() return ..() + NAMEOF(src, password) -/obj/machinery/door/password/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/obj/machinery/door/password/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() if(!density || !voice_activated || radio_freq) return diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 84f360f06aa..993372e72e2 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -575,19 +575,19 @@ Possible to do for anyone motivated enough: /*This is the proc for special two-way communication between AI and holopad/people talking near holopad. For the other part of the code, check silicon say.dm. Particularly robot talk.*/ -/obj/machinery/holopad/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/obj/machinery/holopad/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() if(speaker && LAZYLEN(masters) && !radio_freq)//Master is mostly a safety in case lag hits or something. Radio_freq so AIs dont hear holopad stuff through radios. for(var/mob/living/silicon/ai/master in masters) if(masters[master] && speaker != master) - master.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mods) + master.relay_speech(speaker, message_language, raw_message, radio_freq, spans, message_mods) for(var/datum/holocall/holocall_to_update as anything in holo_calls) if(holocall_to_update.connected_holopad == src)//if we answered this call originating from another holopad if(speaker == holocall_to_update.hologram && holocall_to_update.user.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat)) holocall_to_update.user.create_chat_message(speaker, message_language, raw_message, spans) else - holocall_to_update.user.Hear(message, speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods, message_range = INFINITY) + holocall_to_update.user.Hear(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods, message_range = INFINITY) if(outgoing_call?.hologram && speaker == outgoing_call.user) outgoing_call.hologram.say(raw_message, spans = spans, sanitize = FALSE, language = message_language, message_mods = message_mods) diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index 289ac960f8f..53d217f6cb7 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -174,14 +174,13 @@ // Always call this on the virtualspeaker to avoid issues. var/spans = data["spans"] var/list/message_mods = data["mods"] - var/rendered = virt.compose_message(virt, language, message, frequency, data["frequency_name"], data["frequency_color"], spans) for(var/atom/movable/hearer as anything in receive) if(!hearer) stack_trace("null found in the hearers list returned by the spatial grid. this is bad") continue spans -= blacklisted_spans - hearer.Hear(rendered, virt, language, message, frequency, data["frequency_name"], data["frequency_color"], spans, message_mods, message_range = INFINITY) + hearer.Hear(virt, language, message, frequency, data["frequency_name"], data["frequency_color"], spans, message_mods, message_range = INFINITY) // This following recording is intended for research and feedback in the use of department radio channels if(length(receive)) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index fc351719ced..5aa33a87672 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -126,7 +126,7 @@ return TRUE -/obj/item/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/obj/item/radio/intercom/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) if(message_mods[RADIO_EXTENSION] == MODE_INTERCOM) return // Avoid hearing the same thing twice return ..() diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index e092a9334dc..d2d479693f9 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -381,7 +381,7 @@ signal.levels = SSmapping.get_connected_levels(T) signal.broadcast() -/obj/item/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/obj/item/radio/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() if(radio_freq || !broadcasting || get_dist(src, speaker) > canhear_range || message_mods[MODE_RELAY]) return diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index c5160b0d705..149015ce292 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -153,7 +153,7 @@ return ..() -/obj/item/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range) +/obj/item/taperecorder/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range) . = ..() if(message_mods[MODE_RELAY] || !mytape || istype(speaker, /obj/item/taperecorder)) return diff --git a/code/game/say.dm b/code/game/say.dm index 9a00c06d3d3..588e6946477 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -68,7 +68,7 @@ GLOBAL_LIST_INIT(freqtospan, list( /// Called when this movable hears a message from a source. /// Returns TRUE if the message was received and understood. -/atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0) +/atom/movable/proc/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0) SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) return TRUE @@ -119,7 +119,7 @@ GLOBAL_LIST_INIT(freqtospan, list( if(!hearing_movable)//theoretically this should use as anything because it shouldnt be able to get nulls but there are reports that it does. stack_trace("somehow theres a null returned from get_hearers_in_view() in send_speech!") continue - if(hearing_movable.Hear(null, src, message_language, message, null, null, null, spans, message_mods, range)) + if(hearing_movable.Hear(src, message_language, message, null, null, null, spans, message_mods, range)) listened += hearing_movable if(!found_client && length(hearing_movable.client_mobs_in_contents)) found_client = TRUE diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 5427a0d3ab1..ebf9d71a8dd 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -33,7 +33,7 @@ . = ..() . += span_notice("Use a multitool to swap between \"inclusive\", \"exclusive\", \"recognizer\", and \"voice sensor\" mode.") -/obj/item/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/obj/item/assembly/voice/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() if(message_mods[WHISPER_MODE] || message_mods[MODE_RELAY]) //Too quiet lad return FALSE diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index be5c86740c3..061a4c85392 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -292,7 +292,7 @@ var/obj/item/found_item = items_by_regex[found_regex] . += span_notice("[icon2html(found_item, user)] You can remove [found_item] by saying \"[prefix] [found_phrase]\"!") -/obj/item/clothing/head/fedora/inspector_hat/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/obj/item/clothing/head/fedora/inspector_hat/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() var/mob/living/carbon/wearer = loc if(!istype(wearer) || speaker != wearer) //if we are worn diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm index 4215f6c1a53..10c37355495 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm @@ -112,7 +112,7 @@ . += observer_desc . += "It is activated by [activation_method]." -/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range) +/obj/machinery/anomalous_crystal/Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, list/message_mods = list(), message_range) . = ..() if(isliving(speaker)) ActivationReaction(speaker, ACTIVATE_SPEECH) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 151dcfe2d04..968a6090b89 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -146,7 +146,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) show_data_huds() SSpoints_of_interest.make_point_of_interest(src) - ADD_TRAIT(src, TRAIT_HEAR_THROUGH_DARKNESS, ref(src)) + ADD_TRAIT(src, TRAIT_HEAR_THROUGH_DARKNESS, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_GOOD_HEARING, INNATE_TRAIT) /mob/dead/observer/get_photo_description(obj/item/camera/camera) if(!invisibility || camera.see_ghosts) diff --git a/code/modules/mob/dead/observer/observer_say.dm b/code/modules/mob/dead/observer/observer_say.dm index d88271cfe44..2c9c37dd79a 100644 --- a/code/modules/mob/dead/observer/observer_say.dm +++ b/code/modules/mob/dead/observer/observer_say.dm @@ -58,7 +58,7 @@ . = say_dead(message) -/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/mob/dead/observer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() var/atom/movable/to_follow = speaker if(radio_freq) @@ -74,7 +74,7 @@ if (safe_read_pref(client, /datum/preference/toggle/enable_runechat) && (safe_read_pref(client, /datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) create_chat_message(speaker, message_language, raw_message, spans) // Recompose the message, because it's scrambled by default - message = compose_message(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods) + var/message = compose_message(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods) to_chat(src, html = "[link] [message]", avoid_highlighting = speaker == src) diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index 8fb2cb52c68..7375c259243 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -248,10 +248,9 @@ var/obj/item/organ/brain/brain = locate(/obj/item/organ/brain) in detached_head brain.name = "[wearer.name]'s brain" -/obj/item/dullahan_relay/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/obj/item/dullahan_relay/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() - if(owner) - owner.Hear(message, speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods, message_range) + owner?.Hear(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods, message_range) ///Adds the owner to the list of hearers in hearers_in_view(), for visible/hearable on top of say messages /obj/item/dullahan_relay/proc/include_owner(datum/source, list/hearers) diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index d1c35cf77a3..34065f7d2ed 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -259,7 +259,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( return TRUE -/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0) +/mob/living/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range=0) if((SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_HEAR, args) & COMSIG_MOVABLE_CANCEL_HEARING) || !GET_CLIENT(src)) return FALSE @@ -289,13 +289,14 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( else if (!ismob(speaker) && !client?.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs)) use_runechat = FALSE + var/message = "" // if someone is whispering we make an extra type of message that is obfuscated for people out of range // Less than or equal to 0 means normal hearing. More than 0 and less than or equal to EAVESDROP_EXTRA_RANGE means // partial hearing. More than EAVESDROP_EXTRA_RANGE means no hearing. Exception for GOOD_HEARING trait var/dist = get_dist(speaker, src) - message_range - if(dist > 0 && dist <= EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING) && !isobserver(src)) // ghosts can hear all messages clearly + if(dist > 0 && dist <= EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING)) raw_message = stars(raw_message) - if(message_range != INFINITY && dist > EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING) && !isobserver(src)) + if(message_range != INFINITY && dist > EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING)) // Too far away and don't have good hearing, you can't hear anything if(is_blind() || HAS_TRAIT(speaker, TRAIT_INVISIBLE_MAN)) // Can't see them speak either return FALSE @@ -412,7 +413,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( stack_trace("somehow theres a null returned from get_hearers_in_view() in send_speech!") continue - if(listening_movable.Hear(null, src, message_language, message_raw, null, null, null, spans, message_mods, message_range)) + if(listening_movable.Hear(src, message_language, message_raw, null, null, null, spans, message_mods, message_range)) listened += listening_movable //speech bubble diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 2a44c01bed6..27d7ae84459 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -804,7 +804,7 @@ var/list/viewscale = getviewsize(client.view) return get_dist(src, A) <= max(viewscale[1]*0.5,viewscale[2]*0.5) -/mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) +/mob/living/silicon/ai/proc/relay_speech(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) var/raw_translation = translate_language(speaker, message_language, raw_message, spans, message_mods) var/atom/movable/source = speaker.GetSource() || speaker // is the speaker virtual/radio var/treated_message = source.generate_messagepart(raw_translation, spans, message_mods) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index c1741faa121..900ff158ee7 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -219,10 +219,10 @@ acceleration = !acceleration to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].") -/mob/eye/camera/ai/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) +/mob/eye/camera/ai/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), message_range) . = ..() if(relay_speech && speaker && ai && !radio_freq && speaker != ai && GLOB.cameranet.checkCameraVis(speaker)) - ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mods) + ai.relay_speech(speaker, message_language, raw_message, radio_freq, spans, message_mods) /obj/effect/overlay/ai_detect_hud name = "" diff --git a/code/modules/mob/say_readme.md b/code/modules/mob/say_readme.md index e39dfb9fbcf..5f065b9df16 100644 --- a/code/modules/mob/say_readme.md +++ b/code/modules/mob/say_readme.md @@ -67,7 +67,7 @@ global procs Checks that our atom can vocally speak at all. Does not (and should not) include any feedback on its own. - Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mods, message_range) + Hear(atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mods, message_range) This proc handles hearing. What it does varies. For mobs, it treats the message with hearer-specific things like language and deafness, then outputs it to the hearer. diff --git a/code/modules/mod/mod_link.dm b/code/modules/mod/mod_link.dm index 116a3caff8c..1ce9b43337f 100644 --- a/code/modules/mod/mod_link.dm +++ b/code/modules/mod/mod_link.dm @@ -117,7 +117,7 @@ /obj/item/mod/control/proc/delete_link_visual(mob/living/old_user) return delete_link_visual_generic(mod_link, old_user) -/obj/item/mod/control/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range) +/obj/item/mod/control/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range) . = ..() if(speaker != wearer && speaker != ai_assistant) return @@ -296,7 +296,7 @@ old_user.update_worn_neck() return delete_link_visual_generic(mod_link, old_user) -/obj/item/clothing/neck/link_scryer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range) +/obj/item/clothing/neck/link_scryer/Hear(atom/movable/speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range) . = ..() if(speaker != loc) return diff --git a/code/modules/unit_tests/say.dm b/code/modules/unit_tests/say.dm index 6d09fe08715..9b75bf05dc9 100644 --- a/code/modules/unit_tests/say.dm +++ b/code/modules/unit_tests/say.dm @@ -125,9 +125,6 @@ /datum/unit_test/speech/proc/handle_hearing(datum/source, list/hearing_args) SIGNAL_HANDLER - // So it turns out that the `message` arg for COMSIG_MOVABLE_HEAR is super redundant and should probably - // be gutted out of both the Hear() proc and signal since it's never used - //TEST_ASSERT(hearing_args[HEARING_MESSAGE], "Handle hearing signal does not have a message arg") TEST_ASSERT(hearing_args[HEARING_SPEAKER], "Handle hearing signal does not have a speaker arg") TEST_ASSERT(hearing_args[HEARING_LANGUAGE], "Handle hearing signal does not have a language arg") TEST_ASSERT(hearing_args[HEARING_RAW_MESSAGE], "Handle hearing signal does not have a raw message arg") @@ -166,7 +163,7 @@ var/datum/client_interface/mock_client = new() listener.mock_client = mock_client - RegisterSignal(speaker, COMSIG_MOB_SAY, PROC_REF(handle_speech)) // + RegisterSignal(speaker, COMSIG_MOB_SAY, PROC_REF(handle_speech)) RegisterSignal(speaker_radio, COMSIG_RADIO_NEW_MESSAGE, PROC_REF(handle_radio_hearing)) RegisterSignal(listener, COMSIG_MOVABLE_HEAR, PROC_REF(handle_hearing)) diff --git a/code/modules/wiremod/components/atom/hear.dm b/code/modules/wiremod/components/atom/hear.dm index 4dc8812efc0..b3a41154dc6 100644 --- a/code/modules/wiremod/components/atom/hear.dm +++ b/code/modules/wiremod/components/atom/hear.dm @@ -43,7 +43,7 @@ SIGNAL_HANDLER return Hear(arglist(arguments)) -/obj/item/circuit_component/hear/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range) +/obj/item/circuit_component/hear/Hear(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods, message_range) if(!on.value) return FALSE if(speaker == parent?.shell) From 24ae6fe255c51ccdac49b53f7e3bb6ea3096fa40 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 10:30:00 +0000 Subject: [PATCH 046/109] Automatic changelog for PR #93020 [ci skip] --- html/changelogs/AutoChangeLog-pr-93020.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93020.yml diff --git a/html/changelogs/AutoChangeLog-pr-93020.yml b/html/changelogs/AutoChangeLog-pr-93020.yml new file mode 100644 index 00000000000..0ad96979604 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93020.yml @@ -0,0 +1,4 @@ +author: "Melbert" +delete-after: True +changes: + - code_imp: "Removed some redundant code from core hearing code. Report if you hear anything weird." \ No newline at end of file From c353060a42758439db0da021d90130555b6dcdee Mon Sep 17 00:00:00 2001 From: Leland Kemble <70413276+lelandkemble@users.noreply.github.com> Date: Sat, 20 Sep 2025 09:10:29 -0400 Subject: [PATCH 047/109] Moves one RPD from atmos to engi on Nebula station (#93041) --- _maps/map_files/NebulaStation/NebulaStation.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm index b683e139a78..348f2b50aa3 100644 --- a/_maps/map_files/NebulaStation/NebulaStation.dmm +++ b/_maps/map_files/NebulaStation/NebulaStation.dmm @@ -15284,6 +15284,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/pipe_dispenser, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "cpk" = ( @@ -44751,7 +44752,6 @@ /obj/structure/table/reinforced, /obj/item/t_scanner, /obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, /obj/item/storage/belt/utility, /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, From c85a27892c21bb4d97cba756dd573bf5a364fb31 Mon Sep 17 00:00:00 2001 From: Aliceee2ch <160794176+Aliceee2ch@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:10:44 +0300 Subject: [PATCH 048/109] Adds insulated gloves in WawaStation tech storage (#93032) --- _maps/map_files/wawastation/wawastation.dmm | 1 + 1 file changed, 1 insertion(+) diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 31d1932d9e0..2edb6f6f87c 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -45211,6 +45211,7 @@ pixel_x = -3; pixel_y = 3 }, +/obj/item/clothing/gloves/color/yellow, /turf/open/floor/iron/textured, /area/station/engineering/storage/tech) "pEk" = ( From 3a3d765b83b50f28c7d840f1ddb801a9ec754708 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 13:10:49 +0000 Subject: [PATCH 049/109] Automatic changelog for PR #93041 [ci skip] --- html/changelogs/AutoChangeLog-pr-93041.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93041.yml diff --git a/html/changelogs/AutoChangeLog-pr-93041.yml b/html/changelogs/AutoChangeLog-pr-93041.yml new file mode 100644 index 00000000000..5f7349ed867 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93041.yml @@ -0,0 +1,4 @@ +author: "lelandkemble" +delete-after: True +changes: + - map: "Moved one RPD from atmos to engi on Nebula" \ No newline at end of file From 542f61a896bcc201f023d50294add12881e08e0b Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 13:11:04 +0000 Subject: [PATCH 050/109] Automatic changelog for PR #93032 [ci skip] --- html/changelogs/AutoChangeLog-pr-93032.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93032.yml diff --git a/html/changelogs/AutoChangeLog-pr-93032.yml b/html/changelogs/AutoChangeLog-pr-93032.yml new file mode 100644 index 00000000000..b2287e3a625 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93032.yml @@ -0,0 +1,4 @@ +author: "Aliceee2ch" +delete-after: True +changes: + - bugfix: "Added missing insulated gloves in WawaStation tech storage" \ No newline at end of file From 136e05dbd0951c70f9f9b1f153381e9f1c2d5334 Mon Sep 17 00:00:00 2001 From: Aylong <69762909+AyIong@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:11:45 +0300 Subject: [PATCH 051/109] Bump `tgui-core` & make chat tabs scrollable (#92927) --- tgui/bun.lock | 16 ++++++------- tgui/packages/tgui-panel/Panel.tsx | 2 +- tgui/packages/tgui-panel/chat/ChatTabs.tsx | 2 +- tgui/packages/tgui-panel/package.json | 2 +- tgui/packages/tgui-say/package.json | 2 +- tgui/packages/tgui/interfaces/AtmosFilter.tsx | 3 ++- tgui/packages/tgui/interfaces/AtmosMixer.tsx | 6 +++-- .../tgui/interfaces/BluespaceSender.tsx | 6 +++-- .../tgui/interfaces/BluespaceVendor.tsx | 3 ++- tgui/packages/tgui/interfaces/ChemHeater.tsx | 6 +++-- .../tgui/interfaces/ChemMixingChamber.tsx | 6 +++-- .../tgui/interfaces/ChemReactionChamber.tsx | 12 ++++++---- .../tgui/interfaces/ChemRecipeDebug.tsx | 15 ++++++++---- .../tgui/interfaces/ColorMatrixEditor.tsx | 3 ++- .../packages/tgui/interfaces/Crystallizer.tsx | 3 ++- .../DnaConsole/DnaConsoleEnzymes.jsx | 6 +++-- tgui/packages/tgui/interfaces/Electropack.jsx | 6 +++-- tgui/packages/tgui/interfaces/Filteriffic.jsx | 9 +++---- tgui/packages/tgui/interfaces/GhostMenu.tsx | 8 +++---- .../interfaces/HighLuminosityEyesMenu.tsx | 3 ++- .../tgui/interfaces/Hypertorus/Controls.tsx | 3 ++- .../tgui/interfaces/Hypertorus/Gases.tsx | 3 ++- .../tgui/interfaces/Mecha/ModulesPane.tsx | 7 +++--- .../interfaces/ParticleEdit/EntriesBasic.tsx | 21 ++++++++++------ .../ParticleEdit/EntriesGenerators.tsx | 15 ++++++++---- .../interfaces/ParticleEdit/Generators.tsx | 24 ++++++++++++------- tgui/packages/tgui/interfaces/Radio.tsx | 3 ++- .../interfaces/Reagents/RecipeLibrary.tsx | 3 ++- tgui/packages/tgui/interfaces/Reflector.tsx | 3 ++- .../tgui/interfaces/SentienceFunBalloon.jsx | 3 ++- tgui/packages/tgui/interfaces/Signaler.tsx | 6 +++-- .../packages/tgui/interfaces/SolarControl.tsx | 6 +++-- .../tgui/interfaces/ThermoMachine.jsx | 3 ++- .../tgui/interfaces/TurbineComputer.tsx | 3 ++- tgui/packages/tgui/package.json | 2 +- 35 files changed, 142 insertions(+), 82 deletions(-) diff --git a/tgui/bun.lock b/tgui/bun.lock index fbbe3337ac0..acef62558fd 100644 --- a/tgui/bun.lock +++ b/tgui/bun.lock @@ -49,7 +49,7 @@ "marked-smartypants": "^1.1.9", "react": "^19.1.0", "react-dom": "^19.1.0", - "tgui-core": "^4.2.3", + "tgui-core": "^5.3.1", "tgui-dev-server": "workspace:*", }, }, @@ -72,7 +72,7 @@ "react": "^19.1.0", "react-dom": "^19.1.0", "tgui": "workspace:*", - "tgui-core": "^4.2.3", + "tgui-core": "^5.3.1", "tgui-dev-server": "workspace:*", }, }, @@ -84,7 +84,7 @@ "react": "^19.1.0", "react-dom": "^19.1.0", "tgui": "workspace:*", - "tgui-core": "^4.2.3", + "tgui-core": "^5.3.1", }, }, "packages/tgui-setup": { @@ -107,13 +107,13 @@ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw=="], - "@floating-ui/core": ["@floating-ui/core@1.7.2", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw=="], + "@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="], - "@floating-ui/dom": ["@floating-ui/dom@1.7.2", "", { "dependencies": { "@floating-ui/core": "^1.7.2", "@floating-ui/utils": "^0.2.10" } }, "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA=="], + "@floating-ui/dom": ["@floating-ui/dom@1.7.4", "", { "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" } }, "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="], - "@floating-ui/react": ["@floating-ui/react@0.27.13", "", { "dependencies": { "@floating-ui/react-dom": "^2.1.4", "@floating-ui/utils": "^0.2.10", "tabbable": "^6.0.0" }, "peerDependencies": { "react": ">=17.0.0", "react-dom": ">=17.0.0" } }, "sha512-Qmj6t9TjgWAvbygNEu1hj4dbHI9CY0ziCMIJrmYoDIn9TUAH5lRmiIeZmRd4c6QEZkzdoH7jNnoNyoY1AIESiA=="], + "@floating-ui/react": ["@floating-ui/react@0.27.16", "", { "dependencies": { "@floating-ui/react-dom": "^2.1.6", "@floating-ui/utils": "^0.2.10", "tabbable": "^6.0.0" }, "peerDependencies": { "react": ">=17.0.0", "react-dom": ">=17.0.0" } }, "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g=="], - "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.4", "", { "dependencies": { "@floating-ui/dom": "^1.7.2" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw=="], + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.6", "", { "dependencies": { "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw=="], "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], @@ -991,7 +991,7 @@ "tgui": ["tgui@workspace:packages/tgui"], - "tgui-core": ["tgui-core@4.3.3", "", { "dependencies": { "@floating-ui/react": "^0.27.13", "@nozbe/microfuzz": "^1.0.0" }, "peerDependencies": { "react": "^19.1.0", "react-dom": "^19.1.0" } }, "sha512-+eVCmmwbwH6X/SMSXBVGQwsPzIKI8Ho5+tFuIU82cxmWIlWyaJzlCb86+5yBGeeJy4+SCPo6Pv1WrCeHNQeJuw=="], + "tgui-core": ["tgui-core@5.3.1", "", { "dependencies": { "@floating-ui/react": "^0.27.16", "@nozbe/microfuzz": "^1.0.0" }, "peerDependencies": { "react": "^19.1.0", "react-dom": "^19.1.0" } }, "sha512-+8dDM4R2G6T1SpzpkRXGYc7YD+9ohqYjTV/4Zgcqc1I4Ld8bJH9vKHCQVbEAsHTCIjHsTBW4xnOpKyAx1gRB5w=="], "tgui-dev-server": ["tgui-dev-server@workspace:packages/tgui-dev-server"], diff --git a/tgui/packages/tgui-panel/Panel.tsx b/tgui/packages/tgui-panel/Panel.tsx index d818f0351b8..d79fd985fdb 100644 --- a/tgui/packages/tgui-panel/Panel.tsx +++ b/tgui/packages/tgui-panel/Panel.tsx @@ -33,7 +33,7 @@ export const Panel = (props) => {

- + diff --git a/tgui/packages/tgui-panel/chat/ChatTabs.tsx b/tgui/packages/tgui-panel/chat/ChatTabs.tsx index cfa8e8e385a..d20c5f999ca 100644 --- a/tgui/packages/tgui-panel/chat/ChatTabs.tsx +++ b/tgui/packages/tgui-panel/chat/ChatTabs.tsx @@ -23,7 +23,7 @@ export function ChatTabs(props) { return ( - + {pages.map((page) => ( { + onChange={(value) => act('rate', { rate: value, }) diff --git a/tgui/packages/tgui/interfaces/AtmosMixer.tsx b/tgui/packages/tgui/interfaces/AtmosMixer.tsx index f84366c95c9..966fe808c74 100644 --- a/tgui/packages/tgui/interfaces/AtmosMixer.tsx +++ b/tgui/packages/tgui/interfaces/AtmosMixer.tsx @@ -70,6 +70,7 @@ export const AtmosMixer = (props) => { { minValue={0} maxValue={100} stepPixelSize={2} - onDrag={(value) => + onChange={(value) => act('node1', { concentration: value, }) @@ -87,6 +88,7 @@ export const AtmosMixer = (props) => { { minValue={0} maxValue={100} stepPixelSize={2} - onDrag={(value) => + onChange={(value) => act('node2', { concentration: value, }) diff --git a/tgui/packages/tgui/interfaces/BluespaceSender.tsx b/tgui/packages/tgui/interfaces/BluespaceSender.tsx index dacf10d67b2..1f417cb4c19 100644 --- a/tgui/packages/tgui/interfaces/BluespaceSender.tsx +++ b/tgui/packages/tgui/interfaces/BluespaceSender.tsx @@ -72,13 +72,14 @@ export const BluespaceSender = (props) => { /> + onChange={(value) => act('rate', { rate: value, }) @@ -130,12 +131,13 @@ const GasDisplay = (props: GasDisplayProps) => { + onChange={(value) => act('price', { gas_price: value, gas_type: id, diff --git a/tgui/packages/tgui/interfaces/BluespaceVendor.tsx b/tgui/packages/tgui/interfaces/BluespaceVendor.tsx index c24f3aa9ce9..78da7251943 100644 --- a/tgui/packages/tgui/interfaces/BluespaceVendor.tsx +++ b/tgui/packages/tgui/interfaces/BluespaceVendor.tsx @@ -86,13 +86,14 @@ export const BluespaceVendor = (props) => { + onChange={(value) => act('pumping_rate', { rate: value, }) diff --git a/tgui/packages/tgui/interfaces/ChemHeater.tsx b/tgui/packages/tgui/interfaces/ChemHeater.tsx index 0bb78dc5168..fb76a4461b8 100644 --- a/tgui/packages/tgui/interfaces/ChemHeater.tsx +++ b/tgui/packages/tgui/interfaces/ChemHeater.tsx @@ -224,6 +224,7 @@ export const ChemHeater = (props) => { { value={dispenseVolume} minValue={1} maxValue={10} - onDrag={(value) => + onChange={(value) => act('disp_vol', { target: value, }) @@ -245,6 +246,7 @@ export const ChemHeater = (props) => { { value={round(targetTemp, 0.1)} minValue={0} maxValue={1000} - onDrag={(value) => + onChange={(value) => act('temperature', { target: value, }) diff --git a/tgui/packages/tgui/interfaces/ChemMixingChamber.tsx b/tgui/packages/tgui/interfaces/ChemMixingChamber.tsx index b539b22f240..893549a5506 100644 --- a/tgui/packages/tgui/interfaces/ChemMixingChamber.tsx +++ b/tgui/packages/tgui/interfaces/ChemMixingChamber.tsx @@ -46,6 +46,7 @@ export const ChemMixingChamber = (props) => { {'Target:'} { value={round(targetTemp, 0.1)} minValue={0} maxValue={1000} - onDrag={(value) => + onChange={(value) => act('temperature', { target: value, }) @@ -119,13 +120,14 @@ export const ChemMixingChamber = (props) => { setReagentQuantity(value)} + onChange={(value) => setReagentQuantity(value)} /> diff --git a/tgui/packages/tgui/interfaces/ChemReactionChamber.tsx b/tgui/packages/tgui/interfaces/ChemReactionChamber.tsx index 881a10c4f1b..c2337fef7a5 100644 --- a/tgui/packages/tgui/interfaces/ChemReactionChamber.tsx +++ b/tgui/packages/tgui/interfaces/ChemReactionChamber.tsx @@ -50,6 +50,7 @@ export const ChemReactionChamber = (props) => { {'Target:'} { value={round(targetTemp, 0.1)} minValue={0} maxValue={1000} - onDrag={(value) => + onChange={(value) => act('temperature', { target: value, }) @@ -156,13 +157,14 @@ export const ChemReactionChamber = (props) => { + onChange={(value) => act('acidic', { target: value, }) @@ -171,13 +173,14 @@ export const ChemReactionChamber = (props) => { + onChange={(value) => act('alkaline', { target: value, }) @@ -204,13 +207,14 @@ export const ChemReactionChamber = (props) => { setReagentQuantity(value)} + onChange={(value) => setReagentQuantity(value)} /> diff --git a/tgui/packages/tgui/interfaces/ChemRecipeDebug.tsx b/tgui/packages/tgui/interfaces/ChemRecipeDebug.tsx index f4917f3755a..50fe3f1410f 100644 --- a/tgui/packages/tgui/interfaces/ChemRecipeDebug.tsx +++ b/tgui/packages/tgui/interfaces/ChemRecipeDebug.tsx @@ -120,13 +120,14 @@ export const ChemRecipeDebug = (props) => { + onChange={(value) => act('forced_temp', { target: value, }) @@ -167,13 +168,14 @@ export const ChemRecipeDebug = (props) => { PH:}> + onChange={(value) => act('forced_ph', { target: value, }) @@ -200,13 +202,14 @@ export const ChemRecipeDebug = (props) => { Purity:}> + onChange={(value) => act('forced_purity', { target: value, }) @@ -233,6 +236,7 @@ export const ChemRecipeDebug = (props) => { { minValue={1} maxValue={1000} unit="x" - onDrag={(value) => + onChange={(value) => act('volume_multiplier', { target: value, }) @@ -364,6 +368,7 @@ export const ChemRecipeDebug = (props) => { Value:}> { minValue={-1000} maxValue={1000} disabled={editReaction === null} - onDrag={(value) => + onChange={(value) => act('edit_value', { target: value, }) diff --git a/tgui/packages/tgui/interfaces/ColorMatrixEditor.tsx b/tgui/packages/tgui/interfaces/ColorMatrixEditor.tsx index c988b0328e5..54773016eb0 100644 --- a/tgui/packages/tgui/interfaces/ColorMatrixEditor.tsx +++ b/tgui/packages/tgui/interfaces/ColorMatrixEditor.tsx @@ -41,13 +41,14 @@ export const ColorMatrixEditor = (props) => { {`${PREFIXES[row]}${PREFIXES[col]}:`} toFixed(value, 2)} - onDrag={(value) => { + onChange={(value) => { const retColor = currentColor; retColor[row * 4 + col] = value; act('transition_color', { diff --git a/tgui/packages/tgui/interfaces/Crystallizer.tsx b/tgui/packages/tgui/interfaces/Crystallizer.tsx index 5394b63eb55..56407a452b6 100644 --- a/tgui/packages/tgui/interfaces/Crystallizer.tsx +++ b/tgui/packages/tgui/interfaces/Crystallizer.tsx @@ -81,13 +81,14 @@ const Controls = (props) => { + onChange={(value) => act('gas_input', { gas_input: value, }) diff --git a/tgui/packages/tgui/interfaces/DnaConsole/DnaConsoleEnzymes.jsx b/tgui/packages/tgui/interfaces/DnaConsole/DnaConsoleEnzymes.jsx index aa0d2e37d6f..02796cfe000 100644 --- a/tgui/packages/tgui/interfaces/DnaConsole/DnaConsoleEnzymes.jsx +++ b/tgui/packages/tgui/interfaces/DnaConsole/DnaConsoleEnzymes.jsx @@ -294,13 +294,14 @@ const PulseSettings = (props) => { + onChange={(value) => act('set_pulse_strength', { val: value, }) @@ -310,13 +311,14 @@ const PulseSettings = (props) => { + onChange={(value) => act('set_pulse_duration', { val: value, }) diff --git a/tgui/packages/tgui/interfaces/Electropack.jsx b/tgui/packages/tgui/interfaces/Electropack.jsx index 40135d0f78b..d1bbe11a6a0 100644 --- a/tgui/packages/tgui/interfaces/Electropack.jsx +++ b/tgui/packages/tgui/interfaces/Electropack.jsx @@ -41,6 +41,7 @@ export const Electropack = (props) => { > { value={frequency / 10} format={(value) => toFixed(value, 1)} width="80px" - onDrag={(value) => + onChange={(value) => act('freq', { freq: value, }) @@ -72,13 +73,14 @@ export const Electropack = (props) => { > + onChange={(value) => act('code', { code: value, }) diff --git a/tgui/packages/tgui/interfaces/Filteriffic.jsx b/tgui/packages/tgui/interfaces/Filteriffic.jsx index f130e3b8c2e..eb74398ed66 100644 --- a/tgui/packages/tgui/interfaces/Filteriffic.jsx +++ b/tgui/packages/tgui/interfaces/Filteriffic.jsx @@ -12,8 +12,7 @@ import { NumberInput, Section, } from 'tgui-core/components'; -import { toFixed } from 'tgui-core/math'; -import { numberOfDecimalDigits } from 'tgui-core/math'; +import { numberOfDecimalDigits, toFixed } from 'tgui-core/math'; import { useBackend } from '../backend'; import { Window } from '../layouts'; @@ -23,13 +22,14 @@ const FilterIntegerEntry = (props) => { const { act } = useBackend(); return ( + onChange={(value) => act('modify_filter_value', { name: filterName, new_data: { @@ -49,6 +49,7 @@ const FilterFloatEntry = (props) => { return ( <> { step={step} format={(value) => toFixed(value, numberOfDecimalDigits(step))} width="80px" - onDrag={(value) => + onChange={(value) => act('transition_filter_value', { name: filterName, new_data: { diff --git a/tgui/packages/tgui/interfaces/GhostMenu.tsx b/tgui/packages/tgui/interfaces/GhostMenu.tsx index f9d8945c2de..365fc6a1221 100644 --- a/tgui/packages/tgui/interfaces/GhostMenu.tsx +++ b/tgui/packages/tgui/interfaces/GhostMenu.tsx @@ -201,12 +201,12 @@ const GhostSettingsSection = (props) => { value={viewNumber} minValue={0} maxValue={max_extra_view} - onDrag={(newValue) => setviewNumber(newValue)} - onChange={(new_range) => + onChange={(new_range) => { + setviewNumber(new_range); act('view_range', { new_view_range: new_range, - }) - } + }); + }} /> )} diff --git a/tgui/packages/tgui/interfaces/HighLuminosityEyesMenu.tsx b/tgui/packages/tgui/interfaces/HighLuminosityEyesMenu.tsx index 745bb03bf54..371ab52088d 100644 --- a/tgui/packages/tgui/interfaces/HighLuminosityEyesMenu.tsx +++ b/tgui/packages/tgui/interfaces/HighLuminosityEyesMenu.tsx @@ -78,13 +78,14 @@ const RangeDisplay = (props) => { /> + onChange={(value) => act('set_range', { new_range: value, }) diff --git a/tgui/packages/tgui/interfaces/Hypertorus/Controls.tsx b/tgui/packages/tgui/interfaces/Hypertorus/Controls.tsx index 06d895af3a5..b03c0573bd1 100644 --- a/tgui/packages/tgui/interfaces/Hypertorus/Controls.tsx +++ b/tgui/packages/tgui/interfaces/Hypertorus/Controls.tsx @@ -235,12 +235,13 @@ export const HypertorusWasteRemove = (props) => { > + onChange={(value) => act('mod_filtering_rate', { mod_filtering_rate: value, }) diff --git a/tgui/packages/tgui/interfaces/Hypertorus/Gases.tsx b/tgui/packages/tgui/interfaces/Hypertorus/Gases.tsx index 9aceff155e9..5af1faa1d16 100644 --- a/tgui/packages/tgui/interfaces/Hypertorus/Gases.tsx +++ b/tgui/packages/tgui/interfaces/Hypertorus/Gases.tsx @@ -118,12 +118,13 @@ const GasList = (props: GasListProps) => { /> act(input_rate, { [input_rate]: v })} + onChange={(v) => act(input_rate, { [input_rate]: v })} /> {gases.map((gas) => { diff --git a/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx b/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx index b6b270a30ff..43a4a5c8dd5 100644 --- a/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx +++ b/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx @@ -652,6 +652,7 @@ const SnowflakeRadio = (props) => { { maxValue={maxFrequency / 10} value={frequency / 10} format={(value) => toFixed(value, 1)} - onDrag={(value) => + onChange={(value) => act('equip_act', { ref: ref, gear_action: 'set_frequency', @@ -1040,7 +1041,7 @@ const SnowflakeOreScanner = (props) => { const { cooldown } = props.module.snowflake; return ( - + {cooldown / 10 > 0 ? 'Recharging...' : 'Ready to scan vents'} diff --git a/tgui/packages/tgui/interfaces/ParticleEdit/EntriesBasic.tsx b/tgui/packages/tgui/interfaces/ParticleEdit/EntriesBasic.tsx index f1a95eb33d8..07fbdfa2694 100644 --- a/tgui/packages/tgui/interfaces/ParticleEdit/EntriesBasic.tsx +++ b/tgui/packages/tgui/interfaces/ParticleEdit/EntriesBasic.tsx @@ -46,11 +46,12 @@ export const EntryFloat = (props: EntryFloatProps) => { /> + onChange={(value) => act('edit', { var: var_name, new_value: value, @@ -74,11 +75,12 @@ export const EntryCoord = (props: EntryCoordProps) => { /> + onChange={(value) => act('edit', { var: var_name, new_value: [value, coord?.[1], coord?.[2]], @@ -87,11 +89,12 @@ export const EntryCoord = (props: EntryCoordProps) => { /> + onChange={(value) => act('edit', { var: var_name, new_value: [coord?.[0], value, coord?.[2]], @@ -100,11 +103,12 @@ export const EntryCoord = (props: EntryCoordProps) => { /> + onChange={(value) => act('edit', { var: var_name, new_value: [coord?.[0], coord?.[1], value], @@ -258,12 +262,13 @@ export const EntryTransform = (props: EntryTransformProps) => { {transform?.map((value, index) => ( + onChange={(value) => act('edit', { var: var_name, new_value: transform!.map((x, i) => @@ -303,11 +308,12 @@ export const EntryIcon = (props: EntryIconStateProps) => { + onChange={(value) => act('edit', { var: var_name, var_mod: P_DATA_ICON_WEIGHT, @@ -394,11 +400,12 @@ export const EntryIconState = (props: EntryIconStateProps) => { + onChange={(value) => act('edit', { var: var_name, new_value: editWeightOf(icon_state, iconstate, value), diff --git a/tgui/packages/tgui/interfaces/ParticleEdit/EntriesGenerators.tsx b/tgui/packages/tgui/interfaces/ParticleEdit/EntriesGenerators.tsx index 20b0b8ee5b6..ebe3e629e2c 100644 --- a/tgui/packages/tgui/interfaces/ParticleEdit/EntriesGenerators.tsx +++ b/tgui/packages/tgui/interfaces/ParticleEdit/EntriesGenerators.tsx @@ -54,11 +54,12 @@ export const FloatGenerator = (props: FloatGeneratorProps) => { + onChange={(value) => act('edit', { var: var_name, new_value: value, @@ -177,11 +178,12 @@ export const EntryGeneratorNumbersList = ( + onChange={(value) => act('edit', { var: var_name, new_value: value, @@ -199,11 +201,12 @@ export const EntryGeneratorNumbersList = ( + onChange={(value) => act('edit', { var: var_name, new_value: [value, input![1], input![2]], @@ -212,11 +215,12 @@ export const EntryGeneratorNumbersList = ( /> + onChange={(value) => act('edit', { var: var_name, new_value: [input![0], value, input![2]], @@ -226,11 +230,12 @@ export const EntryGeneratorNumbersList = ( {allow_z ? ( + onChange={(value) => act('edit', { var: var_name, new_value: [input![0], input![1], value], diff --git a/tgui/packages/tgui/interfaces/ParticleEdit/Generators.tsx b/tgui/packages/tgui/interfaces/ParticleEdit/Generators.tsx index 09c3140eddd..7f20365783f 100644 --- a/tgui/packages/tgui/interfaces/ParticleEdit/Generators.tsx +++ b/tgui/packages/tgui/interfaces/ParticleEdit/Generators.tsx @@ -66,10 +66,11 @@ export const GeneratorListEntry = (props: GeneratorProps) => { {typeof A === 'number' ? ( + onChange={(value) => act('edit', { var: var_name, var_mod: P_DATA_GENERATOR, @@ -82,9 +83,10 @@ export const GeneratorListEntry = (props: GeneratorProps) => { <> + onChange={(value) => act('edit', { var: var_name, var_mod: P_DATA_GENERATOR, @@ -101,9 +103,10 @@ export const GeneratorListEntry = (props: GeneratorProps) => { /> + onChange={(value) => act('edit', { var: var_name, var_mod: P_DATA_GENERATOR, @@ -115,9 +118,10 @@ export const GeneratorListEntry = (props: GeneratorProps) => { /> + onChange={(value) => act('edit', { var: var_name, var_mod: P_DATA_GENERATOR, @@ -135,9 +139,10 @@ export const GeneratorListEntry = (props: GeneratorProps) => { {typeof B === 'number' ? ( + onChange={(value) => act('edit', { var: var_name, var_mod: P_DATA_GENERATOR, @@ -151,9 +156,10 @@ export const GeneratorListEntry = (props: GeneratorProps) => { <> + onChange={(value) => act('edit', { var: var_name, var_mod: P_DATA_GENERATOR, @@ -170,9 +176,10 @@ export const GeneratorListEntry = (props: GeneratorProps) => { /> + onChange={(value) => act('edit', { var: var_name, var_mod: P_DATA_GENERATOR, @@ -189,9 +196,10 @@ export const GeneratorListEntry = (props: GeneratorProps) => { /> + onChange={(value) => act('edit', { var: var_name, var_mod: P_DATA_GENERATOR, diff --git a/tgui/packages/tgui/interfaces/Radio.tsx b/tgui/packages/tgui/interfaces/Radio.tsx index 27566469945..168acab435d 100644 --- a/tgui/packages/tgui/interfaces/Radio.tsx +++ b/tgui/packages/tgui/interfaces/Radio.tsx @@ -74,6 +74,7 @@ export const Radio = (props) => { )) || ( { maxValue={maxFrequency / 10} value={frequency / 10} format={(value) => toFixed(value, 1)} - onDrag={(value) => + onChange={(value) => act('frequency', { adjust: value - frequency / 10, }) diff --git a/tgui/packages/tgui/interfaces/Reagents/RecipeLibrary.tsx b/tgui/packages/tgui/interfaces/Reagents/RecipeLibrary.tsx index 321e29248be..5c8c61fb4b2 100644 --- a/tgui/packages/tgui/interfaces/Reagents/RecipeLibrary.tsx +++ b/tgui/packages/tgui/interfaces/Reagents/RecipeLibrary.tsx @@ -117,13 +117,14 @@ export function RecipeLibrary(props: ReagentsProps) { onClick={() => setPage(Math.max(page - 1, 1))} /> setPage(value)} + onChange={(value) => setPage(value)} /> + + + + {allObjects[selectedObj].name} + + {allObjects[selectedObj].description || 'no description'} + + + + +
+
+ )} + + +
+ + + + + + + + + + { + updateHideMapping(!hideMapping); + }} + color={!hideMapping && 'good'} + checked={!hideMapping} + tooltip={`Toggle mapping objects visibility`} + > + Mapping + + + + { + updateShowIcons(!showIcons); + }} + color={showIcons && 'good'} + checked={showIcons} + tooltip={`Toggle preview icons on hovering`} + > + Icons + + + + { + updateShowPreview(!showPreview); + }} + color={showPreview && 'good'} + checked={showPreview} + tooltip={`Toggle the large object preview panel`} + > + Preview + + + +
+
+ + +
+ {query === '' ? ( + + Begin typing to search... + + ) : !filteredResults.length ? ( + + Nothing found + + ) : ( + + {filteredResults.map((obj, index) => ( + + ))} + + )} +
+
+
+ ); +} diff --git a/tgui/packages/tgui/interfaces/SpawnPanel/CreateObjectAdvancedSettings.tsx b/tgui/packages/tgui/interfaces/SpawnPanel/CreateObjectAdvancedSettings.tsx new file mode 100644 index 00000000000..758a35a7358 --- /dev/null +++ b/tgui/packages/tgui/interfaces/SpawnPanel/CreateObjectAdvancedSettings.tsx @@ -0,0 +1,146 @@ +import { useEffect } from 'react'; +import { Button, Dropdown, Slider, Table } from 'tgui-core/components'; + +import { useBackend } from '../../backend'; +import type { IconSettings } from './index'; + +interface SpawnPanelData { + icon: string; + iconState: string; + iconStates: string[]; + selected_object?: string; + apply_icon_override?: boolean; +} + +interface CreateObjectAdvancedSettingsProps { + iconSettings: IconSettings; + onIconSettingsChange: (settings: Partial) => void; +} + +export function CreateObjectAdvancedSettings( + props: CreateObjectAdvancedSettingsProps, +) { + const { act, data } = useBackend(); + const { iconSettings, onIconSettingsChange } = props; + + const sendUpdatedSettings = ( + changedSettings: Partial> = {}, + ) => { + const currentSettings = { + selected_atom_icon: data.icon || iconSettings.icon, + selected_atom_icon_state: data.iconState || iconSettings.iconState, + atom_icon_size: iconSettings.iconSize, + ...changedSettings, + }; + act('update-settings', currentSettings); + }; + + useEffect(() => { + act('get-icon-states'); + }, []); + + const iconStateOptions = ( + Array.isArray(data.iconStates) ? data.iconStates : [] + ).map((state) => ({ + value: state, + displayText: state, + })); + + return ( + + + + Icon: + + + + + +
+ ); +} diff --git a/tgui/packages/tgui/interfaces/SpawnPanel/CreateObjectSettings.tsx b/tgui/packages/tgui/interfaces/SpawnPanel/CreateObjectSettings.tsx new file mode 100644 index 00000000000..752ebc9c594 --- /dev/null +++ b/tgui/packages/tgui/interfaces/SpawnPanel/CreateObjectSettings.tsx @@ -0,0 +1,489 @@ +import { storage } from 'common/storage'; +import { useEffect, useState } from 'react'; +import { + Button, + Dropdown, + Input, + NumberInput, + Slider, + Stack, + Table, +} from 'tgui-core/components'; + +import { useBackend } from '../../backend'; +import { + directionIcons, + directionNames, + spawnLocationIcons, + spawnLocationOptions, +} from './constants'; +import type { IconSettings } from './index'; + +export interface SpawnPanelData { + icon: string; + iconState: string; + iconStates: string[]; + selected_object?: string; + precise_mode: string; +} + +interface CreateObjectSettingsProps { + onCreateObject?: (obj: Record) => void; + setAdvancedSettings: (value: boolean) => void; + iconSettings: IconSettings; +} + +export function CreateObjectSettings(props: CreateObjectSettingsProps) { + const { onCreateObject, setAdvancedSettings, iconSettings } = props; + const { act, data } = useBackend(); + + const [amount, setAmount] = useState(1); + const [cordsType, setCordsType] = useState(0); + const [spawnLocation, setSpawnLocation] = useState('Current location'); + const [direction, setDirection] = useState(0); + const [objectName, setObjectName] = useState(''); + const [offset, setOffset] = useState(''); + + const updateAmount = (value: number) => { + setAmount(value); + sendUpdatedSettings({ atom_amount: value }); + }; + + const updateCordsType = (value: number) => { + setCordsType(value); + storage.set('spawnpanel-offset_type', value); + sendUpdatedSettings({ + offset_type: value ? 'Absolute offset' : 'Relative offset', + }); + }; + + const updateSpawnLocation = (value: string) => { + setSpawnLocation(value); + storage.set('spawnpanel-where_target_type', value); + sendUpdatedSettings({ where_target_type: value }); + }; + + const updateDirection = (value: number) => { + setDirection(value); + storage.set('spawnpanel-direction', value); + sendUpdatedSettings({ atom_dir: [1, 2, 4, 8][value] }); + }; + + const updateObjectName = (value: string) => { + setObjectName(value); + storage.set('spawnpanel-atom_name', value); + sendUpdatedSettings({ atom_name: value }); + + if (isPreciseModeActive) { + sendUpdatedSettings(); + } + }; + + const updateOffset = (value: string) => { + setOffset(value); + storage.set('spawnpanel-offset', value); + + const parseOffset = (offsetStr: string): number[] => { + if (!offsetStr.trim()) return [0, 0, 0]; + + const parts = offsetStr.split(',').map((part) => { + return parseInt(part.trim()); + }); + + while (parts.length < 3) { + parts.push(0); + } + + return parts.slice(0, 3); + }; + + sendUpdatedSettings({ offset: parseOffset(value) }); + }; + + const sendUpdatedSettings = ( + changedSettings: Partial> = {}, + ) => { + const parseOffset = (offsetStr: string): number[] => { + if (!offsetStr.trim()) return [0, 0, 0]; + + const parts = offsetStr.split(',').map((part) => { + return parseInt(part.trim()); + }); + + while (parts.length < 3) { + parts.push(0); + } + + return parts.slice(0, 3); + }; + + const currentSettings = { + atom_amount: amount, + offset_type: cordsType ? 'Absolute offset' : 'Relative offset', + where_target_type: spawnLocation, + atom_dir: [1, 2, 4, 8][direction], + offset: parseOffset(offset), + atom_name: objectName, + atom_icon_size: iconSettings.iconSize, + apply_icon_override: iconSettings.applyIcon ?? false, + ...changedSettings, + }; + act('update-settings', currentSettings); + }; + + const resetAdvancedSettings = () => { + const defaultAmount = 1; + const defaultCordsType = 0; + const defaultSpawnLocation = 'Current location'; + const defaultDirection = 0; + const defaultObjectName = ''; + const defaultOffset = ''; + + setAmount(defaultAmount); + setCordsType(defaultCordsType); + setSpawnLocation(defaultSpawnLocation); + setDirection(defaultDirection); + setObjectName(defaultObjectName); + setOffset(defaultOffset); + + storage.set('spawnpanel-atom_amount', defaultAmount); + storage.set('spawnpanel-offset_type', defaultCordsType); + storage.set('spawnpanel-where_target_type', defaultSpawnLocation); + storage.set('spawnpanel-direction', defaultDirection); + storage.set('spawnpanel-atom_name', defaultObjectName); + storage.set('spawnpanel-offset', defaultOffset); + + sendUpdatedSettings({ + atom_amount: defaultAmount, + offset_type: defaultCordsType ? 'Absolute offset' : 'Relative offset', + where_target_type: defaultSpawnLocation, + atom_dir: [1, 2, 4, 8][defaultDirection], + offset: defaultOffset, + atom_name: defaultObjectName, + }); + }; + + useEffect(() => { + const loadStoredValues = async () => { + const storedCordsType = await storage.get('spawnpanel-offset_type'); + const storedSpawnLocation = await storage.get( + 'spawnpanel-where_target_type', + ); + const storedDirection = await storage.get('spawnpanel-direction'); + const storedObjectName = await storage.get('spawnpanel-atom_name'); + const storedOffset = await storage.get('spawnpanel-offset'); + + if (storedCordsType !== undefined) setCordsType(storedCordsType); + if (storedSpawnLocation) setSpawnLocation(storedSpawnLocation); + if (storedDirection !== undefined) setDirection(storedDirection); + if (storedObjectName !== undefined) setObjectName(storedObjectName); + if (storedOffset !== undefined) setOffset(storedOffset); + }; + + loadStoredValues(); + }, []); + + const isTargetMode = + spawnLocation === 'Targeted location' || + spawnLocation === 'Targeted location (droppod)' || + spawnLocation === "In targeted mob's hand"; + + const isPreciseModeActive = data?.precise_mode === 'Target'; + const isMarkModeActive = data?.precise_mode === 'Mark'; + const isCopyModeActive = data?.precise_mode === 'Copy'; + + const isAnyPreciseModeActive = !(data?.precise_mode === 'Off'); + + const disablePreciseMode = () => { + if (isPreciseModeActive) { + act('toggle-precise-mode', { + newPreciseType: 'Off', + }); + } + }; + + const handleSpawn = () => { + const parseOffset = (offsetStr: string): number[] => { + if (!offsetStr.trim()) return [0, 0, 0]; + + const parts = offsetStr.split(',').map((part) => { + return parseInt(part.trim()); + }); + + while (parts.length < 3) { + parts.push(0); + } + + return parts.slice(0, 3); + }; + + const currentSettings = { + atom_amount: amount, + offset_type: cordsType ? 'Absolute offset' : 'Relative offset', + where_target_type: spawnLocation, + atom_dir: [1, 2, 4, 8][direction], + offset: parseOffset(offset), + atom_name: objectName, + atom_icon_size: iconSettings.iconSize, + selected_atom: data.selected_object, + apply_icon_override: iconSettings.applyIcon ?? false, + }; + + act('update-settings', currentSettings); + + if (!isTargetMode) { + if (onCreateObject) { + onCreateObject(currentSettings); + } else { + act('create-atom-action', currentSettings); + } + } else { + if (isPreciseModeActive) { + act('toggle-precise-mode', { newPreciseType: 'Off' }); + } else { + act('toggle-precise-mode', { + newPreciseType: 'Target', + where_target_type: spawnLocation, + }); + } + } + }; + + useEffect(() => { + if (!isTargetMode && isPreciseModeActive) { + disablePreciseMode(); + } + }, [spawnLocation]); + + useEffect(() => { + if (isPreciseModeActive) { + sendUpdatedSettings(); + } + }, [iconSettings.icon, iconSettings.iconState, iconSettings.iconSize]); + + return ( + + + + + + Amnt.: + + + + updateAmount(value)} + disabled={isAnyPreciseModeActive} + /> + + Dir: + +
+
+ + + + + + + + + { + if (data?.precise_mode && data.precise_mode !== 'Off') { + act('toggle-precise-mode', { + newPreciseType: 'Off', + }); + } + updateSpawnLocation(value); + }} + selected={spawnLocation} + /> + + + + + +
+
+ ); +} diff --git a/tgui/packages/tgui/interfaces/SpawnPanel/constants.tsx b/tgui/packages/tgui/interfaces/SpawnPanel/constants.tsx new file mode 100644 index 00000000000..13be3441059 --- /dev/null +++ b/tgui/packages/tgui/interfaces/SpawnPanel/constants.tsx @@ -0,0 +1,47 @@ +export const spawnLocationOptions = [ + 'Current location', + 'Current location (droppod)', + "In own mob's hand", + 'At a marked object', + 'In the marked object', + 'Targeted location', + 'Targeted location (droppod)', + "In targeted mob's hand", +]; + +export const listTypes = { + Objects: 'cube', + Turfs: 'map', + Mobs: 'cat', +}; + +export const listNames = { + Objects: 'Search objects', + Turfs: 'Search turfs', + Mobs: 'Search mobs', +}; + +export const spawnLocationIcons = { + 'Current location': 'map-marker', + 'Current location (droppod)': 'parachute-box', + "In own mob's hand": 'hand-holding', + 'At a marked object': 'floppy-disk', + 'In the marked object': 'floppy-disk', + 'Targeted location': 'crosshairs', + 'Targeted location (droppod)': 'crosshairs', + "In targeted mob's hand": 'crosshairs', +}; + +export const directionIcons = { + 1: 'arrow-up', + 2: 'arrow-down', + 4: 'arrow-right', + 8: 'arrow-left', +}; + +export const directionNames = { + 1: 'NORTH', + 2: 'SOUTH', + 4: 'EAST', + 8: 'WEST', +}; diff --git a/tgui/packages/tgui/interfaces/SpawnPanel/index.tsx b/tgui/packages/tgui/interfaces/SpawnPanel/index.tsx new file mode 100644 index 00000000000..6cca2be9fb5 --- /dev/null +++ b/tgui/packages/tgui/interfaces/SpawnPanel/index.tsx @@ -0,0 +1,91 @@ +import { useEffect, useState } from 'react'; +import { Button, Modal, Section, Stack } from 'tgui-core/components'; +import { fetchRetry } from 'tgui-core/http'; + +import { resolveAsset } from '../../assets'; +import { Window } from '../../layouts'; +import { logger } from '../../logging'; +import { CreateObject } from './CreateObject'; +import { CreateObjectAdvancedSettings } from './CreateObjectAdvancedSettings'; +import type { CreateObjectData } from './types'; + +export interface IconSettings { + icon: string | null; + iconState: string | null; + iconSize: number; + applyIcon?: boolean; +} + +export function SpawnPanel() { + const [data, setData] = useState(); + const [advancedSettings, setAdvancedSettings] = useState(false); + const [iconSettings, setIconSettings] = useState({ + icon: null, + iconState: null, + iconSize: 100, + applyIcon: false, + }); + + useEffect(() => { + fetchRetry(resolveAsset('spawnpanel_atom_data.json')) + .then((response) => response.json()) + .then(setData) + .catch((error) => { + logger.log( + 'Failed to fetch spawnpanel_atom_data.json', + JSON.stringify(error), + ); + }); + }, []); + + const handleIconSettingsChange = (newSettings: Partial) => { + setIconSettings((current) => ({ + ...current, + ...newSettings, + })); + }; + + return ( + + + {advancedSettings && ( + +
setAdvancedSettings(false)} + /> + } + > + +
+
+ )} + + + {data && ( + + )} + + +
+
+ ); +} diff --git a/tgui/packages/tgui/interfaces/SpawnPanel/types.ts b/tgui/packages/tgui/interfaces/SpawnPanel/types.ts new file mode 100644 index 00000000000..ae35c387e03 --- /dev/null +++ b/tgui/packages/tgui/interfaces/SpawnPanel/types.ts @@ -0,0 +1,53 @@ +import type { BooleanLike } from 'tgui-core/react'; + +export interface SpawnPreferences { + hide_icons: boolean; + hide_mappings: boolean; + sort_by: string; + search_text: string; + search_by: string; + where_dropdown_value: string; + offset_type: string; + offset: string; + object_count: number; + dir: number; + object_name: string; +} + +export interface SpawnPanelPreferences { + hide_icons: boolean; + hide_mappings: boolean; + sort_by: string; + search_text: string; + search_by: string; +} + +export interface AtomData { + icon: string; + icon_state: string; + name: string; + description?: string; + mapping: BooleanLike; + type: 'Objects' | 'Turfs' | 'Mobs'; +} + +export interface CreateObjectData { + atoms: Record; +} + +export interface CreateObjectProps { + objList: CreateObjectData; + setAdvancedSettings: (value: boolean) => void; + iconSettings: { + icon: string | null; + iconState: string | null; + iconSize: number; + }; + onIconSettingsChange: ( + settings: Partial<{ + icon: string | null; + iconState: string | null; + iconSize: number; + }>, + ) => void; +} From 5715e579a3978b514e49418c20ea3544faf93c2a Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 23:05:46 +0000 Subject: [PATCH 106/109] Automatic changelog for PR #90943 [ci skip] --- html/changelogs/AutoChangeLog-pr-90943.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-90943.yml diff --git a/html/changelogs/AutoChangeLog-pr-90943.yml b/html/changelogs/AutoChangeLog-pr-90943.yml new file mode 100644 index 00000000000..f901eca0e2c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-90943.yml @@ -0,0 +1,4 @@ +author: "mcbalaam, Ez-Briz" +delete-after: True +changes: + - admin: "Added a new TGUI spawn panel, removing it's ancestors - HTML \"Create X\" panels" \ No newline at end of file From 86439af28d9d2f5b87da616152408053c6761e33 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Wed, 24 Sep 2025 01:44:57 +0200 Subject: [PATCH 107/109] You can now rotate cannons (#92984) ## About The Pull Request You can now rotate cannons! ## Why It's Good For The Game You can now rotate cannons!!! ## Changelog :cl: qol: You can now rotate cannons. /:cl: --- code/game/objects/structures/cannons/cannon.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/structures/cannons/cannon.dm b/code/game/objects/structures/cannons/cannon.dm index 4e7730cc6da..1261ae6e8a3 100644 --- a/code/game/objects/structures/cannons/cannon.dm +++ b/code/game/objects/structures/cannons/cannon.dm @@ -22,6 +22,7 @@ /obj/structure/cannon/Initialize(mapload) . = ..() create_reagents(charge_size) + AddComponent(/datum/component/simple_rotation) /obj/structure/cannon/examine(mob/user) . = ..() From 90014c89c6d21d2b4204b3a07f603ea00b424b3e Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 23:45:16 +0000 Subject: [PATCH 108/109] Automatic changelog for PR #92984 [ci skip] --- html/changelogs/AutoChangeLog-pr-92984.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92984.yml diff --git a/html/changelogs/AutoChangeLog-pr-92984.yml b/html/changelogs/AutoChangeLog-pr-92984.yml new file mode 100644 index 00000000000..aa796cfb4d3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92984.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - qol: "You can now rotate cannons." \ No newline at end of file From 5fdb6d3618af76b4835c145fe02c1906566ca8c0 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 24 Sep 2025 00:28:40 +0000 Subject: [PATCH 109/109] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-90943.yml | 4 ---- html/changelogs/AutoChangeLog-pr-92984.yml | 4 ---- html/changelogs/AutoChangeLog-pr-92992.yml | 6 ----- html/changelogs/AutoChangeLog-pr-93066.yml | 4 ---- html/changelogs/AutoChangeLog-pr-93072.yml | 4 ---- html/changelogs/AutoChangeLog-pr-93074.yml | 4 ---- html/changelogs/AutoChangeLog-pr-93075.yml | 4 ---- html/changelogs/AutoChangeLog-pr-93082.yml | 4 ---- html/changelogs/AutoChangeLog-pr-93083.yml | 4 ---- html/changelogs/archive/2025-09.yml | 27 ++++++++++++++++++++++ 10 files changed, 27 insertions(+), 38 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-90943.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92984.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-92992.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93066.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93072.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93074.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93075.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93082.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93083.yml diff --git a/html/changelogs/AutoChangeLog-pr-90943.yml b/html/changelogs/AutoChangeLog-pr-90943.yml deleted file mode 100644 index f901eca0e2c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-90943.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "mcbalaam, Ez-Briz" -delete-after: True -changes: - - admin: "Added a new TGUI spawn panel, removing it's ancestors - HTML \"Create X\" panels" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92984.yml b/html/changelogs/AutoChangeLog-pr-92984.yml deleted file mode 100644 index aa796cfb4d3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92984.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - qol: "You can now rotate cannons." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92992.yml b/html/changelogs/AutoChangeLog-pr-92992.yml deleted file mode 100644 index 3bc8497840a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92992.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - balance: "Special versions of hulk, such as the wizard's transformation spell and the pirate warlord's superhuman powers, no longer suffer from arm breakage like normal hulks do." - - balance: "Hulk arm breaking now uses natural wound determination over forced wound effects at arm health thresholds." - - code_imp: "Cleans up some of the mutation code." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93066.yml b/html/changelogs/AutoChangeLog-pr-93066.yml deleted file mode 100644 index 766e72c79ee..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93066.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xander3359" -delete-after: True -changes: - - bugfix: "Fix SMES terminal having null cable_layer" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93072.yml b/html/changelogs/AutoChangeLog-pr-93072.yml deleted file mode 100644 index b7f3e14e55e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93072.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Bluespace anomalies should no longer teleport 'un-teleportable' mobs like anchored AIs or megafauna." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93074.yml b/html/changelogs/AutoChangeLog-pr-93074.yml deleted file mode 100644 index 22df6678bf3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93074.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Aliceee2ch" -delete-after: True -changes: - - image: "Added inhand sprite for CE professional RCD" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93075.yml b/html/changelogs/AutoChangeLog-pr-93075.yml deleted file mode 100644 index 0dc8047d459..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93075.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Hardly" -delete-after: True -changes: - - spellcheck: "Fixes 'souless' typo when trying to use enchanted deck of carot cards as a changeling." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93082.yml b/html/changelogs/AutoChangeLog-pr-93082.yml deleted file mode 100644 index b70d1f49794..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93082.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Atrocinated text is upside down again." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93083.yml b/html/changelogs/AutoChangeLog-pr-93083.yml deleted file mode 100644 index 2f63e714b1a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93083.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "timothymtorres" -delete-after: True -changes: - - rscadd: "Add cooking oil, nutraslop, and beer keg to cargo supply packs. Nutraslop serving trays and cooking oil vats can now be pushed and moved." \ No newline at end of file diff --git a/html/changelogs/archive/2025-09.yml b/html/changelogs/archive/2025-09.yml index 9fed170e093..b63ac29febd 100644 --- a/html/changelogs/archive/2025-09.yml +++ b/html/changelogs/archive/2025-09.yml @@ -603,3 +603,30 @@ - bugfix: Kickflippers now catch their board every time loganuk: - bugfix: Fixes endless updates to det forensic scanner into the UI +2025-09-24: + Aliceee2ch: + - image: Added inhand sprite for CE professional RCD + Ghommie: + - qol: You can now rotate cannons. + - bugfix: Bluespace anomalies should no longer teleport 'un-teleportable' mobs like + anchored AIs or megafauna. + Hardly: + - spellcheck: Fixes 'souless' typo when trying to use enchanted deck of carot cards + as a changeling. + Melbert: + - bugfix: Atrocinated text is upside down again. + Xander3359: + - bugfix: Fix SMES terminal having null cable_layer + mcbalaam, Ez-Briz: + - admin: Added a new TGUI spawn panel, removing it's ancestors - HTML "Create X" + panels + necromanceranne: + - balance: Special versions of hulk, such as the wizard's transformation spell and + the pirate warlord's superhuman powers, no longer suffer from arm breakage like + normal hulks do. + - balance: Hulk arm breaking now uses natural wound determination over forced wound + effects at arm health thresholds. + - code_imp: Cleans up some of the mutation code. + timothymtorres: + - rscadd: Add cooking oil, nutraslop, and beer keg to cargo supply packs. Nutraslop + serving trays and cooking oil vats can now be pushed and moved.