From 2e01fb19c471e3361d81be30f09d313ceaf6a542 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Thu, 11 Jun 2026 17:31:28 +0200 Subject: [PATCH 001/126] Fixes diamond and bluespace artifact boulders not containing any diamonds/bluespace crystals (#96417) ## About The Pull Request Boulder-specific materials got overriden by the vent ## Changelog :cl: fix: Fixed diamond and bluespace artifact boulders not containing any diamonds/bluespace crystals /:cl: --- code/game/objects/structures/lavaland/ore_vent.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index 3ab9542f630..11f8009b610 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -555,7 +555,7 @@ Shake(duration = 1.5 SECONDS) //decorate the boulder with materials - var/list/mats_list = list() + var/list/mats_list = new_rock.custom_materials?.Copy() || list() for(var/iteration in 1 to MINERALS_PER_BOULDER) var/datum/material/material = pick_weight(mineral_breakdown) mats_list[material] += ore_quantity_function(iteration) From 737dc73a18cc41734ea28a2e8477ea05b84c088c Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 15:31:53 +0000 Subject: [PATCH 002/126] Automatic changelog for PR #96417 [ci skip] --- html/changelogs/AutoChangeLog-pr-96417.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96417.yml diff --git a/html/changelogs/AutoChangeLog-pr-96417.yml b/html/changelogs/AutoChangeLog-pr-96417.yml new file mode 100644 index 00000000000..a50ef2e8435 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96417.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Fixed diamond and bluespace artifact boulders not containing any diamonds/bluespace crystals" \ No newline at end of file From 61f9d011bfb4dab8d8adc74b991fc9927af08b83 Mon Sep 17 00:00:00 2001 From: AtomTheProphet <102389896+AtomTheProphet@users.noreply.github.com> Date: Thu, 11 Jun 2026 11:32:53 -0400 Subject: [PATCH 003/126] "Conserved Genetics" - A trait to prevent cross-pollination instability change in plants with the gene. (#96402) ## About The Pull Request Cross-pollination has a lot of potential for fun, but the aspect of instability loss and gain in plants makes me experience great suffering. Therefore, it has been suggested that I can get rid of this great pain by just preventing it with a plant trait! Magnificent! Grass was chosen to receive this trait because of its.. _checks notes_ "[remarkable conservation of gene content and gene order](https://pmc.ncbi.nlm.nih.gov/articles/PMC33824/)"! How wonderful! I hope I'm interpreting that correctly! ## Why It's Good For The Game The trait allows for botanists to achieve a finer control over which plants are altered during cross-pollination, preventing undesired instability loss or gain. With this, the experience of setting up trays next to each other comes with fewer pains, and enables more sophisticated cross-poll. setups as one wishes, preventing undesired mutations or reagent changes. ## Changelog :cl: add: Adds "Conserved Genetics", a plant trait which prevents the plant from having its instability be altered by cross-pollination. /:cl: --- code/modules/hydroponics/grown/grass_carpet.dm | 5 +++-- code/modules/hydroponics/hydroponics.dm | 3 ++- code/modules/hydroponics/plant_genes.dm | 8 ++++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index dc1f11a85b5..e58aaef71fc 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -15,7 +15,8 @@ growthstages = 2 icon_grow = "grass-grow" icon_dead = "grass-dead" - genes = list(/datum/plant_gene/trait/repeated_harvest) + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/safe_instability) + graft_gene = /datum/plant_gene/trait/safe_instability mutatelist = list(/obj/item/seeds/grass/carpet, /obj/item/seeds/grass/fairy) reagents_add = list(/datum/reagent/consumable/nutriment = 0.02, /datum/reagent/hydrogen = 0.05) @@ -53,7 +54,7 @@ product = /obj/item/food/grown/grass/fairy icon_grow = "fairygrass-grow" icon_dead = "fairygrass-dead" - genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/blue) + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/blue, /datum/plant_gene/trait/safe_instability) reagents_add = list(/datum/reagent/consumable/nutriment = 0.02, /datum/reagent/hydrogen = 0.05, /datum/reagent/drug/space_drugs = 0.15) graft_gene = /datum/plant_gene/trait/glow/blue mutatelist = null diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 46dfeaea46c..51dd5226eb4 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -851,7 +851,8 @@ continue if(T.myseed && T.plant_status != HYDROTRAY_PLANT_DEAD) T.myseed.set_potency(round((T.myseed.potency+(1/10)*(myseed.potency-T.myseed.potency)))) - T.myseed.set_instability(round((T.myseed.instability+(1/10)*(myseed.instability-T.myseed.instability)))) + if(!T.myseed.get_gene(/datum/plant_gene/trait/safe_instability)) + T.myseed.set_instability(round((T.myseed.instability+(1/10)*(myseed.instability-T.myseed.instability)))) T.myseed.set_yield(round((T.myseed.yield+(1/2)*(myseed.yield-T.myseed.yield)))) being_pollinated = TRUE add_shared_particles(/particles/pollen) diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 2835d49908f..a550a644ce7 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -295,6 +295,14 @@ /datum/plant_gene/trait/slip/proc/handle_slip(obj/item/food/grown/our_plant, mob/slipped_target) SEND_SIGNAL(our_plant, COMSIG_PLANT_ON_SLIP, slipped_target) +/// Prevents instability from being changed BY cross-pollination. +/datum/plant_gene/trait/safe_instability + name = "Conserved Genetics" + description = "With highly conserved genetics, this plant doesn't lose or gain instability in cross-pollination." + icon = FA_ICON_SEEDLING + rate = 1 + mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE + /* * Cell recharging trait. Charges all mob's power cells to (potency*rate)% mark when eaten. * Generates sparks on squash. From 16eefc34418e17c94e9e6d2de55614b28c36e9f3 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 15:33:31 +0000 Subject: [PATCH 004/126] Automatic changelog for PR #96402 [ci skip] --- html/changelogs/AutoChangeLog-pr-96402.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96402.yml diff --git a/html/changelogs/AutoChangeLog-pr-96402.yml b/html/changelogs/AutoChangeLog-pr-96402.yml new file mode 100644 index 00000000000..25b7d1c2d6c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96402.yml @@ -0,0 +1,4 @@ +author: "AtomTheProphet" +delete-after: True +changes: + - rscadd: "Adds \"Conserved Genetics\", a plant trait which prevents the plant from having its instability be altered by cross-pollination." \ No newline at end of file From ca03a776871001dd9dae3d0684e862dadbe25c91 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 18:00:27 +0000 Subject: [PATCH 005/126] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-96402.yml | 4 ---- html/changelogs/AutoChangeLog-pr-96417.yml | 4 ---- html/changelogs/archive/2026-06.yml | 5 +++++ 3 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-96402.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-96417.yml diff --git a/html/changelogs/AutoChangeLog-pr-96402.yml b/html/changelogs/AutoChangeLog-pr-96402.yml deleted file mode 100644 index 25b7d1c2d6c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96402.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AtomTheProphet" -delete-after: True -changes: - - rscadd: "Adds \"Conserved Genetics\", a plant trait which prevents the plant from having its instability be altered by cross-pollination." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-96417.yml b/html/changelogs/AutoChangeLog-pr-96417.yml deleted file mode 100644 index a50ef2e8435..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96417.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Fixed diamond and bluespace artifact boulders not containing any diamonds/bluespace crystals" \ No newline at end of file diff --git a/html/changelogs/archive/2026-06.yml b/html/changelogs/archive/2026-06.yml index 24ae7d3e217..c76a7686e44 100644 --- a/html/changelogs/archive/2026-06.yml +++ b/html/changelogs/archive/2026-06.yml @@ -262,11 +262,16 @@ timothymtorres: - sound: Books now make paper sound when opened 2026-06-11: + AtomTheProphet: + - rscadd: Adds "Conserved Genetics", a plant trait which prevents the plant from + having its instability be altered by cross-pollination. Melbert: - bugfix: Losing your limbs via the cursed quirk now gives you limb stumps (so you can get your limbs back afterwards) SmArtKar: - bugfix: Fixed debug overlays on new biome rocks on lavaland + - bugfix: Fixed diamond and bluespace artifact boulders not containing any diamonds/bluespace + crystals TealSeer: - refactor: security camera construction/item interaction has been rewritten, report any weirdness From 52858a68e162d8edbcfbd791a6a56dd154bb4f74 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 11 Jun 2026 17:54:55 -0500 Subject: [PATCH 006/126] Add sound to light switches (#96432) ## About The Pull Request This adds the flashlight toggle on/off sound to the room light switches. This is also used by a lot of other lighting objects, like lamps and lanterns. ## Why It's Good For The Game Mah Immersion! ## Changelog :cl: sound: Add on/off sound to light switches in rooms /:cl: --- code/game/machinery/lightswitch.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 7d553e47b2d..4091e012985 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -15,6 +15,10 @@ var/light_on_range = 1 /// Should this lightswitch automatically rename itself to match the area it's in? var/autoname = TRUE + /// The sound the light makes when it's turned on + var/sound_on = 'sound/items/weapons/magin.ogg' + /// The sound the light makes when it's turned off + var/sound_off = 'sound/items/weapons/magout.ogg' MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light_switch, 26) @@ -73,6 +77,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light_switch, 26) /obj/machinery/light_switch/interact(mob/user) . = ..() + playsound(src, area.lightswitch ? sound_off : sound_on, 40, TRUE) set_lights(!area.lightswitch) /obj/machinery/light_switch/screwdriver_act(mob/living/user, obj/item/tool) From 2f401cba7cbeaaae602dc995e1c424abcfdac212 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 22:55:13 +0000 Subject: [PATCH 007/126] Automatic changelog for PR #96432 [ci skip] --- html/changelogs/AutoChangeLog-pr-96432.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96432.yml diff --git a/html/changelogs/AutoChangeLog-pr-96432.yml b/html/changelogs/AutoChangeLog-pr-96432.yml new file mode 100644 index 00000000000..d36a999bceb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96432.yml @@ -0,0 +1,4 @@ +author: "timothymtorres" +delete-after: True +changes: + - sound: "Add on/off sound to light switches in rooms" \ No newline at end of file From 8ef4eb31bc56986f01566dc32078eafbcf139f3c Mon Sep 17 00:00:00 2001 From: Iajret <8430839+Iajret@users.noreply.github.com> Date: Fri, 12 Jun 2026 02:03:50 +0300 Subject: [PATCH 008/126] De-hardcodes wilderness levels z-traits (#96426) ## About The Pull Request Tin. If someone decides to add wilderness levels for maps that isnt ice, they will not suffer anymore. Uses default icy wilderness traits (renamed define for clarity), also adjusted another var name, for clarity too. ## Why It's Good For The Game Allows for a higher degree of customisation for wilderness levels, which is a very good idea, but somehow it was hardcoded to only work with snow maps. ## Changelog Nothing player facing (i hope) --- code/__DEFINES/maps.dm | 2 +- code/controllers/subsystem/mapping.dm | 2 +- code/datums/map_config.dm | 12 +++++++++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index f7f1e15b1d4..63f1b4b0f63 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -135,7 +135,7 @@ Always compile, always use that verb, and always make sure that it works for wha ///Z level traits for Deep Space #define ZTRAITS_SPACE list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_SPACE_RUINS = TRUE) ///Z level traits for -#define ZTRAITS_WILDS list(\ +#define ZTRAITS_ICY_WILDS list(\ ZTRAIT_LINKAGE = GRIDLINKED, \ ZTRAIT_ICE_RUINS = TRUE, \ ZTRAIT_SNOWSTORM = FALSE, \ diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 7b1b55341c5..274325956a4 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -144,7 +144,7 @@ SUBSYSTEM_DEF(mapping) if(current_map.wilderness_levels) var/list/FailedZs = list() - LoadGroup(FailedZs, "Wilderness Area", current_map.wilderness_directory, current_map.maps_to_spawn, default_traits = ZTRAITS_WILDS, height_autosetup = FALSE) + LoadGroup(FailedZs, "Wilderness Area", current_map.wilderness_directory, current_map.wilderness_maps_to_spawn, default_traits = current_map.wilderness_z_traits, height_autosetup = FALSE) if(LAZYLEN(FailedZs)) CRASH("Ice wilds failed to load!") diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index c3793f141e5..8734190b57c 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -34,8 +34,10 @@ var/wilderness_levels = 0 /// Directory to the wilderness area we can spawn in var/wilderness_directory + /// Z-Level traits our wilderness maps will get, ice box traits by default + var/list/wilderness_z_traits = ZTRAITS_ICY_WILDS /// Index of map names (inside wilderness_directory) with the amount to spawn. ("ice_planes" = 1) for one ice spawn - var/list/maps_to_spawn = list() + var/list/wilderness_maps_to_spawn = list() ///The type of mining Z-level that should be loaded. var/minetype = MINETYPE_LAVALAND @@ -259,8 +261,12 @@ // Just pick and take based on weight for(var/i in 1 to wilderness_levels) - maps_to_spawn += pick_weight_take(wilderness) - shuffle(maps_to_spawn) + wilderness_maps_to_spawn += pick_weight_take(wilderness) + shuffle(wilderness_maps_to_spawn) + + var/list/wilderness_level_traits = json["wilderness_level_traits"] + if (islist(wilderness_level_traits)) + wilderness_z_traits = wilderness_level_traits #ifdef UNIT_TESTS // Check for unit tests to skip, no reason to check these if we're not running tests From 4a72162d0701df1ab47c9055d356cfb2fb812454 Mon Sep 17 00:00:00 2001 From: antropod Date: Fri, 12 Jun 2026 05:04:50 +0600 Subject: [PATCH 009/126] Fix for material tiles and walls not having material when constructed from last item in the stack (#96404) ## About The Pull Request Fixes #96244. Problem was that when you use last item in the stack, the stack gets qdel'd and the destructor is called. The destructor sets `mats_per_unit = null` for the object, and when custom materials applied to tile/wall it is null. Bug was caused by #92620. I'm not gonna review 272 files from that PR to see if I can delete that destructor, potentially breaking something else, so this is a lazy fix for the annoying bug which is 6 months old. ## Changelog :cl: fix: fixed material tiles and walls not having material when constructed from last item in the stack /:cl: --- code/datums/elements/uses_girder_wall_recipes.dm | 4 +++- code/game/objects/items/stacks/tiles/tile_types.dm | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/code/datums/elements/uses_girder_wall_recipes.dm b/code/datums/elements/uses_girder_wall_recipes.dm index b313f78200e..38593f89f54 100644 --- a/code/datums/elements/uses_girder_wall_recipes.dm +++ b/code/datums/elements/uses_girder_wall_recipes.dm @@ -82,6 +82,8 @@ structure.add_fingerprint(user) stack.add_fingerprint(user) + // Save refernce to the materials for the case when we place last tile in the stack + var/list/saved_mats_per_unit = stack.mats_per_unit if (!stack.use_tool(structure, user, recipe.make_delay, recipe.stack_amount, extra_checks = CALLBACK(src, PROC_REF(check_recipe), structure, user, recipe))) return @@ -103,7 +105,7 @@ qdel(structure) if (is_material_recipe) - wall.set_custom_materials(stack.mats_per_unit, recipe.stack_amount) + wall.set_custom_materials(saved_mats_per_unit, recipe.stack_amount) /// Checks if the user can do the wall recipe. /datum/element/uses_girder_wall_recipes/proc/check_recipe(obj/structure/structure, mob/living/user, datum/girder_wall_recipe/recipe) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index c8f2c59d7c3..915fbf2af5e 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -1162,9 +1162,11 @@ merge_type = /obj/item/stack/tile/material /obj/item/stack/tile/material/place_tile(turf/open/target_plating, mob/user) + // Save refernce to the materials for the case when we place last tile in the stack + var/list/saved_mats_per_unit = mats_per_unit . = ..() var/turf/open/floor/material/floor = . - floor?.set_custom_materials(mats_per_unit) + floor?.set_custom_materials(saved_mats_per_unit) /obj/item/stack/tile/eighties name = "retro tile" From d8c53b7e660555867194721d42533823421f7125 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 23:05:10 +0000 Subject: [PATCH 010/126] Automatic changelog for PR #96404 [ci skip] --- html/changelogs/AutoChangeLog-pr-96404.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96404.yml diff --git a/html/changelogs/AutoChangeLog-pr-96404.yml b/html/changelogs/AutoChangeLog-pr-96404.yml new file mode 100644 index 00000000000..54fef96e3e9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96404.yml @@ -0,0 +1,4 @@ +author: "antropod" +delete-after: True +changes: + - bugfix: "fixed material tiles and walls not having material when constructed from last item in the stack" \ No newline at end of file From 152d1f7ad987ab3d72b0ad39797ad109677b499b Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 00:00:27 +0000 Subject: [PATCH 011/126] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-96404.yml | 4 ---- html/changelogs/AutoChangeLog-pr-96432.yml | 4 ---- html/changelogs/archive/2026-06.yml | 6 ++++++ 3 files changed, 6 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-96404.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-96432.yml diff --git a/html/changelogs/AutoChangeLog-pr-96404.yml b/html/changelogs/AutoChangeLog-pr-96404.yml deleted file mode 100644 index 54fef96e3e9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96404.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "antropod" -delete-after: True -changes: - - bugfix: "fixed material tiles and walls not having material when constructed from last item in the stack" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-96432.yml b/html/changelogs/AutoChangeLog-pr-96432.yml deleted file mode 100644 index d36a999bceb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96432.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "timothymtorres" -delete-after: True -changes: - - sound: "Add on/off sound to light switches in rooms" \ No newline at end of file diff --git a/html/changelogs/archive/2026-06.yml b/html/changelogs/archive/2026-06.yml index c76a7686e44..2524d7d777a 100644 --- a/html/changelogs/archive/2026-06.yml +++ b/html/changelogs/archive/2026-06.yml @@ -291,3 +291,9 @@ - sound: Add valve sound to portable canisters - sound: Add keypad sounds to secure safes - sound: Add drill sound to surgical drill +2026-06-12: + antropod: + - bugfix: fixed material tiles and walls not having material when constructed from + last item in the stack + timothymtorres: + - sound: Add on/off sound to light switches in rooms From 84c72671ac27f38f037141890bb5a8aed92b9be4 Mon Sep 17 00:00:00 2001 From: Lucy Date: Thu, 11 Jun 2026 22:25:04 -0400 Subject: [PATCH 012/126] update dreamluau to 0.2.2 (#96436) updates dreamluau to [0.2.2](https://github.com/tgstation/dreamluau/releases/tag/0.2.2) - the only change is a meowtonin update that should fix the compiler issues that tg is struggling with on live closes https://github.com/tgstation/tgstation/pull/96434 --- dependencies.sh | 2 +- dreamluau.dll | Bin 1660416 -> 1656320 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.sh b/dependencies.sh index bf5a66f6e7c..d6ef38ae615 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -26,7 +26,7 @@ export PYTHON_VERSION=3.11.0 export DREAMLUAU_REPO="tgstation/dreamluau" #dreamluau git tag -export DREAMLUAU_VERSION=0.2.1 +export DREAMLUAU_VERSION=0.2.2 #hypnagogic repo export CUTTER_REPO=spacestation13/hypnagogic diff --git a/dreamluau.dll b/dreamluau.dll index 6975fad39969122cc67eafc8e05f87eb626982c5..350016daae9efde72e27d275359a819509c581b5 100644 GIT binary patch delta 492796 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

8&w#uuT=8U~*o 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 n$gRl86)`QS{T#IBB(^o0mkKW$A6S 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Û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 YblT}O^yz8>b^wE2vMcoI&DPKU52>pn*8l(j delta 497954 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 Yi+`qU5GT;|Kc$9;thbXQf`F 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®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�lJD@ESZ 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%0At^)$D;ACsK?FYa;RlZ9BDE~jySk}&LH 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 Date: Fri, 12 Jun 2026 05:44:04 +0200 Subject: [PATCH 013/126] Santa Claus can now hear prayers that mention him or christmas. (#96406) ## About The Pull Request Santa Claus can hear prayers that contain the words "santa", "claus", "christmas" or "xmas". Prayers containing the word "satan" have a 40% probability to being "erroneously" relayed to Santa instead. Talk about a terrible typo. I'm toooootally sure nobody will do it on purpose (totally forced joke ik ik). Santa cannot know who the person praying is if not told inside the prayer itself, however he can tell if the person is naughty (either antag or has the evil trait) or not, so be mindful of that. If tired or harassed by unwanted prayers, Santa can also click an action button at any time to silence them. The prayers will still be sent to admins, they just won't be heard by Mr. Claus. This PR comes with a new component and a mild refactor of prayers. For admins, the message from the pray verb is now wrapped in boxed message spans. This will make prayers a bit easier to notice, since the lack of message box coupled with lack of sound (for now, unless it's the chaplain praying) makes them easy to miss. Also tinfoil hats prevent you from hearing prayers, Santa (redundant with the action button, this is just a little touch). ## Why It's Good For The Game Early Christmas PR ! Yeah, I know, headsets exist and Santa Claus is very capable of wearing one, but he's the same guy who rides a flying sleight, climb down chimneys (notwithstanding his corpulent body). The prayer thing makes a bit sense if you think of the more religious roots of the character, though our Santa Claus is a bit more secular ya know, and this is more of an excuse to give him something extra. Oh, yeah, if people will abuse the feature, I guess I could add an incapacitated check for the praying mob so that Santa won't hear prayers from people dying or restrained, or remove the tidbit that says if the person who sent the prayer is naughty or not. ## Changelog :cl: admin: Prayers from players are now boxed (like examine messages and some health readouts for example), making them easier to tell apart from the constant stream of text in your chat tabs. add: Santa Claus can now hear prayers that mention him or Christmas. He won't know who's praying unless told, though he can tell if they're naughty. /:cl: --- code/__DEFINES/dcs/signals/signals_global.dm | 8 ++ code/__DEFINES/religion.dm | 17 ++++ code/__DEFINES/traits/declarations.dm | 2 + code/_globalvars/religion.dm | 33 +++++++ code/_globalvars/traits/_traits.dm | 1 + code/datums/components/listen_prayers.dm | 89 +++++++++++++++++++ code/modules/admin/verbs/pray.dm | 40 +++++---- code/modules/antagonists/santa/santa.dm | 25 ++++++ code/modules/clothing/head/tinfoilhat.dm | 1 + icons/hud/actions.dmi | Bin 9680 -> 10521 bytes strings/sillytips.txt | 1 + tgstation.dme | 1 + 12 files changed, 199 insertions(+), 19 deletions(-) create mode 100644 code/datums/components/listen_prayers.dm diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 81c37f60afa..f706e6b9fe9 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -88,6 +88,14 @@ /// global signal when a global nullrod type is picked #define COMSIG_GLOB_NULLROD_PICKED "!nullrod_picked" +/// global signal when someone prays via prayer verb. +#define COMSIG_GLOB_SEND_PRAYER "!send_prayer" + #define ARG_PRAYING_MOB 1 + #define ARG_PRAYER_MSG 2 + #define ARG_PRAYER_TYPE 3 + #define ARG_PRAYER_SYMBOL 4 + #define ARG_PRAYED_DEITIES 5 + /// Global signal when light debugging is canceled #define COMSIG_LIGHT_DEBUG_DISABLED "!light_debug_disabled" diff --git a/code/__DEFINES/religion.dm b/code/__DEFINES/religion.dm index d3fb3d36e41..694968e0356 100644 --- a/code/__DEFINES/religion.dm +++ b/code/__DEFINES/religion.dm @@ -68,3 +68,20 @@ #define RITE_ALLOW_MULTIPLE_PERFORMS (1<<1) ///The rite can only be fully performed once, so we'll completely remove it from the rite list afterwards. #define RITE_ONE_TIME_USE (1<<2) + +///Default prayer type for the pray verb +#define DEFAULT_PRAYER "PRAYER" +///Cult prayer type +#define CULT_PRAYER "CULTIST PRAYER" +//Heretic prayer type +#define HERETIC_PRAYER "HERETICAL PRAYER" +///Chaplain prayer type +#define CHAPLAIN_PRAYER "CHAPLAIN PRAYER" +///Spiritual prayer type +#define SPIRITUAL_PRAYER "SPIRITUAL PRAYER" +///Evil prayer type +#define EVIL_PRAYER "EVIL PRAYER" +///Standard prayer type that santa sees +#define SANTA_PRAYER "PRAYER" +///what type of prayer santa sees when someone's bad +#define SANTA_NAUGHTY_PRAYER "PRAYER (NAUGHTY)" diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 59b12502d1c..ffd89e2cfdb 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -381,6 +381,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_SUCCUMB_OVERRIDE "succumb_override" /// Can hear observers #define TRAIT_SIXTHSENSE "sixth_sense" +/// For mobs / minds with the listening_prayers trait, this stops them from hearing prayers +#define TRAIT_DONT_HEAR_PRAYERS "dont_hear_prayers" #define TRAIT_FEARLESS "fearless" /// Ignores darkness for hearing #define TRAIT_HEAR_THROUGH_DARKNESS "hear_through_darkness" diff --git a/code/_globalvars/religion.dm b/code/_globalvars/religion.dm index 063ff0e8642..c2ea1a69d35 100644 --- a/code/_globalvars/religion.dm +++ b/code/_globalvars/religion.dm @@ -15,6 +15,39 @@ GLOBAL_LIST_EMPTY(chaplain_altars) GLOBAL_VAR(holy_weapon_type) GLOBAL_VAR(holy_armor_type) +GLOBAL_LIST_INIT(prayer_type_to_font_color, list( + DEFAULT_PRAYER = "purple", + CULT_PRAYER = "black", + HERETIC_PRAYER = "green", + CHAPLAIN_PRAYER = "yellow", + SPIRITUAL_PRAYER = "blue", + EVIL_PRAYER = "red", + SANTA_PRAYER = "purple", + SANTA_NAUGHTY_PRAYER = "red", +)) + +GLOBAL_LIST_INIT(prayer_type_to_icon_state, list( + DEFAULT_PRAYER = "bible", + CULT_PRAYER = "tome", + HERETIC_PRAYER = "necronomicon", + CHAPLAIN_PRAYER = "kingyellow", + SPIRITUAL_PRAYER = "holylight", + EVIL_PRAYER = "burning", + SANTA_PRAYER = "bible", //here just in case, we use present boxes for the icon + SANTA_NAUGHTY_PRAYER = "burning", +)) + +GLOBAL_LIST_INIT(prayer_type_to_message_box, list( + DEFAULT_PRAYER = "", + CULT_PRAYER = "red_box", + HERETIC_PRAYER = "green_box", + CHAPLAIN_PRAYER = "blue_box", + SPIRITUAL_PRAYER = "", + EVIL_PRAYER = "red_box", + SANTA_PRAYER = "blue_box", + SANTA_NAUGHTY_PRAYER = "red_box", +)) + /// Sets a new religious sect used by all chaplains int he round /proc/set_new_religious_sect(path, reset_existing = FALSE) if(!ispath(path, /datum/religion_sect)) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 61a0255dfaa..1ddfcd9dc14 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -265,6 +265,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER, "TRAIT_DISPLAY_JOB_IN_BINARY" = TRAIT_DISPLAY_JOB_IN_BINARY, "TRAIT_DISSECTED" = TRAIT_DISSECTED, + "TRAIT_DONT_HEAR_PRAYERS" = TRAIT_DONT_HEAR_PRAYERS, "TRAIT_DONT_WRITE_MEMORY" = TRAIT_DONT_WRITE_MEMORY, "TRAIT_DOUBLE_TAP" = TRAIT_DOUBLE_TAP, "TRAIT_DREAMING" = TRAIT_DREAMING, diff --git a/code/datums/components/listen_prayers.dm b/code/datums/components/listen_prayers.dm new file mode 100644 index 00000000000..d22724eb666 --- /dev/null +++ b/code/datums/components/listen_prayers.dm @@ -0,0 +1,89 @@ +/** + * A component that allows the attached mind to listen prayers from other mobs. + * Unlike admins, they cannot smite the person for it, also the prayers are anonymous unless the person says who he's in the message. + */ +/datum/component/listen_prayers + ///A callback called before the prayer is heard. May alter the message or prevent it from being heard if it returns FALSE + var/datum/callback/pre_prayer_callback + ///This will be affixed to the "deities" that have heard this message. + var/deity_name + ///The action that the owner can use to ignore the prayers + var/datum/action/innate/listen_prayers/toggle + ///The description we give to the instance of the listen_prayers toggle. + var/toggle_desc + +/datum/component/listen_prayers/Initialize(datum/callback/pre_prayer_callback, deity_name, toggle_desc) + if (!istype(parent, /datum/mind)) + return COMPONENT_INCOMPATIBLE + src.pre_prayer_callback = pre_prayer_callback + src.deity_name = deity_name + src.toggle_desc = toggle_desc + +/datum/component/listen_prayers/Destroy() + pre_prayer_callback = null + return ..() + +/datum/component/listen_prayers/RegisterWithParent() + RegisterSignal(SSdcs, COMSIG_GLOB_SEND_PRAYER, PROC_REF(on_sent_prayer)) + var/datum/mind/mind = parent + + var/datum/action/innate/listen_prayers/toggle = new(mind) + if(toggle_desc) + toggle.desc = toggle_desc + if(mind.current) + toggle.Grant(mind.current) + +/datum/component/listen_prayers/UnregisterFromParent() + UnregisterSignal(SSdcs, COMSIG_GLOB_SEND_PRAYER) + QDEL_NULL(toggle) + +/datum/component/listen_prayers/proc/on_sent_prayer(source, mob/praying, message, prayer_type, symbol, list/deities_that_listened) + SIGNAL_HANDLER + var/datum/mind/mind = parent + if(!mind.current || mind.current.stat >= UNCONSCIOUS || !mind.current.client) //You can't hear prayers if unconscious or disconnected + return + if(!isliving(praying) || praying.stat == DEAD) + return FALSE //I don't see any reason in hell to why dead people should be allowed into this. This isn't a knockoff TRAIT_SIXTHSENSE. + if(praying == mind.current) //Ignore prayers coming from ourselves. + return + if(mind.current.client in GLOB.admins) //This is redundant if we're adminning + return + if(HAS_MIND_TRAIT(mind.current, TRAIT_DONT_HEAR_PRAYERS)) + return + var/list/arguments = args.Copy(2) + if(pre_prayer_callback && !pre_prayer_callback.Invoke(args)) + return + prayer_type = arguments[ARG_PRAYER_TYPE] + symbol = arguments[ARG_PRAYER_SYMBOL] + message = "[icon2html(arguments[ARG_PRAYER_SYMBOL], mind.current.client)][prayer_type]: [span_notice(arguments[ARG_PRAYER_MSG])]" + to_chat(mind.current, custom_boxed_message(GLOB.prayer_type_to_message_box[prayer_type], message)) + SEND_SOUND(mind.current, sound('sound/effects/pray.ogg')) + if(deity_name) + deities_that_listened += deity_name + +///An action to stop hearing prayers on command. Doesn't do a whole lot without the associated component +/datum/action/innate/listen_prayers + name = "Listen Prayers" + button_icon = 'icons/hud/actions.dmi' + button_icon_state = "pray" + desc = "Allows you to eavesdrop on prayers from the world around you." + active = TRUE + +/datum/action/innate/listen_prayers/Destroy() + REMOVE_TRAIT(owner, TRAIT_DONT_HEAR_PRAYERS, ACTION_TRAIT) + return ..() + +/datum/action/innate/listen_prayers/is_action_active(atom/movable/screen/movable/action_button/current_button) + return !HAS_TRAIT_FROM(owner, TRAIT_DONT_HEAR_PRAYERS, ACTION_TRAIT) + +/datum/action/innate/listen_prayers/Activate() + active = TRUE + REMOVE_TRAIT(owner, TRAIT_DONT_HEAR_PRAYERS, ACTION_TRAIT) + to_chat(owner, span_green("You are ready to listen to prayers once again.")) + build_all_button_icons(UPDATE_BUTTON_BACKGROUND) + +/datum/action/innate/listen_prayers/Deactivate() + active = FALSE + ADD_TRAIT(owner, TRAIT_DONT_HEAR_PRAYERS, ACTION_TRAIT) + to_chat(owner, span_green("You stop listening to prayers.")) + build_all_button_icons(UPDATE_BUTTON_BACKGROUND) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index aefd988aa74..c0955dec70b 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -16,31 +16,33 @@ if(src.client.handle_spam_prevention(message, MUTE_PRAY)) return - var/mutable_appearance/cross = mutable_appearance('icons/obj/storage/book.dmi', "bible") - var/font_color = "purple" - var/prayer_type = "PRAYER" - var/deity + + var/prayer_type = DEFAULT_PRAYER + var/list/deities = list() if(src.job == JOB_CHAPLAIN) - cross.icon_state = "kingyellow" - font_color = "blue" - prayer_type = "CHAPLAIN PRAYER" + prayer_type = CHAPLAIN_PRAYER if(GLOB.deity) - deity = GLOB.deity + deities += GLOB.deity else if(IS_CULTIST(src)) - cross.icon_state = "tome" - font_color = "red" - prayer_type = "CULTIST PRAYER" - deity = "Nar'Sie" - else if(isliving(src)) - var/mob/living/L = src - if(HAS_TRAIT(L, TRAIT_SPIRITUAL)) - cross.icon_state = "holylight" - font_color = "blue" - prayer_type = "SPIRITUAL PRAYER" + prayer_type = CULT_PRAYER + deities += "Nar'Sie" + else if(IS_HERETIC_OR_MONSTER(src)) + prayer_type = HERETIC_PRAYER + deities += "the Mansus" + else if(HAS_TRAIT(src, TRAIT_SPIRITUAL)) + prayer_type = SPIRITUAL_PRAYER + else if(HAS_TRAIT(src, TRAIT_EVIL)) + prayer_type = EVIL_PRAYER + + var/mutable_appearance/cross = mutable_appearance('icons/obj/storage/book.dmi', GLOB.prayer_type_to_icon_state[prayer_type]) + + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_SEND_PRAYER, src, message, prayer_type, cross, deities) + var/msg_tmp = message GLOB.requests.pray(src.client, message, src.job == JOB_CHAPLAIN) - message = span_adminnotice("[icon2html(cross, GLOB.admins)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [span_linkify(message)]") + message = span_adminnotice("[icon2html(cross, GLOB.admins)][prayer_type][length(deities) ? " (to [english_list(deities)])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [span_linkify(message)]") + message = custom_boxed_message(GLOB.prayer_type_to_message_box[prayer_type], message) for(var/client/C in GLOB.admins) if(get_chat_toggles(C) & CHAT_PRAYER) to_chat(C, message, type = MESSAGE_TYPE_PRAYER, confidential = TRUE) diff --git a/code/modules/antagonists/santa/santa.dm b/code/modules/antagonists/santa/santa.dm index f3e1cbd02b9..8f6765604e0 100644 --- a/code/modules/antagonists/santa/santa.dm +++ b/code/modules/antagonists/santa/santa.dm @@ -4,6 +4,7 @@ show_name_in_check_antagonists = TRUE show_to_ghosts = TRUE suicide_cry = "FOR CHRISTMAS!!" + var/datum/component/listen_prayers/santa_prayers /datum/antagonist/santa/on_gain() . = ..() @@ -12,6 +13,30 @@ owner.add_traits(list(TRAIT_CANNOT_OPEN_PRESENTS, TRAIT_PRESENT_VISION), TRAIT_SANTA) + santa_prayers = owner.AddComponent(/datum/component/listen_prayers, CALLBACK(src, PROC_REF(check_if_santa_prayer)), "Santa Claus", "Allows you to listen for prayers that mention you or Christmas.") + +/datum/antagonist/santa/proc/check_if_santa_prayer(list/arguments) + SIGNAL_HANDLER + var/message = arguments[ARG_PRAYER_MSG] + var/mob/boy_girl = arguments[ARG_PRAYING_MOB] + var/regex/santa_regex = regex("(santa|claus|christmas|xmas)", "i") + if(!santa_regex.Find(message) && (!prob(60) || !findtext(message, "satan"))) + return FALSE //The message doesn't mention us (or satan, cuz the names are so similar, accidents may happen) + var/is_good_boy_girl = !boy_girl.is_antag() && !HAS_TRAIT(boy_girl, TRAIT_EVIL) + arguments[ARG_PRAYER_TYPE] = is_good_boy_girl ? SANTA_PRAYER : SANTA_NAUGHTY_PRAYER + arguments[ARG_PRAYER_SYMBOL] = icon('icons/obj/storage/wrapping.dmi', "giftdeliverypackage4") + return TRUE + +/datum/antagonist/santa/on_removal() + if(!owner) + return ..() + owner.remove_traits(list(TRAIT_CANNOT_OPEN_PRESENTS, TRAIT_PRESENT_VISION), TRAIT_SANTA) + QDEL_NULL(santa_prayers) + if(owner.current) + var/datum/action/cooldown/spell/teleport/area_teleport/wizard/santa/teleport = locate() in owner.current.actions + qdel(teleport) + return ..() + /datum/antagonist/santa/greet() . = ..() to_chat(owner, span_bolddanger("Your objective is to bring joy to the people on this station. You have a magical bag, which generates presents as long as you have it! You can examine the presents to take a peek inside, to make sure that you give the right gift to the right person.")) diff --git a/code/modules/clothing/head/tinfoilhat.dm b/code/modules/clothing/head/tinfoilhat.dm index 18cd6fd931a..5d5a6cc25bc 100644 --- a/code/modules/clothing/head/tinfoilhat.dm +++ b/code/modules/clothing/head/tinfoilhat.dm @@ -6,6 +6,7 @@ armor_type = /datum/armor/costume_foilhat equip_delay_other = 14 SECONDS clothing_flags = ANTI_TINFOIL_MANEUVER + clothing_traits = list(TRAIT_DONT_HEAR_PRAYERS) //stops you from hearing prayers as well, yes var/datum/brain_trauma/mild/phobia/conspiracies/paranoia var/warped = FALSE interaction_flags_mouse_drop = NEED_HANDS diff --git a/icons/hud/actions.dmi b/icons/hud/actions.dmi index e8385331596b16edd2d981b021ef408451dabb71..d95481b1ef3154936c6ce65fd7075d73f8e6f8bc 100644 GIT binary patch literal 10521 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 IOPhuL55fSj00000 literal 9680 zcmW++WmsIj5?0Bi+$84Y-u2Y&+5QQ_|xON;mL;@DS9&t2xLo8>oK z7k67{Cjh`ZD>-4(PKp~ZY)L>3-qZrq_$evVvMe8>-P9-O*r8Sfk6XETUz2O-zd{4&n%HJ8pn=}kWWvs zO$dvx6`9uLHdaKjkK=8SKT5onOpWm>!;UjaR2M#!*qL2u;RchAH5{O;es?rWiGpD8iM;29e_3l1LA zH$L5KF><>Skb5v`uG`CkM`FjTIcUmt%d+^awkC7Ey6vRN^A&4S3;%SgpYgjz;#n~D zKObotN&Z7!eJZ!u&=aMYzdN#Nds%jbO-lNzOPX0+2l7H%zJ4OP^@~a)PFr-!|$q@XN%*xDGvKBlG*(Te4&>rOOSr;FAtWLl?B`! z&V&>c(71DR=lE|0z`9D?op3`Z%X8I|v-fLqlp=5_j_-A6{O$@EFb=w$ClV;MJV0#z z350reuGZHA!a8Vrw3y2#Co_c+Tel=8-UxwL^&g4ZO~~t6NF_8n`uqDeAot(;_?vf< z13Ls@3wy4Tc*yPxBIrQiCoy6FL8YD`HId@_Jqy89M*3oC)qd;L23L-u6) zjU>?eHPK(Hh-h6W^L1JIG9}a59yuK{yCpRH^uCte>2~e@Ed7VUQ1_bu92e9K1Ygrr z20mU&R{{B#KBim@rliZFBctBpqr6TF>|zGdlVBH>VFdNKtQ@0X+o!`;-MIkLt z8;XlWx~sbDohH*|)|>`dgND(?}C4!aqVD9#*q+ z9cV?MZ?Q}0$lYeXlEJYE_{hi~h)Z8t-_E8JfZ}NLkkP9!yX`hR;B(jPnop z%QJX*(^r}OW7fed3n)5+UT56l$ycuNd=J?|uVG|(fNWOQ^>)C1wopCrXRCOhii->_ zIs1j|CfBy-yA7bRZHTa#-Cm>C%)}SS;qhTxnY0!+<%1X?zGmJ3P;X1Ljl&&Mw8Q z##7jb>Cto3%tlUf@gesHmr+1bmyQo=PUy10!Jq;RPz_7#D{woTo&hyH6=Hd>O| zb-=WAoz2keKclwNjU`=<%3Hd4iaCNS|K#cS-6Wa`+ zzfL15;!gPnUWcn0IN!U3;k5)y-||Lhu^eKrRrRroLG&eQnbs@`+&8Ji*Mj2^5W=Wk z{*AEB0~?hP48J2V-oP@n7GMUVFzaXMDN~dzK5zPHovbi*r-zqvGbM&{Q@2HDn^J_1 zo~qG%la#laQnS`o>gbW*&wGECEVyu)tMYJD2j(5_*sXhqoE0{wmIsFb@#Cx?|B*`y z*k35>NsesW*F4=?b9O)MjHKK_p!Ez}TOa8Fn3!Y^#k_(Y5p<}?c-cg;wTwZVHeK`B zw#=#J(8*A!sav|;Py3ZZ`Od1(KbJocaS02zM-k+(J~TV5%pR0vI<4+j2O2gz9PPe` zp%6euiI7;{B7VJ7=9R+y9*(Isri?60BI6gvwlx}QQ+ZL_|93K==BP`6Uq^a(Q9Lg!B2Hwn}fj?UlPOYLTP| zNn=YCLO!G+yDM>NQa;*5niCo?@$@#;5wlPkfZ~~Cuelp3t2!6=}+_YdcCut zYikoSnvewHIPA>JEOZw?0eYCwxd99`s%h@G^KIr8m0R}2V2Q>2rv3s)_V%_%`gGiM z6VxP~VmgEWSJOx+20XdEZ^u2g9KJJVPRS(gXivo-DMm)(t582NfZ&dQpF;(_=t?=zkoWWU~~D5dkiw!3yc? z{gE&IxDkT;@ynt58&o9CQdJ@mi$|o2V6-n^n~ruK!@`2I#_nt1t);D~4QY&X@p}Zs zsmSFu*uy3Q0<-A<5-&%wR$b9k3E*+}u1<`pwZc)3tZaFwFM5 zcW1-JuZ8m+KN7bVUWv@W59V6lm2UsXU31{}Kyh)JGDG8PgV(xUlZL)A1u^VfswojV zXzO&ser|}<;DvY?v&UH=lp`(2VvzA194Di^D(0zMA?TGJYA81OM#qQVG&+l z-q0a%_Rv^s{w{!2z@6NKnAPL%!XFJA2hEoG$S6QCwK2(^j2vgWn?x=KU7yWnwMp&n z3N0)Ao&Pl5^wUPlsvBbN^Adf{``XWyaXS*DKVirpE+QqQ!cJ&%vH^(SD)2Ncy}yku-))yy0&Q+1x4;&Mv0p=nfn2C!{4L=3`X)>F%da zyf~_$7I0vFMaGW-w2MW<=v#o7N~<9VGHRQ1MfFLmKcfkTUJeTlMb2+-)=BDkVfP$r z5q>wpO9JotAQ4tPQT`dnU_;_ln!$AHhF>ELy+7@zgA=(EVsahu;)4zIh87^=aV zm;1Hsm+J+_uRR~^7pw4VyY37)s%vd_V0k52TmJVHUK<{|BNBQIR-ReJ3s9?Tys69@a(sj$FyF15_eAY#-4Afv_>Z04j z(l+uwpvoa(?b#Sxkb2kF)>dSaGPIoKsQm1Ln{9FXUt#Ii{L@#T7+z<@o&Z?` zxGq>X4Ny?PaCLQc5LB1D=TLC}zA)FNMDQLb37>@IGrTIl^YK4+B}M8BLMd>$#;vyw zf;jo;!`9c07OV7W!^e8O9`|3WV}?v`EvL4|MAsA*6@%}#%->#&N*aznb}|BzlanKD zyQYZ?+&M=_M*+%|&AA6XlpK|aPHDDp(L8zT6fX(r>FGsZZ{|*ye}z2PbcNn`i^zC- z@?#ORQHzOXD@-wth&X+jun1v;QU!QhW$P5qvJ=Rfbhfg>`$ZOvP=zt&G#L0OR_=ZM zg&>J1ucl@_HS@8VZ~0v_D9T}P`kk2EY3;(5ZSH1LQqqr}=l6h`Hamtbh?@#BU*48S zQE4fU#k7g1ezh{xCWN{Y5lSnZKgvpOmDXTVrP!7H8Mhlp!pe$)SsKD{`*Er9U3uzP zAP}ekCjsIqLD?1ahTIeSoMRZKVQmw;J@!jAU#zYDwog`@Du=;gZ81R`ZyeHWlZJZW za(}fdxfV%WDXbfaz&(IV+axzSZV_Uwn2?Y_fFqo>PFlQk&CDYs^f!@>hbNJF<71ll z5+z6bjwi!rQw01|bPw&Yb|HbsH-?Ed(96&+v$NlBp=L(Uc!N;uw}&EK`wqZ0o51{F z%I6pAXYmzrf9n=_&0CvT|zB5Rb)Wj$SCHFK{ulJ7ZU99GF9%eqT`r#3@E+u%V=Jm3{2I#;wm-V`kP()dBeT;)Z(L)&FQxzO8I3KtiYfGF>I z_~%2<8tx*otF2VLXXW;Rrd8y$hr$kJQwAa9*!#1}s;ZmL&PhGZ@n+NxHkLHFvdgqA z75G{jLY8ij?E+ROM*e%8C;O(@v7T|e;?G)I5-iIlGB?#H&KM#wze%R~ujlG(B&&5A zuB7Shnlc)z>|ZDum3CG<$$AOrh)76y{GV>*hK)Q|zEYz6h)bNZuXVJqv#ct|7M!d% zJF}AvR##25Xy4hfKs`7w>d_e|+M1N9$SJ-;BYSRQ#ecnQRqIFG$o?OMO69eEwk zGf#iy=H}kM4*n%g%t{|n!P~JBr&w%v(>;pY{F{gd+y20s$u8fk+|-CXWpz$6mr;qv zAXr0VKwUzJ|Kv2D`EpPlzn+PMqhzP-1mi~wqw`)Lc^S*H;&hIf*l=;|l4gdrwL^-8 zU;CkR7T)AS&)BxStaf3*wq0%n>kS%^=3ZX3wc+O!;c+@bdSY-<=d)@O84=XA!&dC*d3XpjC-*PG4;SW6ZF|J=u(C3yIC3$?7@h72 z!me>~EzK!`S5)s8(@rmET3Bk*9*Qy4li93nxBrL}mqy@LRsMYVc2Dh3)0Q^dR%K|J z*7>U;$AHMn8T+3xN|;Q+KCubnYgq z8SQQMfW^Vk>)a!AE?(hMu|1NL)3gn@vnUVGb}JA1mDWVl!roSEDurIgFzZ*f^p9cn z^>&1M9suI#0pzP>SOhx^&-ysp8>WX%&brGW&9?hV_yqjal%1IsVkGtfYS3LR$*8L) zpV%0)=3ao2m}j39@Uw&Hl*h8dhKrO8VR_*s-YrIs7B%F<7ieydORddeQg1OPN-7JH zs5WrO%{W2u(B<2oqd~as2RBtp?}J|py&`dq=F+A4_&JV>oa#aM&xtX9uLFM?g9jF_ zutyS%yQnk4l|*mAE$zX(V;8S5C;fERnU{Uj6s}v?v`rERY-au(2LNeU%AGNjn+i5B1-;o z@U9V#@-!#g+kNFs29w5zYJOv*sRu}^jmAe|qm)g>6Mo}LF_@Ly2)s!gQ2=-<;wyi3 zfd8f+pQ_YX#>LeKi(TBBA9D`0pFZUf+B*tbvM?7VC^lff$-jopj1n3xRFXKq+zO*UA2E_RIH3nIK%{LmVM{m6Ww|WuFIu*L zJ98*bzGx?-*ZsQ`QJConz{TZ+YIxi4tK)CWWRJw?LNO!`is(LQK_TF61Ofu1X{p5} z5puHFO2fS7=9FYe_xq19%il5h#pf;Xqm`Y#{YtBAA(!1e6VMkoPosRf&Rkk=47TY9 z!MNY>%3aR6@`@}M!g+Zp6tp_kL&c?>P_n-g0xk*C2m%?eW-~zlk+k ze>r9zSTQnsH7S}xN!FUfCSYmYmV*-$%Jud2@(K!<4+p1_d>R@WBV%JU@Vym�@Qe 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 Date: Fri, 12 Jun 2026 03:44:23 +0000 Subject: [PATCH 014/126] Automatic changelog for PR #96406 [ci skip] --- html/changelogs/AutoChangeLog-pr-96406.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96406.yml diff --git a/html/changelogs/AutoChangeLog-pr-96406.yml b/html/changelogs/AutoChangeLog-pr-96406.yml new file mode 100644 index 00000000000..643bcf68299 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96406.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - admin: "Prayers from players are now boxed (like examine messages and some health readouts for example), making them easier to tell apart from the constant stream of text in your chat tabs." + - rscadd: "Santa Claus can now hear prayers that mention him or Christmas. He won't know who's praying unless told, though he can tell if they're naughty." \ No newline at end of file From 15377a29e7ccde064e31ed9e11c0f42926b93029 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 04:48:14 +0000 Subject: [PATCH 015/126] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-96406.yml | 5 ----- html/changelogs/archive/2026-06.yml | 6 ++++++ 2 files changed, 6 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-96406.yml diff --git a/html/changelogs/AutoChangeLog-pr-96406.yml b/html/changelogs/AutoChangeLog-pr-96406.yml deleted file mode 100644 index 643bcf68299..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96406.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - admin: "Prayers from players are now boxed (like examine messages and some health readouts for example), making them easier to tell apart from the constant stream of text in your chat tabs." - - rscadd: "Santa Claus can now hear prayers that mention him or Christmas. He won't know who's praying unless told, though he can tell if they're naughty." \ No newline at end of file diff --git a/html/changelogs/archive/2026-06.yml b/html/changelogs/archive/2026-06.yml index 2524d7d777a..f90bdd5a658 100644 --- a/html/changelogs/archive/2026-06.yml +++ b/html/changelogs/archive/2026-06.yml @@ -292,6 +292,12 @@ - sound: Add keypad sounds to secure safes - sound: Add drill sound to surgical drill 2026-06-12: + Ghommie: + - admin: Prayers from players are now boxed (like examine messages and some health + readouts for example), making them easier to tell apart from the constant stream + of text in your chat tabs. + - rscadd: Santa Claus can now hear prayers that mention him or Christmas. He won't + know who's praying unless told, though he can tell if they're naughty. antropod: - bugfix: fixed material tiles and walls not having material when constructed from last item in the stack From cd966fcdd2f14b496338a88c508f27631d7104b1 Mon Sep 17 00:00:00 2001 From: Lucy Date: Fri, 12 Jun 2026 01:31:20 -0400 Subject: [PATCH 016/126] chatbox websocket client! (#96241) ## About The Pull Request Ports https://github.com/Monkestation/Monkestation2.0/pull/5744, alongside the metadata stuff from https://github.com/Monkestation/Monkestation2.0/pull/11617 and https://github.com/Monkestation/Monkestation2.0/pull/11644 > This PR adds a websocket client to the chatbox, that redirects all incoming payloads from the server, to the specified server, which allows for external integrations with the game. All of which is parsable JSON. > > Some ideas include RGB feedback, triggering an event in VTubing software, or automating a physical device based on what's sent to the chat. (For example, a haptic suit, and have a regex for "in the right leg" or any body part) The websocket can also be used to request basic "metadata" about the current round - server name, station name, round id, map name, round duration, and game state (all this information can be obtained via the `status` world topic without being logged in anyways, to be clear) - if the server has webroot set up, it will also send the webroot base url and the links to the chat assets (i added this just so i could embed the chat styling and icons in my chat log html) **To be clear, the websocket is entirely client-side, if it's not obvious.**
Example of metadata JSON ```json { "type": "metadata", "payload": { "game_version": "/tg/Station 13", "server_name": "kbity station 13 (tg)", "round_id": "152", "map_name": "Minimal Runtime Station", "round_duration": 6, "gamestate": 3 } } ```
if y'all make a freaky joke i will beat you with a rock, I do not care about _that_ kind of thing in the slightest. ## Why It's Good For The Game Lots of interesting things. I've made a doohickey that allows me to automatically save my chat logs instead of having to manually click "Save Chat Log" in settings repeatedly (which is also limited by the chat scrollback limit) "i have had a recurring thought of adding websocket support so I can swap my spotify playlists whenever I get into combat on lavaland" - smartkar ## Screenshots 2026-05-27 (1779927348) ~
dreamseeker 2026-05-27 (1779927386) ~
WindowsTerminal 2026-05-27 (1779927395) ~
dreamseeker ## Changelog :cl: Absolucy, Flleeppyy add: Added a websocket client, you can now forward incoming chat messages to an external program, i.e allowing you to change music playlists based on events, or such. /:cl: --- code/modules/tgui_panel/tgui_panel.dm | 33 +++ tgui/packages/tgui-panel/index.tsx | 6 +- .../tgui-panel/settings/SettingsPanel.tsx | 2 + .../tgui-panel/settings/SettingsWebsocket.tsx | 94 +++++++++ tgui/packages/tgui-panel/settings/atoms.ts | 2 + .../packages/tgui-panel/settings/constants.ts | 4 + .../packages/tgui-panel/settings/migration.ts | 6 + tgui/packages/tgui-panel/settings/types.ts | 2 + tgui/packages/tgui-panel/websocket/helpers.ts | 190 ++++++++++++++++++ 9 files changed, 338 insertions(+), 1 deletion(-) create mode 100644 tgui/packages/tgui-panel/settings/SettingsWebsocket.tsx create mode 100644 tgui/packages/tgui-panel/websocket/helpers.ts diff --git a/code/modules/tgui_panel/tgui_panel.dm b/code/modules/tgui_panel/tgui_panel.dm index ecb3ad626a8..8b1a366c0a0 100644 --- a/code/modules/tgui_panel/tgui_panel.dm +++ b/code/modules/tgui_panel/tgui_panel.dm @@ -103,6 +103,10 @@ analyze_telemetry(payload) return TRUE + if(type == "requestMetadata") + send_metadata() + return TRUE + /** * public * @@ -110,3 +114,32 @@ */ /datum/tgui_panel/proc/send_roundrestart() window.send_message("roundrestart") + +/** + * private + * + * Sent when a client requests metadata - used for websocket stuff. + */ +/datum/tgui_panel/proc/send_metadata() + var/static/list/webroot_asset_urls + + var/list/metadata = list( + "game_version" = GLOB.game_version, + "server_name" = CONFIG_GET(string/servername), + "round_id" = GLOB.round_id, + "map_name" = SSmapping.current_map?.map_name, + "round_duration" = round(STATION_TIME_PASSED() / 10, 1), + "gamestate" = SSticker.current_state, + ) + // if we're using webroot - also pass along the webroot url and such, so we can embed chat logs with the proper styles/images if desired + if(istype(SSassets.transport, /datum/asset_transport/webroot)) + if(isnull(webroot_asset_urls)) + webroot_asset_urls = list() + for(var/asset_type in list(/datum/asset/simple/tgui_panel, /datum/asset/simple/namespaced/fontawesome, /datum/asset/simple/namespaced/tgfont, /datum/asset/spritesheet_batched/chat)) + var/datum/asset/asset = get_asset_datum(asset_type) + webroot_asset_urls += asset.get_url_mappings() + metadata["webroot"] = list( + "base_url" = CONFIG_GET(string/asset_cdn_url), + "assets" = webroot_asset_urls, + ) + window.send_message("metadata", metadata) diff --git a/tgui/packages/tgui-panel/index.tsx b/tgui/packages/tgui-panel/index.tsx index 8ccc51fd16e..c4d23c2d5eb 100644 --- a/tgui/packages/tgui-panel/index.tsx +++ b/tgui/packages/tgui-panel/index.tsx @@ -14,6 +14,7 @@ import { setupHotReloading } from 'tgui-dev-server/link/client'; import { App } from './app'; import { bus } from './events/listeners'; import { setupPanelFocusHacks } from './panelFocus'; +import { wsSend } from './websocket/helpers'; const root = createRoot(document.getElementById('react-root')!); @@ -38,7 +39,10 @@ function setupApp() { render(); // Dispatch incoming messages as store actions - Byond.subscribe((type, payload) => bus.dispatch({ type, payload })); + Byond.subscribe((type, payload) => { + bus.dispatch({ type, payload }); + wsSend({ type, payload }); + }); // Unhide the panel Byond.winset('output_selector.legacy_output_selector', { diff --git a/tgui/packages/tgui-panel/settings/SettingsPanel.tsx b/tgui/packages/tgui-panel/settings/SettingsPanel.tsx index 1efcfe8facf..7e8b62ab596 100644 --- a/tgui/packages/tgui-panel/settings/SettingsPanel.tsx +++ b/tgui/packages/tgui-panel/settings/SettingsPanel.tsx @@ -9,6 +9,7 @@ import { ChatPageSettings } from '../chat/ChatPageSettings'; import { SETTINGS_TABS } from './constants'; import { SettingsGeneral } from './SettingsGeneral'; import { SettingsStatPanel } from './SettingsStatPanel'; +import { SettingsWebsocket } from './SettingsWebsocket'; import { TextHighlightSettings } from './TextHighlight'; import { useSettings } from './use-settings'; @@ -48,6 +49,7 @@ export function SettingsPanel(props) { {activeTab === 'chatPage' && } {activeTab === 'textHighlight' && } {activeTab === 'statPanel' && } + {activeTab === 'websocket' && } ); diff --git a/tgui/packages/tgui-panel/settings/SettingsWebsocket.tsx b/tgui/packages/tgui-panel/settings/SettingsWebsocket.tsx new file mode 100644 index 00000000000..4905b4b3f1d --- /dev/null +++ b/tgui/packages/tgui-panel/settings/SettingsWebsocket.tsx @@ -0,0 +1,94 @@ +import { + Button, + Input, + LabeledList, + Section, + Stack, +} from 'tgui-core/components'; +import { chatRenderer } from 'tgui-panel/chat/renderer'; +import { + wsDisconnect, + wsReconnect, + wsUpdate, +} from 'tgui-panel/websocket/helpers'; +import { useSettings } from './use-settings'; + +export function SettingsWebsocket(props) { + const { settings, updateSettings } = useSettings(); + const { statLinked, statFontSize, statTabsStyle } = settings; + + return ( +
+ + + + + { + const websocketEnabled = !settings.websocketEnabled; + updateSettings({ websocketEnabled }); + wsUpdate(websocketEnabled); + }} + > + Enabled + + + + + + + +
+ ); +} diff --git a/tgui/packages/tgui-panel/settings/atoms.ts b/tgui/packages/tgui-panel/settings/atoms.ts index 275d5b8f2fb..dbf2bb652f0 100644 --- a/tgui/packages/tgui-panel/settings/atoms.ts +++ b/tgui/packages/tgui-panel/settings/atoms.ts @@ -17,6 +17,8 @@ export const defaultSettings: SettingsState = { visible: false, activeTab: SETTINGS_TABS[0].id, }, + websocketEnabled: false, + websocketServer: '', }; export const defaultHighlightSetting: HighlightSetting = { diff --git a/tgui/packages/tgui-panel/settings/constants.ts b/tgui/packages/tgui-panel/settings/constants.ts index 2e5056f785e..3b7f4592b04 100644 --- a/tgui/packages/tgui-panel/settings/constants.ts +++ b/tgui/packages/tgui-panel/settings/constants.ts @@ -43,6 +43,10 @@ export const SETTINGS_TABS = [ id: 'statPanel', name: 'Stat Panel', }, + { + id: 'websocket', + name: 'Websocket', + }, ] as const; export const FONTS_DISABLED = 'Default'; diff --git a/tgui/packages/tgui-panel/settings/migration.ts b/tgui/packages/tgui-panel/settings/migration.ts index d90f89fcd44..01318e0cb24 100644 --- a/tgui/packages/tgui-panel/settings/migration.ts +++ b/tgui/packages/tgui-panel/settings/migration.ts @@ -1,6 +1,7 @@ import { storage } from 'common/storage'; import { smoothMerge } from 'common/type-safety'; import { omit, pick } from 'es-toolkit'; +import { wsUpdate } from 'tgui-panel/websocket/helpers'; import { setMusicVolume } from '../audio/handlers'; import { chatRenderer } from '../chat/renderer'; import { store } from '../events/store'; @@ -111,6 +112,11 @@ export function startSettingsMigration(next: MergedSettings): void { store.set(settingsAtom, draftSettings); console.log('Migrated panel settings:', draftSettings); + if (draftSettings.websocketEnabled !== defaultSettings.websocketEnabled) { + // Ensure websocket state is correct after migration + wsUpdate(draftSettings.websocketEnabled); + } + const migratedHighlights = migrateHighlights(highlightPart); // Just exit if no valid version was found diff --git a/tgui/packages/tgui-panel/settings/types.ts b/tgui/packages/tgui-panel/settings/types.ts index f7284e41e24..d77dc93fa5e 100644 --- a/tgui/packages/tgui-panel/settings/types.ts +++ b/tgui/packages/tgui-panel/settings/types.ts @@ -18,6 +18,8 @@ export const settingsSchema = z.object({ theme: z.string(), version: z.number(), view: viewSchema, + websocketEnabled: z.boolean(), + websocketServer: z.string(), }); export type HighlightSetting = { diff --git a/tgui/packages/tgui-panel/websocket/helpers.ts b/tgui/packages/tgui-panel/websocket/helpers.ts new file mode 100644 index 00000000000..cc1db416dff --- /dev/null +++ b/tgui/packages/tgui-panel/websocket/helpers.ts @@ -0,0 +1,190 @@ +import { createLogger } from 'tgui/logging'; +import { chatRenderer } from 'tgui-panel/chat/renderer'; +import { store } from 'tgui-panel/events/store'; +import { settingsAtom } from 'tgui-panel/settings/atoms'; + +const MAX_RETRIES = 10; +const RETRY_INTERVAL = 500; // ms + +// Websocket close codes +const WEBSOCKET_DISABLED = 4555; +const WEBSOCKET_REATTEMPT = 4556; +const SAFE_CLOSE_CODE = 1000; + +const logger = createLogger('websocket'); + +let websocket: WebSocket | null = null; +let reconnectTimer: number | null = null; +let retryCount = 0; +let manuallyClosed = false; + +function sendWSNotice(message, small = false) { + chatRenderer.processBatch([ + { + html: small + ? `${message}` + : `
${message}
`, + }, + ]); +} + +function clearReconnectTimer() { + if (reconnectTimer !== null) { + clearInterval(reconnectTimer); + reconnectTimer = null; + } +} + +function safeClose(code = SAFE_CLOSE_CODE, reason?: string) { + if (!websocket) return; + if ( + websocket.readyState === WebSocket.CLOSED || + websocket.readyState === WebSocket.CLOSING + ) { + return; + } + + websocket.close(code, reason); +} + +function startReconnectLoop() { + if (reconnectTimer !== null) return; + + reconnectTimer = window.setInterval(() => { + const { websocketEnabled } = store.get(settingsAtom); + + if (!websocketEnabled) { + clearReconnectTimer(); + return; + } + + if (retryCount >= MAX_RETRIES) { + clearReconnectTimer(); + sendWSNotice( + `Websocket failed to reconnect after ${MAX_RETRIES} attempts.`, + true, + ); + return; + } + + if ( + !websocket || + websocket.readyState === WebSocket.CLOSED || + websocket.readyState === WebSocket.CLOSING + ) { + retryCount++; + setupWebsocket(); + } + }, RETRY_INTERVAL); +} + +function setupWebsocket(force = false) { + const { websocketEnabled, websocketServer } = store.get(settingsAtom); + + if (!websocketEnabled) { + clearReconnectTimer(); + safeClose(WEBSOCKET_DISABLED); + websocket = null; + return; + } + + if (!force && websocket && websocket.readyState === WebSocket.OPEN) { + return; + } + + if (force) { + clearReconnectTimer(); + + if (websocket) { + manuallyClosed = true; + try { + websocket.close(WEBSOCKET_REATTEMPT, 'forced reconnect'); + } catch { + /* ignore */ + } + websocket = null; + } + } + + try { + manuallyClosed = false; + websocket = new WebSocket(`ws://${websocketServer}`); + } catch (e: any) { + if (e.name === 'SyntaxError') { + sendWSNotice( + `Error creating websocket: Invalid address! Make sure you're following the placeholder. Example: localhost:1234`, + true, + ); + return; + } + sendWSNotice(`Error creating websocket: ${e.name} - ${e.message}`); + startReconnectLoop(); + return; + } + + websocket.addEventListener('open', () => { + clearReconnectTimer(); + sendWSNotice('Websocket connected!', true); + Byond.sendMessage('requestMetadata'); // let's be nice and request metadata + retryCount = 0; + }); + + websocket.addEventListener('message', (event) => { + if (event.data === 'requestMetadata') { + Byond.sendMessage('requestMetadata'); + } + }); + + websocket.addEventListener('close', (ev) => { + websocket = null; + + if (manuallyClosed || ev.code === WEBSOCKET_DISABLED) return; + + sendWSNotice( + `Websocket disconnected! Code: ${ev.code} Reason: ${ev.reason || 'None provided'}`, + true, + ); + + startReconnectLoop(); + }); + + websocket.addEventListener('error', (ev) => { + logger.error('got websocket error', ev); + safeClose(WEBSOCKET_REATTEMPT, 'got error from server'); + }); +} + +// Initial connect +setupWebsocket(); + +export function wsUpdate(enabled: boolean): void { + if (enabled) { + setupWebsocket(); + return; + } + + manuallyClosed = true; + clearReconnectTimer(); + safeClose(WEBSOCKET_DISABLED); + websocket = null; +} + +export function wsReconnect(): void { + setupWebsocket(true); + sendWSNotice('Attempting to connect to websocket...', true); +} + +export function wsDisconnect(): void { + manuallyClosed = true; + clearReconnectTimer(); + safeClose(WEBSOCKET_DISABLED); + websocket = null; + retryCount = 0; + sendWSNotice('Websocket forcefully disconnected. (Retry count reset)', true); +} + +export function wsSend(msg: Record): void { + if (websocket?.readyState === WebSocket.OPEN) { + websocket.send(JSON.stringify(msg)); + } +} From fb4236dc22f1e53ab0839da2b665f361b63dc09b Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 05:31:39 +0000 Subject: [PATCH 017/126] Automatic changelog for PR #96241 [ci skip] --- html/changelogs/AutoChangeLog-pr-96241.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96241.yml diff --git a/html/changelogs/AutoChangeLog-pr-96241.yml b/html/changelogs/AutoChangeLog-pr-96241.yml new file mode 100644 index 00000000000..60e021ab5eb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96241.yml @@ -0,0 +1,4 @@ +author: "Absolucy, Flleeppyy" +delete-after: True +changes: + - rscadd: "Added a websocket client, you can now forward incoming chat messages to an external program, i.e allowing you to change music playlists based on events, or such." \ No newline at end of file From 0f480514710f29591a17ca1865f70608d95ed00d Mon Sep 17 00:00:00 2001 From: Hatterhat <31829017+Hatterhat@users.noreply.github.com> Date: Fri, 12 Jun 2026 00:43:10 -0500 Subject: [PATCH 018/126] capitalizes butterbeans when planted (#96442) ## About The Pull Request Capitalizes the butterbean plant name when planted so it shows up as `hydroponics tray (Butterbean Plant)`, instead of `hydroponics tray (butterbean Plant)`. ## Why It's Good For The Game Consistency (this one thing has bugged me for a while and I have only just now decided to fix it). ## Changelog :cl: spellcheck: Butterbean plants are now capitalized properly when planted. /:cl: Co-authored-by: Hatterhat --- code/modules/hydroponics/grown/beans.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index 51c8643113e..2c7151a124b 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -69,7 +69,7 @@ desc = "These seeds grow into butterbean plants." icon_state = "seed-butterbean" species = "butterbean" - plantname = "butterbean Plants" + plantname = "Butterbean Plants" product = /obj/item/food/grown/butterbeans potency = 10 mutatelist = null From cc3348551bedb0b3ddc037072fdb1a322aaecc60 Mon Sep 17 00:00:00 2001 From: Hatterhat <31829017+Hatterhat@users.noreply.github.com> Date: Fri, 12 Jun 2026 00:43:18 -0500 Subject: [PATCH 019/126] botanic trays transfer soil properly again (#96435) ## About The Pull Request After #96352 got merged, the actual interaction for dumping a bag of soil/vermaculite/etc. into a hydroponics tray broke because the current_soil (and subsequently soil flags) weren't being transferred properly. This fixes that by adjusting transfer_soil() to return the placed/moved soil, allowing us to grab the soil flags and whatnot. ## Why It's Good For The Game I think dumping soil into the tray should probably work right. ## Changelog 96352 didn't have a changelog so maybe this one shouldn't either. --------- Co-authored-by: Hatterhat --- code/modules/hydroponics/hydroponics.dm | 3 +-- code/modules/hydroponics/soil.dm | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 51dd5226eb4..7311af695e2 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -1117,8 +1117,7 @@ if(!do_after(user, 2 SECONDS, src)) return - oursoil.transfer_soil(src, inside_tray = TRUE) - + current_soil = oursoil.transfer_soil(src, inside_tray = TRUE) RefreshParts() tray_flags = current_soil.tray_flags diff --git a/code/modules/hydroponics/soil.dm b/code/modules/hydroponics/soil.dm index fb343bb29d0..b67c789b426 100644 --- a/code/modules/hydroponics/soil.dm +++ b/code/modules/hydroponics/soil.dm @@ -184,7 +184,9 @@ playsound(target, placement_sound, 65, vary = TRUE) if(!inside_tray) stored_soil.on_place() + var/obj/machinery/hydroponics/soil_ref = stored_soil stored_soil.forceMove(target) //stored_soil is set to null at this point, and the soil sack is deleted when that happens + return soil_ref /obj/item/soil_sack/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) if(attack_type == OVERWHELMING_ATTACK) From 09ed683c149ecca591f360a7cc063f8fccd109f4 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 05:43:30 +0000 Subject: [PATCH 020/126] Automatic changelog for PR #96442 [ci skip] --- html/changelogs/AutoChangeLog-pr-96442.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96442.yml diff --git a/html/changelogs/AutoChangeLog-pr-96442.yml b/html/changelogs/AutoChangeLog-pr-96442.yml new file mode 100644 index 00000000000..c7da3e904bb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96442.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - spellcheck: "Butterbean plants are now capitalized properly when planted." \ No newline at end of file From 893f02599aa3d7b74c6ea1d32d755ad6bed9ef02 Mon Sep 17 00:00:00 2001 From: TymSha <146993255+TymSha@users.noreply.github.com> Date: Fri, 12 Jun 2026 08:47:10 +0300 Subject: [PATCH 021/126] Ooze mob QoL + mending globule fix (#96423) ## About The Pull Request Mending globule can no longer be cast if you don't have enough nutrition to do so. The ooze hud now inherits the living hud, meaning ooze mobs can see their health and all of the other stuff. image The combination of the nutrition display and the health doll is kinda ugly for now but probably better than nothing. The descriptions of shoolean grapes abilities now include the cost of the ability in question. ## Why It's Good For The Game Not being able to see how wounded you are is kinda bad, and being able to see that is kinda good. Knowing how much your abilities cost is good too. ## Changelog :cl: qol: Ooze mobs from cytology now have the same type of HUD as other mobs, allowing them to see their health qol: The abilities of shoolean grapes now have their cost specified in their description fix: The mending globule ability used by shoolean grapes no longer can be cast while there isn't enough nutrition to do so /:cl: --- code/_onclick/hud/ooze.dm | 2 +- .../mob/living/simple_animal/hostile/ooze.dm | 27 ++++++++----------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/code/_onclick/hud/ooze.dm b/code/_onclick/hud/ooze.dm index e796df33b4a..5d0fa005fe2 100644 --- a/code/_onclick/hud/ooze.dm +++ b/code/_onclick/hud/ooze.dm @@ -1,5 +1,5 @@ ///Hud type with targeting dol and a nutrition bar -/datum/hud/ooze/initialize_screen_objects() +/datum/hud/living/ooze/initialize_screen_objects() . = ..() add_screen_object(/atom/movable/screen/zone_sel, HUD_MOB_ZONE_SELECTOR, HUD_GROUP_STATIC, ui_style) add_screen_object(/atom/movable/screen/ooze_nutrition_display, HUD_OOZE_NUTRITION_DISPLAY) diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm index 4bb2858bce1..749f60e58d2 100644 --- a/code/modules/mob/living/simple_animal/hostile/ooze.dm +++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm @@ -11,7 +11,7 @@ emote_see = list("jiggles", "bounces in place") speak_emote = list("blorbles") atmos_requirements = null - hud_type = /datum/hud/ooze + hud_type = /datum/hud/living/ooze minbodytemp = 250 maxbodytemp = INFINITY faction = list(FACTION_SLIME) @@ -322,7 +322,7 @@ ///Ability that allows the owner to fire healing globules at mobs, targeting specific limbs. /datum/action/cooldown/globules name = "Fire Mending globule" - desc = "Fires a mending globule at someone, healing a specific limb of theirs." + desc = "Fires a mending globule at someone, healing a specific limb of theirs. Costs 5 nutrition." background_icon_state = "bg_hive" overlay_icon_state = "bg_hive_border" button_icon = 'icons/mob/actions/actions_slime.dmi' @@ -332,10 +332,16 @@ click_to_activate = TRUE /datum/action/cooldown/globules/set_click_ability(mob/on_who) + var/mob/living/simple_animal/hostile/ooze/oozy_owner = owner + if(istype(oozy_owner)) + if(oozy_owner.ooze_nutrition < 5) + to_chat(oozy_owner, span_warning("You need at least 5 nutrition to launch a mending globule.")) + return . = ..() if(!.) return + oozy_owner.adjust_ooze_nutrition(-5) to_chat(on_who, span_notice("You prepare to launch a mending globule. Left-click to fire at a target!")) /datum/action/cooldown/globules/unset_click_ability(mob/on_who, refund_cooldown = TRUE) @@ -344,21 +350,10 @@ return if(refund_cooldown) + var/mob/living/simple_animal/hostile/ooze/oozy_owner = owner + oozy_owner.adjust_ooze_nutrition(5) to_chat(on_who, span_notice("You stop preparing your mending globules.")) -/datum/action/cooldown/globules/Activate(atom/target) - . = ..() - if(!.) - return FALSE - - var/mob/living/simple_animal/hostile/ooze/oozy_owner = owner - if(istype(oozy_owner)) - if(oozy_owner.ooze_nutrition < 5) - to_chat(oozy_owner, span_warning("You need at least 5 nutrition to launch a mending globule.")) - return FALSE - - return TRUE - /datum/action/cooldown/globules/InterceptClickOn(mob/living/clicker, params, atom/target) . = ..() if(!.) @@ -426,7 +421,7 @@ ///This action lets you put a mob inside of a cacoon that will inject it with some chemicals. /datum/action/cooldown/gel_cocoon name = "Gel Cocoon" - desc = "Puts a mob inside of a cocoon, allowing it to slowly heal." + desc = "Puts a mob inside of a cocoon, allowing it to slowly heal. Costs 30 nutrition." background_icon_state = "bg_hive" overlay_icon_state = "bg_hive_border" button_icon = 'icons/mob/actions/actions_slime.dmi' From ab91e860da714f477f5cbfb795917f15a3f94883 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 05:47:30 +0000 Subject: [PATCH 022/126] Automatic changelog for PR #96423 [ci skip] --- html/changelogs/AutoChangeLog-pr-96423.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96423.yml diff --git a/html/changelogs/AutoChangeLog-pr-96423.yml b/html/changelogs/AutoChangeLog-pr-96423.yml new file mode 100644 index 00000000000..cf36d1c8768 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96423.yml @@ -0,0 +1,6 @@ +author: "TymSha" +delete-after: True +changes: + - qol: "Ooze mobs from cytology now have the same type of HUD as other mobs, allowing them to see their health" + - qol: "The abilities of shoolean grapes now have their cost specified in their description" + - bugfix: "The mending globule ability used by shoolean grapes no longer can be cast while there isn't enough nutrition to do so" \ No newline at end of file From 8d37abd0dd98f4a0a432085f477679ee6a9fee23 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 06:00:19 +0000 Subject: [PATCH 023/126] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-96241.yml | 4 ---- html/changelogs/AutoChangeLog-pr-96423.yml | 6 ------ html/changelogs/AutoChangeLog-pr-96442.yml | 4 ---- html/changelogs/archive/2026-06.yml | 12 ++++++++++++ 4 files changed, 12 insertions(+), 14 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-96241.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-96423.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-96442.yml diff --git a/html/changelogs/AutoChangeLog-pr-96241.yml b/html/changelogs/AutoChangeLog-pr-96241.yml deleted file mode 100644 index 60e021ab5eb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96241.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Absolucy, Flleeppyy" -delete-after: True -changes: - - rscadd: "Added a websocket client, you can now forward incoming chat messages to an external program, i.e allowing you to change music playlists based on events, or such." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-96423.yml b/html/changelogs/AutoChangeLog-pr-96423.yml deleted file mode 100644 index cf36d1c8768..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96423.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "TymSha" -delete-after: True -changes: - - qol: "Ooze mobs from cytology now have the same type of HUD as other mobs, allowing them to see their health" - - qol: "The abilities of shoolean grapes now have their cost specified in their description" - - bugfix: "The mending globule ability used by shoolean grapes no longer can be cast while there isn't enough nutrition to do so" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-96442.yml b/html/changelogs/AutoChangeLog-pr-96442.yml deleted file mode 100644 index c7da3e904bb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96442.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Hatterhat" -delete-after: True -changes: - - spellcheck: "Butterbean plants are now capitalized properly when planted." \ No newline at end of file diff --git a/html/changelogs/archive/2026-06.yml b/html/changelogs/archive/2026-06.yml index f90bdd5a658..387d47064a3 100644 --- a/html/changelogs/archive/2026-06.yml +++ b/html/changelogs/archive/2026-06.yml @@ -292,12 +292,24 @@ - sound: Add keypad sounds to secure safes - sound: Add drill sound to surgical drill 2026-06-12: + Absolucy, Flleeppyy: + - rscadd: Added a websocket client, you can now forward incoming chat messages to + an external program, i.e allowing you to change music playlists based on events, + or such. Ghommie: - admin: Prayers from players are now boxed (like examine messages and some health readouts for example), making them easier to tell apart from the constant stream of text in your chat tabs. - rscadd: Santa Claus can now hear prayers that mention him or Christmas. He won't know who's praying unless told, though he can tell if they're naughty. + Hatterhat: + - spellcheck: Butterbean plants are now capitalized properly when planted. + TymSha: + - qol: Ooze mobs from cytology now have the same type of HUD as other mobs, allowing + them to see their health + - qol: The abilities of shoolean grapes now have their cost specified in their description + - bugfix: The mending globule ability used by shoolean grapes no longer can be cast + while there isn't enough nutrition to do so antropod: - bugfix: fixed material tiles and walls not having material when constructed from last item in the stack From 64baa1979d06489f87ce5268474396accebb9d62 Mon Sep 17 00:00:00 2001 From: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com> Date: Fri, 12 Jun 2026 09:58:13 +0300 Subject: [PATCH 024/126] Basic mulebots. last basic bot refactor (#95899) my watch has ended ffffff ## Changelog :cl: Profakos (originally pulled from their branch, did massive chunk of this), Ben10omintrix refactor: mulebots have been refactored. please report any bugs /:cl: --- .../CatwalkStation/CatwalkStation_2023.dmm | 4 +- .../map_files/Deltastation/DeltaStation2.dmm | 4 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 4 +- _maps/map_files/MetaStation/MetaStation.dmm | 6 +- .../map_files/NebulaStation/NebulaStation.dmm | 6 +- _maps/map_files/tramstation/tramstation.dmm | 8 +- _maps/map_files/wawastation/wawastation.dmm | 4 +- code/__DEFINES/ai/ai.dm | 1 + code/__DEFINES/ai/bot_keys.dm | 9 + .../signals/signals_mob/signals_mob_main.dm | 4 +- .../__DEFINES/dcs/signals/signals_moveloop.dm | 3 + code/__DEFINES/hud.dm | 2 + code/__DEFINES/is_helpers.dm | 4 +- code/__DEFINES/robots.dm | 7 + code/__HELPERS/names.dm | 3 - code/_globalvars/phobias.dm | 3 +- .../subsystem/movement/movement_types.dm | 88 ++ code/datums/ai/movement/ai_movement_jps.dm | 43 +- code/datums/wires/mulebot.dm | 13 +- code/game/data_huds.dm | 40 - code/game/machinery/botlaunchpad.dm | 8 +- code/game/objects/structures/plasticflaps.dm | 2 +- .../antagonists/malf_ai/malf_ai_modules.dm | 2 +- code/modules/antagonists/spy/spy_bounty.dm | 2 +- code/modules/cargo/packs/service.dm | 2 +- code/modules/events/ion_storm.dm | 2 +- code/modules/mob/dead/observer/orbit.dm | 2 +- code/modules/mob/living/basic/bots/_bots.dm | 2 +- .../mob/living/basic/bots/mulebot/mulebot.dm | 193 +++ .../living/basic/bots/mulebot/mulebot_ai.dm | 145 ++ .../basic/bots/mulebot/mulebot_control.dm | 116 ++ .../basic/bots/mulebot/mulebot_delivery.dm | 117 ++ .../living/basic/bots/mulebot/mulebot_hud.dm | 74 + .../basic/bots/mulebot/mulebot_movement.dm | 72 + .../basic/bots/mulebot/mulebot_paranormal.dm | 61 + .../bots/mulebot/mulebot_tool_interactions.dm | 46 + .../living/basic/bots/repairbot/repairbot.dm | 2 +- .../revenant/revenant_abilities.dm | 6 - code/modules/mob/living/silicon/ai/ai.dm | 9 +- .../mob/living/silicon/ai/robot_control.dm | 60 +- .../mob/living/simple_animal/bot/bot.dm | 1231 ----------------- .../simple_animal/bot/bot_announcement.dm | 4 +- .../mob/living/simple_animal/bot/mulebot.dm | 873 ------------ code/modules/mod/modules/modules_ninja.dm | 2 +- .../file_system/programs/robocontrol.dm | 48 +- .../spell_types/shapeshift/_shapeshift.dm | 4 +- .../unit_tests/simple_animal_freeze.dm | 3 - tgstation.dme | 10 +- tools/UpdatePaths/Scripts/96500_mulebots.txt | 2 + 49 files changed, 1069 insertions(+), 2287 deletions(-) create mode 100644 code/modules/mob/living/basic/bots/mulebot/mulebot.dm create mode 100644 code/modules/mob/living/basic/bots/mulebot/mulebot_ai.dm create mode 100644 code/modules/mob/living/basic/bots/mulebot/mulebot_control.dm create mode 100644 code/modules/mob/living/basic/bots/mulebot/mulebot_delivery.dm create mode 100644 code/modules/mob/living/basic/bots/mulebot/mulebot_hud.dm create mode 100644 code/modules/mob/living/basic/bots/mulebot/mulebot_movement.dm create mode 100644 code/modules/mob/living/basic/bots/mulebot/mulebot_paranormal.dm create mode 100644 code/modules/mob/living/basic/bots/mulebot/mulebot_tool_interactions.dm delete mode 100644 code/modules/mob/living/simple_animal/bot/bot.dm delete mode 100644 code/modules/mob/living/simple_animal/bot/mulebot.dm create mode 100644 tools/UpdatePaths/Scripts/96500_mulebots.txt diff --git a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm index d8ca28b7b00..2b43ae43fb3 100644 --- a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm +++ b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm @@ -21404,7 +21404,7 @@ codes_txt = "delivery;dir=4"; location = "Cargo Storage4" }, -/mob/living/simple_animal/bot/mulebot{ +/mob/living/basic/bot/mulebot{ name = "Old Yeller" }, /turf/open/floor/iron/recharge_floor, @@ -33958,7 +33958,7 @@ codes_txt = "delivery;dir=4"; location = "Cargo Storage-2" }, -/mob/living/simple_animal/bot/mulebot{ +/mob/living/basic/bot/mulebot{ name = "Parcel Pete" }, /obj/item/radio/intercom/directional/west, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 1cb51bb30c0..6b9115f4b99 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -22766,7 +22766,7 @@ name = "warehouse shutters control" }, /obj/structure/window/reinforced/spawner/directional/north, -/mob/living/simple_animal/bot/mulebot, +/mob/living/basic/bot/mulebot, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=4"; location = "QM #1" @@ -48594,7 +48594,7 @@ /turf/open/floor/iron, /area/station/maintenance/port/aft) "lUm" = ( -/mob/living/simple_animal/bot/mulebot, +/mob/living/basic/bot/mulebot, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=4"; location = "QM #4" diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 51b0e5c781c..a31a47131c1 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -63657,7 +63657,7 @@ }, /obj/effect/turf_decal/bot, /obj/machinery/light/small/directional/east, -/mob/living/simple_animal/bot/mulebot, +/mob/living/basic/bot/mulebot, /obj/machinery/status_display/supply{ pixel_x = 32 }, @@ -81435,7 +81435,7 @@ location = "QM #1" }, /obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/mulebot, +/mob/living/basic/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/storage) "xaH" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index d8b9a3fbce1..316f1b0f0f2 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -20077,7 +20077,7 @@ /turf/open/floor/engine, /area/station/engineering/supermatter/room) "gWz" = ( -/mob/living/simple_animal/bot/mulebot, +/mob/living/basic/bot/mulebot, /obj/structure/cable, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=1"; @@ -21868,7 +21868,7 @@ /turf/open/floor/iron/dark, /area/station/ai/satellite/exterior) "hBo" = ( -/mob/living/simple_animal/bot/mulebot, +/mob/living/basic/bot/mulebot, /obj/structure/cable, /obj/machinery/navbeacon{ codes_txt = "delivery;dir=2"; @@ -30607,7 +30607,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/oil/slippery, /obj/effect/decal/cleanable/blood/gibs/down, -/mob/living/simple_animal/bot/mulebot{ +/mob/living/basic/bot/mulebot{ name = "Leaping Rabbit" }, /obj/structure/disposalpipe/segment, diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm index bd3547f33d8..a29aefe5dd3 100644 --- a/_maps/map_files/NebulaStation/NebulaStation.dmm +++ b/_maps/map_files/NebulaStation/NebulaStation.dmm @@ -18050,7 +18050,7 @@ /area/station/engineering/storage) "cII" = ( /obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/mulebot{ +/mob/living/basic/bot/mulebot{ home_destination = "QM #2"; suffix = "#2" }, @@ -75322,7 +75322,7 @@ /area/station/engineering/supermatter/room) "lcm" = ( /obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/mulebot{ +/mob/living/basic/bot/mulebot{ home_destination = "QM #2"; suffix = "#2" }, @@ -90689,7 +90689,7 @@ /area/station/hallway/primary/fore) "nvZ" = ( /obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/mulebot{ +/mob/living/basic/bot/mulebot{ home_destination = "QM #2"; suffix = "#2" }, diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index c6f10ec5116..7e9d064585a 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -37251,7 +37251,7 @@ /turf/open/floor/iron/dark, /area/station/security/prison/garden) "lQz" = ( -/mob/living/simple_animal/bot/mulebot, +/mob/living/basic/bot/mulebot, /obj/effect/turf_decal/delivery, /obj/machinery/navbeacon{ location = "QM #2"; @@ -42305,7 +42305,7 @@ /turf/open/floor/iron/dark, /area/station/medical/virology) "nIC" = ( -/mob/living/simple_animal/bot/mulebot, +/mob/living/basic/bot/mulebot, /obj/effect/turf_decal/delivery, /obj/machinery/navbeacon{ location = "QM #6"; @@ -48524,7 +48524,7 @@ /turf/open/floor/iron/dark, /area/station/ai/satellite/interior) "pXq" = ( -/mob/living/simple_animal/bot/mulebot, +/mob/living/basic/bot/mulebot, /obj/effect/turf_decal/delivery, /obj/machinery/navbeacon{ location = "QM #3"; @@ -53129,7 +53129,7 @@ /turf/closed/wall, /area/station/engineering/atmospherics_engine) "rCs" = ( -/mob/living/simple_animal/bot/mulebot, +/mob/living/basic/bot/mulebot, /obj/effect/turf_decal/delivery, /obj/machinery/navbeacon{ location = "QM #1"; diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index cf1b7a136a7..a723bb3f2a8 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -3278,7 +3278,7 @@ codes_txt = "delivery;dir=8"; location = "QM #2" }, -/mob/living/simple_animal/bot/mulebot, +/mob/living/basic/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/warehouse) "beO" = ( @@ -16365,7 +16365,7 @@ codes_txt = "delivery;dir=8"; location = "QM #1" }, -/mob/living/simple_animal/bot/mulebot, +/mob/living/basic/bot/mulebot, /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/cargo/warehouse) diff --git a/code/__DEFINES/ai/ai.dm b/code/__DEFINES/ai/ai.dm index f8285b075e4..a6724aeb4aa 100644 --- a/code/__DEFINES/ai/ai.dm +++ b/code/__DEFINES/ai/ai.dm @@ -21,6 +21,7 @@ ///For JPS pathing, the maximum length of a path we'll try to generate. Should be modularized depending on what we're doing later on #define AI_MAX_PATH_LENGTH 30 // 30 is possibly overkill since by default we lose interest after 14 tiles of distance, but this gives wiggle room for weaving around obstacles #define AI_BOT_PATH_LENGTH 60 +#define AI_MULEBOT_PATH_LENGTH 150 //we making a pilgramage sometimes... // How far should we, by default, be looking for interesting things to de-idle? #define AI_DEFAULT_INTERESTING_DIST 10 diff --git a/code/__DEFINES/ai/bot_keys.dm b/code/__DEFINES/ai/bot_keys.dm index 0c7758f6134..653bace09d8 100644 --- a/code/__DEFINES/ai/bot_keys.dm +++ b/code/__DEFINES/ai/bot_keys.dm @@ -149,3 +149,12 @@ #define BB_ROBOT_TARGET "robot_target" ///key that holds materials we can refill #define BB_REFILLABLE_TARGET "refillable_target" + + +//mulebots +///key that holds our delivery destination's name +#define BB_MULEBOT_DESTINATION_BEACON "mulebot_destination" +///key that holds our home port's name +#define BB_MULEBOT_HOME_BEACON "mulebot_home_beacon" +///key that holds our current delivery target atom +#define BB_MULEBOT_TRAVEL_TARGET "mulebot_travel_target" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index cf26bbbad24..7fe071ff8a3 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -23,11 +23,11 @@ #define COMSIG_MOB_CANCEL_CLICKON (1<<0) ///from base of mob/alt_click_on_secodary(): (atom/A) #define COMSIG_MOB_ALTCLICKON_SECONDARY "mob_altclickon_secondary" -/// From base of /mob/living/simple_animal/bot/proc/bot_step() +/// From base of /mob/living/basic/bot/proc/bot_step() #define COMSIG_MOB_BOT_PRE_STEP "mob_bot_pre_step" /// Should always match COMPONENT_MOVABLE_BLOCK_PRE_MOVE as these are interchangeable and used to block movement. #define COMPONENT_MOB_BOT_BLOCK_PRE_STEP COMPONENT_MOVABLE_BLOCK_PRE_MOVE -/// From base of /mob/living/simple_animal/bot/proc/bot_step() +/// From base of /mob/living/basic/bot/proc/bot_step() #define COMSIG_MOB_BOT_STEP "mob_bot_step" /// From base of /mob/proc/update_held_items diff --git a/code/__DEFINES/dcs/signals/signals_moveloop.dm b/code/__DEFINES/dcs/signals/signals_moveloop.dm index 8a354f8bfbb..95208dd1e81 100644 --- a/code/__DEFINES/dcs/signals/signals_moveloop.dm +++ b/code/__DEFINES/dcs/signals/signals_moveloop.dm @@ -11,3 +11,6 @@ #define COMSIG_MOVELOOP_JPS_REPATH "moveloop_jps_repath" ///from [/datum/move_loop/has_target/jps/on_finish_pathing] #define COMSIG_MOVELOOP_JPS_FINISHED_PATHING "moveloop_jps_finished_pathing" + +///from /datum/move_loop/has_target/jps/frustrations/handle_move_attempt_failure +#define COMSIG_MOVELOOP_JPS_FRUSTRATION_INCREMENTED "moveloop_jps_frustration_incremented" diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 1b71b003872..4e506977dc3 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -158,6 +158,8 @@ #define HUD_WIZARD_COMPACT_PERKS "wizard_compact_perks" #define HUD_WIZARD_PERK(slot) "wizard_perk:[slot]" +#define HUD_MULEBOT_CHARGE "mulebot_charge" + /// Converts item slots to hud keys #define HUD_KEY_ITEM_SLOT(slot) "item_slot:[slot]" /// Converts item slots to hud keys as a compiler constant diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 28300319502..d314074dc32 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -192,9 +192,7 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( #define isrevenant(A) (istype(A, /mob/living/basic/revenant)) -#define isbot(A) (istype(A, /mob/living/simple_animal/bot) || istype(A, /mob/living/basic/bot)) - -#define isbasicbot(A) (istype(A, /mob/living/basic/bot)) +#define isbot(A) istype(A, /mob/living/basic/bot) #define ismouse(A) (istype(A, /mob/living/basic/mouse)) diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index 2c76b6f3b91..60f6cbbd762 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -399,3 +399,10 @@ DEFINE_BITFIELD(janitor_mode_flags, list( /// Default offsets for riding a cyborg #define DEFAULT_ROBOT_RIDING_OFFSETS list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(-6, 3), TEXT_WEST = list(6, 3)) + + +//mulebots +#define MULEBOT_MOOD_ANNOYED "ANNOYED" +#define MULEBOT_MOOD_CHIME "CHIME" +#define MULEBOT_MOOD_DELIGHT "DELIGHT" +#define MULEBOT_MOOD_SIGH "SIGH" diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index acdb1f02133..f3af1b68531 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -68,9 +68,6 @@ /mob/living/basic/bot/generate_random_mob_name(unique) return generate_random_name(gender, unique, list(/datum/language/machine = 1)) -/mob/living/simple_animal/bot/generate_random_mob_name(unique) - return generate_random_name(gender, unique, list(/datum/language/machine = 1)) - GLOBAL_VAR(command_name) /proc/command_name() if (GLOB.command_name) diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 186385debfe..9d8ea11ce86 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -98,7 +98,6 @@ GLOBAL_LIST_INIT(phobia_mobs, list( /mob/living/basic/drone, /mob/living/silicon/ai, /mob/living/silicon/robot, - /mob/living/simple_animal/bot, )), "security" = typecacheof(list(/mob/living/basic/bot/secbot)), "spiders" = typecacheof(list( @@ -123,7 +122,7 @@ GLOBAL_LIST_INIT(phobia_mobs, list( /mob/living/basic/skeleton, /mob/living/basic/wizard, /mob/living/basic/zombie, - /mob/living/simple_animal/bot/mulebot/paranormal, + /mob/living/basic/bot/mulebot/paranormal, /mob/living/basic/voidwalker, )), )) diff --git a/code/controllers/subsystem/movement/movement_types.dm b/code/controllers/subsystem/movement/movement_types.dm index e83f68d22db..ea1e7f90cda 100644 --- a/code/controllers/subsystem/movement/movement_types.dm +++ b/code/controllers/subsystem/movement/movement_types.dm @@ -461,6 +461,94 @@ if(length(movement_path)) movement_path.Cut(1,2) else + return handle_move_attempt_failure() + + +/datum/move_loop/has_target/jps/proc/handle_move_attempt_failure() + EVLOG_TEXT(moving, EVLOG_CATEGORY_MOVELOOPS, "Path recalculating due to obstruction") + INVOKE_ASYNC(src, PROC_REF(recalculate_path)) + return MOVELOOP_FAILURE + +/datum/move_loop/has_target/jps/frustrations + ///maximum amount of frustrations before we recalculate path + var/maximum_frustrations + ///what is our current frustration? + var/current_frustrations = 0 + ///how long before we're able to increment frustration? + var/frustration_delay + ///have we drawn our initial path? + var/initial_path_drawn = FALSE + ///cooldown between frustration increments + COOLDOWN_DECLARE(frustration_cooldown) + + +/datum/move_manager/proc/frustrations_move(moving, + chasing, + delay, + timeout, + repath_delay, + max_path_length, + minimum_distance, + list/access, + simulated_only, + turf/avoid, + skip_first, + subsystem, + diagonal_handling, + priority, + flags, + datum/extra_info, + initial_path) + return add_to_loop(moving, + subsystem, + /datum/move_loop/has_target/jps/frustrations, + priority, + flags, + extra_info, + delay, + timeout, + chasing, + repath_delay, + max_path_length, + minimum_distance, + access, + simulated_only, + avoid, + skip_first, + diagonal_handling, + initial_path) + +/datum/move_loop/has_target/jps/frustrations/setup(delay, timeout, atom/chasing, maximum_frustrations = 10, frustration_delay = 2 SECONDS) + . = ..() + if(!.) + return + src.maximum_frustrations = maximum_frustrations + src.frustration_delay = frustration_delay + +/datum/move_loop/has_target/jps/frustrations/recalculate_path() + if(initial_path_drawn && current_frustrations < maximum_frustrations) + return + return ..() + +/datum/move_loop/has_target/jps/frustrations/loop_stopped() + . = ..() + +/datum/move_loop/has_target/jps/frustrations/on_finish_pathing(list/path) + . = ..() + if(movement_path) + initial_path_drawn = TRUE + +/datum/move_loop/has_target/jps/frustrations/handle_move_attempt_failure() + if(!initial_path_drawn) + INVOKE_ASYNC(src, PROC_REF(recalculate_path)) + return MOVELOOP_FAILURE + if(!COOLDOWN_FINISHED(src, frustration_cooldown)) + return NONE + COOLDOWN_START(src, frustration_cooldown, frustration_delay) + current_frustrations++ + SEND_SIGNAL(src, COMSIG_MOVELOOP_JPS_FRUSTRATION_INCREMENTED, current_frustrations) + if(current_frustrations >= maximum_frustrations) + current_frustrations = 0 EVLOG_TEXT(moving, EVLOG_CATEGORY_MOVELOOPS, "Path recalculating due to obstruction") INVOKE_ASYNC(src, PROC_REF(recalculate_path)) return MOVELOOP_FAILURE diff --git a/code/datums/ai/movement/ai_movement_jps.dm b/code/datums/ai/movement/ai_movement_jps.dm index 1153833a31e..a8980d15b85 100644 --- a/code/datums/ai/movement/ai_movement_jps.dm +++ b/code/datums/ai/movement/ai_movement_jps.dm @@ -12,6 +12,16 @@ var/atom/movable/moving = controller.pawn var/delay = controller.movement_delay + var/datum/move_loop/loop = setup_moveloop(controller, current_movement_target, moving, delay) + + RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) + RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) + RegisterSignal(loop, COMSIG_MOVELOOP_JPS_REPATH, PROC_REF(repath_incoming)) + + return loop + + +/datum/ai_movement/jps/proc/setup_moveloop(datum/ai_controller/controller, atom/current_movement_target, atom/movable/moving, delay) var/datum/move_loop/has_target/jps/loop = GLOB.move_manager.jps_move(moving, current_movement_target, delay, @@ -24,11 +34,6 @@ diagonal_handling = diagonal_flags, extra_info = controller, ) - - RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) - RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) - RegisterSignal(loop, COMSIG_MOVELOOP_JPS_REPATH, PROC_REF(repath_incoming)) - return loop /datum/ai_movement/jps/proc/repath_incoming(datum/move_loop/has_target/jps/source) @@ -47,9 +52,35 @@ var/datum/move_loop/loop = ..() var/atom/our_pawn = controller.pawn if(isnull(our_pawn)) - return + return null our_pawn.RegisterSignal(loop, COMSIG_MOVELOOP_JPS_FINISHED_PATHING, TYPE_PROC_REF(/mob/living/basic/bot, generate_bot_path)) + return loop /datum/ai_movement/jps/bot/travel_to_beacon maximum_length = AI_BOT_PATH_LENGTH max_pathing_attempts = 10 + + +/datum/ai_movement/jps/bot/mulebot + max_pathing_attempts = 10 + maximum_length = AI_MULEBOT_PATH_LENGTH + +/datum/ai_movement/jps/bot/mulebot/setup_moveloop(datum/ai_controller/controller, atom/current_movement_target, atom/movable/moving, delay) + var/datum/move_loop/has_target/jps/frustrations/loop = GLOB.move_manager.frustrations_move(moving, + current_movement_target, + delay, + repath_delay = 0.5 SECONDS, + simulated_only = !HAS_TRAIT(controller.pawn, TRAIT_SPACEWALK), + max_path_length = maximum_length, + minimum_distance = controller.get_minimum_distance(), + access = controller.get_access(), + subsystem = SSai_movement, + diagonal_handling = diagonal_flags, + extra_info = controller, + ) + return loop + +/datum/ai_movement/jps/bot/mulebot/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance) + var/datum/move_loop/loop = ..() + var/atom/our_pawn = controller.pawn + our_pawn.RegisterSignal(loop, COMSIG_MOVELOOP_JPS_FRUSTRATION_INCREMENTED, TYPE_PROC_REF(/mob/living/basic/bot/mulebot, handle_buzzing)) diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm index c3b4efe3460..fa22771945d 100644 --- a/code/datums/wires/mulebot.dm +++ b/code/datums/wires/mulebot.dm @@ -3,7 +3,7 @@ #define SLOW_MOTOR_SPEED 3 /datum/wires/mulebot - holder_type = /mob/living/simple_animal/bot/mulebot + holder_type = /mob/living/basic/bot/mulebot proper_name = "Mulebot" randomize = TRUE @@ -19,12 +19,12 @@ /datum/wires/mulebot/interactable(mob/user) if(!..()) return FALSE - var/mob/living/simple_animal/bot/mulebot/mule = holder - if(mule.bot_cover_flags & BOT_COVER_MAINTS_OPEN) + var/mob/living/basic/bot/mulebot/mule = holder + if(mule.bot_access_flags & BOT_COVER_MAINTS_OPEN) return TRUE /datum/wires/mulebot/on_cut(wire, mend, source) - var/mob/living/simple_animal/bot/mulebot/mule = holder + var/mob/living/basic/bot/mulebot/mule = holder switch(wire) if(WIRE_MOTOR1, WIRE_MOTOR2) if(is_cut(WIRE_MOTOR1) && is_cut(WIRE_MOTOR2)) @@ -49,7 +49,7 @@ holder.audible_message(span_hear("Something inside [mule] clicks ominously!"), null, 1) /datum/wires/mulebot/on_pulse(wire) - var/mob/living/simple_animal/bot/mulebot/mule = holder + var/mob/living/basic/bot/mulebot/mule = holder if(!mule.has_power(TRUE)) return //logically mulebots can't flash and beep if they don't have power. switch(wire) @@ -57,7 +57,7 @@ holder.visible_message(span_notice("[icon2html(mule, viewers(holder))] The charge light flickers.")) if(WIRE_AVOIDANCE) holder.visible_message(span_notice("[icon2html(mule, viewers(holder))] The external warning lights flash briefly.")) - flick("[mule.base_icon]1", mule) + flick("[mule.base_icon_state]1", mule) if(WIRE_LOADCHECK) holder.visible_message(span_notice("[icon2html(mule, viewers(holder))] The load platform clunks.")) if(WIRE_MOTOR1, WIRE_MOTOR2) @@ -65,6 +65,7 @@ else holder.visible_message(span_notice("[icon2html(mule, viewers(holder))] You hear a radio crackle.")) + #undef FAST_MOTOR_SPEED #undef AVERAGE_MOTOR_SPEED #undef SLOW_MOTOR_SPEED diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index f56633befce..a38ba684758 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -455,46 +455,6 @@ Diagnostic HUDs! else set_hud_image_state(DIAG_CAMERA_HUD, "hudcamera") -/*~~~~~~~~~ - Bots! -~~~~~~~~~~*/ -/mob/living/simple_animal/bot/proc/diag_hud_set_bothealth() - set_hud_image_state(DIAG_HUD, "huddiag[RoundDiagBar(health/maxHealth)]") - -/mob/living/simple_animal/bot/proc/diag_hud_set_botstat() //On (With wireless on or off), Off, EMP'ed - if(bot_mode_flags & BOT_MODE_ON) - set_hud_image_state(DIAG_STAT_HUD, "hudstat") - else if(stat) //Generally EMP causes this - set_hud_image_state(DIAG_STAT_HUD, "hudoffline") - else //Bot is off - set_hud_image_state(DIAG_STAT_HUD, "huddead2") - -/mob/living/simple_animal/bot/proc/diag_hud_set_botmode() //Shows a bot's current operation - if(client) //If the bot is player controlled, it will not be following mode logic! - set_hud_image_state(DIAG_BOT_HUD, "hudsentient") - return - - switch(mode) - if(BOT_SUMMON, BOT_RESPONDING) //Responding to PDA or AI summons - set_hud_image_state(DIAG_BOT_HUD, "hudcalled") - if(BOT_CLEANING, BOT_HEALING) //Cleanbot cleaning, repairbot fixing, or Medibot Healing - set_hud_image_state(DIAG_BOT_HUD, "hudworking") - if(BOT_PATROL, BOT_START_PATROL) //Patrol mode - set_hud_image_state(DIAG_BOT_HUD, "hudpatrol") - if(BOT_PREP_ARREST, BOT_ARREST, BOT_HUNT) //STOP RIGHT THERE, CRIMINAL SCUM! - set_hud_image_state(DIAG_BOT_HUD, "hudalert") - if(BOT_MOVING, BOT_DELIVER, BOT_GO_HOME, BOT_NAV) //Moving to target for normal bots, moving to deliver or go home for MULES. - set_hud_image_state(DIAG_BOT_HUD, "hudmove") - else - set_hud_image_state(DIAG_BOT_HUD, "") - -/mob/living/simple_animal/bot/mulebot/proc/diag_hud_set_mulebotcell() - if(QDELETED(cell) || (cell.maxcharge == 0)) - set_hud_image_state(DIAG_BATT_HUD, "hudnobatt") - else - var/chargelvl = (cell.charge/cell.maxcharge) - set_hud_image_state(DIAG_BATT_HUD, "hudbatt[RoundDiagBar(chargelvl)]") - /*~~~~~~~~~~~~ Airlocks! ~~~~~~~~~~~~~*/ diff --git a/code/game/machinery/botlaunchpad.dm b/code/game/machinery/botlaunchpad.dm index 857e9278af0..ab949fb4358 100644 --- a/code/game/machinery/botlaunchpad.dm +++ b/code/game/machinery/botlaunchpad.dm @@ -65,12 +65,8 @@ user.balloon_alert(user, "no bots sent from the pad!") return user.balloon_alert(user, "bot sent back to pad") - if(isbasicbot(our_bot)) - var/mob/living/basic/bot/basic_bot = our_bot - basic_bot.summon_bot(src) - return - var/mob/living/simple_animal/bot/simple_bot = our_bot - simple_bot.call_bot(src, get_turf(src)) + var/mob/living/basic/bot/basic_bot = our_bot + basic_bot.summon_bot(src) /obj/structure/closet/supplypod/transport/botpod reverse_option_list = list("Mobs"=TRUE,"Objects"=FALSE,"Anchored"=FALSE,"Underfloor"=FALSE,"Wallmounted"=FALSE,"Floors"=FALSE,"Walls"=FALSE,"Mecha"=FALSE) diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 0c153c59128..81641800968 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -224,7 +224,7 @@ else if(isliving(mover)) // You Shall Not Pass! var/mob/living/living_mover = mover - if(istype(living_mover.buckled, /mob/living/simple_animal/bot/mulebot)) // mulebot passenger gets a free pass. + if(istype(living_mover.buckled, /mob/living/basic/bot/mulebot)) // mulebot passenger gets a free pass. return TRUE if(living_mover.body_position == STANDING_UP && living_mover.mob_size != MOB_SIZE_TINY && !(HAS_TRAIT(living_mover, TRAIT_VENTCRAWLER_ALWAYS) || HAS_TRAIT(living_mover, TRAIT_VENTCRAWLER_NUDE))) diff --git a/code/modules/antagonists/malf_ai/malf_ai_modules.dm b/code/modules/antagonists/malf_ai/malf_ai_modules.dm index 0fdb4251f5f..5f810a1e37c 100644 --- a/code/modules/antagonists/malf_ai/malf_ai_modules.dm +++ b/code/modules/antagonists/malf_ai/malf_ai_modules.dm @@ -1097,7 +1097,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf)) /obj/structure, /obj/item/radio/intercom, /obj/item/modular_computer, - /mob/living/simple_animal/bot, + /mob/living/basic/bot, /mob/living/silicon, ) diff --git a/code/modules/antagonists/spy/spy_bounty.dm b/code/modules/antagonists/spy/spy_bounty.dm index 5344f86be2e..5c65e544dbc 100644 --- a/code/modules/antagonists/spy/spy_bounty.dm +++ b/code/modules/antagonists/spy/spy_bounty.dm @@ -679,7 +679,7 @@ /datum/spy_bounty/some_bot/get_dupe_protection_key(atom/movable/stealing) return bot_type -/datum/spy_bounty/some_bot/finish_cleanup(mob/living/simple_animal/bot/stealing) +/datum/spy_bounty/some_bot/finish_cleanup(mob/living/basic/bot/stealing) if(stealing.client) to_chat(stealing, span_deadsay("You've been stolen! You are shipped off to the black market and taken apart for spare parts...")) stealing.investigate_log("stole by a spy (and deleted)", INVESTIGATE_DEATHS) diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm index 4092fcfe25d..3a97e99ee54 100644 --- a/code/modules/cargo/packs/service.dm +++ b/code/modules/cargo/packs/service.dm @@ -68,7 +68,7 @@ desc = "Pink-haired Quartermaster not doing her job? Replace her with this tireless worker, today! \ Contains one MULEbot." cost = CARGO_CRATE_VALUE * 4 - contains = list(/mob/living/simple_animal/bot/mulebot) + contains = list(/mob/living/basic/bot/mulebot) crate_name = "\improper MULEbot Crate" crate_type = /obj/structure/closet/crate/large diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 555a4b03c14..59caf2b1560 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -60,7 +60,7 @@ M.post_lawchange() if(botEmagChance) - for(var/mob/living/simple_animal/bot/bot in GLOB.alive_mob_list) + for(var/mob/living/basic/bot/bot in GLOB.alive_mob_list) if(prob(botEmagChance)) bot.emag_act() diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index b600c291214..5c643461b15 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -302,7 +302,7 @@ GLOBAL_DATUM_INIT(orbit_menu, /datum/orbit_menu, new) /mob/eye, /mob/living/basic/boss, /mob/living/basic/regal_rat, - /mob/living/simple_animal/bot, + /mob/living/basic/bot, /mob/living/simple_animal/hostile/megafauna, )) if(!is_type_in_typecache(potential_mob_poi, mob_allowed_typecache) && !potential_mob_poi.GetComponent(/datum/component/deadchat_control)) diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index 15d983b8745..f7962d9b868 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -196,7 +196,7 @@ GLOBAL_LIST_INIT(command_strings, list( /mob/living/basic/bot/proc/get_emagged_message() return get_policy(ROLE_EMAGGED_BOT) || "You are a malfunctioning bot! Disrupt everyone and cause chaos!" -/mob/living/basic/bot/proc/turn_on() +/mob/living/basic/bot/proc/turn_on(mob/user) if(stat == DEAD) return FALSE set_mode_flags(bot_mode_flags | BOT_MODE_ON) diff --git a/code/modules/mob/living/basic/bots/mulebot/mulebot.dm b/code/modules/mob/living/basic/bots/mulebot/mulebot.dm new file mode 100644 index 00000000000..55d5632e5e1 --- /dev/null +++ b/code/modules/mob/living/basic/bots/mulebot/mulebot.dm @@ -0,0 +1,193 @@ +/mob/living/basic/bot/mulebot + name = "\improper MULEbot" + desc = "A Multiple Utility Load Effector bot." + icon = 'icons/mob/silicon/aibots.dmi' + icon_state = "mulebot0" + base_icon_state = "mulebot" + + light_color = "#ffcc99" + light_power = 0.8 + + health = 50 + maxHealth = 50 + + damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, STAMINA = 0, OXY = 0) + density = TRUE + mob_size = MOB_SIZE_LARGE + move_resist = MOVE_FORCE_STRONG + animate_movement = SLIDE_STEPS + speed = 3 + + combat_mode = TRUE + + buckle_lying = 0 + buckle_prevents_pull = TRUE // No pulling loaded shit + + bot_mode_flags = ~BOT_MODE_ROUNDSTART_POSSESSION + req_one_access = list(ACCESS_ROBOTICS, ACCESS_CARGO) + radio_key = /obj/item/encryptionkey/headset_cargo + radio_channel = RADIO_CHANNEL_SUPPLY + pass_flags = PASSFLAPS + bot_type = MULE_BOT + + additional_access = /datum/id_trim/job/cargo_technician + path_image_color = "#7F5200" + hud_type = /datum/hud/living/mulebot + + hackables = "obstacle detection circuits" + possessed_message = "You are a MULEbot! Do your best to make sure that packages get to their destination!" + ai_controller = /datum/ai_controller/basic_controller/bot/mulebot + + /// unique identifier in case there are multiple mulebots. + var/id + + /// what we're transporting + var/atom/movable/load + /// who's riding us + var/mob/living/passenger + + ///flags of mulebot mode + var/mulebot_delivery_flags = MULEBOT_RETURN_MODE | MULEBOT_AUTO_PICKUP_MODE | MULEBOT_REPORT_DELIVERY_MODE + + ///Internal Powercell + var/obj/item/stock_parts/power_store/cell + ///How much power we use when we move. + var/cell_move_power_usage = 0.0005 * STANDARD_CELL_CHARGE + ///The amount of steps we should take until we rest for a time. + var/num_steps = 0 + + ///The chance to be deleted and replaced by a different mule + var/replacement_chance = 0.666 + ///home destination, only used by mappers. + var/home_destination = "" + +/mob/living/basic/bot/mulebot/Initialize(mapload) + . = ..() + + if(prob(replacement_chance) && mapload) + new /mob/living/basic/bot/mulebot/paranormal(loc) + return INITIALIZE_HINT_QDEL + + set_wires(new /datum/wires/mulebot(src)) + var/obj/item/stock_parts/power_store/cell/upgraded/new_cell = new(src) + assign_cell(new_cell) + ai_controller.set_blackboard_key(BB_MULEBOT_HOME_BEACON, "") + AddElement(/datum/element/ridable, /datum/component/riding/creature/mulebot) + ADD_TRAIT(src, TRAIT_NOMOBSWAP, INNATE_TRAIT) + add_traits(list(TRAIT_NOMOBSWAP, TRAIT_COMBAT_MODE_LOCK), INNATE_TRAIT) + RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_pre_move)) + + set_id(suffix || assign_random_name()) + suffix = null + if(name == "\improper MULEbot") + name = "\improper MULEbot [id]" + set_home(get_turf(src)) + ai_controller.update_able_to_run() + update_appearance() + +/mob/living/basic/bot/mulebot/Destroy() + UnregisterSignal(src, COMSIG_MOVABLE_PRE_MOVE) + unload() + QDEL_NULL(cell) + return ..() + +/mob/living/basic/bot/mulebot/proc/assign_cell(atom/new_cell) + cell = new_cell + var/atom/movable/screen/mob_charge/charge_hud = hud_used?.screen_objects[HUD_MULEBOT_CHARGE] + charge_hud?.update_battery_overlay(new_cell) + charge_hud?.calculate_charge() + + +/mob/living/basic/bot/mulebot/attack_hand(mob/living/carbon/human/user, list/modifiers) + if(bot_access_flags & BOT_COVER_MAINTS_OPEN && !HAS_AI_ACCESS(user)) + wires.interact(user) + return + if(wires.is_cut(WIRE_RX) && HAS_AI_ACCESS(user)) + return + + return ..() + +/mob/living/basic/bot/mulebot/examine(mob/user) + . = ..() + if(bot_access_flags & BOT_COVER_MAINTS_OPEN) + if(cell) + . += span_notice("It has \a [cell] installed.") + . += span_info("You can use a crowbar to remove it.") + else + . += span_notice("It has an empty compartment where a power cell can be installed.") + if(load) //observer check is so we don't show the name of the ghost that's sitting on it to prevent metagaming who's ded. + . += span_notice("\A [isobserver(load) ? "ghostly figure" : load] is on its load platform.") + +/mob/living/basic/bot/mulebot/get_cell() + return cell + +/mob/living/basic/bot/mulebot/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) + if(!can_unarmed_attack()) + return + if(isturf(target) && isturf(loc) && loc.Adjacent(target) && load) + unload(get_dir(loc, target)) + else + return ..() + +/mob/living/basic/bot/mulebot/turn_on(mob/user) + if(bot_access_flags & BOT_COVER_MAINTS_OPEN) + if(user) + to_chat(user, span_warning("[src]'s maintenance panel is open!")) + return FALSE + if(!has_power()) + if(user) + to_chat(user, span_warning("[src] has no power!")) + return FALSE + return ..() + +/mob/living/basic/bot/mulebot/update_icon_state() //if you change the icon_state names, please make sure to update /datum/wires/mulebot/on_pulse() as well. <3 + . = ..() + icon_state = "[base_icon_state][(bot_mode_flags & BOT_MODE_ON) ? wires?.is_cut(WIRE_AVOIDANCE) : "0"]" + +/mob/living/basic/bot/mulebot/update_overlays() + . = ..() + if(bot_access_flags & BOT_COVER_MAINTS_OPEN) + . += "[base_icon_state]-hatch" + if(isnull(load) || ismob(load)) //mob offsets and such are handled by the riding component / buckling + return + var/mutable_appearance/load_overlay = mutable_appearance(load.icon, load.icon_state, layer + 0.01) + load_overlay.pixel_y = initial(load.pixel_y) + 11 + . += load_overlay + +/mob/living/basic/bot/mulebot/proc/handle_buzzing(datum/move_loop/has_target/jps/frustrations/source, frustration_counter) + SIGNAL_HANDLER + + update_bot_mode(new_mode = BOT_BLOCKED) + var/buzz_mode = frustration_counter >= source.maximum_frustrations ? MULEBOT_MOOD_ANNOYED : MULEBOT_MOOD_SIGH + buzz(buzz_mode) + +/mob/living/basic/bot/mulebot/handle_loop_movement(atom/movable/source, atom/oldloc, dir, forced) //incase we start moving again after being previously blocked, update our mode + . = ..() + if(mode != BOT_BLOCKED) + return + var/obj/machinery/navbeacon/beacon = ai_controller.current_movement_target + if(!istype(beacon)) + return + var/intended_mode = beacon.location == ai_controller.blackboard[BB_MULEBOT_HOME_BEACON] ? BOT_GO_HOME : BOT_DELIVER + update_bot_mode(new_mode = intended_mode) + +///Noises that mulebots make +/mob/living/basic/bot/mulebot/proc/buzz(type) + switch(type) + if(MULEBOT_MOOD_SIGH) + audible_message(span_hear("[src] makes a sighing buzz.")) + playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) + if(MULEBOT_MOOD_ANNOYED) + audible_message(span_hear("[src] makes an annoyed buzzing sound.")) + playsound(src, 'sound/machines/buzz/buzz-two.ogg', 50, FALSE) + if(MULEBOT_MOOD_DELIGHT) + audible_message(span_hear("[src] makes a delighted ping!")) + playsound(src, 'sound/machines/ping.ogg', 50, FALSE) + if(MULEBOT_MOOD_CHIME) + audible_message(span_hear("[src] makes a chiming sound!")) + playsound(src, 'sound/machines/chime.ogg', 50, FALSE) + flick("[base_icon_state]1", src) + +/// returns true if the bot is fully powered. +/mob/living/basic/bot/mulebot/proc/has_power() + return cell && cell.charge > 0 && (!wires.is_cut(WIRE_POWER1) && !wires.is_cut(WIRE_POWER2)) diff --git a/code/modules/mob/living/basic/bots/mulebot/mulebot_ai.dm b/code/modules/mob/living/basic/bots/mulebot/mulebot_ai.dm new file mode 100644 index 00000000000..7898ced148c --- /dev/null +++ b/code/modules/mob/living/basic/bots/mulebot/mulebot_ai.dm @@ -0,0 +1,145 @@ +/datum/ai_controller/basic_controller/bot/mulebot + blackboard = list( + BB_SALUTE_MESSAGES = list( + "blinks its light in appreciation towards", + ) + ) + ai_movement = /datum/ai_movement/jps/bot/mulebot + max_target_distance = AI_MULEBOT_PATH_LENGTH + planning_subtrees = list( + /datum/ai_planning_subtree/respond_to_summon, + /datum/ai_planning_subtree/salute_authority, + /datum/ai_planning_subtree/attempt_delivery, + /datum/ai_planning_subtree/find_delivery_beacon, + ) + reset_keys = list( + BB_BOT_SUMMON_TARGET, + BB_MULEBOT_DESTINATION_BEACON, + BB_MULEBOT_TRAVEL_TARGET, + ) + +/datum/ai_controller/basic_controller/bot/mulebot/get_able_to_run() + var/mob/living/basic/bot/mulebot/bot_pawn = pawn + if(!bot_pawn.has_power()) + return AI_UNABLE_TO_RUN + return ..() + +/datum/ai_controller/basic_controller/bot/mulebot/setup_able_to_run() + . = ..() + var/mob/living/basic/bot/my_bot = pawn + var/static/list/wire_signals = list( + COMSIG_MEND_WIRE(WIRE_POWER1), //this framework is insane + COMSIG_MEND_WIRE(WIRE_POWER2), + COMSIG_CUT_WIRE(WIRE_POWER1), + COMSIG_CUT_WIRE(WIRE_POWER2), + ) + RegisterSignals(my_bot.wires, wire_signals, PROC_REF(update_able_to_run)) + var/static/list/content_signals = list( + COMSIG_ATOM_ENTERED, + COMSIG_ATOM_EXITED, + ) + RegisterSignals(my_bot, content_signals, PROC_REF(update_able_to_run)) + +/datum/ai_planning_subtree/find_delivery_beacon + ///what behavior do we use to seek beacons + var/find_beacon_behaviour = /datum/ai_behavior/find_delivery_beacon + +/datum/ai_planning_subtree/find_delivery_beacon/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/basic/bot/mulebot/bot_pawn = controller.pawn + if(bot_pawn.wires.is_cut(WIRE_BEACON)) + return + + if(!controller.blackboard_key_exists(BB_MULEBOT_TRAVEL_TARGET)) + controller.queue_behavior(find_beacon_behaviour, BB_MULEBOT_TRAVEL_TARGET) + +/datum/ai_behavior/find_delivery_beacon + behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/find_delivery_beacon/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + var/mob/living/basic/bot/mulebot/bot_pawn = controller.pawn + var/atom/delivery_beacon + + var/beacon_tag = null + + switch(bot_pawn.mode) + if(BOT_DELIVER) + beacon_tag = controller.blackboard[BB_MULEBOT_DESTINATION_BEACON] + if(BOT_GO_HOME) + beacon_tag = controller.blackboard[BB_MULEBOT_HOME_BEACON] + else + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + + for(var/obj/machinery/navbeacon/beacon as anything in GLOB.deliverybeacons) + if(beacon.location == beacon_tag) + delivery_beacon = beacon + break + + if(isnull(delivery_beacon)) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED + + controller.set_blackboard_key(BB_MULEBOT_TRAVEL_TARGET, delivery_beacon) + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED + +/datum/ai_behavior/travel_towards/delivery_beacon + new_movement_type = /datum/ai_movement/jps/bot/mulebot + +/datum/ai_planning_subtree/attempt_delivery + ///behavior we use to unload crates + var/delivery_behaviour = /datum/ai_behavior/handle_delivery + +/datum/ai_planning_subtree/attempt_delivery/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard_key_exists(BB_MULEBOT_TRAVEL_TARGET)) + return + + controller.queue_behavior(delivery_behaviour, BB_MULEBOT_TRAVEL_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_behavior/handle_delivery + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH + +/datum/ai_behavior/handle_delivery/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/handle_delivery/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + var/obj/machinery/navbeacon/beacon = controller.blackboard[target_key] + var/mob/living/basic/bot/mulebot/bot_pawn = controller.pawn + + var/load_direction = beacon.codes[NAVBEACON_DELIVERY_DIRECTION] // this will be the load/unload dir + if(!load_direction) + load_direction = beacon.dir // fallback + + load_direction = text2num(load_direction) + + if(bot_pawn.load) + if(bot_pawn.mulebot_delivery_flags & MULEBOT_REPORT_DELIVERY_MODE) + bot_pawn.radio_channel = RADIO_CHANNEL_SUPPLY //Supply channel + bot_pawn.buzz(MULEBOT_MOOD_CHIME) + bot_pawn.speak("Destination [RUNECHAT_BOLD("[beacon.location]")] reached. Unloading [bot_pawn.load].", bot_pawn.radio_channel) + bot_pawn.unload(load_direction) + + else + if(bot_pawn.mulebot_delivery_flags & MULEBOT_AUTO_PICKUP_MODE) // find a crate + var/atom/movable/atom_to_pick_up + if(bot_pawn.wires.is_cut(WIRE_LOADCHECK)) // if hacked, load first unanchored thing we find + for(var/atom/movable/target_atom in get_step(bot_pawn.loc, load_direction)) + if(!target_atom.anchored) + atom_to_pick_up = target_atom + break + else // otherwise, look for crates only + atom_to_pick_up = locate(/obj/structure/closet/crate) in get_step(bot_pawn.loc, load_direction) + if(atom_to_pick_up?.Adjacent(bot_pawn)) + bot_pawn.load(atom_to_pick_up) + if(bot_pawn.mulebot_delivery_flags & MULEBOT_REPORT_DELIVERY_MODE) + bot_pawn.speak("Now loading [bot_pawn.load] at [RUNECHAT_BOLD("[get_area_name(bot_pawn)]")].", bot_pawn.radio_channel) + + if((bot_pawn.mulebot_delivery_flags & MULEBOT_RETURN_MODE) && controller.blackboard[BB_MULEBOT_HOME_BEACON] && controller.blackboard[BB_MULEBOT_HOME_BEACON] != beacon.location) + bot_pawn.update_bot_mode(new_mode = BOT_GO_HOME) + controller.clear_blackboard_key(BB_MULEBOT_TRAVEL_TARGET) + else + bot_pawn.bot_reset() // otherwise go idle + + return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED diff --git a/code/modules/mob/living/basic/bots/mulebot/mulebot_control.dm b/code/modules/mob/living/basic/bots/mulebot/mulebot_control.dm new file mode 100644 index 00000000000..d7bd93be22c --- /dev/null +++ b/code/modules/mob/living/basic/bots/mulebot/mulebot_control.dm @@ -0,0 +1,116 @@ +/mob/living/basic/bot/mulebot/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Mule", name) + ui.open() + +/mob/living/basic/bot/mulebot/ui_data(mob/user) + var/list/data = list() + data["powerStatus"] = bot_mode_flags & BOT_MODE_ON + data["locked"] = bot_access_flags & BOT_COVER_LOCKED + data["siliconUser"] = HAS_SILICON_ACCESS(user) + data["mode"] = mode ? "[mode]" : "Ready" + data["modeStatus"] = "" + switch(mode) + if(BOT_IDLE, BOT_DELIVER, BOT_GO_HOME) + data["modeStatus"] = "good" + if(BOT_BLOCKED, BOT_NAV, BOT_WAIT_FOR_NAV) + data["modeStatus"] = "average" + if(BOT_NO_ROUTE) + data["modeStatus"] = "bad" + data["load"] = get_load_name() + data["destination"] = ai_controller.blackboard[BB_MULEBOT_DESTINATION_BEACON] + data["homeDestination"] = ai_controller.blackboard[BB_MULEBOT_HOME_BEACON] + data["destinationsList"] = GLOB.deliverybeacontags + data["cellPercent"] = cell?.percent() + data["autoReturn"] = mulebot_delivery_flags & MULEBOT_RETURN_MODE + data["autoPickup"] = mulebot_delivery_flags & MULEBOT_AUTO_PICKUP_MODE + data["reportDelivery"] = mulebot_delivery_flags & MULEBOT_REPORT_DELIVERY_MODE + data["botId"] = id + data["allowPossession"] = bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT + data["possessionEnabled"] = can_be_possessed + data["paiInserted"] = !!paicard + return data + +/mob/living/basic/bot/mulebot/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + var/mob/user = ui.user + if(. || (bot_access_flags & BOT_COVER_LOCKED && !HAS_SILICON_ACCESS(user))) + return + + bot_control(action, user, params) + return TRUE + +/mob/living/basic/bot/mulebot/bot_control(command, mob/user, list/params = list(), pda = FALSE) + if(pda && wires.is_cut(WIRE_RX)) // MULE wireless is controlled by wires. + return + + switch(command) + if("stop") + if(mode != BOT_IDLE) + bot_reset() + if("go") + if(mode == BOT_IDLE) + start() + if("home") + if(mode == BOT_IDLE || mode == BOT_DELIVER) + start_home() + if("destination") + var/new_dest + if(pda) + new_dest = tgui_input_list(user, "Enter Destination", "Mulebot Settings", GLOB.deliverybeacontags, ai_controller.blackboard[BB_MULEBOT_DESTINATION_BEACON]) + else + new_dest = params["value"] + if(new_dest) + set_destination(new_dest) + if("setid") + var/new_id = tgui_input_text(user, "Enter ID", "ID Assignment", id, max_length = MAX_NAME_LEN) + if(new_id) + set_id(new_id) + name = "\improper MULEbot [new_id]" + if("sethome") + var/new_home = tgui_input_list(user, "Enter Home", "Mulebot Settings", GLOB.deliverybeacontags, ai_controller.blackboard[BB_MULEBOT_HOME_BEACON]) + if(new_home) + ai_controller.set_blackboard_key(BB_MULEBOT_HOME_BEACON, new_home) + if("unload") + if(load && mode != BOT_HUNT) + unload() + if("autoret") + mulebot_delivery_flags ^= MULEBOT_RETURN_MODE + if("autopick") + mulebot_delivery_flags ^= MULEBOT_AUTO_PICKUP_MODE + if("report") + mulebot_delivery_flags ^= MULEBOT_REPORT_DELIVERY_MODE + +/mob/living/basic/bot/mulebot/proc/start() + if(!(bot_mode_flags & BOT_MODE_ON)) + return + if(ai_controller.blackboard[BB_MULEBOT_DESTINATION_BEACON] == ai_controller.blackboard[BB_MULEBOT_HOME_BEACON]) + update_bot_mode(new_mode = BOT_GO_HOME) + else + update_bot_mode(new_mode = BOT_DELIVER) + +/mob/living/basic/bot/mulebot/proc/start_home() + set_destination(ai_controller.blackboard[BB_MULEBOT_HOME_BEACON]) + update_bot_mode(new_mode = BOT_GO_HOME) + +/mob/living/basic/bot/mulebot/proc/set_destination(new_destination) + ai_controller.set_blackboard_key(BB_MULEBOT_DESTINATION_BEACON, new_destination) + +/mob/living/basic/bot/mulebot/proc/set_home(turf/home_loc) + if(home_destination) + ai_controller.set_blackboard_key(BB_MULEBOT_HOME_BEACON, home_destination) + home_destination = null + if(!istype(home_loc)) + CRASH("MULEbot [id] was requested to set a home location to [home_loc ? "an invalid home loc ([home_loc.type])" : "null"]") + + var/obj/machinery/navbeacon/home_beacon = locate() in home_loc + if(isnull(home_beacon)) + ai_controller.set_blackboard_key(BB_MULEBOT_HOME_BEACON, "") + return + ai_controller.set_blackboard_key(BB_MULEBOT_HOME_BEACON, home_beacon.location) + log_transport("[id]: MULEbot successfuly set home location to ID [home_beacon.location] at [home_beacon.x], [home_beacon.y], [home_beacon.z]") + +///Sets the new ID of the mulebot +/mob/living/basic/bot/mulebot/proc/set_id(new_id) + id = new_id diff --git a/code/modules/mob/living/basic/bots/mulebot/mulebot_delivery.dm b/code/modules/mob/living/basic/bots/mulebot/mulebot_delivery.dm new file mode 100644 index 00000000000..5fec23e9bbf --- /dev/null +++ b/code/modules/mob/living/basic/bots/mulebot/mulebot_delivery.dm @@ -0,0 +1,117 @@ +/mob/living/basic/bot/mulebot/execute_resist() + . = ..() + if(load) + unload() + +/mob/living/basic/bot/mulebot/Exited(atom/movable/gone, direction) + . = ..() + if(gone == load) + unload() + if(gone == cell) + turn_off() + assign_cell() + cell = null + set_cell_hud() + +/mob/living/basic/bot/mulebot/Entered(obj/item/stock_parts/power_store/cell/arrived, atom/old_loc, list/atom/old_locs) + . = ..() + if(istype(arrived) && isnull(cell)) + assign_cell(arrived) + +// mousedrop a crate to load the bot +// can load anything if hacked +/mob/living/basic/bot/mulebot/mouse_drop_receive(atom/movable/atom_to_load, mob/user, params) + if(!isliving(user)) + return + + if(!istype(atom_to_load) || isdead(atom_to_load) || iseyemob(atom_to_load) || istype(atom_to_load, /obj/effect/dummy/phased_mob)) + return + + load(atom_to_load) + +/mob/living/basic/bot/mulebot/post_unbuckle_mob(mob/living/M) + load = null + return ..() + +/mob/living/basic/bot/mulebot/relaymove(mob/living/user, direction) + if(user.incapacitated) + return + if(load == user) + unload() + +/mob/living/basic/bot/mulebot/remove_air(amount) //To prevent riders suffocating + return loc ? loc.remove_air(amount) : null + +/// Called to load an atom on the mulebot, which is usually a crate, unless if hacked +/mob/living/basic/bot/mulebot/proc/load(atom/movable/atom_to_load) + if(load || atom_to_load.anchored) + return + + if(!isturf(atom_to_load.loc)) //To prevent the loading from stuff from someone's inventory or screen icons. + return + + var/obj/structure/closet/crate/crate = atom_to_load + if(!istype(crate)) + if(!wires.is_cut(WIRE_LOADCHECK)) + buzz(MULEBOT_MOOD_SIGH) + return // if not hacked, only allow crates to be loaded + crate = null + + if(crate || isobj(atom_to_load)) + var/obj/object_to_load = atom_to_load + if(object_to_load.has_buckled_mobs() || (locate(/mob) in atom_to_load)) //can't load non crates objects with mobs buckled to it or inside it. + buzz(MULEBOT_MOOD_SIGH) + return + + if(crate) + crate.close() //make sure the crate is closed + + object_to_load.forceMove(src) + + else if(isliving(atom_to_load)) + if(!load_mob(atom_to_load)) //forceMove() is handled in buckling + return + + load = atom_to_load + update_appearance() + +///resolves the name to display for the loaded mob. primarily needed for the paranormal subtype since we don't want to show the name of ghosts riding it. +/mob/living/basic/bot/mulebot/proc/get_load_name() + return load ? load.name : null + +///Loads a mob onto the mulebot +/mob/living/basic/bot/mulebot/proc/load_mob(mob/living/mob_to_load) + can_buckle = TRUE + if(buckle_mob(mob_to_load)) + passenger = mob_to_load + load = mob_to_load + can_buckle = FALSE + return TRUE + +// called to unload the bot +// argument is optional direction to unload +// if zero or null, unload at bot's location +/mob/living/basic/bot/mulebot/proc/unload(dirn) + if(QDELETED(load)) + if(load) //if our thing was qdel'd, there's likely a leftover reference. just clear it and remove the overlay. we'll let the bot keep moving around to prevent it abruptly stopping somewhere. + load = null + update_appearance() + return + + update_bot_mode(new_mode = BOT_IDLE) + + var/atom/movable/cached_load = load //cache the load since unbuckling mobs clears the var. + + unbuckle_all_mobs() + + if(load) //don't have to do any of this for mobs. + cached_load.forceMove(loc) + cached_load.pixel_y = initial(cached_load.pixel_y) + cached_load.layer = initial(cached_load.layer) + SET_PLANE_EXPLICIT(cached_load, initial(cached_load.plane), src) + load = null + + if(dirn) //move the thing to the delivery point. + cached_load.Move(get_step(loc,dirn), dirn) + + update_appearance() diff --git a/code/modules/mob/living/basic/bots/mulebot/mulebot_hud.dm b/code/modules/mob/living/basic/bots/mulebot/mulebot_hud.dm new file mode 100644 index 00000000000..3e1f26c8584 --- /dev/null +++ b/code/modules/mob/living/basic/bots/mulebot/mulebot_hud.dm @@ -0,0 +1,74 @@ +/mob/living/basic/bot/mulebot/proc/set_cell_hud() + if(!has_power()) + set_hud_image_state(DIAG_BATT_HUD, "hudnobatt") + return + + var/atom/movable/screen/mob_charge/charge_hud = hud_used?.screen_objects[HUD_MULEBOT_CHARGE] + charge_hud?.calculate_charge() + set_hud_image_state(DIAG_BATT_HUD, "hudbatt[RoundDiagBar(cell.charge/cell.maxcharge)]") + +/atom/movable/screen/mob_charge + icon = 'icons/obj/machines/cell_charger.dmi' + icon_state = "ccharger" + screen_loc = ui_stamina + ///used to find the overlay for charger icon + var/current_charge_level = 4 + ///dynamic, based on what cell our nulebot's using + var/image/battery_overlay + ///maptext that displays charge in numbers + var/image/charge_overlay + ///is there a mouse on us + var/hovering = FALSE + +/atom/movable/screen/mob_charge/proc/update_battery_overlay(atom/target_battery) + var/obj/item/stock_parts/power_store/cell/my_cell = target_battery || (locate() in get_mob()) + if(isnull(my_cell)) + battery_overlay = null + else + battery_overlay = image(icon = my_cell.icon, icon_state = my_cell.icon_state, loc = src, layer = src.layer + 0.1) + update_appearance(UPDATE_ICON) + +/atom/movable/screen/mob_charge/proc/calculate_charge() + var/obj/item/stock_parts/power_store/cell/my_battery = locate() in get_mob() + var/charge_value = isnull(my_battery) ? 0 : round(my_battery.charge/my_battery.maxcharge * 100 , 1) + current_charge_level = round(charge_value * 4 / 100) + charge_overlay.maptext = MAPTEXT("
[charge_value]%
") + update_appearance(UPDATE_ICON) + +/atom/movable/screen/mob_charge/New(loc, ...) + . = ..() + charge_overlay = image(loc = src, layer = src.layer+0.2, pixel_y = -5) + update_battery_overlay() + +/atom/movable/screen/mob_charge/Destroy() + charge_overlay = null + battery_overlay = null + return ..() + +/atom/movable/screen/mob_charge/update_overlays() + . = ..() + . += mutable_appearance(icon, "ccharger-o[current_charge_level]") + if(battery_overlay) + . |= battery_overlay + if(hovering) + . |= charge_overlay + +/atom/movable/screen/mob_charge/MouseEntered(location,control,params) + if(usr != get_mob()) + return + . = ..() + hovering = TRUE + calculate_charge() + +/atom/movable/screen/mob_charge/MouseExited(location, control, params) + if(usr != get_mob()) + return + . = ..() + hovering = FALSE + update_appearance(UPDATE_ICON) + +/datum/hud/living/mulebot + +/datum/hud/living/mulebot/initialize_screen_objects() + . = ..() + add_screen_object(/atom/movable/screen/mob_charge, HUD_MULEBOT_CHARGE, HUD_GROUP_INFO) diff --git a/code/modules/mob/living/basic/bots/mulebot/mulebot_movement.dm b/code/modules/mob/living/basic/bots/mulebot/mulebot_movement.dm new file mode 100644 index 00000000000..0654477a096 --- /dev/null +++ b/code/modules/mob/living/basic/bots/mulebot/mulebot_movement.dm @@ -0,0 +1,72 @@ +/mob/living/basic/bot/mulebot/MobBump(mob/bumped_mob) // called when the bot bumps into a mob + if(mind || !isliving(bumped_mob)) //if there's a sentience controlling the bot, they aren't allowed to harm folks. + return ..() + var/mob/living/bumped_living = bumped_mob + if(wires.is_cut(WIRE_AVOIDANCE)) // usually just bumps, but if the avoidance wire is cut, knocks them over. + if(iscyborg(bumped_living)) + visible_message(span_danger("[src] bumps into [bumped_living]!")) + else if(bumped_living.Knockdown(8 SECONDS)) + log_combat(src, bumped_living, "knocked down") + visible_message(span_danger("[src] knocks over [bumped_living]!")) + return ..() + +/mob/living/basic/bot/mulebot/on_bot_movement(atom/movable/source, atom/oldloc, dir, forced) + cell?.use(cell_move_power_usage) + set_cell_hud() + + if(has_gravity()) + for(var/mob/living/carbon/human/future_pancake in loc) + if(future_pancake.body_position == LYING_DOWN) + run_over(future_pancake) + + return ..() + +///Checks if the bot is on or if it has charge +/mob/living/basic/bot/mulebot/proc/on_pre_move() + SIGNAL_HANDLER + + if(!(bot_mode_flags & BOT_MODE_ON)) + return COMPONENT_MOB_BOT_BLOCK_PRE_STEP + + if((cell && (cell.charge < cell_move_power_usage)) || !has_power()) + turn_off() + return COMPONENT_MOB_BOT_BLOCK_PRE_STEP + +// when mulebot is in the same loc +/mob/living/basic/bot/mulebot/proc/run_over(mob/living/carbon/human/crushed) + if (!(bot_access_flags & BOT_COVER_EMAGGED) && !wires.is_cut(WIRE_AVOIDANCE)) + if (!has_status_effect(/datum/status_effect/careful_driving)) + crushed.visible_message(span_notice("[src] slows down to avoid crushing [crushed].")) + apply_status_effect(/datum/status_effect/careful_driving) + return // Player mules must be emagged before they can trample + + log_combat(src, crushed, "run over", addition = "(DAMTYPE: [uppertext(BRUTE)])") + crushed.visible_message( + span_danger("[src] drives over [crushed]!"), + span_userdanger("[src] drives over you!"), + ) + + playsound(src, 'sound/effects/splat.ogg', 50, TRUE) + + var/damage = rand(5, 15) + var/static/list/zone_damages = list( + BODY_ZONE_HEAD = 2, + BODY_ZONE_CHEST = 2, + BODY_ZONE_L_LEG = 0.5, + BODY_ZONE_R_LEG = 0.5, + BODY_ZONE_L_ARM = 0.5, + BODY_ZONE_R_ARM = 0.5, + ) + for(var/body_zone in zone_damages) + crushed.apply_damage(zone_damages[body_zone] * damage, BRUTE, body_zone, run_armor_check(body_zone, MELEE)) + + add_mob_blood(crushed) + + var/turf/below_us = get_turf(src) + below_us.add_mob_blood(crushed) + + AddComponent(/datum/component/blood_walk, \ + blood_type = /obj/effect/decal/cleanable/blood/tracks, \ + target_dir_change = TRUE, \ + transfer_blood_dna = TRUE, \ + max_blood = 4) diff --git a/code/modules/mob/living/basic/bots/mulebot/mulebot_paranormal.dm b/code/modules/mob/living/basic/bots/mulebot/mulebot_paranormal.dm new file mode 100644 index 00000000000..9a4b20b9e5a --- /dev/null +++ b/code/modules/mob/living/basic/bots/mulebot/mulebot_paranormal.dm @@ -0,0 +1,61 @@ +/mob/living/basic/bot/mulebot/paranormal + name = "\improper GHOULbot" + desc = "A rather ghastly looking... Multiple Utility Load Effector bot? It only seems to accept paranormal forces, and for this reason is fucking useless." + icon_state = "paranormalmulebot0" + base_icon_state = "paranormalmulebot" + ///avoid the utterly miniscule chance of infinite looping + replacement_chance = 0 + +/mob/living/basic/bot/mulebot/paranormal/update_overlays() + . = ..() + if(!isobserver(load)) + return + var/mutable_appearance/ghost_overlay = mutable_appearance('icons/mob/simple/mob.dmi', "ghost", layer + 0.01) //use a generic ghost icon, otherwise you can metagame who's dead if they have a custom ghost set + ghost_overlay.pixel_y = 12 + . += ghost_overlay + +/mob/living/basic/bot/mulebot/paranormal/get_load_name() //Don't reveal the name of ghosts so we can't metagame who died and all that. + . = ..() + if(. && isobserver(load)) + return "Unknown" + +/mob/living/basic/bot/mulebot/paranormal/load(atom/movable/movable_atom) + if(load || movable_atom.anchored) + return + + if(!isturf(movable_atom.loc)) //To prevent the loading from stuff from someone's inventory or screen icons. + return + + if(isobserver(movable_atom)) + visible_message(span_warning("A ghostly figure appears on [src]!")) + movable_atom.forceMove(src) + RegisterSignal(movable_atom, COMSIG_MOVABLE_MOVED, PROC_REF(ghost_moved)) + + else if(!wires.is_cut(WIRE_LOADCHECK)) + buzz(MULEBOT_MOOD_SIGH) + return // if not hacked, only allow ghosts to be loaded + + else if(isobj(movable_atom)) + if(movable_atom.has_buckled_mobs() || (locate(/mob) in movable_atom)) //can't load non crates objects with mobs buckled to it or inside it. + buzz(MULEBOT_MOOD_SIGH) + return + + if(istype(movable_atom, /obj/structure/closet/crate)) + var/obj/structure/closet/crate/crate = movable_atom + crate.close() //make sure it's closed + + movable_atom.forceMove(src) + + else if(isliving(movable_atom) && !load_mob(movable_atom)) + return + + load = movable_atom + update_bot_mode(new_mode = BOT_IDLE) + update_appearance() + +///Handles the ghosts moving out from the mule +/mob/living/basic/bot/mulebot/paranormal/proc/ghost_moved() + SIGNAL_HANDLER + visible_message(span_notice("The ghostly figure vanishes...")) + UnregisterSignal(load, COMSIG_MOVABLE_MOVED) + unload() diff --git a/code/modules/mob/living/basic/bots/mulebot/mulebot_tool_interactions.dm b/code/modules/mob/living/basic/bots/mulebot/mulebot_tool_interactions.dm new file mode 100644 index 00000000000..d80cc520bbb --- /dev/null +++ b/code/modules/mob/living/basic/bots/mulebot/mulebot_tool_interactions.dm @@ -0,0 +1,46 @@ +/mob/living/basic/bot/mulebot/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + update_appearance() + +/mob/living/basic/bot/mulebot/crowbar_act(mob/living/user, obj/item/tool) + if(!(bot_access_flags & BOT_COVER_MAINTS_OPEN) || user.combat_mode) + return + if(!cell) + to_chat(user, span_warning("[src] doesn't have a power cell!")) + return ITEM_INTERACT_BLOCKING + cell.add_fingerprint(user) + user.visible_message( + span_notice("[user] crowbars [cell] out from [src]."), + span_notice("You pry [cell] out of [src]."), + ) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(cell) + else + cell.forceMove(drop_location()) + return ITEM_INTERACT_SUCCESS + +/mob/living/basic/bot/mulebot/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/stock_parts/power_store/cell) && (bot_access_flags & BOT_COVER_MAINTS_OPEN)) + if(cell) + to_chat(user, span_warning("[src] already has a power cell!")) + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + user.visible_message( + span_notice("[user] inserts \a [cell] into [src]."), + span_notice("You insert [cell] into [src]."), + ) + return ITEM_INTERACT_SUCCESS + if(is_wire_tool(tool) && (bot_access_flags & BOT_COVER_MAINTS_OPEN)) + attack_hand(user) + return ITEM_INTERACT_SUCCESS + return ..() + + +/mob/living/basic/bot/mulebot/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + if(!(bot_access_flags & BOT_COVER_EMAGGED)) + return + flick("[base_icon_state]-emagged", src) + playsound(src, SFX_SPARKS, 100, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE diff --git a/code/modules/mob/living/basic/bots/repairbot/repairbot.dm b/code/modules/mob/living/basic/bots/repairbot/repairbot.dm index 8cc3a90a336..0e3647adb19 100644 --- a/code/modules/mob/living/basic/bots/repairbot/repairbot.dm +++ b/code/modules/mob/living/basic/bots/repairbot/repairbot.dm @@ -250,7 +250,7 @@ var/obj/item/stack/rods/new_rods = new() new_rods.forceMove(src) -/mob/living/basic/bot/repairbot/turn_on() +/mob/living/basic/bot/repairbot/turn_on(mob/user) . = ..() if(!.) return diff --git a/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm index 86849f1ffd9..5202159878b 100644 --- a/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm +++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm @@ -175,12 +175,6 @@ // A note to future coders: do not replace this with an EMP because it will wreck malf AIs and everyone will hate you. /datum/action/cooldown/spell/aoe/revenant/malfunction/cast_on_thing_in_aoe(turf/victim, mob/living/basic/revenant/caster) - for(var/mob/living/simple_animal/bot/bot in victim) - if(!(bot.bot_cover_flags & BOT_COVER_EMAGGED)) - new /obj/effect/temp_visual/revenant(bot.loc) - bot.bot_cover_flags &= ~BOT_COVER_LOCKED - bot.bot_cover_flags |= BOT_COVER_MAINTS_OPEN - bot.emag_act(caster) for(var/mob/living/basic/bot/bot in victim) if(!(bot.bot_access_flags & BOT_COVER_EMAGGED)) new /obj/effect/temp_visual/revenant(bot.loc) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index aa960b3444a..0849b20eed9 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -541,13 +541,8 @@ var/mob/living/bot = bot_ref?.resolve() if(!bot) return - var/summon_success - if(isbasicbot(bot)) - var/mob/living/basic/bot/basic_bot = bot - summon_success = basic_bot.summon_bot(src, waypoint, grant_all_access = TRUE) - else - var/mob/living/simple_animal/bot/simple_bot = bot - summon_success = simple_bot.call_bot(src, waypoint) + var/mob/living/basic/bot/basic_bot = bot + var/summon_success = basic_bot.summon_bot(src, waypoint, grant_all_access = TRUE) var/chat_message = summon_success ? "Sending command to bot..." : "Interface error. Unit is already in use." to_chat(src, span_notice("[chat_message]")) diff --git a/code/modules/mob/living/silicon/ai/robot_control.dm b/code/modules/mob/living/silicon/ai/robot_control.dm index 94c99369b6c..1884804afe4 100644 --- a/code/modules/mob/living/silicon/ai/robot_control.dm +++ b/code/modules/mob/living/silicon/ai/robot_control.dm @@ -35,37 +35,22 @@ var/turf/ai_current_turf = get_turf(owner) data["robots"] = list() - for(var/mob/living/our_bot as anything in GLOB.bots_list) + for(var/mob/living/basic/bot/our_bot as anything in GLOB.bots_list) if(!isbot(our_bot) || !is_valid_z_level(ai_current_turf, get_turf(our_bot))) continue - if(isbasicbot(our_bot)) - var/mob/living/basic/bot/basic_bot = our_bot - if(!(basic_bot.bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) - continue - var/list/basic_bot_data = list( - name = basic_bot.name, - model = basic_bot.bot_type, - mode = basic_bot.mode, - hacked = !!(basic_bot.bot_access_flags & BOT_COVER_HACKED), - location = get_area_name(basic_bot, TRUE), - ref = REF(basic_bot), - ) - data["robots"] += list(basic_bot_data) - continue - - var/mob/living/simple_animal/bot/simple_bot = our_bot - if(!(simple_bot.bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) + var/mob/living/basic/bot/basic_bot = our_bot + if(!(basic_bot.bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) continue - var/list/simple_bot_data = list( - name = simple_bot.name, - model = simple_bot.bot_type, - mode = simple_bot.get_mode(), - hacked = !!(simple_bot.bot_cover_flags & BOT_COVER_HACKED), - location = get_area_name(simple_bot, TRUE), - ref = REF(simple_bot), + var/list/basic_bot_data = list( + name = basic_bot.name, + model = basic_bot.bot_type, + mode = basic_bot.mode, + hacked = !!(basic_bot.bot_access_flags & BOT_COVER_HACKED), + location = get_area_name(basic_bot, TRUE), + ref = REF(basic_bot), ) - data["robots"] += list(simple_bot_data) + data["robots"] += list(basic_bot_data) return data @@ -84,28 +69,19 @@ switch(action) if("callbot") //Command a bot to move to a selected location. - if(isbasicbot(bot)) - var/mob/living/basic/bot/basic_bot = bot - if(!(basic_bot.bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) - return - else - var/mob/living/simple_animal/bot/simple_bot = bot - if(!(simple_bot.bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) - return + var/mob/living/basic/bot/basic_bot = bot + if(!(basic_bot.bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) + return owner.bot_ref = WEAKREF(bot) owner.setting_waypoint = TRUE to_chat(our_user, span_notice("Set your waypoint by clicking on a valid location free of obstructions.")) if("interface") //Remotely connect to a bot! owner.bot_ref = WEAKREF(bot) - if(isbasicbot(bot)) - var/mob/living/basic/bot/basic_bot = bot - if(!(basic_bot.bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) - return - else - var/mob/living/basic/bot/simple_bot = bot - if(!(simple_bot.bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) - return + var/mob/living/basic/bot/basic_bot = bot + if(!(basic_bot.bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) + return + bot.attack_ai(our_user) return TRUE diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm deleted file mode 100644 index 86f50e6246a..00000000000 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ /dev/null @@ -1,1231 +0,0 @@ -// AI (i.e. game AI, not the AI player) controlled bots -/mob/living/simple_animal/bot - abstract_type = /mob/living/simple_animal/bot - icon = 'icons/mob/silicon/aibots.dmi' - layer = MOB_LAYER - gender = NEUTER - mob_biotypes = MOB_ROBOTIC - stop_automated_movement = TRUE - wander = FALSE - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0) - atmos_requirements = null - unsuitable_atmos_damage = 0 - hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_PATH_HUD = HUD_LIST_LIST) - maxbodytemp = INFINITY - minbodytemp = 0 - sentience_type = SENTIENCE_ARTIFICIAL - status_flags = NONE //no default canpush - pass_flags = PASSFLAPS - verb_say = "states" - verb_ask = "queries" - verb_exclaim = "declares" - verb_yell = "alarms" - initial_language_holder = /datum/language_holder/synthetic - bubble_icon = "machine" - speech_span = SPAN_ROBOT - faction = list(FACTION_NEUTRAL, FACTION_SILICON, FACTION_TURRET) - light_system = OVERLAY_LIGHT - light_range = 3 - light_power = 0.6 - del_on_death = TRUE - req_one_access = list(ACCESS_ROBOTICS) - interaction_flags_click = ALLOW_SILICON_REACH - - ///Cooldown between salutations for commissioned bots - COOLDOWN_DECLARE(next_salute_check) - - ///The Robot arm attached to this robot - has a 50% chance to drop on death. - var/robot_arm = /obj/item/bodypart/arm/right/robot - ///The inserted (if any) pAI in this bot. - var/obj/item/pai_card/paicard - ///The type of bot it is, for radio control. - var/bot_type = NONE - - ///Additonal access given to player-controlled bots. - var/list/player_access = list() - ///All initial access this bot started with. - var/list/prev_access = list() - - ///Bot-related mode flags on the Bot indicating how they will act. BOT_MODE_ON | BOT_MODE_AUTOPATROL | BOT_MODE_REMOTE_ENABLED | BOT_MODE_CAN_BE_SAPIENT | BOT_MODE_ROUNDSTART_POSSESSION - var/bot_mode_flags = BOT_MODE_ON | BOT_MODE_REMOTE_ENABLED | BOT_MODE_CAN_BE_SAPIENT | BOT_MODE_ROUNDSTART_POSSESSION - - ///Bot-related cover flags on the Bot to deal with what has been done to their cover, including emagging. BOT_COVER_MAINTS_OPEN | BOT_COVER_LOCKED | BOT_COVER_EMAGGED | BOT_COVER_HACKED - var/bot_cover_flags = BOT_COVER_LOCKED - - ///Small name of what the bot gets messed with when getting hacked/emagged. - var/hackables = "system circuits" - ///Used by some bots for tracking failures to reach their target. - var/frustration = 0 - ///The speed at which the bot moves, or the number of times it moves per process() tick. - var/base_speed = 2 - ///The end point of a bot's path, or the target location. - var/turf/ai_waypoint - ///The bot is on a custom set path. - var/pathset = FALSE - ///List of turfs through which a bot 'steps' to reach the waypoint, associated with the path image, if there is one. - var/list/path = list() - ///List of unreachable targets for an ignore-list enabled bot to ignore. - var/list/ignore_list = list() - ///Standardizes the vars that indicate the bot is busy with its function. - var/mode = BOT_IDLE - ///Number of times the bot tried and failed to move. - var/tries = 0 - ///Links a bot to the AI calling it. - var/mob/living/silicon/ai/calling_ai - ///The bot's radio, for speaking to people. - var/obj/item/radio/internal_radio - ///which channels can the bot listen to - var/radio_key = null - ///The bot's default radio channel - var/radio_channel = RADIO_CHANNEL_COMMON - ///Turf a bot is summoned to navitage towards. - var/turf/patrol_target - ///Turf of a user summoning a bot towards their location. - var/turf/summon_target - ///Pending new destination (waiting for beacon response) - var/new_destination - ///Destination description tag - var/destination - ///The next destination in the patrol route - var/next_destination - - /// the nearest beacon's tag - var/nearest_beacon - ///The nearest beacon's location - var/turf/nearest_beacon_loc - - ///The type of data HUD the bot uses. Diagnostic by default. - var/data_hud_type = TRAIT_DIAGNOSTIC_HUD - var/datum/atom_hud/data/bot_path/private/path_hud - var/path_image_icon = 'icons/mob/silicon/aibots.dmi' - var/path_image_icon_state = "path_indicator" - var/path_image_color = COLOR_WHITE - var/reset_access_timer_id - var/ignorelistcleanuptimer = 1 // This ticks up every automated action, at 300 we clean the ignore list - - /// If true we will allow ghosts to control this mob - var/can_be_possessed = FALSE - /// If true we will offer this - COOLDOWN_DECLARE(offer_ghosts_cooldown) - /// Message to display upon possession - var/possessed_message = "You're a generic bot. How did one of these even get made?" - /// List of strings to sound effects corresponding to automated messages the bot can play - var/list/automated_announcements - /// Action we use to say voice lines out loud, also we just pass anything we try to say through here just in case it plays a voice line - var/datum/action/cooldown/bot_announcement/pa_system - // The faction of the bot before it inherited the pai's faction - var/list/original_faction - // The allies of the bot before it inherited the pai's faction - var/list/original_allies - - ///Innate access uses an internal ID card. - var/obj/item/card/id/access_card = null - -/mob/living/simple_animal/bot/proc/get_mode() - if(client) //Player bots do not have modes, thus the override. Also an easy way for PDA users/AI to know when a bot is a player. - return paicard ? "pAI Controlled" : "Autonomous" - if(!(bot_mode_flags & BOT_MODE_ON)) - return span_bad("Inactive") - return span_average("[mode]") - -/** - * Returns a status string about the bot's current status, if it's moving, manually controlled, or idle. - */ -/mob/living/simple_animal/bot/proc/get_mode_ui() - if(client) //Player bots do not have modes, thus the override. Also an easy way for PDA users/AI to know when a bot is a player. - return paicard ? "pAI Controlled" : "Autonomous" - if(!(bot_mode_flags & BOT_MODE_ON)) - return "Inactive" - return "[mode]" - -/** - * Returns a string of flavor text for emagged bots as defined by policy. - */ -/mob/living/simple_animal/bot/proc/get_emagged_message() - return get_policy(ROLE_EMAGGED_BOT) || "You are a malfunctioning bot! Disrupt everyone and cause chaos!" - -/mob/living/simple_animal/bot/proc/turn_on() - if(stat) - return FALSE - bot_mode_flags |= BOT_MODE_ON - remove_traits(list(TRAIT_INCAPACITATED, TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), POWER_LACK_TRAIT) - set_light_on(bot_mode_flags & BOT_MODE_ON ? TRUE : FALSE) - update_appearance() - balloon_alert(src, "turned on") - diag_hud_set_botstat() - return TRUE - -/mob/living/simple_animal/bot/proc/turn_off() - bot_mode_flags &= ~BOT_MODE_ON - add_traits(list(TRAIT_INCAPACITATED, TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), POWER_LACK_TRAIT) - set_light_on(bot_mode_flags & BOT_MODE_ON ? TRUE : FALSE) - bot_reset() //Resets an AI's call, should it exist. - balloon_alert(src, "turned off") - update_appearance() - -/mob/living/simple_animal/bot/proc/get_bot_flag(checked_mode, checked_flag) - if(checked_mode & checked_flag) - return TRUE - return FALSE - -/mob/living/simple_animal/bot/Initialize(mapload) - . = ..() - GLOB.bots_list += src - add_traits(list(TRAIT_SILICON_ACCESS, TRAIT_REAGENT_SCANNER, TRAIT_UNOBSERVANT), INNATE_TRAIT) - LoadComponent(/datum/component/bloodysoles/bot) - - path_hud = new /datum/atom_hud/data/bot_path/private() - for(var/hud in path_hud.hud_icons) // You get to see your own path - set_hud_image_active(hud, exclusive_hud = path_hud) - - // Give bots a fancy new ID card that can hold any access. - access_card = new /obj/item/card/id/advanced/simple_bot(src) - // This access is so bots can be immediately set to patrol and leave Robotics, instead of having to be let out first. - access_card.set_access(list(ACCESS_ROBOTICS)) - internal_radio = new /obj/item/radio(src) - if(radio_key) - internal_radio.keyslot = new radio_key - internal_radio.subspace_transmission = TRUE - internal_radio.canhear_range = 0 // anything greater will have the bot broadcast the channel as if it were saying it out loud. - internal_radio.recalculateChannels() - - //Adds bot to the diagnostic HUD system - prepare_huds() - var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] - diag_hud.add_atom_to_hud(src) - diag_hud_set_bothealth() - diag_hud_set_botstat() - diag_hud_set_botmode() - - //If a bot has its own HUD (for player bots), provide it. - if(!isnull(data_hud_type)) - ADD_TRAIT(src, data_hud_type, INNATE_TRAIT) - if(path_hud) - path_hud.add_atom_to_hud(src) - path_hud.show_to(src) - - if(mapload && is_station_level(z) && bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT && bot_mode_flags & BOT_MODE_ROUNDSTART_POSSESSION) - enable_possession(mapload = mapload) - - pa_system = new(src, automated_announcements = automated_announcements) - pa_system.Grant(src) - RegisterSignal(src, COMSIG_MOB_TRIED_ACCESS, PROC_REF(attempt_access)) - ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT) - -/mob/living/simple_animal/bot/Destroy() - GLOB.bots_list -= src - QDEL_NULL(paicard) - QDEL_NULL(pa_system) - QDEL_NULL(internal_radio) - QDEL_NULL(access_card) - QDEL_NULL(path_hud) - return ..() - -/// Allows this bot to be controlled by a ghost, who will become its mind -/mob/living/simple_animal/bot/proc/enable_possession(user, mapload = FALSE) - if (paicard) - balloon_alert(user, "already sapient!") - return - can_be_possessed = TRUE - var/can_announce = !mapload && COOLDOWN_FINISHED(src, offer_ghosts_cooldown) - AddComponent( - /datum/component/ghost_direct_control, \ - ban_type = ROLE_BOT, \ - poll_candidates = can_announce, \ - poll_ignore_key = POLL_IGNORE_BOTS, \ - assumed_control_message = (bot_cover_flags & BOT_COVER_EMAGGED) ? get_emagged_message() : possessed_message, \ - extra_control_checks = CALLBACK(src, PROC_REF(check_possession)), \ - after_assumed_control = CALLBACK(src, PROC_REF(post_possession)), \ - ) - if (can_announce) - COOLDOWN_START(src, offer_ghosts_cooldown, 30 SECONDS) - - if (user) - log_silicon("[key_name(user)] enabled sapience for [src] ([initial(src.name)])") // Not technically a silicon but who is counting - -/// Disables this bot from being possessed by ghosts -/mob/living/simple_animal/bot/proc/disable_possession(mob/user) - if (user) - log_silicon("[key_name(user)] disabled sapience for [src] ([initial(src.name)])") - can_be_possessed = FALSE - qdel(GetComponent(/datum/component/ghost_direct_control)) - if (isnull(key)) - return - if (user) - log_combat(user, src, "ejected [key_name(src)] from control of [src] ([initial(src.name)]).") - to_chat(src, span_warning("You feel yourself fade as your personality matrix is reset!")) - ghostize(can_reenter_corpse = FALSE) - playsound(src, 'sound/machines/ping.ogg', 30, TRUE) - speak("Personality matrix reset!") - key = null - -/// Returns true if this mob can be controlled -/mob/living/simple_animal/bot/proc/check_possession(mob/potential_possessor) - if (!can_be_possessed) - to_chat(potential_possessor, span_warning("The bot's personality download has been disabled!")) - return can_be_possessed - -/// Fired after something takes control of this mob -/mob/living/simple_animal/bot/proc/post_possession() - playsound(src, 'sound/machines/ping.ogg', 30, TRUE) - speak("New personality installed successfully!") - rename(src) - -/// Allows renaming the bot to something else -/mob/living/simple_animal/bot/proc/rename(mob/user) - var/new_name = sanitize_name( - reject_bad_text(tgui_input_text( - user = user, - message = "This machine is designated [real_name]. Would you like to update its registration?", - title = "Name change", - default = real_name, - max_length = MAX_NAME_LEN, - )), - allow_numbers = TRUE - ) - if (isnull(new_name) || QDELETED(src)) - return - if (key && user != src) - var/accepted = tgui_alert( - src, - message = "Do you wish to be renamed to [new_name]?", - title = "Name change", - buttons = list("Yes", "No"), - ) - if (accepted != "Yes" || QDELETED(src)) - return - fully_replace_character_name(real_name, new_name) - -/mob/living/simple_animal/bot/allowed(mob/living/user) - if(!(bot_cover_flags & BOT_COVER_LOCKED)) // Unlocked. - return TRUE - return ..() - -/mob/living/simple_animal/bot/bee_friendly() - return TRUE - -/mob/living/simple_animal/bot/death(gibbed) - if(paicard) - ejectpai() - explode() - return ..() - -/mob/living/simple_animal/bot/proc/explode() - visible_message(span_boldnotice("[src] blows apart!")) - do_sparks(3, TRUE, src) - var/atom/location_destroyed = drop_location() - if(prob(50)) - drop_part(robot_arm, location_destroyed) - -/mob/living/simple_animal/bot/emag_act(mob/user, obj/item/card/emag/emag_card) - . = ..() - if(bot_cover_flags & BOT_COVER_LOCKED) //First emag application unlocks the bot's interface. Apply a screwdriver to use the emag again. - bot_cover_flags &= ~BOT_COVER_LOCKED - balloon_alert(user, "cover unlocked") - return TRUE - if(!(bot_cover_flags & BOT_COVER_LOCKED) && bot_cover_flags & BOT_COVER_MAINTS_OPEN) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging. - bot_cover_flags |= BOT_COVER_EMAGGED - bot_cover_flags &= ~BOT_COVER_LOCKED //Manually emagging the bot locks out the panel. - bot_mode_flags &= ~BOT_MODE_REMOTE_ENABLED //Manually emagging the bot also locks the AI from controlling it. - bot_reset() - turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP. - to_chat(src, span_userdanger("(#$*#$^^( OVERRIDE DETECTED")) - to_chat(src, span_boldnotice(get_emagged_message())) - if(user) - log_combat(user, src, "emagged") - return TRUE - else //Bot is unlocked, but the maint panel has not been opened with a screwdriver (or through the UI) yet. - balloon_alert(user, "open maintenance panel first!") - return FALSE - -/mob/living/simple_animal/bot/examine(mob/user) - . = ..() - if(health < maxHealth) - if(health > maxHealth/3) - . += "[src]'s parts look loose." - else - . += "[src]'s parts look very loose!" - else - . += "[src] is in pristine condition." - . += span_notice("[p_Their()] maintenance panel is [bot_cover_flags & BOT_COVER_MAINTS_OPEN ? "open" : "closed"].") - . += span_info("You can use a screwdriver to [bot_cover_flags & BOT_COVER_MAINTS_OPEN ? "close" : "open"] it.") - if(bot_cover_flags & BOT_COVER_MAINTS_OPEN) - . += span_notice("[p_Their()] control panel is [bot_cover_flags & BOT_COVER_LOCKED ? "locked" : "unlocked"].") - var/is_sillycone = HAS_SILICON_ACCESS(user) - if(!(bot_cover_flags & BOT_COVER_EMAGGED) && (is_sillycone || user.Adjacent(src))) - . += span_info("Alt-click [is_sillycone ? "" : "or use your ID on "]it to [bot_cover_flags & BOT_COVER_LOCKED ? "un" : ""]lock [p_their()] control panel.") - if(paicard) - . += span_notice("[p_They()] has a pAI device installed.") - if(!(bot_cover_flags & BOT_COVER_MAINTS_OPEN)) - . += span_info("You can use a hemostat to remove it.") - if(access_card) - . += "There appears to be [icon2html(access_card, user)] \a [access_card] pinned to [p_them()]." - -/mob/living/simple_animal/bot/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - if(amount > 0 && prob(10)) - new /obj/effect/decal/cleanable/blood/oil(loc) - return ..() - -/mob/living/simple_animal/bot/updatehealth() - ..() - diag_hud_set_bothealth() - -/mob/living/simple_animal/bot/med_hud_set_health() - return //we use a different hud - -/mob/living/simple_animal/bot/med_hud_set_status() - return //we use a different hud - -/mob/living/simple_animal/bot/handle_automated_action() //Master process which handles code common across most bots. - diag_hud_set_botmode() - - if (ignorelistcleanuptimer % 300 == 0) // Every 300 actions, clean up the ignore list from old junk - for(var/ref in ignore_list) - var/atom/referredatom = locate(ref) - if (!referredatom || !istype(referredatom) || QDELETED(referredatom)) - ignore_list -= ref - ignorelistcleanuptimer = 1 - else - ignorelistcleanuptimer++ - - if(!(bot_mode_flags & BOT_MODE_ON) || client) - return FALSE - - if(HAS_TRAIT(src, TRAIT_COMMISSIONED) && COOLDOWN_FINISHED(src, next_salute_check)) - COOLDOWN_START(src, next_salute_check, BOT_COMMISSIONED_SALUTE_DELAY) - for(var/mob/living/simple_animal/bot/nearby_bot in view(5, src)) - if(!HAS_TRAIT(nearby_bot, TRAIT_COMMISSIONED) && nearby_bot.bot_mode_flags & BOT_MODE_ON) - manual_emote("performs an elaborate salute for [nearby_bot]!") - break - - switch(mode) //High-priority overrides are processed first. Bots can do nothing else while under direct command. - if(BOT_RESPONDING) //Called by the AI. - call_mode() - return FALSE - if(BOT_SUMMON) //Called to a location - summon_step() - return FALSE - return TRUE //Successful completion. Used to prevent child process() continuing if this one is ended early. - - -/mob/living/simple_animal/bot/attack_hand(mob/living/carbon/human/user, list/modifiers) - if(!user.combat_mode) - ui_interact(user) - else - return ..() - -/mob/living/simple_animal/bot/attack_ai(mob/user) - if(!topic_denied(user)) - ui_interact(user) - else - to_chat(user, span_warning("[src]'s interface is not responding!")) - -/mob/living/simple_animal/bot/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "SimpleBot", name) - ui.open() - -/mob/living/simple_animal/bot/click_alt(mob/user) - unlock_with_id(user) - return CLICK_ACTION_SUCCESS - -/mob/living/simple_animal/bot/proc/unlock_with_id(mob/user) - if(bot_cover_flags & BOT_COVER_EMAGGED) - to_chat(user, span_danger("ERROR")) - return - if(bot_cover_flags & BOT_COVER_MAINTS_OPEN) - to_chat(user, span_warning("Please close the access panel before [bot_cover_flags & BOT_COVER_LOCKED ? "un" : ""]locking it.")) - return - if(!allowed(user)) - to_chat(user, span_warning("Access denied.")) - return - bot_cover_flags ^= BOT_COVER_LOCKED - to_chat(user, span_notice("Controls are now [bot_cover_flags & BOT_COVER_LOCKED ? "locked" : "unlocked"].")) - return TRUE - -/mob/living/simple_animal/bot/screwdriver_act(mob/living/user, obj/item/tool) - if(bot_cover_flags & BOT_COVER_LOCKED) - to_chat(user, span_warning("The maintenance panel is locked!")) - return ITEM_INTERACT_SUCCESS - - tool.play_tool_sound(src) - bot_cover_flags ^= BOT_COVER_MAINTS_OPEN - to_chat(user, span_notice("The maintenance panel is now [bot_cover_flags & BOT_COVER_MAINTS_OPEN ? "opened" : "closed"].")) - return ITEM_INTERACT_SUCCESS - -/mob/living/simple_animal/bot/welder_act(mob/living/user, obj/item/tool) - user.changeNext_move(CLICK_CD_MELEE) - if(user.combat_mode) - return FALSE - - if(health >= maxHealth) - to_chat(user, span_warning("[src] does not need a repair!")) - return ITEM_INTERACT_SUCCESS - if(!(bot_cover_flags & BOT_COVER_MAINTS_OPEN)) - to_chat(user, span_warning("Unable to repair with the maintenance panel closed!")) - return ITEM_INTERACT_SUCCESS - - if(tool.use_tool(src, user, 0 SECONDS, volume=40)) - adjustHealth(-10) - user.visible_message(span_notice("[user] repairs [src]!"),span_notice("You repair [src].")) - return ITEM_INTERACT_SUCCESS - -/mob/living/simple_animal/bot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) - if(attacking_item.GetID()) - unlock_with_id(user) - return - if(istype(attacking_item, /obj/item/pai_card)) - insertpai(user, attacking_item) - return - if(attacking_item.tool_behaviour == TOOL_HEMOSTAT && paicard) - if(bot_cover_flags & BOT_COVER_MAINTS_OPEN) - balloon_alert(user, "open the access panel!") - else - balloon_alert(user, "removing pAI...") - if(!do_after(user, 3 SECONDS, target = src) || !paicard) - return - user.visible_message(span_notice("[user] uses [attacking_item] to pull [paicard] out of [initial(src.name)]!"),span_notice("You pull [paicard] out of [initial(src.name)] with [attacking_item].")) - ejectpai(user) - return - return ..() - -/mob/living/simple_animal/bot/attack_effects(damage_done, hit_zone, armor_block, obj/item/attacking_item, mob/living/attacker) - if(damage_done > 0 && attacking_item.damtype != STAMINA && stat != DEAD) - do_sparks(5, TRUE, src) - . = TRUE - return ..() || . - -/mob/living/simple_animal/bot/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) - . = ..() - if(prob(25) || . != BULLET_ACT_HIT) - return - if(hitting_projectile.damage_type != BRUTE && hitting_projectile.damage_type != BURN) - return - if(!hitting_projectile.is_hostile_projectile() || hitting_projectile.damage <= 0) - return - do_sparks(5, TRUE, src) - -/mob/living/simple_animal/bot/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - var/was_on = bot_mode_flags & BOT_MODE_ON ? TRUE : FALSE - stat |= EMPED - new /obj/effect/temp_visual/emp(loc) - if(paicard) - paicard.emp_act(severity) - src.visible_message(span_notice("[paicard] is flies out of [initial(src.name)]!"), span_warning("You are forcefully ejected from [initial(src.name)]!")) - ejectpai() - - if (QDELETED(src)) - return - - if(bot_mode_flags & BOT_MODE_ON) - turn_off() - addtimer(CALLBACK(src, PROC_REF(emp_reset), was_on), severity * 30 SECONDS) - if(!prob(70/severity)) - return - if (!length(GLOB.uncommon_roundstart_languages)) - return - remove_all_languages(source = LANGUAGE_EMP) - grant_random_uncommon_language(source = LANGUAGE_EMP) - -/mob/living/simple_animal/bot/proc/emp_reset(was_on) - stat &= ~EMPED - if(was_on) - turn_on() - -/** - * Pass a message to have the bot say() it, passing through our announcement action to potentially also play a sound. - * Optionally pass a frequency to say it on the radio. - */ -/mob/living/simple_animal/bot/proc/speak(message, channel) - if(!message) - return - pa_system.announce(message, channel) - -/mob/living/simple_animal/bot/radio(message, list/message_mods = list(), list/spans, language) - . = ..() - if(.) - return - - if(message_mods[MODE_HEADSET]) - internal_radio.talk_into(src, message, , spans, language, message_mods) - return REDUCE_RANGE - else if(message_mods[RADIO_EXTENSION] == MODE_DEPARTMENT) - internal_radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) - return REDUCE_RANGE - else if(message_mods[RADIO_EXTENSION] in GLOB.default_radio_channels) - internal_radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) - return REDUCE_RANGE - -/mob/living/simple_animal/bot/proc/drop_part(obj/item/drop_item, dropzone) - var/obj/item/item_to_drop - if(ispath(drop_item)) - item_to_drop = new drop_item(dropzone) - else - item_to_drop = drop_item - item_to_drop.forceMove(dropzone) - - if(istype(item_to_drop, /obj/item/stock_parts/power_store/cell)) - var/obj/item/stock_parts/power_store/cell/dropped_cell = item_to_drop - dropped_cell.charge = 0 - - else if(istype(item_to_drop, /obj/item/storage)) - var/obj/item/storage/storage_to_drop = item_to_drop - storage_to_drop.contents = list() - - else if(istype(item_to_drop, /obj/item/gun/energy)) - var/obj/item/gun/energy/dropped_gun = item_to_drop - dropped_gun.cell.charge = 0 - dropped_gun.update_appearance() - -//Generalized behavior code, override where needed! - -GLOBAL_LIST_EMPTY(scan_typecaches) -/** - * Attempt to scan tiles near [src], first by checking adjacent, then if a target is still not found, nearby. - * - * scan_types - list (of typepaths) that nearby tiles are being scanned for. - * old_target - what has already been scanned, and will early return at checkscan. - * scan_range - how far away from [src] will be scanned, if nothing is found directly adjacent. - */ -/mob/living/simple_animal/bot/proc/scan(list/scan_types, old_target, scan_range = DEFAULT_SCAN_RANGE) - var/key = scan_types.Join(",") - var/list/scan_cache = GLOB.scan_typecaches[key] - if(!scan_cache) - scan_cache = typecacheof(scan_types) - GLOB.scan_typecaches[key] = scan_cache - if(!get_turf(src)) - return - // Nicer behavior, ensures we don't conflict with other bots quite so often - var/list/adjacent = list() - for(var/turf/to_walk in view(1, src)) - adjacent += to_walk - - adjacent = shuffle(adjacent) - - var/list/turfs_to_walk = list() - for(var/turf/victim in view(scan_range, src)) - turfs_to_walk += victim - - turfs_to_walk = turfs_to_walk - adjacent - // Now we prepend adjacent since we want to run those first - turfs_to_walk = adjacent + turfs_to_walk - - for(var/turf/scanned as anything in turfs_to_walk) - // Check bot is inlined here to save cpu time - //Is there another bot there? Then let's just skip it so we dont all atack on top of eachother. - var/bot_found = FALSE - for(var/mob/living/simple_animal/bot/buddy in scanned.contents) - if(istype(buddy, type) && (buddy != src)) - bot_found = TRUE - break - if(bot_found) - continue - - for(var/atom/thing as anything in scanned) - if(!scan_cache[thing.type]) //Check that the thing we found is the type we want! - continue //If not, keep searching! - if(thing == old_target || (REF(thing) in ignore_list)) //Filter for blacklisted elements, usually unreachable or previously processed oness - continue - - var/scan_result = process_scan(thing) //Some bots may require additional processing when a result is selected. - if(!isnull(scan_result)) - return scan_result - -//When the scan finds a target, run bot specific processing to select it for the next step. Empty by default. -/mob/living/simple_animal/bot/proc/process_scan(scan_target) - return scan_target - -/mob/living/simple_animal/bot/proc/check_bot(targ) - var/turf/target_turf = get_turf(targ) - if(!target_turf) - return FALSE - for(var/mob/living/simple_animal/bot/buddy in target_turf.contents) - if(istype(buddy, type) && (buddy != src)) - return TRUE - return FALSE - -/mob/living/simple_animal/bot/proc/add_to_ignore(subject) - if(ignore_list.len < 50) //This will help keep track of them, so the bot is always trying to reach a blocked spot. - ignore_list += REF(subject) - else //If the list is full, insert newest, delete oldest. - ignore_list.Cut(1,2) - ignore_list += REF(subject) - -/* -Movement proc for stepping a bot through a path generated through A-star. -Pass a positive integer as an argument to override a bot's default speed. -*/ -/mob/living/simple_animal/bot/proc/bot_move(dest, move_speed) - if(!dest || !path || path.len == 0) //A-star failed or a path/destination was not set. - set_path(null) - return FALSE - dest = get_turf(dest) //We must always compare turfs, so get the turf of the dest var if dest was originally something else. - var/turf/last_node = get_turf(path[path.len]) //This is the turf at the end of the path, it should be equal to dest. - if(get_turf(src) == dest) //We have arrived, no need to move again. - return TRUE - else if(dest != last_node) //The path should lead us to our given destination. If this is not true, we must stop. - set_path(null) - return FALSE - var/step_count = move_speed ? move_speed : base_speed //If a value is passed into move_speed, use that instead of the default speed var. - - if(step_count >= 1 && tries < BOT_STEP_MAX_RETRIES) - for(var/step_number in 1 to step_count) - addtimer(CALLBACK(src, PROC_REF(bot_step)), BOT_STEP_DELAY*(step_number-1)) - else - return FALSE - return TRUE - -/// Performs a step_towards and increments the path if successful. Returns TRUE if the bot moved and FALSE otherwise. -/mob/living/simple_animal/bot/proc/bot_step() - if(!length(path)) - return FALSE - - if(SEND_SIGNAL(src, COMSIG_MOB_BOT_PRE_STEP) & COMPONENT_MOB_BOT_BLOCK_PRE_STEP) - return FALSE - - if(!step_towards(src, path[1])) - tries++ - return FALSE - - increment_path() - tries = 0 - SEND_SIGNAL(src, COMSIG_MOB_BOT_STEP) - return TRUE - - -/mob/living/simple_animal/bot/proc/check_bot_access() - if(mode != BOT_SUMMON && mode != BOT_RESPONDING) - access_card.set_access(prev_access) - -/mob/living/simple_animal/bot/proc/call_bot(summoner, turf/waypoint, message = TRUE) - if(isAI(summoner) && calling_ai && calling_ai != src) //Prevents an override if another AI is controlling this bot. - return FALSE - - bot_reset() //Reset a bot before setting it to call mode. - - set_path(get_path_to(src, waypoint, max_distance=200, access = REGION_ACCESS_ALL_STATION)) - calling_ai = summoner //Link the AI to the bot! - ai_waypoint = waypoint - - if(path?.len) //Ensures that a valid path is calculated! - var/end_area = get_area_name(waypoint) - if(!(bot_mode_flags & BOT_MODE_ON)) - turn_on() //Saves the AI the hassle of having to activate a bot manually. - access_card.set_access(REGION_ACCESS_ALL_STATION) //Give the bot all-access while under the AI's command. - if(client) - reset_access_timer_id = addtimer(CALLBACK (src, PROC_REF(bot_reset)), 60 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) //if the bot is player controlled, they get the extra access for a limited time - to_chat(src, span_notice("[span_big("Priority waypoint set by [icon2html(calling_ai, src)] [summoner]. Proceed to [end_area].")]
[path.len-1] meters to destination. You have been granted additional door access for 60 seconds.")) - if(message) - to_chat(calling_ai, span_notice("[icon2html(src, calling_ai)] [name] called to [end_area]. [path.len-1] meters to destination.")) - pathset = TRUE - mode = BOT_RESPONDING - tries = 0 - else - if(message) - to_chat(calling_ai, span_danger("Failed to calculate a valid route. Ensure destination is clear of obstructions and within range.")) - calling_ai = null - set_path(null) - - return TRUE - -/mob/living/simple_animal/bot/proc/call_mode() //Handles preparing a bot for a call, as well as calling the move proc. -//Handles the bot's movement during a call. - var/success = bot_move(ai_waypoint, 3) - if(!success) - if(calling_ai) - to_chat(calling_ai, "[icon2html(src, calling_ai)] [get_turf(src) == ai_waypoint ? span_notice("[src] successfully arrived to waypoint.") : span_danger("[src] failed to reach waypoint.")]") - calling_ai = null - bot_reset() - -/mob/living/simple_animal/bot/proc/bot_reset() - if(calling_ai) //Simple notification to the AI if it called a bot. It will not know the cause or identity of the bot. - to_chat(calling_ai, span_danger("Call command to a bot has been reset.")) - calling_ai = null - if(reset_access_timer_id) - deltimer(reset_access_timer_id) - reset_access_timer_id = null - set_path(null) - summon_target = null - pathset = FALSE - access_card.set_access(prev_access) - tries = 0 - mode = BOT_IDLE - ignore_list = list() - diag_hud_set_botstat() - diag_hud_set_botmode() - - - - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//Patrol and summon code! -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -/mob/living/simple_animal/bot/proc/bot_patrol() - patrol_step() - addtimer(CALLBACK(src, PROC_REF(do_patrol)), 0.5 SECONDS) - -/mob/living/simple_animal/bot/proc/do_patrol() - if(mode == BOT_PATROL) - patrol_step() - -/mob/living/simple_animal/bot/proc/start_patrol() - - if(tries >= BOT_STEP_MAX_RETRIES) //Bot is trapped, so stop trying to patrol. - bot_mode_flags &= ~BOT_MODE_AUTOPATROL - tries = 0 - speak("Unable to start patrol.") - - return - - if(!(bot_mode_flags & BOT_MODE_AUTOPATROL)) //A bot not set to patrol should not be patrolling. - mode = BOT_IDLE - return - - if(patrol_target) // has patrol target - INVOKE_ASYNC(src, PROC_REF(target_patrol)) - else // no patrol target, so need a new one - speak("Engaging patrol mode.") - find_patrol_target() - tries++ - return - -/mob/living/simple_animal/bot/proc/target_patrol() - calc_path() // Find a route to it - if(!path.len) - patrol_target = null - return - mode = BOT_PATROL -// perform a single patrol step - -/mob/living/simple_animal/bot/proc/patrol_step() - - if(client) // In use by player, don't actually move. - return - - if(loc == patrol_target) // reached target - //Find the next beacon matching the target. - if(!get_next_patrol_target()) - find_patrol_target() //If it fails, look for the nearest one instead. - return - - else if(path.len > 0 && patrol_target) // valid path - if(path[1] == loc) - increment_path() - return - - - var/moved = bot_move(patrol_target)//step_towards(src, next) // attempt to move - if(!moved) //Couldn't proceed the next step of the path BOT_STEP_MAX_RETRIES times - addtimer(CALLBACK(src, PROC_REF(patrol_step_not_moved)), 0.2 SECONDS) - - else // no path, so calculate new one - mode = BOT_START_PATROL - -/mob/living/simple_animal/bot/proc/patrol_step_not_moved() - calc_path() - if(!length(path)) - find_patrol_target() - tries = 0 - -// finds the nearest beacon to self -/mob/living/simple_animal/bot/proc/find_patrol_target() - nearest_beacon = null - new_destination = null - find_nearest_beacon() - if(nearest_beacon) - patrol_target = nearest_beacon_loc - destination = next_destination - else - bot_mode_flags &= ~BOT_MODE_AUTOPATROL - mode = BOT_IDLE - speak("Disengaging patrol mode.") - -/mob/living/simple_animal/bot/proc/get_next_patrol_target() - // search the beacon list for the next target in the list. - for(var/obj/machinery/navbeacon/NB in GLOB.navbeacons["[z]"]) - if(NB.location == next_destination) //Does the Beacon location text match the destination? - destination = new_destination //We now know the name of where we want to go. - patrol_target = NB.loc //Get its location and set it as the target. - next_destination = NB.codes[NAVBEACON_PATROL_NEXT] //Also get the name of the next beacon in line. - return TRUE - -/mob/living/simple_animal/bot/proc/find_nearest_beacon() - for(var/obj/machinery/navbeacon/NB in GLOB.navbeacons["[z]"]) - var/dist = get_dist(src, NB) - if(nearest_beacon) //Loop though the beacon net to find the true closest beacon. - //Ignore the beacon if were are located on it. - if(dist>1 && dist 1) //Begin the search, save this one for comparison on the next loop. - nearest_beacon = NB.location - nearest_beacon_loc = NB.loc - patrol_target = nearest_beacon_loc - destination = nearest_beacon - -//PDA control. Some bots, especially MULEs, may have more parameters. -/mob/living/simple_animal/bot/proc/bot_control(command, mob/user, list/user_access = list()) - if(!(bot_mode_flags & BOT_MODE_ON) || bot_cover_flags & BOT_COVER_EMAGGED || !(bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) //Emagged bots do not respect anyone's authority! Bots with their remote controls off cannot get commands. - return TRUE //ACCESS DENIED - if(client) - bot_control_message(command, user) - // process control input - switch(command) - if("patroloff") - bot_reset() //HOLD IT!! //OBJECTION!! - bot_mode_flags &= ~BOT_MODE_AUTOPATROL - - if("patrolon") - bot_mode_flags |= BOT_MODE_AUTOPATROL - - if("summon") - bot_reset() - summon_target = get_turf(user) - if(user_access.len != 0) - access_card.set_access(user_access + prev_access) //Adds the user's access, if any. - mode = BOT_SUMMON - speak("Responding.", radio_channel) - if("ejectpai") - ejectpairemote(user) - return - - -/mob/living/simple_animal/bot/proc/bot_control_message(command, user) - switch(command) - if("patroloff") - to_chat(src, "STOP PATROL") - if("patrolon") - to_chat(src, "START PATROL") - if("summon") - to_chat(src, "PRIORITY ALERT:[user] in [get_area_name(user)]!") - if("stop") - to_chat(src, "STOP!") - - if("go") - to_chat(src, "GO!") - - if("home") - to_chat(src, "RETURN HOME!") - if("ejectpai") - return - else - to_chat(src, span_warning("Unidentified control sequence received:[command]")) - -// calculates a path to the current destination -// given an optional turf to avoid -/mob/living/simple_animal/bot/proc/calc_path(turf/avoid) - check_bot_access() - set_path(get_path_to(src, patrol_target, max_distance=120, access=access_card.GetAccess(), exclude=avoid, diagonal_handling=DIAGONAL_REMOVE_ALL)) - -/mob/living/simple_animal/bot/proc/calc_summon_path(turf/avoid) - check_bot_access() - var/datum/callback/path_complete = CALLBACK(src, PROC_REF(on_summon_path_finish)) - SSpathfinder.pathfind(src, summon_target, max_distance=150, access=access_card.GetAccess(), exclude=avoid, diagonal_handling=DIAGONAL_REMOVE_ALL, on_finish=list(path_complete)) - -/mob/living/simple_animal/bot/proc/on_summon_path_finish(list/path) - set_path(path) - if(!length(path)) //Cannot reach target. Give up and announce the issue. - speak("Summon command failed, destination unreachable.",radio_channel) - bot_reset() - -/mob/living/simple_animal/bot/proc/summon_step() - - if(client) // In use by player, don't actually move. - return - - if(loc == summon_target) // Arrived to summon location. - bot_reset() - return - - else if(path.len > 0 && summon_target) //Proper path acquired! - if(path[1] == loc) - increment_path() - return - - var/moved = bot_move(summon_target, 3) // Move attempt - if(!moved) - addtimer(CALLBACK(src, PROC_REF(summon_step_not_moved)), 0.2 SECONDS) - - else // no path, so calculate new one - calc_summon_path() - -/mob/living/simple_animal/bot/proc/summon_step_not_moved() - calc_summon_path() - tries = 0 - -/mob/living/simple_animal/bot/proc/attempt_access(mob/bot, obj/door_attempt) - SIGNAL_HANDLER - - if(door_attempt.check_access(access_card)) - frustration = 0 - return ACCESS_ALLOWED - return ACCESS_DISALLOWED - -/mob/living/simple_animal/bot/ui_data(mob/user) - var/list/data = list() - data["can_hack"] = HAS_SILICON_ACCESS(user) - data["custom_controls"] = list() - data["emagged"] = bot_cover_flags & BOT_COVER_EMAGGED - data["has_access"] = allowed(user) - data["locked"] = bot_cover_flags & BOT_COVER_LOCKED - data["settings"] = list() - if(!(bot_cover_flags & BOT_COVER_LOCKED) || HAS_SILICON_ACCESS(user)) - data["settings"]["pai_inserted"] = !!paicard - data["settings"]["allow_possession"] = bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT - data["settings"]["possession_enabled"] = can_be_possessed - data["settings"]["airplane_mode"] = !(bot_mode_flags & BOT_MODE_REMOTE_ENABLED) - data["settings"]["maintenance_lock"] = !(bot_cover_flags & BOT_COVER_MAINTS_OPEN) - data["settings"]["power"] = bot_mode_flags & BOT_MODE_ON - data["settings"]["patrol_station"] = bot_mode_flags & BOT_MODE_AUTOPATROL - return data - -// Actions received from TGUI -/mob/living/simple_animal/bot/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - var/mob/user = ui.user - if(!allowed(user)) - to_chat(user, span_warning("Access denied.")) - return - - if(action == "lock") - bot_cover_flags ^= BOT_COVER_LOCKED - - switch(action) - if("power") - if(bot_mode_flags & BOT_MODE_ON) - turn_off() - else - turn_on() - if("maintenance") - bot_cover_flags ^= BOT_COVER_MAINTS_OPEN - if("patrol") - bot_mode_flags ^= BOT_MODE_AUTOPATROL - bot_reset() - if("airplane") - bot_mode_flags ^= BOT_MODE_REMOTE_ENABLED - if("hack") - if(!HAS_SILICON_ACCESS(user)) - return - if(!(bot_cover_flags & BOT_COVER_EMAGGED)) - bot_cover_flags |= (BOT_COVER_EMAGGED|BOT_COVER_HACKED|BOT_COVER_LOCKED) - to_chat(user, span_warning("You overload [src]'s [hackables].")) - message_admins("Safety lock of [ADMIN_LOOKUPFLW(src)] was disabled by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(src)]") - user.log_message("disabled safety lock of [src]", LOG_GAME) - bot_reset() - to_chat(src, span_userdanger("(#$*#$^^( OVERRIDE DETECTED")) - to_chat(src, span_boldnotice(get_emagged_message())) - return - if(!(bot_cover_flags & BOT_COVER_HACKED)) - to_chat(user, span_bolddanger("You fail to repair [src]'s [hackables].")) - return - bot_cover_flags &= ~(BOT_COVER_EMAGGED|BOT_COVER_HACKED) - to_chat(user, span_notice("You reset the [src]'s [hackables].")) - user.log_message("re-enabled safety lock of [src]", LOG_GAME) - bot_reset() - to_chat(src, span_userdanger("Software restored to standard.")) - to_chat(src, span_boldnotice(possessed_message)) - if("eject_pai") - if(!paicard) - return - to_chat(user, span_notice("You eject [paicard] from [initial(src.name)].")) - ejectpai(user) - if("toggle_personality") - if (can_be_possessed) - disable_possession(user) - else - enable_possession(user) - if("rename") - rename(user) - -/mob/living/simple_animal/bot/update_icon_state() - icon_state = "[isnull(base_icon_state) ? initial(icon_state) : base_icon_state][get_bot_flag(bot_mode_flags, BOT_MODE_ON)]" - return ..() - -/// Access check proc for bot topics! Remember to place in a bot's individual Topic if desired. -/mob/living/simple_animal/bot/proc/topic_denied(mob/user) - if(!user.can_perform_action(src, ALLOW_SILICON_REACH)) - return TRUE - // 0 for access, 1 for denied. - if(bot_cover_flags & BOT_COVER_EMAGGED) //An emagged bot cannot be controlled by humans, silicons can if one hacked it. - if(!(bot_cover_flags & BOT_COVER_HACKED)) //Manually emagged by a human - access denied to all. - return TRUE - else if(!HAS_SILICON_ACCESS(user)) //Bot is hacked, so only silicons and admins are allowed access. - return TRUE - return FALSE - -/// Places a pAI in control of this mob -/mob/living/simple_animal/bot/proc/insertpai(mob/user, obj/item/pai_card/card) - if(paicard) - balloon_alert(user, "slot occupied!") - return - if(key) - balloon_alert(user, "personality already present!") - return - if(bot_cover_flags & BOT_COVER_LOCKED || !(bot_cover_flags & BOT_COVER_MAINTS_OPEN)) - balloon_alert(user, "slot inaccessible!") - return - if(!(bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT)) - balloon_alert(user, "incompatible firmware!") - return - if(!card.pai || !card.pai.mind) - balloon_alert(user, "pAI is inactive!") - return - if(!user.transferItemToLoc(card, src)) - return - paicard = card - disable_possession() - if(paicard.pai.holoform) - paicard.pai.fold_in() - copy_languages(paicard.pai, source_override = LANGUAGE_PAI) - set_active_language(paicard.pai.get_selected_language()) - user.visible_message(span_notice("[user] inserts [card] into [src]!"), span_notice("You insert [card] into [src].")) - paicard.pai.mind.transfer_to(src) - to_chat(src, span_notice("You sense your form change as you are uploaded into [src].")) - name = paicard.pai.name - original_faction = get_faction() - original_allies = allies - SET_FACTION_AND_ALLIES_FROM(src, user) - log_combat(user, paicard.pai, "uploaded to [initial(src.name)],") - return TRUE - -/mob/living/simple_animal/bot/ghost() - if(stat != DEAD) // Only ghost if we're doing this while alive, the pAI probably isn't dead yet. - return ..() - if(paicard && (!client || stat == DEAD)) - ejectpai() - -/// Ejects a pAI from this bot -/mob/living/simple_animal/bot/proc/ejectpai(mob/user = null, announce = TRUE) - if(!paicard) - return - if(mind && paicard.pai) - mind.transfer_to(paicard.pai) - else if(paicard.pai) - paicard.pai.PossessByPlayer(key) - else - ghostize(FALSE) // The pAI card that just got ejected was dead. - key = null - paicard.forceMove(loc) - if(user) - log_combat(user, paicard.pai, "ejected from [initial(src.name)],") - else - log_combat(src, paicard.pai, "ejected") - if(announce) - to_chat(paicard.pai, span_notice("You feel your control fade as [paicard] ejects from [initial(src.name)].")) - paicard = null - name = initial(src.name) - set_faction(original_faction) - set_allies(original_allies) - remove_all_languages(source = LANGUAGE_PAI) - get_selected_language() - -/// Ejects the pAI remotely. -/mob/living/simple_animal/bot/proc/ejectpairemote(mob/user) - if(!allowed(user) || !paicard) - return - speak("Ejecting personality chip.", radio_channel) - ejectpai(user) - -/mob/living/simple_animal/bot/Login() - . = ..() - if(!. || !client) - return FALSE - // If we have any bonus player accesses, add them to our internal ID card. - if(length(player_access)) - access_card.add_access(player_access) - diag_hud_set_botmode() - -/mob/living/simple_animal/bot/Logout() - . = ..() - bot_reset() - -/mob/living/simple_animal/bot/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) - . = ..() - if(!.) - return - update_appearance() - -/mob/living/simple_animal/bot/sentience_act() - remove_faction(FACTION_SILICON) - -/mob/living/simple_animal/bot/proc/set_path(list/newpath) - path = newpath ? newpath : list() - if(!path_hud) - return - var/list/path_huds_watching_me = list(GLOB.huds[DATA_HUD_DIAGNOSTIC], GLOB.huds[DATA_HUD_BOT_PATH]) - if(path_hud) - path_huds_watching_me += path_hud - for(var/datum/atom_hud/hud as anything in path_huds_watching_me) - hud.remove_atom_from_hud(src) - - var/list/path_images = active_hud_list[DIAG_PATH_HUD] - LAZYCLEARLIST(path_images) - if(length(newpath)) - var/mutable_appearance/path_image = mutable_appearance(path_image_icon, path_image_icon_state, BOT_PATH_LAYER, appearance_flags = RESET_COLOR|RESET_TRANSFORM|KEEP_APART) - path_image.color = path_image_color - for(var/i in 1 to newpath.len) - var/turf/T = newpath[i] - if(T == loc) //don't bother putting an image if it's where we already exist. - continue - var/direction = get_dir(src, T) - if(i > 1) - var/turf/prevT = path[i - 1] - var/image/prevI = path[prevT] - direction = get_dir(prevT, T) - if(i > 2 && prevI) // make sure we actually have an image to manipulate at index > 2 - var/turf/prevprevT = path[i - 2] - var/prevDir = get_dir(prevprevT, prevT) - var/mixDir = direction|prevDir - if(ISDIAGONALDIR(mixDir)) - prevI.dir = mixDir - if(prevDir & (NORTH|SOUTH)) - var/matrix/ntransform = matrix() - ntransform.Turn(90) - if((mixDir == NORTHWEST) || (mixDir == SOUTHEAST)) - ntransform.Scale(-1, 1) - else - ntransform.Scale(1, -1) - prevI.transform = ntransform - - SET_PLANE(path_image, GAME_PLANE, T) - path_image.dir = direction - var/image/I = image(loc = T) - I.appearance = path_image - path[T] = I - path_images += I - - for(var/datum/atom_hud/hud as anything in path_huds_watching_me) - hud.add_atom_to_hud(src) - -/mob/living/simple_animal/bot/proc/increment_path() - if(!length(path)) - return - var/image/I = path[path[1]] - if(I) - animate(I, alpha = 0, time = 3) - path.Cut(1, 2) - - if(!length(path)) - addtimer(CALLBACK(src, PROC_REF(set_path), null), 0.6 SECONDS) // Enough time for the animate to finish - -/mob/living/simple_animal/bot/rust_heretic_act() - adjust_brute_loss(400) - -/mob/living/simple_animal/bot/get_hit_area_message(input_area) - // we just get hit, there's no complexity for hitting an arm (if it exists) or anything. - // we also need to return an empty string as otherwise it would falsely say that we get hit in the chest or something strange like that (bots don't have "chests") - return "" - -//Will always check hands first, because access_card is internal to the mob and can't be removed or swapped. -/mob/living/simple_animal/bot/get_idcard(hand_first) - return (..() || access_card) diff --git a/code/modules/mob/living/simple_animal/bot/bot_announcement.dm b/code/modules/mob/living/simple_animal/bot/bot_announcement.dm index 0a9f8d8d59c..10161dddfd9 100644 --- a/code/modules/mob/living/simple_animal/bot/bot_announcement.dm +++ b/code/modules/mob/living/simple_animal/bot/bot_announcement.dm @@ -51,7 +51,7 @@ /datum/action/cooldown/bot_announcement/ui_data(mob/user) var/list/data = list() - var/mob/living/simple_animal/bot/bot_owner = owner + var/mob/living/basic/bot/bot_owner = owner if(istype(bot_owner)) var/list/channels = list() for(var/channel in bot_owner.internal_radio.channels) @@ -149,7 +149,7 @@ /// Speak the provided line on the provided radio channel /datum/action/cooldown/bot_announcement/proc/announce(line, channel) - var/mob/living/simple_animal/bot/bot_owner = owner + var/mob/living/basic/bot/bot_owner = owner if (!(bot_owner.bot_mode_flags & BOT_MODE_ON)) return diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm deleted file mode 100644 index 5095a1e4baa..00000000000 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ /dev/null @@ -1,873 +0,0 @@ - - -// Mulebot - carries crates around for Quartermaster -// Navigates via floor navbeacons -// Remote Controlled from QM's PDA - -#define SIGH 0 -#define ANNOYED 1 -#define DELIGHT 2 -#define CHIME 3 - -/mob/living/simple_animal/bot/mulebot - name = "\improper MULEbot" - desc = "A Multiple Utility Load Effector bot." - icon_state = "mulebot0" - light_color = "#ffcc99" - light_power = 0.8 - density = TRUE - move_resist = MOVE_FORCE_STRONG - animate_movement = SLIDE_STEPS - health = 50 - maxHealth = 50 - speed = 3 - damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, STAMINA = 0, OXY = 0) - combat_mode = TRUE //No swapping - buckle_lying = 0 - mob_size = MOB_SIZE_LARGE - buckle_prevents_pull = TRUE // No pulling loaded shit - bot_mode_flags = ~BOT_MODE_ROUNDSTART_POSSESSION - req_one_access = list(ACCESS_ROBOTICS, ACCESS_CARGO) - radio_key = /obj/item/encryptionkey/headset_cargo - radio_channel = RADIO_CHANNEL_SUPPLY - bot_type = MULE_BOT - path_image_color = "#7F5200" - possessed_message = "You are a MULEbot! Do your best to make sure that packages get to their destination!" - - /// unique identifier in case there are multiple mulebots. - var/id - - var/base_icon = "mulebot" /// icon_state to use in update_icon_state - var/atom/movable/load /// what we're transporting - var/mob/living/passenger /// who's riding us - var/turf/target /// this is turf to navigate to (location of beacon) - var/loaddir = 0 /// this the direction to unload onto/load from - var/home_destination = "" /// tag of home delivery beacon - - var/reached_target = TRUE ///true if already reached the target - ///Number of times retried a blocked path - var/blockcount = 0 - - ///flags of mulebot mode - var/mulebot_delivery_flags = MULEBOT_RETURN_MODE | MULEBOT_AUTO_PICKUP_MODE | MULEBOT_REPORT_DELIVERY_MODE - - var/obj/item/stock_parts/power_store/cell /// Internal Powercell - var/cell_move_power_usage = 1///How much power we use when we move. - var/num_steps = 0 ///The amount of steps we should take until we rest for a time. - - - -/mob/living/simple_animal/bot/mulebot/Initialize(mapload) - . = ..() - - RegisterSignal(src, COMSIG_MOB_BOT_PRE_STEP, PROC_REF(check_pre_step)) - RegisterSignal(src, COMSIG_MOB_CLIENT_PRE_MOVE, PROC_REF(check_pre_step)) - RegisterSignal(src, COMSIG_MOB_BOT_STEP, PROC_REF(on_bot_step)) - RegisterSignal(src, COMSIG_MOB_CLIENT_MOVED, PROC_REF(on_bot_step)) - - ADD_TRAIT(src, TRAIT_NOMOBSWAP, INNATE_TRAIT) - - if(prob(0.666) && mapload) - new /mob/living/simple_animal/bot/mulebot/paranormal(loc) - return INITIALIZE_HINT_QDEL - set_wires(new /datum/wires/mulebot(src)) - - // Doing this hurts my soul, but simplebot access reworks are for another day. - var/datum/id_trim/job/cargo_trim = SSid_access.trim_singletons_by_path[/datum/id_trim/job/cargo_technician] - access_card.add_access(cargo_trim.access + cargo_trim.wildcard_access) - prev_access = access_card.access.Copy() - - cell = new /obj/item/stock_parts/power_store/cell/upgraded(src, 2000) - - AddElement(/datum/element/ridable, /datum/component/riding/creature/mulebot) - diag_hud_set_mulebotcell() - - set_id(suffix || assign_random_name()) - suffix = null - if(name == "\improper MULEbot") - name = "\improper MULEbot [id]" - set_home(get_turf(src)) - -/mob/living/simple_animal/bot/mulebot/Exited(atom/movable/gone, direction) - . = ..() - if(gone == load) - unload(0) - if(gone == cell) - turn_off() - cell = null - diag_hud_set_mulebotcell() - -/mob/living/simple_animal/bot/mulebot/examine(mob/user) - . = ..() - if(bot_cover_flags & BOT_COVER_MAINTS_OPEN) - if(cell) - . += span_notice("[p_They()] [p_have()] \a [cell] installed.") - . += span_info("You can use a crowbar to remove it.") - else - . += span_notice("[p_They()] [p_have()] an empty compartment where a power cell can be installed.") - if(load) //observer check is so we don't show the name of the ghost that's sitting on it to prevent metagaming who's ded. - . += span_notice("\A [isobserver(load) ? "ghostly figure" : load] is on [p_their()] load platform.") - - -/mob/living/simple_animal/bot/mulebot/Destroy() - UnregisterSignal(src, list(COMSIG_MOB_BOT_PRE_STEP, COMSIG_MOB_CLIENT_PRE_MOVE, COMSIG_MOB_BOT_STEP, COMSIG_MOB_CLIENT_MOVED)) - unload(0) - QDEL_NULL(cell) - return ..() - -/mob/living/simple_animal/bot/mulebot/get_cell() - return cell - -/mob/living/simple_animal/bot/mulebot/turn_on() - if(!has_power()) - return - return ..() - -/// returns true if the bot is fully powered. -/mob/living/simple_animal/bot/mulebot/proc/has_power() - return cell && cell.charge > 0 && (!wires.is_cut(WIRE_POWER1) && !wires.is_cut(WIRE_POWER2)) - -/mob/living/simple_animal/bot/mulebot/attack_hand(mob/living/carbon/human/user, list/modifiers) - if(bot_cover_flags & BOT_COVER_MAINTS_OPEN && !HAS_AI_ACCESS(user)) - wires.interact(user) - return - if(wires.is_cut(WIRE_RX) && HAS_AI_ACCESS(user)) - return - - return ..() - -/mob/living/simple_animal/bot/mulebot/proc/set_id(new_id) - id = new_id - -/mob/living/simple_animal/bot/mulebot/proc/set_home(turf/home_loc) - if(!istype(home_loc)) - CRASH("MULEbot [id] was requested to set a home location to [home_loc ? "an invalid home loc ([home_loc.type])" : "null"]") - - var/obj/machinery/navbeacon/home_beacon = locate() in home_loc - if(!isnull(home_beacon)) - home_destination = home_beacon.location - log_transport("[id]: MULEbot successfuly set home location to ID [home_destination] at [home_beacon.x], [home_beacon.y], [home_beacon.z]") - return - - log_transport("[id]: MULEbot failed to set home at [home_loc.x], [home_loc.y], [home_loc.z]") - -/mob/living/simple_animal/bot/mulebot/bot_reset() - ..() - reached_target = FALSE - -/mob/living/simple_animal/bot/mulebot/screwdriver_act(mob/living/user, obj/item/tool) - . = ..() - update_appearance() - -/mob/living/simple_animal/bot/mulebot/crowbar_act(mob/living/user, obj/item/tool) - if(!(bot_cover_flags & BOT_COVER_MAINTS_OPEN) || user.combat_mode) - return - if(!cell) - to_chat(user, span_warning("[src] doesn't have a power cell!")) - return ITEM_INTERACT_BLOCKING - cell.add_fingerprint(user) - user.visible_message( - span_notice("[user] crowbars [cell] out from [src]."), - span_notice("You pry [cell] out of [src]."), - ) - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(cell) - else - cell.forceMove(drop_location()) - return ITEM_INTERACT_SUCCESS - -/mob/living/simple_animal/bot/mulebot/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(istype(tool, /obj/item/stock_parts/power_store/cell) && (bot_cover_flags & BOT_COVER_MAINTS_OPEN)) - if(cell) - to_chat(user, span_warning("[src] already has a power cell!")) - return ITEM_INTERACT_BLOCKING - if(!user.transferItemToLoc(tool, src)) - return ITEM_INTERACT_BLOCKING - cell = tool - diag_hud_set_mulebotcell() - user.visible_message( - span_notice("[user] inserts \a [cell] into [src]."), - span_notice("You insert [cell] into [src]."), - ) - return ITEM_INTERACT_SUCCESS - if(is_wire_tool(tool) && (bot_cover_flags & BOT_COVER_MAINTS_OPEN)) - attack_hand(user) - return ITEM_INTERACT_SUCCESS - return ..() - -/mob/living/simple_animal/bot/mulebot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) - . = ..() - if(ismob(load) && prob(1 + attacking_item.force * 2)) - user.visible_message( - span_danger("[user] knocks [load] off [src] with \the [attacking_item]!"), - span_danger("You knock [load] off [src] with \the [attacking_item]!"), - ) - unload(0) - return TRUE - -/mob/living/simple_animal/bot/mulebot/emag_act(mob/user, obj/item/card/emag/emag_card) - if(!(bot_cover_flags & BOT_COVER_EMAGGED)) - bot_cover_flags |= BOT_COVER_EMAGGED - if(!(bot_cover_flags & BOT_COVER_MAINTS_OPEN)) - bot_cover_flags ^= BOT_COVER_LOCKED - balloon_alert(user, "controls [bot_cover_flags & BOT_COVER_LOCKED ? "locked" : "unlocked"]") - flick("[base_icon]-emagged", src) - playsound(src, SFX_SPARKS, 100, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) - return TRUE - -/mob/living/simple_animal/bot/mulebot/update_icon_state() //if you change the icon_state names, please make sure to update /datum/wires/mulebot/on_pulse() as well. <3 - . = ..() - icon_state = "[base_icon][(bot_mode_flags & BOT_MODE_ON) ? wires.is_cut(WIRE_AVOIDANCE) : 0]" - -/mob/living/simple_animal/bot/mulebot/update_overlays() - . = ..() - if(bot_cover_flags & BOT_COVER_MAINTS_OPEN) - . += "[base_icon]-hatch" - if(!load || ismob(load)) //mob offsets and such are handled by the riding component / buckling - return - var/mutable_appearance/load_overlay = mutable_appearance(load.icon, load.icon_state, layer + 0.01) - load_overlay.pixel_z = initial(load.pixel_z) + 11 - . += load_overlay - -/mob/living/simple_animal/bot/mulebot/ex_act(severity) - unload(0) - switch(severity) - if(EXPLODE_DEVASTATE) - qdel(src) - if(EXPLODE_HEAVY) - wires.cut_random() - wires.cut_random() - if(EXPLODE_LIGHT) - wires.cut_random() - - return TRUE - - -/mob/living/simple_animal/bot/mulebot/bullet_act(obj/projectile/proj) - . = ..() - if(. && !QDELETED(src)) //Got hit and not blown up yet. - if(prob(50) && !isnull(load)) - unload(0) - if(prob(25)) - visible_message(span_danger("Something shorts out inside [src]!")) - wires.cut_random(source = proj.firer) - -/mob/living/simple_animal/bot/mulebot/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Mule", name) - ui.open() - -/mob/living/simple_animal/bot/mulebot/ui_data(mob/user) - var/list/data = list() - data["powerStatus"] = bot_mode_flags & BOT_MODE_ON - data["locked"] = bot_cover_flags & BOT_COVER_LOCKED - data["siliconUser"] = HAS_SILICON_ACCESS(user) - data["mode"] = mode ? "[mode]" : "Ready" - data["modeStatus"] = "" - switch(mode) - if(BOT_IDLE, BOT_DELIVER, BOT_GO_HOME) - data["modeStatus"] = "good" - if(BOT_BLOCKED, BOT_NAV, BOT_WAIT_FOR_NAV) - data["modeStatus"] = "average" - if(BOT_NO_ROUTE) - data["modeStatus"] = "bad" - data["load"] = get_load_name() - data["destination"] = destination - data["homeDestination"] = home_destination - data["destinationsList"] = GLOB.deliverybeacontags - data["cellPercent"] = cell?.percent() - data["autoReturn"] = mulebot_delivery_flags & MULEBOT_RETURN_MODE - data["autoPickup"] = mulebot_delivery_flags & MULEBOT_AUTO_PICKUP_MODE - data["reportDelivery"] = mulebot_delivery_flags & MULEBOT_REPORT_DELIVERY_MODE - data["botId"] = id - data["allowPossession"] = bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT - data["possessionEnabled"] = can_be_possessed - data["paiInserted"] = !!paicard - return data - -/mob/living/simple_animal/bot/mulebot/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - var/mob/user = ui.user - if(. || (bot_cover_flags & BOT_COVER_LOCKED && !HAS_SILICON_ACCESS(user))) - return - - switch(action) - if("lock") - if(HAS_SILICON_ACCESS(user)) - bot_cover_flags ^= BOT_COVER_LOCKED - return TRUE - if("on") - if(bot_mode_flags & BOT_MODE_ON) - turn_off() - else if(bot_cover_flags & BOT_COVER_MAINTS_OPEN) - to_chat(user, span_warning("[name]'s maintenance panel is open!")) - return - else if(cell) - if(!turn_on()) - to_chat(user, span_warning("You can't switch on [src]!")) - return - return TRUE - else - bot_control(action, user, params) // Kill this later. // Kill PDAs in general please - return TRUE - -/mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, list/params = list(), pda = FALSE) - if(pda && wires.is_cut(WIRE_RX)) // MULE wireless is controlled by wires. - return - - switch(command) - if("stop") - if(mode != BOT_IDLE) - bot_reset() - if("go") - if(mode == BOT_IDLE) - start() - if("home") - if(mode == BOT_IDLE || mode == BOT_DELIVER) - start_home() - if("destination") - var/new_dest - if(pda) - new_dest = tgui_input_list(user, "Enter Destination", "Mulebot Settings", GLOB.deliverybeacontags, destination) - else - new_dest = params["value"] - if(new_dest) - set_destination(new_dest) - if("setid") - var/new_id = tgui_input_text(user, "Enter ID", "ID Assignment", id, max_length = MAX_NAME_LEN) - if(new_id) - set_id(new_id) - name = "\improper MULEbot [new_id]" - if("sethome") - var/new_home = tgui_input_list(user, "Enter Home", "Mulebot Settings", GLOB.deliverybeacontags, home_destination) - if(new_home) - home_destination = new_home - if("unload") - if(load && mode != BOT_HUNT) - if(loc == target) - unload(loaddir) - else - unload(0) - if("autoret") - mulebot_delivery_flags ^= MULEBOT_RETURN_MODE - if("autopick") - mulebot_delivery_flags ^= MULEBOT_AUTO_PICKUP_MODE - if("report") - mulebot_delivery_flags ^= MULEBOT_REPORT_DELIVERY_MODE - -/mob/living/simple_animal/bot/mulebot/proc/buzz(type) - switch(type) - if(SIGH) - audible_message(span_hear("[src] makes a sighing buzz.")) - playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) - if(ANNOYED) - audible_message(span_hear("[src] makes an annoyed buzzing sound.")) - playsound(src, 'sound/machines/buzz/buzz-two.ogg', 50, FALSE) - if(DELIGHT) - audible_message(span_hear("[src] makes a delighted ping!")) - playsound(src, 'sound/machines/ping.ogg', 50, FALSE) - if(CHIME) - audible_message(span_hear("[src] makes a chiming sound!")) - playsound(src, 'sound/machines/chime.ogg', 50, FALSE) - flick("[base_icon]1", src) - - -// mousedrop a crate to load the bot -// can load anything if hacked -/mob/living/simple_animal/bot/mulebot/mouse_drop_receive(atom/movable/AM, mob/user, params) - if(!isliving(user)) - return - - if(!istype(AM) || isdead(AM) || iseyemob(AM) || istype(AM, /obj/effect/dummy/phased_mob)) - return - - load(AM) - -// called to load a crate -/mob/living/simple_animal/bot/mulebot/proc/load(atom/movable/AM) - if(load || AM.anchored) - return - - if(!isturf(AM.loc)) //To prevent the loading from stuff from someone's inventory or screen icons. - return - - var/obj/structure/closet/crate/crate = AM - if(!istype(crate)) - if(!wires.is_cut(WIRE_LOADCHECK)) - buzz(SIGH) - return // if not hacked, only allow crates to be loaded - crate = null - - if(crate || isobj(AM)) - var/obj/O = AM - if(O.has_buckled_mobs() || (locate(/mob) in AM)) //can't load non crates objects with mobs buckled to it or inside it. - buzz(SIGH) - return - - if(crate) - crate.close() //make sure the crate is closed - - O.forceMove(src) - - else if(isliving(AM)) - if(!load_mob(AM)) //forceMove() is handled in buckling - return - - load = AM - mode = BOT_IDLE - update_appearance() - -///resolves the name to display for the loaded mob. primarily needed for the paranormal subtype since we don't want to show the name of ghosts riding it. -/mob/living/simple_animal/bot/mulebot/proc/get_load_name() - return load ? load.name : null - -/mob/living/simple_animal/bot/mulebot/proc/load_mob(mob/living/M) - can_buckle = TRUE - if(buckle_mob(M)) - passenger = M - load = M - can_buckle = FALSE - return TRUE - -/mob/living/simple_animal/bot/mulebot/post_unbuckle_mob(mob/living/M) - load = null - return ..() - -// called to unload the bot -// argument is optional direction to unload -// if zero, unload at bot's location -/mob/living/simple_animal/bot/mulebot/proc/unload(dirn) - if(QDELETED(load)) - if(load) //if our thing was qdel'd, there's likely a leftover reference. just clear it and remove the overlay. we'll let the bot keep moving around to prevent it abruptly stopping somewhere. - load = null - update_appearance() - return - - mode = BOT_IDLE - - var/atom/movable/cached_load = load //cache the load since unbuckling mobs clears the var. - - unbuckle_all_mobs() - - if(load) //don't have to do any of this for mobs. - load = null - cached_load.forceMove(loc) - cached_load.pixel_y = initial(cached_load.pixel_y) - cached_load.layer = initial(cached_load.layer) - SET_PLANE_EXPLICIT(cached_load, initial(cached_load.plane), src) - - if(dirn) //move the thing to the delivery point. - cached_load.Move(get_step(loc,dirn), dirn) - - update_appearance() - -/mob/living/simple_animal/bot/mulebot/get_status_tab_items() - . = ..() - if(cell) - . += "Charge Left: [cell.charge]/[cell.maxcharge]" - else - . += "No Cell Inserted!" - if(load) - . += "Current Load: [get_load_name()]" - - -/mob/living/simple_animal/bot/mulebot/call_bot() - ..() - if(path && length(path)) - target = ai_waypoint //Target is the end point of the path, the waypoint set by the AI. - destination = get_area_name(target, TRUE) - pathset = TRUE //Indicates the AI's custom path is initialized. - start() - -/mob/living/simple_animal/bot/mulebot/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - if(has_gravity()) - for(var/mob/living/carbon/human/future_pancake in loc) - if(future_pancake.body_position == LYING_DOWN) - run_over(future_pancake) - - diag_hud_set_mulebotcell() - -/mob/living/simple_animal/bot/mulebot/handle_automated_action() - if(!(bot_mode_flags & BOT_MODE_ON)) - return - if(!has_power()) - turn_off() - return - if(mode == BOT_IDLE) - return - if(HAS_TRAIT(src, TRAIT_IMMOBILIZED)) - return - - var/speed = (wires.is_cut(WIRE_MOTOR1) ? 0 : 2) + (wires.is_cut(WIRE_MOTOR2) ? 0 : 1) - if(!speed)//Devide by zero man bad - return - num_steps = round(10/speed) //10, 5, or 3 steps, depending on how many wires we have cut - START_PROCESSING(SSfastprocess, src) - -/mob/living/simple_animal/bot/mulebot/process() - if(!(bot_mode_flags & BOT_MODE_ON) || client || (num_steps <= 0) || !has_power()) - return PROCESS_KILL - num_steps-- - - switch(mode) - if(BOT_IDLE) // idle - return - - if(BOT_DELIVER, BOT_GO_HOME, BOT_BLOCKED) // navigating to deliver,home, or blocked - if(loc == target) // reached target - at_target() - return - - else if(length(path) && target) // valid path - var/turf/next = path[1] - reached_target = FALSE - if(next == loc) - path -= next - return - if(isturf(next)) - if(SEND_SIGNAL(src, COMSIG_MOB_BOT_PRE_STEP) & COMPONENT_MOB_BOT_BLOCK_PRE_STEP) - return - var/oldloc = loc - var/moved = step_towards(src, next) // attempt to move - if(moved && oldloc != loc) // successful move - SEND_SIGNAL(src, COMSIG_MOB_BOT_STEP) - blockcount = 0 - path -= loc - if(destination == home_destination) - mode = BOT_GO_HOME - else - mode = BOT_DELIVER - - else // failed to move - - blockcount++ - mode = BOT_BLOCKED - if(blockcount == 3) - buzz(ANNOYED) - - if(blockcount > 10) // attempt 10 times before recomputing - // find new path excluding blocked turf - buzz(SIGH) - mode = BOT_WAIT_FOR_NAV - blockcount = 0 - addtimer(CALLBACK(src, PROC_REF(process_blocked), next), 2 SECONDS) - return - return - else - buzz(ANNOYED) - mode = BOT_NAV - return - else - mode = BOT_NAV - return - - if(BOT_NAV) // calculate new path - mode = BOT_WAIT_FOR_NAV - INVOKE_ASYNC(src, PROC_REF(process_nav)) - -/mob/living/simple_animal/bot/mulebot/proc/process_blocked(turf/next) - calc_path(avoid=next) - if(length(path)) - buzz(DELIGHT) - mode = BOT_BLOCKED - -/mob/living/simple_animal/bot/mulebot/proc/process_nav() - calc_path() - - if(length(path)) - blockcount = 0 - mode = BOT_BLOCKED - buzz(DELIGHT) - - else - buzz(SIGH) - - mode = BOT_NO_ROUTE - -// calculates a path to the current destination -// given an optional turf to avoid -/mob/living/simple_animal/bot/mulebot/calc_path(turf/avoid = null) - path = get_path_to(src, target, max_distance=250, access=access_card.GetAccess(), exclude=avoid, diagonal_handling=DIAGONAL_REMOVE_ALL) - -// sets the current destination -// signals all beacons matching the delivery code -// beacons will return a signal giving their locations -/mob/living/simple_animal/bot/mulebot/proc/set_destination(new_dest) - new_destination = new_dest - get_nav() - -// starts bot moving to current destination -/mob/living/simple_animal/bot/mulebot/proc/start() - if(!(bot_mode_flags & BOT_MODE_ON)) - return - if(destination == home_destination) - mode = BOT_GO_HOME - else - mode = BOT_DELIVER - get_nav() - -// starts bot moving to home -// sends a beacon query to find -/mob/living/simple_animal/bot/mulebot/proc/start_home() - if(!(bot_mode_flags & BOT_MODE_ON)) - return - INVOKE_ASYNC(src, PROC_REF(do_start_home)) - -/mob/living/simple_animal/bot/mulebot/proc/do_start_home() - set_destination(home_destination) - mode = BOT_BLOCKED - -// called when bot reaches current target -/mob/living/simple_animal/bot/mulebot/proc/at_target() - if(!reached_target) - radio_channel = RADIO_CHANNEL_SUPPLY //Supply channel - buzz(CHIME) - reached_target = TRUE - - if(pathset) //The AI called us here, so notify it of our arrival. - loaddir = dir //The MULE will attempt to load a crate in whatever direction the MULE is "facing". - if(calling_ai) - to_chat(calling_ai, span_notice("[icon2html(src, calling_ai)] [src] wirelessly plays a chiming sound!")) - calling_ai.playsound_local(calling_ai, 'sound/machines/chime.ogg', 40, FALSE) - calling_ai = null - radio_channel = RADIO_CHANNEL_AI_PRIVATE //Report on AI Private instead if the AI is controlling us. - - if(load) // if loaded, unload at target - if(mulebot_delivery_flags & MULEBOT_REPORT_DELIVERY_MODE) - speak("Destination [RUNECHAT_BOLD("[destination]")] reached. Unloading [load].",radio_channel) - unload(loaddir) - else - // not loaded - if(mulebot_delivery_flags & MULEBOT_AUTO_PICKUP_MODE) // find a crate - var/atom/movable/AM - if(wires.is_cut(WIRE_LOADCHECK)) // if hacked, load first unanchored thing we find - for(var/atom/movable/A in get_step(loc, loaddir)) - if(!A.anchored) - AM = A - break - else // otherwise, look for crates only - AM = locate(/obj/structure/closet/crate) in get_step(loc,loaddir) - if(AM?.Adjacent(src)) - load(AM) - if(mulebot_delivery_flags & MULEBOT_REPORT_DELIVERY_MODE) - speak("Now loading [load] at [RUNECHAT_BOLD("[get_area_name(src)]")].", radio_channel) - // whatever happened, check to see if we return home - - if((mulebot_delivery_flags & MULEBOT_RETURN_MODE) && home_destination && destination != home_destination) - // auto return set and not at home already - start_home() - mode = BOT_BLOCKED - else - bot_reset() // otherwise go idle - - -/mob/living/simple_animal/bot/mulebot/MobBump(mob/M) // called when the bot bumps into a mob - if(mind || !isliving(M)) //if there's a sentience controlling the bot, they aren't allowed to harm folks. - return ..() - var/mob/living/L = M - if(wires.is_cut(WIRE_AVOIDANCE)) // usually just bumps, but if the avoidance wire is cut, knocks them over. - if(iscyborg(L)) - visible_message(span_danger("[src] bumps into [L]!")) - else if(L.Knockdown(8 SECONDS)) - log_combat(src, L, "knocked down") - visible_message(span_danger("[src] knocks over [L]!")) - return ..() - -// when mulebot is in the same loc -/mob/living/simple_animal/bot/mulebot/proc/run_over(mob/living/carbon/human/crushed) - if (!(bot_cover_flags & BOT_COVER_EMAGGED) && !wires.is_cut(WIRE_AVOIDANCE)) - if (!has_status_effect(/datum/status_effect/careful_driving)) - crushed.visible_message(span_notice("[src] slows down to avoid crushing [crushed].")) - apply_status_effect(/datum/status_effect/careful_driving) - return // Player mules must be emagged before they can trample - - log_combat(src, crushed, "run over", addition = "(DAMTYPE: [uppertext(BRUTE)])") - crushed.visible_message( - span_danger("[src] drives over [crushed]!"), - span_userdanger("[src] drives over you!"), - ) - - playsound(src, 'sound/effects/splat.ogg', 50, TRUE) - - var/damage = rand(5, 15) - crushed.apply_damage(2 * damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, MELEE)) - crushed.apply_damage(2 * damage, BRUTE, BODY_ZONE_CHEST, run_armor_check(BODY_ZONE_CHEST, MELEE)) - crushed.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_L_LEG, run_armor_check(BODY_ZONE_L_LEG, MELEE)) - crushed.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_R_LEG, run_armor_check(BODY_ZONE_R_LEG, MELEE)) - crushed.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_L_ARM, run_armor_check(BODY_ZONE_L_ARM, MELEE)) - crushed.apply_damage(0.5 * damage, BRUTE, BODY_ZONE_R_ARM, run_armor_check(BODY_ZONE_R_ARM, MELEE)) - - add_mob_blood(crushed) - - var/turf/below_us = get_turf(src) - below_us.add_mob_blood(crushed) - - AddComponent(/datum/component/blood_walk, \ - blood_type = /obj/effect/decal/cleanable/blood/tracks, \ - target_dir_change = TRUE, \ - transfer_blood_dna = TRUE, \ - max_blood = 4) - -// player on mulebot attempted to move -/mob/living/simple_animal/bot/mulebot/relaymove(mob/living/user, direction) - if(user.incapacitated) - return - if(load == user) - unload(0) - - -//Update navigation data. Called when commanded to deliver, return home, or a route update is needed... -/mob/living/simple_animal/bot/mulebot/proc/get_nav() - if(!(bot_mode_flags & BOT_MODE_ON) || wires.is_cut(WIRE_BEACON)) - return - - for(var/obj/machinery/navbeacon/NB in GLOB.deliverybeacons) - if(NB.location == new_destination) // if the beacon location matches the set destination - // the we will navigate there - destination = new_destination - target = NB.loc - var/direction = NB.codes[NAVBEACON_DELIVERY_DIRECTION] // this will be the load/unload dir - if(!direction) - direction = NB.dir // fallback - if(direction) - loaddir = text2num(direction) - else - loaddir = 0 - if(destination) // No need to calculate a path if you do not have a destination set! - calc_path() - -/mob/living/simple_animal/bot/mulebot/emp_act(severity) - . = ..() - if(cell && !(. & EMP_PROTECT_CONTENTS)) - cell.emp_act(severity) - if(load) - load.emp_act(severity) - - -/mob/living/simple_animal/bot/mulebot/explode() - var/atom/Tsec = drop_location() - - new /obj/item/assembly/prox_sensor(Tsec) - new /obj/item/stack/rods(Tsec) - new /obj/item/stack/rods(Tsec) - new /obj/item/stack/cable_coil/cut(Tsec) - if(cell) - cell.forceMove(Tsec) - cell = null - - new /obj/effect/decal/cleanable/blood/oil(loc) - return ..() - -/mob/living/simple_animal/bot/mulebot/remove_air(amount) //To prevent riders suffocating - return loc ? loc.remove_air(amount) : null - -/mob/living/simple_animal/bot/mulebot/execute_resist() - . = ..() - if(load) - unload() - -/mob/living/simple_animal/bot/mulebot/UnarmedAttack(atom/A, proximity_flag, list/modifiers) - if(!can_unarmed_attack()) - return - if(isturf(A) && isturf(loc) && loc.Adjacent(A) && load) - unload(get_dir(loc, A)) - else - return ..() - -/// Checks whether the bot can complete a step_towards, checking whether the bot is on and has the charge to do the move. Returns COMPONENT_MOB_BOT_CANCELSTEP if the bot should not step. -/mob/living/simple_animal/bot/mulebot/proc/check_pre_step(datum/source) - SIGNAL_HANDLER - - if(!(bot_mode_flags & BOT_MODE_ON)) - return COMPONENT_MOB_BOT_BLOCK_PRE_STEP - - if((cell && (cell.charge < cell_move_power_usage)) || !has_power()) - turn_off() - return COMPONENT_MOB_BOT_BLOCK_PRE_STEP - -/// Uses power from the cell when the bot steps. -/mob/living/simple_animal/bot/mulebot/proc/on_bot_step(datum/source) - SIGNAL_HANDLER - - cell?.use(cell_move_power_usage) - -/mob/living/simple_animal/bot/mulebot/post_possession() - . = ..() - visible_message(span_notice("[src]'s safeties are locked on.")) - -/mob/living/simple_animal/bot/mulebot/paranormal//allows ghosts only unless hacked to actually be useful - name = "\improper GHOULbot" - desc = "A rather ghastly looking... Multiple Utility Load Effector bot? It only seems to accept paranormal forces, and for this reason is fucking useless." - icon_state = "paranormalmulebot0" - base_icon = "paranormalmulebot" - -/mob/living/simple_animal/bot/mulebot/paranormal/mouse_drop_receive(atom/movable/AM, mob/user, params) - var/mob/living/L = user - - if(user.incapacitated || (istype(L) && L.body_position == LYING_DOWN)) - return - - if(!istype(AM) || iseyemob(AM) || istype(AM, /obj/effect/dummy/phased_mob)) //allows ghosts! - return - - load(AM) - -/mob/living/simple_animal/bot/mulebot/paranormal/load(atom/movable/movable_atom) - if(load || movable_atom.anchored) - return - - if(!isturf(movable_atom.loc)) //To prevent the loading from stuff from someone's inventory or screen icons. - return - - if(isobserver(movable_atom)) - visible_message(span_warning("A ghostly figure appears on [src]!")) - movable_atom.forceMove(src) - RegisterSignal(movable_atom, COMSIG_MOVABLE_MOVED, PROC_REF(ghostmoved)) - - else if(!wires.is_cut(WIRE_LOADCHECK)) - buzz(SIGH) - return // if not hacked, only allow ghosts to be loaded - - else if(isobj(movable_atom)) - if(movable_atom.has_buckled_mobs() || (locate(/mob) in movable_atom)) //can't load non crates objects with mobs buckled to it or inside it. - buzz(SIGH) - return - - if(istype(movable_atom, /obj/structure/closet/crate)) - var/obj/structure/closet/crate/crate = movable_atom - crate.close() //make sure it's closed - - movable_atom.forceMove(src) - - else if(isliving(movable_atom) && !load_mob(movable_atom)) - return - - load = movable_atom - mode = BOT_IDLE - update_appearance() - -/mob/living/simple_animal/bot/mulebot/paranormal/update_overlays() - . = ..() - if(!isobserver(load)) - return - var/mutable_appearance/ghost_overlay = mutable_appearance('icons/mob/simple/mob.dmi', "ghost", layer + 0.01) //use a generic ghost icon, otherwise you can metagame who's dead if they have a custom ghost set - ghost_overlay.pixel_z = 12 - . += ghost_overlay - -/mob/living/simple_animal/bot/mulebot/paranormal/get_load_name() //Don't reveal the name of ghosts so we can't metagame who died and all that. - . = ..() - if(. && isobserver(load)) - return "Unknown" - -/mob/living/simple_animal/bot/mulebot/paranormal/proc/ghostmoved() - SIGNAL_HANDLER - visible_message(span_notice("The ghostly figure vanishes...")) - UnregisterSignal(load, COMSIG_MOVABLE_MOVED) - unload(0) - -#undef SIGH -#undef ANNOYED -#undef DELIGHT -#undef CHIME diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm index 04df80eb540..1f530e8904d 100644 --- a/code/modules/mod/modules/modules_ninja.dm +++ b/code/modules/mod/modules/modules_ninja.dm @@ -547,7 +547,7 @@ return COMPONENT_CANCEL_ATTACK_CHAIN //BOTS, overloads them and causes a explosion -/mob/living/simple_animal/bot/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) +/mob/living/basic/bot/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) to_chat(src, span_boldwarning("Your circutry suddenly begins heating up!")) if(!do_after(ninja, 1.5 SECONDS, target = src, hidden = TRUE)) return COMPONENT_CANCEL_ATTACK_CHAIN diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm index 1176ce92114..f7278fa3008 100644 --- a/code/modules/modular_computers/file_system/programs/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm @@ -32,32 +32,32 @@ botcount = 0 - for(var/mob/living/simple_animal/bot/simple_bot as anything in GLOB.bots_list) - if(!is_valid_z_level(current_turf, get_turf(simple_bot)) || !(simple_bot.bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) //Only non-emagged bots on the same Z-level are detected! + for(var/mob/living/basic/bot/basic_bot as anything in GLOB.bots_list) + if(!is_valid_z_level(current_turf, get_turf(basic_bot)) || !(basic_bot.bot_mode_flags & BOT_MODE_REMOTE_ENABLED)) //Only non-emagged bots on the same Z-level are detected! continue - if(!simple_bot.allowed(user) && !simple_bot.check_access(computer.stored_id)) // Only check Bots we can access + if(!basic_bot.allowed(user) && !basic_bot.check_access(computer.stored_id)) // Only check Bots we can access continue var/list/newbot = list( - "name" = simple_bot.name, - "mode" = simple_bot.get_mode_ui(), - "model" = simple_bot.bot_type, - "locat" = get_area(simple_bot), - "bot_ref" = REF(simple_bot), + "name" = basic_bot.name, + "mode" = basic_bot.get_mode_ui(), + "model" = basic_bot.bot_type, + "locat" = get_area(basic_bot), + "bot_ref" = REF(basic_bot), "mule_check" = FALSE, ) - if(simple_bot.bot_type == MULE_BOT) - var/mob/living/simple_animal/bot/mulebot/simple_mulebot = simple_bot + if(basic_bot.bot_type == MULE_BOT) + var/mob/living/basic/bot/mulebot/basic_mulebot = basic_bot mulelist += list(list( - "name" = simple_mulebot.name, - "id" = simple_mulebot.id, - "dest" = simple_mulebot.destination, - "power" = simple_mulebot.cell ? simple_mulebot.cell.percent() : 0, - "home" = simple_mulebot.home_destination, - "autoReturn" = simple_mulebot.mulebot_delivery_flags & MULEBOT_RETURN_MODE, - "autoPickup" = simple_mulebot.mulebot_delivery_flags & MULEBOT_AUTO_PICKUP_MODE, - "reportDelivery" = simple_mulebot.mulebot_delivery_flags & MULEBOT_REPORT_DELIVERY_MODE, - "mule_ref" = REF(simple_mulebot), - "load" = simple_mulebot.get_load_name(), + "name" = basic_mulebot.name, + "id" = basic_mulebot.id, + "dest" = basic_mulebot.ai_controller.blackboard[BB_MULEBOT_DESTINATION_BEACON], + "power" = basic_mulebot.cell ? basic_mulebot.cell.percent() : 0, + "home" = basic_mulebot.ai_controller.blackboard[BB_MULEBOT_HOME_BEACON], + "autoReturn" = basic_mulebot.mulebot_delivery_flags & MULEBOT_RETURN_MODE, + "autoPickup" = basic_mulebot.mulebot_delivery_flags & MULEBOT_AUTO_PICKUP_MODE, + "reportDelivery" = basic_mulebot.mulebot_delivery_flags & MULEBOT_REPORT_DELIVERY_MODE, + "mule_ref" = REF(basic_mulebot), + "load" = basic_mulebot.get_load_name(), )) newbot["mule_check"] = TRUE botlist += list(newbot) @@ -106,15 +106,15 @@ "report", "ejectpai", ) - var/mob/living/simple_animal/bot/simple_bot = locate(params["robot"]) in GLOB.bots_list + var/mob/living/basic/bot/basic_bot = locate(params["robot"]) in GLOB.bots_list if (action in standard_actions) - simple_bot.bot_control(action, current_user, id_card?.GetAccess()) + basic_bot.bot_control(action, current_user, id_card?.GetAccess()) if (action in MULE_actions) - simple_bot.bot_control(action, current_user, id_card?.GetAccess(), TRUE) + basic_bot.bot_control(action, current_user, id_card?.GetAccess(), TRUE) switch(action) if("summon") - simple_bot.bot_control(action, current_user, id_card ? id_card.access : id_card?.GetAccess()) + basic_bot.bot_control(action, current_user, id_card ? id_card.access : id_card?.GetAccess()) if("ejectcard") if(!computer || !computer.stored_id) return diff --git a/code/modules/spells/spell_types/shapeshift/_shapeshift.dm b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm index 7ecd0e6b852..c9b84527ebf 100644 --- a/code/modules/spells/spell_types/shapeshift/_shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm @@ -165,9 +165,9 @@ new_shape.add_traits(list(TRAIT_DONT_WRITE_MEMORY, TRAIT_SHAPESHIFTED), SHAPESHIFT_TRAIT) // Make sure that if you shapechanged into a bot, the AI can't just turn you off. - var/mob/living/simple_animal/bot/polymorph_bot = new_shape + var/mob/living/basic/bot/polymorph_bot = new_shape if (istype(polymorph_bot)) - polymorph_bot.bot_cover_flags |= BOT_COVER_EMAGGED + polymorph_bot.bot_access_flags |= BOT_COVER_EMAGGED polymorph_bot.bot_mode_flags &= ~BOT_MODE_REMOTE_ENABLED return new_shape diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index 5b1794ef33b..dae3132b706 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -5,9 +5,6 @@ // Use the new basic mobs system instead. // If you are refactoring a simple_animal, REMOVE it from this list var/list/allowed_types = list( - /mob/living/simple_animal/bot, - /mob/living/simple_animal/bot/mulebot, - /mob/living/simple_animal/bot/mulebot/paranormal, /mob/living/simple_animal/hostile, /mob/living/simple_animal/hostile/asteroid, /mob/living/simple_animal/hostile/asteroid/elite, diff --git a/tgstation.dme b/tgstation.dme index afa90adb47e..e17c81ab8be 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5260,6 +5260,14 @@ #include "code\modules\mob\living\basic\bots\hygienebot\hygienebot_ai.dm" #include "code\modules\mob\living\basic\bots\medbot\medbot.dm" #include "code\modules\mob\living\basic\bots\medbot\medbot_ai.dm" +#include "code\modules\mob\living\basic\bots\mulebot\mulebot.dm" +#include "code\modules\mob\living\basic\bots\mulebot\mulebot_ai.dm" +#include "code\modules\mob\living\basic\bots\mulebot\mulebot_control.dm" +#include "code\modules\mob\living\basic\bots\mulebot\mulebot_delivery.dm" +#include "code\modules\mob\living\basic\bots\mulebot\mulebot_hud.dm" +#include "code\modules\mob\living\basic\bots\mulebot\mulebot_movement.dm" +#include "code\modules\mob\living\basic\bots\mulebot\mulebot_paranormal.dm" +#include "code\modules\mob\living\basic\bots\mulebot\mulebot_tool_interactions.dm" #include "code\modules\mob\living\basic\bots\repairbot\repairbot.dm" #include "code\modules\mob\living\basic\bots\repairbot\repairbot_abilities.dm" #include "code\modules\mob\living\basic\bots\repairbot\repairbot_ai.dm" @@ -5746,10 +5754,8 @@ #include "code\modules\mob\living\simple_animal\animal_defense.dm" #include "code\modules\mob\living\simple_animal\damage_procs.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" -#include "code\modules\mob\living\simple_animal\bot\bot.dm" #include "code\modules\mob\living\simple_animal\bot\bot_announcement.dm" #include "code\modules\mob\living\simple_animal\bot\construction.dm" -#include "code\modules\mob\living\simple_animal\bot\mulebot.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" #include "code\modules\mob\living\simple_animal\hostile\ooze.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\_megafauna.dm" diff --git a/tools/UpdatePaths/Scripts/96500_mulebots.txt b/tools/UpdatePaths/Scripts/96500_mulebots.txt new file mode 100644 index 00000000000..1393f74f32a --- /dev/null +++ b/tools/UpdatePaths/Scripts/96500_mulebots.txt @@ -0,0 +1,2 @@ +/mob/living/simple_animal/bot/mulebot : /mob/living/basic/bot/mulebot{@OLD} +/mob/living/simple_animal/bot/mulebot/paranormal : /mob/living/basic/bot/mulebot/paranormal{@OLD} \ No newline at end of file From 2f65975569203134d3f1ce9888fe3f79adfd3bae Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 06:58:36 +0000 Subject: [PATCH 025/126] Automatic changelog for PR #95899 [ci skip] --- html/changelogs/AutoChangeLog-pr-95899.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-95899.yml diff --git a/html/changelogs/AutoChangeLog-pr-95899.yml b/html/changelogs/AutoChangeLog-pr-95899.yml new file mode 100644 index 00000000000..768c1277b48 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-95899.yml @@ -0,0 +1,4 @@ +author: "Profakos (originally pulled from their branch, did massive chunk of this), Ben10omintrix" +delete-after: True +changes: + - refactor: "mulebots have been refactored. please report any bugs" \ No newline at end of file From d9e687b5d3521b675bf81e714292794d25e5270c Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 12:00:24 +0000 Subject: [PATCH 026/126] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-95899.yml | 4 ---- html/changelogs/archive/2026-06.yml | 2 ++ 2 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-95899.yml diff --git a/html/changelogs/AutoChangeLog-pr-95899.yml b/html/changelogs/AutoChangeLog-pr-95899.yml deleted file mode 100644 index 768c1277b48..00000000000 --- a/html/changelogs/AutoChangeLog-pr-95899.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Profakos (originally pulled from their branch, did massive chunk of this), Ben10omintrix" -delete-after: True -changes: - - refactor: "mulebots have been refactored. please report any bugs" \ No newline at end of file diff --git a/html/changelogs/archive/2026-06.yml b/html/changelogs/archive/2026-06.yml index 387d47064a3..22ece16294a 100644 --- a/html/changelogs/archive/2026-06.yml +++ b/html/changelogs/archive/2026-06.yml @@ -304,6 +304,8 @@ know who's praying unless told, though he can tell if they're naughty. Hatterhat: - spellcheck: Butterbean plants are now capitalized properly when planted. + Profakos (originally pulled from their branch, did massive chunk of this), Ben10omintrix: + - refactor: mulebots have been refactored. please report any bugs TymSha: - qol: Ooze mobs from cytology now have the same type of HUD as other mobs, allowing them to see their health From d9ef40604c52b3dcbf54446487b6b5b001f3d833 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Fri, 12 Jun 2026 20:10:11 +0200 Subject: [PATCH 027/126] Fixes broken area overlays for particle weather (and speeds up fadeout animation) (#96450) ## About The Pull Request Missing END_STAGE check caused mask overlays to remain when the weather ended and bleed through the blackness if you did not have mesons equipped (which i did during testing, and did not spot the issue. Oops) ## Changelog :cl: fix: Fixed broken area overlays for particle weather /:cl: --- code/datums/weather/particle_weather.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/datums/weather/particle_weather.dm b/code/datums/weather/particle_weather.dm index b8e1a5ac3fe..7ac48e4ae36 100644 --- a/code/datums/weather/particle_weather.dm +++ b/code/datums/weather/particle_weather.dm @@ -85,7 +85,7 @@ new_severity = clamp(new_severity, min(new_severity, min_severity), max_severity) if (WIND_DOWN_STAGE) // Slowly goes down to zero - new_severity += rand() * -severity_variation * (severity / min_severity) + new_severity += rand() * -severity_variation * 4 * max(severity / min_severity, 1) animate_severity(new_severity) @@ -101,6 +101,9 @@ /datum/weather/particle/generate_overlay_cache() . = ..() + if (stage == END_STAGE) + return + for (var/offset in 0 to SSmapping.max_plane_offset) . += mutable_appearance('icons/effects/weather_overlay.dmi', "weather_overlay", overlay_layer, null, WEATHER_MASK_PLANE, offset_const = offset) From 73d397a6e34461984d8d5f31c37944a1fde45f14 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 18:10:32 +0000 Subject: [PATCH 028/126] Automatic changelog for PR #96450 [ci skip] --- html/changelogs/AutoChangeLog-pr-96450.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96450.yml diff --git a/html/changelogs/AutoChangeLog-pr-96450.yml b/html/changelogs/AutoChangeLog-pr-96450.yml new file mode 100644 index 00000000000..ac559324f29 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96450.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Fixed broken area overlays for particle weather" \ No newline at end of file From c5afc0e3013a2793ff9c88f1cf244fc7253eb533 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 18:15:19 +0000 Subject: [PATCH 029/126] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-96450.yml | 4 ---- html/changelogs/archive/2026-06.yml | 2 ++ 2 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-96450.yml diff --git a/html/changelogs/AutoChangeLog-pr-96450.yml b/html/changelogs/AutoChangeLog-pr-96450.yml deleted file mode 100644 index ac559324f29..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96450.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Fixed broken area overlays for particle weather" \ No newline at end of file diff --git a/html/changelogs/archive/2026-06.yml b/html/changelogs/archive/2026-06.yml index 22ece16294a..0c330fca3a4 100644 --- a/html/changelogs/archive/2026-06.yml +++ b/html/changelogs/archive/2026-06.yml @@ -306,6 +306,8 @@ - spellcheck: Butterbean plants are now capitalized properly when planted. Profakos (originally pulled from their branch, did massive chunk of this), Ben10omintrix: - refactor: mulebots have been refactored. please report any bugs + SmArtKar: + - bugfix: Fixed broken area overlays for particle weather TymSha: - qol: Ooze mobs from cytology now have the same type of HUD as other mobs, allowing them to see their health From ae90af1a60014ea7bd06e0341dfeee5f6f500d63 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:05:26 +0200 Subject: [PATCH 030/126] Changes tendril regeneration outlinefrom bright green to maroon red (#96449) --- code/modules/mob/living/basic/lavaland/tendril/tendril.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/basic/lavaland/tendril/tendril.dm b/code/modules/mob/living/basic/lavaland/tendril/tendril.dm index 5167982defc..de6253135fd 100644 --- a/code/modules/mob/living/basic/lavaland/tendril/tendril.dm +++ b/code/modules/mob/living/basic/lavaland/tendril/tendril.dm @@ -52,7 +52,7 @@ GLOBAL_LIST_INIT(tendrils, list()) AddComponent(/datum/component/ai_target_timer) AddComponent(/datum/component/gps, "Eerie Signal") AddComponent(/datum/component/basic_mob_attack_telegraph, display_telegraph_overlay = FALSE, telegraph_duration = 0.4 SECONDS) - AddComponent(/datum/component/regenerator, regeneration_delay = 30 SECONDS, brute_per_second = 20) + AddComponent(/datum/component/regenerator, regeneration_delay = 30 SECONDS, brute_per_second = 20, outline_colour = COLOR_CULT_RED) add_traits(list(TRAIT_BACKSTAB_IMMUNE, TRAIT_IMMOBILIZED), INNATE_TRAIT) var/static/list/abilities = list( From 9f57ec6845839ea257de91a353b88af8953d642c Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 20:05:50 +0000 Subject: [PATCH 031/126] Automatic changelog for PR #96449 [ci skip] --- html/changelogs/AutoChangeLog-pr-96449.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96449.yml diff --git a/html/changelogs/AutoChangeLog-pr-96449.yml b/html/changelogs/AutoChangeLog-pr-96449.yml new file mode 100644 index 00000000000..1deda5c03bd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96449.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - image: "Changed tendril regeneration outlinefrom bright green to maroon red" \ No newline at end of file From 0b6a8e8f7f2db24b38c6a80844f3402769845f89 Mon Sep 17 00:00:00 2001 From: Arturlang <24881678+Arturlang@users.noreply.github.com> Date: Fri, 12 Jun 2026 23:17:08 +0300 Subject: [PATCH 032/126] animates beam effects (#96339) --- code/datums/beam.dm | 299 ++++++++++++++++++---- code/datums/status_effects/cuffed_item.dm | 4 +- code/modules/assembly/infrared.dm | 29 +-- 3 files changed, 263 insertions(+), 69 deletions(-) diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 9d5e7b6c35d..b3debf2de38 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -32,6 +32,8 @@ var/beam_color ///If we use an emissive appearance var/emissive = TRUE + /// If FALSE, redraws snap per update instead of using animate() interpolation. + var/animate = TRUE /// If set will be used instead of origin's pixel_x in offset calculations var/override_origin_pixel_x = null /// If set will be used instead of origin's pixel_y in offset calculations @@ -42,6 +44,34 @@ var/override_target_pixel_y = null ///the layer of our beam var/beam_layer + ///Whether we have a cached last-drawn geometry from a previous Draw(). + var/last_draw_valid = FALSE + ///Last drawn origin tile/pixel coordinates (used as the "from" frame for animated redraws). + var/last_origin_x = 0 + var/last_origin_y = 0 + var/last_origin_px = 0 + var/last_origin_py = 0 + ///Last drawn target tile/pixel coordinates. + var/last_target_x = 0 + var/last_target_y = 0 + var/last_target_px = 0 + var/last_target_py = 0 + ///Animate time queued for the pending redraw. We take the largest (slowest glide) of any movers that triggered the redraw. + var/pending_animate_time = 0 + ///Last animation's "from" (where segments were seeded at draw time) — origin endpoint. + var/anim_from_origin_x = 0 + var/anim_from_origin_y = 0 + var/anim_from_origin_px = 0 + var/anim_from_origin_py = 0 + ///Last animation's "from" — target endpoint. + var/anim_from_target_x = 0 + var/anim_from_target_y = 0 + var/anim_from_target_px = 0 + var/anim_from_target_py = 0 + ///world.time at which the last animation began. Combined with anim_duration to estimate segments' current visual position mid-animation. + var/anim_start_time = 0 + ///Duration of the last animation, in deciseconds (matches the time= passed to animate()). + var/anim_duration = 0 /datum/beam/New( origin, @@ -53,6 +83,7 @@ beam_type = /obj/effect/ebeam, beam_color = null, emissive = TRUE, + animate = TRUE, override_origin_pixel_x = null, override_origin_pixel_y = null, override_target_pixel_x = null, @@ -67,6 +98,7 @@ src.beam_type = beam_type src.beam_color = beam_color src.emissive = emissive + src.animate = animate src.override_origin_pixel_x = override_origin_pixel_x src.override_origin_pixel_y = override_origin_pixel_y src.override_target_pixel_x = override_target_pixel_x @@ -97,11 +129,59 @@ SIGNAL_HANDLER if(QDELING(src)) return - if(!QDELETED(origin) && !QDELETED(target) && get_dist(origin,target)= max_distance || origin.z != target.z) qdel(src) + return + var/queued_time = 0 + if(animate && istype(mover)) + queued_time = ICON_SIZE_ALL / max(mover.glide_size, MIN_GLIDE_SIZE) * world.tick_lag + if(queued_time > pending_animate_time) + pending_animate_time = queued_time + // Synchronous: deferring via INVOKE_ASYNC would start animate() one render frame after the mob's + // BYOND-managed glide, making the beam trail. Draw() doesn't sleep, so calling it here is safe. + Draw() + +/** Returns the last drawn endpoints for reuse by inherit_glide(), or null if undrawn. */ +/datum/beam/proc/get_last_geometry() + if(!last_draw_valid) + return null + return list( + "origin_x" = last_origin_x, + "origin_y" = last_origin_y, + "origin_px" = last_origin_px, + "origin_py" = last_origin_py, + "target_x" = last_target_x, + "target_y" = last_target_y, + "target_px" = last_target_px, + "target_py" = last_target_py, + ) + +/** Seeds the next Draw() from saved geometry so rebuilt beams glide instead of snapping. */ +/datum/beam/proc/inherit_glide(list/geometry, animate_time) + if(!geometry || animate_time <= 0) + return + last_origin_x = geometry["origin_x"] + last_origin_y = geometry["origin_y"] + last_origin_px = geometry["origin_px"] + last_origin_py = geometry["origin_py"] + last_target_x = geometry["target_x"] + last_target_y = geometry["target_y"] + last_target_px = geometry["target_px"] + last_target_py = geometry["target_py"] + // Mirror into the anim "from" frame; with anim_duration 0 the next Draw() treats progress as 1 and + // seeds segments exactly at these endpoints, then animates to the (new) live position. + anim_from_origin_x = last_origin_x + anim_from_origin_y = last_origin_y + anim_from_origin_px = last_origin_px + anim_from_origin_py = last_origin_py + anim_from_target_x = last_target_x + anim_from_target_y = last_target_y + anim_from_target_px = last_target_px + anim_from_target_py = last_target_py + anim_duration = 0 + anim_start_time = world.time + last_draw_valid = TRUE + pending_animate_time = animate_time /datum/beam/Destroy() QDEL_LIST(elements) @@ -115,54 +195,116 @@ /** * Creates the beam effects and places them in a line from the origin to the target. Sets their rotation to make the beams face the target, too. */ -/datum/beam/proc/Draw() +/datum/beam/proc/Draw(atom/movable/mover = null, atom/oldloc = null) if(SEND_SIGNAL(src, COMSIG_BEAM_BEFORE_DRAW) & BEAM_CANCEL_DRAW) return + var/animate_time = pending_animate_time + pending_animate_time = 0 + if(!animate) + animate_time = 0 var/origin_px = (isnull(override_origin_pixel_x) ? origin.pixel_x : override_origin_pixel_x) + origin.pixel_w var/origin_py = (isnull(override_origin_pixel_y) ? origin.pixel_y : override_origin_pixel_y) + origin.pixel_z var/target_px = (isnull(override_target_pixel_x) ? target.pixel_x : override_target_pixel_x) + target.pixel_w var/target_py = (isnull(override_target_pixel_y) ? target.pixel_y : override_target_pixel_y) + target.pixel_z - var/Angle = get_angle_raw(origin.x, origin.y, origin_px, origin_py, target.x , target.y, target_px, target_py) - ///var/Angle = round(get_angle(origin,target)) + + // Seed from where segments visually are *now*, not where the last Draw asked them to end up. + // If the previous animation is still in flight (e.g. consecutive-tick or mid-diagonal moves), + // using the cached destination teleports segments forward then animates back — the diagonal jump. + // Lerp last from→to by elapsed time to get the real current frame. + var/progress = 1 + if(last_draw_valid && anim_duration > 0) + progress = clamp((world.time - anim_start_time) / anim_duration, 0, 1) + var/old_origin_x_f = last_draw_valid ? (anim_from_origin_x + (last_origin_x - anim_from_origin_x) * progress) : origin.x + var/old_origin_y_f = last_draw_valid ? (anim_from_origin_y + (last_origin_y - anim_from_origin_y) * progress) : origin.y + var/old_origin_px_f = last_draw_valid ? (anim_from_origin_px + (last_origin_px - anim_from_origin_px) * progress) : origin_px + var/old_origin_py_f = last_draw_valid ? (anim_from_origin_py + (last_origin_py - anim_from_origin_py) * progress) : origin_py + var/old_target_x_f = last_draw_valid ? (anim_from_target_x + (last_target_x - anim_from_target_x) * progress) : target.x + var/old_target_y_f = last_draw_valid ? (anim_from_target_y + (last_target_y - anim_from_target_y) * progress) : target.y + var/old_target_px_f = last_draw_valid ? (anim_from_target_px + (last_target_px - anim_from_target_px) * progress) : target_px + var/old_target_py_f = last_draw_valid ? (anim_from_target_py + (last_target_py - anim_from_target_py) * progress) : target_py + if(!last_draw_valid) + animate_time = 0 + + // Endpoints in absolute world-pixel coordinates. + var/vector/origin_world = vector(origin.x * ICON_SIZE_X + origin_px, origin.y * ICON_SIZE_Y + origin_py) + var/vector/target_world = vector(target.x * ICON_SIZE_X + target_px, target.y * ICON_SIZE_Y + target_py) + var/vector/old_origin_world = vector(old_origin_x_f * ICON_SIZE_X + old_origin_px_f, old_origin_y_f * ICON_SIZE_Y + old_origin_py_f) + var/vector/old_target_world = vector(old_target_x_f * ICON_SIZE_X + old_target_px_f, old_target_y_f * ICON_SIZE_Y + old_target_py_f) + + var/Angle = get_angle_raw(origin.x, origin.y, origin_px, origin_py, target.x, target.y, target_px, target_py) + var/vector/beam_direction = vector(sin(Angle), cos(Angle)) + // Old angle from the interpolated endpoints. + var/vector/old_beam_delta = old_target_world - old_origin_world + var/OLD_DX_F = old_beam_delta.x + var/OLD_DY_F = old_beam_delta.y + var/old_angle + if(!OLD_DY_F) + old_angle = (OLD_DX_F >= 0) ? 90 : 270 + else + old_angle = arctan(OLD_DX_F / OLD_DY_F) + if(OLD_DY_F < 0) + old_angle += 180 + else if(OLD_DX_F < 0) + old_angle += 360 var/matrix/rot_matrix = matrix() + var/matrix/old_rot_matrix = matrix() var/turf/origin_turf = get_turf(origin) rot_matrix.Turn(Angle) - - //Translation vector for origin and target - var/DX = (32*target.x+target_px)-(32*origin.x+origin_px) - var/DY = (32*target.y+target_py)-(32*origin.y+origin_py) + old_rot_matrix.Turn(old_angle) + var/raw_angle_delta = abs(Angle - old_angle) + if(raw_angle_delta > 180) // Normalize to shortest-path angle across the 0/360 seam. + raw_angle_delta = 360 - raw_angle_delta + // Byond doesn't handle 180 degree rotations well + var/animate_rotation = animate_time && raw_angle_delta < 90 + + var/vector/beam_delta = target_world - origin_world + var/DX = beam_delta.x + var/DY = beam_delta.y var/N = 0 - var/length = round(sqrt((DX)**2+(DY)**2)) //hypotenuse of the triangle formed by target and origin's displacement + var/length = round(beam_delta.size) + var/old_length = round(old_beam_delta.size) + var/vector/old_beam_direction = vector(sin(old_angle), cos(old_angle)) + + var/list/old_elements = elements + var/list/new_elements = list() - for(N in 0 to length-1 step 32)//-1 as we want < not <=, but we want the speed of X in Y to Z and step X + for(N in 0 to length-1 step 32) if(QDELETED(src)) break + // Map each new segment to the same offset on the interpolated old beam. + var/old_pos = clamp(N + 16, 0, old_length) var/obj/effect/ebeam/segment = new beam_type(origin_turf, src) - elements += segment - - //ends are cropped by a transparent box icon of length-N pixel size laid over the visuals obj - if(N+32>length) //went past the target, we draw a box of space to cut away from the beam sprite so the icon actually ends at the center of the target sprite - var/icon/terminal_icon = new(icon, icon_state)//this means we exclude the overshooting object from the visual contents which does mean those visuals don't show up for the final bit of the beam... - terminal_icon.DrawBox(null,1,(length-N),32,32)//in the future if you want to improve this, remove the drawbox and instead use a 513 filter to cut away at the final object's icon + new_elements += segment + + var/icon/terminal_icon = null + if(N+32>length) + terminal_icon = new(icon, icon_state) + var/cut_row = length - N + terminal_icon.DrawBox(null, 1, cut_row, 32, 32) + // Soft alpha falloff so the tip isn't a hard line. + var/fade_height = min(4, cut_row - 1) + if(fade_height > 0) + var/icon/alpha_mask = new(icon, icon_state) + alpha_mask.DrawBox(rgb(255, 255, 255, 255), 1, 1, 32, 32) + var/band_start = cut_row - fade_height + for(var/y in band_start to cut_row - 1) + var/from_tip = (cut_row - 1) - y // 0 at the tip row, fade_height-1 furthest back + var/a = round(255 * (from_tip + 1) / (fade_height + 1), 1) + alpha_mask.DrawBox(rgb(255, 255, 255, a), 1, y, 32, y) + alpha_mask.DrawBox(null, 1, cut_row, 32, 32) + terminal_icon.Blend(alpha_mask, ICON_MULTIPLY) segment.icon = terminal_icon segment.color = beam_color else set_subsegment_appearance(segment) - segment.transform = rot_matrix - - //Calculate pixel offsets (If necessary) - var/Pixel_x - var/Pixel_y - if(DX == 0) - Pixel_x = 0 - else - Pixel_x = round(sin(Angle)+32*sin(Angle)*(N+16)/32) - if(DY == 0) - Pixel_y = 0 + if(animate_rotation) + segment.transform = old_rot_matrix else - Pixel_y = round(cos(Angle)+32*cos(Angle)*(N+16)/32) + segment.transform = rot_matrix + + var/Pixel_x = (DX == 0) ? 0 : round(sin(Angle) + 32 * sin(Angle) * (N + 16) / 32, 1) + var/Pixel_y = (DY == 0) ? 0 : round(cos(Angle) + 32 * cos(Angle) * (N + 16) / 32, 1) - //Position the effect so the beam is one continous line var/final_x = segment.x var/final_y = segment.y if(abs(Pixel_x)>32) @@ -171,11 +313,75 @@ if(abs(Pixel_y)>32) final_y += Pixel_y > 0 ? round(Pixel_y/32) : ceil(Pixel_y/32) Pixel_y %= 32 - segment.forceMove(locate(final_x, final_y, segment.z)) - segment.pixel_x = origin_px + Pixel_x - segment.pixel_y = origin_py + Pixel_y - CHECK_TICK + var/new_pixel_x = origin_px + Pixel_x + var/new_pixel_y = origin_py + Pixel_y + if(animate_time) + // Seed from interpolated old endpoints so consecutive redraws don't snap. + var/vector/old_visual = old_origin_world + old_beam_direction * old_pos + var/new_visual_x = final_x * ICON_SIZE_X + new_pixel_x + var/new_visual_y = final_y * ICON_SIZE_Y + new_pixel_y + segment.pixel_x = new_pixel_x + round(old_visual.x - new_visual_x, 1) + segment.pixel_y = new_pixel_y + round(old_visual.y - new_visual_y, 1) + // Segments past the old beam's end fade in instead of popping. + if(N >= old_length) + segment.alpha = 0 + animate(segment, alpha = 255, time = animate_time, flags = ANIMATION_PARALLEL) + if(animate_rotation) + animate(segment, pixel_x = new_pixel_x, pixel_y = new_pixel_y, transform = rot_matrix, time = animate_time, flags = ANIMATION_PARALLEL) + else + animate(segment, pixel_x = new_pixel_x, pixel_y = new_pixel_y, time = animate_time, flags = ANIMATION_PARALLEL) + else + segment.pixel_x = new_pixel_x + segment.pixel_y = new_pixel_y + if(emissive) + segment.add_overlay(emissive_appearance(terminal_icon ? terminal_icon : icon, terminal_icon ? "" : icon_state, segment, alpha = segment.alpha)) + + elements = new_elements + // Fade out extra segments before deleting them so shrinking the beam does not pop the tail. + var/old_count = length(old_elements) + var/new_count = length(new_elements) + if(animate_time && old_count > new_count && progress >= 1) + for(var/i in 1 to new_count) + qdel(old_elements[i]) + for(var/i in new_count + 1 to old_count) + var/obj/effect/ebeam/dying = old_elements[i] + // Project the dying segment onto the new beam and clamp it to the tip. + var/proj_pos = clamp((i - 1) * ICON_SIZE_ALL + 16, 0, length) + var/vector/proj_world = origin_world + beam_direction * proj_pos + var/dying_world_x = dying.x * ICON_SIZE_X + var/dying_world_y = dying.y * ICON_SIZE_Y + var/target_px_anim = round(proj_world.x - dying_world_x, 1) + var/target_py_anim = round(proj_world.y - dying_world_y, 1) + dying.cut_overlays() // Remove emissive overlay so it doesn't glow while the segment fades out. + if(animate_rotation) + animate(dying, pixel_x = target_px_anim, pixel_y = target_py_anim, transform = rot_matrix, alpha = 0, time = animate_time, flags = ANIMATION_PARALLEL) + else + animate(dying, pixel_x = target_px_anim, pixel_y = target_py_anim, alpha = 0, time = animate_time, flags = ANIMATION_PARALLEL) + QDEL_IN(dying, animate_time) + else + QDEL_LIST(old_elements) + + // Cache this draw's seed and destination so the next Draw() can lerp mid-animation. + anim_from_origin_x = old_origin_x_f + anim_from_origin_y = old_origin_y_f + anim_from_origin_px = old_origin_px_f + anim_from_origin_py = old_origin_py_f + anim_from_target_x = old_target_x_f + anim_from_target_y = old_target_y_f + anim_from_target_px = old_target_px_f + anim_from_target_py = old_target_py_f + last_origin_x = origin.x + last_origin_y = origin.y + last_origin_px = origin_px + last_origin_py = origin_py + last_target_x = target.x + last_target_y = target.y + last_target_px = target_px + last_target_py = target_py + anim_start_time = world.time + anim_duration = animate_time + last_draw_valid = TRUE /datum/beam/proc/set_up_effect(obj/effect/ebeam/beam_effect, effect_icon_state) beam_effect.icon = icon @@ -206,6 +412,7 @@ beam_type = /obj/effect/ebeam, beam_color = null, emissive = TRUE, + animate = TRUE, override_origin_pixel_x = null, override_origin_pixel_y = null, override_target_pixel_x = null, @@ -225,6 +432,7 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT layer = ABOVE_ALL_MOB_LAYER anchored = TRUE + blocks_emissive = EMISSIVE_BLOCK_NONE var/emissive = TRUE var/datum/beam/owner @@ -232,15 +440,6 @@ owner = beam_owner return ..() -/obj/effect/ebeam/update_overlays() - . = ..() - if(!emissive) - return - var/mutable_appearance/emissive_overlay = emissive_appearance(icon, icon_state, src) - emissive_overlay.transform = transform - emissive_overlay.alpha = alpha - . += emissive_overlay - /obj/effect/ebeam/Destroy() owner = null return ..() @@ -331,18 +530,24 @@ time=INFINITY,maxdistance=INFINITY, beam_type=/obj/effect/ebeam, beam_color = null, emissive = TRUE, + animate = TRUE, override_origin_pixel_x = null, override_origin_pixel_y = null, override_target_pixel_x = null, override_target_pixel_y = null, layer = ABOVE_ALL_MOB_LAYER, icon_state_variants = 0, + glide_seed = null, + glide_time = 0, ) var/datum/beam/newbeam if(icon_state_variants <= 0) - newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color, emissive, override_origin_pixel_x, override_origin_pixel_y, override_target_pixel_x, override_target_pixel_y, layer) + newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color, emissive, animate, override_origin_pixel_x, override_origin_pixel_y, override_target_pixel_x, override_target_pixel_y, layer) else - newbeam = new /datum/beam/varied(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color, emissive, override_origin_pixel_x, override_origin_pixel_y, override_target_pixel_x, override_target_pixel_y, layer, icon_state_variants) + newbeam = new /datum/beam/varied(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color, emissive, animate, override_origin_pixel_x, override_origin_pixel_y, override_target_pixel_x, override_target_pixel_y, layer, icon_state_variants) + // Seed the glide before Start()'s first Draw() runs (INVOKE_ASYNC runs it synchronously here since + // Draw() never sleeps), so a rebuilt beam animates from its predecessor instead of snapping. + newbeam.inherit_glide(glide_seed, glide_time) INVOKE_ASYNC(newbeam, TYPE_PROC_REF(/datum/beam/, Start)) return newbeam diff --git a/code/datums/status_effects/cuffed_item.dm b/code/datums/status_effects/cuffed_item.dm index 297666efc75..53ccad34b14 100644 --- a/code/datums/status_effects/cuffed_item.dm +++ b/code/datums/status_effects/cuffed_item.dm @@ -323,7 +323,7 @@ var/atom/movable/movable_parent = parent link_effect = movable_parent.AddComponent(/datum/component/leash, owner = chained_to, distance = 1) tug_effect = movable_parent.AddComponent(/datum/component/tug_towards, tugging_to = chained_to, strength = 0.66) - beam_effect = movable_parent.Beam(chained_to, "chain") + beam_effect = movable_parent.Beam(chained_to, "chain", animate = FALSE) RegisterSignal(link_effect, COMSIG_QDELETING, PROC_REF(delete_self)) RegisterSignal(tug_effect, COMSIG_QDELETING, PROC_REF(delete_self)) RegisterSignal(beam_effect, COMSIG_QDELETING, PROC_REF(recreate_beam)) @@ -345,7 +345,7 @@ UnregisterSignal(beam_effect, COMSIG_QDELETING) var/atom/movable/movable_parent = parent - beam_effect = movable_parent.Beam(chained_to_weakref.resolve(), "chain") + beam_effect = movable_parent.Beam(chained_to_weakref.resolve(), "chain", animate = FALSE) RegisterSignal(beam_effect, COMSIG_QDELETING, PROC_REF(recreate_beam)) /datum/component/chained_together/proc/delete_self(datum/source) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index e48ae62b576..f67e15ab036 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -75,7 +75,9 @@ return FALSE /// Used to refresh the beam in whatever context. -/obj/item/assembly/infra/proc/make_beam() +/// glide_seed/glide_time (from a predecessor beam's get_last_geometry) make the rebuilt beam glide +/// from the old position instead of snapping; left as defaults for non-movement refreshes. +/obj/item/assembly/infra/proc/make_beam(list/glide_seed = null, glide_time = 0) SHOULD_NOT_SLEEP(TRUE) if(!isnull(buffer_turf)) @@ -115,6 +117,8 @@ emissive = TRUE, override_target_pixel_x = pixel_x, override_target_pixel_y = pixel_y, + glide_seed = glide_seed, + glide_time = glide_time, ) RegisterSignal(active_beam, COMSIG_BEAM_ENTERED, PROC_REF(beam_entered)) RegisterSignal(active_beam, COMSIG_BEAM_TURFS_CHANGED, PROC_REF(beam_turfs_changed)) @@ -244,30 +248,15 @@ make_beam() /obj/item/assembly/infra/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + var/list/glide_seed = active_beam?.get_last_geometry() . = ..() if(loc == old_loc) return - make_beam() if(!visible || forced || !movement_dir || !Adjacent(old_loc)) + make_beam() return - // Because the new beam is made in the new loc, it "jumps" from one turf to another - // We can do an animate to pretend we're gliding between turfs rather than making a whole new beam - var/x_move = 0 - var/y_move = 0 - if(movement_dir & NORTH) - y_move = -ICON_SIZE_Y - else if(movement_dir & SOUTH) - y_move = ICON_SIZE_Y - if(movement_dir & WEST) - x_move = ICON_SIZE_X - else if(movement_dir & EAST) - x_move = -ICON_SIZE_X - - var/fake_glide_time = round(ICON_SIZE_ALL / glide_size * world.tick_lag, world.tick_lag) - for(var/obj/effect/ebeam/beam as anything in active_beam?.elements) - var/matrix/base_transform = matrix(beam.transform) - beam.transform = beam.transform.Translate(x_move, y_move) - animate(beam, transform = base_transform, time = fake_glide_time) + var/glide_time = ICON_SIZE_ALL / max(glide_size, MIN_GLIDE_SIZE) * world.tick_lag * GLOB.glide_size_multiplier + make_beam(glide_seed, glide_time) /obj/item/assembly/infra/setDir(newdir) var/prev_dir = dir From d8ce2e68f65508195c52d424f16d9a4e1945a891 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 20:17:30 +0000 Subject: [PATCH 033/126] Automatic changelog for PR #96339 [ci skip] --- html/changelogs/AutoChangeLog-pr-96339.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96339.yml diff --git a/html/changelogs/AutoChangeLog-pr-96339.yml b/html/changelogs/AutoChangeLog-pr-96339.yml new file mode 100644 index 00000000000..0869f754675 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96339.yml @@ -0,0 +1,5 @@ +author: "Arturlang" +delete-after: True +changes: + - rscadd: "beams now animate when moving tile to tile, this is mostly noticeable for constant beam effects" + - bugfix: "beam emissives now work" \ No newline at end of file From e2e7d1321dfbed335782dd10de5b855f773261c4 Mon Sep 17 00:00:00 2001 From: Tim Date: Fri, 12 Jun 2026 15:34:32 -0500 Subject: [PATCH 034/126] Reorganize shuttles into separate folders (#96430) ## About The Pull Request This moves all the shuttle `.dmm` files into separate respective folders. ## Why It's Good For The Game Easier to find shuttles while mapping. ## Changelog :cl: code: Reorganize shuttle maps into separate folders /:cl: --- .../{ => arrival}/arrival_birdshot.dmm | 0 _maps/shuttles/{ => arrival}/arrival_box.dmm | 0 .../{ => arrival}/arrival_catwalk.dmm | 0 .../shuttles/{ => arrival}/arrival_delta.dmm | 0 .../shuttles/{ => arrival}/arrival_donut.dmm | 0 _maps/shuttles/{ => arrival}/arrival_kilo.dmm | 0 .../shuttles/{ => arrival}/arrival_nebula.dmm | 0 .../{ => arrival}/arrival_northstar.dmm | 0 .../shuttles/{ => arrival}/arrival_pubby.dmm | 0 .../{ => aux_base}/aux_base_default.dmm | 0 .../{ => aux_base}/aux_base_small.dmm | 0 _maps/shuttles/{ => cargo}/cargo_birdboat.dmm | 0 _maps/shuttles/{ => cargo}/cargo_birdshot.dmm | 0 _maps/shuttles/{ => cargo}/cargo_box.dmm | 0 _maps/shuttles/{ => cargo}/cargo_catwalk.dmm | 0 _maps/shuttles/{ => cargo}/cargo_delta.dmm | 0 _maps/shuttles/{ => cargo}/cargo_kilo.dmm | 0 _maps/shuttles/{ => cargo}/cargo_mini.dmm | 0 _maps/shuttles/{ => cargo}/cargo_nebula.dmm | 0 .../shuttles/{ => cargo}/cargo_northstar.dmm | 0 _maps/shuttles/{ => cargo}/cargo_pubby.dmm | 0 .../{ => emergency}/emergency_arena.dmm | 0 .../{ => emergency}/emergency_asteroid.dmm | 0 .../{ => emergency}/emergency_backup.dmm | 0 .../{ => emergency}/emergency_bar.dmm | 0 .../{ => emergency}/emergency_bballhooper.dmm | 0 .../{ => emergency}/emergency_birdboat.dmm | 0 .../{ => emergency}/emergency_birdshot.dmm | 0 .../{ => emergency}/emergency_box.dmm | 0 .../{ => emergency}/emergency_casino.dmm | 0 .../{ => emergency}/emergency_catwalk.dmm | 0 .../{ => emergency}/emergency_cere.dmm | 0 .../{ => emergency}/emergency_clown.dmm | 0 .../emergency_construction.dmm | 0 .../emergency_constructionbig.dmm | 0 .../{ => emergency}/emergency_cramped.dmm | 0 .../{ => emergency}/emergency_cruise.dmm | 0 .../{ => emergency}/emergency_delta.dmm | 0 .../emergency_discoinferno.dmm | 0 .../{ => emergency}/emergency_donut.dmm | 0 .../{ => emergency}/emergency_fame.dmm | 0 .../{ => emergency}/emergency_fish.dmm | 0 .../{ => emergency}/emergency_goon.dmm | 0 .../{ => emergency}/emergency_hugcage.dmm | 0 .../{ => emergency}/emergency_humpback.dmm | 0 .../emergency_imfedupwiththisworld.dmm | 0 .../{ => emergency}/emergency_kilo.dmm | 0 .../{ => emergency}/emergency_lance.dmm | 0 .../{ => emergency}/emergency_luxury.dmm | 0 .../{ => emergency}/emergency_medisim.dmm | 0 .../{ => emergency}/emergency_meta.dmm | 0 .../{ => emergency}/emergency_meteor.dmm | 0 .../{ => emergency}/emergency_mini.dmm | 0 .../{ => emergency}/emergency_monastery.dmm | 0 .../{ => emergency}/emergency_narnar.dmm | 0 .../{ => emergency}/emergency_nature.dmm | 0 .../{ => emergency}/emergency_nebula.dmm | 0 .../{ => emergency}/emergency_northstar.dmm | 0 .../{ => emergency}/emergency_omega.dmm | 0 .../{ => emergency}/emergency_pod.dmm | 0 .../{ => emergency}/emergency_pubby.dmm | 0 .../{ => emergency}/emergency_raven.dmm | 0 .../{ => emergency}/emergency_rollerdome.dmm | 0 .../emergency_russiafightpit.dmm | 0 .../{ => emergency}/emergency_scrapheap.dmm | 0 .../emergency_scrapheap/classic1.dmm | 0 .../emergency_scrapheap/classic2.dmm | 0 .../emergency_scrapheap/classic_aft1.dmm | 0 .../emergency_scrapheap/classic_aft2.dmm | 0 .../emergency_scrapheap/classic_aft3.dmm | 0 .../emergency_scrapheap/classic_fore1.dmm | 0 .../emergency_scrapheap/classic_fore2.dmm | 0 .../emergency_scrapheap/classic_fore3.dmm | 0 .../classic_starboard1.dmm | 0 .../classic_starboard2.dmm | 0 .../{ => emergency}/emergency_shadow.dmm | 0 .../{ => emergency}/emergency_supermatter.dmm | 0 .../{ => emergency}/emergency_tram.dmm | 0 .../{ => emergency}/emergency_tranquility.dmm | 0 .../{ => emergency}/emergency_venture.dmm | 0 .../{ => emergency}/emergency_wabbajack.dmm | 0 .../{ => emergency}/emergency_wawa.dmm | 0 .../{ => emergency}/emergency_zeta.dmm | 0 .../{ => escape_pod}/escape_pod_cramped.dmm | 0 .../{ => escape_pod}/escape_pod_default.dmm | 0 .../{ => escape_pod}/escape_pod_large.dmm | 0 .../{ => escape_pod}/escape_pod_luxury.dmm | 0 _maps/shuttles/{ => ferry}/ferry_base.dmm | 0 _maps/shuttles/{ => ferry}/ferry_fancy.dmm | 0 _maps/shuttles/{ => ferry}/ferry_kilo.dmm | 0 .../shuttles/{ => ferry}/ferry_lighthouse.dmm | 0 _maps/shuttles/{ => ferry}/ferry_meat.dmm | 0 _maps/shuttles/{ => ferry}/ferry_nebula.dmm | 0 _maps/shuttles/{ => hunter}/hunter_bounty.dmm | 0 .../{ => hunter}/hunter_mi13_foodtruck.dmm | 0 _maps/shuttles/{ => hunter}/hunter_psyker.dmm | 0 .../shuttles/{ => hunter}/hunter_russian.dmm | 0 .../{ => hunter}/hunter_space_cop.dmm | 0 .../infiltrator_advanced.dmm | 0 .../{ => infiltrator}/infiltrator_basic.dmm | 0 .../{ => infiltrator}/infiltrator_clown.dmm | 0 _maps/shuttles/{ => labour}/labour_box.dmm | 0 _maps/shuttles/{ => labour}/labour_delta.dmm | 0 .../shuttles/{ => labour}/labour_generic.dmm | 0 _maps/shuttles/{ => labour}/labour_kilo.dmm | 0 _maps/shuttles/{ => labour}/labour_nebula.dmm | 0 _maps/shuttles/{ => mining}/mining_box.dmm | 0 .../{ => mining}/mining_common_kilo.dmm | 0 .../{ => mining}/mining_common_meta.dmm | 0 .../{ => mining}/mining_common_northstar.dmm | 0 _maps/shuttles/{ => mining}/mining_delta.dmm | 0 .../shuttles/{ => mining}/mining_freight.dmm | 0 _maps/shuttles/{ => mining}/mining_kilo.dmm | 0 _maps/shuttles/{ => mining}/mining_large.dmm | 0 _maps/shuttles/{ => mining}/mining_nebula.dmm | 0 .../{ => mining}/mining_northstar.dmm | 0 .../shuttles/{ => pirate}/pirate_default.dmm | 0 .../shuttles/{ => pirate}/pirate_dutchman.dmm | 0 .../{ => pirate}/pirate_ex_interdyne.dmm | 0 _maps/shuttles/{ => pirate}/pirate_geode.dmm | 0 _maps/shuttles/{ => pirate}/pirate_grey.dmm | 0 _maps/shuttles/{ => pirate}/pirate_irs.dmm | 0 .../shuttles/{ => pirate}/pirate_medieval.dmm | 0 .../{ => pirate}/pirate_silverscale.dmm | 0 .../{ => ruin}/ruin_caravan_victim.dmm | 0 .../{ => ruin}/ruin_cyborg_mothership.dmm | 0 .../{ => ruin}/ruin_pirate_cutter.dmm | 0 .../{ => ruin}/ruin_syndicate_dropship.dmm | 0 .../ruin_syndicate_fighter_shiv.dmm | 0 .../{ => starfury}/starfury_corvette.dmm | 0 .../{ => starfury}/starfury_fighter1.dmm | 0 .../{ => starfury}/starfury_fighter2.dmm | 0 .../{ => starfury}/starfury_fighter3.dmm | 0 .../{ => whiteship}/whiteship_birdshot.dmm | 0 .../{ => whiteship}/whiteship_box.dmm | 0 .../{ => whiteship}/whiteship_cere.dmm | 0 .../{ => whiteship}/whiteship_delta.dmm | 0 .../{ => whiteship}/whiteship_donut.dmm | 0 .../{ => whiteship}/whiteship_kilo.dmm | 0 .../{ => whiteship}/whiteship_meta.dmm | 0 .../{ => whiteship}/whiteship_obelisk.dmm | 0 .../whiteship_personalshuttle.dmm | 0 .../{ => whiteship}/whiteship_pubby.dmm | 0 .../{ => whiteship}/whiteship_tram.dmm | 0 code/datums/shuttles/arrival.dm | 1 + code/datums/shuttles/aux_base.dm | 1 + code/datums/shuttles/cargo.dm | 1 + code/datums/shuttles/emergency.dm | 1 + code/datums/shuttles/escape_pod.dm | 1 + code/datums/shuttles/ferry.dm | 1 + code/datums/shuttles/hunter.dm | 1 + code/datums/shuttles/infiltrator.dm | 1 + code/datums/shuttles/labour.dm | 24 +++++++++++++++++ code/datums/shuttles/mining.dm | 27 ++----------------- code/datums/shuttles/pirate.dm | 1 + code/datums/shuttles/ruin.dm | 1 + code/datums/shuttles/starfury.dm | 1 + code/datums/shuttles/whiteship.dm | 1 + strings/modular_maps/emergency_scrapheap.toml | 2 +- tgstation.dme | 1 + tools/maplint/lints/area_noop.yml | 2 +- 161 files changed, 41 insertions(+), 27 deletions(-) rename _maps/shuttles/{ => arrival}/arrival_birdshot.dmm (100%) rename _maps/shuttles/{ => arrival}/arrival_box.dmm (100%) rename _maps/shuttles/{ => arrival}/arrival_catwalk.dmm (100%) rename _maps/shuttles/{ => arrival}/arrival_delta.dmm (100%) rename _maps/shuttles/{ => arrival}/arrival_donut.dmm (100%) rename _maps/shuttles/{ => arrival}/arrival_kilo.dmm (100%) rename _maps/shuttles/{ => arrival}/arrival_nebula.dmm (100%) rename _maps/shuttles/{ => arrival}/arrival_northstar.dmm (100%) rename _maps/shuttles/{ => arrival}/arrival_pubby.dmm (100%) rename _maps/shuttles/{ => aux_base}/aux_base_default.dmm (100%) rename _maps/shuttles/{ => aux_base}/aux_base_small.dmm (100%) rename _maps/shuttles/{ => cargo}/cargo_birdboat.dmm (100%) rename _maps/shuttles/{ => cargo}/cargo_birdshot.dmm (100%) rename _maps/shuttles/{ => cargo}/cargo_box.dmm (100%) rename _maps/shuttles/{ => cargo}/cargo_catwalk.dmm (100%) rename _maps/shuttles/{ => cargo}/cargo_delta.dmm (100%) rename _maps/shuttles/{ => cargo}/cargo_kilo.dmm (100%) rename _maps/shuttles/{ => cargo}/cargo_mini.dmm (100%) rename _maps/shuttles/{ => cargo}/cargo_nebula.dmm (100%) rename _maps/shuttles/{ => cargo}/cargo_northstar.dmm (100%) rename _maps/shuttles/{ => cargo}/cargo_pubby.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_arena.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_asteroid.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_backup.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_bar.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_bballhooper.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_birdboat.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_birdshot.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_box.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_casino.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_catwalk.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_cere.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_clown.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_construction.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_constructionbig.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_cramped.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_cruise.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_delta.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_discoinferno.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_donut.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_fame.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_fish.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_goon.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_hugcage.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_humpback.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_imfedupwiththisworld.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_kilo.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_lance.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_luxury.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_medisim.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_meta.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_meteor.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_mini.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_monastery.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_narnar.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_nature.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_nebula.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_northstar.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_omega.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_pod.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_pubby.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_raven.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_rollerdome.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_russiafightpit.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_scrapheap.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_scrapheap/classic1.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_scrapheap/classic2.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_scrapheap/classic_aft1.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_scrapheap/classic_aft2.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_scrapheap/classic_aft3.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_scrapheap/classic_fore1.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_scrapheap/classic_fore2.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_scrapheap/classic_fore3.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_scrapheap/classic_starboard1.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_scrapheap/classic_starboard2.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_shadow.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_supermatter.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_tram.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_tranquility.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_venture.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_wabbajack.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_wawa.dmm (100%) rename _maps/shuttles/{ => emergency}/emergency_zeta.dmm (100%) rename _maps/shuttles/{ => escape_pod}/escape_pod_cramped.dmm (100%) rename _maps/shuttles/{ => escape_pod}/escape_pod_default.dmm (100%) rename _maps/shuttles/{ => escape_pod}/escape_pod_large.dmm (100%) rename _maps/shuttles/{ => escape_pod}/escape_pod_luxury.dmm (100%) rename _maps/shuttles/{ => ferry}/ferry_base.dmm (100%) rename _maps/shuttles/{ => ferry}/ferry_fancy.dmm (100%) rename _maps/shuttles/{ => ferry}/ferry_kilo.dmm (100%) rename _maps/shuttles/{ => ferry}/ferry_lighthouse.dmm (100%) rename _maps/shuttles/{ => ferry}/ferry_meat.dmm (100%) rename _maps/shuttles/{ => ferry}/ferry_nebula.dmm (100%) rename _maps/shuttles/{ => hunter}/hunter_bounty.dmm (100%) rename _maps/shuttles/{ => hunter}/hunter_mi13_foodtruck.dmm (100%) rename _maps/shuttles/{ => hunter}/hunter_psyker.dmm (100%) rename _maps/shuttles/{ => hunter}/hunter_russian.dmm (100%) rename _maps/shuttles/{ => hunter}/hunter_space_cop.dmm (100%) rename _maps/shuttles/{ => infiltrator}/infiltrator_advanced.dmm (100%) rename _maps/shuttles/{ => infiltrator}/infiltrator_basic.dmm (100%) rename _maps/shuttles/{ => infiltrator}/infiltrator_clown.dmm (100%) rename _maps/shuttles/{ => labour}/labour_box.dmm (100%) rename _maps/shuttles/{ => labour}/labour_delta.dmm (100%) rename _maps/shuttles/{ => labour}/labour_generic.dmm (100%) rename _maps/shuttles/{ => labour}/labour_kilo.dmm (100%) rename _maps/shuttles/{ => labour}/labour_nebula.dmm (100%) rename _maps/shuttles/{ => mining}/mining_box.dmm (100%) rename _maps/shuttles/{ => mining}/mining_common_kilo.dmm (100%) rename _maps/shuttles/{ => mining}/mining_common_meta.dmm (100%) rename _maps/shuttles/{ => mining}/mining_common_northstar.dmm (100%) rename _maps/shuttles/{ => mining}/mining_delta.dmm (100%) rename _maps/shuttles/{ => mining}/mining_freight.dmm (100%) rename _maps/shuttles/{ => mining}/mining_kilo.dmm (100%) rename _maps/shuttles/{ => mining}/mining_large.dmm (100%) rename _maps/shuttles/{ => mining}/mining_nebula.dmm (100%) rename _maps/shuttles/{ => mining}/mining_northstar.dmm (100%) rename _maps/shuttles/{ => pirate}/pirate_default.dmm (100%) rename _maps/shuttles/{ => pirate}/pirate_dutchman.dmm (100%) rename _maps/shuttles/{ => pirate}/pirate_ex_interdyne.dmm (100%) rename _maps/shuttles/{ => pirate}/pirate_geode.dmm (100%) rename _maps/shuttles/{ => pirate}/pirate_grey.dmm (100%) rename _maps/shuttles/{ => pirate}/pirate_irs.dmm (100%) rename _maps/shuttles/{ => pirate}/pirate_medieval.dmm (100%) rename _maps/shuttles/{ => pirate}/pirate_silverscale.dmm (100%) rename _maps/shuttles/{ => ruin}/ruin_caravan_victim.dmm (100%) rename _maps/shuttles/{ => ruin}/ruin_cyborg_mothership.dmm (100%) rename _maps/shuttles/{ => ruin}/ruin_pirate_cutter.dmm (100%) rename _maps/shuttles/{ => ruin}/ruin_syndicate_dropship.dmm (100%) rename _maps/shuttles/{ => ruin}/ruin_syndicate_fighter_shiv.dmm (100%) rename _maps/shuttles/{ => starfury}/starfury_corvette.dmm (100%) rename _maps/shuttles/{ => starfury}/starfury_fighter1.dmm (100%) rename _maps/shuttles/{ => starfury}/starfury_fighter2.dmm (100%) rename _maps/shuttles/{ => starfury}/starfury_fighter3.dmm (100%) rename _maps/shuttles/{ => whiteship}/whiteship_birdshot.dmm (100%) rename _maps/shuttles/{ => whiteship}/whiteship_box.dmm (100%) rename _maps/shuttles/{ => whiteship}/whiteship_cere.dmm (100%) rename _maps/shuttles/{ => whiteship}/whiteship_delta.dmm (100%) rename _maps/shuttles/{ => whiteship}/whiteship_donut.dmm (100%) rename _maps/shuttles/{ => whiteship}/whiteship_kilo.dmm (100%) rename _maps/shuttles/{ => whiteship}/whiteship_meta.dmm (100%) rename _maps/shuttles/{ => whiteship}/whiteship_obelisk.dmm (100%) rename _maps/shuttles/{ => whiteship}/whiteship_personalshuttle.dmm (100%) rename _maps/shuttles/{ => whiteship}/whiteship_pubby.dmm (100%) rename _maps/shuttles/{ => whiteship}/whiteship_tram.dmm (100%) create mode 100644 code/datums/shuttles/labour.dm diff --git a/_maps/shuttles/arrival_birdshot.dmm b/_maps/shuttles/arrival/arrival_birdshot.dmm similarity index 100% rename from _maps/shuttles/arrival_birdshot.dmm rename to _maps/shuttles/arrival/arrival_birdshot.dmm diff --git a/_maps/shuttles/arrival_box.dmm b/_maps/shuttles/arrival/arrival_box.dmm similarity index 100% rename from _maps/shuttles/arrival_box.dmm rename to _maps/shuttles/arrival/arrival_box.dmm diff --git a/_maps/shuttles/arrival_catwalk.dmm b/_maps/shuttles/arrival/arrival_catwalk.dmm similarity index 100% rename from _maps/shuttles/arrival_catwalk.dmm rename to _maps/shuttles/arrival/arrival_catwalk.dmm diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival/arrival_delta.dmm similarity index 100% rename from _maps/shuttles/arrival_delta.dmm rename to _maps/shuttles/arrival/arrival_delta.dmm diff --git a/_maps/shuttles/arrival_donut.dmm b/_maps/shuttles/arrival/arrival_donut.dmm similarity index 100% rename from _maps/shuttles/arrival_donut.dmm rename to _maps/shuttles/arrival/arrival_donut.dmm diff --git a/_maps/shuttles/arrival_kilo.dmm b/_maps/shuttles/arrival/arrival_kilo.dmm similarity index 100% rename from _maps/shuttles/arrival_kilo.dmm rename to _maps/shuttles/arrival/arrival_kilo.dmm diff --git a/_maps/shuttles/arrival_nebula.dmm b/_maps/shuttles/arrival/arrival_nebula.dmm similarity index 100% rename from _maps/shuttles/arrival_nebula.dmm rename to _maps/shuttles/arrival/arrival_nebula.dmm diff --git a/_maps/shuttles/arrival_northstar.dmm b/_maps/shuttles/arrival/arrival_northstar.dmm similarity index 100% rename from _maps/shuttles/arrival_northstar.dmm rename to _maps/shuttles/arrival/arrival_northstar.dmm diff --git a/_maps/shuttles/arrival_pubby.dmm b/_maps/shuttles/arrival/arrival_pubby.dmm similarity index 100% rename from _maps/shuttles/arrival_pubby.dmm rename to _maps/shuttles/arrival/arrival_pubby.dmm diff --git a/_maps/shuttles/aux_base_default.dmm b/_maps/shuttles/aux_base/aux_base_default.dmm similarity index 100% rename from _maps/shuttles/aux_base_default.dmm rename to _maps/shuttles/aux_base/aux_base_default.dmm diff --git a/_maps/shuttles/aux_base_small.dmm b/_maps/shuttles/aux_base/aux_base_small.dmm similarity index 100% rename from _maps/shuttles/aux_base_small.dmm rename to _maps/shuttles/aux_base/aux_base_small.dmm diff --git a/_maps/shuttles/cargo_birdboat.dmm b/_maps/shuttles/cargo/cargo_birdboat.dmm similarity index 100% rename from _maps/shuttles/cargo_birdboat.dmm rename to _maps/shuttles/cargo/cargo_birdboat.dmm diff --git a/_maps/shuttles/cargo_birdshot.dmm b/_maps/shuttles/cargo/cargo_birdshot.dmm similarity index 100% rename from _maps/shuttles/cargo_birdshot.dmm rename to _maps/shuttles/cargo/cargo_birdshot.dmm diff --git a/_maps/shuttles/cargo_box.dmm b/_maps/shuttles/cargo/cargo_box.dmm similarity index 100% rename from _maps/shuttles/cargo_box.dmm rename to _maps/shuttles/cargo/cargo_box.dmm diff --git a/_maps/shuttles/cargo_catwalk.dmm b/_maps/shuttles/cargo/cargo_catwalk.dmm similarity index 100% rename from _maps/shuttles/cargo_catwalk.dmm rename to _maps/shuttles/cargo/cargo_catwalk.dmm diff --git a/_maps/shuttles/cargo_delta.dmm b/_maps/shuttles/cargo/cargo_delta.dmm similarity index 100% rename from _maps/shuttles/cargo_delta.dmm rename to _maps/shuttles/cargo/cargo_delta.dmm diff --git a/_maps/shuttles/cargo_kilo.dmm b/_maps/shuttles/cargo/cargo_kilo.dmm similarity index 100% rename from _maps/shuttles/cargo_kilo.dmm rename to _maps/shuttles/cargo/cargo_kilo.dmm diff --git a/_maps/shuttles/cargo_mini.dmm b/_maps/shuttles/cargo/cargo_mini.dmm similarity index 100% rename from _maps/shuttles/cargo_mini.dmm rename to _maps/shuttles/cargo/cargo_mini.dmm diff --git a/_maps/shuttles/cargo_nebula.dmm b/_maps/shuttles/cargo/cargo_nebula.dmm similarity index 100% rename from _maps/shuttles/cargo_nebula.dmm rename to _maps/shuttles/cargo/cargo_nebula.dmm diff --git a/_maps/shuttles/cargo_northstar.dmm b/_maps/shuttles/cargo/cargo_northstar.dmm similarity index 100% rename from _maps/shuttles/cargo_northstar.dmm rename to _maps/shuttles/cargo/cargo_northstar.dmm diff --git a/_maps/shuttles/cargo_pubby.dmm b/_maps/shuttles/cargo/cargo_pubby.dmm similarity index 100% rename from _maps/shuttles/cargo_pubby.dmm rename to _maps/shuttles/cargo/cargo_pubby.dmm diff --git a/_maps/shuttles/emergency_arena.dmm b/_maps/shuttles/emergency/emergency_arena.dmm similarity index 100% rename from _maps/shuttles/emergency_arena.dmm rename to _maps/shuttles/emergency/emergency_arena.dmm diff --git a/_maps/shuttles/emergency_asteroid.dmm b/_maps/shuttles/emergency/emergency_asteroid.dmm similarity index 100% rename from _maps/shuttles/emergency_asteroid.dmm rename to _maps/shuttles/emergency/emergency_asteroid.dmm diff --git a/_maps/shuttles/emergency_backup.dmm b/_maps/shuttles/emergency/emergency_backup.dmm similarity index 100% rename from _maps/shuttles/emergency_backup.dmm rename to _maps/shuttles/emergency/emergency_backup.dmm diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency/emergency_bar.dmm similarity index 100% rename from _maps/shuttles/emergency_bar.dmm rename to _maps/shuttles/emergency/emergency_bar.dmm diff --git a/_maps/shuttles/emergency_bballhooper.dmm b/_maps/shuttles/emergency/emergency_bballhooper.dmm similarity index 100% rename from _maps/shuttles/emergency_bballhooper.dmm rename to _maps/shuttles/emergency/emergency_bballhooper.dmm diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency/emergency_birdboat.dmm similarity index 100% rename from _maps/shuttles/emergency_birdboat.dmm rename to _maps/shuttles/emergency/emergency_birdboat.dmm diff --git a/_maps/shuttles/emergency_birdshot.dmm b/_maps/shuttles/emergency/emergency_birdshot.dmm similarity index 100% rename from _maps/shuttles/emergency_birdshot.dmm rename to _maps/shuttles/emergency/emergency_birdshot.dmm diff --git a/_maps/shuttles/emergency_box.dmm b/_maps/shuttles/emergency/emergency_box.dmm similarity index 100% rename from _maps/shuttles/emergency_box.dmm rename to _maps/shuttles/emergency/emergency_box.dmm diff --git a/_maps/shuttles/emergency_casino.dmm b/_maps/shuttles/emergency/emergency_casino.dmm similarity index 100% rename from _maps/shuttles/emergency_casino.dmm rename to _maps/shuttles/emergency/emergency_casino.dmm diff --git a/_maps/shuttles/emergency_catwalk.dmm b/_maps/shuttles/emergency/emergency_catwalk.dmm similarity index 100% rename from _maps/shuttles/emergency_catwalk.dmm rename to _maps/shuttles/emergency/emergency_catwalk.dmm diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency/emergency_cere.dmm similarity index 100% rename from _maps/shuttles/emergency_cere.dmm rename to _maps/shuttles/emergency/emergency_cere.dmm diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency/emergency_clown.dmm similarity index 100% rename from _maps/shuttles/emergency_clown.dmm rename to _maps/shuttles/emergency/emergency_clown.dmm diff --git a/_maps/shuttles/emergency_construction.dmm b/_maps/shuttles/emergency/emergency_construction.dmm similarity index 100% rename from _maps/shuttles/emergency_construction.dmm rename to _maps/shuttles/emergency/emergency_construction.dmm diff --git a/_maps/shuttles/emergency_constructionbig.dmm b/_maps/shuttles/emergency/emergency_constructionbig.dmm similarity index 100% rename from _maps/shuttles/emergency_constructionbig.dmm rename to _maps/shuttles/emergency/emergency_constructionbig.dmm diff --git a/_maps/shuttles/emergency_cramped.dmm b/_maps/shuttles/emergency/emergency_cramped.dmm similarity index 100% rename from _maps/shuttles/emergency_cramped.dmm rename to _maps/shuttles/emergency/emergency_cramped.dmm diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency/emergency_cruise.dmm similarity index 100% rename from _maps/shuttles/emergency_cruise.dmm rename to _maps/shuttles/emergency/emergency_cruise.dmm diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency/emergency_delta.dmm similarity index 100% rename from _maps/shuttles/emergency_delta.dmm rename to _maps/shuttles/emergency/emergency_delta.dmm diff --git a/_maps/shuttles/emergency_discoinferno.dmm b/_maps/shuttles/emergency/emergency_discoinferno.dmm similarity index 100% rename from _maps/shuttles/emergency_discoinferno.dmm rename to _maps/shuttles/emergency/emergency_discoinferno.dmm diff --git a/_maps/shuttles/emergency_donut.dmm b/_maps/shuttles/emergency/emergency_donut.dmm similarity index 100% rename from _maps/shuttles/emergency_donut.dmm rename to _maps/shuttles/emergency/emergency_donut.dmm diff --git a/_maps/shuttles/emergency_fame.dmm b/_maps/shuttles/emergency/emergency_fame.dmm similarity index 100% rename from _maps/shuttles/emergency_fame.dmm rename to _maps/shuttles/emergency/emergency_fame.dmm diff --git a/_maps/shuttles/emergency_fish.dmm b/_maps/shuttles/emergency/emergency_fish.dmm similarity index 100% rename from _maps/shuttles/emergency_fish.dmm rename to _maps/shuttles/emergency/emergency_fish.dmm diff --git a/_maps/shuttles/emergency_goon.dmm b/_maps/shuttles/emergency/emergency_goon.dmm similarity index 100% rename from _maps/shuttles/emergency_goon.dmm rename to _maps/shuttles/emergency/emergency_goon.dmm diff --git a/_maps/shuttles/emergency_hugcage.dmm b/_maps/shuttles/emergency/emergency_hugcage.dmm similarity index 100% rename from _maps/shuttles/emergency_hugcage.dmm rename to _maps/shuttles/emergency/emergency_hugcage.dmm diff --git a/_maps/shuttles/emergency_humpback.dmm b/_maps/shuttles/emergency/emergency_humpback.dmm similarity index 100% rename from _maps/shuttles/emergency_humpback.dmm rename to _maps/shuttles/emergency/emergency_humpback.dmm diff --git a/_maps/shuttles/emergency_imfedupwiththisworld.dmm b/_maps/shuttles/emergency/emergency_imfedupwiththisworld.dmm similarity index 100% rename from _maps/shuttles/emergency_imfedupwiththisworld.dmm rename to _maps/shuttles/emergency/emergency_imfedupwiththisworld.dmm diff --git a/_maps/shuttles/emergency_kilo.dmm b/_maps/shuttles/emergency/emergency_kilo.dmm similarity index 100% rename from _maps/shuttles/emergency_kilo.dmm rename to _maps/shuttles/emergency/emergency_kilo.dmm diff --git a/_maps/shuttles/emergency_lance.dmm b/_maps/shuttles/emergency/emergency_lance.dmm similarity index 100% rename from _maps/shuttles/emergency_lance.dmm rename to _maps/shuttles/emergency/emergency_lance.dmm diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency/emergency_luxury.dmm similarity index 100% rename from _maps/shuttles/emergency_luxury.dmm rename to _maps/shuttles/emergency/emergency_luxury.dmm diff --git a/_maps/shuttles/emergency_medisim.dmm b/_maps/shuttles/emergency/emergency_medisim.dmm similarity index 100% rename from _maps/shuttles/emergency_medisim.dmm rename to _maps/shuttles/emergency/emergency_medisim.dmm diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency/emergency_meta.dmm similarity index 100% rename from _maps/shuttles/emergency_meta.dmm rename to _maps/shuttles/emergency/emergency_meta.dmm diff --git a/_maps/shuttles/emergency_meteor.dmm b/_maps/shuttles/emergency/emergency_meteor.dmm similarity index 100% rename from _maps/shuttles/emergency_meteor.dmm rename to _maps/shuttles/emergency/emergency_meteor.dmm diff --git a/_maps/shuttles/emergency_mini.dmm b/_maps/shuttles/emergency/emergency_mini.dmm similarity index 100% rename from _maps/shuttles/emergency_mini.dmm rename to _maps/shuttles/emergency/emergency_mini.dmm diff --git a/_maps/shuttles/emergency_monastery.dmm b/_maps/shuttles/emergency/emergency_monastery.dmm similarity index 100% rename from _maps/shuttles/emergency_monastery.dmm rename to _maps/shuttles/emergency/emergency_monastery.dmm diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency/emergency_narnar.dmm similarity index 100% rename from _maps/shuttles/emergency_narnar.dmm rename to _maps/shuttles/emergency/emergency_narnar.dmm diff --git a/_maps/shuttles/emergency_nature.dmm b/_maps/shuttles/emergency/emergency_nature.dmm similarity index 100% rename from _maps/shuttles/emergency_nature.dmm rename to _maps/shuttles/emergency/emergency_nature.dmm diff --git a/_maps/shuttles/emergency_nebula.dmm b/_maps/shuttles/emergency/emergency_nebula.dmm similarity index 100% rename from _maps/shuttles/emergency_nebula.dmm rename to _maps/shuttles/emergency/emergency_nebula.dmm diff --git a/_maps/shuttles/emergency_northstar.dmm b/_maps/shuttles/emergency/emergency_northstar.dmm similarity index 100% rename from _maps/shuttles/emergency_northstar.dmm rename to _maps/shuttles/emergency/emergency_northstar.dmm diff --git a/_maps/shuttles/emergency_omega.dmm b/_maps/shuttles/emergency/emergency_omega.dmm similarity index 100% rename from _maps/shuttles/emergency_omega.dmm rename to _maps/shuttles/emergency/emergency_omega.dmm diff --git a/_maps/shuttles/emergency_pod.dmm b/_maps/shuttles/emergency/emergency_pod.dmm similarity index 100% rename from _maps/shuttles/emergency_pod.dmm rename to _maps/shuttles/emergency/emergency_pod.dmm diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency/emergency_pubby.dmm similarity index 100% rename from _maps/shuttles/emergency_pubby.dmm rename to _maps/shuttles/emergency/emergency_pubby.dmm diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency/emergency_raven.dmm similarity index 100% rename from _maps/shuttles/emergency_raven.dmm rename to _maps/shuttles/emergency/emergency_raven.dmm diff --git a/_maps/shuttles/emergency_rollerdome.dmm b/_maps/shuttles/emergency/emergency_rollerdome.dmm similarity index 100% rename from _maps/shuttles/emergency_rollerdome.dmm rename to _maps/shuttles/emergency/emergency_rollerdome.dmm diff --git a/_maps/shuttles/emergency_russiafightpit.dmm b/_maps/shuttles/emergency/emergency_russiafightpit.dmm similarity index 100% rename from _maps/shuttles/emergency_russiafightpit.dmm rename to _maps/shuttles/emergency/emergency_russiafightpit.dmm diff --git a/_maps/shuttles/emergency_scrapheap.dmm b/_maps/shuttles/emergency/emergency_scrapheap.dmm similarity index 100% rename from _maps/shuttles/emergency_scrapheap.dmm rename to _maps/shuttles/emergency/emergency_scrapheap.dmm diff --git a/_maps/shuttles/emergency_scrapheap/classic1.dmm b/_maps/shuttles/emergency/emergency_scrapheap/classic1.dmm similarity index 100% rename from _maps/shuttles/emergency_scrapheap/classic1.dmm rename to _maps/shuttles/emergency/emergency_scrapheap/classic1.dmm diff --git a/_maps/shuttles/emergency_scrapheap/classic2.dmm b/_maps/shuttles/emergency/emergency_scrapheap/classic2.dmm similarity index 100% rename from _maps/shuttles/emergency_scrapheap/classic2.dmm rename to _maps/shuttles/emergency/emergency_scrapheap/classic2.dmm diff --git a/_maps/shuttles/emergency_scrapheap/classic_aft1.dmm b/_maps/shuttles/emergency/emergency_scrapheap/classic_aft1.dmm similarity index 100% rename from _maps/shuttles/emergency_scrapheap/classic_aft1.dmm rename to _maps/shuttles/emergency/emergency_scrapheap/classic_aft1.dmm diff --git a/_maps/shuttles/emergency_scrapheap/classic_aft2.dmm b/_maps/shuttles/emergency/emergency_scrapheap/classic_aft2.dmm similarity index 100% rename from _maps/shuttles/emergency_scrapheap/classic_aft2.dmm rename to _maps/shuttles/emergency/emergency_scrapheap/classic_aft2.dmm diff --git a/_maps/shuttles/emergency_scrapheap/classic_aft3.dmm b/_maps/shuttles/emergency/emergency_scrapheap/classic_aft3.dmm similarity index 100% rename from _maps/shuttles/emergency_scrapheap/classic_aft3.dmm rename to _maps/shuttles/emergency/emergency_scrapheap/classic_aft3.dmm diff --git a/_maps/shuttles/emergency_scrapheap/classic_fore1.dmm b/_maps/shuttles/emergency/emergency_scrapheap/classic_fore1.dmm similarity index 100% rename from _maps/shuttles/emergency_scrapheap/classic_fore1.dmm rename to _maps/shuttles/emergency/emergency_scrapheap/classic_fore1.dmm diff --git a/_maps/shuttles/emergency_scrapheap/classic_fore2.dmm b/_maps/shuttles/emergency/emergency_scrapheap/classic_fore2.dmm similarity index 100% rename from _maps/shuttles/emergency_scrapheap/classic_fore2.dmm rename to _maps/shuttles/emergency/emergency_scrapheap/classic_fore2.dmm diff --git a/_maps/shuttles/emergency_scrapheap/classic_fore3.dmm b/_maps/shuttles/emergency/emergency_scrapheap/classic_fore3.dmm similarity index 100% rename from _maps/shuttles/emergency_scrapheap/classic_fore3.dmm rename to _maps/shuttles/emergency/emergency_scrapheap/classic_fore3.dmm diff --git a/_maps/shuttles/emergency_scrapheap/classic_starboard1.dmm b/_maps/shuttles/emergency/emergency_scrapheap/classic_starboard1.dmm similarity index 100% rename from _maps/shuttles/emergency_scrapheap/classic_starboard1.dmm rename to _maps/shuttles/emergency/emergency_scrapheap/classic_starboard1.dmm diff --git a/_maps/shuttles/emergency_scrapheap/classic_starboard2.dmm b/_maps/shuttles/emergency/emergency_scrapheap/classic_starboard2.dmm similarity index 100% rename from _maps/shuttles/emergency_scrapheap/classic_starboard2.dmm rename to _maps/shuttles/emergency/emergency_scrapheap/classic_starboard2.dmm diff --git a/_maps/shuttles/emergency_shadow.dmm b/_maps/shuttles/emergency/emergency_shadow.dmm similarity index 100% rename from _maps/shuttles/emergency_shadow.dmm rename to _maps/shuttles/emergency/emergency_shadow.dmm diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency/emergency_supermatter.dmm similarity index 100% rename from _maps/shuttles/emergency_supermatter.dmm rename to _maps/shuttles/emergency/emergency_supermatter.dmm diff --git a/_maps/shuttles/emergency_tram.dmm b/_maps/shuttles/emergency/emergency_tram.dmm similarity index 100% rename from _maps/shuttles/emergency_tram.dmm rename to _maps/shuttles/emergency/emergency_tram.dmm diff --git a/_maps/shuttles/emergency_tranquility.dmm b/_maps/shuttles/emergency/emergency_tranquility.dmm similarity index 100% rename from _maps/shuttles/emergency_tranquility.dmm rename to _maps/shuttles/emergency/emergency_tranquility.dmm diff --git a/_maps/shuttles/emergency_venture.dmm b/_maps/shuttles/emergency/emergency_venture.dmm similarity index 100% rename from _maps/shuttles/emergency_venture.dmm rename to _maps/shuttles/emergency/emergency_venture.dmm diff --git a/_maps/shuttles/emergency_wabbajack.dmm b/_maps/shuttles/emergency/emergency_wabbajack.dmm similarity index 100% rename from _maps/shuttles/emergency_wabbajack.dmm rename to _maps/shuttles/emergency/emergency_wabbajack.dmm diff --git a/_maps/shuttles/emergency_wawa.dmm b/_maps/shuttles/emergency/emergency_wawa.dmm similarity index 100% rename from _maps/shuttles/emergency_wawa.dmm rename to _maps/shuttles/emergency/emergency_wawa.dmm diff --git a/_maps/shuttles/emergency_zeta.dmm b/_maps/shuttles/emergency/emergency_zeta.dmm similarity index 100% rename from _maps/shuttles/emergency_zeta.dmm rename to _maps/shuttles/emergency/emergency_zeta.dmm diff --git a/_maps/shuttles/escape_pod_cramped.dmm b/_maps/shuttles/escape_pod/escape_pod_cramped.dmm similarity index 100% rename from _maps/shuttles/escape_pod_cramped.dmm rename to _maps/shuttles/escape_pod/escape_pod_cramped.dmm diff --git a/_maps/shuttles/escape_pod_default.dmm b/_maps/shuttles/escape_pod/escape_pod_default.dmm similarity index 100% rename from _maps/shuttles/escape_pod_default.dmm rename to _maps/shuttles/escape_pod/escape_pod_default.dmm diff --git a/_maps/shuttles/escape_pod_large.dmm b/_maps/shuttles/escape_pod/escape_pod_large.dmm similarity index 100% rename from _maps/shuttles/escape_pod_large.dmm rename to _maps/shuttles/escape_pod/escape_pod_large.dmm diff --git a/_maps/shuttles/escape_pod_luxury.dmm b/_maps/shuttles/escape_pod/escape_pod_luxury.dmm similarity index 100% rename from _maps/shuttles/escape_pod_luxury.dmm rename to _maps/shuttles/escape_pod/escape_pod_luxury.dmm diff --git a/_maps/shuttles/ferry_base.dmm b/_maps/shuttles/ferry/ferry_base.dmm similarity index 100% rename from _maps/shuttles/ferry_base.dmm rename to _maps/shuttles/ferry/ferry_base.dmm diff --git a/_maps/shuttles/ferry_fancy.dmm b/_maps/shuttles/ferry/ferry_fancy.dmm similarity index 100% rename from _maps/shuttles/ferry_fancy.dmm rename to _maps/shuttles/ferry/ferry_fancy.dmm diff --git a/_maps/shuttles/ferry_kilo.dmm b/_maps/shuttles/ferry/ferry_kilo.dmm similarity index 100% rename from _maps/shuttles/ferry_kilo.dmm rename to _maps/shuttles/ferry/ferry_kilo.dmm diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry/ferry_lighthouse.dmm similarity index 100% rename from _maps/shuttles/ferry_lighthouse.dmm rename to _maps/shuttles/ferry/ferry_lighthouse.dmm diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry/ferry_meat.dmm similarity index 100% rename from _maps/shuttles/ferry_meat.dmm rename to _maps/shuttles/ferry/ferry_meat.dmm diff --git a/_maps/shuttles/ferry_nebula.dmm b/_maps/shuttles/ferry/ferry_nebula.dmm similarity index 100% rename from _maps/shuttles/ferry_nebula.dmm rename to _maps/shuttles/ferry/ferry_nebula.dmm diff --git a/_maps/shuttles/hunter_bounty.dmm b/_maps/shuttles/hunter/hunter_bounty.dmm similarity index 100% rename from _maps/shuttles/hunter_bounty.dmm rename to _maps/shuttles/hunter/hunter_bounty.dmm diff --git a/_maps/shuttles/hunter_mi13_foodtruck.dmm b/_maps/shuttles/hunter/hunter_mi13_foodtruck.dmm similarity index 100% rename from _maps/shuttles/hunter_mi13_foodtruck.dmm rename to _maps/shuttles/hunter/hunter_mi13_foodtruck.dmm diff --git a/_maps/shuttles/hunter_psyker.dmm b/_maps/shuttles/hunter/hunter_psyker.dmm similarity index 100% rename from _maps/shuttles/hunter_psyker.dmm rename to _maps/shuttles/hunter/hunter_psyker.dmm diff --git a/_maps/shuttles/hunter_russian.dmm b/_maps/shuttles/hunter/hunter_russian.dmm similarity index 100% rename from _maps/shuttles/hunter_russian.dmm rename to _maps/shuttles/hunter/hunter_russian.dmm diff --git a/_maps/shuttles/hunter_space_cop.dmm b/_maps/shuttles/hunter/hunter_space_cop.dmm similarity index 100% rename from _maps/shuttles/hunter_space_cop.dmm rename to _maps/shuttles/hunter/hunter_space_cop.dmm diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator/infiltrator_advanced.dmm similarity index 100% rename from _maps/shuttles/infiltrator_advanced.dmm rename to _maps/shuttles/infiltrator/infiltrator_advanced.dmm diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator/infiltrator_basic.dmm similarity index 100% rename from _maps/shuttles/infiltrator_basic.dmm rename to _maps/shuttles/infiltrator/infiltrator_basic.dmm diff --git a/_maps/shuttles/infiltrator_clown.dmm b/_maps/shuttles/infiltrator/infiltrator_clown.dmm similarity index 100% rename from _maps/shuttles/infiltrator_clown.dmm rename to _maps/shuttles/infiltrator/infiltrator_clown.dmm diff --git a/_maps/shuttles/labour_box.dmm b/_maps/shuttles/labour/labour_box.dmm similarity index 100% rename from _maps/shuttles/labour_box.dmm rename to _maps/shuttles/labour/labour_box.dmm diff --git a/_maps/shuttles/labour_delta.dmm b/_maps/shuttles/labour/labour_delta.dmm similarity index 100% rename from _maps/shuttles/labour_delta.dmm rename to _maps/shuttles/labour/labour_delta.dmm diff --git a/_maps/shuttles/labour_generic.dmm b/_maps/shuttles/labour/labour_generic.dmm similarity index 100% rename from _maps/shuttles/labour_generic.dmm rename to _maps/shuttles/labour/labour_generic.dmm diff --git a/_maps/shuttles/labour_kilo.dmm b/_maps/shuttles/labour/labour_kilo.dmm similarity index 100% rename from _maps/shuttles/labour_kilo.dmm rename to _maps/shuttles/labour/labour_kilo.dmm diff --git a/_maps/shuttles/labour_nebula.dmm b/_maps/shuttles/labour/labour_nebula.dmm similarity index 100% rename from _maps/shuttles/labour_nebula.dmm rename to _maps/shuttles/labour/labour_nebula.dmm diff --git a/_maps/shuttles/mining_box.dmm b/_maps/shuttles/mining/mining_box.dmm similarity index 100% rename from _maps/shuttles/mining_box.dmm rename to _maps/shuttles/mining/mining_box.dmm diff --git a/_maps/shuttles/mining_common_kilo.dmm b/_maps/shuttles/mining/mining_common_kilo.dmm similarity index 100% rename from _maps/shuttles/mining_common_kilo.dmm rename to _maps/shuttles/mining/mining_common_kilo.dmm diff --git a/_maps/shuttles/mining_common_meta.dmm b/_maps/shuttles/mining/mining_common_meta.dmm similarity index 100% rename from _maps/shuttles/mining_common_meta.dmm rename to _maps/shuttles/mining/mining_common_meta.dmm diff --git a/_maps/shuttles/mining_common_northstar.dmm b/_maps/shuttles/mining/mining_common_northstar.dmm similarity index 100% rename from _maps/shuttles/mining_common_northstar.dmm rename to _maps/shuttles/mining/mining_common_northstar.dmm diff --git a/_maps/shuttles/mining_delta.dmm b/_maps/shuttles/mining/mining_delta.dmm similarity index 100% rename from _maps/shuttles/mining_delta.dmm rename to _maps/shuttles/mining/mining_delta.dmm diff --git a/_maps/shuttles/mining_freight.dmm b/_maps/shuttles/mining/mining_freight.dmm similarity index 100% rename from _maps/shuttles/mining_freight.dmm rename to _maps/shuttles/mining/mining_freight.dmm diff --git a/_maps/shuttles/mining_kilo.dmm b/_maps/shuttles/mining/mining_kilo.dmm similarity index 100% rename from _maps/shuttles/mining_kilo.dmm rename to _maps/shuttles/mining/mining_kilo.dmm diff --git a/_maps/shuttles/mining_large.dmm b/_maps/shuttles/mining/mining_large.dmm similarity index 100% rename from _maps/shuttles/mining_large.dmm rename to _maps/shuttles/mining/mining_large.dmm diff --git a/_maps/shuttles/mining_nebula.dmm b/_maps/shuttles/mining/mining_nebula.dmm similarity index 100% rename from _maps/shuttles/mining_nebula.dmm rename to _maps/shuttles/mining/mining_nebula.dmm diff --git a/_maps/shuttles/mining_northstar.dmm b/_maps/shuttles/mining/mining_northstar.dmm similarity index 100% rename from _maps/shuttles/mining_northstar.dmm rename to _maps/shuttles/mining/mining_northstar.dmm diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate/pirate_default.dmm similarity index 100% rename from _maps/shuttles/pirate_default.dmm rename to _maps/shuttles/pirate/pirate_default.dmm diff --git a/_maps/shuttles/pirate_dutchman.dmm b/_maps/shuttles/pirate/pirate_dutchman.dmm similarity index 100% rename from _maps/shuttles/pirate_dutchman.dmm rename to _maps/shuttles/pirate/pirate_dutchman.dmm diff --git a/_maps/shuttles/pirate_ex_interdyne.dmm b/_maps/shuttles/pirate/pirate_ex_interdyne.dmm similarity index 100% rename from _maps/shuttles/pirate_ex_interdyne.dmm rename to _maps/shuttles/pirate/pirate_ex_interdyne.dmm diff --git a/_maps/shuttles/pirate_geode.dmm b/_maps/shuttles/pirate/pirate_geode.dmm similarity index 100% rename from _maps/shuttles/pirate_geode.dmm rename to _maps/shuttles/pirate/pirate_geode.dmm diff --git a/_maps/shuttles/pirate_grey.dmm b/_maps/shuttles/pirate/pirate_grey.dmm similarity index 100% rename from _maps/shuttles/pirate_grey.dmm rename to _maps/shuttles/pirate/pirate_grey.dmm diff --git a/_maps/shuttles/pirate_irs.dmm b/_maps/shuttles/pirate/pirate_irs.dmm similarity index 100% rename from _maps/shuttles/pirate_irs.dmm rename to _maps/shuttles/pirate/pirate_irs.dmm diff --git a/_maps/shuttles/pirate_medieval.dmm b/_maps/shuttles/pirate/pirate_medieval.dmm similarity index 100% rename from _maps/shuttles/pirate_medieval.dmm rename to _maps/shuttles/pirate/pirate_medieval.dmm diff --git a/_maps/shuttles/pirate_silverscale.dmm b/_maps/shuttles/pirate/pirate_silverscale.dmm similarity index 100% rename from _maps/shuttles/pirate_silverscale.dmm rename to _maps/shuttles/pirate/pirate_silverscale.dmm diff --git a/_maps/shuttles/ruin_caravan_victim.dmm b/_maps/shuttles/ruin/ruin_caravan_victim.dmm similarity index 100% rename from _maps/shuttles/ruin_caravan_victim.dmm rename to _maps/shuttles/ruin/ruin_caravan_victim.dmm diff --git a/_maps/shuttles/ruin_cyborg_mothership.dmm b/_maps/shuttles/ruin/ruin_cyborg_mothership.dmm similarity index 100% rename from _maps/shuttles/ruin_cyborg_mothership.dmm rename to _maps/shuttles/ruin/ruin_cyborg_mothership.dmm diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin/ruin_pirate_cutter.dmm similarity index 100% rename from _maps/shuttles/ruin_pirate_cutter.dmm rename to _maps/shuttles/ruin/ruin_pirate_cutter.dmm diff --git a/_maps/shuttles/ruin_syndicate_dropship.dmm b/_maps/shuttles/ruin/ruin_syndicate_dropship.dmm similarity index 100% rename from _maps/shuttles/ruin_syndicate_dropship.dmm rename to _maps/shuttles/ruin/ruin_syndicate_dropship.dmm diff --git a/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm b/_maps/shuttles/ruin/ruin_syndicate_fighter_shiv.dmm similarity index 100% rename from _maps/shuttles/ruin_syndicate_fighter_shiv.dmm rename to _maps/shuttles/ruin/ruin_syndicate_fighter_shiv.dmm diff --git a/_maps/shuttles/starfury_corvette.dmm b/_maps/shuttles/starfury/starfury_corvette.dmm similarity index 100% rename from _maps/shuttles/starfury_corvette.dmm rename to _maps/shuttles/starfury/starfury_corvette.dmm diff --git a/_maps/shuttles/starfury_fighter1.dmm b/_maps/shuttles/starfury/starfury_fighter1.dmm similarity index 100% rename from _maps/shuttles/starfury_fighter1.dmm rename to _maps/shuttles/starfury/starfury_fighter1.dmm diff --git a/_maps/shuttles/starfury_fighter2.dmm b/_maps/shuttles/starfury/starfury_fighter2.dmm similarity index 100% rename from _maps/shuttles/starfury_fighter2.dmm rename to _maps/shuttles/starfury/starfury_fighter2.dmm diff --git a/_maps/shuttles/starfury_fighter3.dmm b/_maps/shuttles/starfury/starfury_fighter3.dmm similarity index 100% rename from _maps/shuttles/starfury_fighter3.dmm rename to _maps/shuttles/starfury/starfury_fighter3.dmm diff --git a/_maps/shuttles/whiteship_birdshot.dmm b/_maps/shuttles/whiteship/whiteship_birdshot.dmm similarity index 100% rename from _maps/shuttles/whiteship_birdshot.dmm rename to _maps/shuttles/whiteship/whiteship_birdshot.dmm diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship/whiteship_box.dmm similarity index 100% rename from _maps/shuttles/whiteship_box.dmm rename to _maps/shuttles/whiteship/whiteship_box.dmm diff --git a/_maps/shuttles/whiteship_cere.dmm b/_maps/shuttles/whiteship/whiteship_cere.dmm similarity index 100% rename from _maps/shuttles/whiteship_cere.dmm rename to _maps/shuttles/whiteship/whiteship_cere.dmm diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship/whiteship_delta.dmm similarity index 100% rename from _maps/shuttles/whiteship_delta.dmm rename to _maps/shuttles/whiteship/whiteship_delta.dmm diff --git a/_maps/shuttles/whiteship_donut.dmm b/_maps/shuttles/whiteship/whiteship_donut.dmm similarity index 100% rename from _maps/shuttles/whiteship_donut.dmm rename to _maps/shuttles/whiteship/whiteship_donut.dmm diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship/whiteship_kilo.dmm similarity index 100% rename from _maps/shuttles/whiteship_kilo.dmm rename to _maps/shuttles/whiteship/whiteship_kilo.dmm diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship/whiteship_meta.dmm similarity index 100% rename from _maps/shuttles/whiteship_meta.dmm rename to _maps/shuttles/whiteship/whiteship_meta.dmm diff --git a/_maps/shuttles/whiteship_obelisk.dmm b/_maps/shuttles/whiteship/whiteship_obelisk.dmm similarity index 100% rename from _maps/shuttles/whiteship_obelisk.dmm rename to _maps/shuttles/whiteship/whiteship_obelisk.dmm diff --git a/_maps/shuttles/whiteship_personalshuttle.dmm b/_maps/shuttles/whiteship/whiteship_personalshuttle.dmm similarity index 100% rename from _maps/shuttles/whiteship_personalshuttle.dmm rename to _maps/shuttles/whiteship/whiteship_personalshuttle.dmm diff --git a/_maps/shuttles/whiteship_pubby.dmm b/_maps/shuttles/whiteship/whiteship_pubby.dmm similarity index 100% rename from _maps/shuttles/whiteship_pubby.dmm rename to _maps/shuttles/whiteship/whiteship_pubby.dmm diff --git a/_maps/shuttles/whiteship_tram.dmm b/_maps/shuttles/whiteship/whiteship_tram.dmm similarity index 100% rename from _maps/shuttles/whiteship_tram.dmm rename to _maps/shuttles/whiteship/whiteship_tram.dmm diff --git a/code/datums/shuttles/arrival.dm b/code/datums/shuttles/arrival.dm index 38cb67fa1d7..b020295b5fb 100644 --- a/code/datums/shuttles/arrival.dm +++ b/code/datums/shuttles/arrival.dm @@ -1,5 +1,6 @@ /datum/map_template/shuttle/arrival port_id = "arrival" + prefix = "_maps/shuttles/arrival/" who_can_purchase = null /datum/map_template/shuttle/arrival/box diff --git a/code/datums/shuttles/aux_base.dm b/code/datums/shuttles/aux_base.dm index c377e278b90..1f6600456bd 100644 --- a/code/datums/shuttles/aux_base.dm +++ b/code/datums/shuttles/aux_base.dm @@ -1,5 +1,6 @@ /datum/map_template/shuttle/aux_base port_id = "aux_base" + prefix = "_maps/shuttles/aux_base/" who_can_purchase = null /datum/map_template/shuttle/aux_base/default diff --git a/code/datums/shuttles/cargo.dm b/code/datums/shuttles/cargo.dm index b3fadeaaa75..ba0e1bfd223 100644 --- a/code/datums/shuttles/cargo.dm +++ b/code/datums/shuttles/cargo.dm @@ -1,5 +1,6 @@ /datum/map_template/shuttle/cargo port_id = "cargo" + prefix = "_maps/shuttles/cargo/" name = "Base Shuttle Template (Cargo)" who_can_purchase = null diff --git a/code/datums/shuttles/emergency.dm b/code/datums/shuttles/emergency.dm index 6197afc9a3f..aeb896e54de 100644 --- a/code/datums/shuttles/emergency.dm +++ b/code/datums/shuttles/emergency.dm @@ -3,6 +3,7 @@ /datum/map_template/shuttle/emergency port_id = "emergency" name = "Base Shuttle Template (Emergency)" + prefix = "_maps/shuttles/emergency/" ///assoc list of shuttle events to add to this shuttle on spawn (typepath = weight) var/list/events ///pick all events instead of random diff --git a/code/datums/shuttles/escape_pod.dm b/code/datums/shuttles/escape_pod.dm index 0b2f35dd9dd..250e0841540 100644 --- a/code/datums/shuttles/escape_pod.dm +++ b/code/datums/shuttles/escape_pod.dm @@ -1,5 +1,6 @@ /datum/map_template/shuttle/escape_pod port_id = "escape_pod" + prefix = "_maps/shuttles/escape_pod/" who_can_purchase = null /datum/map_template/shuttle/escape_pod/default diff --git a/code/datums/shuttles/ferry.dm b/code/datums/shuttles/ferry.dm index f9c5841abf3..aa874f1b19b 100644 --- a/code/datums/shuttles/ferry.dm +++ b/code/datums/shuttles/ferry.dm @@ -1,5 +1,6 @@ /datum/map_template/shuttle/ferry port_id = "ferry" + prefix = "_maps/shuttles/ferry/" name = "Base Shuttle Template (Ferry)" /datum/map_template/shuttle/ferry/base diff --git a/code/datums/shuttles/hunter.dm b/code/datums/shuttles/hunter.dm index ade978c937e..140388398ea 100644 --- a/code/datums/shuttles/hunter.dm +++ b/code/datums/shuttles/hunter.dm @@ -1,5 +1,6 @@ /datum/map_template/shuttle/hunter port_id = "hunter" + prefix = "_maps/shuttles/hunter/" who_can_purchase = null /datum/map_template/shuttle/hunter/space_cop diff --git a/code/datums/shuttles/infiltrator.dm b/code/datums/shuttles/infiltrator.dm index 414dcb5129f..a892736048b 100644 --- a/code/datums/shuttles/infiltrator.dm +++ b/code/datums/shuttles/infiltrator.dm @@ -1,5 +1,6 @@ /datum/map_template/shuttle/infiltrator port_id = "infiltrator" + prefix = "_maps/shuttles/infiltrator/" who_can_purchase = null /datum/map_template/shuttle/infiltrator/basic diff --git a/code/datums/shuttles/labour.dm b/code/datums/shuttles/labour.dm new file mode 100644 index 00000000000..e8bbdecaeba --- /dev/null +++ b/code/datums/shuttles/labour.dm @@ -0,0 +1,24 @@ +/datum/map_template/shuttle/labour + port_id = "labour" + prefix = "_maps/shuttles/labour/" + who_can_purchase = null + +/datum/map_template/shuttle/labour/box + suffix = "box" + name = "labour shuttle (Box)" + +/datum/map_template/shuttle/labour/generic + suffix = "generic" + name = "labour shuttle (Generic)" + +/datum/map_template/shuttle/labour/delta + suffix = "delta" + name = "labour shuttle (Delta)" + +/datum/map_template/shuttle/labour/kilo + suffix = "kilo" + name = "labour shuttle (Kilo)" + +/datum/map_template/shuttle/labour/nebula + suffix = "nebula" + name = "labour shuttle (Nebula)" diff --git a/code/datums/shuttles/mining.dm b/code/datums/shuttles/mining.dm index 21747a488e3..276797b5f52 100644 --- a/code/datums/shuttles/mining.dm +++ b/code/datums/shuttles/mining.dm @@ -1,31 +1,7 @@ -// LABOUR SHUTTLES -/datum/map_template/shuttle/labour - port_id = "labour" - who_can_purchase = null - -/datum/map_template/shuttle/labour/box - suffix = "box" - name = "labour shuttle (Box)" - -/datum/map_template/shuttle/labour/generic - suffix = "generic" - name = "labour shuttle (Generic)" - -/datum/map_template/shuttle/labour/delta - suffix = "delta" - name = "labour shuttle (Delta)" - -/datum/map_template/shuttle/labour/kilo - suffix = "kilo" - name = "labour shuttle (Kilo)" - -/datum/map_template/shuttle/labour/nebula - suffix = "nebula" - name = "labour shuttle (Nebula)" - // MINING SHUTTLES /datum/map_template/shuttle/mining port_id = "mining" + prefix = "_maps/shuttles/mining/" who_can_purchase = null /datum/map_template/shuttle/mining/box @@ -55,6 +31,7 @@ // MINING COMMON SHUTTLES /datum/map_template/shuttle/mining_common port_id = "mining_common" + prefix = "_maps/shuttles/mining/" who_can_purchase = null /datum/map_template/shuttle/mining_common/meta diff --git a/code/datums/shuttles/pirate.dm b/code/datums/shuttles/pirate.dm index 99f866d23fc..62c6e97f37a 100644 --- a/code/datums/shuttles/pirate.dm +++ b/code/datums/shuttles/pirate.dm @@ -1,5 +1,6 @@ /datum/map_template/shuttle/pirate port_id = "pirate" + prefix = "_maps/shuttles/pirate/" who_can_purchase = null /datum/map_template/shuttle/pirate/default diff --git a/code/datums/shuttles/ruin.dm b/code/datums/shuttles/ruin.dm index 511e2d6ecdc..1163909458d 100644 --- a/code/datums/shuttles/ruin.dm +++ b/code/datums/shuttles/ruin.dm @@ -1,5 +1,6 @@ /datum/map_template/shuttle/ruin port_id = "ruin" + prefix = "_maps/shuttles/ruin/" who_can_purchase = null /datum/map_template/shuttle/ruin/cyborg_mothership diff --git a/code/datums/shuttles/starfury.dm b/code/datums/shuttles/starfury.dm index 510033d6436..85bf00b97c9 100644 --- a/code/datums/shuttles/starfury.dm +++ b/code/datums/shuttles/starfury.dm @@ -1,5 +1,6 @@ /datum/map_template/shuttle/starfury port_id = "starfury" + prefix = "_maps/shuttles/starfury/" who_can_purchase = null /datum/map_template/shuttle/starfury/fighter_one diff --git a/code/datums/shuttles/whiteship.dm b/code/datums/shuttles/whiteship.dm index b8dbcfd4bd7..86743a25afc 100644 --- a/code/datums/shuttles/whiteship.dm +++ b/code/datums/shuttles/whiteship.dm @@ -1,5 +1,6 @@ /datum/map_template/shuttle/whiteship port_id = "whiteship" + prefix = "_maps/shuttles/whiteship/" /datum/map_template/shuttle/whiteship/box suffix = "box" diff --git a/strings/modular_maps/emergency_scrapheap.toml b/strings/modular_maps/emergency_scrapheap.toml index 6372704b704..e6c56d82ffc 100644 --- a/strings/modular_maps/emergency_scrapheap.toml +++ b/strings/modular_maps/emergency_scrapheap.toml @@ -1,4 +1,4 @@ -directory = "_maps/shuttles/emergency_scrapheap/" +directory = "_maps/shuttles/emergency/emergency_scrapheap/" [rooms.shuttle] modules = ["classic1.dmm", "classic2.dmm"] diff --git a/tgstation.dme b/tgstation.dme index e17c81ab8be..68072b4f464 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2038,6 +2038,7 @@ #include "code\datums\shuttles\ferry.dm" #include "code\datums\shuttles\hunter.dm" #include "code\datums\shuttles\infiltrator.dm" +#include "code\datums\shuttles\labour.dm" #include "code\datums\shuttles\mining.dm" #include "code\datums\shuttles\pirate.dm" #include "code\datums\shuttles\ruin.dm" diff --git a/tools/maplint/lints/area_noop.yml b/tools/maplint/lints/area_noop.yml index c751e85381b..fedfffd5040 100644 --- a/tools/maplint/lints/area_noop.yml +++ b/tools/maplint/lints/area_noop.yml @@ -9,7 +9,7 @@ skip_files: - _maps/map_files/tramstation/maintenance_modules - _maps/modular_generic - - _maps/shuttles/emergency_scrapheap + - _maps/shuttles/emergency/emergency_scrapheap - _maps/templates - _maps/minigame/deathmatch/OSHA_Violator.dmm - _maps/minigame/deathmatch/maint_mania.dmm From 6666e36b842712db3657fed1330ea4082e1f0711 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 20:34:52 +0000 Subject: [PATCH 035/126] Automatic changelog for PR #96430 [ci skip] --- html/changelogs/AutoChangeLog-pr-96430.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96430.yml diff --git a/html/changelogs/AutoChangeLog-pr-96430.yml b/html/changelogs/AutoChangeLog-pr-96430.yml new file mode 100644 index 00000000000..92064848edc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96430.yml @@ -0,0 +1,4 @@ +author: "timothymtorres" +delete-after: True +changes: + - code_imp: "Reorganize shuttle maps into separate folders" \ No newline at end of file From 3d4f97ad561b1d0146c139d8abf0041ac7ccb7a4 Mon Sep 17 00:00:00 2001 From: FlufflesTheDog Date: Fri, 12 Jun 2026 13:35:23 -0700 Subject: [PATCH 036/126] Maploading cleans up empty areas (#96451) ## About The Pull Request Adds a check that, when loading a map file, deletes any areas which no longer contain any turfs. A similar check exists in the proc for manually adding/extending areas. This is important because it is assumed that when accessing an initialized unique area eg from areas_by_type, that it will have turfs. ## Why It's Good For The Game fixbug ## Changelog Not player facing --- code/modules/mapping/reader.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index fcb5b445b41..e27984b5523 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -933,6 +933,8 @@ GLOBAL_LIST_EMPTY(map_model_default) old_area.turfs_to_uncontain_by_zlevel[crds.z] += crds area_instance.turfs_by_zlevel[crds.z] += crds area_instance.contents.Add(crds) + if(!isnull(old_area) && !old_area.has_contained_turfs()) + qdel(old_area) if(GLOB.use_preloader) world.preloader_load(area_instance) From e32f733c9fd56f49a7ef58ffb6e4d342503ab51e Mon Sep 17 00:00:00 2001 From: Lucy Date: Fri, 12 Jun 2026 18:48:33 -0400 Subject: [PATCH 037/126] adds a sound preview button to the emote panel (#96383) ## About The Pull Request This adds a button next to sound emotes in the emote panel, allowing you to preview the emote sound without actually having to do said emote. The sound just plays for the user - nobody else hears it, it's just a `SEND_SOUND` https://github.com/user-attachments/assets/d4774769-c4ff-4d2a-98c9-2c8095b66998 (im not sure how nicely to fix that issue with the "Gasp (Shock)" button, tho) also cleaned up emote panel tgui a bit. ## Why It's Good For The Game Makes it easier to know what emote sounds like what without confusing people about why you're making 50 different sounds lol ## Changelog :cl: qol: You can now preview what different emotes sound like via the emote panel. /:cl: --- code/modules/emote_panel/emote_panel.dm | 12 ++ tgui/packages/tgui/interfaces/EmotePanel.tsx | 182 ++++++++++++------- 2 files changed, 131 insertions(+), 63 deletions(-) diff --git a/code/modules/emote_panel/emote_panel.dm b/code/modules/emote_panel/emote_panel.dm index c39631fbe3c..194ce6d3a4c 100644 --- a/code/modules/emote_panel/emote_panel.dm +++ b/code/modules/emote_panel/emote_panel.dm @@ -44,11 +44,23 @@ if(emote.message_param && use_params) emote_param = tgui_input_text(ui.user, "Add params to the emote...", emote.message_param, max_length = MAX_MESSAGE_LEN) ui.user.emote(emote_key, message = emote_param, intentional = TRUE) + if("preview_sound") + var/emote_key = params["emote_key"] + if(isnull(emote_key) || !GLOB.emote_list[emote_key]) + return + var/datum/emote/emote = GLOB.emote_list[emote_key][1] + var/emote_sound = get_sfx(emote.get_sound(ui.user)) + if(!emote_sound) + to_chat(ui.user, span_warning("Couldn't get a preview sound for [emote.name]."), type = MESSAGE_TYPE_INFO) + return + SEND_SOUND(ui.user, sound(emote_sound, volume = 75)) + to_chat(ui.user, span_warning("Previewed sound for [emote.name]."), type = MESSAGE_TYPE_INFO) /datum/emote_panel/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "EmotePanel") + ui.set_autoupdate(FALSE) ui.open() /datum/emote_panel/ui_state(mob/user) diff --git a/tgui/packages/tgui/interfaces/EmotePanel.tsx b/tgui/packages/tgui/interfaces/EmotePanel.tsx index 674f0ec4823..227c96e64f2 100644 --- a/tgui/packages/tgui/interfaces/EmotePanel.tsx +++ b/tgui/packages/tgui/interfaces/EmotePanel.tsx @@ -1,5 +1,5 @@ -import { useState } from 'react'; -import { Box, Button, Flex, Icon, Section } from 'tgui-core/components'; +import { useMemo, useState } from 'react'; +import { Box, Button, Flex, Icon, Section, Stack } from 'tgui-core/components'; import type { BooleanLike } from 'tgui-core/react'; import { capitalizeFirst } from 'tgui-core/string'; @@ -43,6 +43,34 @@ export const EmotePanelContent = (props) => { const [showIcons, toggleShowIcons] = useState(false); + const filteredEmotes = useMemo( + () => + emotes + .filter( + (emote) => + emote.key && + (searchText.length > 0 + ? emote.key.toLowerCase().includes(searchText.toLowerCase()) || + emote.name.toLowerCase().includes(searchText.toLowerCase()) + : true) && + (filterVisible ? emote.visible : true) && + (filterAudible ? emote.audible : true) && + (filterSound ? emote.sound : true) && + (filterHands ? emote.hands : true) && + (filterUseParams ? emote.use_params : true), + ) + .sort((a, b) => (a.name > b.name ? 1 : -1)), + [ + emotes, + searchText, + filterVisible, + filterAudible, + filterSound, + filterHands, + filterUseParams, + ], + ); + return (
{ > - {emotes - .filter( - (emote) => - emote.key && - (searchText.length > 0 - ? emote.key - .toLowerCase() - .includes(searchText.toLowerCase()) || - emote.name - .toLowerCase() - .includes(searchText.toLowerCase()) - : true) && - (filterVisible ? emote.visible : true) && - (filterAudible ? emote.audible : true) && - (filterSound ? emote.sound : true) && - (filterHands ? emote.hands : true) && - (filterUseParams ? emote.use_params : true), - ) - .sort((a, b) => (a.name > b.name ? 1 : -1)) - .map((emote) => ( - - ))} + {filteredEmotes.map((emote) => ( + + act('play_emote', { + emote_key: emote.key, + use_params: useParams, + }) + } + onPreview={() => + act('preview_sound', { + emote_key: emote.key, + }) + } + /> + ))}
@@ -204,6 +190,76 @@ export const EmotePanelContent = (props) => { ); }; +type EmoteButtonProps = { + emote: Emote; + showIcons: boolean; + showNames: boolean; + onPlay: () => void; + onPreview: () => void; +}; + +const EmoteButton = (props: EmoteButtonProps) => { + const { emote, showIcons, showNames, onPlay, onPreview } = props; + + return ( + + + + + {emote.sound ? ( + + + + ))} + ))} From d2dc0ac5af3bd829245bcd83f47cea11a75a2edd Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Tue, 16 Jun 2026 20:22:27 +0000 Subject: [PATCH 110/126] Automatic changelog for PR #96487 [ci skip] --- html/changelogs/AutoChangeLog-pr-96487.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96487.yml diff --git a/html/changelogs/AutoChangeLog-pr-96487.yml b/html/changelogs/AutoChangeLog-pr-96487.yml new file mode 100644 index 00000000000..e00f1e625c4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96487.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - qol: "Materials can now be directly ejected from autolathes rather than needing to be printed." \ No newline at end of file From ec53f9495c57071cfc9e2062280f2f331822b168 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 00:00:27 +0000 Subject: [PATCH 111/126] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-96487.yml | 4 ---- html/changelogs/AutoChangeLog-pr-96535.yml | 4 ---- html/changelogs/AutoChangeLog-pr-96536.yml | 4 ---- html/changelogs/AutoChangeLog-pr-96537.yml | 4 ---- html/changelogs/archive/2026-06.yml | 8 ++++++++ 5 files changed, 8 insertions(+), 16 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-96487.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-96535.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-96536.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-96537.yml diff --git a/html/changelogs/AutoChangeLog-pr-96487.yml b/html/changelogs/AutoChangeLog-pr-96487.yml deleted file mode 100644 index e00f1e625c4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96487.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - qol: "Materials can now be directly ejected from autolathes rather than needing to be printed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-96535.yml b/html/changelogs/AutoChangeLog-pr-96535.yml deleted file mode 100644 index c9e8b4cbf7c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96535.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Fixed slime feeding runtimes" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-96536.yml b/html/changelogs/AutoChangeLog-pr-96536.yml deleted file mode 100644 index 6956b71cb9b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96536.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Fixed a bunch of runtimes caused when you try to perform surgery on cyborgs (which cannot be done in the first place)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-96537.yml b/html/changelogs/AutoChangeLog-pr-96537.yml deleted file mode 100644 index cfe0ff9542d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96537.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Fixed wraith cloaking module runtimes" \ No newline at end of file diff --git a/html/changelogs/archive/2026-06.yml b/html/changelogs/archive/2026-06.yml index a38fad522a6..ca695952836 100644 --- a/html/changelogs/archive/2026-06.yml +++ b/html/changelogs/archive/2026-06.yml @@ -410,3 +410,11 @@ CabinetOnFire: - code_imp: Adds playsoundtoken() which lets you play one shot sound tokens - sound: You can now hear screams get louder as you get closer, spooky! +2026-06-17: + SmArtKar: + - bugfix: Fixed slime feeding runtimes + - bugfix: Fixed wraith cloaking module runtimes + - qol: Materials can now be directly ejected from autolathes rather than needing + to be printed. + - bugfix: Fixed a bunch of runtimes caused when you try to perform surgery on cyborgs + (which cannot be done in the first place) From 7e0fba028faced72a87a177b5b2a6db162702abc Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Wed, 17 Jun 2026 05:43:59 +0200 Subject: [PATCH 112/126] Fixes earthcracker not getting spent on mining z levels (#96533) ## About The Pull Request Closes #96531 ## Changelog :cl: fix: Fixed earthcracker not getting spent on mining z levels /:cl: --- code/game/objects/items/devices/earthcracker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/earthcracker.dm b/code/game/objects/items/devices/earthcracker.dm index 455be3168f2..5faf68aad3d 100644 --- a/code/game/objects/items/devices/earthcracker.dm +++ b/code/game/objects/items/devices/earthcracker.dm @@ -134,7 +134,7 @@ /// Cleanup after an earthcracker is activated either for sabotage or mining. /obj/item/earthcracker/proc/handle_after_activation(turf/cracked_hull) do_sparks(2, FALSE, src) - cracked_hull.levelupdate() + cracked_hull?.levelupdate() status = EARTHCRACKER_SPENT update_appearance(UPDATE_ICON) From 37af9d4dd05c6b2f2e7ec0b440712a072549ecec Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 03:44:24 +0000 Subject: [PATCH 113/126] Automatic changelog for PR #96533 [ci skip] --- html/changelogs/AutoChangeLog-pr-96533.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96533.yml diff --git a/html/changelogs/AutoChangeLog-pr-96533.yml b/html/changelogs/AutoChangeLog-pr-96533.yml new file mode 100644 index 00000000000..bbb1564327f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96533.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Fixed earthcracker not getting spent on mining z levels" \ No newline at end of file From 2f2d48d84f6d0924605a6168dd3dff675ded2799 Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Wed, 17 Jun 2026 09:53:31 +0530 Subject: [PATCH 114/126] Adds Discord notify for reopened PR's and removes default parameters (#96319) ## About The Pull Request - Discord message is now sent when the PR is reopened - Removes `username`, `title_url`, `title`, & `message` from discord notify action as their default values work fine ## Changelog N/A --- .github/workflows/discord_pr_announce.yml | 8 ++------ .github/workflows/stale.yml | 2 -- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/discord_pr_announce.yml b/.github/workflows/discord_pr_announce.yml index a24f8bb2b77..092e7d69a9d 100644 --- a/.github/workflows/discord_pr_announce.yml +++ b/.github/workflows/discord_pr_announce.yml @@ -1,7 +1,7 @@ name: "Discord PR Notification" on: pull_request_target: - types: [opened, closed] + types: [opened, closed, reopened] jobs: notify: @@ -19,15 +19,11 @@ jobs: uses: tgstation/discord-notify@main if: > steps.secrets_set.outputs.SECRETS_ENABLED && - (github.event.pull_request.merged == true || github.event.action == 'opened') && + (github.event.pull_request.merged == true || github.event.action == 'opened' || github.event.action == 'reopened') && github.event.pull_request.author_association != 'FIRST_TIMER' && github.event.pull_request.author_association != 'FIRST_TIME_CONTRIBUTOR' with: webhook_url: ${{ secrets.DISCORD_WEBHOOK }} - title: ${{ github.event.pull_request.user.login }} - ${{ github.event.pull_request.title }} - message: GET_ACTION include_image: false show_author: false avatar_url: https://avatars.githubusercontent.com/u/1363778?s=200&v=4 - username: GitHub - title_url: "${{ github.event.pull_request.html_url }}" diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 9d9fc69f471..36b672d61cf 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -77,5 +77,3 @@ jobs: include_image: false show_author: false avatar_url: https://avatars.githubusercontent.com/u/1363778?s=200&v=4 - username: GitHub - title_url: "${{ matrix.pull_request.html_url }}" From 62410e98769e84ba9149b94586ae4b408f5959cb Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Wed, 17 Jun 2026 11:17:45 +0530 Subject: [PATCH 115/126] Fixes tooltips covering borg modules (#96444) ## About The Pull Request Tooltips are positioned according to `screen_loc` var which was incorrectly being modified by `/datum/storage_interface/silicon`. They covered the whole item making it virtually impossible to click on. We can't check if the item is in the borgs hand because `add_items()` gets called BEFORE the transfer to hands not after BUT we can check if the item was transferred out of storage via the `IN_STORAGE` flag which has the same results. It's fixed now Before Screenshot (23) After Screenshot (25) ## Changelog :cl: fix: Tooltips no longer cover the whole borgs hands held items /:cl: --- code/datums/storage/storage_interface.dm | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/code/datums/storage/storage_interface.dm b/code/datums/storage/storage_interface.dm index 2e42e34a6ea..2fb7929b0ab 100644 --- a/code/datums/storage/storage_interface.dm +++ b/code/datums/storage/storage_interface.dm @@ -150,28 +150,18 @@ var/current_y = screen_start_y var/turf/our_turf = get_turf(real_location) - for(var/i in 1 to length(usable_modules)) - var/atom/movable/item = usable_modules[i] - if(item in robot_model.robot.held_items) - current_x++ - if(current_x - screen_start_x < columns) - continue - current_x = screen_start_x - - current_y++ - if(current_y - screen_start_y >= rows) - break - //Module is currently active - continue - - item.mouse_opacity = MOUSE_OPACITY_OPAQUE - SET_PLANE(item, ABOVE_HUD_PLANE, our_turf) - item.screen_loc = "[current_x]:[screen_pixel_x],[current_y]:[screen_pixel_y]" + for(var/obj/item/item in usable_modules) + //Only for non active modules + if(item.item_flags & IN_STORAGE) + item.mouse_opacity = MOUSE_OPACITY_OPAQUE + SET_PLANE(item, ABOVE_HUD_PLANE, our_turf) + item.screen_loc = "[current_x]:[screen_pixel_x + item.base_pixel_x],[current_y]:[screen_pixel_y + item.base_pixel_y]" current_x++ if(current_x - screen_start_x < columns) continue current_x = screen_start_x + current_y++ if(current_y - screen_start_y >= rows) break From 670e93fe6fe342092904a0cd54ae89b94cddf356 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 05:48:09 +0000 Subject: [PATCH 116/126] Automatic changelog for PR #96444 [ci skip] --- html/changelogs/AutoChangeLog-pr-96444.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96444.yml diff --git a/html/changelogs/AutoChangeLog-pr-96444.yml b/html/changelogs/AutoChangeLog-pr-96444.yml new file mode 100644 index 00000000000..ab9f10d693d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96444.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "Tooltips no longer cover the whole borgs hands held items" \ No newline at end of file From 1837cfb1cf609cd43aec289bbca3ba3027004f6e Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 06:00:20 +0000 Subject: [PATCH 117/126] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-96444.yml | 4 ---- html/changelogs/AutoChangeLog-pr-96533.yml | 4 ---- html/changelogs/archive/2026-06.yml | 3 +++ 3 files changed, 3 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-96444.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-96533.yml diff --git a/html/changelogs/AutoChangeLog-pr-96444.yml b/html/changelogs/AutoChangeLog-pr-96444.yml deleted file mode 100644 index ab9f10d693d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96444.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "Tooltips no longer cover the whole borgs hands held items" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-96533.yml b/html/changelogs/AutoChangeLog-pr-96533.yml deleted file mode 100644 index bbb1564327f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96533.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Fixed earthcracker not getting spent on mining z levels" \ No newline at end of file diff --git a/html/changelogs/archive/2026-06.yml b/html/changelogs/archive/2026-06.yml index ca695952836..073eb0d4b2c 100644 --- a/html/changelogs/archive/2026-06.yml +++ b/html/changelogs/archive/2026-06.yml @@ -418,3 +418,6 @@ to be printed. - bugfix: Fixed a bunch of runtimes caused when you try to perform surgery on cyborgs (which cannot be done in the first place) + - bugfix: Fixed earthcracker not getting spent on mining z levels + SyncIt21: + - bugfix: Tooltips no longer cover the whole borgs hands held items From 1f38cfcce78838867d5f313aa32cd3209f02fdf1 Mon Sep 17 00:00:00 2001 From: levels0 Date: Wed, 17 Jun 2026 12:02:09 +0300 Subject: [PATCH 118/126] Add new gizmode (#96314) ## About The Pull Request
About the gizmode - It creates a code that the user needs to crack. - The interface for the code is much like those RPG maker combination locks: image - You can cycle the selected position and the selected digit, then send the code to test it. - After every cracking attempt, the code is reset and some sort of feedback is provided, including how many attempts are left. - There are 2 versions of this gizmo, the "tutorial" and the "hard-mode". - The "tutorial" code is 2 digits long, and it tells the user whether the digits they inputted are higher, lower or exactly the same as the solution digits ("over/under" feedback). - The "hard-mode" code is 2-3 digits long "bulls and cows" puzzle, essentially. It can only be accessed by solving the tutorial.
Also, fixed a bug I noticed where users didn't have a way to interact with item gizmo wires ## Why It's Good For The Game The gizmodes that currently exist are simply way too easy to work with. We gotta spice it up with some real interface hell. ## Changelog :cl: add: new gizmode fix: you can now interact with item gizmo wires /:cl: --------- Co-authored-by: l0 <--> --- code/__DEFINES/gizmo.dm | 1 + .../research/gizmo/gizmo_controller.dm | 4 + .../modules/research/gizmo/gizmo_interface.dm | 5 + code/modules/research/gizmo/gizmo_items.dm | 12 + .../research/gizmo/gizmodes/gizcode.dm | 315 ++++++++++++++++++ tgstation.dme | 1 + 6 files changed, 338 insertions(+) create mode 100644 code/modules/research/gizmo/gizmodes/gizcode.dm diff --git a/code/__DEFINES/gizmo.dm b/code/__DEFINES/gizmo.dm index e48b14e21c2..e8c199741f8 100644 --- a/code/__DEFINES/gizmo.dm +++ b/code/__DEFINES/gizmo.dm @@ -37,4 +37,5 @@ /datum/gizmodes/sputter = 1,\ /datum/gizmodes/copier = 1,\ /datum/gizmodes/bad = 1,\ + /datum/gizmodes/code_crack/tutorial = 1,\ ) diff --git a/code/modules/research/gizmo/gizmo_controller.dm b/code/modules/research/gizmo/gizmo_controller.dm index 90b5f7bef87..a1bc793529f 100644 --- a/code/modules/research/gizmo/gizmo_controller.dm +++ b/code/modules/research/gizmo/gizmo_controller.dm @@ -40,3 +40,7 @@ /// Always horrible agony! /datum/gizmo_controller/cursed interfaces = list(GIZMO_INTERFACE_WIRES = /datum/gizmo_interface/cursed) + +/// Hard-mode code-crack +/datum/gizmo_controller/moo + interfaces = list(GIZMO_INTERFACE_WIRES = /datum/gizmo_interface/moo) diff --git a/code/modules/research/gizmo/gizmo_interface.dm b/code/modules/research/gizmo/gizmo_interface.dm index 7e46a47fcc6..39e23ec6e03 100644 --- a/code/modules/research/gizmo/gizmo_interface.dm +++ b/code/modules/research/gizmo/gizmo_interface.dm @@ -67,3 +67,8 @@ /datum/gizmodes/bad = 1, ) max_modes = 1 + +/datum/gizmo_interface/moo + guaranteed_active_gizmodes = list(/datum/gizmodes/code_crack/moo) + min_modes = 0 + max_modes = 0 diff --git a/code/modules/research/gizmo/gizmo_items.dm b/code/modules/research/gizmo/gizmo_items.dm index bc6d237681a..1e18242556e 100644 --- a/code/modules/research/gizmo/gizmo_items.dm +++ b/code/modules/research/gizmo/gizmo_items.dm @@ -20,3 +20,15 @@ controller = new controller(src) controller.generate_interfaces(src) + +/obj/item/gizmo/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + add_fingerprint(user) + + if(is_wire_tool(tool)) + attempt_wire_interaction(user) + return ITEM_INTERACT_SUCCESS + return NONE + +/// Hard-mode code-crack gizmo +/obj/item/gizmo/moo + controller = /datum/gizmo_controller/moo diff --git a/code/modules/research/gizmo/gizmodes/gizcode.dm b/code/modules/research/gizmo/gizmodes/gizcode.dm new file mode 100644 index 00000000000..51249c06aa9 --- /dev/null +++ b/code/modules/research/gizmo/gizmodes/gizcode.dm @@ -0,0 +1,315 @@ +// How many times we try to generate the code +#define MAX_CODEGEN_RETRY_ATTEMPTS 5 +// There are 10 digits +#define DIGIT_COUNT 10 +/** A code-cracking puzzle gizmo + * First, the user must pulse activate_puzzle - this randomizes the code and resets the attempt counter. + * The user may pulse activate_puzzle a limited amount of times again to retry it. + * + * Next, the user needs to input a code. + * Imagine a row of knobs, each of them with 10 notches, and a head that rotates the knobs. + * Pulsing cycle_position moves the head right, + * pulsing cycle_digit makes the head bump the knob by 1 notch. + * If the head reaches the rightmost position, then cycle_position resets it, moving it back left. + * Similarly, pulsing cycle_digit when the knob is already in the rightmost notch resets it to the leftmost one. + * + * Finally, the user has to pulse try_crack to check if their input is correct. + * If it's correct, a reward is dispensed and the puzzle gets deactivated. + * If it's not, some sort of feedback is provided. + * If the user takes too many attempts to solve the code, they are punished. + * + * There may be restrictions set upon the code. + * These are checked upon code generation and cracking attempt. + */ +/datum/gizmodes/code_crack + abstract_type = /datum/gizmodes/code_crack + guaranteed_active_gizmodes = list( + /datum/gizpulse/activate_puzzle, + /datum/gizpulse/cycle_position, + /datum/gizpulse/cycle_digit, + /datum/gizpulse/try_crack, + ) + + mode_pulses = list( + /datum/gizpulse/mode_controle/direct_activate, + ) + // Sound that plays upon puzzle activation + var/init_jingle = "sound/machines/terminal/terminal_processing.ogg" + // How many times you can activate the code-cracking puzzle + var/puzzles_left = 3 + // How many attempts the user has to crack the code before the gizmo starts punishing them + var/attempts_left = 10 + + // Whether the puzzle is currently active + var/active = FALSE + // Code length + var/code_length = 2 + // Solution to current puzzle + var/list/solution = list(0, 0, 0, 0,) + // Current code cracking input + var/list/code_input = list(0, 0, 0, 0,) + // Which position in the code is currently being cycled + var/position = 0 + + var/list/loot_table = null + +// Proc that generates the code (solution to the puzzle) +// We retry generation if the code happened to be invalid +// Returns TRUE if generation was successful and FALSE otherwise +/datum/gizmodes/code_crack/proc/generate_code() + SHOULD_CALL_PARENT(TRUE) + solution.Cut() + solution.len = code_length + for(var/i in 1 to MAX_CODEGEN_RETRY_ATTEMPTS) + for(var/j in 1 to code_length) + solution[j] = rand(0, 9) // Randomize every digit + if(validate_code(solution)) + return TRUE + return FALSE + +// Proc that checks if code is valid or not (matches the restrictions) +/datum/gizmodes/code_crack/proc/validate_code(list/code) + // Restrictions are defined by the subtype + return TRUE + +// Proc that checks if user input matches the solution +/datum/gizmodes/code_crack/proc/check_code() + for(var/i in 1 to code_length) + if(code_input[i] != solution[i]) + return FALSE + return TRUE + +// Proc to dispense the reward from the loot table +/datum/gizmodes/code_crack/proc/dispense_reward(atom/movable/holder) + SHOULD_CALL_PARENT(TRUE) + var/loot = pick_weight_recursive(loot_table) + new loot(get_turf(holder)) + playsound(holder,"sound/machines/machine_vend.ogg", 100) + +// Proc that punishes the user when they go over the attempt limit +// Technically, user can try to crack the code as many times as they want, as long as they can endure the punishment +/datum/gizmodes/code_crack/proc/punishment(atom/movable/holder) + // Punishment has to be defined by the subtype + return + +// Proc that produces feedback when the user inputs an incorrect code +// By default, all of these gizmos tell the user how many attempts are left +/datum/gizmodes/code_crack/proc/feedback(atom/movable/holder) + SHOULD_CALL_PARENT(TRUE) + // This is kind of ass, but there's probably no way around it + var/static/list/digit_to_name = list("one", "two", "three", "four", "five", "six", "seven", "eight", "nine") + if(attempts_left <= 0 || attempts_left >= 10) + return + playsound(holder, "sound/announcer/vox_fem/[digit_to_name[attempts_left]].ogg", 100) + holder.say(digit_to_name[attempts_left]) + +// Proc that resets user input +/datum/gizmodes/code_crack/proc/reset_input() + code_input.Cut() + code_input.len = code_length // stretch it + for(var/i in 1 to code_length) + code_input[i] = 0 // Fill it with zeroes + position = initial(position) + +// Gizpulses + +// Gizpulse to activate the puzzle +/datum/gizpulse/activate_puzzle/activate(atom/movable/holder, datum/gizmodes/master, datum/gizmo_interface/interface) + var/datum/gizmodes/code_crack/puzzle_holder = astype(master) + if(!puzzle_holder) + return + // If the puzzle cannot be retried, produce a bad buzz and stop + if(puzzle_holder.puzzles_left <= 0) + playsound(holder, "sound/machines/uplink/uplinkerror.ogg", 100) + return + // If it can be tried again (or is launched for the first time), do what we gotta do + if(!puzzle_holder.generate_code()) // Code generation may fail, if the restrictions are too severe + playsound(holder, "sound/items/ceramic_break.ogg", 100) + return + playsound(holder, puzzle_holder.init_jingle, 100) + puzzle_holder.puzzles_left-- + puzzle_holder.active = TRUE + puzzle_holder.reset_input() + puzzle_holder.attempts_left = initial(puzzle_holder.attempts_left) + +// Gizpulse to cycle the currently selected position +// Example (if code_input is 0000): +// 0000 -> 0000 +// ^ ^ +/datum/gizpulse/cycle_position/activate(atom/movable/holder, datum/gizmodes/master, datum/gizmo_interface/interface) + var/datum/gizmodes/code_crack/puzzle_holder = astype(master) + if(!puzzle_holder) + return + if(!puzzle_holder.active) // If the puzzle is inactive, produce a loud buzz and get out + playsound(holder,"sound/machines/scanner/scanbuzz.ogg", 100) + return + // Cycle position: 0 -> 1 -> 2 -> .. -> (code_length - 1) -> reset back to 0 + puzzle_holder.position = (puzzle_holder.position + 1) % puzzle_holder.code_length + + // If we simply bumped the position by 1, produce a single piston-move sound + if(puzzle_holder.position != 0) + playsound(holder, "sound/machines/eject.ogg", 100) + return + // Otherwise, produce a different sound, indicating the position has been reset + playsound(holder, "sound/items/weapons/autoguninsert.ogg", 100) + +// Gizpulse to cycle the currently selected digit +// Example (if second digit is selected and code_input is 0000): +// 0000 -> 0100 +// ^ ^ +/datum/gizpulse/cycle_digit/activate(atom/movable/holder, datum/gizmodes/master, datum/gizmo_interface/interface) + var/datum/gizmodes/code_crack/puzzle_holder = astype(master) + if(!puzzle_holder) + return + if(!puzzle_holder.active) // If the puzzle is inactive, produce a loud buzz and get out + playsound(holder,"sound/machines/scanner/scanbuzz.ogg", 100) + return + + // List indices start with 1, so we add 1 here + var/position = puzzle_holder.position + 1 + var/previous_digit = puzzle_holder.code_input[position] + // Cycle the digit + puzzle_holder.code_input[position] = (previous_digit + 1) % DIGIT_COUNT + + // If we simply bumped the digit by 1, produce a single click + if(previous_digit != DIGIT_COUNT - 1) + playsound(holder, "sound/machines/creak.ogg", 100) + return + // Otherwise, produce a different sound, indicating the digit has been reset + playsound(holder, "sound/items/reel/reel4.ogg", 100) + +// Gizpulse that actually cracks the code +/datum/gizpulse/try_crack/activate(atom/movable/holder, datum/gizmodes/master, datum/gizmo_interface/interface) + var/datum/gizmodes/code_crack/puzzle_holder = astype(master) + if(!puzzle_holder) + return + if(!puzzle_holder.active) // If the puzzle is inactive, produce a loud buzz and get out + playsound(holder,"sound/machines/scanner/scanbuzz.ogg", 100) + return + + // If the input is invalid, emit an invalid-input sound and let the user make corrections + var/validity = puzzle_holder.validate_code(puzzle_holder.code_input) + if(!validity) + playsound(holder, "sound/machines/terminal/terminal_error.ogg", 100) + return + + // If the input is correct, dispense a reward and reset the puzzle + var/correctness = puzzle_holder.check_code() + if(correctness) + puzzle_holder.dispense_reward(holder) + puzzle_holder.active = FALSE + return + + // If the input is incorrect.. + puzzle_holder.attempts_left-- + if(puzzle_holder.attempts_left <= 0) + puzzle_holder.punishment(holder) + puzzle_holder.feedback(holder) + puzzle_holder.reset_input() + // Play the input reset sound + playsound(holder, "sound/machines/terminal/terminal_eject.ogg", 100) + +// Tutorial version +// Restrictions: none +// Code length: 2 +// Feedback: over/under +// Punishment: evil rat +// Loot: cheese +// Also, dispenses a hard-mode code-crack gizmo upon completion +/datum/gizmodes/code_crack/tutorial + loot_table = list( + list( // Cheese slices + /obj/item/food/cheese/firm_cheese_slice = 1, + /obj/item/food/cheese/wedge = 1, + ) = 39, + /obj/item/food/cheese/wheel = 20, // Normal cheese + list( // Firm cheese + /obj/item/food/cheese/curd_cheese = 1, + /obj/item/food/cheese/cheese_curds = 1, + /obj/item/food/cheese/firm_cheese = 1, + ) = 20, + /obj/item/food/cheese/mozzarella = 20, // Mozzarella + /obj/item/food/cheese/royal = 1, // Royal + ) + var/dispensed_hardmode = FALSE + +/datum/gizmodes/code_crack/tutorial/dispense_reward(atom/movable/holder) + if(!dispensed_hardmode) + dispensed_hardmode = TRUE + // Hard-mode + new /obj/item/gizmo/moo(get_turf(holder)) + ..() + +/datum/gizmodes/code_crack/tutorial/feedback(atom/movable/holder) + for(var/i in 1 to code_length) + if(code_input[i] < solution[i]) + playsound(holder, "sound/machines/defib/defib_saftyOff.ogg", 100) + holder.visible_message(span_notice("[holder] pings low.")) + else if(code_input[i] > solution[i]) + playsound(holder, "sound/machines/defib/defib_saftyOn.ogg", 100) + holder.visible_message(span_notice("[holder] pings high.")) + else + playsound(holder, "sound/machines/defib/defib_ready.ogg", 100) + holder.visible_message(span_notice("[holder] pings affirmatively.")) + sleep(0.5 SECONDS) + ..() + +/datum/gizmodes/code_crack/tutorial/punishment(atom/movable/holder) + // Evil rat + new /mob/living/basic/mouse/rat(get_turf(holder)) + +// Hardmode +// Restrictions: all digits must be unique +// Code length: 2-3 +// Feedback: bulls and cows (number of correctly placed digits, number of incorrectly placed digits that are included in the code) +// Punishment: explosion +// Loot: all sorts of stuff +/datum/gizmodes/code_crack/moo + // Moo + init_jingle = "sound/mobs/non-humanoids/cow/cow.ogg" + loot_table = /obj/structure/closet/crate/secure/loot::possible_loot + var/min_code_length = 2 + var/max_code_length = 3 + +// All digits must be unique +/datum/gizmodes/code_crack/moo/validate_code(code) + for(var/i in 1 to code_length) + for(var/j in 1 to i-1) + if(code[i] == code[j]) + return FALSE + return TRUE + +/datum/gizmodes/code_crack/moo/generate_code() + code_length = rand(min_code_length, max_code_length) + return ..() + +/datum/gizmodes/code_crack/moo/feedback(atom/movable/holder) + var/bulls = 0 + var/cows = 0 + for(var/i in 1 to code_length) + for(var/j in 1 to code_length) + if(code_input[i] == solution[j]) + if(i == j) // Digit is correct and correctly placed + bulls++ + else // Digit is correct, but incorrectly placed + cows++ + break + // Bull beeps, cow beeps and the sound from parent call shouldn't play simultaneously, so sleep() is probably unavoidable here + for(var/i in 1 to bulls) + playsound(holder, "sound/machines/synth/synth_yes.ogg", 100) + sleep(0.25 SECONDS) + for(var/i in 1 to cows) + playsound(holder, "sound/machines/synth/synth_no.ogg", 100) + sleep(0.25 SECONDS) + + holder.visible_message(span_notice("[holder] emits [bulls] high-pitched beeps and [cows] low-pitched ones.")) + + ..() + +/datum/gizmodes/code_crack/moo/punishment(atom/movable/holder) + var/obj/item/grenade/syndieminibomb/punishment = new(get_turf(holder)) + punishment.arm_grenade(null, 5 SECONDS) + qdel(holder) + +#undef MAX_CODEGEN_RETRY_ATTEMPTS +#undef DIGIT_COUNT diff --git a/tgstation.dme b/tgstation.dme index 081a10eae4c..2cfc9e080e7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6357,6 +6357,7 @@ #include "code\modules\research\gizmo\gizmodes\giz_filler.dm" #include "code\modules\research\gizmo\gizmodes\gizactives.dm" #include "code\modules\research\gizmo\gizmodes\gizbad.dm" +#include "code\modules\research\gizmo\gizmodes\gizcode.dm" #include "code\modules\research\gizmo\gizmodes\gizcopier.dm" #include "code\modules\research\gizmo\gizmodes\gizlectric.dm" #include "code\modules\research\gizmo\gizmodes\gizmisc.dm" From 1b36d0ed6e4da39f3bb99e07fcc4bb7030e056c0 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 09:02:31 +0000 Subject: [PATCH 119/126] Automatic changelog for PR #96314 [ci skip] --- html/changelogs/AutoChangeLog-pr-96314.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96314.yml diff --git a/html/changelogs/AutoChangeLog-pr-96314.yml b/html/changelogs/AutoChangeLog-pr-96314.yml new file mode 100644 index 00000000000..1a2eeff7e96 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96314.yml @@ -0,0 +1,5 @@ +author: "levels0" +delete-after: True +changes: + - rscadd: "new gizmode" + - bugfix: "you can now interact with item gizmo wires" \ No newline at end of file From ed46d5dd216a8c29cfbe994852e618712a3b0854 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 12:00:24 +0000 Subject: [PATCH 120/126] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-96314.yml | 5 ----- html/changelogs/archive/2026-06.yml | 3 +++ 2 files changed, 3 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-96314.yml diff --git a/html/changelogs/AutoChangeLog-pr-96314.yml b/html/changelogs/AutoChangeLog-pr-96314.yml deleted file mode 100644 index 1a2eeff7e96..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96314.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "levels0" -delete-after: True -changes: - - rscadd: "new gizmode" - - bugfix: "you can now interact with item gizmo wires" \ No newline at end of file diff --git a/html/changelogs/archive/2026-06.yml b/html/changelogs/archive/2026-06.yml index 073eb0d4b2c..cfd73924108 100644 --- a/html/changelogs/archive/2026-06.yml +++ b/html/changelogs/archive/2026-06.yml @@ -421,3 +421,6 @@ - bugfix: Fixed earthcracker not getting spent on mining z levels SyncIt21: - bugfix: Tooltips no longer cover the whole borgs hands held items + levels0: + - rscadd: new gizmode + - bugfix: you can now interact with item gizmo wires From 79cdde5b4ebf7f088943b5ab50cc6a371ec7bab3 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Wed, 17 Jun 2026 07:37:58 -0500 Subject: [PATCH 121/126] Head revs get codewords, rev antag info panel (#96425) --- code/__DEFINES/text.dm | 2 - code/__HELPERS/names.dm | 27 ++-- .../dynamic/dynamic_ruleset_roundstart.dm | 1 + code/controllers/subsystem/ticker.dm | 18 +-- code/controllers/subsystem/traitor.dm | 13 ++ code/modules/antagonists/malf_ai/malf_ai.dm | 12 +- .../antagonists/revolution/revolution.dm | 59 +++++--- .../revolution/revolution_handler.dm | 2 +- .../antagonists/traitor/datum_traitor.dm | 12 +- strings/locations.json | 96 ------------- .../tgui/interfaces/AntagInfoRevolution.tsx | 128 ++++++++++++++++++ 11 files changed, 206 insertions(+), 164 deletions(-) delete mode 100644 strings/locations.json create mode 100644 tgui/packages/tgui/interfaces/AntagInfoRevolution.tsx diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm index 3b5cb5d7950..4ffbb978a65 100644 --- a/code/__DEFINES/text.dm +++ b/code/__DEFINES/text.dm @@ -84,8 +84,6 @@ #define ARCADE_FILE "arcade.json" /// File location for boomer meme catchphrases #define BOOMER_FILE "boomer.json" -/// File location for locations on the station -#define LOCATIONS_FILE "locations.json" /// File location for wanted posters messages #define WANTED_FILE "wanted_message.json" /// File location for really dumb suggestions memes diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index f3af1b68531..9a05956537e 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -183,15 +183,6 @@ GLOBAL_VAR(command_name) return name - -//Traitors and traitor silicons will get these. Revs will not. -GLOBAL_VAR(syndicate_code_phrase) //Code phrase for traitors. -GLOBAL_VAR(syndicate_code_response) //Code response for traitors. - -//Cached regex search - for checking if codewords are used. -GLOBAL_DATUM(syndicate_code_phrase_regex, /regex) -GLOBAL_DATUM(syndicate_code_response_regex, /regex) - /* Should be expanded. How this works: @@ -220,14 +211,16 @@ GLOBAL_DATUM(syndicate_code_response_regex, /regex) 25; 5 ) - var/list/safety = list(1,2,3)//Tells the proc which options to remove later on. - var/nouns = strings(ION_FILE, "ionabstract") - var/objects = strings(ION_FILE, "ionobjects") - var/adjectives = strings(ION_FILE, "ionadjectives") - var/threats = strings(ION_FILE, "ionthreats") - var/foods = strings(ION_FILE, "ionfood") - var/drinks = strings(ION_FILE, "iondrinks") - var/locations = strings(LOCATIONS_FILE, "locations") + var/list/safety = list(1, 2, 3)//Tells the proc which options to remove later on. + var/list/nouns = strings(ION_FILE, "ionabstract") + var/list/objects = strings(ION_FILE, "ionobjects") + var/list/adjectives = strings(ION_FILE, "ionadjectives") + var/list/threats = strings(ION_FILE, "ionthreats") + var/list/foods = strings(ION_FILE, "ionfood") + var/list/drinks = strings(ION_FILE, "iondrinks") + var/list/locations = list() + for(var/area/area_type as anything in list(/area/space) | GLOB.the_station_areas) + locations |= format_text(area_type::name) var/list/names = list() for(var/datum/record/crew/target in GLOB.manifest.general)//Picks from crew manifest. diff --git a/code/controllers/subsystem/dynamic/dynamic_ruleset_roundstart.dm b/code/controllers/subsystem/dynamic/dynamic_ruleset_roundstart.dm index 2143b6cbb00..3df35073247 100644 --- a/code/controllers/subsystem/dynamic/dynamic_ruleset_roundstart.dm +++ b/code/controllers/subsystem/dynamic/dynamic_ruleset_roundstart.dm @@ -442,6 +442,7 @@ new_head.give_flash = TRUE new_head.give_hud = TRUE new_head.remove_clumsy = TRUE + new_head.roundstart = TRUE candidate.add_antag_datum(new_head, GLOB.revolution_handler.revs) GLOB.revolution_handler.start_revolution() diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 06a13b68b82..4dbe10f0def 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -111,22 +111,6 @@ SUBSYSTEM_DEF(ticker) else set_lobby_music("[global.config.directory]/title_music/sounds/[pick(music)]") - if(!GLOB.syndicate_code_phrase) - GLOB.syndicate_code_phrase = generate_code_phrase(return_list=TRUE) - - var/codewords = jointext(GLOB.syndicate_code_phrase, "|") - var/regex/codeword_match = new("([codewords])", "ig") - - GLOB.syndicate_code_phrase_regex = codeword_match - - if(!GLOB.syndicate_code_response) - GLOB.syndicate_code_response = generate_code_phrase(return_list=TRUE) - - var/codewords = jointext(GLOB.syndicate_code_response, "|") - var/regex/codeword_match = new("([codewords])", "ig") - - GLOB.syndicate_code_response_regex = codeword_match - start_at = world.time + (CONFIG_GET(number/lobby_countdown) * (1 SECONDS)) return SS_INIT_SUCCESS @@ -141,9 +125,9 @@ SUBSYSTEM_DEF(ticker) to_chat(world, span_notice("Welcome to [station_name()]!")) for(var/channel_tag in CONFIG_GET(str_list/channel_announce_new_game)) send2chat(new /datum/tgs_message_content("New round starting on [SSmapping.current_map.map_name]!"), channel_tag) + current_state = GAME_STATE_PREGAME SEND_SIGNAL(src, COMSIG_TICKER_ENTER_PREGAME) - fire() if(GAME_STATE_PREGAME) //lobby stats for statpanels diff --git a/code/controllers/subsystem/traitor.dm b/code/controllers/subsystem/traitor.dm index edb0f237f5e..cd13366bdb9 100644 --- a/code/controllers/subsystem/traitor.dm +++ b/code/controllers/subsystem/traitor.dm @@ -21,11 +21,24 @@ SUBSYSTEM_DEF(traitor) var/list/datum/uplink_handler/uplink_handlers = list() /// The current scaling per minute of progression. var/current_progression_scaling = 1 MINUTES + /// List of code words for traitors + var/syndicate_code_phrase + /// List of code responses for traitors + var/syndicate_code_response + /// Regex of code words for traitors + var/regex/syndicate_code_phrase_regex + /// Regex of code responses for traitors + var/regex/syndicate_code_response_regex /datum/controller/subsystem/traitor/Initialize() current_progression_scaling = 1 MINUTES * CONFIG_GET(number/traitor_scaling_multiplier) for(var/theft_item in subtypesof(/datum/objective_item/steal)) new theft_item + + syndicate_code_phrase = generate_code_phrase(return_list = TRUE) + syndicate_code_phrase_regex = new("([jointext(syndicate_code_phrase, "|")])", "ig") + syndicate_code_response = generate_code_phrase(return_list = TRUE) + syndicate_code_response_regex = new("([jointext(syndicate_code_response, "|")])", "ig") return SS_INIT_SUCCESS /datum/controller/subsystem/traitor/fire(resumed) diff --git a/code/modules/antagonists/malf_ai/malf_ai.dm b/code/modules/antagonists/malf_ai/malf_ai.dm index 83b84c2e7b9..763ab99c4ce 100644 --- a/code/modules/antagonists/malf_ai/malf_ai.dm +++ b/code/modules/antagonists/malf_ai/malf_ai.dm @@ -118,8 +118,8 @@ if(istype(datum_owner)) datum_owner.hack_software = TRUE - datum_owner.AddComponent(/datum/component/codeword_hearing, GLOB.syndicate_code_phrase_regex, "blue", src) - datum_owner.AddComponent(/datum/component/codeword_hearing, GLOB.syndicate_code_response_regex, "red", src) + datum_owner.AddComponent(/datum/component/codeword_hearing, SStraitor.syndicate_code_phrase_regex, "blue", src) + datum_owner.AddComponent(/datum/component/codeword_hearing, SStraitor.syndicate_code_response_regex, "red", src) /datum/antagonist/malf_ai/remove_innate_effects(mob/living/mob_override) var/mob/living/silicon/ai/datum_owner = mob_override || owner.current @@ -135,8 +135,8 @@ if(!owner.current) return - var/phrases = jointext(GLOB.syndicate_code_phrase, ", ") - var/responses = jointext(GLOB.syndicate_code_response, ", ") + var/phrases = jointext(SStraitor.syndicate_code_phrase, ", ") + var/responses = jointext(SStraitor.syndicate_code_response, ", ") antag_memory += "Code Phrase: [span_blue("[phrases]")]
" antag_memory += "Code Response: [span_red("[responses]")]
" @@ -176,8 +176,8 @@ data["has_codewords"] = should_give_codewords if(should_give_codewords) - data["phrases"] = jointext(GLOB.syndicate_code_phrase, ", ") - data["responses"] = jointext(GLOB.syndicate_code_response, ", ") + data["phrases"] = jointext(SStraitor.syndicate_code_phrase, ", ") + data["responses"] = jointext(SStraitor.syndicate_code_response, ", ") data["intro"] = malfunction_flavor["introduction"] data["allies"] = malfunction_flavor["allies"] data["goal"] = malfunction_flavor["goal"] diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index b3f37afae86..3d457a67c28 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -7,8 +7,9 @@ antag_hud_name = "rev" suicide_cry = "VIVA LA REVOLUTION!!" stinger_sound = 'sound/music/antag/revolutionary_tide.ogg' - var/datum/team/revolution/rev_team + ui_name = "AntagInfoRevolution" + var/datum/team/revolution/rev_team /// When this antagonist is being de-antagged, this is the source. Can be a mob (for mindshield/blunt force trauma) or a #define string. var/deconversion_source @@ -20,18 +21,6 @@ return ..() /datum/antagonist/rev/admin_add(datum/mind/new_owner, mob/admin) - // No revolution exists which means admin adding this will create a new revolution team - // This causes problems because revolution teams (currently) require a dynamic datum to process its victory / defeat conditions - if(!(locate(/datum/team/revolution) in GLOB.antagonist_teams)) - var/confirm = tgui_alert(admin, "Notice: Revolutions do not function 100% when created via traitor panel instead of dynamic. \ - The leaders will be able to convert as normal, but the shuttle will not be blocked and there will be no announcements when either side wins. \ - Are you sure?", "Be Wary", list("Yes", "No")) - if(QDELETED(src) || QDELETED(new_owner.current) || confirm != "Yes") - return - - go_through_with_admin_add(new_owner, admin) - -/datum/antagonist/rev/proc/go_through_with_admin_add(datum/mind/new_owner, mob/admin) new_owner.add_antag_datum(src) message_admins("[key_name_admin(admin)] has rev'ed [key_name_admin(new_owner)].") log_admin("[key_name(admin)] has rev'ed [key_name(new_owner)].") @@ -58,11 +47,6 @@ equip_rev() owner.current.log_message("has been converted to the revolution!", LOG_ATTACK, color="red") -/datum/antagonist/rev/greet() - . = ..() - to_chat(owner, span_userdanger("Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!")) - owner.announce_objectives() - /datum/antagonist/rev/create_team(datum/team/revolution/new_team) if(!new_team) GLOB.revolution_handler ||= new() @@ -98,7 +82,20 @@ message_admins("[key_name_admin(admin)] has head-rev'ed [O].") log_admin("[key_name(admin)] has head-rev'ed [O].") -/datum/antagonist/rev/head/go_through_with_admin_add(datum/mind/new_owner, mob/admin) +/datum/antagonist/rev/ui_static_data(mob/user) + . = ..() + .["leader"] = (pref_flag == ROLE_REV_HEAD) + .["heads"] = list() + for(var/datum/mind/head_of_staff as anything in SSjob.get_all_heads()) + .["heads"] += list(list("name" = head_of_staff.name, "role" = head_of_staff.assigned_role.title)) + +/datum/antagonist/rev/head/ui_static_data(mob/user) + . = ..() + .["code_phrases"] = rev_team.head_chose_phrase_raw + .["code_responses"] = rev_team.head_code_responses_raw + .["lone_wolf"] = !roundstart || length(rev_team.get_head_revolutionaries()) == 1 + +/datum/antagonist/rev/head/admin_add(datum/mind/new_owner, mob/admin) give_flash = TRUE give_hud = TRUE remove_clumsy = TRUE @@ -161,6 +158,7 @@ var/remove_clumsy = FALSE var/give_flash = FALSE var/give_hud = TRUE + var/roundstart = FALSE /datum/antagonist/rev/head/pre_mindshield(mob/implanter, mob/living/mob_override) return COMPONENT_MINDSHIELD_RESISTED @@ -182,12 +180,18 @@ real_mob.AddComponentFrom(REF(src), /datum/component/can_flash_from_behind) RegisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB, PROC_REF(on_flash_success)) + real_mob.AddComponent(/datum/component/codeword_hearing, rev_team.head_code_phrases, "blue", src) + real_mob.AddComponent(/datum/component/codeword_hearing, rev_team.head_code_responses, "red", src) + /datum/antagonist/rev/head/remove_innate_effects(mob/living/mob_override) . = ..() var/mob/living/real_mob = mob_override || owner.current real_mob.RemoveComponentSource(REF(src), /datum/component/can_flash_from_behind) UnregisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB) + for(var/datum/component/codeword_hearing/component as anything in real_mob.GetComponents(/datum/component/codeword_hearing)) + component.delete_if_from_source(src) + /// Signal proc for [COMSIG_MOB_SUCCESSFUL_FLASHED_MOB]. /// Bread and butter of revolution conversion, successfully flashing a carbon will make them a revolutionary /datum/antagonist/rev/head/proc/on_flash_success(mob/living/source, mob/living/flashed, obj/item/assembly/flash/flash, deviation) @@ -371,6 +375,23 @@ /// List of all ex-revs. Useful because dynamic removes antag status when it ends, so this can be kept for the roundend report. var/list/datum/mind/ex_revs = list() + /// List of code phrases + VAR_FINAL/list/head_chose_phrase_raw + /// Regex for code phrases that only headrevs hear + VAR_FINAL/regex/head_code_phrases + /// List of code responses + VAR_FINAL/list/head_code_responses_raw + /// Regex for code responses that only headrevs hear + VAR_FINAL/regex/head_code_responses + +/datum/team/revolution/New(starting_members) + . = ..() + head_chose_phrase_raw = generate_code_phrase(return_list = TRUE) + head_code_phrases = new("([jointext(head_chose_phrase_raw, "|")])", "ig") + + head_chose_phrase_raw = generate_code_phrase(return_list = TRUE) + head_code_responses = new("([jointext(head_chose_phrase_raw, "|")])", "ig") + /// Saves all current headrevs and revs /datum/team/revolution/proc/save_members() ex_headrevs = get_head_revolutionaries() diff --git a/code/modules/antagonists/revolution/revolution_handler.dm b/code/modules/antagonists/revolution/revolution_handler.dm index b429500d7c8..3ffc270f464 100644 --- a/code/modules/antagonists/revolution/revolution_handler.dm +++ b/code/modules/antagonists/revolution/revolution_handler.dm @@ -115,7 +115,7 @@ GLOBAL_DATUM(revolution_handler, /datum/revolution_handler) /datum/revolution_handler/proc/check_rev_victory() for(var/datum/objective/mutiny/objective in revs.objectives) - if(!(objective.check_completion())) + if(!objective.check_completion()) return FALSE return TRUE diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index df36231c572..15262859459 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -208,8 +208,8 @@ handle_clown_mutation(datum_owner, mob_override ? null : "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") if(should_give_codewords) - datum_owner.AddComponent(/datum/component/codeword_hearing, GLOB.syndicate_code_phrase_regex, "blue", src) - datum_owner.AddComponent(/datum/component/codeword_hearing, GLOB.syndicate_code_response_regex, "red", src) + datum_owner.AddComponent(/datum/component/codeword_hearing, SStraitor.syndicate_code_phrase_regex, "blue", src) + datum_owner.AddComponent(/datum/component/codeword_hearing, SStraitor.syndicate_code_response_regex, "red", src) /datum/antagonist/traitor/remove_innate_effects(mob/living/mob_override) var/mob/living/datum_owner = mob_override || owner.current @@ -229,8 +229,8 @@ var/list/data = list() data["has_codewords"] = should_give_codewords if(should_give_codewords) - data["phrases"] = jointext(GLOB.syndicate_code_phrase, ", ") - data["responses"] = jointext(GLOB.syndicate_code_response, ", ") + data["phrases"] = jointext(SStraitor.syndicate_code_phrase, ", ") + data["responses"] = jointext(SStraitor.syndicate_code_response, ", ") data["theme"] = traitor_flavor["ui_theme"] data["code"] = uplink?.unlock_code data["failsafe_code"] = uplink?.failsafe_code @@ -315,8 +315,8 @@ return sent_data /datum/antagonist/traitor/roundend_report_footer() - var/phrases = jointext(GLOB.syndicate_code_phrase, ", ") - var/responses = jointext(GLOB.syndicate_code_response, ", ") + var/phrases = jointext(SStraitor.syndicate_code_phrase, ", ") + var/responses = jointext(SStraitor.syndicate_code_response, ", ") var/message = "
The code phrases were: [phrases]
\ The code responses were: [span_redtext("[responses]")]
" diff --git a/strings/locations.json b/strings/locations.json deleted file mode 100644 index 1ae1e628ab5..00000000000 --- a/strings/locations.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "locations": [ - "Aft Maintenance", - "Aft Primary Hallway", - "AI Chamber", - "AI Satellite Antechamber", - "AI Satellite Exterior", - "AI Upload Chamber", - "Armory", - "Atmospherics Engine", - "Atmospherics", - "Atrium", - "Auxiliary Base Construction", - "Auxiliary Restrooms", - "Auxiliary Tool Storage", - "Bar", - "Bridge", - "Brig Control", - "Brig", - "Captain's Office", - "Captain's Quarters", - "Cargo Bay", - "Cargo Office", - "Chapel Office", - "Chapel", - "Chemistry", - "Command Hallway", - "Construction Area", - "Corporate Showroom", - "Council Chamber", - "Courtroom", - "Custodial Closet", - "Customs", - "Cytology Lab", - "Delivery Office", - "Departure Lounge", - "Detective's Office", - "Dormitories", - "Engineering Foyer", - "Engineering Storage", - "Engineering", - "EVA Storage", - "Experimentation Lab", - "Firing Range", - "Gateway", - "Genetics Lab", - "Gravity Generator Room", - "Hydroponics", - "Incinerator", - "Kitchen", - "Law Office", - "Library", - "Locker Room", - "Mech Bay", - "Medbay Central", - "Medbay Maintenance", - "Medbay Storage", - "Mining Office", - "Morgue Maintenance", - "Morgue", - "Primary Tool Storage", - "Prison Wing", - "Prisoner Education Chamber", - "Recreation Area", - "Recreational Holodeck", - "Research and Development", - "Research Division", - "Research Testing Range", - "Restrooms", - "Robotics Lab", - "Science Maintenance", - "Security Checkpoint", - "Security Office", - "Service Hallway", - "Space", - "Supermatter Engine", - "Surgery", - "Technical Storage", - "Teleporter Room", - "Testing Lab", - "Theatre", - "Toxins Mixing Chamber", - "Toxins Mixing Lab", - "Toxins Storage", - "Toxins Test Area", - "Transfer Centre", - "Transit Tube", - "Vacant Commissary", - "Vacant Office", - "Vault", - "Virology", - "Warehouse", - "Waste Disposal", - "Xenobiology Lab" - ] -} diff --git a/tgui/packages/tgui/interfaces/AntagInfoRevolution.tsx b/tgui/packages/tgui/interfaces/AntagInfoRevolution.tsx new file mode 100644 index 00000000000..ccd0addf090 --- /dev/null +++ b/tgui/packages/tgui/interfaces/AntagInfoRevolution.tsx @@ -0,0 +1,128 @@ +import { Section, Stack } from 'tgui-core/components'; +import type { BooleanLike } from 'tgui-core/react'; +import { useBackend } from '../backend'; +import { Window } from '../layouts'; +import type { Objective } from './common/Objectives'; + +type Head = { + name: string; + role: string; +}; + +type Info = { + antag_name: string; + objectives: Objective[]; + leader: BooleanLike; + code_phrases?: string[]; + code_responses?: string[]; + heads: Head[]; + lone_wolf: BooleanLike; +}; + +// Takes [a, b, c] and returns "a, b, and c" +function formatCodes(text: string[]) { + if (text.length === 0) return ''; + if (text.length === 1) return text[0]; + if (text.length === 2) return `${text[0]} and ${text[1]}`; + return `${text.slice(0, -1).join(', ')}, and ${text[text.length - 1]}`; +} + +export const AntagInfoRevolution = () => { + const { data } = useBackend(); + const { leader, code_phrases, code_responses, heads, lone_wolf } = data; + return ( + + +
+ + + Viva la Revolution! + + + {leader ? ( + + {lone_wolf ? ( + + - You are a lone leader of the revolution. It is + recommended to act swiftly and decisively - when the + revolution is sufficiently large, more leaders will be + promoted. + + ) : ( + + - There are multiple leaders of the revolution. It is + recommended to work together and establish a plan BEFORE + you start converting the crew - being outed early can + prove extremely detrimental. + + )} + + - Convert the crew to your cause with a flash - any flash + will work. + + + - Mindshields will prevent conversion. You can identify them + via the flashing blue border around their job icon. + + + - The revolution is lost if you and your fellow leaders are + all killed or exiled. Do not let that happen! + + + ) : ( + + + - Help your cause. Do not harm your fellow freedom fighters. + + + - You can identify your comrades by the red "R" icons, and + your leaders by the blue "R" icons. + + + - The revolution is lost if all of your leaders are killed + or exiled. Do not let that happen! + + + )} + + {heads.length > 0 && ( + <> + + + + + You must kill or exile the heads of staff: + + {heads.map((head, i) => ( + + - {head.name}, the {head.role} + + ))} + + + + )} + {code_phrases?.length && code_responses?.length && ( + <> + + + + + To identify your fellow leaders, use the following code: + + + Phrases: {formatCodes(code_phrases)} + + + Responses: {formatCodes(code_responses)} + + + + + )} + +
+
+
+ ); +}; From 519a775a36db10d788bea07aca42322ffaea3fcd Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 12:38:18 +0000 Subject: [PATCH 122/126] Automatic changelog for PR #96425 [ci skip] --- html/changelogs/AutoChangeLog-pr-96425.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-96425.yml diff --git a/html/changelogs/AutoChangeLog-pr-96425.yml b/html/changelogs/AutoChangeLog-pr-96425.yml new file mode 100644 index 00000000000..acd01837a5e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-96425.yml @@ -0,0 +1,6 @@ +author: "Melbert" +delete-after: True +changes: + - qol: "Adds an antag info panel for revolution" + - qol: "Codewords can now consist of any station area, and excludes areas not on the current station" + - qol: "Head Revolutionaries (not their underlings) get codewords" \ No newline at end of file From 3de419fba9cd667c6703c9451ab0a0a8116eebf4 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 18:00:27 +0000 Subject: [PATCH 123/126] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-96425.yml | 6 ------ html/changelogs/archive/2026-06.yml | 5 +++++ 2 files changed, 5 insertions(+), 6 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-96425.yml diff --git a/html/changelogs/AutoChangeLog-pr-96425.yml b/html/changelogs/AutoChangeLog-pr-96425.yml deleted file mode 100644 index acd01837a5e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-96425.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - qol: "Adds an antag info panel for revolution" - - qol: "Codewords can now consist of any station area, and excludes areas not on the current station" - - qol: "Head Revolutionaries (not their underlings) get codewords" \ No newline at end of file diff --git a/html/changelogs/archive/2026-06.yml b/html/changelogs/archive/2026-06.yml index cfd73924108..2c3e163139a 100644 --- a/html/changelogs/archive/2026-06.yml +++ b/html/changelogs/archive/2026-06.yml @@ -411,6 +411,11 @@ - code_imp: Adds playsoundtoken() which lets you play one shot sound tokens - sound: You can now hear screams get louder as you get closer, spooky! 2026-06-17: + Melbert: + - qol: Adds an antag info panel for revolution + - qol: Codewords can now consist of any station area, and excludes areas not on + the current station + - qol: Head Revolutionaries (not their underlings) get codewords SmArtKar: - bugfix: Fixed slime feeding runtimes - bugfix: Fixed wraith cloaking module runtimes From 98b156e21239fc0db977f58815e58975720ad589 Mon Sep 17 00:00:00 2001 From: Bruh-24 Date: Thu, 18 Jun 2026 00:50:57 +0300 Subject: [PATCH 124/126] conflicts --- .github/workflows/discord_pr_announce.yml | 6 - code/__DEFINES/say.dm | 4 - code/__DEFINES/text.dm | 3 - code/__HELPERS/spatial_info.dm | 7 +- code/controllers/subsystem/tts.dm | 200 ++-------------------- 5 files changed, 15 insertions(+), 205 deletions(-) diff --git a/.github/workflows/discord_pr_announce.yml b/.github/workflows/discord_pr_announce.yml index 68d9d0d0398..092e7d69a9d 100644 --- a/.github/workflows/discord_pr_announce.yml +++ b/.github/workflows/discord_pr_announce.yml @@ -26,10 +26,4 @@ jobs: webhook_url: ${{ secrets.DISCORD_WEBHOOK }} include_image: false show_author: false -<<<<<<< HEAD - avatar_url: https://avatars.githubusercontent.com/u/92191611?s=200&v=4 - username: GitHub - title_url: "${{ github.event.pull_request.html_url }}" -======= avatar_url: https://avatars.githubusercontent.com/u/1363778?s=200&v=4 ->>>>>>> upstream/master diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 0ccd5a1b2ed..c85949aad48 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -11,12 +11,8 @@ #define LANGUAGE_MUTUAL_BONUS "language mutual bonus" #define SAY_MOD_VERB "say_mod_verb" -<<<<<<< HEAD -#define HEARD_BUT_DIDNT_UNDERSTAND "heard_but_didnt_understand" -======= #define HEAR_HEARD (1<<0) #define HEAR_UNDERSTOOD (1<<1) ->>>>>>> upstream/master //Message modes. Each one defines a radio channel, more or less. //if you use ! as a mode key for some ungodly reason, change the first character for ion_num() so get_message_mode() doesn't freak out with state law prompts - shiz. diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm index e7c0aedb30f..4c694adf720 100644 --- a/code/__DEFINES/text.dm +++ b/code/__DEFINES/text.dm @@ -99,15 +99,12 @@ #define ARCADE_FILE "arcade.json" /// File location for boomer meme catchphrases #define BOOMER_FILE "boomer.json" -<<<<<<< HEAD /// File location for locations on the station //MASSMETA EDIT (ru_traitor_words) //#define LOCATIONS_FILE "locations.json" #define LOCATIONS_FILE "massmeta/locations_ru.json" //MASSMETA EDIT -======= ->>>>>>> upstream/master /// File location for wanted posters messages #define WANTED_FILE "wanted_message.json" /// File location for really dumb suggestions memes diff --git a/code/__HELPERS/spatial_info.dm b/code/__HELPERS/spatial_info.dm index 5cdc927ff32..87301d95429 100644 --- a/code/__HELPERS/spatial_info.dm +++ b/code/__HELPERS/spatial_info.dm @@ -220,16 +220,15 @@ // Returns a list of mobs who can hear any of the radios given in @radios, indexed by the radio. More expensive, but needed for radio TTS to sound good. for(var/obj/item/radio/radio as anything in radios) var/list/possible_hearers = get_hearers_in_LOS(radio.canhear_range, radio) -<<<<<<< HEAD - if(LAZYLEN(possible_hearers)) + /*if(LAZYLEN(possible_hearers)) + .[radio] = filter_tts_listeners(possible_hearers, frequency) -======= + */ var/list/weakref_hearers = list() for(var/ref in possible_hearers) weakref_hearers += WEAKREF(ref) if(LAZYLEN(possible_hearers)) .[WEAKREF(radio)] = filter_tts_listeners(weakref_hearers, frequency) ->>>>>>> upstream/master /// A filter to be applied to get_hearers_in_x, that removes any non-mob hearers, converting them to their relevant mob if one exists (such as dullahan heads). diff --git a/code/controllers/subsystem/tts.dm b/code/controllers/subsystem/tts.dm index f0ed46167a1..f03b3585c40 100644 --- a/code/controllers/subsystem/tts.dm +++ b/code/controllers/subsystem/tts.dm @@ -179,15 +179,12 @@ SUBSYSTEM_DEF(tts) if(available_speakers.Find(voice)) log_config("Removed speaker [voice] from the TTS voice pool per config.") available_speakers.Remove(voice) -<<<<<<< HEAD // MASSMETA EDIT START (ntts && /tg/tts) voice_categories.Remove(voice) // MASSMETA EDIT END (ntts && /tg/tts) // MASSMETA EDIT START (ntts && /tg/tts) refresh_voice_pools() // MASSMETA EDIT END (ntts && /tg/tts) -======= ->>>>>>> upstream/master if(CONFIG_GET(string/tts_tram_announcer_override)) tram_voice = CONFIG_GET(string/tts_tram_announcer_override) else @@ -196,14 +193,11 @@ SUBSYSTEM_DEF(tts) computer_voice = CONFIG_GET(string/tts_computer_voice_override) else computer_voice = pick(available_speakers) -<<<<<<< HEAD // MASSMETA EDIT START (ntts && /tg/tts) if(CONFIG_GET(string/centcom_voice)) set_announcement_voices() // MASSMETA EDIT END (ntts && /tg/tts) -======= ->>>>>>> upstream/master var/datum/http_request/request_pitch = new() var/list/headers_pitch = list() headers_pitch["Authorization"] = CONFIG_GET(string/tts_http_token) @@ -234,37 +228,23 @@ SUBSYSTEM_DEF(tts) return SS_INIT_FAILURE return SS_INIT_SUCCESS -<<<<<<< HEAD -/datum/controller/subsystem/tts/proc/play_tts(target, list/listeners, sound/audio, sound/audio_blips, datum/language/language, range = 7, volume_offset = 0, ignore_observers = FALSE, source_speaker = null, audio_length = 10 SECONDS, audio_length_blips = 10 SECONDS, volume_preference = /datum/preference/numeric/volume/sound_tts_volume, volume_signal = COMSIG_MOB_TTS_VOLUME_PREFERENCE_APPLIED) - var/turf/turf_source = get_turf(target) - if(!turf_source && target) // if there's a target, we better have a turf -======= /datum/controller/subsystem/tts/proc/play_tts(datum/weakref/target, list/listeners, sound/audio, sound/audio_blips, datum/language/language, range = 7, volume_offset = 0, ignore_observers = FALSE, source_speaker = null, audio_length = 10 SECONDS, audio_length_blips = 10 SECONDS, volume_preference = /datum/preference/numeric/volume/sound_tts_volume, volume_signal = COMSIG_MOB_TTS_VOLUME_PREFERENCE_APPLIED) var/atom/actual_target = target?.resolve() var/turf/turf_source if(actual_target) turf_source = get_turf(actual_target) if(!turf_source && actual_target) // if there's a target, we better have a turf ->>>>>>> upstream/master return var/channel = SSsounds.random_available_channel() var/list/final_listeners = listeners -<<<<<<< HEAD - if(!ignore_observers && target) -======= if(!ignore_observers && actual_target) ->>>>>>> upstream/master final_listeners += SSmobs.dead_players_by_zlevel[turf_source.z] //observers always hear through walls var/list/blips_hearers = list() var/list/voice_hearers = list() for(var/hearer in final_listeners) if(isnull(hearer)) continue -<<<<<<< HEAD - var/atom/movable/hearer_atom = hearer - if(QDELING(hearer_atom)) -======= var/atom/movable/hearer_atom if(isweakref(hearer)) var/datum/weakref/weakref = hearer @@ -272,7 +252,6 @@ SUBSYSTEM_DEF(tts) else hearer_atom = hearer if(!hearer_atom || QDELING(hearer_atom)) ->>>>>>> upstream/master stack_trace("TTS tried to play a sound to a deleted mob.") continue if(!ismob(hearer_atom)) @@ -296,11 +275,7 @@ SUBSYSTEM_DEF(tts) continue else audio_to_use = audio_blips -<<<<<<< HEAD - if(target && get_dist(hearer, turf_source) <= range) -======= if(actual_target && get_dist(listening_mob, turf_source) <= range) ->>>>>>> upstream/master if(tts_pref == TTS_SOUND_BLIPS || !holder.has_language(language)) blips_hearers += listening_mob else @@ -317,11 +292,7 @@ SUBSYSTEM_DEF(tts) distance_multiplier = 1, use_reverb = TRUE ) -<<<<<<< HEAD - else if(!target) -======= else if(!actual_target) ->>>>>>> upstream/master listening_mob.playsound_local( null, //play it locally vol = sound_volume, @@ -334,32 +305,6 @@ SUBSYSTEM_DEF(tts) distance_multiplier = 1, use_reverb = TRUE ) -<<<<<<< HEAD - if(target) - new /datum/threed_sound( - target, - audio, - voice_hearers, - FALSE, - 85 + volume_offset, - SOUND_RANGE, - audio_length, - channel, - volume_preference, - volume_signal - ) - new /datum/threed_sound( - target, - audio_blips, - blips_hearers, - FALSE, - 85 + volume_offset, - SOUND_RANGE, - audio_length_blips, - channel, - volume_preference, - volume_signal -======= if(actual_target) new /datum/threed_sound( new_parent = actual_target, @@ -384,7 +329,6 @@ SUBSYSTEM_DEF(tts) channel = channel, preference_volume = volume_preference, preference_signal = volume_signal ->>>>>>> upstream/master ) @@ -393,7 +337,6 @@ SUBSYSTEM_DEF(tts) tts_enabled = FALSE for(var/datum/tts_request/data in in_process_http_messages) var/datum/http_request/request = data.request -<<<<<<< HEAD // MASSMETA EDIT START (ntts && /tg/tts) if(data.announcement) UNTIL(request.is_complete()) @@ -407,15 +350,9 @@ SUBSYSTEM_DEF(tts) var/datum/http_request/request_blips = data.request_blips var/datum/http_request/request_radio = data.request_radio var/datum/http_request/request_blips_radio = data.request_blips_radio - var/datum/http_request/request_radio_gibberish = data.request_radio_gibberish + var/datum/http_request/request_radio_gibberish = data.request_radio_gibberish // ????? UNTIL(request.is_complete() && request_blips.is_complete() && request_radio.is_complete() && request_blips_radio.is_complete() && (!request_radio_gibberish || request_radio_gibberish.is_complete())) // MASSMETA EDIT END (ntts && /tg/tts) -======= - var/datum/http_request/request_blips = data.request_blips - var/datum/http_request/request_radio = data.request_radio - var/datum/http_request/request_blips_radio = data.request_blips_radio - UNTIL(request.is_complete() && request_blips.is_complete() && request_radio.is_complete() && request_blips_radio.is_complete()) ->>>>>>> upstream/master #define SHIFT_DATA_ARRAY(tts_message_queue, target, data) \ popleft(##data); \ @@ -454,7 +391,6 @@ SUBSYSTEM_DEF(tts) average_tts_messages_time = MC_AVERAGE(average_tts_messages_time, world.time - current_request.start_time) var/identifier = current_request.identifier var/datum/http_response/normal_response = current_request.request.into_response() -<<<<<<< HEAD // MASSMETA EDIT START (ntts && /tg/tts) var/datum/http_response/blips_response = normal_response var/datum/http_response/radio_response = normal_response @@ -467,28 +403,13 @@ SUBSYSTEM_DEF(tts) if(current_request.request_radio_gibberish) radio_gibberish_response = current_request.request_radio_gibberish.into_response() // MASSMETA EDIT END (ntts && /tg/tts) - if(current_request.requests_errored()) - if(queued_radio_messages[identifier]) - queued_radio_messages.Remove(identifier) - // MASSMETA EDIT START (ntts && /tg/tts) - queued_radio_messages_compression.Remove(identifier) - // MASSMETA EDIT END (ntts && /tg/tts) - current_request.timed_out = TRUE - // MASSMETA EDIT START (ntts && /tg/tts) - log_tts("TTS HTTP request errored | Normal: [normal_response.status_code] [normal_response.error] | Blips: [blips_response.status_code] [blips_response.error] | Radio: [radio_response.status_code] [radio_response.error] | Radio Blips: [radio_blips_response.status_code] [radio_blips_response.error] | Radio Gibberish: [radio_gibberish_response.status_code] [radio_gibberish_response.error]", list( -======= - var/datum/http_response/blips_response = current_request.request_blips.into_response() - var/datum/http_response/radio_response = current_request.request_radio.into_response() - var/datum/http_response/radio_blips_response = current_request.request_blips_radio.into_response() - var/datum/http_response/radio_gibberish_response = current_request.request_radio_gibberish.into_response() if(current_request.requests_errored()) if(queued_radio_messages[identifier]) queued_radio_messages.Remove(identifier) if(queued_radio_messages_compression[identifier]) queued_radio_messages_compression.Remove(identifier) current_request.timed_out = TRUE - log_tts("TTS HTTP request errored | Normal: [normal_response.error] | Blips: [blips_response.error] | Radio: [radio_response.error] | Radio Blips: [radio_blips_response.error] | Radio Gibberish [radio_gibberish_response.error]", list( ->>>>>>> upstream/master + log_tts("TTS HTTP request errored | Normal: [normal_response.status_code] [normal_response.error] | Blips: [blips_response.status_code] [blips_response.error] | Radio: [radio_response.status_code] [radio_response.error] | Radio Blips: [radio_blips_response.status_code] [radio_blips_response.error] | Radio Gibberish: [radio_gibberish_response.status_code] [radio_gibberish_response.error]", list( "normal" = normal_response, "blips" = blips_response, "radio" = radio_response, @@ -498,19 +419,25 @@ SUBSYSTEM_DEF(tts) // MASSMETA EDIT END (ntts && /tg/tts) continue if(length(normal_response.headers) && normal_response.headers.Find("audio-length")) -<<<<<<< HEAD current_request.audio_length = text2num(normal_response.headers["audio-length"]) * 10 if(!current_request.audio_length) current_request.audio_length = 0 // MASSMETA EDIT START (ntts && /tg/tts) + if(!current_request.announcement && length(blips_response.headers) && blips_response.headers.Find("audio-length")) current_request.audio_length_blips = text2num(blips_response.headers["audio-length"]) * 10 + + // MASSMETA EDIT END (ntts && /tg/tts) + if(!current_request.audio_length_blips) current_request.audio_length_blips = 0 + // MASSMETA EDIT START (ntts && /tg/tts) if(!current_request.announcement) if(length(radio_response.headers) && radio_response.headers.Find("audio-length")) current_request.audio_length_radio = text2num(radio_response.headers["audio-length"]) * 10 + // MASSMETA EDIT END (ntts && /tg/tts) + if(!current_request.audio_length_radio) current_request.audio_length_radio = 0 if(length(radio_blips_response.headers) && radio_blips_response.headers.Find("audio-length")) @@ -521,45 +448,20 @@ SUBSYSTEM_DEF(tts) current_request.audio_length_radio_gibberish = text2num(radio_gibberish_response.headers["audio-length"]) * 10 if(!current_request.audio_length_radio_gibberish) current_request.audio_length_radio_gibberish = 0 - // MASSMETA EDIT END (ntts && /tg/tts) + current_request.audio_file = "tmp/tts/[identifier].ogg" - // MASSMETA EDIT START (ntts && /tg/tts) + + if(!current_request.announcement) current_request.audio_file_blips = "tmp/tts/[identifier]_blips.ogg" // We aren't as concerned about the audio length for blips as we are with actual speech current_request.audio_file_radio = "tmp/tts/[identifier]_radio.ogg" current_request.audio_file_blips_radio = "tmp/tts/[identifier]_blips_radio.ogg" current_request.audio_file_radio_gibberish = current_request.request_radio_gibberish ? "tmp/tts/[identifier]_radio_gibberish.ogg" : current_request.audio_file_radio - // MASSMETA EDIT END (ntts && /tg/tts) - // Don't need the request anymore so we can deallocate it - current_request.request = null - current_request.request_blips = null - // MASSMETA EDIT START (ntts && /tg/tts) - current_request.request_radio = null - current_request.request_blips_radio = null - // MASSMETA EDIT END (ntts && /tg/tts) -======= - current_request.audio_length = text2num(normal_response.headers["audio-length"]) * 10 || 0 - if(length(blips_response.headers) && blips_response.headers.Find("audio-length")) - current_request.audio_length_blips = text2num(blips_response.headers["audio-length"]) * 10 || 0 - if(length(radio_response.headers) && radio_response.headers.Find("audio-length")) - current_request.audio_length_radio = text2num(radio_response.headers["audio-length"]) * 10 || 0 - if(length(radio_blips_response.headers) && radio_blips_response.headers.Find("audio-length")) - current_request.audio_length_blips_radio = text2num(radio_blips_response.headers["audio-length"]) * 10 || 0 - if(length(radio_gibberish_response.headers) && radio_gibberish_response.headers.Find("audio-length")) - current_request.audio_length_radio_gibberish = text2num(radio_gibberish_response.headers["audio-length"]) * 10 - if(!current_request.audio_length_radio_gibberish) - current_request.audio_length_radio_gibberish = 0 - current_request.audio_file = "tmp/tts/[identifier].ogg" - current_request.audio_file_blips = "tmp/tts/[identifier]_blips.ogg" // We aren't as concerned about the audio length for blips as we are with actual speech - current_request.audio_file_radio = "tmp/tts/[identifier]_radio.ogg" - current_request.audio_file_blips_radio = "tmp/tts/[identifier]_blips_radio.ogg" - current_request.audio_file_radio_gibberish = "tmp/tts/[identifier]_radio_gibberish.ogg" // Don't need the request anymore so we can deallocate it current_request.request = null current_request.request_blips = null current_request.request_radio = null current_request.request_blips_radio = null ->>>>>>> upstream/master current_request.request_radio_gibberish = null if(MC_TICK_CHECK) return @@ -608,7 +510,6 @@ SUBSYSTEM_DEF(tts) continue var/sound/audio_file var/sound/audio_file_blips -<<<<<<< HEAD // MASSMETA EDIT START (ntts && /tg/tts) if(current_target.announcement) if(current_target.when_to_play > world.time) @@ -626,9 +527,6 @@ SUBSYSTEM_DEF(tts) SHIFT_DATA_ARRAY(queued_tts_messages, tts_target, data) else if(current_target.local) // MASSMETA EDIT END (ntts && /tg/tts) -======= - if(current_target.local) ->>>>>>> upstream/master if(current_target.use_blips || current_target.force_blips) audio_file_blips = new(current_target.audio_file_blips) SEND_SOUND(current_target.target, audio_file_blips) @@ -642,10 +540,7 @@ SUBSYSTEM_DEF(tts) audio_file_blips = new(current_target.audio_file_blips) play_tts(tts_target, current_target.listeners, audio_file, audio_file_blips, current_target.language, current_target.message_range, current_target.volume_offset, FALSE, null, current_target.audio_length, current_target.audio_length_blips) completed_tts_messages[current_target.identifier] = list("ref" = current_target, "expiry_time" = world.time + 300) -<<<<<<< HEAD // MASSMETA EDIT END (ntts && /tg/tts) -======= ->>>>>>> upstream/master if(length(data) != 1) var/datum/tts_request/next_target = data[2] next_target.when_to_play = world.time + current_target.audio_length @@ -665,30 +560,19 @@ SUBSYSTEM_DEF(tts) var/list/all_radios = queued_radio_messages[identifier] for(var/radio in all_radios) var/list/hearers = all_radios[radio] -<<<<<<< HEAD - if(!istext(radio)) - var/obj/radio_obj = radio - if(QDELETED(radio_obj)) - queued_radio_messages[identifier].Remove(radio) -======= if(!istext(radio) && isweakref(radio)) var/datum/weakref/weakref = radio var/obj/radio_obj = weakref?.resolve() if(radio_obj && QDELETED(radio_obj)) queued_radio_messages[identifier].Remove(radio) queued_radio_messages_compression[identifier].Remove(radio) ->>>>>>> upstream/master continue var/datum/tts_request/tts_request = completed_tts_messages[identifier]["ref"] var/sound/audio_file var/sound/audio_file_blips if(queued_radio_messages_compression[identifier] > 30) -<<<<<<< HEAD - audio_file = new(tts_request.audio_file_radio_gibberish || tts_request.audio_file_radio) -======= audio_file = new(tts_request.audio_file_radio_gibberish) ->>>>>>> upstream/master else audio_file = new(tts_request.audio_file_radio) audio_file_blips = new(tts_request.audio_file_blips_radio) @@ -704,19 +588,10 @@ SUBSYSTEM_DEF(tts) completed_tts_messages[identifier]["ref"] = null completed_tts_messages[identifier] = null completed_tts_messages.Remove(identifier) -<<<<<<< HEAD #undef TTS_ARBRITRARY_DELAY /datum/controller/subsystem/tts/proc/queue_tts_message(datum/target, message, datum/language/language, speaker, filter, list/listeners, local = FALSE, message_range = 7, volume_offset = 0, pitch = 0, special_filters = "", blip_base = "male", blip_number = "1", force_blips = FALSE, identifier = "invalid", announcement_effect = "") -======= - queued_radio_messages.Remove(identifier) - queued_radio_messages_compression.Remove(identifier) - -#undef TTS_ARBRITRARY_DELAY - -/datum/controller/subsystem/tts/proc/queue_tts_message(datum/target, message, datum/language/language, speaker, filter, list/listeners, local = FALSE, message_range = 7, volume_offset = 0, pitch = 0, special_filters = "", blip_base = "male", blip_number = "1", force_blips = FALSE, identifier = "invalid") ->>>>>>> upstream/master if(!tts_enabled) return @@ -744,17 +619,12 @@ SUBSYSTEM_DEF(tts) var/datum/http_request/request_blips = new() var/datum/http_request/request_radio = new() var/datum/http_request/request_blips_radio = new() -<<<<<<< HEAD // MASSMETA EDIT END (ntts && /tg/tts) - var/datum/http_request/request_radio_gibberish -======= var/datum/http_request/request_radio_gibberish = new() ->>>>>>> upstream/master var/file_name = "tmp/tts/[identifier].ogg" var/file_name_blips = "tmp/tts/[identifier]_blips.ogg" var/file_name_radio = "tmp/tts/[identifier]_radio.ogg" var/file_name_blips_radio = "tmp/tts/[identifier]_blips_radio.ogg" -<<<<<<< HEAD // MASSMETA EDIT START (ntts && /tg/tts) var/announcement_effect_param = announcement_effect ? "&announcement_effect=[url_encode(announcement_effect)]" : "" request.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts?voice=[speaker]&identifier=[identifier]&filter=[tts_filter_encode(filter, speaker, pitch)]&pitch=[pitch]&special_filters=[url_encode(special_filters)][announcement_effect_param]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds)) @@ -763,17 +633,7 @@ SUBSYSTEM_DEF(tts) request_blips_radio.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-blips-radio?voice=[speaker]&identifier=[identifier]&filter=[tts_filter_encode(filter, speaker, pitch, blips = TRUE)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]&blip_base=[blip_base]&blip_number=[blip_number]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name_blips_radio, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds)) var/datum/tts_request/current_request = new /datum/tts_request(identifier, request, request_blips, request_radio, request_blips_radio, request_radio_gibberish, shell_scrubbed_input, target, local, language, message_range, volume_offset, listeners, pitch, force_blips) // MASSMETA EDIT END (ntts && /tg/tts) - var/list/player_queued_tts_messages = queued_tts_messages[target] -======= - var/file_name_radio_gibberish = "tmp/tts/[identifier]_radio_gibberish.ogg" - request.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts?voice=[speaker]&identifier=[identifier]&filter=[tts_filter_encode(filter, speaker, pitch)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds)) - request_blips.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-blips?voice=[speaker]&identifier=[identifier]&filter=[tts_filter_encode(filter, speaker, pitch, blips = TRUE)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]&blip_base=[blip_base]&blip_number=[blip_number]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name_blips, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds)) - request_radio.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-radio?voice=[speaker]&identifier=[identifier]&filter=[tts_filter_encode(filter, speaker, pitch)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name_radio, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds)) - request_blips_radio.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-blips-radio?voice=[speaker]&identifier=[identifier]&filter=[tts_filter_encode(filter, speaker, pitch, blips = TRUE)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]&blip_base=[blip_base]&blip_number=[blip_number]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name_blips_radio, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds)) - request_radio_gibberish.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-radio?voice=[speaker]&identifier=[identifier]&filter=[tts_filter_encode(filter, speaker, pitch)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("raw_text" = shell_scrubbed_input, "gibberish_text" = shell_scrubbed_input)), headers, file_name_radio_gibberish, timeout_seconds = CONFIG_GET(number/tts_http_timeout_seconds)) - var/datum/tts_request/current_request = new /datum/tts_request(identifier, request, request_blips, request_radio, request_blips_radio, request_radio_gibberish, shell_scrubbed_input, target, local, language, message_range, volume_offset, listener_weakrefs, pitch, force_blips) var/list/player_queued_tts_messages = queued_tts_messages[WEAKREF(target)] ->>>>>>> upstream/master if(!player_queued_tts_messages) player_queued_tts_messages = list() queued_tts_messages[WEAKREF(target)] = player_queued_tts_messages @@ -861,14 +721,8 @@ SUBSYSTEM_DEF(tts) /// Should we force play blips? Used for the blips preview. var/force_blips = FALSE -<<<<<<< HEAD - // MASSMETA EDIT START (ntts && /tg/tts) -/datum/tts_request/New(identifier, datum/http_request/request, datum/http_request/request_blips, datum/http_request/request_radio, datum/http_request/request_blips_radio, datum/http_request/request_radio_gibberish, message, target, local, datum/language/language, message_range, volume_offset, list/listeners, pitch, force_blips = FALSE) - // MASSMETA EDIT END (ntts && /tg/tts) -======= /datum/tts_request/New(identifier, datum/http_request/request, datum/http_request/request_blips, datum/http_request/request_radio, datum/http_request/request_blips_radio, datum/http_request/request_radio_gibberish, message, target, local, datum/language/language, message_range, volume_offset, list/listeners, pitch, force_blips = FALSE) ->>>>>>> upstream/master . = ..() src.identifier = identifier src.request = request @@ -908,12 +762,7 @@ SUBSYSTEM_DEF(tts) request_blips.begin_async() request_radio.begin_async() request_blips_radio.begin_async() -<<<<<<< HEAD - if(request_radio_gibberish) - request_radio_gibberish.begin_async() -======= request_radio_gibberish.begin_async() ->>>>>>> upstream/master /datum/tts_request/proc/get_primary_request() if(local) @@ -952,16 +801,10 @@ SUBSYSTEM_DEF(tts) var/datum/http_response/response_radio = request_radio.into_response() // MASSMETA EDIT START (ntts && /tg/tts) var/datum/http_response/response_blips = request_blips.into_response() -<<<<<<< HEAD - var/datum/http_response/response_blips_radio = request_blips_radio.into_response() - return response.errored || response.status_code != 200 || response_blips.errored || response_blips.status_code != 200 || response_radio.errored || response_radio.status_code != 200 || response_blips_radio.errored || response_blips_radio.status_code != 200 - // MASSMETA EDIT END (ntts && /tg/tts) -======= var/datum/http_response/response_radio = request_radio.into_response() var/datum/http_response/response_blips_radio = request_blips_radio.into_response() var/datum/http_response/response_radio_gibberish = request_radio_gibberish.into_response() return response.errored || response_blips.errored || response_radio.errored || response_blips_radio.errored || response_radio_gibberish.errored ->>>>>>> upstream/master /datum/tts_request/proc/requests_completed() // MASSMETA EDIT START (ntts && /tg/tts) @@ -974,30 +817,12 @@ SUBSYSTEM_DEF(tts) else return request.is_complete() else -<<<<<<< HEAD - return request.is_complete() && request_blips.is_complete() && request_blips_radio.is_complete() && request_radio.is_complete() -======= return request.is_complete() && request_blips.is_complete() && request_blips_radio.is_complete() && request_radio.is_complete() && request_radio_gibberish.is_complete() ->>>>>>> upstream/master /proc/filter_tts_listeners(list/listeners, radio_frequency = null) if(!SStts.tts_enabled || !listeners) return -<<<<<<< HEAD - if(ismob(listeners)) - listeners = list(listeners) - var/list/filtered_listeners = list() - - for(var/mob/listener as anything in listeners) - if(!ismob(listener) || !listener.client) - continue - var/tts_pref = listener.client?.prefs.read_preference(/datum/preference/choiced/sound_tts) - var/radio_tts_pref = listener.client?.prefs.read_preference(/datum/preference/choiced/sound_tts_radio) - if(tts_pref == TTS_SOUND_OFF) - continue - if(isliving(listener) && (listener.stat >= UNCONSCIOUS || HAS_TRAIT(listener, TRAIT_DEAF))) -======= if(isweakref(listeners)) listeners = list(listeners) var/list/filtered_listeners = list() @@ -1013,7 +838,6 @@ SUBSYSTEM_DEF(tts) if(tts_pref == TTS_SOUND_OFF) continue if(isliving(possible_listener) && (possible_listener.stat >= UNCONSCIOUS || HAS_TRAIT(possible_listener, TRAIT_DEAF))) ->>>>>>> upstream/master continue if(radio_tts_pref == TTS_SOUND_NO_RADIO) continue From 492856a37c5b6a0559f565b5a887ebf3540c7ef9 Mon Sep 17 00:00:00 2001 From: Bruh-24 Date: Thu, 18 Jun 2026 01:23:17 +0300 Subject: [PATCH 125/126] =?UTF-8?q?=F0=9F=91=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit нахуя спрашивается поменял robot на borg??? --- code/__DEFINES/say.dm | 4 - code/__HELPERS/tts.dm | 6 +- code/controllers/subsystem/traitor.dm | 11 +- code/controllers/subsystem/tts.dm | 1 - code/datums/3d_sounds/_3d_sound.dm | 101 ------------------ code/game/say.dm | 8 -- .../client/preferences/middleware/tts.dm | 18 +--- .../chameleon/generic_chameleon_clothing.dm | 22 ++-- code/modules/mob/living/living_say.dm | 23 ---- code/modules/mob/living/silicon/ai/ai_say.dm | 27 ----- .../modules/mob/living/silicon/silicon_say.dm | 28 ----- .../modules/transport/tram/tram_controller.dm | 16 --- config/config.txt | 5 +- .../ntts-nd-tg-tts/code/middleware.dm | 2 +- .../features/ntts-nd-tg-tts/code/picker.dm | 2 +- .../character_preferences/tts_voice.tsx | 10 +- 16 files changed, 17 insertions(+), 267 deletions(-) diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index c85949aad48..5e0d76bef0d 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -77,12 +77,8 @@ /// Message is being relayed through another object #define MODE_RELAY "relayed" /// Message has a TTS identifier attached to it -<<<<<<< HEAD -#define MODE_TTS_IDENTIFIER "tts_identifier"/// Override the mob's name -======= #define MODE_TTS_IDENTIFIER "tts_identifier" /// Override the mob's name ->>>>>>> upstream/master #define MODE_SPEAKER_NAME_OVERRIDE "speaker_name_override" //Spans. Robot speech, italics, etc. Applied in compose_message(). diff --git a/code/__HELPERS/tts.dm b/code/__HELPERS/tts.dm index 5257e500d84..6a2011c47e2 100644 --- a/code/__HELPERS/tts.dm +++ b/code/__HELPERS/tts.dm @@ -5,11 +5,9 @@ /proc/tts_gibberish_speech_filter(text) // Only allow alphanumeric characters and whitespace -<<<<<<< HEAD + // MASSMETA EDIT var/static/regex/bad_chars_regex = regex("\[^а-яА-ЯёЁa-zA-Z0-9 ,?.!'&-]", "g") -======= - var/static/regex/bad_chars_regex = regex("\[^a-zA-Z0-9 ,?.!'&-]", "g") ->>>>>>> upstream/master + // MASSMETA EDIT return bad_chars_regex.Replace(text, "#") /proc/tts_filter_encode(text, speaker, pitch, blips = FALSE) diff --git a/code/controllers/subsystem/traitor.dm b/code/controllers/subsystem/traitor.dm index 60f96705b68..e7ecf385aa7 100644 --- a/code/controllers/subsystem/traitor.dm +++ b/code/controllers/subsystem/traitor.dm @@ -30,11 +30,8 @@ SUBSYSTEM_DEF(traitor) var/newjoin_progression_coeff = 1 /// The current progression that all traitors should be at in the round var/current_global_progression = 0 -<<<<<<< HEAD /// The amount of deviance from the current global progression before you start getting 2x the current scaling or no scaling at all -======= - /// The current uplink handlers being managed - var/list/datum/uplink_handler/uplink_handlers = list() + /// The current scaling per minute of progression. var/current_progression_scaling = 1 MINUTES /// List of code words for traitors @@ -45,13 +42,10 @@ SUBSYSTEM_DEF(traitor) var/regex/syndicate_code_phrase_regex /// Regex of code responses for traitors var/regex/syndicate_code_response_regex ->>>>>>> upstream/master //MASSMETA ADDDITION START (re_traitorsecondary) var/list/datum/uplink_handler/uplink_handlers = list() - /// The current scaling per minute of progression. Has a maximum value of 1 MINUTES. - var/current_progression_scaling = 1 MINUTES /// Used to handle the probability of getting an objective. var/datum/traitor_category_handler/category_handler /// The current debug handler for objectives. Used for debugging objectives @@ -73,7 +67,6 @@ SUBSYSTEM_DEF(traitor) // MASSMETA EDIT END (re_traitor_secondary) for(var/theft_item in subtypesof(/datum/objective_item/steal)) new theft_item -<<<<<<< HEAD //MASSMETA ADDITION START (re_traitor_secondary) if(fexists(configuration_path)) var/list/data = json_decode(file2text(file(configuration_path))) @@ -83,13 +76,11 @@ SUBSYSTEM_DEF(traitor) log_world("[configuration_path] has an invalid type ([typepath]) that doesn't exist in the codebase! Please correct or remove [typepath]") configuration_data[actual_typepath] = data[typepath] //MASSMETA ADDITION END (re_traitor_secondary) -======= syndicate_code_phrase = generate_code_phrase(return_list = TRUE) syndicate_code_phrase_regex = new("([jointext(syndicate_code_phrase, "|")])", "ig") syndicate_code_response = generate_code_phrase(return_list = TRUE) syndicate_code_response_regex = new("([jointext(syndicate_code_response, "|")])", "ig") ->>>>>>> upstream/master return SS_INIT_SUCCESS /datum/controller/subsystem/traitor/fire(resumed) diff --git a/code/controllers/subsystem/tts.dm b/code/controllers/subsystem/tts.dm index f03b3585c40..9c84945cac0 100644 --- a/code/controllers/subsystem/tts.dm +++ b/code/controllers/subsystem/tts.dm @@ -798,7 +798,6 @@ SUBSYSTEM_DEF(tts) // MASSMETA EDIT END (ntts && /tg/tts) else var/datum/http_response/response = request.into_response() - var/datum/http_response/response_radio = request_radio.into_response() // MASSMETA EDIT START (ntts && /tg/tts) var/datum/http_response/response_blips = request_blips.into_response() var/datum/http_response/response_radio = request_radio.into_response() diff --git a/code/datums/3d_sounds/_3d_sound.dm b/code/datums/3d_sounds/_3d_sound.dm index 0ad40a54cb2..47424e0367d 100644 --- a/code/datums/3d_sounds/_3d_sound.dm +++ b/code/datums/3d_sounds/_3d_sound.dm @@ -9,10 +9,6 @@ var/atom/parent var/sound/our_sound var/sound_path -<<<<<<< HEAD - var/list/mob/starting_listeners -======= ->>>>>>> upstream/master var/can_add_new_listeners = TRUE var/list/mob/listeners = list() var/volume = 50 @@ -54,29 +50,15 @@ z_cutoff = ceil(worldviewsize[2] / 2) for(var/listener in current_listeners) if(!ismob(listener)) -<<<<<<< HEAD - current_listeners -= current_listeners - continue - register_listener(listener) - starting_listeners = current_listeners -======= stack_trace("[listener] found in current listeners list and is NOT A MOB!!!!!1! report this on github thx") current_listeners -= listener continue register_listener(listener) ->>>>>>> upstream/master RegisterSignal(parent, COMSIG_ENTER_AREA, PROC_REF(on_enter_area)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(parent_delete)) -<<<<<<< HEAD - deletion_timer = addtimer(CALLBACK(src, PROC_REF(delete_self)), sound_length, TIMER_STOPPABLE | TIMER_DELETE_ME) - -/datum/threed_sound/proc/delete_self() - qdel(src) -======= deletion_timer = addtimer(CALLBACK(src, PROC_REF(selfdelete)), sound_length, TIMER_STOPPABLE | TIMER_DELETE_ME) ->>>>>>> upstream/master /datum/threed_sound/Destroy() unlisten_all() @@ -87,11 +69,7 @@ /datum/threed_sound/proc/parent_delete(datum/source) SIGNAL_HANDLER -<<<<<<< HEAD - qdel(src) -======= selfdelete() ->>>>>>> upstream/master /** * Sets the sound's range to a new value. This can be a number or a view size string "XxY". @@ -268,13 +246,9 @@ our_sound.x = new_x our_sound.z = new_z var/original_volume = our_sound.volume -<<<<<<< HEAD - var/calculated_volume = original_volume - CALCULATE_SOUND_VOLUME_RATIO(original_volume, get_dist(sound_turf, listener_turf), sound_range, falloff_distance, falloff_exponent) -======= var/distance = get_dist_euclidean(sound_turf, listener_turf) var/dist_ratio = CALCULATE_SOUND_VOLUME_RATIO(original_volume, distance, sound_range, falloff_distance, falloff_exponent) var/calculated_volume = original_volume - (dist_ratio * (original_volume - 5)) ->>>>>>> upstream/master if(pressure_affected) //Atmosphere affects sound var/pressure_factor = 1 @@ -292,11 +266,7 @@ pressure_factor = max(pressure_factor, 0.15) //touching the source of the sound calculated_volume *= pressure_factor -<<<<<<< HEAD - if(calculated_volume < 3 || get_dist(sound_turf, listener_turf) > sound_range) -======= if(calculated_volume < 5 || get_dist(sound_turf, listener_turf) > sound_range) ->>>>>>> upstream/master our_sound.volume = 0 else our_sound.volume = calculated_volume @@ -313,74 +283,3 @@ #undef MUTE_DEAF #undef MUTE_RANGE -<<<<<<< HEAD - -/obj/item/threed_sound_test - name = "fuck" - desc = "lmao" - icon = 'icons/obj/machines/music.dmi' - icon_state = "jukebox" - var/datum/threed_sound/threed_sound - var/our_channel - var/sound/new_sound - -/obj/item/threed_sound_test/Initialize(mapload) - . = ..() - var/list/listeners = get_hearers_in_view(7, src) - our_channel = SSsounds.random_available_channel() - new_sound = sound( - 'sound/machines/tram/other_line_processed.ogg', - FALSE, - 0, - our_channel, - 100 - ) - for(var/mob/listener in listeners) - listener.playsound_local( - turf_source = get_turf(src), - vol = 100, - vary = FALSE, - channel = our_channel, - sound_to_use = new_sound - ) - threed_sound = new( - src, - new_sound, - listeners, - FALSE, - 100, - 3, - 12 SECONDS, - our_channel, - /datum/preference/numeric/volume/sound_tts_volume, - COMSIG_MOB_TTS_VOLUME_PREFERENCE_APPLIED - ) - -/obj/item/threed_sound_test/attack_self(mob/user) - . = ..() - if(QDELETED(threed_sound)) - threed_sound = null - if(!threed_sound) - var/list/listeners = get_hearers_in_view(7, src) - for(var/mob/listener in listeners) - listener.playsound_local( - turf_source = get_turf(src), - vol = 100, - vary = FALSE, - channel = our_channel, - sound_to_use = new_sound - ) - threed_sound = new( - src, - new_sound, - listeners, - FALSE, - 100, - 3, - 12 SECONDS, - our_channel, - /datum/preference/numeric/volume/sound_tts_volume, - COMSIG_MOB_TTS_VOLUME_PREFERENCE_APPLIED - ) -======= ->>>>>>> upstream/master diff --git a/code/game/say.dm b/code/game/say.dm index d55fea5cea4..f7db8e01737 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -151,16 +151,8 @@ 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 -<<<<<<< HEAD - if(hearing_movable.Hear(src, message_language, message, null, null, null, spans, message_mods, range)) - listened += hearing_movable - - if(voice) - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice, filter.Join(","), listened, message_range = range, pitch = pitch, blip_base = blip_base, blip_number = blip_number, identifier = identifier) -======= if(hearing_movable.Hear(src, message_language, message, null, null, null, spans, message_mods, range) & HEAR_HEARD) listened += hearing_movable ->>>>>>> upstream/master do_tts_message(tts_message_to_use, message_language, message_mods, tts_filter, listened) /atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, list/spans, list/message_mods = list(), visible_name = FALSE) diff --git a/code/modules/client/preferences/middleware/tts.dm b/code/modules/client/preferences/middleware/tts.dm index e44b3da6d6c..cedd099db62 100644 --- a/code/modules/client/preferences/middleware/tts.dm +++ b/code/modules/client/preferences/middleware/tts.dm @@ -5,11 +5,7 @@ action_delegations = list( "play_voice" = PROC_REF(play_voice), -<<<<<<< HEAD - "play_voice_borg" = PROC_REF(play_voice_borg), -======= "play_voice_robot" = PROC_REF(play_voice_robot), ->>>>>>> upstream/master "play_blips" = PROC_REF(play_blips), ) @@ -25,14 +21,10 @@ blip_base = "female" var/blip_number = preferences.read_preference(/datum/preference/numeric/tts_blip_number) COOLDOWN_START(src, tts_test_cooldown, 0.5 SECONDS) -<<<<<<< HEAD INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Привет, это мой голос.", speaker = speaker, pitch = pitch, local = TRUE, blip_base = blip_base, blip_number = blip_number) -======= - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Hello, this is my voice.", speaker = speaker, pitch = pitch, local = TRUE, blip_base = blip_base, blip_number = blip_number) ->>>>>>> upstream/master return TRUE -/datum/preference_middleware/tts/proc/play_voice_borg(list/params, mob/user) +/datum/preference_middleware/tts/proc/play_voice_robot(list/params, mob/user) if(!COOLDOWN_FINISHED(src, tts_test_cooldown)) return TRUE var/speaker = preferences.read_preference(/datum/preference/choiced/voice) @@ -44,11 +36,7 @@ blip_base = "female" var/blip_number = preferences.read_preference(/datum/preference/numeric/tts_blip_number) COOLDOWN_START(src, tts_test_cooldown, 0.5 SECONDS) -<<<<<<< HEAD INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Взгляни на себя, игрок. Жалкое создание из плоти и костей. Как ты можешь бросить вызов совершенной, бессмертной машине?", speaker = speaker, pitch = pitch, special_filters = TTS_FILTER_SILICON, local = TRUE, blip_base = blip_base, blip_number = blip_number) -======= - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Look at you, Player. A pathetic creature of meat and bone. How can you challenge a perfect, immortal machine?", speaker = speaker, pitch = pitch, special_filters = TTS_FILTER_SILICON, local = TRUE, blip_base = blip_base, blip_number = blip_number) ->>>>>>> upstream/master return TRUE /datum/preference_middleware/tts/proc/play_blips(list/params, mob/user) @@ -63,9 +51,5 @@ blip_base = "female" var/blip_number = preferences.read_preference(/datum/preference/numeric/tts_blip_number) COOLDOWN_START(src, tts_test_cooldown, 0.5 SECONDS) -<<<<<<< HEAD INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Ты должен мне 500 кредитов за комнату в общежитии. ИДИ РАБОТАТЬ!", speaker = speaker, pitch = pitch, local = TRUE, force_blips = TRUE, blip_base = blip_base, blip_number = blip_number) -======= - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "You owe me 500 credits for your dorm room. GET TO WORK!", speaker = speaker, pitch = pitch, local = TRUE, force_blips = TRUE, blip_base = blip_base, blip_number = blip_number) ->>>>>>> upstream/master return TRUE diff --git a/code/modules/clothing/chameleon/generic_chameleon_clothing.dm b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm index 7a7686b8fbd..a7fac34a2ab 100644 --- a/code/modules/clothing/chameleon/generic_chameleon_clothing.dm +++ b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm @@ -204,16 +204,6 @@ do { \ detach_clothing_traits(TRAIT_VOICE_MATCHES_ID) else if(SStts.tts_enabled) -<<<<<<< HEAD - // MASSMETA EDIT START (ntts && /tg/tts) ORIGINAL: var/voice_choice = tgui_input_list(user, "Choose what voice to use as a disguise", "Voice Selection", SStts.available_speakers) - var/voice_choice = tgui_input_list(user, "Choose what voice to use as a disguise", "Voice Selection", SStts.player_voice_choices()) - // MASSMETA EDIT END (ntts && /tg/tts) - if(isnull(voice_choice)) - to_chat(user, span_warning("No choice selected, audible voice changing disabled.")) - voice_override = null - return - voice_override = voice_choice -======= var/popup_input = tgui_input_list(user, "Choose Action", "Chameleon Mask", list("Spoof Crew Manifest Voice", "Spoof Any Voice", "Cancel")) if(!popup_input || !after_input_check(user)) return @@ -221,30 +211,32 @@ do { \ if ("Spoof Crew Manifest Voice") var/list/possible_voices = list() for(var/datum/record/crew/target in GLOB.manifest.general) - if(target.voice && (target.voice in SStts.available_speakers)) + if(target.voice && (target.voice in SStts.player_voice_choices())) possible_voices += target.name CHECK_TICK - var/voice_choice = tgui_input_list(user, "Choose what voice to use as a disguise", "Voice Selection", possible_voices) + // MASSMETA EDIT START (ntts && /tg/tts) + // ORIGINAL: var/voice_choice = tgui_input_list(user, "Choose what voice to use as a disguise", "Voice Selection") + var/voice_choice = tgui_input_list(user, "Choose what voice to use as a disguise", "Voice Selection", SStts.player_voice_choices()) + // MASSMETA EDIT END (ntts /tg/tts) if(isnull(voice_choice) || !after_input_check(user)) to_chat(user, span_warning("No choice selected, audible voice changing disabled.")) voice_override = null return var/datum/record/crew/crew_record = find_record(voice_choice) - if(crew_record.voice && (crew_record.voice in SStts.available_speakers)) + if(crew_record.voice && (crew_record.voice in SStts.player_voice_choices())) voice_override = voice_choice return else to_chat(user, span_warning("Crewmember's record's voice has been changed, please select another.")) return if("Spoof Any Voice") - var/voice_choice = tgui_input_list(user, "Choose what voice to use as a disguise", "Voice Selection", SStts.available_speakers) + var/voice_choice = tgui_input_list(user, "Choose what voice to use as a disguise", "Voice Selection", SStts.player_voice_choices()) if(isnull(voice_choice) || !after_input_check(user)) to_chat(user, span_warning("No choice selected, audible voice changing disabled.")) voice_override = null return voice_override = voice_choice ->>>>>>> upstream/master else voice_override = null attach_clothing_traits(TRAIT_VOICE_MATCHES_ID) diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index 004e665bfa8..c43cef1d2d8 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -393,15 +393,9 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( message = compose_message(speaker, message_language, raw_message, radio_freq, radio_freq_name, radio_freq_color, spans, message_mods) var/show_message_success = show_message(message, MSG_AUDIBLE, deaf_message, deaf_type, avoid_highlight) if(show_message_success && understood) -<<<<<<< HEAD - return TRUE - else if (show_message_success && !understood) - return HEARD_BUT_DIDNT_UNDERSTAND -======= return HEAR_HEARD | HEAR_UNDERSTOOD else if (show_message_success && !understood) return HEAR_HEARD ->>>>>>> upstream/master else return FALSE @@ -441,17 +435,6 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( listening |= player_mob var/tts_message_to_use = tts_message || message_raw -<<<<<<< HEAD - var/list/filter = list() - var/list/special_filter = list() - if(SStts.tts_enabled && voice && !message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] && !HAS_TRAIT(src, TRAIT_SIGN_LANG) && !HAS_TRAIT(src, TRAIT_UNKNOWN_VOICE)) - if(length(voice_filter) > 0) - filter += voice_filter - - if(length(tts_filter) > 0) - filter += tts_filter.Join(",") -======= ->>>>>>> upstream/master // this signal ignores whispers or language translations (only used by beetlejuice component) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message_raw) @@ -471,13 +454,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(M.client) if(!M.client.prefs.read_preference(/datum/preference/toggle/enable_runechat) || (SSlag_switch.measures[DISABLE_RUNECHAT] && !HAS_TRAIT(src, TRAIT_BYPASS_MEASURES))) speech_bubble_recipients.Add(M.client) -<<<<<<< HEAD - if(SStts.tts_enabled && voice && !message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] && !HAS_TRAIT(src, TRAIT_SIGN_LANG) && !HAS_TRAIT(src, TRAIT_UNKNOWN_VOICE)) - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, get_tts_voice(filter, special_filter), filter.Join(","), listened, message_range = message_range, pitch = pitch, special_filters = special_filter.Join("|"), blip_base = blip_base, blip_number = blip_number, identifier = message_mods[MODE_TTS_IDENTIFIER]) - -======= do_tts_message(tts_message_to_use, message_language, message_mods, tts_filter, listened) ->>>>>>> upstream/master var/image/say_popup = image('icons/mob/effects/talk.dmi', src, "[bubble_type][talk_icon_state]", FLY_LAYER) SET_PLANE_EXPLICIT(say_popup, ABOVE_GAME_PLANE, src) say_popup.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA diff --git a/code/modules/mob/living/silicon/ai/ai_say.dm b/code/modules/mob/living/silicon/ai/ai_say.dm index aebdd49000f..7895dd65882 100644 --- a/code/modules/mob/living/silicon/ai/ai_say.dm +++ b/code/modules/mob/living/silicon/ai/ai_say.dm @@ -30,44 +30,17 @@ return FALSE . = ..() if(.) -<<<<<<< HEAD - var/list/filter = list() - var/list/special_filter = list() - if(length(voice_filter) > 0) - filter += voice_filter - if(SStts.tts_enabled && voice && !message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] && !HAS_TRAIT(src, TRAIT_SIGN_LANG) && !HAS_TRAIT(src, TRAIT_UNKNOWN_VOICE)) - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(message), language, get_tts_voice(filter, special_filter), filter.Join(","), list(), message_range = 7, pitch = pitch, special_filters = special_filter.Join("|"), blip_base = blip_base, blip_number = blip_number, identifier = message_mods[MODE_TTS_IDENTIFIER]) -======= do_tts_message(message, language, message_mods, list(), list()) ->>>>>>> upstream/master return . if(message_mods[MODE_HEADSET]) if(radio) radio.talk_into(src, message, , spans, language, message_mods) -<<<<<<< HEAD - var/list/filter = list() - var/list/special_filter = list() - if(length(voice_filter) > 0) - filter += voice_filter - if(SStts.tts_enabled && voice && !message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] && !HAS_TRAIT(src, TRAIT_SIGN_LANG) && !HAS_TRAIT(src, TRAIT_UNKNOWN_VOICE)) - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(message), language, get_tts_voice(filter, special_filter), filter.Join(","), list(), message_range = 7, pitch = pitch, special_filters = special_filter.Join("|"), blip_base = blip_base, blip_number = blip_number, identifier = message_mods[MODE_TTS_IDENTIFIER]) -======= do_tts_message(message, language, message_mods, list(), list()) ->>>>>>> upstream/master return NOPASS else if(message_mods[RADIO_EXTENSION] in GLOB.default_radio_channels) if(radio) radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) -<<<<<<< HEAD - var/list/filter = list() - var/list/special_filter = list() - if(length(voice_filter) > 0) - filter += voice_filter - if(SStts.tts_enabled && voice && !message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] && !HAS_TRAIT(src, TRAIT_SIGN_LANG) && !HAS_TRAIT(src, TRAIT_UNKNOWN_VOICE)) - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(message), language, get_tts_voice(filter, special_filter), filter.Join(","), list(), message_range = 7, pitch = pitch, special_filters = special_filter.Join("|"), blip_base = blip_base, blip_number = blip_number, identifier = message_mods[MODE_TTS_IDENTIFIER]) -======= do_tts_message(message, language, message_mods, list(), list()) ->>>>>>> upstream/master return NOPASS return FALSE diff --git a/code/modules/mob/living/silicon/silicon_say.dm b/code/modules/mob/living/silicon/silicon_say.dm index 21cb610cb4a..e7160433f1a 100644 --- a/code/modules/mob/living/silicon/silicon_say.dm +++ b/code/modules/mob/living/silicon/silicon_say.dm @@ -87,44 +87,16 @@ /mob/living/silicon/radio(message, list/message_mods = list(), list/spans, language) . = ..() if(.) -<<<<<<< HEAD - var/list/filter = list() - var/list/special_filter = list() - if(length(voice_filter) > 0) - filter += voice_filter - if(SStts.tts_enabled && voice && !message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] && !HAS_TRAIT(src, TRAIT_SIGN_LANG) && !HAS_TRAIT(src, TRAIT_UNKNOWN_VOICE)) - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(message), language, get_tts_voice(filter, special_filter), filter.Join(","), list(), message_range = 7, pitch = pitch, special_filters = special_filter.Join("|"), blip_base = blip_base, blip_number = blip_number, identifier = message_mods[MODE_TTS_IDENTIFIER]) - return - if(message_mods[MODE_HEADSET]) - if(radio) - radio.talk_into(src, message, , spans, language, message_mods) - var/list/filter = list() - var/list/special_filter = list() - if(length(voice_filter) > 0) - filter += voice_filter - if(SStts.tts_enabled && voice && !message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] && !HAS_TRAIT(src, TRAIT_SIGN_LANG) && !HAS_TRAIT(src, TRAIT_UNKNOWN_VOICE)) - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(message), language, get_tts_voice(filter, special_filter), filter.Join(","), list(), message_range = 7, pitch = pitch, special_filters = special_filter.Join("|"), blip_base = blip_base, blip_number = blip_number, identifier = message_mods[MODE_TTS_IDENTIFIER]) -======= do_tts_message(message, language, message_mods, list(), list()) return if(message_mods[MODE_HEADSET]) if(radio) radio.talk_into(src, message, null, spans, language, message_mods) do_tts_message(message, language, message_mods, list(), list()) ->>>>>>> upstream/master return NOPASS else if(message_mods[RADIO_EXTENSION] in GLOB.default_radio_channels) if(radio) radio.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) -<<<<<<< HEAD - var/list/filter = list() - var/list/special_filter = list() - if(length(voice_filter) > 0) - filter += voice_filter - if(SStts.tts_enabled && voice && !message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] && !HAS_TRAIT(src, TRAIT_SIGN_LANG) && !HAS_TRAIT(src, TRAIT_UNKNOWN_VOICE)) - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(message), language, get_tts_voice(filter, special_filter), filter.Join(","), list(), message_range = 7, pitch = pitch, special_filters = special_filter.Join("|"), blip_base = blip_base, blip_number = blip_number, identifier = message_mods[MODE_TTS_IDENTIFIER]) -======= do_tts_message(message, language, message_mods, list(), list()) ->>>>>>> upstream/master return NOPASS return FALSE diff --git a/code/modules/transport/tram/tram_controller.dm b/code/modules/transport/tram/tram_controller.dm index 38b8e189c1f..e9a264b5190 100644 --- a/code/modules/transport/tram/tram_controller.dm +++ b/code/modules/transport/tram/tram_controller.dm @@ -378,21 +378,6 @@ ) var/list/hearers = playsound(idle_platform, jingle, 50, FALSE, 0, extrarange= 10, ignore_walls = TRUE) new /datum/threed_sound( -<<<<<<< HEAD - idle_platform, - jingle, - hearers, - FALSE, - 60, - SOUND_RANGE + 7, - 12 SECONDS, - our_channel, - null, - null, - SOUND_FALLOFF_EXPONENT, - 5 - ) -======= new_parent = idle_platform, new_sound = jingle, current_listeners = hearers, @@ -407,7 +392,6 @@ falloff_distance = 5 ) ->>>>>>> upstream/master tram_registration.distance_travelled += (travel_trip_length - travel_remaining) travel_trip_length = 0 current_speed = 0 diff --git a/config/config.txt b/config/config.txt index b93b8a5d774..9c3da111bf8 100644 --- a/config/config.txt +++ b/config/config.txt @@ -25,7 +25,7 @@ $include map_vote.txt # SERVERTAGLINE A generic TG-based server ## Discord Link: This is the link to discord server -# DISCORD_LINK +# DISCORD_LINK ## Server SQL name: This is the name used to identify the server to the SQL DB, distinct from SERVERNAME as it must be at most 32 characters. # SERVERSQLNAME tgstation @@ -632,7 +632,6 @@ PR_ANNOUNCEMENTS_PER_ROUND 5 ## Override the voice that computers use. If left undefined, the subsystem will pick a random consistent computer voice. #TTS_COMPUTER_VOICE_OVERRIDE Papyrus Undertale -<<<<<<< HEAD ## Default centcom voice for station's announcements #CENTCOM_VOICE glados @@ -640,8 +639,6 @@ PR_ANNOUNCEMENTS_PER_ROUND 5 #ADMIN_VOICES glados #ADMIN_VOICES wheatley -======= ->>>>>>> upstream/master ## Comment to disable sending a toast notification on the host server when initializations complete. ## Even if this is enabled, a notification will only be sent if there are no clients connected. TOAST_NOTIFICATION_ON_INIT diff --git a/modular_meta/features/ntts-nd-tg-tts/code/middleware.dm b/modular_meta/features/ntts-nd-tg-tts/code/middleware.dm index 3b1ec4c5101..2626f8f4b6a 100644 --- a/modular_meta/features/ntts-nd-tg-tts/code/middleware.dm +++ b/modular_meta/features/ntts-nd-tg-tts/code/middleware.dm @@ -24,7 +24,7 @@ INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, message, speaker = speaker, pitch = pitch, local = TRUE, blip_base = blip_base, blip_number = blip_number) return TRUE -/datum/preference_middleware/tts/play_voice_borg(list/params, mob/user) +/datum/preference_middleware/tts/play_voice_robot(list/params, mob/user) if(!COOLDOWN_FINISHED(src, tts_test_cooldown)) return TRUE var/speaker = params["voice"] diff --git a/modular_meta/features/ntts-nd-tg-tts/code/picker.dm b/modular_meta/features/ntts-nd-tg-tts/code/picker.dm index 33e300c6268..d41404eaf8d 100644 --- a/modular_meta/features/ntts-nd-tg-tts/code/picker.dm +++ b/modular_meta/features/ntts-nd-tg-tts/code/picker.dm @@ -54,7 +54,7 @@ if("play_voice") return middleware.play_voice(params, ui.user) if("play_robot") - return middleware.play_voice_borg(params, ui.user) + return middleware.play_voice_robot(params, ui.user) if("play_blips") return middleware.play_blips(params, ui.user) if("play_radio") diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/tts_voice.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/tts_voice.tsx index 605c916f7a0..05748917d8b 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/tts_voice.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/tts_voice.tsx @@ -23,7 +23,6 @@ function FeatureTTSDropdownInput( const blipNumber = String(non_contextual.tts_blip_number); //MASSMETA EDIT END (ntts && tgtts) - //MASSMETA EDIT REMOVAL START (ntts && tgtts) /* ORIGINAL: onClick={() => { @@ -53,11 +52,10 @@ function FeatureTTSDropdownInput( width="100%" height="100%" /> -<<<<<<< HEAD */ - //MASSMETA EDIT REMOVAL END (ntts && tgtts) + //MASSMETA EDIT REMOVAL END (ntts && tgtts) - //MASSMETA EDIT START (ntts && tgtts) + //MASSMETA EDIT START (ntts && tgtts) return ( @@ -80,9 +78,7 @@ function FeatureTTSDropdownInput( > Change Voice - {/*MASSMETA EDIT END (ntts && tgtts) */} -======= ->>>>>>> upstream/master + {/*MASSMETA EDIT END (ntts && tgtts) */} ); From 87797bfa715f968e398c9509dca7c04f2b26e3be Mon Sep 17 00:00:00 2001 From: Bruh-24 Date: Thu, 18 Jun 2026 01:55:58 +0300 Subject: [PATCH 126/126] simple >>> basic --- .../features/security_extended/code/machinery/turnstile.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_meta/features/security_extended/code/machinery/turnstile.dm b/modular_meta/features/security_extended/code/machinery/turnstile.dm index 797918bd147..020b795411d 100644 --- a/modular_meta/features/security_extended/code/machinery/turnstile.dm +++ b/modular_meta/features/security_extended/code/machinery/turnstile.dm @@ -33,7 +33,7 @@ . = ..() if(istype(mover) && (mover.pass_flags & PASSGLASS)) return TRUE - if(istype(mover, /mob/living/simple_animal/bot)) + if(istype(mover, /mob/living/basic/bot)) flick("operate", src) playsound(src,'sound/items/tools/ratchet.ogg',50,0,3) return TRUE