From 28b87483e2ca986299007f91deb926625ce0c0a2 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Tue, 9 Jul 2024 14:08:54 +0300 Subject: [PATCH 01/69] Living flesh now has a 30/70% chance to touch the targeted thing instead of pulling it (#84752) ## About The Pull Request Sister PR to #84749 Living flesh arms now have a 30% (70% if you have combat mode on) chance to touch the thing they're targeting instead of pulling it. You can end up punching a random person, or, to much more hilarious results, a heretic influence or the supermatter crystal. Additionally, adds a ``silent`` argument for ``swap_hand`` proc, false by default and will prevent failure message from appearing when trying to swap hands while dual wielding an item if true ## Why It's Good For The Game ![image](https://github.com/tgstation/tgstation/assets/44720187/aa7b5e13-7198-4c8b-8ecf-5e9ebf3403aa) It allows for absolutely hilarious situations which is perfect for the anecdote generator that SS13 is ## Changelog :cl: add: Living flesh arms have a chance to actually touch the thing they're targeting instead of pulling it. Careful with supermatter! /:cl: --- .../mob/living/basic/ruin_defender/flesh.dm | 21 ++++++++++++++++--- code/modules/mob/mob.dm | 5 +++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/basic/ruin_defender/flesh.dm b/code/modules/mob/living/basic/ruin_defender/flesh.dm index f59ef674e860d..359705ecff2bd 100644 --- a/code/modules/mob/living/basic/ruin_defender/flesh.dm +++ b/code/modules/mob/living/basic/ruin_defender/flesh.dm @@ -1,3 +1,6 @@ +#define LIVING_FLESH_TOUCH_CHANCE 30 +#define LIVING_FLESH_COMBAT_TOUCH_CHANCE 70 + /datum/ai_controller/basic_controller/living_limb_flesh blackboard = list( BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, @@ -67,8 +70,6 @@ if(istype(current_bodypart, /obj/item/bodypart/arm)) var/list/candidates = list() for(var/atom/movable/movable in orange(victim, 1)) - if(movable.anchored) - continue if(movable == victim) continue if(!victim.CanReach(movable) || victim.invisibility) @@ -79,8 +80,19 @@ var/atom/movable/candidate = pick(candidates) if(isnull(candidate)) return - victim.start_pulling(candidate, supress_message = TRUE) + victim.visible_message(span_warning("[victim]'s [current_bodypart.name] instinctively starts feeling [candidate]!")) + if (!victim.anchored && !prob(victim.combat_mode ? LIVING_FLESH_COMBAT_TOUCH_CHANCE : LIVING_FLESH_TOUCH_CHANCE)) + victim.start_pulling(candidate, supress_message = TRUE) + return + + var/active_hand = victim.active_hand_index + var/new_index = (current_bodypart.body_zone == BODY_ZONE_L_ARM) ? LEFT_HANDS : RIGHT_HANDS + if (active_hand != new_index) + victim.swap_hand(new_index, TRUE) + victim.resolve_unarmed_attack(candidate) + if (active_hand != victim.active_hand_index) // Different check in case we failed to swap hands previously due to holding a bulky item + victim.swap_hand(active_hand, TRUE) return if(HAS_TRAIT(victim, TRAIT_IMMOBILIZED)) @@ -185,3 +197,6 @@ ai_controller.set_ai_status(AI_STATUS_ON) forceMove(limb.drop_location()) qdel(limb) + +#undef LIVING_FLESH_TOUCH_CHANCE +#undef LIVING_FLESH_COMBAT_TOUCH_CHANCE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 6ec820bc469c9..dd651085d91fe 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -838,12 +838,13 @@ return data -/mob/proc/swap_hand(held_index) +/mob/proc/swap_hand(held_index, silent = FALSE) SHOULD_NOT_OVERRIDE(TRUE) // Override perform_hand_swap instead var/obj/item/held_item = get_active_held_item() if(SEND_SIGNAL(src, COMSIG_MOB_SWAPPING_HANDS, held_item) & COMPONENT_BLOCK_SWAP) - to_chat(src, span_warning("Your other hand is too busy holding [held_item].")) + if (!silent) + to_chat(src, span_warning("Your other hand is too busy holding [held_item].")) return FALSE var/result = perform_hand_swap(held_index) From 9e900c5d7c00520b4ed57cfff8486f40693d18cd Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:13:59 +1200 Subject: [PATCH 02/69] Automatic changelog for PR #84752 [ci skip] --- html/changelogs/AutoChangeLog-pr-84752.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84752.yml diff --git a/html/changelogs/AutoChangeLog-pr-84752.yml b/html/changelogs/AutoChangeLog-pr-84752.yml new file mode 100644 index 0000000000000..0d315e9e80d96 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84752.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - rscadd: "Living flesh arms have a chance to actually touch the thing they're targeting instead of pulling it. Careful with supermatter!" \ No newline at end of file From 6d85d3295651b03765cb4ba8da736f171fee642c Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 9 Jul 2024 18:39:35 +0300 Subject: [PATCH 03/69] Cake baking autotest (#84795) ## About The Pull Request I want to get back to the food stuff, and adding a few auto tests to avoid regressions. The test makes a dummy human bake a cake from the base ingredients, confirming that the reagent purities are correct and that the cake slice gives a food buff in the end. ## Why It's Good For The Game Avoiding bugs. --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/__DEFINES/reagents.dm | 4 + code/modules/hydroponics/biogenerator.dm | 3 - .../chemistry/reagents/food_reagents.dm | 3 +- code/modules/unit_tests/_unit_tests.dm | 1 + code/modules/unit_tests/bake_a_cake.dm | 77 +++++++++++++++++++ 5 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 code/modules/unit_tests/bake_a_cake.dm diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 0f8b41be999c6..a758aa4170c73 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -76,6 +76,10 @@ #define CHEMICAL_MAXIMUM_TEMPERATURE 99999 ///The default purity of all non reacted reagents #define REAGENT_STANDARD_PURITY 0.75 +/// Starting purity of consumable reagents +#define CONSUMABLE_STANDARD_PURITY 0.5 // 50% pure by default. Below - synthetic food. Above - natural food. +/// Starting purity of reagents made in biogenerator +#define BIOGEN_REAGENT_PURITY 0.3 /// the default temperature at which chemicals are added to reagent holders at #define DEFAULT_REAGENT_TEMPERATURE 300 diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 35bf611b506a6..52df09c29cdf8 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -2,8 +2,6 @@ #define MAX_ITEMS_PER_RATING 10 /// How many items are converted per cycle, per rating point of the manipulator used. #define PROCESSED_ITEMS_PER_RATING 5 -/// Starting purity of reagents made in biogenerator -#define BIOGEN_REAGENT_PURITY 0.3 /obj/machinery/biogenerator name = "biogenerator" @@ -571,4 +569,3 @@ #undef MAX_ITEMS_PER_RATING #undef PROCESSED_ITEMS_PER_RATING -#undef BIOGEN_REAGENT_PURITY diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 7c9042314458d..4f7377d407fec 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -6,14 +6,13 @@ // Part of the food code. Also is where all the food // condiments, additives, and such go. - /datum/reagent/consumable name = "Consumable" taste_description = "generic food" taste_mult = 4 inverse_chem_val = 0.1 inverse_chem = null - creation_purity = 0.5 // 50% pure by default. Below - synthetic food. Above - natural food. + creation_purity = CONSUMABLE_STANDARD_PURITY /// How much nutrition this reagent supplies var/nutriment_factor = 1 /// affects mood, typically higher for mixed drinks with more complex recipes' diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 8fafe30ac7b93..8a869071c7c48 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -96,6 +96,7 @@ #include "armor_verification.dm" #include "atmospherics_sanity.dm" #include "autowiki.dm" +#include "bake_a_cake.dm" #include "barsigns.dm" #include "baseturfs.dm" #include "bespoke_id.dm" diff --git a/code/modules/unit_tests/bake_a_cake.dm b/code/modules/unit_tests/bake_a_cake.dm new file mode 100644 index 0000000000000..a4013d1c13794 --- /dev/null +++ b/code/modules/unit_tests/bake_a_cake.dm @@ -0,0 +1,77 @@ +/** + * Confirm that it is possible to bake a cake, get the food buff from a hand-made food and confirm that the reagents are consistent throughout the process + */ +/datum/unit_test/bake_a_cake/Run() + var/turf/table_loc = run_loc_floor_bottom_left + var/turf/oven_loc = get_step(run_loc_floor_bottom_left, EAST) + var/turf/human_loc = get_step(run_loc_floor_bottom_left, NORTHEAST) + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human/consistent, human_loc) + var/obj/machinery/oven/the_oven = allocate(/obj/machinery/oven, oven_loc) + var/obj/structure/table/the_table = allocate(/obj/structure/table, table_loc) + var/obj/item/knife/kitchen/a_knife = allocate(/obj/item/knife/kitchen, table_loc) + var/obj/item/reagent_containers/cup/beaker/beaker = allocate(/obj/item/reagent_containers/cup/beaker, table_loc) + var/obj/item/reagent_containers/condiment/flour/flour_bag = allocate(/obj/item/reagent_containers/condiment/flour, table_loc) + var/obj/item/reagent_containers/condiment/sugar/sugar_bag = allocate(/obj/item/reagent_containers/condiment/sugar, table_loc) + var/obj/item/storage/fancy/egg_box/egg_box = allocate(/obj/item/storage/fancy/egg_box, table_loc) + var/obj/item/food/egg/sample_egg = egg_box.contents[1] + + var/datum/chemical_reaction/recipe = GLOB.chemical_reactions_list[/datum/chemical_reaction/food/cakebatter] + var/sugar_required = recipe.required_reagents[/datum/reagent/consumable/sugar] + var/flour_required = recipe.required_reagents[/datum/reagent/consumable/flour] + var/eggyolk_required = recipe.required_reagents[/datum/reagent/consumable/eggyolk] + var/eggwhite_required = recipe.required_reagents[/datum/reagent/consumable/eggwhite] + var/total_volume = sugar_required + flour_required + eggyolk_required + eggwhite_required + + var/sugar_purity = sugar_bag.reagents.get_average_purity() + TEST_ASSERT_EQUAL(sugar_purity, 1, "Incorrect sugar purity!") + var/flour_purity = flour_bag.reagents.get_average_purity() + TEST_ASSERT_EQUAL(flour_purity, CONSUMABLE_STANDARD_PURITY, "Incorrect flour purity!") + var/egg_purity = sample_egg.reagents.get_average_purity() + TEST_ASSERT_EQUAL(egg_purity, CONSUMABLE_STANDARD_PURITY, "Incorrect egg reagents purity!") + + human.mind = new /datum/mind(null) // Add brain for the food buff + + // It's a piece of cake to bake a pretty cake + while(beaker.reagents.get_reagent_amount(/datum/reagent/consumable/sugar) < sugar_required && beaker.reagents.total_volume < total_volume) + sugar_bag.melee_attack_chain(human, beaker) + while(beaker.reagents.get_reagent_amount(/datum/reagent/consumable/flour) < flour_required && beaker.reagents.total_volume < total_volume) + flour_bag.melee_attack_chain(human, beaker) + while((beaker.reagents.get_reagent_amount(/datum/reagent/consumable/eggyolk) < eggyolk_required \ + || beaker.reagents.get_reagent_amount(/datum/reagent/consumable/eggwhite) < eggwhite_required) \ + && beaker.reagents.total_volume < total_volume \ + && beaker.reagents.total_volume >= (sugar_required + flour_required)) // Make sure that we won't miss the reaction + var/obj/item/egg = egg_box.contents[1] + egg.melee_attack_chain(human, beaker, RIGHT_CLICK) + var/obj/item/food/cake_batter = locate(/obj/item/food/cakebatter) in table_loc + TEST_ASSERT_NOTNULL(cake_batter, "Failed making cake batter!") + TEST_ASSERT_EQUAL(beaker.reagents.total_volume, 0, "Cake batter did not consume all beaker reagents!") + + var/batter_purity = cake_batter.reagents.get_average_purity() + var/batter_purity_expected = (sugar_required * sugar_purity + flour_required * flour_purity + (eggyolk_required + eggwhite_required) * egg_purity) / total_volume + TEST_ASSERT_EQUAL(batter_purity, batter_purity_expected, "Incorrect average purity of the cake batter reagents!") + + the_oven.add_tray_to_oven(new /obj/item/plate/oven_tray(the_oven)) // Doesn't have one unless maploaded + the_oven.attack_hand(human) + var/obj/item/plate/oven_tray/oven_tray = locate(/obj/item/plate/oven_tray) in the_oven.contents + TEST_ASSERT_NOTNULL(oven_tray, "The oven doesn't have a tray!") + cake_batter.melee_attack_chain(human, oven_tray, list2params(list(ICON_X = 0, ICON_Y = 0))) + the_oven.attack_hand(human) + the_oven.process(90 SECONDS) // Bake it + the_oven.attack_hand(human) + var/obj/item/food/cake/plain/cake = locate(/obj/item/food/cake/plain) in oven_tray.contents + TEST_ASSERT_NOTNULL(cake, "Didn't manage to bake a cake!") + + cake.melee_attack_chain(human, the_table, list2params(list(ICON_X = 0, ICON_Y = 0))) + a_knife.melee_attack_chain(human, cake) + var/obj/item/food/cakeslice/plain/cake_slice = locate(/obj/item/food/cakeslice/plain) in table_loc + TEST_ASSERT_NOTNULL(cake_slice, "Didn't manage to cut the cake!") + + var/cake_slice_purity = cake_slice.reagents.get_average_purity() + TEST_ASSERT_EQUAL(cake_slice_purity, batter_purity_expected, "Incorrect average purity of the cake slice reagents!") + + cake_slice.attack_hand(human) // Pick it up + var/datum/component/edible/edible_comp = cake_slice.GetComponent(/datum/component/edible) + edible_comp.eat_time = 0 + cake_slice.attack(human, human) // Eat it + var/datum/status_effect/food/effect = locate(/datum/status_effect/food) in human.status_effects + TEST_ASSERT_NOTNULL(effect, "Eating the cake had no effect!") From 69aacabfb82ff74fa39b325c3ca121a67a7e8fd7 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Tue, 9 Jul 2024 17:57:28 +0200 Subject: [PATCH 04/69] [NO GBP] Fixing fishing bait-related calculations (#84784) ## About The Pull Request I subtracted the wrong way around. I should have probably tested it properly before. ## Why It's Good For The Game We want a positive integer, not a negative one. ## Changelog :cl: fix: Fixed a whoopsie with bait-related calculations for fishing. /:cl: --- code/modules/fishing/sources/_fish_source.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index 3c94ff8277d94..059a532072204 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -310,7 +310,7 @@ GLOBAL_LIST(fishing_property_cache) highest_fish_weight = fish_weight for(var/fish in collected_fish_weights) - var/difference = collected_fish_weights[fish] - highest_fish_weight + var/difference = highest_fish_weight - collected_fish_weights[fish] if(!difference) continue final_table[fish] += round(difference**leveling_exponent, 1) From 431ee81985166f11445431df7ba449d2fc39b03a Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 10 Jul 2024 03:57:47 +1200 Subject: [PATCH 05/69] Automatic changelog for PR #84784 [ci skip] --- html/changelogs/AutoChangeLog-pr-84784.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84784.yml diff --git a/html/changelogs/AutoChangeLog-pr-84784.yml b/html/changelogs/AutoChangeLog-pr-84784.yml new file mode 100644 index 0000000000000..6cb627c5d0317 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84784.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed a whoopsie with bait-related calculations for fishing." \ No newline at end of file From efd5adfdd4b6730f6ab1a987429c66b1958bc658 Mon Sep 17 00:00:00 2001 From: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com> Date: Tue, 9 Jul 2024 14:27:27 -0500 Subject: [PATCH 06/69] Fixed paralyzed characters being able to walk post-amputation. (#84805) ## About The Pull Request Fixes #80396. Fixes #81508. I suspect this also fixes #74025, but that one was never properly reproduced. There has been a bug for quite a long time allowing paraplegic characters to walk around after the loss of a leg. This was due to the paraplegic trait being cleared from a removed limb _before_ its owner is cleared, causing the number of usable legs to incorrectly increment. Repeatedly removing and reattaching legs could increment usable_legs arbitrarily high, allowing you to walk around at full speed with no legs at all. Things have been rearranged so that the limb's owner gets cleared first, removing this bug. ## Why It's Good For The Game As funny as it is for a completely legless person to be "walking" around the station at full speed, I don't think this is something you should be able to do freely if you know how. ## Changelog :cl: fix: Amputating a paraplegic's leg no longer miraculously allows them to walk. /:cl: --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/modules/surgery/bodyparts/parts.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 6e3b5ca921bc4..fdfbce9c76180 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -210,12 +210,12 @@ ..() /obj/item/bodypart/arm/left/clear_ownership(mob/living/carbon/old_owner) + . = ..() if(HAS_TRAIT(old_owner, TRAIT_PARALYSIS_L_ARM)) UnregisterSignal(old_owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_ARM)) REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_ARM) else UnregisterSignal(old_owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_ARM)) - ..() ///Proc to react to the owner gaining the TRAIT_PARALYSIS_L_ARM trait. /obj/item/bodypart/arm/left/proc/on_owner_paralysis_gain(mob/living/carbon/source) @@ -308,12 +308,12 @@ ..() /obj/item/bodypart/arm/right/clear_ownership(mob/living/carbon/old_owner) + . = ..() if(HAS_TRAIT(old_owner, TRAIT_PARALYSIS_R_ARM)) UnregisterSignal(old_owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_ARM)) REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_ARM) else UnregisterSignal(old_owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_ARM)) - ..() ///Proc to react to the owner gaining the TRAIT_PARALYSIS_R_ARM trait. /obj/item/bodypart/arm/right/proc/on_owner_paralysis_gain(mob/living/carbon/source) @@ -429,12 +429,12 @@ ..() /obj/item/bodypart/leg/left/clear_ownership(mob/living/carbon/old_owner) + . = ..() if(HAS_TRAIT(old_owner, TRAIT_PARALYSIS_L_LEG)) UnregisterSignal(old_owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_LEG)) REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_LEG) else UnregisterSignal(old_owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_LEG)) - ..() ///Proc to react to the owner gaining the TRAIT_PARALYSIS_L_ARM trait. /obj/item/bodypart/leg/left/proc/on_owner_paralysis_gain(mob/living/carbon/source) @@ -518,12 +518,12 @@ ..() /obj/item/bodypart/leg/right/clear_ownership(mob/living/carbon/old_owner) + . = ..() if(HAS_TRAIT(old_owner, TRAIT_PARALYSIS_R_LEG)) UnregisterSignal(old_owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_LEG)) REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_LEG) else UnregisterSignal(old_owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_LEG)) - ..() ///Proc to react to the owner gaining the TRAIT_PARALYSIS_R_LEG trait. /obj/item/bodypart/leg/right/proc/on_owner_paralysis_gain(mob/living/carbon/source) From d1799dc6b5acb263be3a8832805b7ed258a97acf Mon Sep 17 00:00:00 2001 From: Kocma-san <112967882+Kocma-san@users.noreply.github.com> Date: Wed, 10 Jul 2024 02:32:03 +0700 Subject: [PATCH 07/69] Fixed lights stopping emitting light in some situations (#84299) ## About The Pull Request closes #77789 edt: also closes #82600 Light sources stop emitting light if the tile in which the light source itself is located and all 4 adjacent tile block the light. This usually happens when a smoke grenade is thrown, or something went wrong in the chemistry again
Videos As it was before https://github.com/tgstation/tgstation/assets/112967882/44ff556b-d09f-4024-945e-c2c105f511a9 Now https://github.com/tgstation/tgstation/assets/112967882/9f9f8f43-47a9-47be-8499-99bab39fc166
## Why It's Good For The Game You wont need to switch the lights twice to make them work after someone threw smoke grenades into the hallways anymore ## Changelog :cl: fix: Fixed lights stopping emitting light in some situations /:cl: --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/__DEFINES/dcs/signals/signals_turf.dm | 3 +++ code/modules/lighting/lighting_source.dm | 2 ++ code/modules/lighting/lighting_turf.dm | 3 +++ 3 files changed, 8 insertions(+) diff --git a/code/__DEFINES/dcs/signals/signals_turf.dm b/code/__DEFINES/dcs/signals/signals_turf.dm index f89f30d1eb458..321fb503cbf96 100644 --- a/code/__DEFINES/dcs/signals/signals_turf.dm +++ b/code/__DEFINES/dcs/signals/signals_turf.dm @@ -40,3 +40,6 @@ #define COMSIG_TURF_RESET_ELEVATION "turf_reset_elevation" #define ELEVATION_CURRENT_PIXEL_SHIFT 1 #define ELEVATION_MAX_PIXEL_SHIFT 2 + +///Called when turf no longer blocks light from passing through +#define COMSIG_TURF_NO_LONGER_BLOCK_LIGHT "turf_no_longer_block_light" diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index 287102ed7cd10..03e53ff6f8ab1 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -96,6 +96,7 @@ //yes, we register the signal to the top atom too, this is intentional and ensures contained lighting updates properly if(ismovable(new_atom_host)) RegisterSignal(new_atom_host, COMSIG_MOVABLE_MOVED, PROC_REF(update_host_lights)) + RegisterSignal(new_atom_host, COMSIG_TURF_NO_LONGER_BLOCK_LIGHT, PROC_REF(force_update)) return TRUE ///remove this light source from old_atom_host's light_sources list, unsetting movement registrations @@ -106,6 +107,7 @@ LAZYREMOVE(old_atom_host.light_sources, src) if(ismovable(old_atom_host)) UnregisterSignal(old_atom_host, COMSIG_MOVABLE_MOVED) + UnregisterSignal(old_atom_host, COMSIG_TURF_NO_LONGER_BLOCK_LIGHT) return TRUE // Yes this doesn't align correctly on anything other than 4 width tabs. diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index 26ebbd1ba4e29..949d9b59b8f30 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -88,6 +88,9 @@ else //If fulltile and opaque, then the whole tile blocks view, no need to continue checking. directional_opacity = ALL_CARDINALS break + else + for(var/atom/movable/content as anything in contents) + SEND_SIGNAL(content, COMSIG_TURF_NO_LONGER_BLOCK_LIGHT) if(. != directional_opacity && (. == ALL_CARDINALS || directional_opacity == ALL_CARDINALS)) reconsider_lights() //The lighting system only cares whether the tile is fully concealed from all directions or not. From 4ab3ac01476965e81c0f28d5b9dbdc7b8fbac10d Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 10 Jul 2024 08:05:59 +1200 Subject: [PATCH 08/69] Automatic changelog for PR #84805 [ci skip] --- html/changelogs/AutoChangeLog-pr-84805.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84805.yml diff --git a/html/changelogs/AutoChangeLog-pr-84805.yml b/html/changelogs/AutoChangeLog-pr-84805.yml new file mode 100644 index 0000000000000..fb0e2a062d900 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84805.yml @@ -0,0 +1,4 @@ +author: "lizardqueenlexi" +delete-after: True +changes: + - bugfix: "Amputating a paraplegic's leg no longer miraculously allows them to walk." \ No newline at end of file From cb5a5c1c69adf00663791f86f9b56047dd52367e Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 10 Jul 2024 08:07:18 +1200 Subject: [PATCH 09/69] Automatic changelog for PR #84299 [ci skip] --- html/changelogs/AutoChangeLog-pr-84299.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84299.yml diff --git a/html/changelogs/AutoChangeLog-pr-84299.yml b/html/changelogs/AutoChangeLog-pr-84299.yml new file mode 100644 index 0000000000000..d9bfd2c58b21a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84299.yml @@ -0,0 +1,4 @@ +author: "Kocma-san" +delete-after: True +changes: + - bugfix: "Fixed lights stopping emitting light in some situations" \ No newline at end of file From e4015a6f7fa81da2d847989aaa36e7c6e1961633 Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Wed, 10 Jul 2024 03:33:41 +0530 Subject: [PATCH 10/69] Remote materials don't block multitool on failure (#84797) ## About The Pull Request - Fixes #84794 `/datum/component/remote_materials` blocks the tool act from continuing when linking with ore silo fails. We don't want that for stacking machines ## Changelog :cl: fix: stacking machines can be linked with its console via multitool /:cl: --- .../components/material/remote_materials.dm | 2 +- code/modules/mining/machine_stacking.dm | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm index d2804f97df120..d630ce8e77f9b 100644 --- a/code/datums/components/material/remote_materials.dm +++ b/code/datums/components/material/remote_materials.dm @@ -147,7 +147,7 @@ handles linking back and forth. /datum/component/remote_materials/proc/OnMultitool(datum/source, mob/user, obj/item/multitool/M) SIGNAL_HANDLER - . = ITEM_INTERACT_BLOCKING + . = NONE if (!QDELETED(M.buffer) && istype(M.buffer, /obj/machinery/ore_silo)) if (silo == M.buffer) to_chat(user, span_warning("[parent] is already connected to [silo]!")) diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 385afb0f81f3e..79d7901dd9e44 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -127,13 +127,16 @@ if(istype(AM, /obj/item/stack/sheet) && AM.loc == get_step(src, input_dir)) process_sheet(AM) -/obj/machinery/mineral/stacking_machine/multitool_act(mob/living/user, obj/item/multitool/M) - if(istype(M)) - if(istype(M.buffer, /obj/machinery/mineral/stacking_unit_console)) - console = M.buffer - console.machine = src - to_chat(user, span_notice("You link [src] to the console in [M]'s buffer.")) - return TRUE +/obj/machinery/mineral/stacking_machine/multitool_act(mob/living/user, obj/item/multitool/multi_tool) + if(user.combat_mode || multi_tool.item_flags & ABSTRACT || multi_tool.flags_1 & HOLOGRAM_1) + return ITEM_INTERACT_SKIP_TO_ATTACK + + . = ITEM_INTERACT_BLOCKING + if(istype(multi_tool.buffer, /obj/machinery/mineral/stacking_unit_console)) + console = multi_tool.buffer + console.machine = src + to_chat(user, span_notice("You link [src] to the console in [multi_tool]'s buffer.")) + return ITEM_INTERACT_SUCCESS /obj/machinery/mineral/stacking_machine/proc/rotate(input) if (input) From 9f7d165d6ff091d21dabded08aceb40ce4cf7d75 Mon Sep 17 00:00:00 2001 From: GoblinBackwards <22856555+GoblinBackwards@users.noreply.github.com> Date: Tue, 9 Jul 2024 23:04:05 +0100 Subject: [PATCH 11/69] Makes docked shuttle departure timer reset when a hostile environment threat is stopped (#84771) ## About The Pull Request Changes hostile environments so that if the shuttle is docked then the ETD timer will be reset when the threat is stopped. ## Why It's Good For The Game Right now, if you end a hostile environment threat before the shuttle timer goes to ERR the timer won't reset, which often leaves the people who went to deal with the threat unable to get back to the shuttle in time, which really sucks. People shouldn't be punished for stopping a threat. ## Changelog :cl: qol: Docked emergency shuttles will always reset their departure timer when a hostile environment is stopped, regardless of if the timer displays ETD or ERR. /:cl: --- code/controllers/subsystem/shuttle.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index ebb1f4bc44f9f..f8ee167befbf8 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -527,7 +527,7 @@ SUBSYSTEM_DEF(shuttle) sender_override = "Emergency Shuttle Uplink Alert", color_override = "grey", ) - if(!emergency_no_escape && (emergency.mode == SHUTTLE_STRANDED)) + if(!emergency_no_escape && (emergency.mode == SHUTTLE_STRANDED || emergency.mode == SHUTTLE_DOCKED)) emergency.mode = SHUTTLE_DOCKED emergency.setTimer(emergency_dock_time) priority_announce( From fc768e51cd4c44130c78da6e4550ca16e5e2c59b Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:15:55 +1200 Subject: [PATCH 12/69] Automatic changelog for PR #84797 [ci skip] --- html/changelogs/AutoChangeLog-pr-84797.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84797.yml diff --git a/html/changelogs/AutoChangeLog-pr-84797.yml b/html/changelogs/AutoChangeLog-pr-84797.yml new file mode 100644 index 0000000000000..b94839260cb8b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84797.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "stacking machines can be linked with its console via multitool" \ No newline at end of file From 7d7a6da73542f9958ab99a502b2d66459e5539f4 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:16:12 +1200 Subject: [PATCH 13/69] Automatic changelog for PR #84771 [ci skip] --- html/changelogs/AutoChangeLog-pr-84771.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84771.yml diff --git a/html/changelogs/AutoChangeLog-pr-84771.yml b/html/changelogs/AutoChangeLog-pr-84771.yml new file mode 100644 index 0000000000000..6165a4e78e464 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84771.yml @@ -0,0 +1,4 @@ +author: "GoblinBackwards" +delete-after: True +changes: + - qol: "Docked emergency shuttles will always reset their departure timer when a hostile environment is stopped, regardless of if the timer displays ETD or ERR." \ No newline at end of file From c3562f828f3df6b003b18f3efd364a8cd0f02e0e Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 10 Jul 2024 00:30:34 +0000 Subject: [PATCH 14/69] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-84299.yml | 4 --- html/changelogs/AutoChangeLog-pr-84667.yml | 6 ---- html/changelogs/AutoChangeLog-pr-84675.yml | 4 --- html/changelogs/AutoChangeLog-pr-84736.yml | 4 --- html/changelogs/AutoChangeLog-pr-84749.yml | 5 ---- html/changelogs/AutoChangeLog-pr-84752.yml | 4 --- html/changelogs/AutoChangeLog-pr-84771.yml | 4 --- html/changelogs/AutoChangeLog-pr-84776.yml | 4 --- html/changelogs/AutoChangeLog-pr-84781.yml | 4 --- html/changelogs/AutoChangeLog-pr-84784.yml | 4 --- html/changelogs/AutoChangeLog-pr-84797.yml | 4 --- html/changelogs/AutoChangeLog-pr-84805.yml | 4 --- html/changelogs/archive/2024-07.yml | 34 ++++++++++++++++++++++ 13 files changed, 34 insertions(+), 51 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-84299.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84667.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84675.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84736.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84749.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84752.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84771.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84776.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84781.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84784.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84797.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84805.yml diff --git a/html/changelogs/AutoChangeLog-pr-84299.yml b/html/changelogs/AutoChangeLog-pr-84299.yml deleted file mode 100644 index d9bfd2c58b21a..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84299.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kocma-san" -delete-after: True -changes: - - bugfix: "Fixed lights stopping emitting light in some situations" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84667.yml b/html/changelogs/AutoChangeLog-pr-84667.yml deleted file mode 100644 index 56ec74adf6c7f..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84667.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "aaaa1023" -delete-after: True -changes: - - rscdel: "Removed the shuttle manipulator entries for the following shuttles: Northstar ferry, Omegastation arrivals shuttle, and Donutstation cargo ferry. (These shuttles didn't actually exist but they still had entries in the manipulator.)" - - bugfix: "Fixed the following shuttles flying in unexpected directions: Basic CC Ferry, Meat Ferry, Lighthouse Ferry, ERT bounty shuttle, Kilo cargo shuttle, Pubby cargo shuttle, and Delta cargo shuttle." - - bugfix: "Fixed the ERT bounty shuttle having incorrect offsets in the shuttle navigation console." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84675.yml b/html/changelogs/AutoChangeLog-pr-84675.yml deleted file mode 100644 index 8f342cfa69513..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84675.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - refactor: "Refactored a lot of speech modifiers to use a component instead of copied over code." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84736.yml b/html/changelogs/AutoChangeLog-pr-84736.yml deleted file mode 100644 index 8f71ff39204f8..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84736.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "grungussuss" -delete-after: True -changes: - - sound: "Zippos, Lighters and cigarettes now have sound" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84749.yml b/html/changelogs/AutoChangeLog-pr-84749.yml deleted file mode 100644 index 0e3b49a139446..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84749.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Living limbs can no longer make you touch ghosts or abstract concepts of start, landmark, influence or job" - - spellcheck: "Fixed improper word usage and improved grammar for living limbs" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84752.yml b/html/changelogs/AutoChangeLog-pr-84752.yml deleted file mode 100644 index 0d315e9e80d96..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84752.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - rscadd: "Living flesh arms have a chance to actually touch the thing they're targeting instead of pulling it. Careful with supermatter!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84771.yml b/html/changelogs/AutoChangeLog-pr-84771.yml deleted file mode 100644 index 6165a4e78e464..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84771.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "GoblinBackwards" -delete-after: True -changes: - - qol: "Docked emergency shuttles will always reset their departure timer when a hostile environment is stopped, regardless of if the timer displays ETD or ERR." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84776.yml b/html/changelogs/AutoChangeLog-pr-84776.yml deleted file mode 100644 index b56c51cc767e3..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84776.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Exosuit Stress Failure experiment now works" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84781.yml b/html/changelogs/AutoChangeLog-pr-84781.yml deleted file mode 100644 index b59fcad5de6bf..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84781.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zoomachina" -delete-after: True -changes: - - bugfix: "fixed dubious chem dispenser feedback when the beaker is full" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84784.yml b/html/changelogs/AutoChangeLog-pr-84784.yml deleted file mode 100644 index 6cb627c5d0317..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84784.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed a whoopsie with bait-related calculations for fishing." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84797.yml b/html/changelogs/AutoChangeLog-pr-84797.yml deleted file mode 100644 index b94839260cb8b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84797.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "stacking machines can be linked with its console via multitool" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84805.yml b/html/changelogs/AutoChangeLog-pr-84805.yml deleted file mode 100644 index fb0e2a062d900..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84805.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "lizardqueenlexi" -delete-after: True -changes: - - bugfix: "Amputating a paraplegic's leg no longer miraculously allows them to walk." \ No newline at end of file diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index d64be8b671a22..95ca3273b35dd 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -579,3 +579,37 @@ - code_imp: teambased antagonists may not see the HUDs of other teams rageguy505: - bugfix: no more xenobio active turfs +2024-07-10: + Ghommie: + - bugfix: Fixed a whoopsie with bait-related calculations for fishing. + GoblinBackwards: + - qol: Docked emergency shuttles will always reset their departure timer when a + hostile environment is stopped, regardless of if the timer displays ETD or ERR. + Kocma-san: + - bugfix: Fixed lights stopping emitting light in some situations + SmArtKar: + - refactor: Refactored a lot of speech modifiers to use a component instead of copied + over code. + - bugfix: Living limbs can no longer make you touch ghosts or abstract concepts + of start, landmark, influence or job + - spellcheck: Fixed improper word usage and improved grammar for living limbs + - rscadd: Living flesh arms have a chance to actually touch the thing they're targeting + instead of pulling it. Careful with supermatter! + - bugfix: Exosuit Stress Failure experiment now works + SyncIt21: + - bugfix: stacking machines can be linked with its console via multitool + aaaa1023: + - rscdel: 'Removed the shuttle manipulator entries for the following shuttles: Northstar + ferry, Omegastation arrivals shuttle, and Donutstation cargo ferry. (These shuttles + didn''t actually exist but they still had entries in the manipulator.)' + - bugfix: 'Fixed the following shuttles flying in unexpected directions: Basic CC + Ferry, Meat Ferry, Lighthouse Ferry, ERT bounty shuttle, Kilo cargo shuttle, + Pubby cargo shuttle, and Delta cargo shuttle.' + - bugfix: Fixed the ERT bounty shuttle having incorrect offsets in the shuttle navigation + console. + grungussuss: + - sound: Zippos, Lighters and cigarettes now have sound + lizardqueenlexi: + - bugfix: Amputating a paraplegic's leg no longer miraculously allows them to walk. + zoomachina: + - bugfix: fixed dubious chem dispenser feedback when the beaker is full From aba588abb510b1fe9691a18321bf01a7c0ad0586 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:50 +0200 Subject: [PATCH 15/69] Buffs the Matrix Flip skillchip (#84658) ## About The Pull Request Amps up the duration of the flip and the bullet dodging to 1.4 seconds (from 0.8). EDIT: I've added a check to prevent matrix-flipping into stamcrit (unless the emote wasn't intentional) and lowered the stam cost very slightly to allow for a fifth flip. ## Why It's Good For The Game I've tested the thing, with and without stun immunity (which prevents stamcrit from overusing it), hulk, rapid gloves, against the colossus and turrets at the tdome. It's pretty meh overrall, having to keep spamming the flip hotkey to keep it going, and the duration isn't all that useful since you can't easily foresee when something or someone's going to fire at you, or react in time. This is likely going to stay a gimmick, albeit a less crappier one. ## Changelog :cl: balance: Buffed the matrix flip skillchip duration. Lowered the stamina cost very, very slightly. qol: You can now longer matrix-flip yourself into exhaustion, unless the emote is unintentional. /:cl: --- code/__DEFINES/traits/declarations.dm | 2 + code/_globalvars/traits/_traits.dm | 1 + code/_globalvars/traits/admin_tooling.dm | 1 + .../generic_skillchips/matrix_flip.dm | 40 +++++++++++++++++++ .../library/skill_learning/skillchip.dm | 25 ------------ code/modules/mob/emote.dm | 6 ++- tgstation.dme | 1 + 7 files changed, 50 insertions(+), 26 deletions(-) create mode 100644 code/modules/library/skill_learning/generic_skillchips/matrix_flip.dm diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index e216652fe3d7e..f8b9a6871069c 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -351,6 +351,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_GUNFLIP "gunflip" /// Increases chance of getting special traumas, makes them harder to cure #define TRAIT_SPECIAL_TRAUMA_BOOST "special_trauma_boost" +/// Doubles the duration and cooldown of a flip +#define TRAIT_SLOW_FLIP "slow_flip" #define TRAIT_SPACEWALK "spacewalk" /// Sanity trait to keep track of when we're in hyperspace and add the appropriate element if we werent #define TRAIT_HYPERSPACED "hyperspaced" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index a8f0d8fcb8e06..64e81541e7330 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -440,6 +440,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, "TRAIT_SKITTISH" = TRAIT_SKITTISH, "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, + "TRAIT_SLOW_FLIP" = TRAIT_SLOW_FLIP, "TRAIT_SMOKER" = TRAIT_SMOKER, "TRAIT_SNEAK" = TRAIT_SNEAK, "TRAIT_SNOB" = TRAIT_SNOB, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index e29a140bfe03a..25766e5bc69fc 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -202,6 +202,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, "TRAIT_SKITTISH" = TRAIT_SKITTISH, "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, + "TRAIT_SLOW_FLIP" = TRAIT_SLOW_FLIP, "TRAIT_SMOKER" = TRAIT_SMOKER, "TRAIT_SNOB" = TRAIT_SNOB, "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT, diff --git a/code/modules/library/skill_learning/generic_skillchips/matrix_flip.dm b/code/modules/library/skill_learning/generic_skillchips/matrix_flip.dm new file mode 100644 index 0000000000000..a836442eca052 --- /dev/null +++ b/code/modules/library/skill_learning/generic_skillchips/matrix_flip.dm @@ -0,0 +1,40 @@ +#define FLIP_STAMINA_COST 19 + +/obj/item/skillchip/matrix_flip + name = "BULLET_DODGER skillchip" + skill_name = "Flip 2 Dodge" + skill_description = "At the cost of stamina, your flips can also be used to dodge incoming projectiles." + skill_icon = FA_ICON_SPINNER + activate_message = span_notice("You feel the urge to flip scenically as if you are the 'Chosen One'.") + deactivate_message = span_notice("The urge to flip goes away.") + +/obj/item/skillchip/matrix_flip/on_activate(mob/living/carbon/user, silent = FALSE) + . = ..() + ADD_TRAIT(user, TRAIT_SLOW_FLIP, SKILLCHIP_TRAIT) + RegisterSignal(user, COMSIG_MOB_EMOTED("flip"), PROC_REF(on_flip)) + RegisterSignal(user, COMSIG_MOB_PRE_EMOTED, PROC_REF(check_if_we_can_flip)) + +/obj/item/skillchip/matrix_flip/on_deactivate(mob/living/carbon/user, silent=FALSE) + REMOVE_TRAIT(user, TRAIT_SLOW_FLIP, SKILLCHIP_TRAIT) + UnregisterSignal(user, list(COMSIG_MOB_EMOTED("flip"), COMSIG_MOB_PRE_EMOTED)) + return ..() + +///Prevent players from stamcritting from INTENTIONAL flips. 1.4s of bullet immunity isn't worth several secs of stun. +/obj/item/skillchip/matrix_flip/proc/check_if_we_can_flip(mob/living/source, key, params, type_override, intentional, datum/emote/emote) + SIGNAL_HANDLER + if(key != "flip" || !intentional) + return + if((source.maxHealth - (source.getStaminaLoss() + FLIP_STAMINA_COST)) <= source.crit_threshold) + source.balloon_alert(source, "too tired!") + return COMPONENT_CANT_EMOTE + +/obj/item/skillchip/matrix_flip/proc/on_flip(mob/living/source) + SIGNAL_HANDLER + if(HAS_TRAIT_FROM(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT)) + return + playsound(source, 'sound/weapons/fwoosh.ogg', 90, FALSE, frequency = 0.7) + ADD_TRAIT(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT) + source.adjustStaminaLoss(FLIP_STAMINA_COST) + addtimer(TRAIT_CALLBACK_REMOVE(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT), FLIP_EMOTE_DURATION * 2) + +#undef FLIP_STAMINA_COST diff --git a/code/modules/library/skill_learning/skillchip.dm b/code/modules/library/skill_learning/skillchip.dm index ae40b84c64be9..cc284b91454aa 100644 --- a/code/modules/library/skill_learning/skillchip.dm +++ b/code/modules/library/skill_learning/skillchip.dm @@ -499,28 +499,3 @@ skill_icon = FA_ICON_DRUMSTICK_BITE activate_message = span_notice("You think of your favourite food and realise that you can rotate its flavour in your mind.") deactivate_message = span_notice("You feel your food-based mind palace crumbling...") - -/obj/item/skillchip/matrix_flip - name = "BULLET_DODGER skillchip" - skill_name = "Flip 2 Dodge" - skill_description = "At the cost of stamina, your flips can also be used to dodge incoming projectiles." - skill_icon = FA_ICON_SPINNER - activate_message = span_notice("You feel the urge to flip scenically as if you are the 'Chosen One'.") - deactivate_message = span_notice("The urge to flip goes away.") - -/obj/item/skillchip/matrix_flip/on_activate(mob/living/carbon/user, silent = FALSE) - . = ..() - RegisterSignal(user, COMSIG_MOB_EMOTED("flip"), PROC_REF(on_flip)) - -/obj/item/skillchip/matrix_flip/on_deactivate(mob/living/carbon/user, silent=FALSE) - UnregisterSignal(user, COMSIG_MOB_EMOTED("flip")) - return ..() - -/obj/item/skillchip/matrix_flip/proc/on_flip(mob/living/source) - SIGNAL_HANDLER - if(HAS_TRAIT_FROM(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT)) - return - playsound(source, 'sound/weapons/fwoosh.ogg', 90, FALSE) - ADD_TRAIT(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT) - source.adjustStaminaLoss(20) - addtimer(TRAIT_CALLBACK_REMOVE(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT), FLIP_EMOTE_DURATION + 0.1 SECONDS) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index c1822ff0e51c4..18666a1cbd5f5 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -79,10 +79,14 @@ /datum/emote/flip/run_emote(mob/user, params , type_override, intentional) . = ..() if(.) - user.SpinAnimation(FLIP_EMOTE_DURATION,1) + user.SpinAnimation(HAS_TRAIT(user, TRAIT_SLOW_FLIP) ? FLIP_EMOTE_DURATION * 2 : FLIP_EMOTE_DURATION, 1) /datum/emote/flip/check_cooldown(mob/user, intentional) + var/slow_flipper = HAS_TRAIT(user, TRAIT_SLOW_FLIP) + if(slow_flipper) + cooldown *= 2 . = ..() + cooldown *= 0.5 if(.) return if(!can_run_emote(user, intentional=intentional)) diff --git a/tgstation.dme b/tgstation.dme index 41beb63ae1a84..bb2a7559aa892 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4414,6 +4414,7 @@ #include "code\modules\library\random_books.dm" #include "code\modules\library\skill_learning\skill_station.dm" #include "code\modules\library\skill_learning\skillchip.dm" +#include "code\modules\library\skill_learning\generic_skillchips\matrix_flip.dm" #include "code\modules\library\skill_learning\generic_skillchips\rod_suplex.dm" #include "code\modules\library\skill_learning\job_skillchips\_job.dm" #include "code\modules\library\skill_learning\job_skillchips\chef.dm" From a3b9c9248fb6316c9339c4cd482b93fa0652aad7 Mon Sep 17 00:00:00 2001 From: Afevis Date: Wed, 10 Jul 2024 15:43:12 -0400 Subject: [PATCH 16/69] [no gbp] fixes sleeping mobs getting the surgery (#84732) fixes #84617 i did test this, no clue how this got missed... --- code/modules/surgery/surgery_step.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index c739745969e8e..350bd60fbd176 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -177,7 +177,7 @@ return if(target.stat >= UNCONSCIOUS) var/datum/mood_event/surgery/target_mood_event = target.mob_mood.mood_events[SURGERY_MOOD_CATEGORY] - if(target_mood_event?.surgery_completed) //don't give sleeping mobs trauma. that said, if they fell asleep mid-surgery after already getting the bad mood, lets make sure they wake up to a (hopefully) happy memory. + if(!target_mood_event || target_mood_event.surgery_completed) //don't give sleeping mobs trauma. that said, if they fell asleep mid-surgery after already getting the bad mood, lets make sure they wake up to a (hopefully) happy memory. return switch(surgery_state) if(SURGERY_STATE_STARTED) From a39c0a87720a3fb28f0843e9f4731fc952ddcf41 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 07:44:11 +1200 Subject: [PATCH 17/69] Automatic changelog for PR #84658 [ci skip] --- html/changelogs/AutoChangeLog-pr-84658.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84658.yml diff --git a/html/changelogs/AutoChangeLog-pr-84658.yml b/html/changelogs/AutoChangeLog-pr-84658.yml new file mode 100644 index 0000000000000..b2262f2241b16 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84658.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - balance: "Buffed the matrix flip skillchip duration. Lowered the stamina cost very, very slightly." + - qol: "You can now longer matrix-flip yourself into exhaustion, unless the emote is unintentional." \ No newline at end of file From dcca367dd8831b8de529bb865b05551c0767a0fb Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:44:39 -0500 Subject: [PATCH 18/69] Random language trait tweak (#84816) ## About The Pull Request - Splits the trait into two, one that affects only bots (like the original version) and one that only affects machines - Only mapload bots are affected (again) - Only mapload machines are affected - The Automated Announcer is immune ## Why It's Good For The Game I made this trait a while back and then someone else changed it to be far more disruptive and annoying without adjusting the weight, so I feel like I have the right to reign it back in a little bit. This aims to retain some of the charm intended behind the original trait while maintaining some of the changes made to it. ## Changelog :cl: Melbert add: Bot Language station trait split into two: One that affects bots (retains the old weight and cost) and one that affects machine (half weight, double the cost) del: Bot Language station trait and (new) Machine Language station trait no longer affect newly created machines or bots, just those present at game start del: Machine Language station trait cannot affect the Automated Announcer in telecomms /:cl: --- code/__DEFINES/traits/declarations.dm | 1 + code/_globalvars/traits/_traits.dm | 1 + code/datums/station_traits/negative_traits.dm | 16 ++++++++++++++++ code/game/machinery/_machinery.dm | 2 +- code/game/machinery/announcement_system.dm | 3 +++ code/modules/mob/living/basic/bots/_bots.dm | 3 --- code/modules/mob/living/simple_animal/bot/bot.dm | 3 --- 7 files changed, 22 insertions(+), 7 deletions(-) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index f8b9a6871069c..981ad0e6de865 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -978,6 +978,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define STATION_TRAIT_BIGGER_PODS "station_trait_bigger_pods" #define STATION_TRAIT_BIRTHDAY "station_trait_birthday" #define STATION_TRAIT_BOTS_GLITCHED "station_trait_bot_glitch" +#define STATION_TRAIT_MACHINES_GLITCHED "station_trait_machine_glitch" #define STATION_TRAIT_BRIGHT_DAY "station_trait_bright_day" #define STATION_TRAIT_CARP_INFESTATION "station_trait_carp_infestation" #define STATION_TRAIT_CYBERNETIC_REVOLUTION "station_trait_cybernetic_revolution" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 64e81541e7330..e012ea343290c 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -80,6 +80,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "STATION_TRAIT_BIGGER_PODS" = STATION_TRAIT_BIGGER_PODS, "STATION_TRAIT_BIRTHDAY" = STATION_TRAIT_BIRTHDAY, "STATION_TRAIT_BOTS_GLITCHED" = STATION_TRAIT_BOTS_GLITCHED, + "STATION_TRAIT_MACHINES_GLITCHED" = STATION_TRAIT_MACHINES_GLITCHED, "STATION_TRAIT_BRIGHT_DAY" = STATION_TRAIT_BRIGHT_DAY, "STATION_TRAIT_CARP_INFESTATION" = STATION_TRAIT_CARP_INFESTATION, "STATION_TRAIT_CYBERNETIC_REVOLUTION" = STATION_TRAIT_CYBERNETIC_REVOLUTION, diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index 266725cf337fc..727f487bd3ede 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -185,6 +185,22 @@ for(var/mob/living/found_bot as anything in GLOB.bots_list) found_bot.randomize_language_if_on_station() +/datum/station_trait/machine_languages + name = "Machine Language Matrix Malfunction" + trait_type = STATION_TRAIT_NEGATIVE + weight = 2 + cost = STATION_TRAIT_COST_FULL + show_in_report = TRUE + report_message = "Your station's machines have had their language matrix fried due to an event, \ + resulting in some strange and unfamiliar speech patterns." + trait_to_give = STATION_TRAIT_MACHINES_GLITCHED + +/datum/station_trait/machine_languages/New() + . = ..() + // What "caused" our machines to go haywire (fluff) + var/event_source = pick("an ion storm", "a malfunction", "a software update", "a power surge", "a computer virus", "a subdued machine uprising", "a clown's prank") + report_message = "Your station's machinery have had their language matrix fried due to [event_source], resulting in some strange and unfamiliar speech patterns." + /datum/station_trait/revenge_of_pun_pun name = "Revenge of Pun Pun" trait_type = STATION_TRAIT_NEGATIVE diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 45257841c462d..40d9ef556dc56 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -177,7 +177,7 @@ flags_1 |= PREVENT_CONTENTS_EXPLOSION_1 } - if(HAS_TRAIT(SSstation, STATION_TRAIT_BOTS_GLITCHED)) + if(HAS_TRAIT(SSstation, STATION_TRAIT_MACHINES_GLITCHED) && mapload) randomize_language_if_on_station() SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_MACHINE, src) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index edb945f483e9c..1700abb0af1ab 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -32,6 +32,9 @@ GLOBAL_LIST_EMPTY(announcement_systems) radio = new /obj/item/radio/headset/silicon/ai(src) update_appearance() +/obj/machinery/announcement_system/randomize_language_if_on_station() + return + /obj/machinery/announcement_system/update_icon_state() icon_state = "[base_icon_state]_[is_operational ? "On" : "Off"][panel_open ? "_Open" : null]" return ..() diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index 22ab453226912..86fe0b5cf5704 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -142,9 +142,6 @@ GLOBAL_LIST_INIT(command_strings, list( var/datum/atom_hud/datahud = GLOB.huds[data_hud_type] datahud.show_to(src) - if(HAS_TRAIT(SSstation, STATION_TRAIT_BOTS_GLITCHED)) - randomize_language_if_on_station() - 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) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 48d83da80a9c1..49b44122ac0e7 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -196,9 +196,6 @@ path_hud.add_atom_to_hud(src) path_hud.show_to(src) - if(HAS_TRAIT(SSstation, STATION_TRAIT_BOTS_GLITCHED)) - randomize_language_if_on_station() - 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) From bd289b14cb88093be5ffb34cf4a855b02c70ff88 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 07:44:59 +1200 Subject: [PATCH 19/69] Automatic changelog for PR #84816 [ci skip] --- html/changelogs/AutoChangeLog-pr-84816.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84816.yml diff --git a/html/changelogs/AutoChangeLog-pr-84816.yml b/html/changelogs/AutoChangeLog-pr-84816.yml new file mode 100644 index 0000000000000..eb9a6963f5bc7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84816.yml @@ -0,0 +1,6 @@ +author: "Melbert" +delete-after: True +changes: + - rscadd: "Bot Language station trait split into two: One that affects bots (retains the old weight and cost) and one that affects machine (half weight, double the cost)" + - rscdel: "Bot Language station trait and (new) Machine Language station trait no longer affect newly created machines or bots, just those present at game start" + - rscdel: "Machine Language station trait cannot affect the Automated Announcer in telecomms" \ No newline at end of file From 4166e25c9cf53d799e6a3cfa5891c694ed9922b7 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Wed, 10 Jul 2024 16:30:55 -0500 Subject: [PATCH 20/69] Blackbox tally for successful emags (#84837) ## About The Pull Request We don't actually record emags outside of the log which makes it hard to parse, this should give us a better image of what people are using emags for. --- code/game/objects/items/emags.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/emags.dm b/code/game/objects/items/emags.dm index 74472995b688e..ccb52b71bc3bc 100644 --- a/code/game/objects/items/emags.dm +++ b/code/game/objects/items/emags.dm @@ -144,7 +144,8 @@ if(!can_emag(interacting_with, user)) return ITEM_INTERACT_BLOCKING log_combat(user, interacting_with, "attempted to emag") - interacting_with.emag_act(user, src) + if(interacting_with.emag_act(user, src)) + SSblackbox.record_feedback("tally", "atom_emagged", 1, interacting_with.type) return ITEM_INTERACT_SUCCESS /obj/item/card/emag/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) From 5f2c598427adfa56a00016fa851a722be6253117 Mon Sep 17 00:00:00 2001 From: Gaxeer <44334376+Gaxeer@users.noreply.github.com> Date: Thu, 11 Jul 2024 00:31:38 +0300 Subject: [PATCH 21/69] refactor: move `status_display_bottom_text` and `fire_alarm_light_color` to security level prototypes (#84830) ## About The Pull Request Move security level related data from switch-cases to security level prototypes. ## Why It's Good For The Game Nothing player facing. Cleaner code for coders ## Changelog :cl: refactor: move `status_display_bottom_text` and `fire_alarm_light_color` to security level prototypes /:cl: --- code/game/machinery/computer/communications.dm | 10 +--------- code/game/machinery/firealarm.dm | 10 +--------- .../file_system/programs/statusdisplay.dm | 10 +--------- .../modules/security_levels/security_level_datums.dm | 12 ++++++++++++ 4 files changed, 15 insertions(+), 27 deletions(-) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 1fb46abd1201f..8fb1e71f05ed7 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -380,15 +380,7 @@ post_status(picture) else if(picture == "currentalert") // You cannot set Code Blue display during Code Red and similiar - switch(SSsecurity_level.get_current_level_as_number()) - if(SEC_LEVEL_DELTA) - post_status("alert", "deltaalert") - if(SEC_LEVEL_RED) - post_status("alert", "redalert") - if(SEC_LEVEL_BLUE) - post_status("alert", "bluealert") - if(SEC_LEVEL_GREEN) - post_status("alert", "greenalert") + post_status("alert", SSsecurity_level?.current_security_level?.status_display_icon_state || "greenalert") else post_status("alert", picture) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 10055aee5b29d..a852ea019c697 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -179,15 +179,7 @@ var/current_level = SSsecurity_level.get_current_level_as_number() . += mutable_appearance(icon, "fire_[current_level]") . += emissive_appearance(icon, "fire_level_e", src, alpha = src.alpha) - switch(current_level) - if(SEC_LEVEL_GREEN) - set_light(l_color = LIGHT_COLOR_BLUEGREEN) - if(SEC_LEVEL_BLUE) - set_light(l_color = LIGHT_COLOR_ELECTRIC_CYAN) - if(SEC_LEVEL_RED) - set_light(l_color = LIGHT_COLOR_FLARE) - if(SEC_LEVEL_DELTA) - set_light(l_color = LIGHT_COLOR_INTENSE_RED) + set_light(l_color = SSsecurity_level?.current_security_level?.fire_alarm_light_color || LIGHT_COLOR_BLUEGREEN) else . += mutable_appearance(icon, "fire_offstation") . += emissive_appearance(icon, "fire_level_e", src, alpha = src.alpha) diff --git a/code/modules/modular_computers/file_system/programs/statusdisplay.dm b/code/modules/modular_computers/file_system/programs/statusdisplay.dm index 6136ab9355b59..fa844215b93b9 100644 --- a/code/modules/modular_computers/file_system/programs/statusdisplay.dm +++ b/code/modules/modular_computers/file_system/programs/statusdisplay.dm @@ -59,15 +59,7 @@ post_status(picture) else if(picture == "currentalert") // You cannot set Code Blue display during Code Red and similiar - switch(SSsecurity_level.get_current_level_as_number()) - if(SEC_LEVEL_DELTA) - post_status("alert", "deltaalert") - if(SEC_LEVEL_RED) - post_status("alert", "redalert") - if(SEC_LEVEL_BLUE) - post_status("alert", "bluealert") - if(SEC_LEVEL_GREEN) - post_status("alert", "greenalert") + post_status("alert", SSsecurity_level?.current_security_level?.status_display_icon_state || "greenalert") else post_status("alert", picture) diff --git a/code/modules/security_levels/security_level_datums.dm b/code/modules/security_levels/security_level_datums.dm index b3402f643c6bf..d5a2e74e8080e 100644 --- a/code/modules/security_levels/security_level_datums.dm +++ b/code/modules/security_levels/security_level_datums.dm @@ -13,6 +13,10 @@ var/announcement_color = "default" /// The numerical level of this security level, see defines for more information. var/number_level = -1 + /// Icon state that will be displayed on displays during this security level + var/status_display_icon_state + /// The color of the fire alarm light set when changed to this security level + var/fire_alarm_light_color /// The sound that we will play when this security level is set var/sound /// The looping sound that will be played while the security level is set @@ -47,6 +51,8 @@ announcement_color = "green" sound = 'sound/misc/notice2.ogg' // Friendly beep number_level = SEC_LEVEL_GREEN + status_display_icon_state = "greenalert" + fire_alarm_light_color = LIGHT_COLOR_BLUEGREEN lowering_to_configuration_key = /datum/config_entry/string/alert_green shuttle_call_time_mod = ALERT_COEFF_GREEN @@ -60,6 +66,8 @@ announcement_color = "blue" sound = 'sound/misc/notice1.ogg' // Angry alarm number_level = SEC_LEVEL_BLUE + status_display_icon_state = "bluealert" + fire_alarm_light_color = LIGHT_COLOR_ELECTRIC_CYAN lowering_to_configuration_key = /datum/config_entry/string/alert_blue_downto elevating_to_configuration_key = /datum/config_entry/string/alert_blue_upto shuttle_call_time_mod = ALERT_COEFF_BLUE @@ -74,6 +82,8 @@ announcement_color = "red" sound = 'sound/misc/notice3.ogg' // More angry alarm number_level = SEC_LEVEL_RED + status_display_icon_state = "redalert" + fire_alarm_light_color = LIGHT_COLOR_FLARE lowering_to_configuration_key = /datum/config_entry/string/alert_red_downto elevating_to_configuration_key = /datum/config_entry/string/alert_red_upto shuttle_call_time_mod = ALERT_COEFF_RED @@ -88,5 +98,7 @@ announcement_color = "purple" sound = 'sound/misc/airraid.ogg' // Air alarm to signify importance number_level = SEC_LEVEL_DELTA + status_display_icon_state = "deltaalert" + fire_alarm_light_color = LIGHT_COLOR_INTENSE_RED elevating_to_configuration_key = /datum/config_entry/string/alert_delta shuttle_call_time_mod = ALERT_COEFF_DELTA From 6b7454817f80b10cf5b30ad1663908c4489eff15 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 09:31:58 +1200 Subject: [PATCH 22/69] Automatic changelog for PR #84830 [ci skip] --- html/changelogs/AutoChangeLog-pr-84830.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84830.yml diff --git a/html/changelogs/AutoChangeLog-pr-84830.yml b/html/changelogs/AutoChangeLog-pr-84830.yml new file mode 100644 index 0000000000000..181e20de6818e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84830.yml @@ -0,0 +1,4 @@ +author: "Gaxeer" +delete-after: True +changes: + - refactor: "move `status_display_bottom_text` and `fire_alarm_light_color` to security level prototypes" \ No newline at end of file From 56aaef7888b3c7a6a5beb49bde781912f9890f85 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Thu, 11 Jul 2024 00:45:34 +0300 Subject: [PATCH 23/69] Vapes use correct fill level overlays (#84821) ## About The Pull Request Closes #83573 by removing an underscore ## Changelog :cl: fix: Vapes use correct fill level overlays /:cl: --- .../greyscale_configs/greyscale_items.dm | 6 +++--- .../{vape_open_high.json => vapeopen_high.json} | 2 +- .../{vape_open_low.json => vapeopen_low.json} | 2 +- .../{vape_open_med.json => vapeopen_med.json} | 2 +- code/game/objects/items/cigs_lighters.dm | 12 ++++++------ 5 files changed, 12 insertions(+), 12 deletions(-) rename code/datums/greyscale/json_configs/{vape_open_high.json => vapeopen_high.json} (94%) rename code/datums/greyscale/json_configs/{vape_open_low.json => vapeopen_low.json} (94%) rename code/datums/greyscale/json_configs/{vape_open_med.json => vapeopen_med.json} (94%) diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm index a3866971aae5f..2137aea08f3b4 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm @@ -265,15 +265,15 @@ /datum/greyscale_config/vape/open_low name = "Open Vape Low" - json_config = 'code/datums/greyscale/json_configs/vape_open_low.json' + json_config = 'code/datums/greyscale/json_configs/vapeopen_low.json' /datum/greyscale_config/vape/open_med name = "Open Vape Medium" - json_config = 'code/datums/greyscale/json_configs/vape_open_med.json' + json_config = 'code/datums/greyscale/json_configs/vapeopen_med.json' /datum/greyscale_config/vape/open_high name = "Open Vape High" - json_config = 'code/datums/greyscale/json_configs/vape_open_high.json' + json_config = 'code/datums/greyscale/json_configs/vapeopen_high.json' // // TAPE diff --git a/code/datums/greyscale/json_configs/vape_open_high.json b/code/datums/greyscale/json_configs/vapeopen_high.json similarity index 94% rename from code/datums/greyscale/json_configs/vape_open_high.json rename to code/datums/greyscale/json_configs/vapeopen_high.json index 65a0400d00334..1ef82459ca8c6 100644 --- a/code/datums/greyscale/json_configs/vape_open_high.json +++ b/code/datums/greyscale/json_configs/vapeopen_high.json @@ -1,5 +1,5 @@ { - "vape_open_high": [ + "vapeopen_high": [ { "type": "icon_state", "icon_state": "vapeOutlet", diff --git a/code/datums/greyscale/json_configs/vape_open_low.json b/code/datums/greyscale/json_configs/vapeopen_low.json similarity index 94% rename from code/datums/greyscale/json_configs/vape_open_low.json rename to code/datums/greyscale/json_configs/vapeopen_low.json index 3ad5971bc3783..eaef871bf3d1f 100644 --- a/code/datums/greyscale/json_configs/vape_open_low.json +++ b/code/datums/greyscale/json_configs/vapeopen_low.json @@ -1,5 +1,5 @@ { - "vape_open_low": [ + "vapeopen_low": [ { "type": "icon_state", "icon_state": "vapeOutlet", diff --git a/code/datums/greyscale/json_configs/vape_open_med.json b/code/datums/greyscale/json_configs/vapeopen_med.json similarity index 94% rename from code/datums/greyscale/json_configs/vape_open_med.json rename to code/datums/greyscale/json_configs/vapeopen_med.json index f26302edd77b3..508015825cef6 100644 --- a/code/datums/greyscale/json_configs/vape_open_med.json +++ b/code/datums/greyscale/json_configs/vapeopen_med.json @@ -1,5 +1,5 @@ { - "vape_open_med": [ + "vapeopen_med": [ { "type": "icon_state", "icon_state": "vapeOutlet", diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 5d7e5cca76d73..fe1f6b7495bda 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -1162,13 +1162,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM to_chat(user, span_notice("You open the cap on [src].")) reagents.flags |= OPENCONTAINER if(obj_flags & EMAGGED) - icon_state = "vape_open_high" + icon_state = "vapeopen_high" set_greyscale(new_config = /datum/greyscale_config/vape/open_high) else if(super) - icon_state = "vape_open_med" + icon_state = "vapeopen_med" set_greyscale(new_config = /datum/greyscale_config/vape/open_med) else - icon_state = "vape_open_low" + icon_state = "vapeopen_low" set_greyscale(new_config = /datum/greyscale_config/vape/open_low) else screw = FALSE @@ -1183,12 +1183,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(!super) super = TRUE to_chat(user, span_notice("You increase the voltage of [src].")) - icon_state = "vape_open_med" + icon_state = "vapeopen_med" set_greyscale(new_config = /datum/greyscale_config/vape/open_med) else super = FALSE to_chat(user, span_notice("You decrease the voltage of [src].")) - icon_state = "vape_open_low" + icon_state = "vapeopen_low" set_greyscale(new_config = /datum/greyscale_config/vape/open_low) if(screw && (obj_flags & EMAGGED)) @@ -1207,7 +1207,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM obj_flags |= EMAGGED super = FALSE balloon_alert(user, "voltage maximized") - icon_state = "vape_open_high" + icon_state = "vapeopen_high" set_greyscale(new_config = /datum/greyscale_config/vape/open_high) var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect sp.set_up(5, 1, src) From 910f4eb4724c51d61f9525eafc6864912e1a0b6a Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 09:45:52 +1200 Subject: [PATCH 24/69] Automatic changelog for PR #84821 [ci skip] --- html/changelogs/AutoChangeLog-pr-84821.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84821.yml diff --git a/html/changelogs/AutoChangeLog-pr-84821.yml b/html/changelogs/AutoChangeLog-pr-84821.yml new file mode 100644 index 0000000000000..7ba8fe543375e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84821.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Vapes use correct fill level overlays" \ No newline at end of file From 9046e3cd8b56b48c82a20c946dc654a0396e71bb Mon Sep 17 00:00:00 2001 From: Xackii <120736708+Xackii@users.noreply.github.com> Date: Thu, 11 Jul 2024 03:09:20 +0300 Subject: [PATCH 25/69] You can emag grapple gun to use it on station. (#84829) ## About The Pull Request You can emag grapple gun to use it on station. ## Why It's Good For The Game Cool hook. Gives him the way to use his mechanics at the station. :cl: add: You can emag grapple gun to use it on station. /:cl: --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> --- code/modules/mining/equipment/grapple_gun.dm | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/code/modules/mining/equipment/grapple_gun.dm b/code/modules/mining/equipment/grapple_gun.dm index 4e61b5d0fb3fd..76da071ec6e2d 100644 --- a/code/modules/mining/equipment/grapple_gun.dm +++ b/code/modules/mining/equipment/grapple_gun.dm @@ -41,8 +41,8 @@ if(target == user || !hooked) return NONE - if(!lavaland_equipment_pressure_check(get_turf(user))) - user.balloon_alert(user, "gun mechanism wont work here!") + if(!lavaland_equipment_pressure_check(get_turf(user)) && !(obj_flags & EMAGGED)) + user.balloon_alert(user, "gun mechanism won't work here!") return ITEM_INTERACT_BLOCKING if(get_dist(user, target) > 9) user.balloon_alert(user, "too far away!") @@ -73,6 +73,14 @@ update_appearance() return ITEM_INTERACT_SUCCESS +/obj/item/grapple_gun/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + if(obj_flags & EMAGGED) + return FALSE + balloon_alert(user, "pressure settings overloaded") + obj_flags |= EMAGGED + return TRUE + /obj/item/grapple_gun/proc/on_grapple_hit(datum/source, atom/movable/firer, atom/target, Angle) SIGNAL_HANDLER From f55dd2513006bb4955d60cdef0ec600c8bcbaea1 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:09:40 +1200 Subject: [PATCH 26/69] Automatic changelog for PR #84829 [ci skip] --- html/changelogs/AutoChangeLog-pr-84829.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84829.yml diff --git a/html/changelogs/AutoChangeLog-pr-84829.yml b/html/changelogs/AutoChangeLog-pr-84829.yml new file mode 100644 index 0000000000000..ed020bdc77ccd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84829.yml @@ -0,0 +1,4 @@ +author: "Xackii" +delete-after: True +changes: + - rscadd: "You can emag grapple gun to use it on station." \ No newline at end of file From 6268b8d40affcb210c41cfec9a261d633e453f6d Mon Sep 17 00:00:00 2001 From: _0Steven <42909981+00-Steven@users.noreply.github.com> Date: Thu, 11 Jul 2024 02:10:18 +0200 Subject: [PATCH 27/69] Fix newly created cardhands not inheriting singlecard offsets (#84838) ## About The Pull Request So while working on another pr, I noticed every time I used a deck to click on a single card, it'd create a cardhand... that's centered on the table. Looking into it, I noticed we already have code for it... but it doesn't work? This seems to be because we copy over the `pixel_x` and `pixel_y` values AFTER we insert the card into the cardhand: https://github.com/tgstation/tgstation/blob/cb5a5c1c69adf00663791f86f9b56047dd52367e/code/modules/cards/singlecard.dm#L172-L176 Swapping these around fixes it. ## Why It's Good For The Game It's kinda awkward to play card games around a single table if all your newly created cardhands decide to take up the same space on the table. ## Changelog :cl: fix: Using a dual wielded deck to add another card to a single card bases the position of the resulting hand of cards on the position of the card. /:cl: --- code/modules/cards/singlecard.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/cards/singlecard.dm b/code/modules/cards/singlecard.dm index 300523254ed7d..5f2c6e37f387a 100644 --- a/code/modules/cards/singlecard.dm +++ b/code/modules/cards/singlecard.dm @@ -170,10 +170,10 @@ user.balloon_alert_to_viewers("deals a card") var/obj/item/toy/cards/cardhand/new_cardhand = new (drop_location()) - new_cardhand.insert(src) - new_cardhand.insert(card) new_cardhand.pixel_x = pixel_x new_cardhand.pixel_y = pixel_y + new_cardhand.insert(src) + new_cardhand.insert(card) if(!isturf(loc)) // make a cardhand in our active hand user.temporarilyRemoveItemFromInventory(src, TRUE) From 3771f2a4daa59ae311080b75fce5bc15c8b67166 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:10:52 +1200 Subject: [PATCH 28/69] Automatic changelog for PR #84838 [ci skip] --- html/changelogs/AutoChangeLog-pr-84838.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84838.yml diff --git a/html/changelogs/AutoChangeLog-pr-84838.yml b/html/changelogs/AutoChangeLog-pr-84838.yml new file mode 100644 index 0000000000000..6aae05987d6c1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84838.yml @@ -0,0 +1,4 @@ +author: "00-Steven" +delete-after: True +changes: + - bugfix: "Using a dual wielded deck to add another card to a single card bases the position of the resulting hand of cards on the position of the card." \ No newline at end of file From b40cc6d5946ffdc1eadeb62f007c977af63af2be Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Thu, 11 Jul 2024 03:14:19 +0300 Subject: [PATCH 29/69] You no longer try to pull out someones eyes in combat mode if they have cranial fissure (#84822) ## About The Pull Request Closes #82526 Cranial fissure didn't check for combat mode so if someone had the trauma you weren't able to punch them in the head ## Changelog :cl: fix: You no longer try to pull out someones eyes in combat mode if they have cranial fissure /:cl: --- code/datums/wounds/cranial_fissure.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/wounds/cranial_fissure.dm b/code/datums/wounds/cranial_fissure.dm index 0b7c00dee7e32..df973d3bdec90 100644 --- a/code/datums/wounds/cranial_fissure.dm +++ b/code/datums/wounds/cranial_fissure.dm @@ -81,7 +81,7 @@ ) /datum/wound/cranial_fissure/try_handling(mob/living/user) - if (user.usable_hands <= 0) + if (user.usable_hands <= 0 || user.combat_mode) return FALSE if(!isnull(user.hud_used?.zone_select) && (user.zone_selected != BODY_ZONE_HEAD && user.zone_selected != BODY_ZONE_PRECISE_EYES)) From f1f13c5fe2bf3e991561483db7cf315547e6e597 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:14:47 +1200 Subject: [PATCH 30/69] Automatic changelog for PR #84822 [ci skip] --- html/changelogs/AutoChangeLog-pr-84822.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84822.yml diff --git a/html/changelogs/AutoChangeLog-pr-84822.yml b/html/changelogs/AutoChangeLog-pr-84822.yml new file mode 100644 index 0000000000000..9d91f4c5c6867 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84822.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "You no longer try to pull out someones eyes in combat mode if they have cranial fissure" \ No newline at end of file From 0b843b044ba6f7fc8b60f11890f216beecdb6c5f Mon Sep 17 00:00:00 2001 From: carlarctg <53100513+carlarctg@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:16:32 -0300 Subject: [PATCH 31/69] Fixed vomit category knockdown stunning (#84852) ## About The Pull Request Title ## Why It's Good For The Game Bugfix ## Changelog :cl: fix: Fixed an oversight that caused knockdown vomits to stun instead. /:cl: --- code/__DEFINES/mobs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 4265428e56f9b..f690304fd5f0c 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -868,7 +868,7 @@ GLOBAL_LIST_INIT(layers_to_offset, list( /// The vomit you've all come to know and love, but with a little extra "spice" (blood) #define VOMIT_CATEGORY_BLOOD (VOMIT_CATEGORY_DEFAULT | MOB_VOMIT_BLOOD) /// Another vomit variant that causes you to get knocked down instead of just only getting a stun. Standard otherwise. -#define VOMIT_CATEGORY_KNOCKDOWN (VOMIT_CATEGORY_DEFAULT | MOB_VOMIT_KNOCKDOWN) +#define VOMIT_CATEGORY_KNOCKDOWN (MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM | MOB_VOMIT_KNOCKDOWN) /// Possible value of [/atom/movable/buckle_lying]. If set to a different (positive-or-zero) value than this, the buckling thing will force a lying angle on the buckled. #define NO_BUCKLE_LYING -1 From c447936ea0ae617418712a8a87347c77878423d1 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:17:08 +1200 Subject: [PATCH 32/69] Automatic changelog for PR #84852 [ci skip] --- html/changelogs/AutoChangeLog-pr-84852.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84852.yml diff --git a/html/changelogs/AutoChangeLog-pr-84852.yml b/html/changelogs/AutoChangeLog-pr-84852.yml new file mode 100644 index 0000000000000..03492070f2ba8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84852.yml @@ -0,0 +1,4 @@ +author: "carlarctg" +delete-after: True +changes: + - bugfix: "Fixed an oversight that caused knockdown vomits to stun instead." \ No newline at end of file From a3e65cdfdf2f243a635e317c7adb60287892bfc0 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Thu, 11 Jul 2024 03:22:50 +0300 Subject: [PATCH 33/69] Fixes meat producing copious amounts of blood (#84820) ## About The Pull Request Closes #83665 blood_walk component's amount of blood is actually the amount of tiles on which the component will leave blood. This makes steaks roughly consistent with the meat material, as previously they had copious 400 tiles of blood. Since by default blood decals hold 50 blood, this translates to... 20 thousand units of blood. Does same for the meatpack which copypasted code from the steak from the looks of it. ## Why It's Good For The Game 400 tiles is a nonsensical amount of blood for a single steak, and this is clearly an oversight. Maintainers are welcome to relabel this as balance if required. ## Changelog :cl: fix: Steaks and meatpacks no longer have an absurd amount of blood stored inside of them. /:cl: --- code/game/objects/items/food/meatslab.dm | 4 ++-- code/game/objects/items/storage/backpack.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/food/meatslab.dm b/code/game/objects/items/food/meatslab.dm index 7816fb0e83a70..a5fe073e56f3f 100644 --- a/code/game/objects/items/food/meatslab.dm +++ b/code/game/objects/items/food/meatslab.dm @@ -16,12 +16,12 @@ /datum/component/blood_walk,\ blood_type = blood_decal_type,\ blood_spawn_chance = 45,\ - max_blood = custom_materials[custom_materials[1]],\ + max_blood = custom_materials[custom_materials[1]] / SHEET_MATERIAL_AMOUNT,\ ) AddComponent( /datum/component/bloody_spreader,\ - blood_left = custom_materials[custom_materials[1]],\ + blood_left = custom_materials[custom_materials[1]] / SHEET_MATERIAL_AMOUNT,\ blood_dna = list("meaty DNA" = "MT-"),\ diseases = null,\ ) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index d2d4297fdc6c5..5ae6e8d9fa618 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -277,11 +277,11 @@ /datum/component/blood_walk,\ blood_type = /obj/effect/decal/cleanable/blood,\ blood_spawn_chance = 15,\ - max_blood = 300,\ + max_blood = custom_materials[custom_materials[1]] / SHEET_MATERIAL_AMOUNT,\ ) AddComponent( /datum/component/bloody_spreader,\ - blood_left = INFINITY,\ + blood_left = custom_materials[custom_materials[1]] / SHEET_MATERIAL_AMOUNT,\ blood_dna = list("MEAT DNA" = "MT+"),\ diseases = null,\ ) From d64c5ebb63c74169a0047e7951357e0975ef2066 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:23:29 +1200 Subject: [PATCH 34/69] Automatic changelog for PR #84820 [ci skip] --- html/changelogs/AutoChangeLog-pr-84820.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84820.yml diff --git a/html/changelogs/AutoChangeLog-pr-84820.yml b/html/changelogs/AutoChangeLog-pr-84820.yml new file mode 100644 index 0000000000000..9d7fa37e2ffca --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84820.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Steaks and meatpacks no longer have an absurd amount of blood stored inside of them." \ No newline at end of file From d71595f9fedeedbb53632869bdc4ab690cdfd44b Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 11 Jul 2024 00:23:31 +0000 Subject: [PATCH 35/69] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-84658.yml | 5 ---- html/changelogs/AutoChangeLog-pr-84816.yml | 6 ----- html/changelogs/AutoChangeLog-pr-84821.yml | 4 ---- html/changelogs/AutoChangeLog-pr-84822.yml | 4 ---- html/changelogs/AutoChangeLog-pr-84829.yml | 4 ---- html/changelogs/AutoChangeLog-pr-84830.yml | 4 ---- html/changelogs/AutoChangeLog-pr-84838.yml | 4 ---- html/changelogs/AutoChangeLog-pr-84852.yml | 4 ---- html/changelogs/archive/2024-07.yml | 28 ++++++++++++++++++++++ 9 files changed, 28 insertions(+), 35 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-84658.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84816.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84821.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84822.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84829.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84830.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84838.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84852.yml diff --git a/html/changelogs/AutoChangeLog-pr-84658.yml b/html/changelogs/AutoChangeLog-pr-84658.yml deleted file mode 100644 index b2262f2241b16..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84658.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - balance: "Buffed the matrix flip skillchip duration. Lowered the stamina cost very, very slightly." - - qol: "You can now longer matrix-flip yourself into exhaustion, unless the emote is unintentional." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84816.yml b/html/changelogs/AutoChangeLog-pr-84816.yml deleted file mode 100644 index eb9a6963f5bc7..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84816.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - rscadd: "Bot Language station trait split into two: One that affects bots (retains the old weight and cost) and one that affects machine (half weight, double the cost)" - - rscdel: "Bot Language station trait and (new) Machine Language station trait no longer affect newly created machines or bots, just those present at game start" - - rscdel: "Machine Language station trait cannot affect the Automated Announcer in telecomms" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84821.yml b/html/changelogs/AutoChangeLog-pr-84821.yml deleted file mode 100644 index 7ba8fe543375e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84821.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Vapes use correct fill level overlays" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84822.yml b/html/changelogs/AutoChangeLog-pr-84822.yml deleted file mode 100644 index 9d91f4c5c6867..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84822.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "You no longer try to pull out someones eyes in combat mode if they have cranial fissure" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84829.yml b/html/changelogs/AutoChangeLog-pr-84829.yml deleted file mode 100644 index ed020bdc77ccd..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84829.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xackii" -delete-after: True -changes: - - rscadd: "You can emag grapple gun to use it on station." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84830.yml b/html/changelogs/AutoChangeLog-pr-84830.yml deleted file mode 100644 index 181e20de6818e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84830.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Gaxeer" -delete-after: True -changes: - - refactor: "move `status_display_bottom_text` and `fire_alarm_light_color` to security level prototypes" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84838.yml b/html/changelogs/AutoChangeLog-pr-84838.yml deleted file mode 100644 index 6aae05987d6c1..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84838.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "00-Steven" -delete-after: True -changes: - - bugfix: "Using a dual wielded deck to add another card to a single card bases the position of the resulting hand of cards on the position of the card." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84852.yml b/html/changelogs/AutoChangeLog-pr-84852.yml deleted file mode 100644 index 03492070f2ba8..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84852.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "carlarctg" -delete-after: True -changes: - - bugfix: "Fixed an oversight that caused knockdown vomits to stun instead." \ No newline at end of file diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index 95ca3273b35dd..f877ae9d9ee57 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -613,3 +613,31 @@ - bugfix: Amputating a paraplegic's leg no longer miraculously allows them to walk. zoomachina: - bugfix: fixed dubious chem dispenser feedback when the beaker is full +2024-07-11: + 00-Steven: + - bugfix: Using a dual wielded deck to add another card to a single card bases the + position of the resulting hand of cards on the position of the card. + Gaxeer: + - refactor: move `status_display_bottom_text` and `fire_alarm_light_color` to security + level prototypes + Ghommie: + - balance: Buffed the matrix flip skillchip duration. Lowered the stamina cost very, + very slightly. + - qol: You can now longer matrix-flip yourself into exhaustion, unless the emote + is unintentional. + Melbert: + - rscadd: 'Bot Language station trait split into two: One that affects bots (retains + the old weight and cost) and one that affects machine (half weight, double the + cost)' + - rscdel: Bot Language station trait and (new) Machine Language station trait no + longer affect newly created machines or bots, just those present at game start + - rscdel: Machine Language station trait cannot affect the Automated Announcer in + telecomms + SmArtKar: + - bugfix: Vapes use correct fill level overlays + - bugfix: You no longer try to pull out someones eyes in combat mode if they have + cranial fissure + Xackii: + - rscadd: You can emag grapple gun to use it on station. + carlarctg: + - bugfix: Fixed an oversight that caused knockdown vomits to stun instead. From b7fb9124b6943f3f0f3bf0552dbf6a726d93a3bb Mon Sep 17 00:00:00 2001 From: Ical <86125936+Ical92@users.noreply.github.com> Date: Wed, 10 Jul 2024 20:24:08 -0400 Subject: [PATCH 36/69] Adds in airlock helpers for inaccessible doors (#84792) ## About The Pull Request ACCESS_INACCESSIBLE was added by #81828, and originally used for the bitrunning lockboxes that were not meant to be unlockable by any access. This PR adds in an airlock helper (`/obj/effect/mapping_helpers/airlock/inaccessible`) that applies the ACCESS_INACCESSIBLE to make an airlock unable to be opened by any ID. ![image](https://github.com/tgstation/tgstation/assets/86125936/f94a6951-65cc-4f5c-a842-cc04ee5199d4) > An example of the helper, and what it looks like used on an airlock. ## Why It's Good For The Game This can be used in mapping for ruins or away missions where the mapper does not want an airlock to be passed through with an ID and does not want to worry about cases where the player may have access to ID cards from other ruins that may grant access to set doors. ## Changelog No player facing changes. --- code/modules/mapping/mapping_helpers.dm | 10 ++++++++++ icons/effects/mapping_helpers.dmi | Bin 26910 -> 27225 bytes 2 files changed, 10 insertions(+) diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index e830718e12ed6..587a62ec0e1b7 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -267,6 +267,16 @@ else airlock.autoname = TRUE +/obj/effect/mapping_helpers/airlock/inaccessible + name = "airlock inaccessible helper" + icon_state = "airlock_inaccessible" + +/obj/effect/mapping_helpers/airlock/inaccessible/payload(obj/machinery/door/airlock/airlock) + if(airlock.req_one_access != null) + log_mapping("[src] at [AREACOORD(src)] tried to set req_access, but req__one_access was already set!") + else + airlock.req_access += list(ACCESS_INACCESSIBLE) + //air alarm helpers /obj/effect/mapping_helpers/airalarm desc = "You shouldn't see this. Report it please." diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index 47684f4664e89e576862de648ba5b5002246b65e..c415d4dcff1f4d4e04b30619682e5bc941cf0796 100644 GIT binary patch delta 3802 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 Q00000NkvXXu0jG}g3$DEMgRZ+ delta 3484 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 From 6ab5274b2dbe1b3b177f5be4bcd0cc49d6873184 Mon Sep 17 00:00:00 2001 From: zoomachina <97964454+zoomachina@users.noreply.github.com> Date: Thu, 11 Jul 2024 03:24:47 +0300 Subject: [PATCH 37/69] Makes gigabeacon easier to research (#84823) ## About The Pull Request This changes the bluespace navigation gigabeacon to be unlocked with Applied Bluespace Research (T2) research node, instead of Telecommunications (T5). ## Why It's Good For The Game Gigabeacon used to be its own node which nobody researched. #77223 changed that by tying it up with Telecommunications. After the techweb tree update, Telecommunications has become a tier 5 research, meaning that nobody researches gigabeacons again. This PR is meant to amend that, making gigabeacons more accessible again. I have to admit that putting this item unlock on Applied Bluespace node is quite generous, since that node should be researched early on every round. However, I don't believe that to be an issue, but if needed I can move it to Bluespace Travel (prerequisite to t4 parts). ## Changelog :cl: balance: bluespace navigation gigabeacons are now unlocked with Applied Bluespace Research /:cl: --- code/modules/research/techweb/nodes/engi_nodes.dm | 1 - code/modules/research/techweb/nodes/research_nodes.dm | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/techweb/nodes/engi_nodes.dm b/code/modules/research/techweb/nodes/engi_nodes.dm index 626dd6981d0ce..0fe1b7bd75f33 100644 --- a/code/modules/research/techweb/nodes/engi_nodes.dm +++ b/code/modules/research/techweb/nodes/engi_nodes.dm @@ -104,7 +104,6 @@ "s_filter", "s_transmitter", "s_treatment", - "gigabeacon", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) diff --git a/code/modules/research/techweb/nodes/research_nodes.dm b/code/modules/research/techweb/nodes/research_nodes.dm index 0a37fb19868a3..b70d9582681ce 100644 --- a/code/modules/research/techweb/nodes/research_nodes.dm +++ b/code/modules/research/techweb/nodes/research_nodes.dm @@ -45,6 +45,7 @@ "blutrash", "light_replacer_blue", "bluespacebodybag", + "gigabeacon", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) required_experiments = list(/datum/experiment/scanning/points/bluespace_crystal) From 95838069f6817cf53fa3b5ac770e250d2754f1e2 Mon Sep 17 00:00:00 2001 From: GPeckman <21979502+GPeckman@users.noreply.github.com> Date: Wed, 10 Jul 2024 20:25:24 -0400 Subject: [PATCH 38/69] Fixes grounding rods (#84839) ## About The Pull Request Grounding rods didn't have a circuit properly defined. This meant that mapped-in grounding rods (and presumably admin spawned ones) could not be upgraded and did not yield any parts or a circuit board when deconstructed. Now they do have a circuit defined. Fixes #84588 ## Changelog :cl: fix: Mapped in grounding rods can be upgraded again (not that upgraded parts do anything for it) and don't disappear when deconstructed anymore. /:cl: --- code/modules/power/tesla/coil.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 7d8fab5dd774d..14eb6c88864b0 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -127,6 +127,8 @@ density = TRUE wants_powernet = FALSE + circuit = /obj/item/circuitboard/machine/grounding_rod + can_buckle = TRUE buckle_lying = 0 buckle_requires_restraints = TRUE From 736d9773d809ff28df1026ba2f7c0c0835f3030f Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:25:37 +1200 Subject: [PATCH 39/69] Automatic changelog for PR #84823 [ci skip] --- html/changelogs/AutoChangeLog-pr-84823.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84823.yml diff --git a/html/changelogs/AutoChangeLog-pr-84823.yml b/html/changelogs/AutoChangeLog-pr-84823.yml new file mode 100644 index 0000000000000..a90a9c7845f8d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84823.yml @@ -0,0 +1,4 @@ +author: "zoomachina" +delete-after: True +changes: + - balance: "bluespace navigation gigabeacons are now unlocked with Applied Bluespace Research" \ No newline at end of file From a327f4f57ee2fc04174792cb21bb007474d08e65 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:25:51 +1200 Subject: [PATCH 40/69] Automatic changelog for PR #84839 [ci skip] --- html/changelogs/AutoChangeLog-pr-84839.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84839.yml diff --git a/html/changelogs/AutoChangeLog-pr-84839.yml b/html/changelogs/AutoChangeLog-pr-84839.yml new file mode 100644 index 0000000000000..8be0448a36781 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84839.yml @@ -0,0 +1,4 @@ +author: "GPeckman" +delete-after: True +changes: + - bugfix: "Mapped in grounding rods can be upgraded again (not that upgraded parts do anything for it) and don't disappear when deconstructed anymore." \ No newline at end of file From ddef3443071e0dd6399d3abc7d85fa4ee2a6411b Mon Sep 17 00:00:00 2001 From: OrionTheFox <76465278+OrionTheFox@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:27:39 -0600 Subject: [PATCH 41/69] Resprites Catwalk Tiles to match TG's floortiles (#84819) ## About The Pull Request Forgive me Maintainers, for I have sinned. Months ago, a year ago, maybe longer, I PR'd some new and improved sprites for the Catwalk Tiles here to TG. And when I did, I did not use the right tile palettes for reference. I have come to atone. ![image](https://github.com/tgstation/tgstation/assets/76465278/16605b30-455c-4c17-863b-00451a76fe27) ![image](https://github.com/tgstation/tgstation/assets/76465278/2d91e1b0-37c9-4916-b02a-9b23db0e3028) ![image](https://github.com/tgstation/tgstation/assets/76465278/c4233dec-1871-42ac-848b-2e8e94454dbc) ![image](https://github.com/tgstation/tgstation/assets/76465278/d8f09852-a8aa-4093-a4fd-68ddcbbc51af) ![image](https://github.com/tgstation/tgstation/assets/76465278/ff219529-d91c-459c-b8dc-b95e44890fa6) Additionally, I removed a duplicate white catwalk tile (flat_white - the one left is iron_white) and changed the `none`/error icon in the file to double as both an error marker, and a template of the catwalk mesh for future catwalk tile sprites. ## Why It's Good For The Game Consistent matching tile sprites are much, much nicer to look at. ## Changelog :cl: image: re-sprited Catwalk Floor Tiles to fit with TG floor tiles /:cl: --- _maps/map_files/Birdshot/birdshot.dmm | 56 +++++------ _maps/map_files/NorthStar/north_star.dmm | 2 +- _maps/map_files/wawastation/wawastation.dmm | 88 +++++++++--------- _maps/shuttles/emergency_northstar.dmm | 6 +- .../objects/items/stacks/tiles/tile_types.dm | 7 -- code/game/turfs/open/floor/catwalk_plating.dm | 9 -- icons/obj/tiles.dmi | Bin 33359 -> 33132 bytes icons/turf/floors/catwalk_plating.dmi | Bin 4353 -> 4221 bytes .../84819_replace_flat_white_catwalks.txt | 5 + 9 files changed, 81 insertions(+), 92 deletions(-) create mode 100644 tools/UpdatePaths/Scripts/84819_replace_flat_white_catwalks.txt diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 3e765d5d16786..a542ef5177488 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -4698,7 +4698,7 @@ id = "rdoffice"; name = "Research Director's Shutters" }, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/cubicle) "bOa" = ( /obj/effect/turf_decal/sand/plating, @@ -11605,7 +11605,7 @@ }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/security/general, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/security/checkpoint/science) "eqz" = ( /obj/effect/turf_decal/siding/white/corner{ @@ -16520,7 +16520,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/robotics, /obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/robotics/mechbay) "gaF" = ( /obj/machinery/stasis{ @@ -19442,7 +19442,7 @@ /area/station/maintenance/starboard/greater) "gYH" = ( /obj/machinery/vending/wardrobe/robo_wardrobe, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/robotics/augments) "gZf" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -28764,7 +28764,7 @@ name = "Cytology Lab" }, /obj/effect/mapping_helpers/airlock/access/all/science/research, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/research) "jQv" = ( /obj/structure/cable, @@ -32022,7 +32022,7 @@ id = "rdoffice"; name = "Research Director's Shutters" }, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/command/heads_quarters/rd) "kSv" = ( /obj/structure/disposalpipe/segment{ @@ -37670,7 +37670,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/robotics, /obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/robotics/lab) "mEq" = ( /obj/structure/closet/crate/wooden{ @@ -41777,7 +41777,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/cubicle) "nYk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -43053,7 +43053,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/research, /obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/cytology) "ovt" = ( /obj/machinery/door/airlock/maintenance{ @@ -47168,7 +47168,7 @@ name = "Gun Lab" }, /obj/effect/mapping_helpers/airlock/access/all/science/general, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/auxlab/firing_range) "pLj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47246,7 +47246,7 @@ /obj/effect/mapping_helpers/airlock/access/all/science/genetics, /obj/machinery/door/firedoor, /obj/structure/cable, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/research) "pML" = ( /obj/structure/lattice/catwalk, @@ -48605,7 +48605,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/research, /obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/research) "qiz" = ( /obj/effect/spawner/structure/window, @@ -49548,7 +49548,7 @@ name = "Break Room" }, /obj/effect/mapping_helpers/airlock/access/all/science/general, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/research) "qzL" = ( /obj/structure/disposalpipe/segment{ @@ -49677,7 +49677,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/power/apc/auto_name/directional/south, /obj/machinery/light/small/directional/north, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/robotics/augments) "qBi" = ( /obj/effect/decal/cleanable/dirt, @@ -52607,7 +52607,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/genetics, /obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/research) "rwl" = ( /obj/structure/lattice/catwalk, @@ -54424,7 +54424,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/robotics/augments) "rZq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57984,7 +57984,7 @@ name = "Research Division Server Room" }, /obj/effect/mapping_helpers/airlock/access/all/science/rd, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/server) "tfy" = ( /obj/structure/closet/firecloset, @@ -61277,7 +61277,7 @@ name = "Augment Corridor" }, /obj/effect/mapping_helpers/airlock/access/all/science/robotics, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/robotics/augments) "uhe" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -62709,7 +62709,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/south, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/robotics/augments) "uEC" = ( /obj/structure/window/reinforced/spawner/directional/east, @@ -64348,7 +64348,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/robotics, /obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/robotics/augments) "veA" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, @@ -64714,7 +64714,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/research) "vkh" = ( /turf/closed/wall, @@ -64730,7 +64730,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/lab) "vkr" = ( /obj/structure/cable, @@ -68009,7 +68009,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/research) "wfE" = ( /obj/effect/turf_decal/tile/brown/opposingcorners, @@ -69052,7 +69052,7 @@ id = "rdoffice"; name = "Research Director's Shutters" }, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/research) "wwY" = ( /obj/effect/spawner/random/trash/mess, @@ -71460,7 +71460,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/rd, /obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/server) "xfm" = ( /obj/structure/cable, @@ -73305,7 +73305,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/robotics, /obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/robotics/mechbay) "xEd" = ( /obj/structure/cable, @@ -73961,7 +73961,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/auxlab/firing_range) "xOm" = ( /obj/effect/turf_decal/delivery, @@ -74473,7 +74473,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/cubicle) "xTV" = ( /obj/machinery/ai_slipper{ diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 3e4e2fa63556c..8f7285e09dae0 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -90788,7 +90788,7 @@ }, /obj/machinery/shower/directional/south, /obj/structure/fluff/shower_drain, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/medical/treatment_center) "xrh" = ( /obj/effect/turf_decal/tile/blue{ diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index d9ee5460f5bda..a2ec3989358ff 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -458,7 +458,7 @@ /obj/machinery/door/firedoor, /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "agO" = ( /obj/effect/decal/cleanable/dirt, @@ -1044,7 +1044,7 @@ /obj/structure/cable, /obj/effect/turf_decal/siding/purple/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "aqM" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -2405,7 +2405,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/lab) "aNH" = ( /obj/machinery/door/airlock/security/glass{ @@ -2860,7 +2860,7 @@ /obj/effect/mapping_helpers/apc/full_charge, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "aXg" = ( /obj/structure/railing{ @@ -8436,7 +8436,7 @@ /area/station/cargo/miningoffice) "dci" = ( /obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/medical/treatment_center) "dck" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -8672,7 +8672,7 @@ }, /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/medical/treatment_center) "dgS" = ( /obj/structure/cable, @@ -9382,7 +9382,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "drz" = ( /obj/effect/decal/cleanable/dirt/dust, @@ -11410,7 +11410,7 @@ /area/station/command/heads_quarters/qm) "eaL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/medical/treatment_center) "eaS" = ( /obj/effect/turf_decal/siding/wood{ @@ -13777,7 +13777,7 @@ /turf/open/floor/plating, /area/station/maintenance/department/science) "eUB" = ( -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/medical/treatment_center) "eUD" = ( /obj/effect/turf_decal/plaque{ @@ -17186,7 +17186,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "gdP" = ( /obj/structure/lattice, @@ -17479,7 +17479,7 @@ /obj/structure/window/reinforced/spawner/directional/south, /obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "gjt" = ( /obj/machinery/pdapainter/medbay, @@ -17655,7 +17655,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "gmd" = ( /obj/effect/spawner/structure/window/reinforced, @@ -20450,7 +20450,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/lab) "hle" = ( /obj/machinery/light/directional/south, @@ -21584,7 +21584,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/lab) "hED" = ( /turf/closed/wall/r_wall, @@ -22965,7 +22965,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "ifc" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, @@ -23384,7 +23384,7 @@ /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, /obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/medical/treatment_center) "iol" = ( /turf/closed/wall/r_wall, @@ -24800,7 +24800,7 @@ /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "iOE" = ( /obj/item/pickaxe/mini, @@ -25198,7 +25198,7 @@ /obj/structure/cable, /obj/effect/turf_decal/siding/purple, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "iXR" = ( /obj/structure/cable, @@ -25519,7 +25519,7 @@ /obj/effect/turf_decal/siding/purple{ dir = 1 }, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "jer" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -28627,7 +28627,7 @@ id = "Xenolab"; name = "Test Chamber Blast Door" }, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "ked" = ( /obj/structure/cable, @@ -29507,7 +29507,7 @@ /area/station/engineering/atmos) "krO" = ( /obj/structure/cable, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "krP" = ( /turf/closed/wall/r_wall, @@ -31640,7 +31640,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/hallway/secondary/entry) "lfd" = ( /obj/machinery/door/airlock/external/glass, @@ -32832,7 +32832,7 @@ "lBZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "lCk" = ( /obj/effect/turf_decal/siding/dark_blue{ @@ -33808,7 +33808,7 @@ /obj/effect/landmark/navigate_destination/dockarrival, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/hallway/secondary/entry) "lUF" = ( /obj/structure/transport/linear/public, @@ -36489,7 +36489,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "mRI" = ( /obj/effect/mob_spawn/corpse/human/clown, @@ -36811,7 +36811,7 @@ /obj/machinery/firealarm/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "mYs" = ( /obj/machinery/door/airlock/public/glass{ @@ -38742,7 +38742,7 @@ }, /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/medical/treatment_center) "nIb" = ( /obj/effect/decal/cleanable/dirt/dust, @@ -40428,7 +40428,7 @@ "osT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, /obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/medical/treatment_center) "osX" = ( /obj/effect/decal/cleanable/dirt, @@ -42728,7 +42728,7 @@ /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, /obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/medical/treatment_center) "piS" = ( /obj/structure/girder/displaced, @@ -46989,7 +46989,7 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/lab) "qIS" = ( /obj/machinery/cryo_cell, @@ -48874,7 +48874,7 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/hidden{ dir = 4 }, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/ordnance) "roO" = ( /obj/machinery/door/airlock/security/glass{ @@ -49628,7 +49628,7 @@ "rBq" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/purple, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "rBt" = ( /obj/effect/turf_decal/stripes/line{ @@ -55187,7 +55187,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "tvB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -55542,7 +55542,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/lab) "tCE" = ( /obj/effect/turf_decal/tile/neutral, @@ -55890,7 +55890,7 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "tIE" = ( /obj/effect/landmark/secequipment, @@ -56359,7 +56359,7 @@ "tPE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "tPJ" = ( /obj/machinery/light_switch/directional/west, @@ -56914,7 +56914,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "tZW" = ( /obj/machinery/camera/autoname/directional/south, @@ -57772,7 +57772,7 @@ "uoP" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2, /obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/medical/treatment_center) "uoY" = ( /obj/structure/cable, @@ -62764,7 +62764,7 @@ /obj/structure/cable, /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "weg" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ @@ -63755,7 +63755,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/lab) "wxQ" = ( /obj/machinery/computer/operating{ @@ -64825,7 +64825,7 @@ /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "wPU" = ( /obj/machinery/light/small/directional/west, @@ -65677,7 +65677,7 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/xenobiology) "xeW" = ( /obj/effect/turf_decal/tile/brown{ @@ -65751,7 +65751,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/science/lab) "xgn" = ( /obj/structure/mannequin/skeleton{ @@ -66288,7 +66288,7 @@ /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/station/hallway/secondary/entry) "xqO" = ( /obj/docking_port/stationary/escape_pod{ diff --git a/_maps/shuttles/emergency_northstar.dmm b/_maps/shuttles/emergency_northstar.dmm index e934a65b722fa..798a4d9671a4e 100644 --- a/_maps/shuttles/emergency_northstar.dmm +++ b/_maps/shuttles/emergency_northstar.dmm @@ -183,10 +183,10 @@ pixel_x = -3; pixel_y = 2 }, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/shuttle/escape) "qf" = ( -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/shuttle/escape) "qK" = ( /obj/machinery/stasis, @@ -347,7 +347,7 @@ /obj/machinery/door/airlock/survival_pod/glass{ name = "Emergency Shuttle Treatment" }, -/turf/open/floor/catwalk_floor/flat_white, +/turf/open/floor/catwalk_floor/iron_white, /area/shuttle/escape) "Eh" = ( /obj/machinery/power/shuttle_engine/propulsion/left, diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 89e6cae389dbd..4b89719998c8f 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -1265,7 +1265,6 @@ /obj/item/stack/tile/catwalk_tile/iron, /obj/item/stack/tile/catwalk_tile/iron_white, /obj/item/stack/tile/catwalk_tile/iron_dark, - /obj/item/stack/tile/catwalk_tile/flat_white, /obj/item/stack/tile/catwalk_tile/titanium, /obj/item/stack/tile/catwalk_tile/iron_smooth //this is the original greenish one ) @@ -1291,12 +1290,6 @@ icon_state = "darkiron_catwalk" turf_type = /turf/open/floor/catwalk_floor/iron_dark -/obj/item/stack/tile/catwalk_tile/flat_white - name = "flat white catwalk floor" - singular_name = "flat white catwalk floor tile" - icon_state = "flatwhite_catwalk" - turf_type = /turf/open/floor/catwalk_floor/flat_white - /obj/item/stack/tile/catwalk_tile/titanium name = "titanium catwalk floor" singular_name = "titanium catwalk floor tile" diff --git a/code/game/turfs/open/floor/catwalk_plating.dm b/code/game/turfs/open/floor/catwalk_plating.dm index 765482cf78cfa..6e2979b8512f9 100644 --- a/code/game/turfs/open/floor/catwalk_plating.dm +++ b/code/game/turfs/open/floor/catwalk_plating.dm @@ -76,12 +76,6 @@ floor_tile = /obj/item/stack/tile/catwalk_tile/iron_dark catwalk_type = "darkiron" -/turf/open/floor/catwalk_floor/flat_white - name = "white large plated catwalk floor" - icon_state = "flatwhite_above" - floor_tile = /obj/item/stack/tile/catwalk_tile/flat_white - catwalk_type = "flatwhite" - /turf/open/floor/catwalk_floor/titanium name = "titanium plated catwalk floor" icon_state = "titanium_above" @@ -111,9 +105,6 @@ /turf/open/floor/catwalk_floor/iron_dark/telecomms initial_gas_mix = TCOMMS_ATMOS -/turf/open/floor/catwalk_floor/flat_white/airless - initial_gas_mix = AIRLESS_ATMOS - /turf/open/floor/catwalk_floor/titanium/Airless initial_gas_mix = AIRLESS_ATMOS diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index 2c2aae54de3c2f1855dd7e210fea35938dfbc6c0..85d4b82a498c066814bee6c8ea5872a83f489f51 100644 GIT binary patch delta 11828 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 F{{s-?fZG57 diff --git a/icons/turf/floors/catwalk_plating.dmi b/icons/turf/floors/catwalk_plating.dmi index b49c46564de508d0ddc8fd050c50655d6ffe6352..800d0c8dfffcdb408472963441180bcd44c083a9 100644 GIT binary patch literal 4221 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 HD&&6v?2t7g literal 4353 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 qg;w^;-I5+q8oTZz8c0T}3+=oafZhWsB3o^Wdb diff --git a/tools/UpdatePaths/Scripts/84819_replace_flat_white_catwalks.txt b/tools/UpdatePaths/Scripts/84819_replace_flat_white_catwalks.txt new file mode 100644 index 0000000000000..3d957e815f429 --- /dev/null +++ b/tools/UpdatePaths/Scripts/84819_replace_flat_white_catwalks.txt @@ -0,0 +1,5 @@ +# replaces redundant flat_white catwalk tiles with iron_white + +/turf/open/floor/catwalk_floor/flat_white : /turf/open/floor/catwalk_floor/iron_white{@OLD} +/turf/open/floor/catwalk_floor/flat_white/@SUBTYPES : /turf/open/floor/catwalk_floor/iron_white/@SUBTYPES{@OLD} +/obj/item/stack/tile/catwalk_tile/flat_white : /obj/item/stack/tile/catwalk_tile/iron_white{@OLD} From 7fe59641265e002a8060588149750ac0c39d4f68 Mon Sep 17 00:00:00 2001 From: jimmyl <70376633+mc-oofert@users.noreply.github.com> Date: Thu, 11 Jul 2024 02:27:59 +0200 Subject: [PATCH 42/69] fixes wawa cryo cell (but good) (#84682) ## About The Pull Request better alternative to #84676 cryo cells having a two tile tall sprite return the turf above in /proc/get_turf_pixel() overrides IsObscured on cryo cells to only respect its actual location fixes #80983 ## Why It's Good For The Game bug bad ## Changelog :cl: fix: fixes the rightmost wawastation cryo cell /:cl: --- code/__DEFINES/_flags.dm | 2 ++ code/__HELPERS/turfs.dm | 2 ++ .../atmospherics/machinery/components/unary_devices/cryo.dm | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index 72d28ca6bca9d..55e706ce06d03 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -54,6 +54,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 /// Flag as an optimization, don't make this a trait without profiling /// Yes I know this is a stupid flag, no you can't take him from me #define DECAL_INIT_UPDATE_EXPERIENCED_1 (1<<17) +/// This atom always returns its turf in get_turf_pixel instead of the turf from its offsets +#define IGNORE_TURF_PIXEL_OFFSET_1 (1<<18) // Update flags for [/atom/proc/update_appearance] /// Update the atom's name diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index 88509b88ce802..01ad88e68f4c3 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -213,6 +213,8 @@ Turf and target are separate in case you want to teleport some distance from a t var/turf/atom_turf = get_turf(checked_atom) //use checked_atom's turfs, as it's coords are the same as checked_atom's AND checked_atom's coords are lost if it is inside another atom if(!atom_turf) return null + if(checked_atom.flags_1 & IGNORE_TURF_PIXEL_OFFSET_1) + return atom_turf var/list/offsets = get_visual_offset(checked_atom) return pixel_offset_turf(atom_turf, offsets) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 1435816499f87..acb454a983689 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -79,7 +79,7 @@ use_power = IDLE_POWER_USE idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.75 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 1.5 - flags_1 = PREVENT_CLICK_UNDER_1 + flags_1 = PREVENT_CLICK_UNDER_1 | IGNORE_TURF_PIXEL_OFFSET_1 interaction_flags_mouse_drop = NEED_DEXTERITY ///If TRUE will eject the mob once healing is complete From 3d4e404d1e21159896e263fb3f6958d0720b18c4 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:28:00 +1200 Subject: [PATCH 43/69] Automatic changelog for PR #84819 [ci skip] --- html/changelogs/AutoChangeLog-pr-84819.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84819.yml diff --git a/html/changelogs/AutoChangeLog-pr-84819.yml b/html/changelogs/AutoChangeLog-pr-84819.yml new file mode 100644 index 0000000000000..d1020247936c8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84819.yml @@ -0,0 +1,4 @@ +author: "OrionTheFox" +delete-after: True +changes: + - image: "re-sprited Catwalk Floor Tiles to fit with TG floor tiles" \ No newline at end of file From a42d6e7268857f2aa9fc6cee1d10a21d9be75bfa Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:28:23 +1200 Subject: [PATCH 44/69] Automatic changelog for PR #84682 [ci skip] --- html/changelogs/AutoChangeLog-pr-84682.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84682.yml diff --git a/html/changelogs/AutoChangeLog-pr-84682.yml b/html/changelogs/AutoChangeLog-pr-84682.yml new file mode 100644 index 0000000000000..a94b45530a153 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84682.yml @@ -0,0 +1,4 @@ +author: "mc-oofert" +delete-after: True +changes: + - bugfix: "fixes the rightmost wawastation cryo cell" \ No newline at end of file From 34d5c835c58c80ab471ac0822dc076e70ffe126d Mon Sep 17 00:00:00 2001 From: GPeckman <21979502+GPeckman@users.noreply.github.com> Date: Wed, 10 Jul 2024 20:29:19 -0400 Subject: [PATCH 45/69] You can now see whether or not a piece of clothing is pressure-proof when examining (#84807) ## About The Pull Request A picture is worth a thousand words: ![unsealed](https://github.com/tgstation/tgstation/assets/21979502/10e3c778-2445-4232-be44-28170bc34826) ![sealed](https://github.com/tgstation/tgstation/assets/21979502/98825d56-9c05-4984-8b27-251c0405a1b0) ![helmet](https://github.com/tgstation/tgstation/assets/21979502/2b98ca1d-b4ce-42ec-86ce-0fc19650c400) As you can see from the first picture, it takes unsealed modsuits (and similar items, if any exist) into account. It also has text for clothing that covers both the head and torso, but as far as I can tell no single item does this (hoods don't count since it's a separate item). ## Why It's Good For The Game Knowing that a piece of gear protects you from space is vital information, especially to new players. For EVA suits, it might already be obvious, but how many new players will know that a firesuit does the same? ## Changelog :cl: qol: Clothing now tells you if it is pressure-proof and insulated enough for spacewalking when examining it. /:cl: --- code/modules/clothing/clothing.dm | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 98184b3fce25e..1998b7abc4db3 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -353,7 +353,7 @@ how_cool_are_your_threads += "" . += how_cool_are_your_threads.Join() - if(get_armor().has_any_armor() || (flags_cover & (HEADCOVERSMOUTH|PEPPERPROOF))) + if(get_armor().has_any_armor() || (flags_cover & (HEADCOVERSMOUTH|PEPPERPROOF)) || (clothing_flags & STOPSPRESSUREDAMAGE) || (visor_flags & STOPSPRESSUREDAMAGE)) . += span_notice("It has a tag listing its protection classes.") /obj/item/clothing/Topic(href, href_list) @@ -393,6 +393,20 @@ readout += "COVERAGE" readout += "It will block [english_list(things_blocked)]." + if(clothing_flags & STOPSPRESSUREDAMAGE || visor_flags & STOPSPRESSUREDAMAGE) + var/list/parts_covered = list() + var/output_string = "It" + if(!(clothing_flags & STOPSPRESSUREDAMAGE)) + output_string = "When sealed, it" + if(body_parts_covered & HEAD) + parts_covered += "head" + if(body_parts_covered & CHEST) + parts_covered += "torso" + if(length(parts_covered)) // Just in case someone makes spaceproof gloves or something + readout += "[output_string] will protect the wearer's [english_list(parts_covered)] from [span_tooltip("The extremely low pressure is the biggest danger posed by the vacuum of space.", "low pressure")]." + + if(min_cold_protection_temperature == SPACE_SUIT_MIN_TEMP_PROTECT) + readout += "It will insulate the wearer from [span_tooltip("While not as dangerous as the lack of pressure, the extremely low temperature of space is also a hazard.", "the cold of space")]." if(!length(readout)) readout += "No armor or durability information available." From e9b9b82c8c91f71513eb34d1f12fd5c93e4df262 Mon Sep 17 00:00:00 2001 From: GoblinBackwards <22856555+GoblinBackwards@users.noreply.github.com> Date: Thu, 11 Jul 2024 01:29:49 +0100 Subject: [PATCH 46/69] Fixes improvised cauterization of wounds (#84803) ## About The Pull Request Fixes some weird order of operations stuff that was making it impossible to use improvised cauterisation tools to cauterise wounds. ## Changelog :cl: fix: Fixed being unable to cauterise wounds with improvised cautery tools such as welders. /:cl: --- code/datums/wounds/_wounds.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index f713819c81786..47f29a21e9dd5 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -498,7 +498,7 @@ // check if we have a valid treatable tool if(potential_treater.tool_behaviour in treatable_tools) return TRUE - if(TOOL_CAUTERY in treatable_tools && potential_treater.get_temperature() && user == victim) // allow improvised cauterization on yourself without an aggro grab + if((TOOL_CAUTERY in treatable_tools) && potential_treater.get_temperature() && (user == victim)) // allow improvised cauterization on yourself without an aggro grab return TRUE // failing that, see if we're aggro grabbing them and if we have an item that works for aggro grabs only if(user.pulling == victim && user.grab_state >= GRAB_AGGRESSIVE && check_grab_treatments(potential_treater, user)) From c9020510d27692c66583e4cba9fa3de8bcfda12a Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:29:56 +1200 Subject: [PATCH 47/69] Automatic changelog for PR #84807 [ci skip] --- html/changelogs/AutoChangeLog-pr-84807.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84807.yml diff --git a/html/changelogs/AutoChangeLog-pr-84807.yml b/html/changelogs/AutoChangeLog-pr-84807.yml new file mode 100644 index 0000000000000..da3dbcef8d6b6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84807.yml @@ -0,0 +1,4 @@ +author: "GPeckman" +delete-after: True +changes: + - qol: "Clothing now tells you if it is pressure-proof and insulated enough for spacewalking when examining it." \ No newline at end of file From 699e58b486a50173b2e454bc05c1618e03a5c9a9 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:30:40 +1200 Subject: [PATCH 48/69] Automatic changelog for PR #84803 [ci skip] --- html/changelogs/AutoChangeLog-pr-84803.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84803.yml diff --git a/html/changelogs/AutoChangeLog-pr-84803.yml b/html/changelogs/AutoChangeLog-pr-84803.yml new file mode 100644 index 0000000000000..6edd94fe153a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84803.yml @@ -0,0 +1,4 @@ +author: "GoblinBackwards" +delete-after: True +changes: + - bugfix: "Fixed being unable to cauterise wounds with improvised cautery tools such as welders." \ No newline at end of file From e693034477c1cd60a23672cc5c62d8e2c2554291 Mon Sep 17 00:00:00 2001 From: Odairu Date: Wed, 10 Jul 2024 20:32:06 -0400 Subject: [PATCH 49/69] Adds a crash report to the imprint_gps proc and removes an unnecessary arg in law.dm (#84818) ## About The Pull Request As the title says ## Why It's Good For The Game if someone's using the proc and fucks up they might be able to tell easier ## Changelog :cl: code: added a crash report and removes an arg /:cl: --- code/game/machinery/computer/_computer.dm | 2 +- code/game/machinery/computer/law.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index c8e0251b3dd4b..3292cbf977b5f 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -93,7 +93,7 @@ return for(var/obj/item/circuitboard/computer/board in src.contents) if(!contents || board.GetComponent(/datum/component/gps)) - return + CRASH("[src] Called imprint_gps without setting gps_tag") board.AddComponent(/datum/component/gps, "[tracker]") balloon_alert_to_viewers("board tracker enabled", vision_distance = 1) diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 383a980a64da0..742166b285659 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -28,7 +28,7 @@ current = null return M.install(current.laws, user) - imprint_gps(gps_tag = "Weak Upload Signal") + imprint_gps("Weak Upload Signal") else return ..() From fc5d641c0d3a15c84bc35b3ec69481c2de6f9c21 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:33:09 +1200 Subject: [PATCH 50/69] Automatic changelog for PR #84818 [ci skip] --- html/changelogs/AutoChangeLog-pr-84818.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84818.yml diff --git a/html/changelogs/AutoChangeLog-pr-84818.yml b/html/changelogs/AutoChangeLog-pr-84818.yml new file mode 100644 index 0000000000000..1302d9006acc2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84818.yml @@ -0,0 +1,4 @@ +author: "imedial" +delete-after: True +changes: + - code_imp: "added a crash report and removes an arg" \ No newline at end of file From c4c41797b6ccfe11ec74390aacd6903e48b2f402 Mon Sep 17 00:00:00 2001 From: carlarctg <53100513+carlarctg@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:33:26 -0300 Subject: [PATCH 51/69] TV helmet no longer has fov or makes you flash sensitive (#84815) ## About The Pull Request TV helmet no longer has gas mask FOV, nor does it give you flash sensitivity. Since those are gone, removed pepper proof from it as well. ## Why It's Good For The Game I don't really know why the tv helmet specifically was cucked like this. Out of all the costume helmets, none do this. I don't think it adds much? It just makes it a pain in the ass to use? I want to be a tv helmet guy and see 360 degrees and weld in peace, I don't think that's too much to ask. For fairness sake it also doesn't have pepperproof anymore. You can replicate all its effects by just wearing a gas mask underneath. ## Changelog :cl: qol: TV helmet no longer has gas mask FOV, nor does it give you flash sensitivity. qol: Since those are gone, removed pepper proof from it as well. /:cl: --- .../objects/effects/spawners/random/clothing.dm | 2 +- code/modules/clothing/head/costume.dm | 13 +------------ 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/code/game/objects/effects/spawners/random/clothing.dm b/code/game/objects/effects/spawners/random/clothing.dm index e3193b05836d8..119697c53171b 100644 --- a/code/game/objects/effects/spawners/random/clothing.dm +++ b/code/game/objects/effects/spawners/random/clothing.dm @@ -211,7 +211,7 @@ /obj/item/clothing/head/costume/lobsterhat, /obj/item/clothing/head/costume/cardborg, /obj/item/clothing/head/costume/football_helmet, - /obj/item/clothing/head/costume/tv_head/fov_less, + /obj/item/clothing/head/costume/tv_head, /obj/item/clothing/head/costume/tmc, /obj/item/clothing/head/costume/deckers, /obj/item/clothing/head/costume/yuri, diff --git a/code/modules/clothing/head/costume.dm b/code/modules/clothing/head/costume.dm index ec5ee81741fcc..2768656d5e6f9 100644 --- a/code/modules/clothing/head/costume.dm +++ b/code/modules/clothing/head/costume.dm @@ -156,10 +156,8 @@ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' //Grandfathered in from the wallframe for status displays. righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' clothing_flags = SNUG_FIT - flash_protect = FLASH_PROTECTION_SENSITIVE - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - var/has_fov = TRUE /datum/armor/costume_bronze melee = 5 @@ -169,15 +167,6 @@ fire = 20 acid = 20 -/obj/item/clothing/head/costume/tv_head/Initialize(mapload) - . = ..() - if(has_fov) - AddComponent(/datum/component/clothing_fov_visor, FOV_90_DEGREES) - -/obj/item/clothing/head/costume/tv_head/fov_less - desc = "A mysterious headgear made from the hollowed out remains of a status display. How very retro-retro-futuristic of you. It's very easy to see out of this one." - has_fov = FALSE - /obj/item/clothing/head/costume/irs name = "internal revenue service cap" desc = "Even in space, you can't avoid the tax collectors." From 8e42f928449c5cb18aaac0cb79c54466e0ccc578 Mon Sep 17 00:00:00 2001 From: Ical <86125936+Ical92@users.noreply.github.com> Date: Wed, 10 Jul 2024 20:35:56 -0400 Subject: [PATCH 52/69] Redesigns Tram's Tool Storage + Fixes disposals (#84802) ## About The Pull Request ![image](https://github.com/tgstation/tgstation/assets/86125936/4129fc5b-f56c-4a06-bae1-898a3d9fce41) > Redesigns Tramstation's Primary Tool Storage, also giving it proper disposals. ## Why It's Good For The Game Now the disposal bin in the Primary Tool Storage will be useable, and looking nicer might encourage people to visit the room instead of the Auxiliary Storage, which is closer to the rest of the station. ## Changelog :cl: fix: gave tram's primary tool storage functional disposals /:cl: --- _maps/map_files/tramstation/tramstation.dmm | 455 ++++++++++++-------- 1 file changed, 276 insertions(+), 179 deletions(-) diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index a7a40a07edf96..7df8f7ebb467b 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -664,8 +664,9 @@ /turf/open/floor/iron/stairs/medium, /area/station/escapepodbay) "act" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 +/obj/structure/railing, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 }, /turf/open/floor/iron, /area/station/commons/storage/primary) @@ -740,21 +741,13 @@ /turf/open/floor/iron, /area/station/hallway/secondary/service) "acF" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, /obj/machinery/door/airlock/public/glass{ name = "Primary Tool Storage" }, -/obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/commons/storage/primary) "acG" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ +/obj/effect/turf_decal/trimline/yellow/line{ dir = 8 }, /turf/open/floor/iron, @@ -1163,9 +1156,18 @@ /turf/open/floor/iron, /area/station/maintenance/tram/right) "adE" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner, -/obj/structure/cable, -/turf/open/floor/iron, +/obj/structure/table, +/obj/item/assembly/igniter{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/assembly/igniter{ + pixel_y = 4 + }, +/obj/item/clothing/gloves/color/fyellow{ + pixel_x = 5 + }, +/turf/open/floor/iron/smooth, /area/station/commons/storage/primary) "adF" = ( /obj/effect/turf_decal/siding/thinplating/dark{ @@ -1248,11 +1250,13 @@ /turf/open/floor/iron/dark, /area/station/escapepodbay) "adU" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/trimline/neutral/filled/line{ +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 }, -/obj/structure/cable, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, /turf/open/floor/iron, /area/station/commons/storage/primary) "adV" = ( @@ -5049,6 +5053,12 @@ }, /turf/open/openspace, /area/station/hallway/primary/tram/center) +"aKG" = ( +/obj/structure/railing, +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/station/commons/storage/primary) "aKL" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/machinery/door/firedoor/border_only, @@ -6060,18 +6070,16 @@ /turf/open/floor/iron/white, /area/station/science/lower) "aWJ" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, /obj/machinery/door/airlock/public/glass{ name = "Primary Tool Storage" }, -/obj/machinery/door/firedoor, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/navigate_destination/tools, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, /turf/open/floor/iron, /area/station/commons/storage/primary) "aWL" = ( @@ -7500,17 +7508,6 @@ /obj/effect/turf_decal/tile/dark_green/fourcorners, /turf/open/floor/iron/white, /area/station/science/genetics) -"bDH" = ( -/obj/structure/table, -/obj/item/storage/toolbox/electrical{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "bEo" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 9 @@ -8150,6 +8147,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/escape) +"bNm" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "bNp" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -8210,11 +8215,11 @@ /turf/open/floor/wood, /area/station/command/meeting_room) "bNG" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/trimline/neutral/filled/line{ +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, +/obj/machinery/vending/modularpc, +/obj/structure/table, /turf/open/floor/iron, /area/station/commons/storage/primary) "bNI" = ( @@ -9735,10 +9740,14 @@ /turf/open/floor/wood, /area/station/service/library) "coV" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, /obj/structure/table, /obj/machinery/cell_charger, +/obj/item/screwdriver{ + pixel_x = 2; + pixel_y = 11 + }, /obj/item/stock_parts/power_store/cell/high, -/obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, /area/station/commons/storage/primary) "cpl" = ( @@ -11557,10 +11566,10 @@ /turf/closed/wall, /area/station/hallway/primary/tram/center) "cTl" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/trimline/neutral/filled/line{ +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 }, +/obj/machinery/vending/assist, /turf/open/floor/iron, /area/station/commons/storage/primary) "cTw" = ( @@ -13187,6 +13196,20 @@ /obj/structure/flora/bush/leavy/style_random, /turf/open/floor/grass, /area/station/medical/virology) +"dyp" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "dys" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -14494,6 +14517,9 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/iron, /area/station/hallway/secondary/service) "dUK" = ( @@ -14793,17 +14819,19 @@ /turf/open/floor/iron/dark, /area/station/command/teleporter) "eaZ" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 +/obj/structure/table, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/wrench{ + pixel_x = 3; + pixel_y = 4 }, -/obj/item/t_scanner, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 5 +/obj/item/assembly/prox_sensor{ + pixel_x = 10; + pixel_y = 11 }, -/obj/structure/sign/clock/directional/east, -/turf/open/floor/iron, +/turf/open/floor/iron/smooth, /area/station/commons/storage/primary) "ebq" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -16392,15 +16420,12 @@ /turf/open/openspace, /area/station/asteroid) "eHj" = ( -/obj/machinery/vending/tool, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/trimline/neutral/filled/line{ +/obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 }, -/obj/machinery/camera/directional/east{ - c_tag = "Civilian - Primary Tool Storage" - }, -/turf/open/floor/iron, +/obj/structure/sign/clock/directional/east, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/smooth, /area/station/commons/storage/primary) "eHr" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, @@ -19651,28 +19676,11 @@ /turf/closed/wall/r_wall, /area/station/science/xenobiology) "fUP" = ( -/obj/structure/table, -/obj/item/stack/cable_coil{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/screwdriver{ - pixel_y = 16 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, /obj/machinery/firealarm/directional/west{ - pixel_y = -3 - }, -/obj/item/storage/belt/utility, -/obj/machinery/light_switch/directional/west{ - pixel_x = -23; - pixel_y = 8 + pixel_y = -5 }, /turf/open/floor/iron, /area/station/commons/storage/primary) @@ -20207,6 +20215,15 @@ "geG" = ( /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"geJ" = ( +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/commons/storage/primary) "geX" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -20338,6 +20355,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/secondary/service) "ghs" = ( @@ -20660,16 +20678,19 @@ /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) "gms" = ( -/obj/structure/rack, -/obj/item/weldingtool, -/obj/item/crowbar, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 6 +/obj/structure/table, +/obj/item/wirecutters{ + pixel_y = 7; + pixel_x = -4 }, -/turf/open/floor/iron, +/obj/item/stack/cable_coil{ + pixel_x = -2; + pixel_y = 1 + }, +/obj/item/stack/cable_coil{ + pixel_y = 4 + }, +/turf/open/floor/iron/smooth, /area/station/commons/storage/primary) "gmu" = ( /obj/effect/decal/cleanable/dirt, @@ -22268,6 +22289,9 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/secondary/service) "gRQ" = ( @@ -22721,6 +22745,19 @@ }, /turf/open/floor/iron, /area/station/commons/storage/art) +"hbk" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "hbQ" = ( /obj/machinery/camera/directional/north{ c_tag = "Civilian - Holodeck Controls" @@ -28499,6 +28536,15 @@ }, /turf/open/space/basic, /area/space/nearstation) +"jjM" = ( +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 9 + }, +/turf/open/floor/iron/smooth, +/area/station/commons/storage/primary) "jjP" = ( /obj/effect/spawner/random/structure/billboard/nanotrasen, /obj/effect/turf_decal/sand/plating, @@ -28843,13 +28889,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"jpt" = ( -/obj/machinery/duct, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "jpB" = ( /obj/structure/sign/clock/directional/north, /obj/structure/cable, @@ -30838,12 +30877,18 @@ /turf/open/floor/wood, /area/station/commons/dorms) "jYJ" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/trimline/neutral/filled/line{ +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, -/obj/machinery/light/directional/north, +/obj/structure/table, +/obj/item/analyzer{ + pixel_y = 4; + pixel_x = 2 + }, +/obj/item/t_scanner{ + pixel_x = -6; + pixel_y = 6 + }, /turf/open/floor/iron, /area/station/commons/storage/primary) "jYO" = ( @@ -32481,6 +32526,13 @@ /turf/open/floor/iron, /area/station/hallway/secondary/entry) "kzx" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/storage/primary) "kzC" = ( @@ -39250,10 +39302,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/service) "mOB" = ( -/obj/structure/table, -/obj/item/analyzer, -/obj/item/wrench, -/obj/effect/turf_decal/trimline/neutral/filled/line{ +/obj/effect/turf_decal/trimline/yellow/filled/shrink_ccw{ dir = 8 }, /turf/open/floor/iron, @@ -43797,8 +43846,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 10 +/obj/structure/disposalpipe/junction{ + dir = 2 }, /turf/open/floor/iron, /area/station/hallway/secondary/service) @@ -44518,11 +44567,10 @@ /turf/open/floor/plating/elevatorshaft, /area/station/maintenance/tram/mid) "oOb" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, +/obj/structure/railing, +/obj/effect/turf_decal/delivery, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/iron/smooth, /area/station/commons/storage/primary) "oOd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44741,9 +44789,18 @@ /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) "oSl" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, /turf/open/floor/iron, /area/station/commons/storage/primary) "oSu" = ( @@ -46098,8 +46155,9 @@ /turf/open/floor/iron/white, /area/station/science/explab) "prW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, +/turf/open/floor/iron/stairs{ + dir = 8 + }, /area/station/commons/storage/primary) "psa" = ( /obj/structure/tank_holder/anesthetic, @@ -46347,6 +46405,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"pvL" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "pvU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -46815,13 +46878,15 @@ /turf/open/floor/plating, /area/station/cargo/miningdock) "pCM" = ( -/obj/structure/table, -/obj/item/crowbar, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/assembly/prox_sensor{ - pixel_x = -8; - pixel_y = 4 +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 }, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/storage/primary) "pCU" = ( @@ -46945,12 +47010,19 @@ /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) "pFw" = ( -/obj/machinery/vending/modularpc, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 +/obj/machinery/airalarm/directional/east, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 3; + pixel_y = 17 }, -/turf/open/floor/iron, +/obj/item/storage/toolbox/electrical{ + pixel_y = 10; + pixel_x = 4 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 5 + }, +/turf/open/floor/iron/smooth, /area/station/commons/storage/primary) "pFE" = ( /obj/structure/table, @@ -47528,10 +47600,15 @@ /turf/open/floor/plating, /area/station/maintenance/tram/mid) "pOQ" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/obj/structure/cable, /turf/open/floor/iron, /area/station/commons/storage/primary) "pOZ" = ( @@ -48377,7 +48454,7 @@ /turf/open/floor/iron/dark, /area/station/commons/lounge) "qeD" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ +/obj/effect/turf_decal/trimline/yellow/filled/shrink_cw{ dir = 8 }, /turf/open/floor/iron, @@ -49410,15 +49487,10 @@ /turf/open/floor/iron, /area/station/security/office) "qxU" = ( -/obj/structure/table, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/wirecutters, -/obj/effect/turf_decal/trimline/neutral/filled/line{ +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 }, +/obj/machinery/vending/tool, /turf/open/floor/iron, /area/station/commons/storage/primary) "qxZ" = ( @@ -49583,6 +49655,12 @@ /obj/machinery/door/window/right/directional/east, /turf/open/floor/iron, /area/station/security/brig) +"qAC" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 10 + }, +/turf/open/floor/iron/smooth, +/area/station/commons/storage/primary) "qBg" = ( /turf/open/floor/engine/plasma, /area/station/engineering/atmos) @@ -51649,10 +51727,13 @@ /turf/open/floor/iron/dark, /area/station/command/gateway) "rkq" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 +/obj/structure/table, +/obj/item/flashlight{ + pixel_x = 9; + pixel_y = 13 }, -/turf/open/floor/iron, +/obj/item/storage/belt/utility, +/turf/open/floor/iron/smooth, /area/station/commons/storage/primary) "rks" = ( /obj/effect/spawner/structure/window, @@ -52134,6 +52215,14 @@ "run" = ( /turf/closed/wall/r_wall, /area/station/security/medical) +"ruo" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "rup" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -55844,6 +55933,16 @@ /obj/structure/railing/corner, /turf/open/space/openspace, /area/station/solars/starboard/fore) +"sLp" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "sLz" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -56528,17 +56627,15 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "sXV" = ( -/obj/structure/table, -/obj/item/assembly/igniter, -/obj/item/assembly/igniter{ - pixel_x = -8; - pixel_y = -4 - }, -/obj/item/screwdriver{ - pixel_y = 16 +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/structure/rack, +/obj/machinery/light_switch/directional/south{ + pixel_x = 13 }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/light/directional/south, +/obj/item/crowbar, +/obj/item/weldingtool, /turf/open/floor/iron, /area/station/commons/storage/primary) "sXW" = ( @@ -61149,15 +61246,15 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "uAC" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ +/obj/effect/turf_decal/trimline/yellow/line{ dir = 8 }, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, /turf/open/floor/iron, /area/station/commons/storage/primary) "uAF" = ( @@ -61433,6 +61530,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/secondary/service) "uEw" = ( @@ -64538,7 +64636,9 @@ /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) "vFp" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 5 }, /turf/open/floor/iron, @@ -67162,6 +67262,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/secondary/service) "wEu" = ( @@ -68056,15 +68157,11 @@ /turf/open/floor/engine, /area/station/engineering/supermatter/room) "wXB" = ( -/obj/machinery/vending/assist, -/obj/machinery/requests_console/directional/east{ - name = "Tool Department Requests Console"; - department = "Tool Storage" - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 6 }, -/turf/open/floor/iron, +/turf/open/floor/iron/smooth, /area/station/commons/storage/primary) "wXC" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -105007,13 +105104,13 @@ pGy dUH uDT wEl -jpt -jpt -jpt -jpt -jpt +aHR +aHR +aHR +aHR +aHR ghp -jpt +aHR ovY aHR sJQ @@ -105770,9 +105867,9 @@ aaa aaa sNs cTl -qeD +mOB acG -bDH +qeD fUP mOB uAC @@ -106027,13 +106124,13 @@ aaa aaa sNs bNG -kzx -kzx -kzx +eJZ +bNm +ruo pCM kzx oSl -kzx +ive coV alg aes @@ -106284,13 +106381,13 @@ aaa aaa sNs jYJ -eJZ -prW -prW +pvL +sLp +aKG oOb prW -oSl -ive +dyp +hbk sXV alg bug @@ -106543,9 +106640,9 @@ sNs vFp act rkq -kzx -kzx -kzx +jjM +geJ +qAC adE pOQ adU From 6e5350a3460220df0a9e8d21c939a1da4b014ae4 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:36:31 +1200 Subject: [PATCH 53/69] Automatic changelog for PR #84815 [ci skip] --- html/changelogs/AutoChangeLog-pr-84815.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84815.yml diff --git a/html/changelogs/AutoChangeLog-pr-84815.yml b/html/changelogs/AutoChangeLog-pr-84815.yml new file mode 100644 index 0000000000000..a2f18b66072ac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84815.yml @@ -0,0 +1,5 @@ +author: "carlarctg" +delete-after: True +changes: + - qol: "TV helmet no longer has gas mask FOV, nor does it give you flash sensitivity." + - qol: "Since those are gone, removed pepper proof from it as well." \ No newline at end of file From 852e02721777e4038e16d690a3608cd063bfd690 Mon Sep 17 00:00:00 2001 From: Jolly <70232195+Jolly-66@users.noreply.github.com> Date: Wed, 10 Jul 2024 20:36:54 -0400 Subject: [PATCH 54/69] [Birdshot] Small mapping fixes (#84808) ## About The Pull Request Title. ## Why It's Good For The Game This PR fixes some areas lacking an APC and air alarms. Ever so minor. ## Changelog :cl: Jolly fix: [Birdshot] The Ordnance freezer chamber is now linked to an APC, much like the burn chamber. fix: [Birdshot] The Janitors quarters no longer uses `/area/station/commons`, instead, it uses the janitors regular area. fix: [Birdshot] The entertainment center now has an APC. fix: [Birdshot] A handful of smaller areas have received air alarms. /:cl: --- _maps/map_files/Birdshot/birdshot.dmm | 95 ++++++++++++++++++++------- 1 file changed, 70 insertions(+), 25 deletions(-) diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index a542ef5177488..a4a6e8345d61a 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -4478,6 +4478,7 @@ }, /obj/machinery/light_switch/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/herringbone, /area/station/commons/dorms) "bJK" = ( @@ -4927,6 +4928,7 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) "bUr" = ( @@ -9782,6 +9784,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, +/obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/commons/fitness/recreation/entertainment) "dEq" = ( @@ -17153,7 +17156,7 @@ /area/station/engineering/main) "gla" = ( /turf/open/floor/iron/grimy, -/area/station/commons) +/area/station/service/janitor) "gls" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18695,6 +18698,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/herringbone, /area/station/commons/dorms) "gLs" = ( @@ -20692,7 +20696,7 @@ pixel_y = 1 }, /turf/open/floor/iron/small, -/area/station/commons) +/area/station/service/janitor) "hqm" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 6 @@ -26455,6 +26459,7 @@ /obj/item/radio/intercom/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/start/hangover, +/obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) "jfs" = ( @@ -29066,7 +29071,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/grimy, -/area/station/commons) +/area/station/service/janitor) "jVe" = ( /obj/structure/cable, /turf/open/floor/iron/smooth, @@ -29264,6 +29269,7 @@ /area/station/security) "jXJ" = ( /obj/structure/disposalpipe/segment, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white/side, /area/station/hallway/primary/central/aft) "jXQ" = ( @@ -30714,7 +30720,7 @@ }, /obj/machinery/light/small/directional/west, /turf/open/floor/iron/small, -/area/station/commons) +/area/station/service/janitor) "ktT" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -30755,6 +30761,7 @@ dir = 9 }, /obj/effect/turf_decal/tile/neutral, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "kuq" = ( @@ -36994,7 +37001,7 @@ /obj/item/bedsheet/purple, /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/grimy, -/area/station/commons) +/area/station/service/janitor) "mqz" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -38997,6 +39004,7 @@ "mZj" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/portable_atmospherics/canister, +/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/ordnance) "mZA" = ( @@ -39187,6 +39195,11 @@ /obj/structure/tank_dispenser/oxygen, /turf/open/floor/iron, /area/station/security/tram) +"ndO" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "ndY" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 8 @@ -40759,6 +40772,14 @@ /obj/machinery/portable_atmospherics/pump, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"nGc" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/obj/machinery/power/apc/auto_name/directional/west{ + areastring = "/area/station/science/ordnance/freezerchamber" + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "nGe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -41082,6 +41103,7 @@ dir = 1 }, /obj/machinery/portable_atmospherics/canister, +/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/ordnance) "nLH" = ( @@ -44972,7 +44994,7 @@ /obj/machinery/vending/wardrobe/jani_wardrobe, /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/small, -/area/station/commons) +/area/station/service/janitor) "pcv" = ( /obj/machinery/door/airlock/command{ name = "Head of Security's Bedroom" @@ -46152,6 +46174,7 @@ /area/station/commons/fitness/recreation/entertainment) "pvB" = ( /obj/machinery/camera/autoname/directional/south, +/obj/structure/cable, /turf/open/floor/iron/herringbone, /area/station/commons/dorms) "pvC" = ( @@ -48140,6 +48163,7 @@ dir = 10 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/herringbone, /area/station/commons/dorms) "qbj" = ( @@ -48251,6 +48275,7 @@ "qcC" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/structure/disposalpipe/segment, +/obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) "qcF" = ( @@ -52827,6 +52852,7 @@ icon_state = "L9"; pixel_y = -15 }, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "rzJ" = ( @@ -52958,7 +52984,7 @@ /turf/open/floor/iron/textured_half{ dir = 8 }, -/area/station/commons) +/area/station/service/janitor) "rBy" = ( /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, @@ -55529,6 +55555,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) "sso" = ( @@ -61908,7 +61935,7 @@ /obj/machinery/light/small/directional/east, /obj/effect/landmark/start/janitor, /turf/open/floor/iron/grimy, -/area/station/commons) +/area/station/service/janitor) "urd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62556,6 +62583,10 @@ }, /turf/open/space/basic, /area/station/engineering/atmos/space_catwalk) +"uCc" = ( +/obj/machinery/airalarm/directional/south, +/turf/open/floor/wood, +/area/station/cargo/boutique) "uCe" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -66134,6 +66165,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"vCP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/recreation) "vCQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -66858,6 +66896,7 @@ "vNn" = ( /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) "vNq" = ( @@ -66974,7 +67013,7 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron/grimy, -/area/station/commons) +/area/station/service/janitor) "vPw" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -69618,6 +69657,15 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/hallway/secondary/dock) +"wGt" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "wGu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70977,9 +71025,6 @@ /obj/effect/decal/cleanable/ash/large, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"wZl" = ( -/turf/closed/wall, -/area/station/commons) "wZp" = ( /obj/effect/turf_decal/arrows{ dir = 8 @@ -71839,7 +71884,7 @@ /obj/item/clothing/shoes/galoshes, /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/small, -/area/station/commons) +/area/station/service/janitor) "xkK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -93175,7 +93220,7 @@ qBz qTR kym rHD -qVR +uCc wCR jRz qzP @@ -109866,7 +109911,7 @@ nju iGt vtL sBP -wZl +sRL pcm gla vPt @@ -110123,7 +110168,7 @@ wNd nFW tDB unK -wZl +sRL xkv ura jUU @@ -110380,12 +110425,12 @@ rqw rqw qow rqw -wZl -wZl -wZl +sRL +sRL +sRL rBr -wZl -wZl +sRL +sRL eeJ lxp syA @@ -111687,7 +111732,7 @@ pCv unc sWQ raZ -qUa +vCP qUa qUa qUa @@ -111926,7 +111971,7 @@ ntZ jpp jpp dxw -jpp +ndO jpp jpp jpp @@ -112183,7 +112228,7 @@ pzd tpG pvk pzd -iCj +wGt qMa uhy iCj @@ -124812,7 +124857,7 @@ xFI gfu ckt ckt -ckt +nGc lwu lkV whF From 4d3c9b3ed16a0b3116b6c8efa37f5b98631004cf Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:37:45 +1200 Subject: [PATCH 55/69] Automatic changelog for PR #84802 [ci skip] --- html/changelogs/AutoChangeLog-pr-84802.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84802.yml diff --git a/html/changelogs/AutoChangeLog-pr-84802.yml b/html/changelogs/AutoChangeLog-pr-84802.yml new file mode 100644 index 0000000000000..c62dfe34c447b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84802.yml @@ -0,0 +1,4 @@ +author: "Ical92" +delete-after: True +changes: + - bugfix: "gave tram's primary tool storage functional disposals" \ No newline at end of file From d0708831ece6e649ac0172b7e53c779eac0b002b Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:38:04 +1200 Subject: [PATCH 56/69] Automatic changelog for PR #84808 [ci skip] --- html/changelogs/AutoChangeLog-pr-84808.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84808.yml diff --git a/html/changelogs/AutoChangeLog-pr-84808.yml b/html/changelogs/AutoChangeLog-pr-84808.yml new file mode 100644 index 0000000000000..1c5823c539670 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84808.yml @@ -0,0 +1,7 @@ +author: "Jolly" +delete-after: True +changes: + - bugfix: "[Birdshot] The Ordnance freezer chamber is now linked to an APC, much like the burn chamber." + - bugfix: "[Birdshot] The Janitors quarters no longer uses `/area/station/commons`, instead, it uses the janitors regular area." + - bugfix: "[Birdshot] The entertainment center now has an APC." + - bugfix: "[Birdshot] A handful of smaller areas have received air alarms." \ No newline at end of file From 43e62163febea15d41c7279843ecb568935b89ed Mon Sep 17 00:00:00 2001 From: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:08:25 -0400 Subject: [PATCH 57/69] Adds a Contraband trait, and implements contraband as a mechanic to security bounties. (#84003) ## About The Pull Request This PR does a few things but centrally it's all centered around mechanically enforcing what items are and are-not considered contraband in-game. ### What does something being contraband MEAN? Contraband items are visually indistinguishable from non-contraband. If an item is Contraband, it can only be detected in two ways: * After being scanned by an N-Spect scanner, which is a standard item security item, assuming it still has a charge to do so. * Via a scanner gate, which can now be upgraded with an N-spect scanner to allow for it to scan a person and all their contents for contraband. ### What items ARE contraband? Contraband items are intended to be determined both logically and through other relevant examine text. However, here's the short list of items that are considered contraband, reserving the right to expand the list.
In hindsight it's kind of a long list. * Items that have "contraband" or "illegal" in the name or description. * Items that allow for the player to obtain other illegal items, that are NOT particularly stealthy. * This means that a syndicate uplink is NOT considered contraband, as they're typically hidden on your person as something else. * Stealth items under the syndicate uplink, the revolutionary flash, and some mapped in dangerous items that can come from both syndicate and company-aligned resources are not considered dangerous. * Items that are purchased from cargo after emagging or switching to extended cargo range. * Items purchased FROM syndicate uplinks, the wizard knowledge scroll, or other antagonist shops. * Cursed artifacts/tools magically produced by cultists or heretics. * Items purchased from the blackmarket. * Items purchased from the contraband section of vending machines. * Some drugs and overtly dangerous or criminal byproducts.
### How does this interact with the round? Well, primarily, this is an aid for in-game enforcement of space law. Based on the length of the above list, we have a LONG, LONG list of items in-game that are technically considered, in one way or another, illegal to have on the station, and yet without either metaknowledge of what those items are, or how they're used, security officers lack some of the certainty of how to deal with these kinds of encounters. Additionally to the knowledge aspect of this trait, security officers may now receive a new civilian bounty to collect items that are considered contraband, also giving them an incentive to look for and confiscate contraband that's been found across the station while upholding space law. ### Other minor changes that I rolled into this Security has a bounty for 3 different rechargers, and considering access limitations, most security players aren't going to make this exchange, so I've lowered the required amount down to 1. Adjusted the N-spect scanner's description to match it's new functionality. The Civilian bounty TGUI now has an additional 1 point of padding to make it feel less cramped. https://github.com/tgstation/tgstation/assets/41715314/c3cd4752-b03a-4e0b-959e-1252fcc2369d **Updated as of 6/19/2024:** Additionally, some storage items will block the presence of contraband when going through a contraband aligned scanning gate. These items include the infiltrator modsuit core, storage implant, void cloak, the aptly named smuggler's satchel, and the chameleon kit's backpack. **Updated as of 6/23/2024:** N-spect scanner now has contextual screentips. **Updated as of 6/29/2024:** Scanner gates are now available in all lathes that have a feature specific to how scanner gates function. So, includes cargo (contraband), security (weapons), and medbay (diseases). ## Why It's Good For The Game Originally, this started out as a way to be able to provide more in-character and in-flavor bounties for security officers, because they suck! Most security bounties as they exist right now do the worst possible things from all respective bounties: * They detract away from a job's actual responsibilities as opposed to working with them. * They're best completed while sitting next to your lathe and running items back to the bounty pad. * They exist with such esoteric rarity of high quantity of items that it's miserable to fulfil. As a result, I started work on this as a framework to allow security officers to be further incentivized to collect contraband across the station, either as a result of the gamemode or just through routine patrols across the station. Implementing it as a learning tool for security as well just happened to work out as an additional bonus, and having a function in-game allowing newer or less experienced players to know if an item is considered dangerous or conspicuous also works as a particularly good way to provide information where a player may not know what they're up against. If nothing else, this might be interesting to try, and if not, I'll just snip out the QOL changes from it and we'll see how it goes. Going forward, I am a bit hesitant about the contraband scanner gate mode, and as such, will try working with the admin team to determine if that's a good feature to keep around for game health, while hoping to give it a chance in the fullness of time. ## Changelog :cl: add: Items spawned via traitor uplinks or are known illegal contraband on the station can now be scanned and identified as such by the N-spect scanners in security. These only applies to overt traitor or antagonist items, and "stealth" items will not be seen as such. add: Scanner gates can now be upgraded by using an N-spect scanner on it to unlock "contraband scanning" mode. add: Security officers can now be offered a bounty to turn in pieces of contraband. add: Some stealthy storage items like storage implants, smuggler's satchels, void cloaks, the infiltrator modsuit, and the chameleon backpack will block the presence of contraband on your person when placed inside. qol: N-spect scanner contextual screentips. balance: Recharger security bounties ask for a quantity of 1, down from 3. qol: security, cargo, and medbay have access to scanner gate boards. /:cl: --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> --- code/__DEFINES/antagonists.dm | 5 ++ code/__DEFINES/blackmarket.dm | 1 + code/__DEFINES/devices.dm | 1 + code/__DEFINES/traits/declarations.dm | 7 ++- code/__HELPERS/atoms.dm | 12 ++++ code/_globalvars/traits/_traits.dm | 6 +- code/controllers/subsystem/blackmarket.dm | 4 +- .../{scan_gate.dm => scanner_gate.dm} | 60 ++++++++++++++++++- .../objects/effects/posters/contraband.dm | 4 ++ .../effects/spawners/random/contraband.dm | 6 ++ code/game/objects/items.dm | 14 +++++ code/game/objects/items/drug_items.dm | 9 +++ .../objects/items/implants/implant_storage.dm | 2 +- code/game/objects/items/inspector.dm | 55 ++++++++++++++++- code/game/objects/items/robot/ai_upgrades.dm | 7 +++ .../objects/items/robot/robot_upgrades.dm | 4 ++ code/game/objects/items/stickers.dm | 4 ++ code/game/objects/items/storage/backpack.dm | 1 + code/modules/antagonists/cult/cult_items.dm | 5 ++ .../antagonists/cult/cult_structures.dm | 1 + .../antagonists/cult/datums/cultist.dm | 3 +- .../antagonists/heretic/heretic_knowledge.dm | 4 +- .../heretic/items/heretic_armor.dm | 1 + .../equipment/spellbook_entries/_entry.dm | 5 ++ code/modules/cargo/bounties/security.dm | 16 ++++- code/modules/cargo/markets/_market.dm | 15 ++++- code/modules/cargo/markets/market_item.dm | 29 +++++++-- code/modules/cargo/markets/market_telepad.dm | 1 + code/modules/cargo/markets/market_uplink.dm | 3 + code/modules/cargo/order.dm | 3 + code/modules/cargo/orderconsole.dm | 1 + code/modules/cargo/packs/_packs.dm | 1 + .../chameleon/generic_chameleon_clothing.dm | 4 ++ code/modules/hydroponics/grown/kronkus.dm | 8 +++ code/modules/mod/mod_types.dm | 3 + .../reagents/reagent_containers/syringes.dm | 4 ++ .../research/designs/machine_designs.dm | 2 +- .../research/techweb/nodes/syndicate_nodes.dm | 2 +- code/modules/surgery/organs/autosurgeon.dm | 4 ++ code/modules/uplink/uplink_items.dm | 18 ++++-- .../modules/uplink/uplink_items/ammunition.dm | 6 +- code/modules/uplink/uplink_items/badass.dm | 8 +-- code/modules/uplink/uplink_items/clownops.dm | 6 +- code/modules/uplink/uplink_items/dangerous.dm | 2 +- .../uplink/uplink_items/device_tools.dm | 6 +- code/modules/uplink/uplink_items/job.dm | 8 +-- code/modules/uplink/uplink_items/nukeops.dm | 2 +- .../modules/uplink/uplink_items/spy_unique.dm | 12 ++++ code/modules/uplink/uplink_items/stealthy.dm | 1 + .../uplink/uplink_items/stealthy_tools.dm | 3 +- code/modules/vending/_vending.dm | 2 + tgstation.dme | 2 +- .../tgui/interfaces/Cargo/CargoCatalog.tsx | 5 ++ tgui/packages/tgui/interfaces/Cargo/types.ts | 1 + .../tgui/interfaces/CivCargoHoldTerminal.jsx | 1 + tgui/packages/tgui/interfaces/ScannerGate.jsx | 27 ++++++++- 56 files changed, 380 insertions(+), 47 deletions(-) rename code/game/machinery/{scan_gate.dm => scanner_gate.dm} (80%) diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 9a943474de6f9..f94871d10ccfa 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -314,6 +314,11 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list( #define UPLINK_SHARED_STOCK_KITS "uplink_shared_stock_kits" #define UPLINK_SHARED_STOCK_SURPLUS "uplink_shared_stock_surplus" +/// Does this item provide illegal tech? +#define SYNDIE_ILLEGAL_TECH (1 << 0) +/// Does this item go off when scanned by a contraband scanner? +#define SYNDIE_TRIPS_CONTRABAND (1 << 1) + // Used for traitor objectives /// If the objective hasn't been taken yet #define OBJECTIVE_STATE_INACTIVE 1 diff --git a/code/__DEFINES/blackmarket.dm b/code/__DEFINES/blackmarket.dm index c3b8ad0bf4622..f0a19ad056d9a 100644 --- a/code/__DEFINES/blackmarket.dm +++ b/code/__DEFINES/blackmarket.dm @@ -9,3 +9,4 @@ #define SHIPPING_METHOD_LAUNCH "Launch" // Sends a supply pod to the buyer's location, showy. #define SHIPPING_METHOD_SUPPLYPOD "Supply Pod" + diff --git a/code/__DEFINES/devices.dm b/code/__DEFINES/devices.dm index afd41570b5b27..7368d8d045719 100644 --- a/code/__DEFINES/devices.dm +++ b/code/__DEFINES/devices.dm @@ -10,6 +10,7 @@ #define CLOWN_INSPECTOR_PRINT_SOUND_MODE_LAST 4 #define INSPECTOR_ENERGY_USAGE_HONK (0.015 * STANDARD_CELL_CHARGE) #define INSPECTOR_ENERGY_USAGE_NORMAL (0.005 * STANDARD_CELL_CHARGE) +#define INSPECTOR_ENERGY_USAGE_LOW (0.001 * STANDARD_CELL_CHARGE) #define INSPECTOR_TIME_MODE_SLOW 1 #define INSPECTOR_TIME_MODE_FAST 2 #define INSPECTOR_TIME_MODE_HONK 3 diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 981ad0e6de865..1c03ecac2ee16 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -767,6 +767,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_DANGEROUS_OBJECT "dangerous_object" /// determines whether or not objects are haunted and teleport/attack randomly #define TRAIT_HAUNTED "haunted" +/// An item that, if it has contents, will ignore it's contents when scanning for contraband. +#define TRAIT_CONTRABAND_BLOCKER "contraband_blocker" //quirk traits #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" @@ -1160,7 +1162,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait which means whatever has this is dancing by a dance machine #define TRAIT_DISCO_DANCER "disco_dancer" -/// That which allows mobs to instantly break down boulders. +/// Trait which allows mobs to instantly break down boulders. #define TRAIT_INSTANTLY_PROCESSES_BOULDERS "instantly_processes_boulders" /// Trait applied to objects and mobs that can attack a boulder and break it down. (See /obj/item/boulder/manual_process()) @@ -1174,6 +1176,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Does this item bypass ranged armor checks? #define TRAIT_BYPASS_RANGED_ARMOR "bypass_ranged_armor" +/// Trait which means that this item is considered illegal contraband, and valid for the contraband bounty or when scanned by an nspect scanner. +#define TRAIT_CONTRABAND "illegal_contraband" + /// Traits given by settler, each with their own specific effects for cases where someone would have that trait, but not the other settler effects #define TRAIT_EXPERT_FISHER "expert_fisher" // fishing is easier diff --git a/code/__HELPERS/atoms.dm b/code/__HELPERS/atoms.dm index 406ea75143c66..7106ec81be1ba 100644 --- a/code/__HELPERS/atoms.dm +++ b/code/__HELPERS/atoms.dm @@ -33,6 +33,18 @@ processing += checked_atom.contents . += checked_atom +///Returns the src and all recursive contents, but skipping going any deeper if an atom has a specific trait. +/atom/proc/get_all_contents_skipping_traits(skipped_trait) + . = list(src) + if(!skipped_trait) + CRASH("get_all_contents_skipping_traits called without a skipped_trait") + var/i = 0 + while(i < length(.)) + var/atom/checked_atom = .[++i] + if(HAS_TRAIT(checked_atom, skipped_trait)) + continue + . += checked_atom.contents + ///Returns a list of all locations (except the area) the movable is within. /proc/get_nested_locs(atom/movable/atom_on_location, include_turf = FALSE) . = list() diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index e012ea343290c..592ceda2eac97 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -112,6 +112,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( ), /obj = list( "TRAIT_WALLMOUNTED" = TRAIT_WALLMOUNTED, + "TRAIT_CONTRABAND" = TRAIT_CONTRABAND, ), /mob = list( "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING, @@ -525,9 +526,11 @@ GLOBAL_LIST_INIT(traits_by_type, list( ), /obj/item = list( "TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING, + "TRAIT_BAKEABLE" = TRAIT_BAKEABLE, "TRAIT_BASIC_QUALITY_BAIT" = TRAIT_BASIC_QUALITY_BAIT, "TRAIT_BLIND_TOOL" = TRAIT_BLIND_TOOL, "TRAIT_BYPASS_RANGED_ARMOR" = TRAIT_BYPASS_RANGED_ARMOR, + "TRAIT_CONTRABAND_BLOCKER" = TRAIT_CONTRABAND_BLOCKER, "TRAIT_CUSTOM_TAP_SOUND" = TRAIT_CUSTOM_TAP_SOUND, "TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT, "TRAIT_FISHING_BAIT" = TRAIT_FISHING_BAIT, @@ -537,6 +540,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_HAUNTED" = TRAIT_HAUNTED, "TRAIT_HONKSPAMMING" = TRAIT_HONKSPAMMING, "TRAIT_INNATELY_FANTASTICAL_ITEM" = TRAIT_INNATELY_FANTASTICAL_ITEM, + "TRAIT_INSTANTLY_PROCESSES_BOULDERS" = TRAIT_INSTANTLY_PROCESSES_BOULDERS, "TRAIT_ITEM_OBJECTIVE_BLOCKED" = TRAIT_ITEM_OBJECTIVE_BLOCKED, "TRAIT_NEEDS_TWO_HANDS" = TRAIT_NEEDS_TWO_HANDS, "TRAIT_NO_BARCODES" = TRAIT_NO_BARCODES, @@ -550,8 +554,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_TRANSFORM_ACTIVE" = TRAIT_TRANSFORM_ACTIVE, "TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE, "TRAIT_WIELDED" = TRAIT_WIELDED, - "TRAIT_BAKEABLE" = TRAIT_BAKEABLE, - "TRAIT_INSTANTLY_PROCESSES_BOULDERS" = TRAIT_INSTANTLY_PROCESSES_BOULDERS, ), /obj/item/ammo_casing = list( "TRAIT_DART_HAS_INSERT" = TRAIT_DART_HAS_INSERT, diff --git a/code/controllers/subsystem/blackmarket.dm b/code/controllers/subsystem/blackmarket.dm index f6a4aa25566ff..5c88177583b2f 100644 --- a/code/controllers/subsystem/blackmarket.dm +++ b/code/controllers/subsystem/blackmarket.dm @@ -79,7 +79,7 @@ SUBSYSTEM_DEF(blackmarket) to_chat(buyer, span_notice("[purchase.uplink] flashes a message noting that the order is being teleported to [get_area(targetturf)] in 60 seconds.")) // do_teleport does not want to teleport items from nullspace, so it just forceMoves and does sparks. - addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/controller/subsystem/blackmarket,fake_teleport), purchase, targetturf), 60 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/controller/subsystem/blackmarket, fake_teleport), purchase, targetturf), 60 SECONDS) // Get the current location of the uplink if it exists, then throws the item from space at the station from a random direction. if(SHIPPING_METHOD_LAUNCH) @@ -88,6 +88,7 @@ SUBSYSTEM_DEF(blackmarket) var/pickedloc = spaceDebrisStartLoc(startSide, T.z) var/atom/movable/item = purchase.entry.spawn_item(pickedloc, purchase) + purchase.post_purchase_effects(item) item.throw_at(purchase.uplink, 3, 3, spin = FALSE) to_chat(buyer, span_notice("[purchase.uplink] flashes a message noting the order is being launched at the station from [dir2text(startSide)].")) @@ -110,6 +111,7 @@ SUBSYSTEM_DEF(blackmarket) if(QDELETED(purchase)) return var/atom/movable/thing = purchase.entry.spawn_item(target, purchase) + purchase.post_purchase_effects(thing) var/datum/effect_system/spark_spread/sparks = new sparks.set_up(5, 1, target) sparks.attach(thing) diff --git a/code/game/machinery/scan_gate.dm b/code/game/machinery/scanner_gate.dm similarity index 80% rename from code/game/machinery/scan_gate.dm rename to code/game/machinery/scanner_gate.dm index 3986b109ffc7d..860a5b1bc05b1 100644 --- a/code/game/machinery/scan_gate.dm +++ b/code/game/machinery/scanner_gate.dm @@ -5,6 +5,7 @@ #define SCANGATE_WANTED "Wanted" #define SCANGATE_SPECIES "Species" #define SCANGATE_NUTRITION "Nutrition" +#define SCANGATE_CONTRABAND "Contraband" #define SCANGATE_HUMAN "human" #define SCANGATE_LIZARD "lizard" @@ -29,7 +30,7 @@ var/next_beep = 0 ///Bool to check if the scanner's controls are locked by an ID. var/locked = FALSE - ///Which setting is the scanner checking for? See defines in scan_gate.dm for the list. + ///Which setting is the scanner checking for? See defines in scanner_gate.dm for the list. var/scangate_mode = SCANGATE_NONE ///Is searching for a disease, what severity is enough to trigger the gate? var/disease_threshold = DISEASE_SEVERITY_MINOR @@ -45,6 +46,8 @@ var/light_fail = FALSE ///Does the scanner ignore light_pass and light_fail for sending signals? var/ignore_signals = FALSE + ///Is an n-spect scanner attached to the gate? Enables contraband scanning. + var/obj/item/inspector/n_spect = null /obj/machinery/scanner_gate/Initialize(mapload) @@ -55,18 +58,37 @@ COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) AddElement(/datum/element/connect_loc, loc_connections) + register_context() /obj/machinery/scanner_gate/Destroy() qdel(wires) set_wires(null) . = ..() +/obj/machinery/scanner_gate/atom_deconstruct(disassembled) + . = ..() + if(n_spect) + n_spect.forceMove(drop_location()) + n_spect = null + /obj/machinery/scanner_gate/examine(mob/user) . = ..() if(locked) . += span_notice("The control panel is ID-locked. Swipe a valid ID to unlock it.") else . += span_notice("The control panel is unlocked. Swipe an ID to lock it.") + if(n_spect) + . += span_notice("The scanner is equipped with an N-Spect scanner. Use a [span_boldnotice("crowbar")] to uninstall.") + +/obj/machinery/scanner_gate/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(n_spect && held_item?.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Remove N-Spect scanner" + return CONTEXTUAL_SCREENTIP_SET + if(!n_spect && istype(held_item, /obj/item/inspector)) + context[SCREENTIP_CONTEXT_LMB] = "Install N-Spect scanner" + return CONTEXTUAL_SCREENTIP_SET + /obj/machinery/scanner_gate/proc/on_entered(datum/source, atom/movable/AM) SIGNAL_HANDLER @@ -83,6 +105,19 @@ if(duration) scanline_timer = addtimer(CALLBACK(src, PROC_REF(set_scanline), "passive"), duration, TIMER_STOPPABLE) +/obj/machinery/scanner_gate/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/inspector)) + if(n_spect) + to_chat(user, span_warning("The scanner is already equipped with an N-Spect scanner.")) + return ITEM_INTERACT_BLOCKING + else + to_chat(user, span_notice("You install an N-Spect scanner on [src].")) + n_spect = tool + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + return ITEM_INTERACT_SUCCESS + return NONE + /obj/machinery/scanner_gate/attackby(obj/item/W, mob/user, params) var/obj/item/card/id/card = W.GetID() if(card) @@ -105,6 +140,20 @@ wires.interact(user) return ..() +/obj/machinery/scanner_gate/crowbar_act(mob/living/user, obj/item/tool) + . = ..() + if(n_spect) + to_chat(user, span_notice("You uninstall [n_spect] from [src].")) + n_spect.forceMove(drop_location()) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/scanner_gate/Exited(atom/gone) + . = ..() + if(gone == n_spect) + n_spect = null + if(scangate_mode == SCANGATE_CONTRABAND) + scangate_mode = SCANGATE_NONE + /obj/machinery/scanner_gate/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) return FALSE @@ -175,6 +224,13 @@ beep = TRUE if(H.nutrition >= detect_nutrition && detect_nutrition == NUTRITION_LEVEL_FAT) beep = TRUE + if(SCANGATE_CONTRABAND) + for(var/obj/item/content in M.get_all_contents_skipping_traits(TRAIT_CONTRABAND_BLOCKER)) + if(content.is_contraband()) + beep = TRUE + break + if(!n_spect.scans_correctly) + beep = !beep //We do a little trolling if(reverse) beep = !beep @@ -222,6 +278,7 @@ data["disease_threshold"] = disease_threshold data["target_species"] = detect_species data["target_nutrition"] = detect_nutrition + data["contraband_enabled"] = !!n_spect return data /obj/machinery/scanner_gate/ui_act(action, params) @@ -271,6 +328,7 @@ #undef SCANGATE_WANTED #undef SCANGATE_SPECIES #undef SCANGATE_NUTRITION +#undef SCANGATE_CONTRABAND #undef SCANGATE_HUMAN #undef SCANGATE_LIZARD diff --git a/code/game/objects/effects/posters/contraband.dm b/code/game/objects/effects/posters/contraband.dm index 52528c251b659..04bc790daea83 100644 --- a/code/game/objects/effects/posters/contraband.dm +++ b/code/game/objects/effects/posters/contraband.dm @@ -4,6 +4,10 @@ poster_type = /obj/structure/sign/poster/contraband/random icon_state = "rolled_poster" +/obj/item/poster/random_contraband/Initialize(mapload, obj/structure/sign/poster/new_poster_structure) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) + /obj/structure/sign/poster/contraband poster_item_name = "contraband poster" poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities." diff --git a/code/game/objects/effects/spawners/random/contraband.dm b/code/game/objects/effects/spawners/random/contraband.dm index f17656c61191a..c32d46125c019 100644 --- a/code/game/objects/effects/spawners/random/contraband.dm +++ b/code/game/objects/effects/spawners/random/contraband.dm @@ -25,6 +25,12 @@ /obj/item/reagent_containers/pill/maintenance = 5, ) + +/obj/effect/spawner/random/contraband/make_item(spawn_loc, type_path_to_make) + var/obj/item/made = ..() + ADD_TRAIT(made, TRAIT_CONTRABAND, INNATE_TRAIT) + return made + /obj/effect/spawner/random/contraband/plus name = "contraband loot spawner plus" desc = "Where'd ya find this?" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 87e97b8703a1e..f18da132af0b6 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1716,6 +1716,20 @@ SEND_SIGNAL(loc, COMSIG_ATOM_CONTENTS_WEIGHT_CLASS_CHANGED, src, old_w_class, new_w_class) return TRUE +/** + * Used to determine if an item should be considered contraband by N-spect scanners or scanner gates. + * Returns true when an item has the contraband trait, or is included in the traitor uplink. + */ +/obj/item/proc/is_contraband() + if(HAS_TRAIT(src, TRAIT_CONTRABAND)) + return TRUE + for(var/datum/uplink_item/traitor_item as anything in SStraitor.uplink_items) + if(istype(src, traitor_item.item)) + if(!(traitor_item.uplink_item_flags & SYNDIE_TRIPS_CONTRABAND)) + return FALSE + return TRUE + return FALSE + /// Fetches embedding data /obj/item/proc/get_embed() RETURN_TYPE(/datum/embed_data) diff --git a/code/game/objects/items/drug_items.dm b/code/game/objects/items/drug_items.dm index f313dad5f74ea..d25c957145561 100644 --- a/code/game/objects/items/drug_items.dm +++ b/code/game/objects/items/drug_items.dm @@ -18,6 +18,10 @@ icon_state = "saturnx_glob" //tell kryson to sprite two more variants in the future. food_reagents = list(/datum/reagent/drug/saturnx = 10) +/obj/item/food/drug/saturnx/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) + /obj/item/food/drug/moon_rock name = "moon rock" desc = "A small hard lump of kronkaine freebase.\nIt is said the average kronkaine addict causes as much criminal damage as four cat burglars, two arsonists and one rabid pit bull terrier combined." @@ -28,6 +32,7 @@ . = ..() icon_state = pick("moon_rock1", "moon_rock2", "moon_rock3") AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOONICORN, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) /obj/item/reagent_containers/cup/blastoff_ampoule name = "bLaSToFF ampoule" //stylized name @@ -70,3 +75,7 @@ SplashReagents(hit_atom, TRUE) qdel(src) hit_atom.Bumped(ampoule_shard) + +/obj/item/reagent_containers/cup/blastoff_ampoule/Initialize(mapload, vol) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) diff --git a/code/game/objects/items/implants/implant_storage.dm b/code/game/objects/items/implants/implant_storage.dm index 5734beb76831d..0ce71c1cbc10a 100644 --- a/code/game/objects/items/implants/implant_storage.dm +++ b/code/game/objects/items/implants/implant_storage.dm @@ -36,7 +36,7 @@ return TRUE return FALSE create_storage(storage_type = /datum/storage/implant) - + ADD_TRAIT(src, TRAIT_CONTRABAND_BLOCKER, INNATE_TRAIT) return ..() /obj/item/implanter/storage diff --git a/code/game/objects/items/inspector.dm b/code/game/objects/items/inspector.dm index 82a36336c42b9..b73917bfba8b6 100644 --- a/code/game/objects/items/inspector.dm +++ b/code/game/objects/items/inspector.dm @@ -8,7 +8,7 @@ */ /obj/item/inspector name = "\improper N-spect scanner" - desc = "Central Command-issued inspection device. Performs inspections according to Nanotrasen protocols when activated, then prints an encrypted report regarding the maintenance of the station. Definitely not giving you cancer." + desc = "Central Command standard issue inspection device. Can perform either wide area scans that central command can use to verify the security of the station, or detailed scans to determine if an item is contraband." icon = 'icons/obj/devices/scanner.dmi' icon_state = "inspector" worn_icon_state = "salestagger" @@ -32,11 +32,15 @@ var/cell_cover_open = FALSE ///Energy used per print. var/energy_per_print = INSPECTOR_ENERGY_USAGE_NORMAL + ///Does this item scan for contraband correctly? If not, will provide a flipped response. + var/scans_correctly = TRUE /obj/item/inspector/Initialize(mapload) . = ..() if(ispath(cell)) cell = new cell(src) + register_context() + register_item_context() // Clean up the cell on destroy /obj/item/inspector/Exited(atom/movable/gone, direction) @@ -93,6 +97,54 @@ else . += "\The [cell] is firmly in place. [span_info("Ctrl-click with an empty hand to remove it.")]" +/obj/item/inspector/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!user.Adjacent(interacting_with)) + return ITEM_INTERACT_BLOCKING + if(cell_cover_open) + balloon_alert(user, "close cover first!") + return ITEM_INTERACT_BLOCKING + if(!cell || !cell.use(INSPECTOR_ENERGY_USAGE_LOW)) + balloon_alert(user, "check cell!") + return ITEM_INTERACT_BLOCKING + if(!isitem(interacting_with)) + return ITEM_INTERACT_BLOCKING + var/obj/item/contraband_item = interacting_with + var/contraband_status = contraband_item.is_contraband() + if((!contraband_status && scans_correctly) || (contraband_status && !scans_correctly)) + playsound(src, 'sound/machines/ping.ogg', 20) + balloon_alert(user, "clear") + return ITEM_INTERACT_SUCCESS + + playsound(src, 'sound/machines/uplinkerror.ogg', 40) + balloon_alert(user, "contraband detected!") + return ITEM_INTERACT_SUCCESS + +/obj/item/inspector/add_context(atom/source, list/context, obj/item/held_item, mob/user) + var/update_context = FALSE + if(cell_cover_open && cell) + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Remove cell" + update_context = TRUE + + if(cell_cover_open && !cell && istype(held_item, /obj/item/stock_parts/power_store/cell)) + context[SCREENTIP_CONTEXT_LMB] = "Install cell" + update_context = TRUE + + if(held_item?.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "[cell_cover_open ? "close" : "open"] battery panel" + update_context = TRUE + + if(update_context) + return CONTEXTUAL_SCREENTIP_SET + return NONE + +/obj/item/inspector/add_item_context(obj/item/source, list/context, atom/target, mob/living/user) + if(cell_cover_open || !cell) + return NONE + if(isitem(target)) + context[SCREENTIP_CONTEXT_LMB] = "Contraband Scan" + return CONTEXTUAL_SCREENTIP_SET + return NONE + /** * Create our report * @@ -178,6 +230,7 @@ * Can be crafted into a bananium HONK-spect scanner */ /obj/item/inspector/clown + scans_correctly = FALSE ///will only cycle through modes with numbers lower than this var/max_mode = CLOWN_INSPECTOR_PRINT_SOUND_MODE_LAST ///names of modes, ordered first to last diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm index 5660de8d60432..f6357b229efb9 100644 --- a/code/game/objects/items/robot/ai_upgrades.dm +++ b/code/game/objects/items/robot/ai_upgrades.dm @@ -8,6 +8,9 @@ icon = 'icons/obj/devices/circuitry_n_data.dmi' icon_state = "datadisk3" +/obj/item/malf_upgrade/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) /obj/item/malf_upgrade/pre_attack(atom/A, mob/living/user, proximity) if(!proximity) @@ -37,6 +40,10 @@ icon = 'icons/obj/devices/circuitry_n_data.dmi' icon_state = "datadisk3" +/obj/item/surveillance_upgrade/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) + /obj/item/surveillance_upgrade/pre_attack(atom/A, mob/living/user, proximity) if(!proximity) return ..() diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 6fa32ae31e29b..9a3e45fac4213 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -213,6 +213,10 @@ icon_state = "cyborg_upgrade3" require_model = TRUE +/obj/item/borg/upgrade/syndicate/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) + /obj/item/borg/upgrade/syndicate/action(mob/living/silicon/robot/borg, mob/living/user = usr) . = ..() if(!.) diff --git a/code/game/objects/items/stickers.dm b/code/game/objects/items/stickers.dm index a02cfd9515ed4..19ac58f6f4072 100644 --- a/code/game/objects/items/stickers.dm +++ b/code/game/objects/items/stickers.dm @@ -174,6 +174,10 @@ icon_state = "synd" contraband = TRUE +/obj/item/sticker/syndicate/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) + /obj/item/sticker/syndicate/c4 name = "C-4 sticker" icon_state = "c4" diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 5ae6e8d9fa618..77ca77e8ba0bf 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -387,6 +387,7 @@ AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE, INVISIBILITY_OBSERVER, use_anchor = TRUE) atom_storage.max_total_storage = 15 atom_storage.set_holdable(cant_hold_list = /obj/item/storage/backpack/satchel/flat) //muh recursive backpacks + ADD_TRAIT(src, TRAIT_CONTRABAND_BLOCKER, INNATE_TRAIT) /obj/item/storage/backpack/satchel/flat/PopulateContents() for(var/items in 1 to 4) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index ecd85253c21a8..307b4b7324bd8 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -85,6 +85,7 @@ Striking a noncultist, however, will tear their flesh."} speed = 4 SECONDS, \ effectiveness = 100, \ ) + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) /obj/item/melee/cultblade/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(IS_CULTIST(owner) && prob(final_block_chance)) @@ -658,6 +659,10 @@ Striking a noncultist, however, will tear their flesh."} righthand_file = 'icons/mob/inhands/items/drinks_righthand.dmi' list_reagents = list(/datum/reagent/fuel/unholywater = 50) +/obj/item/reagent_containers/cup/beaker/unholywater/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) + ///how many times can the shuttle be cursed? #define MAX_SHUTTLE_CURSES 3 ///if the max number of shuttle curses are used within this duration, the entire cult gets an achievement diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 5067dcf979904..2cdb2c2e6f468 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -131,6 +131,7 @@ COOLDOWN_START(src, use_cooldown, use_cooldown_duration) for(var/item_to_make in spawned_items) var/obj/item/made_item = new item_to_make(get_turf(src)) + ADD_TRAIT(made_item, TRAIT_CONTRABAND, INNATE_TRAIT) succcess_message(user, made_item) diff --git a/code/modules/antagonists/cult/datums/cultist.dm b/code/modules/antagonists/cult/datums/cultist.dm index b0fbea4421aa9..f56d79a8f4b18 100644 --- a/code/modules/antagonists/cult/datums/cultist.dm +++ b/code/modules/antagonists/cult/datums/cultist.dm @@ -151,7 +151,8 @@ ///Attempts to make a new item and put it in a potential inventory slot in the provided mob. /datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob) - var/item = new item_path(mob) + var/obj/item = new item_path(mob) + ADD_TRAIT(item, TRAIT_CONTRABAND, INNATE_TRAIT) var/where = mob.equip_conspicuous_item(item) if(!where) to_chat(mob, span_userdanger("Unfortunately, you weren't able to get [item]. This is very bad and you should adminhelp immediately (press F1).")) diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 6cfa8db05608f..5b78d1b7efb6c 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -155,7 +155,9 @@ return FALSE for(var/result in result_atoms) - new result(loc) + var/atom/result_item = new result(loc) + if(isitem(result_item)) + ADD_TRAIT(result_item, TRAIT_CONTRABAND, INNATE_TRAIT) return TRUE /** diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm index 45ddea163fa71..0c64e4a227eaf 100644 --- a/code/modules/antagonists/heretic/items/heretic_armor.dm +++ b/code/modules/antagonists/heretic/items/heretic_armor.dm @@ -97,6 +97,7 @@ . = ..() create_storage(storage_type = /datum/storage/pockets/void_cloak) make_visible() + ADD_TRAIT(src, TRAIT_CONTRABAND_BLOCKER, INNATE_TRAIT) /obj/item/clothing/suit/hooded/cultrobes/void/equipped(mob/user, slot) . = ..() diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm index 0586d7ea6da4a..7dc220d516f01 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/_entry.dm @@ -203,6 +203,11 @@ log_spellbook("[key_name(user)] bought [src] for [cost] points") SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) log_purchase(user.key) + + ADD_TRAIT(spawned_path, TRAIT_CONTRABAND, INNATE_TRAIT) + for(var/obj/contained as anything in spawned_path.contents) + ADD_TRAIT(contained, TRAIT_CONTRABAND, INNATE_TRAIT) + try_equip_item(user, spawned_path) return spawned_path diff --git a/code/modules/cargo/bounties/security.dm b/code/modules/cargo/bounties/security.dm index cc83aa228a8ff..8281408c17967 100644 --- a/code/modules/cargo/bounties/security.dm +++ b/code/modules/cargo/bounties/security.dm @@ -1,8 +1,8 @@ /datum/bounty/item/security/recharger - name = "Rechargers" - description = "Nanotrasen military academy is conducting marksmanship exercises. They request that rechargers be shipped." + name = "Weapon Recharger" + description = "Nanotrasen military academy is conducting marksmanship exercises. They request that a recharger be shipped." reward = CARGO_CRATE_VALUE * 4 - required_count = 3 + required_count = 1 wanted_types = list(/obj/machinery/recharger = TRUE) /datum/bounty/item/security/pepperspray @@ -81,3 +81,13 @@ if(istype(slip.scanned_area, demanded_area)) return TRUE return FALSE + +/datum/bounty/item/security/contraband + name = "Confiscated Contraband" + description = "The syndicate are constantly acting to subvert crewmates of Nanotrasen afilliated stations. Ship us your latest batch of confiscated contraband." + reward = CARGO_CRATE_VALUE * 4 + required_count = 5 + wanted_types = list(/obj/item = TRUE) + +/datum/bounty/item/security/contraband/applies_to(obj/O) + return HAS_TRAIT(O, TRAIT_CONTRABAND) diff --git a/code/modules/cargo/markets/_market.dm b/code/modules/cargo/markets/_market.dm index 78585ed842f2e..7bef341842f1a 100644 --- a/code/modules/cargo/markets/_market.dm +++ b/code/modules/cargo/markets/_market.dm @@ -10,6 +10,8 @@ var/list/available_items = list() /// Item categories available from this market, only items which are in these categories can be gotten from this market. Automatically assigned, so don't manually adjust. var/list/categories = list() + /// Are the items from this market legal or illegal? If illegal, apply a contrband trait to the bought object. + var/legal_status = TRUE /// Adds item to the available items and add it's category if it is not in categories yet. /datum/market/proc/add_item(datum/market_item/item) @@ -30,7 +32,15 @@ if(!length(available_items[item.category])) available_items -= item.category -/// Handles buying the item, this is mainly for future use and moving the code away from the uplink. +/** + * Handles buying the item for a market. + * + * @param identifier The identifier of the item to buy. + * @param category The category of the item to buy. + * @param method The shipping method to use to get the item on the station. + * @param uplink The uplink object that is buying the item. + * @param user The mob that is buying the item. + */ /datum/market/proc/purchase(identifier, category, method, obj/item/market_uplink/uplink, user) var/datum/market_item/item = available_items[category][identifier] if(isnull(item)) @@ -54,7 +64,7 @@ to_chat(user, span_warning("You don't have enough credits in [uplink] for [item] with [method] shipping.")) return FALSE - if(item.buy(uplink, user, method)) + if(item.buy(uplink, user, method, legal_status)) uplink.current_user.adjust_money(-price, "Other: Third Party Transaction") if(ismob(user)) var/mob/m_user = user @@ -70,3 +80,4 @@ SHIPPING_METHOD_LAUNCH = 10, SHIPPING_METHOD_TELEPORT= 75, ) + legal_status = FALSE diff --git a/code/modules/cargo/markets/market_item.dm b/code/modules/cargo/markets/market_item.dm index 21ff3d01deb3b..5e3ce4efb6c07 100644 --- a/code/modules/cargo/markets/market_item.dm +++ b/code/modules/cargo/markets/market_item.dm @@ -81,8 +81,15 @@ return new item(loc) CRASH("Invalid item type for market item [item || "null"]") -/// Buys the item and makes SSblackmarket handle it. -/datum/market_item/proc/buy(obj/item/market_uplink/uplink, mob/buyer, shipping_method) +/** + * Buys the item and makes SSblackmarket handle it. + * + * @param uplink The uplink that is buying the item. + * @param buyer The mob that is buying the item. + * @param shipping_method The shipping method used to get the market item onto the station. + * @param legal_status The legal status of the market. Determines if the item to be spawned is contraband. + */ +/datum/market_item/proc/buy(obj/item/market_uplink/uplink, mob/buyer, shipping_method, legal_status) SHOULD_CALL_PARENT(TRUE) // Sanity if(!istype(uplink) || !istype(buyer)) @@ -93,7 +100,7 @@ return FALSE // Alright, the item has been purchased. - var/datum/market_purchase/purchase = new(src, uplink, shipping_method) + var/datum/market_purchase/purchase = new(src, uplink, shipping_method, legal_status) // SSblackmarket takes care of the shipping. if(SSblackmarket.queue_item(purchase)) @@ -102,6 +109,7 @@ return TRUE return FALSE + // This exists because it is easier to keep track of all the vars this way. /datum/market_purchase /// The entry being purchased. @@ -112,13 +120,16 @@ var/obj/item/market_uplink/uplink /// Shipping method used to buy this item. var/method + /// Is this item considered contraband? If illegal, applies the contraband trait to the item when spawned. + var/legallity -/datum/market_purchase/New(datum/market_item/entry, obj/item/market_uplink/uplink, method) +/datum/market_purchase/New(datum/market_item/entry, obj/item/market_uplink/uplink, method, legal_status) if(!uplink || !entry || !method) CRASH("[type] created with a false value arg: (entry: [entry] - uplink: [uplink] - method: [method])") src.entry = entry src.uplink = uplink src.method = method + src.legallity = legal_status RegisterSignal(entry, COMSIG_QDELETING, PROC_REF(on_instance_del)) RegisterSignal(uplink, COMSIG_QDELETING, PROC_REF(on_instance_del)) if(ismovable(entry.item)) @@ -137,3 +148,13 @@ return // Uh oh, uplink or item is gone. We will just keep the money and you will not get your order. qdel(src) + +/** + * Proc that applies secondary effects to objects that are spawned via a market. + * + * @param spawned_item - Reference to the atom being spawned. + * @param legal_status - Is this item considered legal? If illegal, will apply the contraband trait to the spawned item. + */ +/datum/market_purchase/proc/post_purchase_effects(atom/spawned_item) + if(!legallity && isobj(spawned_item)) + ADD_TRAIT(spawned_item, TRAIT_CONTRABAND, INNATE_TRAIT) diff --git a/code/modules/cargo/markets/market_telepad.dm b/code/modules/cargo/markets/market_telepad.dm index 4545b07e487f4..7c5b509a9421d 100644 --- a/code/modules/cargo/markets/market_telepad.dm +++ b/code/modules/cargo/markets/market_telepad.dm @@ -91,6 +91,7 @@ if(receiving) receiving.item = receiving.entry.spawn_item(turf, receiving) + receiving.post_purchase_effects(receiving.item) use_energy(energy_usage_per_teleport / power_efficiency) var/datum/effect_system/spark_spread/sparks = new diff --git a/code/modules/cargo/markets/market_uplink.dm b/code/modules/cargo/markets/market_uplink.dm index df8c8eb36a507..d13f59937b66c 100644 --- a/code/modules/cargo/markets/market_uplink.dm +++ b/code/modules/cargo/markets/market_uplink.dm @@ -157,6 +157,9 @@ accessible_markets = list(/datum/market/blackmarket) custom_premium_price = PAYCHECK_CREW * 2.5 +/obj/item/market_uplink/blackmarket/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) /datum/crafting_recipe/blackmarket_uplink name = "Black Market Uplink" diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm index 3f8ceb5ca0217..c675352d024b2 100644 --- a/code/modules/cargo/order.dm +++ b/code/modules/cargo/order.dm @@ -185,6 +185,9 @@ else account_holder = "Cargo" var/obj/structure/closet/crate/crate = pack.generate(A, paying_account) + if(pack.contraband) + for(var/atom/movable/item_within as anything in crate.get_all_contents()) + ADD_TRAIT(item_within, TRAIT_CONTRABAND, INNATE_TRAIT) if(department_destination) crate.AddElement(/datum/element/deliver_first, department_destination, pack.cost) generateManifest(crate, account_holder, pack, pack.cost) diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index 2f91ad4c8207a..d835c52f1e859 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -178,6 +178,7 @@ "desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name. "goody" = P.goody, "access" = P.access, + "contraband" = P.contraband, )) return data diff --git a/code/modules/cargo/packs/_packs.dm b/code/modules/cargo/packs/_packs.dm index 662938320cb76..b6c533050f675 100644 --- a/code/modules/cargo/packs/_packs.dm +++ b/code/modules/cargo/packs/_packs.dm @@ -77,6 +77,7 @@ continue A.flags_1 |= ADMIN_SPAWNED_1 + /// For generating supply packs at runtime. Returns a list of supply packs to use instead of this one. /datum/supply_pack/proc/generate_supply_packs() return diff --git a/code/modules/clothing/chameleon/generic_chameleon_clothing.dm b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm index 63bede9ec88c8..47b6f4db185a5 100644 --- a/code/modules/clothing/chameleon/generic_chameleon_clothing.dm +++ b/code/modules/clothing/chameleon/generic_chameleon_clothing.dm @@ -252,6 +252,10 @@ do { \ name = "backpack" actions_types = list(/datum/action/item_action/chameleon/change/backpack) +/obj/item/storage/backpack/chameleon/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND_BLOCKER, INNATE_TRAIT) + /obj/item/storage/backpack/chameleon/broken /obj/item/storage/backpack/chameleon/broken/Initialize(mapload) diff --git a/code/modules/hydroponics/grown/kronkus.dm b/code/modules/hydroponics/grown/kronkus.dm index e0b6e6b66aad3..90d264230e750 100644 --- a/code/modules/hydroponics/grown/kronkus.dm +++ b/code/modules/hydroponics/grown/kronkus.dm @@ -16,6 +16,10 @@ growing_icon = 'icons/obj/service/hydroponics/growing.dmi' reagents_add = list(/datum/reagent/consumable/nutriment = 0.05) +/obj/item/seeds/kronkus/Initialize(mapload, nogenes) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) + /obj/item/food/grown/kronkus seed = /obj/item/seeds/kronkus name = "kronkus vine segment" @@ -24,3 +28,7 @@ filling_color = "#37946e" foodtypes = VEGETABLES | TOXIC distill_reagent = /datum/reagent/kronkus_extract + +/obj/item/food/grown/kronkus/Initialize(mapload, nogenes) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index c6d0869c6e987..b74f05408a0a1 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -351,6 +351,9 @@ /obj/item/mod/module/quick_cuff, ) +/obj/item/mod/control/pre_equipped/infiltrator/Initialize(mapload, new_theme, new_skin, new_core) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND_BLOCKER, INNATE_TRAIT) /obj/item/mod/control/pre_equipped/interdyne theme = /datum/mod_theme/interdyne diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 9fffd5ccc7c10..06537e591c976 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -316,6 +316,10 @@ name = "unlabeled syringe" desc = "A syringe containing some sort of unknown chemical cocktail." +/obj/item/reagent_containers/syringe/contraband/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) + /obj/item/reagent_containers/syringe/contraband/space_drugs list_reagents = list(/datum/reagent/drug/space_drugs = 15) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index b8b11e7b44f67..7572a73529200 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -660,7 +660,7 @@ category = list( RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_SECURITY | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_MEDICAL /datum/design/board/holopad name = "AI Holopad Board" diff --git a/code/modules/research/techweb/nodes/syndicate_nodes.dm b/code/modules/research/techweb/nodes/syndicate_nodes.dm index 377ac392f938f..7743b9442f829 100644 --- a/code/modules/research/techweb/nodes/syndicate_nodes.dm +++ b/code/modules/research/techweb/nodes/syndicate_nodes.dm @@ -33,7 +33,7 @@ required_items_to_unlock = list() for(var/datum/uplink_item/item_path as anything in SStraitor.uplink_items_by_type) var/datum/uplink_item/item = SStraitor.uplink_items_by_type[item_path] - if(!item.item || !item.illegal_tech) + if(!item.item || !(item.uplink_item_flags & SYNDIE_ILLEGAL_TECH)) continue required_items_to_unlock |= item.item //allows deconning to unlock. diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index 6e3d9a0ee7ccb..0bb8afc6ced52 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -149,6 +149,10 @@ surgery_speed = 0.75 loaded_overlay = "autosurgeon_syndicate_loaded_overlay" +/obj/item/autosurgeon/syndicate/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) + /obj/item/autosurgeon/syndicate/laser_arm desc = "A single use autosurgeon that contains a combat arms-up laser augment. A screwdriver can be used to remove it, but implants can't be placed back in." uses = 1 diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index e17488bc96a6d..bf963587ae1cc 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -78,8 +78,8 @@ var/purchase_log_vis = TRUE // Visible in the purchase log? /// Whether this purchase is restricted or not (VR/Events related) var/restricted = FALSE - /// Can this item be deconstructed to unlock certain techweb research nodes? - var/illegal_tech = TRUE + /// Flags related to if an item will provide illegal tech, or trips contraband detectors once spawned in as an item. + var/uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND /// String to be shown instead of the price, e.g for the Random item. var/cost_override_string = "" /// Whether this item locks all other items from being purchased. Used by syndicate balloon and a few other purchases. @@ -142,6 +142,12 @@ spawned_item = spawn_path if(refundable) spawned_item.AddElement(/datum/element/uplink_reimburse, (refund_amount ? refund_amount : cost)) + + + if(uplink_item_flags & SYNDIE_TRIPS_CONTRABAND) // Ignore things that shouldn't be detectable as contraband on the station. + ADD_TRAIT(spawned_item, TRAIT_CONTRABAND, INNATE_TRAIT) + for(var/obj/contained as anything in spawned_item.get_all_contents()) + ADD_TRAIT(contained, TRAIT_CONTRABAND, INNATE_TRAIT) var/mob/living/carbon/human/human_user = user if(istype(human_user) && isitem(spawned_item) && human_user.put_in_hands(spawned_item)) to_chat(human_user, span_boldnotice("[spawned_item] materializes into your hands!")) @@ -154,8 +160,10 @@ /// Can be used to "de-restrict" some items, such as Nukie guns spawning with Syndicate pins /datum/uplink_item/proc/spawn_item_for_generic_use(mob/user) var/atom/movable/created = new item(user.loc) - - if(isgun(created)) + if(uplink_item_flags & SYNDIE_TRIPS_CONTRABAND) // Things that shouldn't be detectable as contraband on the station. + ADD_TRAIT(created, TRAIT_CONTRABAND, INNATE_TRAIT) + for(var/obj/contained as anything in created.get_all_contents()) + ADD_TRAIT(contained, TRAIT_CONTRABAND, INNATE_TRAIT) replace_pin(created) else if(istype(created, /obj/item/storage/toolbox/guncase)) for(var/obj/item/gun/gun in created) @@ -205,7 +213,7 @@ name = "Objective-Specific Equipment" desc = "Equipment necessary for accomplishing specific objectives. If you are seeing this, something has gone wrong." limited_stock = 1 - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY // Ditto /datum/uplink_item/special_equipment/purchase(mob/user, datum/component/uplink/U) diff --git a/code/modules/uplink/uplink_items/ammunition.dm b/code/modules/uplink/uplink_items/ammunition.dm index 705204f98a15b..2276485a2b7b5 100644 --- a/code/modules/uplink/uplink_items/ammunition.dm +++ b/code/modules/uplink/uplink_items/ammunition.dm @@ -12,7 +12,7 @@ item = /obj/item/ammo_box/foambox/riot cost = 2 surplus = 0 - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND purchasable_from = ~UPLINK_SERIOUS_OPS /datum/uplink_item/ammo/pistol @@ -21,7 +21,7 @@ item = /obj/item/ammo_box/magazine/m9mm cost = 1 purchasable_from = ~UPLINK_ALL_SYNDIE_OPS - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/ammo/pistolap name = "9mm Armour Piercing Magazine" @@ -54,4 +54,4 @@ item = /obj/item/ammo_box/a357 cost = 4 purchasable_from = ~(UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) //nukies get their own version - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND diff --git a/code/modules/uplink/uplink_items/badass.dm b/code/modules/uplink/uplink_items/badass.dm index da7212ee8fc5b..08cf3affe0741 100644 --- a/code/modules/uplink/uplink_items/badass.dm +++ b/code/modules/uplink/uplink_items/badass.dm @@ -14,7 +14,7 @@ cost = 20 lock_other_purchases = TRUE cant_discount = TRUE - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/badass/balloon/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) . = ..() @@ -36,14 +36,14 @@ item = /obj/item/toy/cards/deck/syndicate cost = 1 surplus = 40 - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/badass/syndiecigs name = "Syndicate Smokes" desc = "Strong flavor, dense smoke, infused with omnizine." item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate cost = 2 - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/badass/syndiecash name = "Syndicate Briefcase Full of Cash" @@ -53,7 +53,7 @@ item = /obj/item/storage/briefcase/secure/syndie cost = 3 restricted = TRUE - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/badass/costumes/clown name = "Clown Costume" diff --git a/code/modules/uplink/uplink_items/clownops.dm b/code/modules/uplink/uplink_items/clownops.dm index 56c11fedc0cb8..6dce44aeef8ef 100644 --- a/code/modules/uplink/uplink_items/clownops.dm +++ b/code/modules/uplink/uplink_items/clownops.dm @@ -35,7 +35,7 @@ cost = 1 //much cheaper for clown ops than for clowns item = /obj/item/firing_pin/clown/ultra purchasable_from = UPLINK_CLOWN_OPS - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/weapon_kits/clownopsuperpin name = "Super Ultra Hilarious Firing Pin" @@ -43,7 +43,7 @@ cost = 4 //much cheaper for clown ops than for clowns item = /obj/item/firing_pin/clown/ultra/selfdestruct purchasable_from = UPLINK_CLOWN_OPS - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/weapon_kits/foamsmg name = "Toy Submachine Gun" @@ -157,4 +157,4 @@ item = /obj/item/dnainjector/clumsymut cost = 1 purchasable_from = UPLINK_CLOWN_OPS - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm index 11cca6c442661..691f4f2c8f37f 100644 --- a/code/modules/uplink/uplink_items/dangerous.dm +++ b/code/modules/uplink/uplink_items/dangerous.dm @@ -29,7 +29,7 @@ throwing weapons. The bolas can knock a target down and the shurikens will embed into limbs." item = /obj/item/storage/box/syndie_kit/throwing_weapons cost = 3 - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/dangerous/sword name = "Energy Sword" diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm index c1b0f8b2e0215..714c3133482c4 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -12,7 +12,7 @@ item = /obj/item/soap/syndie cost = 1 surplus = 50 - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/device_tools/surgerybag name = "Syndicate Surgery Duffel Bag" @@ -111,7 +111,7 @@ item = /obj/item/disk/nuclear/fake cost = 1 surplus = 1 - illegal_tech = FALSE + uplink_item_flags = NONE /datum/uplink_item/device_tools/frame name = "F.R.A.M.E. disk" @@ -163,7 +163,7 @@ multitool and combat gloves that are resistant to shocks and heat." item = /obj/item/storage/toolbox/syndicate cost = 1 - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/device_tools/rad_laser name = "Radioactive Microlaser" diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index b010755d67e9e..d9bcce6411f5f 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -21,7 +21,7 @@ desc = "A box of five (5) counterfeit devices. Each single-use device can hold one normal sized object, and impersonate an ordinary postal envelope addressed to whoever you choose. Optionally, can be rigged to activate held items - great for if you want to surprise someone with a primed grenade!" item = /obj/item/storage/box/syndie_kit/mail_counterfeit cost = 2 - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND restricted_roles = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) surplus = 5 @@ -45,7 +45,7 @@ item = /obj/item/dnainjector/clumsymut cost = 1 restricted_roles = list(JOB_CLOWN) - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND surplus = 25 /datum/uplink_item/role_restricted/ancient_jumpsuit @@ -70,7 +70,7 @@ cost = 4 item = /obj/item/firing_pin/clown/ultra restricted_roles = list(JOB_CLOWN) - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND surplus = 25 /datum/uplink_item/role_restricted/clownsuperpin @@ -79,7 +79,7 @@ cost = 7 item = /obj/item/firing_pin/clown/ultra/selfdestruct restricted_roles = list(JOB_CLOWN) - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND surplus = 25 /datum/uplink_item/role_restricted/syndimmi diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index 4f50994bc40ec..fa42be0d54d0e 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -385,7 +385,7 @@ item = /obj/item/ammo_box/magazine/plastikov9mm cost = 1 purchasable_from = UPLINK_SERIOUS_OPS - illegal_tech = FALSE + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND // Explosives and Grenades // ~~ Grenades ~~ diff --git a/code/modules/uplink/uplink_items/spy_unique.dm b/code/modules/uplink/uplink_items/spy_unique.dm index b53cf60cefdeb..7d2f5fb34cb84 100644 --- a/code/modules/uplink/uplink_items/spy_unique.dm +++ b/code/modules/uplink/uplink_items/spy_unique.dm @@ -10,12 +10,14 @@ // Cost doesn't really matter since it's free, but it determines which loot pool it falls into. // By default, these fall into easy-medium spy bounty loot pool cost = SPY_LOWER_COST_THRESHOLD + uplink_item_flags = NONE /datum/uplink_item/spy_unique/syndie_bowman name = "Syndicate Bowman" desc = "A bowman headset for members of the Syndicate. Not very conspicuous." item = /obj/item/radio/headset/syndicate/alt cost = 1 + uplink_item_flags = SYNDIE_ILLEGAL_TECH /datum/uplink_item/spy_unique/megaphone name = "Megaphone" @@ -43,6 +45,7 @@ name = "Kudzu" desc = "A packet of Kudzu - plant and forget, a great distraction." item = /obj/item/seeds/kudzu + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/spy_unique/big_knife name = "Combat Knife" @@ -53,6 +56,7 @@ name = "Switchblade" desc = "A switchblade. Switches between not sharp and sharp." item = /obj/item/switchblade + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/spy_unique/sechud_implant name = "SecHUD Implant" @@ -64,30 +68,35 @@ desc = "A bolt-action rifle, with a scope. Won't jam, either." item = /obj/item/gun/ballistic/rifle/boltaction/prime cost = SPY_UPPER_COST_THRESHOLD + uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/spy_unique/cycler_shotgun name = "Cycler Shotgun" desc = "A cycler shotgun. It's a shotgun that cycles between two barrels." item = /obj/item/gun/ballistic/shotgun/automatic/dual_tube/deadly cost = SPY_UPPER_COST_THRESHOLD + uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/spy_unique/bulldog_shotgun name = "Bulldog Shotgun" desc = "A bulldog shotgun. It's a shotgun that shoots bulldogs." item = /obj/item/gun/ballistic/shotgun/bulldog/unrestricted cost = SPY_UPPER_COST_THRESHOLD + uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/spy_unique/ansem_pistol name = "Ansem Pistol" desc = "A pistol that's really good at making people sleep." item = /obj/item/gun/ballistic/automatic/pistol/clandestine cost = SPY_UPPER_COST_THRESHOLD + uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/spy_unique/rocket_launcher name = "Rocket Launcher" desc = "A rocket launcher. I would recommend against jumping with it." item = /obj/item/gun/ballistic/rocketlauncher cost = SPY_UPPER_COST_THRESHOLD - 1 // It's a meme item + uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/spy_unique/shotgun_ammo name = "Box of Buckshot" @@ -110,17 +119,20 @@ desc = "A stealth belt that lets you sneak behind enemy lines." item = /obj/item/shadowcloak/weaker cost = SPY_UPPER_COST_THRESHOLD + uplink_item_flags = SYNDIE_ILLEGAL_TECH /datum/uplink_item/spy_unique/katana name = "Katana" desc = "A really sharp Katana. Did I mention it's sharp?" item = /obj/item/katana cost = /datum/uplink_item/dangerous/doublesword::cost // Puts it in the same pool as Desword + uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/spy_unique/medkit_lite name = "Syndicate First Medic Kit" desc = "A syndicate tactical combat medkit, but only stocked enough to do basic first aid." item = /obj/item/storage/medkit/tactical_lite + uplink_item_flags = SYNDIE_TRIPS_CONTRABAND /datum/uplink_item/spy_unique/antistun name = /datum/uplink_item/implants/nuclear/antistun::name diff --git a/code/modules/uplink/uplink_items/stealthy.dm b/code/modules/uplink/uplink_items/stealthy.dm index 898b82d1b6ad2..e4c4de412fb44 100644 --- a/code/modules/uplink/uplink_items/stealthy.dm +++ b/code/modules/uplink/uplink_items/stealthy.dm @@ -4,6 +4,7 @@ /datum/uplink_item/stealthy_weapons category = /datum/uplink_category/stealthy + uplink_item_flags = SYNDIE_ILLEGAL_TECH /datum/uplink_item/stealthy_weapons/dart_pistol diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm index a225d04d6674e..48c25e638deb7 100644 --- a/code/modules/uplink/uplink_items/stealthy_tools.dm +++ b/code/modules/uplink/uplink_items/stealthy_tools.dm @@ -4,6 +4,7 @@ /datum/uplink_item/stealthy_tools category = /datum/uplink_category/stealthy_tools + uplink_item_flags = SYNDIE_ILLEGAL_TECH /datum/uplink_item/stealthy_tools/agent_card @@ -90,7 +91,7 @@ item = /obj/item/storage/backpack/satchel/flat/with_tools cost = 1 surplus = 30 - illegal_tech = FALSE + uplink_item_flags = NONE /datum/uplink_item/stealthy_tools/mail_counterfeit name = "GLA Brand Mail Counterfeit Device" diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 737a2993d9bef..336f3b72ce1f7 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -1445,6 +1445,8 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock) var/obj/item/vended_item if(!LAZYLEN(item_record.returned_products)) //always give out free returned stuff first, e.g. to avoid walling a traitor objective in a bag behind paid items vended_item = new item_record.product_path(get_turf(src)) + if(vended_item.type in contraband) + ADD_TRAIT(vended_item, TRAIT_CONTRABAND, INNATE_TRAIT) on_dispense(vended_item) else vended_item = LAZYACCESS(item_record.returned_products, LAZYLEN(item_record.returned_products)) //first in, last out diff --git a/tgstation.dme b/tgstation.dme index bb2a7559aa892..550c0429abbda 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2036,7 +2036,7 @@ #include "code\game\machinery\recycler.dm" #include "code\game\machinery\requests_console.dm" #include "code\game\machinery\roulette_machine.dm" -#include "code\game\machinery\scan_gate.dm" +#include "code\game\machinery\scanner_gate.dm" #include "code\game\machinery\sheetifier.dm" #include "code\game\machinery\shieldgen.dm" #include "code\game\machinery\sleepers.dm" diff --git a/tgui/packages/tgui/interfaces/Cargo/CargoCatalog.tsx b/tgui/packages/tgui/interfaces/Cargo/CargoCatalog.tsx index baccf90c4bd3a..aea852ce5e728 100644 --- a/tgui/packages/tgui/interfaces/Cargo/CargoCatalog.tsx +++ b/tgui/packages/tgui/interfaces/Cargo/CargoCatalog.tsx @@ -206,6 +206,11 @@ function CatalogList(props: CatalogListProps) { )} + {!!pack.contraband && ( + + + + )}