From 34a551a57581fad61c01d383a669f16157228a69 Mon Sep 17 00:00:00 2001 From: Verm <32827189+Vermidia@users.noreply.github.com> Date: Mon, 11 Mar 2024 22:03:58 -0500 Subject: [PATCH 01/75] Doors check if they require an ID and access when an item is thrown at them (#81932) ## About The Pull Request Doors now check if they require an ID and access when an ID is thrown at them, instead of just access. ## Why It's Good For The Game If someone disables ID scan, you can no longer get around it by chucking your ID at the door. Fixes #81859 ## Changelog :cl: fix: Doors with ID scan disabled will no longer open when an ID is thrown at them /:cl: --- code/game/machinery/doors/door.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 83702cac9cb66..af38c929fd359 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -239,7 +239,7 @@ var/obj/item/I = AM if(!density || (I.w_class < WEIGHT_CLASS_NORMAL && !LAZYLEN(I.GetAccess()))) return - if(check_access(I)) + if(requiresID() && check_access(I)) open() else do_animate("deny") From 608ea83c26e20cf6ab661a59cf4e382e25c9a42a Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 12 Mar 2024 16:04:18 +1300 Subject: [PATCH 02/75] Automatic changelog for PR #81932 [ci skip] --- html/changelogs/AutoChangeLog-pr-81932.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81932.yml diff --git a/html/changelogs/AutoChangeLog-pr-81932.yml b/html/changelogs/AutoChangeLog-pr-81932.yml new file mode 100644 index 0000000000000..a4216a6e6162e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81932.yml @@ -0,0 +1,4 @@ +author: "Vermidia" +delete-after: True +changes: + - bugfix: "Doors with ID scan disabled will no longer open when an ID is thrown at them" \ No newline at end of file From 21addc3619698e5f42d56b9ccfdfff55fe7e0e8e Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Mon, 11 Mar 2024 22:16:36 -0500 Subject: [PATCH 03/75] Fix flakey spy bounty test failures (#81937) ## About The Pull Request Closes #81890 Closes #81951 The spy bounty test will occasionally fail to generate bounties on Gateway Test (and even more rarely, Runtime Station) due to the nature of these maps not having everything a station is expected to have (to use for steal targets). --- _maps/gateway_test.json | 1 + _maps/multiz_debug.json | 3 ++- _maps/runtimestation.json | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/_maps/gateway_test.json b/_maps/gateway_test.json index 5f4f8eec8a9c8..0b3923162f62c 100644 --- a/_maps/gateway_test.json +++ b/_maps/gateway_test.json @@ -10,6 +10,7 @@ "/datum/unit_test/job_roundstart_spawnpoints", "/datum/unit_test/required_map_items", "/datum/unit_test/space_dragon_expiration", + "/datum/unit_test/spy_bounty", "/datum/unit_test/traitor" ] } diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json index 2f07130c1f938..7f44673da3da6 100644 --- a/_maps/multiz_debug.json +++ b/_maps/multiz_debug.json @@ -5,7 +5,8 @@ "map_file": "multiz.dmm", "ignored_unit_tests": [ "/datum/unit_test/job_roundstart_spawnpoints", - "/datum/unit_test/required_map_items" + "/datum/unit_test/required_map_items", + "/datum/unit_test/spy_bounty" ], "traits": [ { diff --git a/_maps/runtimestation.json b/_maps/runtimestation.json index 093592f5c7084..ee042270c0a3e 100644 --- a/_maps/runtimestation.json +++ b/_maps/runtimestation.json @@ -6,7 +6,8 @@ "space_ruin_levels": 1, "ignored_unit_tests": [ "/datum/unit_test/job_roundstart_spawnpoints", - "/datum/unit_test/required_map_items" + "/datum/unit_test/required_map_items", + "/datum/unit_test/spy_bounty" ], "shuttles": { "cargo": "cargo_delta" From 66d22dfef00b9af9cb29ebed867a7f85d7cc982e Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Tue, 12 Mar 2024 07:31:49 +0100 Subject: [PATCH 04/75] [NO GBP] The museum piggy bank now spawns with at least 400 creds in it. (#81895) ## About The Pull Request Used the wrong operator in a control statement. ## Why It's Good For The Game Title. ## Changelog :cl: fix: The museum piggy bank now spawns with at least 400 creds in it. /:cl: --- code/game/objects/items/piggy_bank.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/piggy_bank.dm b/code/game/objects/items/piggy_bank.dm index 6a9ee494a22ff..012ff91b0216c 100644 --- a/code/game/objects/items/piggy_bank.dm +++ b/code/game/objects/items/piggy_bank.dm @@ -46,7 +46,7 @@ persistence_cb = CALLBACK(src, PROC_REF(save_cash)) SSticker.OnRoundend(persistence_cb) - if(initial_value & initial_value + calculate_dosh_amount() <= maximum_value) + if(initial_value && initial_value + calculate_dosh_amount() <= maximum_value) new /obj/item/holochip(src, initial_value) /obj/item/piggy_bank/proc/save_cash() From 2c4c50b90cde20a16ceb77b1124a144ad2f7f0b5 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 12 Mar 2024 19:32:11 +1300 Subject: [PATCH 05/75] Automatic changelog for PR #81895 [ci skip] --- html/changelogs/AutoChangeLog-pr-81895.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81895.yml diff --git a/html/changelogs/AutoChangeLog-pr-81895.yml b/html/changelogs/AutoChangeLog-pr-81895.yml new file mode 100644 index 0000000000000..14f537772f549 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81895.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "The museum piggy bank now spawns with at least 400 creds in it." \ No newline at end of file From c8c18d77c19300e48f3d93f9fead2ed8513ac012 Mon Sep 17 00:00:00 2001 From: Iajret <8430839+Iajret@users.noreply.github.com> Date: Tue, 12 Mar 2024 11:03:00 +0300 Subject: [PATCH 06/75] Prevent borgs resisting from grabs when they are locked down (#81904) ## About The Pull Request Prevents borgs resisting from grabs when they are locked ![image](https://github.com/tgstation/tgstation/assets/8430839/3fc8dee4-3539-4891-9a91-bc27b3610da2) (yes, there's small baloonies message barely visible) ## Why It's Good For The Game Isn't it fun to try and pull some locked down borg while they press B like hundred times per second so you can't even move them. ## Changelog :cl: fix: As a borg you shouldn't be able to resist from grab while locked down /:cl: --- code/modules/mob/living/silicon/robot/robot.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index b527645bc596a..4952ce57fe6eb 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -921,6 +921,12 @@ buckle_mob_flags= RIDER_NEEDS_ARM // just in case return ..() +/mob/living/silicon/robot/can_resist() + if(lockcharge) + balloon_alert(src, "locked down!") + return FALSE + return ..() + /mob/living/silicon/robot/execute_resist() . = ..() if(!has_buckled_mobs()) @@ -928,7 +934,6 @@ for(var/mob/unbuckle_me_now as anything in buckled_mobs) unbuckle_mob(unbuckle_me_now, FALSE) - /mob/living/silicon/robot/proc/TryConnectToAI() set_connected_ai(select_active_ai_with_fewest_borgs(z)) if(connected_ai) From 4a2df8b197673cf00ce7d39a0acd1adcb2c5c80d Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 12 Mar 2024 21:03:23 +1300 Subject: [PATCH 07/75] Automatic changelog for PR #81904 [ci skip] --- html/changelogs/AutoChangeLog-pr-81904.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81904.yml diff --git a/html/changelogs/AutoChangeLog-pr-81904.yml b/html/changelogs/AutoChangeLog-pr-81904.yml new file mode 100644 index 0000000000000..a3ea299bb053f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81904.yml @@ -0,0 +1,4 @@ +author: "Iajret" +delete-after: True +changes: + - bugfix: "As a borg you shouldn't be able to resist from grab while locked down" \ No newline at end of file From 00525f97f4f40eadb96ab656f52ecc9dd62d2189 Mon Sep 17 00:00:00 2001 From: san7890 Date: Tue, 12 Mar 2024 12:49:03 -0600 Subject: [PATCH 08/75] Basic Mobs Can Now Get Wet (and can therefore clear the `slimed` status effect) (#81927) ## About The Pull Request A year ago in #73601 (b7da743e7dca0ed0b8f96b02e184d8aed230526a), we made it such that we wouldn't apply the `/datum/status_effect/fire_handler` to any basic mob that wasn't a "flammable" mob. However, guess what? The way we handle "wet stacks" is handled by a subtype, `/datum/status_effect/fire_handler/wet_stacks`. This means that any mob that wasn't flammable wouldn't also get wet, meaning that they would literally _never_ get the `slimed` status effect off them (since that is reliant on wet stacks). In order to rectify this, let's actually account for the case in the code to ensure that mobs that should get wet do get wet (I made it an opt-out flag because I can't think of a single mob that can't get wet and didn't want to balloon the diff trying to think of every mob that should be able to get wet, etc.), and now it's all fixed hunky-dory. ## Why It's Good For The Game Fixes #81888 Basic mobs should be able to get wet. It's an oversight with how the wet_stack handler is tacked onto the backend of the fire_handler latticework- ideally these two would be two separate systems (or it would at least not be named `fire_handler` so people don't make this confusion in the future without realizing that it handles more than just... `fire`) but I don't have time to do a full cleansing and refactor of this code. ## Changelog :cl: fix: All basic mobs are able to get wet. This means, among other things, that you can clear the "slimed" status effect off your holoparasite or dog or whatever. /:cl: --- code/__DEFINES/basic_mobs.dm | 2 ++ code/datums/status_effects/debuffs/fire_stacks.dm | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/basic_mobs.dm b/code/__DEFINES/basic_mobs.dm index c7275f7c423e7..b673d0e7a120b 100644 --- a/code/__DEFINES/basic_mobs.dm +++ b/code/__DEFINES/basic_mobs.dm @@ -12,6 +12,8 @@ #define FLAMMABLE_MOB (1<<3) /// Mob never takes damage from unarmed attacks #define IMMUNE_TO_FISTS (1<<4) +/// Mob is immune to getting wet +#define IMMUNE_TO_GETTING_WET (1<<5) /// Temporary trait applied when an attack forecast animation has completed #define TRAIT_BASIC_ATTACK_FORECAST "trait_basic_attack_forecast" diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 76d5f8ec896d1..5bf8269bbbfda 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -30,8 +30,7 @@ qdel(src) return if(isbasicmob(owner)) - var/mob/living/basic/basic_owner = owner - if(!(basic_owner.basic_mob_flags & FLAMMABLE_MOB)) + if(!check_basic_mob_immunity(owner)) qdel(src) return @@ -94,6 +93,10 @@ stacks = max(0, min(stack_limit, stacks + new_stacks)) cache_stacks() +/// Checks if the applicable basic mob is immune to the status effect we're trying to apply. Returns TRUE if it is, FALSE if it isn't. +/datum/status_effect/fire_handler/proc/check_basic_mob_immunity(mob/living/basic/basic_owner) + return (basic_owner.basic_mob_flags & FLAMMABLE_MOB) + /** * Refresher for mob's fire_stacks */ @@ -287,3 +290,6 @@ if(particle_effect) return particle_effect = new(owner, /particles/droplets) + +/datum/status_effect/fire_handler/wet_stacks/check_basic_mob_immunity(mob/living/basic/basic_owner) + return !(basic_owner.basic_mob_flags & IMMUNE_TO_GETTING_WET) From 9b361401eba59330cc4aa89978a3fbc4cdb20256 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 13 Mar 2024 07:49:25 +1300 Subject: [PATCH 09/75] Automatic changelog for PR #81927 [ci skip] --- html/changelogs/AutoChangeLog-pr-81927.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81927.yml diff --git a/html/changelogs/AutoChangeLog-pr-81927.yml b/html/changelogs/AutoChangeLog-pr-81927.yml new file mode 100644 index 0000000000000..8b75f03b828c6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81927.yml @@ -0,0 +1,4 @@ +author: "san7890" +delete-after: True +changes: + - bugfix: "All basic mobs are able to get wet. This means, among other things, that you can clear the \"slimed\" status effect off your holoparasite or dog or whatever." \ No newline at end of file From 1719ad8deb66b04f195e37d38c57d8257869e36f Mon Sep 17 00:00:00 2001 From: Interception&? <137328283+intercepti0n@users.noreply.github.com> Date: Wed, 13 Mar 2024 00:16:28 +0300 Subject: [PATCH 10/75] Sticker resprite and rewrite (#81893) Stealing from Goon is bad, but stickers are actually a good feature, and loosing those will be a disappointment. This project aims to recreate 'em from scratch without using Jimmyl's and Goon's code. Also, suspicious icons were resprited and renamed. --- code/datums/components/attached_sticker.dm | 78 ------- code/datums/components/sticker.dm | 111 ++++++++++ code/datums/elements/sticker.dm | 53 ----- code/game/atom/atom_tool_acts.dm | 10 +- code/game/objects/items/sticker.dm | 131 ------------ code/game/objects/items/stickers.dm | 195 ++++++++++++++++++ .../items/storage/boxes/service_boxes.dm | 17 +- .../game/objects/items/storage/uplink_kits.dm | 1 + code/modules/cargo/packs/costumes_toys.dm | 3 +- icons/obj/toys/stickers.dmi | Bin 7392 -> 7280 bytes tgstation.dme | 5 +- 11 files changed, 327 insertions(+), 277 deletions(-) delete mode 100644 code/datums/components/attached_sticker.dm create mode 100644 code/datums/components/sticker.dm delete mode 100644 code/datums/elements/sticker.dm delete mode 100644 code/game/objects/items/sticker.dm create mode 100644 code/game/objects/items/stickers.dm diff --git a/code/datums/components/attached_sticker.dm b/code/datums/components/attached_sticker.dm deleted file mode 100644 index 49541a6b37c47..0000000000000 --- a/code/datums/components/attached_sticker.dm +++ /dev/null @@ -1,78 +0,0 @@ -// The attached sticker - -/datum/component/attached_sticker - dupe_mode = COMPONENT_DUPE_ALLOWED - ///The overlay we apply to things we stick to - var/mutable_appearance/sticker_overlay - ///The turf our COMSIG_TURF_EXPOSE is registered to, so we can unregister it later. - var/turf/signal_turf - ///Our physical sticker to drop - var/obj/item/sticker - ///Can we be washed off? - var/washable = TRUE - -/datum/component/attached_sticker/Initialize(px, py, obj/stick, mob/living/user, cleanable=TRUE) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - washable = cleanable - var/atom/atom_parent = parent - sticker = stick - sticker_overlay = mutable_appearance(stick.icon, stick.icon_state , layer = atom_parent.layer + 1, appearance_flags = RESET_COLOR | PIXEL_SCALE) - sticker_overlay.pixel_x = px - sticker_overlay.pixel_y = py - atom_parent.add_overlay(sticker_overlay) - if(isliving(parent) && user) - var/mob/living/victim = parent - if(victim.client) - user.log_message("stuck [sticker] to [key_name(victim)]", LOG_ATTACK) - victim.log_message("had [sticker] stuck to them by [key_name(user)]", LOG_ATTACK) - else if(isturf(parent) && (sticker.resistance_flags & FLAMMABLE)) - //register signals on the users turf instead because we can assume they are on flooring sticking it to a wall so it should burn (otherwise it would fruitlessly check wall temperature) - signal_turf = (user && isclosedturf(parent)) ? get_turf(user) : parent - RegisterSignal(signal_turf, COMSIG_TURF_EXPOSE, PROC_REF(on_turf_expose)) - sticker.moveToNullspace() - RegisterSignal(sticker, COMSIG_QDELETING, PROC_REF(peel)) - -/datum/component/attached_sticker/Destroy() - var/atom/as_atom = parent - as_atom.cut_overlay(sticker_overlay) - sticker_overlay = null - if(sticker) - QDEL_NULL(sticker) - return ..() - -///Move sticker item from nullspace, delete this component, cut overlay -/datum/component/attached_sticker/proc/peel(atom/source) - SIGNAL_HANDLER - if(!QDELETED(sticker)) - var/atom/as_atom = parent - sticker.forceMove(isturf(as_atom) ? as_atom : as_atom.drop_location()) - sticker.pixel_y = rand(-4,1) - sticker.pixel_x = rand(-3,3) - sticker = null - if(!QDELETED(src)) - qdel(src) - -/datum/component/attached_sticker/RegisterWithParent() - if(sticker.resistance_flags & FLAMMABLE) - RegisterSignal(parent, COMSIG_LIVING_IGNITED, PROC_REF(peel)) - if(washable) - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(peel)) - RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(peel)) - ADD_TRAIT(parent, TRAIT_STICKERED, REF(sticker)) - -/datum/component/attached_sticker/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_LIVING_IGNITED, COMSIG_QDELETING)) - if(signal_turf) - UnregisterSignal(signal_turf, COMSIG_TURF_EXPOSE) - signal_turf = null - if(washable) - UnregisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT) - REMOVE_TRAIT(parent, TRAIT_STICKERED, REF(sticker)) - -///Signal handler for COMSIG_TURF_EXPOSE, deletes this sticker if the temperature is above 100C and it is flammable -/datum/component/attached_sticker/proc/on_turf_expose(datum/source, datum/gas_mixture/air, exposed_temperature) - SIGNAL_HANDLER - if(exposed_temperature <= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - return - peel() diff --git a/code/datums/components/sticker.dm b/code/datums/components/sticker.dm new file mode 100644 index 0000000000000..0562f6048077e --- /dev/null +++ b/code/datums/components/sticker.dm @@ -0,0 +1,111 @@ +/** + * ### Sticker component + * + * Component that draws supplied atom's icon over parent object with specified offset, + * icon centering is handled inside. + */ +/datum/component/sticker + dupe_mode = COMPONENT_DUPE_ALLOWED + + /// Either `turf` or `null`, used to connect to `COMSIG_TURF_EXPOSE` signal when parent is a turf. + var/turf/listening_turf + /// Refernce to a "stickered" atom. + var/atom/movable/our_sticker + /// Reference to the created overlay, used during component deletion. + var/mutable_appearance/sticker_overlay + +/datum/component/sticker/Initialize(atom/stickering_atom, mob/user, dir = NORTH, px = 0, py = 0) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + src.our_sticker = our_sticker + + if(isliving(parent) && !isnull(user)) + var/mob/living/victim = parent + + if(!isnull(victim.client)) + user.log_message("stuck [stickering_atom] to [key_name(victim)]", LOG_ATTACK) + victim.log_message("had [stickering_atom] stuck to them by [key_name(user)]", LOG_ATTACK) + + stick(stickering_atom, px, py) + register_turf_signals(dir) + +/datum/component/sticker/Destroy(force) + var/atom/parent_atom = parent + parent_atom.cut_overlay(sticker_overlay) + + unregister_turf_signals() + + REMOVE_TRAIT(parent, TRAIT_STICKERED, REF(src)) + + QDEL_NULL(our_sticker) + QDEL_NULL(sticker_overlay) + return ..() + +/datum/component/sticker/RegisterWithParent() + if(isliving(parent)) + RegisterSignal(parent, COMSIG_LIVING_IGNITED, PROC_REF(on_ignite)) + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_clean)) + +/datum/component/sticker/UnregisterFromParent() + if(isliving(parent)) + UnregisterSignal(parent, COMSIG_LIVING_IGNITED) + UnregisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT) + +/// Subscribes to `COMSIG_TURF_EXPOSE` if parent atom is a turf. If turf is closed - subscribes to signal +/datum/component/sticker/proc/register_turf_signals(dir) + if(!isturf(parent)) + return + + listening_turf = isclosedturf(parent) ? get_step(parent, dir) : parent + RegisterSignal(listening_turf, COMSIG_TURF_EXPOSE, PROC_REF(on_turf_expose)) + +/// Unsubscribes from `COMSIG_TURF_EXPOSE` if `listening_turf` is not `null`. +/datum/component/sticker/proc/unregister_turf_signals() + if(isnull(listening_turf)) + return + + UnregisterSignal(listening_turf, COMSIG_TURF_EXPOSE) + +/// Handles overlay creation from supplied atom, adds created icon to the parent object, moves source atom to the nullspace. +/datum/component/sticker/proc/stick(atom/movable/stickering_atom, px, py) + our_sticker = stickering_atom + our_sticker.moveToNullspace() + + var/atom/parent_atom = parent + + sticker_overlay = mutable_appearance(icon = our_sticker.icon, icon_state = our_sticker.icon_state, layer = parent_atom.layer + 0.01, appearance_flags = RESET_COLOR) + sticker_overlay.pixel_w = px - world.icon_size / 2 + sticker_overlay.pixel_z = py - world.icon_size / 2 + + parent_atom.add_overlay(sticker_overlay) + + ADD_TRAIT(parent, TRAIT_STICKERED, REF(src)) + +/// Moves stickered atom from the nullspace, deletes component. +/datum/component/sticker/proc/peel() + var/atom/parent_atom = parent + var/turf/drop_location = isnull(listening_turf) ? parent_atom.drop_location() : listening_turf + + our_sticker.forceMove(drop_location) + our_sticker = null + + qdel(src) + +/datum/component/sticker/proc/on_ignite(datum/source) + SIGNAL_HANDLER + + qdel(src) + +/datum/component/sticker/proc/on_clean(datum/source, clean_types) + SIGNAL_HANDLER + + peel() + + return COMPONENT_CLEANED + +/datum/component/sticker/proc/on_turf_expose(datum/source, datum/gas_mixture/air, exposed_temperature) + SIGNAL_HANDLER + + if(exposed_temperature >= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + qdel(src) diff --git a/code/datums/elements/sticker.dm b/code/datums/elements/sticker.dm deleted file mode 100644 index 3cc8e977daf20..0000000000000 --- a/code/datums/elements/sticker.dm +++ /dev/null @@ -1,53 +0,0 @@ -#define MAX_ALLOWED_STICKERS 12 - -/datum/element/sticker - ///The typepath for our attached sticker component - var/stick_type = /datum/component/attached_sticker - ///If TRUE, our attached_sticker can be washed off - var/washable = TRUE - -/datum/element/sticker/Attach(datum/target, sticker_type, cleanable=TRUE) - . = ..() - if(!isitem(target)) - return ELEMENT_INCOMPATIBLE - RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_afterattack)) - RegisterSignal(target, COMSIG_MOVABLE_IMPACT, PROC_REF(on_throw_impact)) - if(sticker_type) - stick_type = sticker_type - washable = cleanable - -/datum/element/sticker/Detach(datum/source) - . = ..() - UnregisterSignal(source, list(COMSIG_ITEM_AFTERATTACK, COMSIG_MOVABLE_IMPACT)) - -/datum/element/sticker/proc/on_afterattack(obj/item/source, atom/target, mob/living/user, prox, params) - SIGNAL_HANDLER - if(!prox) - return - if(!isatom(target)) - return - var/list/parameters = params2list(params) - if(!LAZYACCESS(parameters, ICON_X) || !LAZYACCESS(parameters, ICON_Y)) - return - var/divided_size = world.icon_size / 2 - var/px = text2num(LAZYACCESS(parameters, ICON_X)) - divided_size - var/py = text2num(LAZYACCESS(parameters, ICON_Y)) - divided_size - - user.do_attack_animation(target) - if(do_stick(source, target, user, px, py)) - target.balloon_alert_to_viewers("sticker sticked") - -///Add our stick_type to the target with px and py as pixel x and pixel y respectively -/datum/element/sticker/proc/do_stick(obj/item/source, atom/target, mob/living/user, px, py) - if(COUNT_TRAIT_SOURCES(target, TRAIT_STICKERED) >= MAX_ALLOWED_STICKERS) - source.balloon_alert_to_viewers("sticker won't stick!") - return FALSE - target.AddComponent(stick_type, px, py, source, user, washable) - return TRUE - -/datum/element/sticker/proc/on_throw_impact(obj/item/source, atom/hit_atom, datum/thrownthing/throwingdatum) - SIGNAL_HANDLER - if(prob(50) && do_stick(source, hit_atom, null, rand(-7,7), rand(-7,7))) - hit_atom.balloon_alert_to_viewers("sticker landed on sticky side!") - -#undef MAX_ALLOWED_STICKERS diff --git a/code/game/atom/atom_tool_acts.dm b/code/game/atom/atom_tool_acts.dm index 22aef1a54ae0f..c8dfd36772b14 100644 --- a/code/game/atom/atom_tool_acts.dm +++ b/code/game/atom/atom_tool_acts.dm @@ -25,8 +25,8 @@ return early_sig_return var/interact_return = is_left_clicking \ - ? tool.interact_with_atom(src, user) \ - : tool.interact_with_atom_secondary(src, user) + ? tool.interact_with_atom(src, user, modifiers) \ + : tool.interact_with_atom_secondary(src, user, modifiers) if(interact_return) return interact_return @@ -82,7 +82,7 @@ * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code. * Return NONE to allow default interaction / tool handling. */ -/obj/item/proc/interact_with_atom(atom/interacting_with, mob/living/user) +/obj/item/proc/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) return NONE /** @@ -94,8 +94,8 @@ * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code. * Return NONE to allow default interaction / tool handling. */ -/obj/item/proc/interact_with_atom_secondary(atom/interacting_with, mob/living/user) - return interact_with_atom(interacting_with, user) +/obj/item/proc/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + return interact_with_atom(interacting_with, user, modifiers) /* * Tool-specific behavior procs. diff --git a/code/game/objects/items/sticker.dm b/code/game/objects/items/sticker.dm deleted file mode 100644 index 459c8d211e4d9..0000000000000 --- a/code/game/objects/items/sticker.dm +++ /dev/null @@ -1,131 +0,0 @@ -/// parent type for all other stickers. do not spawn directly -/obj/item/sticker - name = "sticker" - desc = "A sticker with some strong adhesive on the back, sticks to stuff!" - item_flags = NOBLUDGEON | XENOMORPH_HOLDABLE //funny - resistance_flags = FLAMMABLE - icon = 'icons/obj/toys/stickers.dmi' - w_class = WEIGHT_CLASS_TINY - throw_range = 3 - vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE | VIS_INHERIT_LAYER - ///If not null, pick an icon_state from this list - var/icon_states - /// If the sticker should be disincluded from normal sticker boxes. - var/contraband = FALSE - -/obj/item/sticker/Initialize(mapload) - . = ..() - if(icon_states) - icon_state = pick(icon_states) - pixel_y = rand(-3,3) - pixel_x = rand(-3,3) - AddElement(/datum/element/sticker) - -/obj/item/sticker/smile - name = "smiley sticker" - icon_state = "smile" - -/obj/item/sticker/frown - name = "frowny sticker" - icon_state = "frown" - -/obj/item/sticker/left_arrow - name = "left arrow sticker" - icon_state = "larrow" - -/obj/item/sticker/right_arrow - name = "right arrow sticker" - icon_state = "rarrow" - -/obj/item/sticker/star - name = "star sticker" - icon_state = "star1" - icon_states = list("star1","star2") - -/obj/item/sticker/heart - name = "heart sticker" - icon_state = "heart" - -/obj/item/sticker/googly - name = "googly eye sticker" - icon_state = "googly1" - icon_states = list("googly1","googly2") - -/obj/item/sticker/rev - name = "blue R sticker" - desc = "A sticker of FUCK THE SYSTEM, the galaxy's premiere hardcore punk band." - icon_state = "revhead" - -/obj/item/sticker/pslime - name = "slime plushie sticker" - icon_state = "pslime" - -/obj/item/sticker/pliz - name = "lizard plushie sticker" - icon_state = "plizard" - -/obj/item/sticker/pbee - name = "bee plushie sticker" - icon_state = "pbee" - -/obj/item/sticker/psnake - name = "snake plushie sticker" - icon_state = "psnake" - -/obj/item/sticker/robot - name = "bot sticker" - icon_state = "tile" - icon_states = list("tile","medbot","clean") - -/obj/item/sticker/toolbox - name = "toolbox sticker" - icon_state = "toolbox" - -/obj/item/sticker/clown - name = "clown sticker" - icon_state = "honkman" - -/obj/item/sticker/mime - name = "mime sticker" - icon_state = "silentman" - -/obj/item/sticker/assistant - name = "assistant sticker" - icon_state = "tider" - -/obj/item/sticker/syndicate - name = "syndicate sticker" - icon_state = "synd" - contraband = TRUE - -/obj/item/sticker/syndicate/c4 - name = "C-4 sticker" - icon_state = "c4" - -/obj/item/sticker/syndicate/bomb - name = "syndicate bomb sticker" - icon_state = "sbomb" - -/obj/item/sticker/syndicate/apc - name = "broken APC sticker" - icon_state = "milf" - -/obj/item/sticker/syndicate/larva - name = "larva sticker" - icon_state = "larva" - -/obj/item/sticker/syndicate/cult - name = "bloody paper sticker" - icon_state = "cult" - -/obj/item/sticker/syndicate/flash - name = "flash sticker" - icon_state = "flash" - -/obj/item/sticker/syndicate/op - name = "operative sticker" - icon_state = "newcop" - -/obj/item/sticker/syndicate/trap - name = "bear trap sticker" - icon_state = "trap" diff --git a/code/game/objects/items/stickers.dm b/code/game/objects/items/stickers.dm new file mode 100644 index 0000000000000..c7288bed2dd5f --- /dev/null +++ b/code/game/objects/items/stickers.dm @@ -0,0 +1,195 @@ +#define MAX_STICKER_COUNT 15 + +/** + * What stickers can do? + * + * - They can be attached to any object. + * - They inherit cursor position when attached. + * - They are unclickable by mouse, I suppose? + * - They can be washed off. + * - They can be burnt off. + * - They can be attached to the object they collided with. + * - They play "attack" animation when attached. + * + */ + +/obj/item/sticker + name = "sticker" + desc = "A sticker with some strong adhesive on the back, sticks to stuff!" + + icon = 'icons/obj/toys/stickers.dmi' + + max_integrity = 50 + resistance_flags = FLAMMABLE + + throw_range = 3 + pressure_resistance = 0 + + item_flags = NOBLUDGEON | XENOMORPH_HOLDABLE //funny ~Jimmyl + w_class = WEIGHT_CLASS_TINY + + /// `list` or `null`, contains possible alternate `icon_states`. + var/list/icon_states + /// Whether sticker is legal and allowed to generate inside non-syndicate boxes. + var/contraband = FALSE + +/obj/item/sticker/Initialize(mapload) + . = ..() + + if(length(icon_states)) + icon_state = pick(icon_states) + +/obj/item/sticker/Bump(atom/bumped_atom) + if(prob(50) && attempt_attach(bumped_atom)) + bumped_atom.balloon_alert_to_viewers("sticker landed on sticky side!") + +/obj/item/sticker/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!isatom(interacting_with)) + return NONE + + var/cursor_x = text2num(LAZYACCESS(modifiers, ICON_X)) + var/cursor_y = text2num(LAZYACCESS(modifiers, ICON_Y)) + + if(isnull(cursor_x) || isnull(cursor_y)) + return NONE + + if(attempt_attach(interacting_with, user, cursor_x, cursor_y)) + return ITEM_INTERACT_SUCCESS + + return NONE + +/** + * Attempts to attach sticker to an object. Returns `FALSE` if atom has more than + * `MAX_STICKER_COUNT` stickers, `TRUE` otherwise. If no `px` or `py` were passed + * picks random coordinates based on a `target`'s icon. + */ +/obj/item/sticker/proc/attempt_attach(atom/target, mob/user, px, py) + if(COUNT_TRAIT_SOURCES(target, TRAIT_STICKERED) >= MAX_STICKER_COUNT) + balloon_alert_to_viewers("sticker won't stick!") + return FALSE + + if(isnull(px) || isnull(py)) + var/icon/target_mask = icon(target.icon, target.icon_state) + + if(isnull(px)) + px = rand(1, target_mask.Width()) + + if(isnull(py)) + py = rand(1, target_mask.Height()) + + if(!isnull(user)) + user.do_attack_animation(target, used_item = src) + target.balloon_alert(user, "sticker sticked") + + target.AddComponent(/datum/component/sticker, src, user, get_dir(target, src), px, py) + return TRUE + +#undef MAX_STICKER_COUNT + +/obj/item/sticker/smile + name = "smiley sticker" + icon_state = "smile" + +/obj/item/sticker/frown + name = "frowny sticker" + icon_state = "frown" + +/obj/item/sticker/left_arrow + name = "left arrow sticker" + icon_state = "arrow-left" + +/obj/item/sticker/right_arrow + name = "right arrow sticker" + icon_state = "arrow-right" + +/obj/item/sticker/star + name = "star sticker" + icon_state = "star" + +/obj/item/sticker/heart + name = "heart sticker" + icon_state = "heart" + +/obj/item/sticker/googly + name = "googly eye sticker" + icon_state = "googly" + icon_states = list("googly", "googly-alt") + +/obj/item/sticker/rev + name = "blue R sticker" + desc = "A sticker of FUCK THE SYSTEM, the galaxy's premiere hardcore punk band." + icon_state = "revhead" + +/obj/item/sticker/pslime + name = "slime plushie sticker" + icon_state = "pslime" + +/obj/item/sticker/pliz + name = "lizard plushie sticker" + icon_state = "plizard" + +/obj/item/sticker/pbee + name = "bee plushie sticker" + icon_state = "pbee" + +/obj/item/sticker/psnake + name = "snake plushie sticker" + icon_state = "psnake" + +/obj/item/sticker/robot + name = "bot sticker" + icon_state = "tile" + icon_states = list("tile", "medbot", "clean") + +/obj/item/sticker/toolbox + name = "toolbox sticker" + icon_state = "soul" + +/obj/item/sticker/clown + name = "clown sticker" + icon_state = "honkman" + +/obj/item/sticker/mime + name = "mime sticker" + icon_state = "silentman" + +/obj/item/sticker/assistant + name = "assistant sticker" + icon_state = "tider" + +/obj/item/sticker/syndicate + name = "syndicate sticker" + icon_state = "synd" + contraband = TRUE + +/obj/item/sticker/syndicate/c4 + name = "C-4 sticker" + icon_state = "c4" + +/obj/item/sticker/syndicate/bomb + name = "syndicate bomb sticker" + icon_state = "sbomb" + +/obj/item/sticker/syndicate/apc + name = "broken APC sticker" + icon_state = "milf" + +/obj/item/sticker/syndicate/larva + name = "larva sticker" + icon_state = "larva" + +/obj/item/sticker/syndicate/cult + name = "bloody paper sticker" + icon_state = "cult" + +/obj/item/sticker/syndicate/flash + name = "flash sticker" + icon_state = "flash" + +/obj/item/sticker/syndicate/op + name = "operative sticker" + icon_state = "newcop" + +/obj/item/sticker/syndicate/trap + name = "bear trap sticker" + icon_state = "trap" diff --git a/code/game/objects/items/storage/boxes/service_boxes.dm b/code/game/objects/items/storage/boxes/service_boxes.dm index 14656f0f5f71d..8dcc1f4f6b62f 100644 --- a/code/game/objects/items/storage/boxes/service_boxes.dm +++ b/code/game/objects/items/storage/boxes/service_boxes.dm @@ -209,16 +209,21 @@ desc = "A box full of random stickers. Do give to the clown." /obj/item/storage/box/stickers/proc/generate_non_contraband_stickers_list() - . = list() + var/list/allowed_stickers = list() + for(var/obj/item/sticker/sticker_type as anything in subtypesof(/obj/item/sticker)) - if(!initial(sticker_type.contraband)) - . += sticker_type - return . + if(!sticker_type::contraband) + allowed_stickers += sticker_type + + return allowed_stickers + /obj/item/storage/box/stickers/PopulateContents() var/static/list/non_contraband - if(!non_contraband) + + if(isnull(non_contraband)) non_contraband = generate_non_contraband_stickers_list() - for(var/i in 1 to rand(4,8)) + + for(var/i in 1 to rand(4, 8)) var/type = pick(non_contraband) new type(src) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 217a07500064d..aaff0fb70ce31 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -674,6 +674,7 @@ /obj/item/storage/box/syndie_kit/stickers/PopulateContents() var/list/types = subtypesof(/obj/item/sticker/syndicate) + for(var/i in 1 to atom_storage.max_slots) var/type = pick(types) new type(src) diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm index 51fb4686038f5..e23e6112a4bfc 100644 --- a/code/modules/cargo/packs/costumes_toys.dm +++ b/code/modules/cargo/packs/costumes_toys.dm @@ -250,8 +250,9 @@ discountable = SUPPLY_PACK_STD_DISCOUNTABLE /datum/supply_pack/costumes_toys/stickers/fill(obj/structure/closet/crate/crate) - for(var/i in 1 to rand(1,2)) + for(var/i in 1 to rand(1, 2)) new /obj/item/storage/box/stickers(crate) + if(prob(30)) // a pair of googly eyes because funny new /obj/item/storage/box/stickers/googly(crate) diff --git a/icons/obj/toys/stickers.dmi b/icons/obj/toys/stickers.dmi index ddc759fe0e3ddbf04fe443c48c6d6d0d48500539..8189890ecbd330369b96b661565ebf760830c4fa 100644 GIT binary patch literal 7280 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 literal 7392 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 Ang9R* diff --git a/tgstation.dme b/tgstation.dme index e5cf4b5480021..6b5397a67a3cc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1009,7 +1009,6 @@ #include "code\datums\components\areabound.dm" #include "code\datums\components\armor_plate.dm" #include "code\datums\components\atmos_reaction_recorder.dm" -#include "code\datums\components\attached_sticker.dm" #include "code\datums\components\aura_healing.dm" #include "code\datums\components\bakeable.dm" #include "code\datums\components\basic_inhands.dm" @@ -1191,6 +1190,7 @@ #include "code\datums\components\squeak.dm" #include "code\datums\components\stationloving.dm" #include "code\datums\components\stationstuck.dm" +#include "code\datums\components\sticker.dm" #include "code\datums\components\storm_hating.dm" #include "code\datums\components\strong_pull.dm" #include "code\datums\components\subtype_picker.dm" @@ -1473,7 +1473,6 @@ #include "code\datums\elements\spooky.dm" #include "code\datums\elements\squish.dm" #include "code\datums\elements\squish_sound.dm" -#include "code\datums\elements\sticker.dm" #include "code\datums\elements\strippable.dm" #include "code\datums\elements\structure_repair.dm" #include "code\datums\elements\swabbable.dm" @@ -2292,7 +2291,7 @@ #include "code\game\objects\items\signs.dm" #include "code\game\objects\items\skub.dm" #include "code\game\objects\items\spear.dm" -#include "code\game\objects\items\sticker.dm" +#include "code\game\objects\items\stickers.dm" #include "code\game\objects\items\surgery_tray.dm" #include "code\game\objects\items\syndie_spraycan.dm" #include "code\game\objects\items\tail_pin.dm" From e1808ee1151e78685cc9e894776cb20abb2b1d4b Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Wed, 13 Mar 2024 03:09:31 +0530 Subject: [PATCH 11/75] Dynamic material colors applied for insertion animation into lathes (#81692) ## About The Pull Request So you've noticed that when we insert say uranium into a techfab it shows us the proper green sheet getting consumed as the animation but when you insert that same uranium into an autolathe is shows us a blue sheet animation instead? Yup not realistic, this is because the autolathe has only 2 animation types one for inserting iron & the other for glass. Every material type would have to share these 2 animations making it look bland. Now the material color is blended on the icon itself allowing for the right color to be applied on the insertion animation Plus this also trims the sizes of our dmi files so it's a win overall https://github.com/tgstation/tgstation/assets/110812394/bb643691-8d3b-4822-8371-346c2d5e5be3 ## Changelog :cl: fix: inserting a material sheet into an lathes should show the correct animation color /:cl: --- code/game/machinery/autolathe.dm | 15 +++++++-- code/game/objects/effects/material_insert.dm | 22 +++++++++++++ .../modules/research/machinery/_production.dm | 31 +++++++++--------- .../research/machinery/circuit_imprinter.dm | 2 +- icons/obj/machines/lathes.dmi | Bin 14139 -> 11731 bytes icons/obj/machines/research.dmi | Bin 28134 -> 23863 bytes tgstation.dme | 1 + 7 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 code/game/objects/effects/material_insert.dm diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 25dd047a69a9e..e20d53e4d315d 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -95,10 +95,19 @@ /obj/machinery/autolathe/proc/AfterMaterialInsert(container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context) SIGNAL_HANDLER - flick("autolathe_[item_inserted.has_material_type(/datum/material/glass) ? "r" : "o"]", src) - //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it - directly_use_power(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.01 * initial(active_power_usage))) + if(directly_use_power(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.02 * initial(active_power_usage)))) + flick_overlay_view(mutable_appearance('icons/obj/machines/lathes.dmi', "autolathe_mat"), 1 SECONDS) + + var/datum/material/highest_mat_ref + var/highest_mat = 0 + for(var/datum/material/mat as anything in mats_consumed) + var/present_mat = mats_consumed[mat] + if(present_mat > highest_mat) + highest_mat = present_mat + highest_mat_ref = mat + + flick_overlay_view(material_insertion_animation(highest_mat_ref.greyscale_colors), 1 SECONDS) /obj/machinery/autolathe/ui_interact(mob/user, datum/tgui/ui) if(!is_operational) diff --git a/code/game/objects/effects/material_insert.dm b/code/game/objects/effects/material_insert.dm new file mode 100644 index 0000000000000..9ca86226b24b9 --- /dev/null +++ b/code/game/objects/effects/material_insert.dm @@ -0,0 +1,22 @@ +/** + * Creates a mutable appearance with the material color applied for its insertion animation into an autolathe or techfab + * Arguments + * + * * color - the material color that will be applied + */ +/proc/material_insertion_animation(color) + RETURN_TYPE(/mutable_appearance) + + var/static/list/mutable_appearance/apps = list() + + var/mutable_appearance/cached_app = apps[color] + if(isnull(cached_app)) + var/icon/modified_icon = icon('icons/obj/machines/research.dmi', "material_insertion") + + //assuming most of the icon is white we find what ratio to scale the intensity of each part roughly + var/list/rgb_list = rgb2num(color) + modified_icon.SetIntensity(rgb_list[1] / 255, rgb_list[2] / 255, rgb_list[3] / 255) + cached_app = mutable_appearance(modified_icon, "material_insertion") + + apps[color] = cached_app + return cached_app diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index f95145b4b9406..673a0dbbac9bb 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -28,7 +28,7 @@ /datum/component/remote_materials, \ mapload, \ mat_container_signals = list( \ - COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/rnd, local_material_insert) + COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/rnd/production, local_material_insert) ) \ ) @@ -49,7 +49,6 @@ cached_designs = null return ..() - // Stuff for the stripe on the department machines /obj/machinery/rnd/production/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) . = ..() @@ -128,7 +127,7 @@ addtimer(CALLBACK(src, PROC_REF(update_designs)), 2 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) ///When materials are instered via silo link -/obj/machinery/rnd/proc/silo_material_insert(obj/machinery/rnd/machine, container, obj/item/item_inserted, last_inserted_id, list/mats_consumed, amount_inserted) +/obj/machinery/rnd/production/proc/silo_material_insert(obj/machinery/rnd/machine, container, obj/item/item_inserted, last_inserted_id, list/mats_consumed, amount_inserted) SIGNAL_HANDLER process_item(item_inserted, mats_consumed, amount_inserted) @@ -141,37 +140,39 @@ * * list/mats_consumed - list of mats consumed * * amount_inserted - amount of material actually processed */ -/obj/machinery/rnd/proc/process_item(obj/item/item_inserted, list/mats_consumed, amount_inserted) +/obj/machinery/rnd/production/proc/process_item(obj/item/item_inserted, list/mats_consumed, amount_inserted) PRIVATE_PROC(TRUE) //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it - if(directly_use_power(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.01 * initial(active_power_usage)))) - var/mat_name = "iron" + if(directly_use_power(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.02 * initial(active_power_usage)))) + var/datum/material/highest_mat_ref var/highest_mat = 0 for(var/datum/material/mat as anything in mats_consumed) var/present_mat = mats_consumed[mat] if(present_mat > highest_mat) - mat_name = initial(mat.name) - if(mat_name == "silver" || mat_name == "titanium" || mat_name == "plastic") //these materials have similar appearances so use an common overlay for them - mat_name = "shiny" highest_mat = present_mat + highest_mat_ref = mat - flick_animation(mat_name) + flick_animation(highest_mat_ref) /** * Plays an visual animation when materials are inserted * Arguments * - * * mat_name - the name of the material we are trying to animate on the machine + * * mat - the material ref we are trying to animate on the machine */ -/obj/machinery/rnd/proc/flick_animation(mat_name) +/obj/machinery/rnd/production/proc/flick_animation(datum/material/mat_ref) PROTECTED_PROC(TRUE) SHOULD_CALL_PARENT(FALSE) - flick_overlay_view(mutable_appearance('icons/obj/machines/research.dmi', "protolathe_[mat_name]"), 1 SECONDS) + //first play the insertion animation + flick_overlay_view(material_insertion_animation(mat_ref.greyscale_colors), 1 SECONDS) + + //now play the progress bar animation + flick_overlay_view(mutable_appearance('icons/obj/machines/research.dmi', "protolathe_progress"), 1 SECONDS) ///When materials are instered into local storage -/obj/machinery/rnd/proc/local_material_insert(container, obj/item/item_inserted, last_inserted_id, list/mats_consumed, amount_inserted, atom/context) +/obj/machinery/rnd/production/proc/local_material_insert(container, obj/item/item_inserted, last_inserted_id, list/mats_consumed, amount_inserted, atom/context) SIGNAL_HANDLER process_item(item_inserted, mats_consumed, amount_inserted) @@ -288,7 +289,7 @@ return //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it - if(!directly_use_power(ROUND_UP((amount / MAX_STACK_SIZE) * 0.01 * initial(active_power_usage)))) + if(!directly_use_power(ROUND_UP((amount / MAX_STACK_SIZE) * 0.02 * initial(active_power_usage)))) say("No power to dispense sheets") return diff --git a/code/modules/research/machinery/circuit_imprinter.dm b/code/modules/research/machinery/circuit_imprinter.dm index 2dcbde23663ad..c6d50f13307b5 100644 --- a/code/modules/research/machinery/circuit_imprinter.dm +++ b/code/modules/research/machinery/circuit_imprinter.dm @@ -13,7 +13,7 @@ return 0.5 ** max(rating - 1, 0) // One sheet, half sheet, quarter sheet, eighth sheet. -/obj/machinery/rnd/production/circuit_imprinter/flick_animation(mat_name) +/obj/machinery/rnd/production/circuit_imprinter/flick_animation(datum/material/mat) return //we presently have no animation /obj/machinery/rnd/production/circuit_imprinter/offstation diff --git a/icons/obj/machines/lathes.dmi b/icons/obj/machines/lathes.dmi index 1c4111303ebc0928a95a336997b1520b0bd055c8..f4bb2116b42f1a1aaa64db9f1ee97a598e2093d9 100644 GIT binary patch literal 11731 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 diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi index 544054279e97af245675d35f021ae8328d8bda33..baa4cc07225a5480944074364a2314e590cd7653 100644 GIT binary patch literal 23863 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 diff --git a/tgstation.dme b/tgstation.dme index 6b5397a67a3cc..142cfb5600209 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2113,6 +2113,7 @@ #include "code\game\objects\effects\info.dm" #include "code\game\objects\effects\landmarks.dm" #include "code\game\objects\effects\lighting.dm" +#include "code\game\objects\effects\material_insert.dm" #include "code\game\objects\effects\mines.dm" #include "code\game\objects\effects\misc.dm" #include "code\game\objects\effects\overlays.dm" From 752384296dde394b1408c99b469d60ce5fda7cd5 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 13 Mar 2024 10:39:51 +1300 Subject: [PATCH 12/75] Automatic changelog for PR #81692 [ci skip] --- html/changelogs/AutoChangeLog-pr-81692.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81692.yml diff --git a/html/changelogs/AutoChangeLog-pr-81692.yml b/html/changelogs/AutoChangeLog-pr-81692.yml new file mode 100644 index 0000000000000..06ffa693d3e80 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81692.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "inserting a material sheet into an lathes should show the correct animation color" \ No newline at end of file From 9f2d708007e5b29e7b78a2122a05f0bf242a2883 Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Tue, 12 Mar 2024 18:00:50 -0400 Subject: [PATCH 13/75] Drunk people no longer feel cold (#81939) ## About The Pull Request Simple PR, if you're drunk then you no longer feel the effects (or get the warnings) of cold temperatures. This makes things like cryosting and the coldness of space give you no warning or tell of why you're being hurt, but it also means you don't suffer its slowdown. ## Why It's Good For The Game It's a small bit of realism that doesn't do much to change the game, but gives some extra bonus/drawback to alcohol that isn't really changing the game by any means. ## Changelog :cl: JohnFulpWillard, Atlasle balance: You no longer feel cold if you're drunk. You still take damage, but get no warning or slowdown. /:cl: --- .../elements/basic_body_temp_sensitive.dm | 17 +++++++++-------- .../modules/mob/living/carbon/human/_species.dm | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/code/datums/elements/basic_body_temp_sensitive.dm b/code/datums/elements/basic_body_temp_sensitive.dm index 8e11ed92575ea..8bb1cae854631 100644 --- a/code/datums/elements/basic_body_temp_sensitive.dm +++ b/code/datums/elements/basic_body_temp_sensitive.dm @@ -47,14 +47,15 @@ if(basic_mob.bodytemperature < min_body_temp) basic_mob.adjust_health(cold_damage * seconds_per_tick) - switch(cold_damage) - if(1 to 5) - basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 1) - if(5 to 10) - basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 2) - if(10 to INFINITY) - basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 3) - gave_alert = TRUE + if(!basic_mob.has_status_effect(/datum/status_effect/inebriated)) + switch(cold_damage) + if(1 to 5) + basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 1) + if(5 to 10) + basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 2) + if(10 to INFINITY) + basic_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 3) + gave_alert = TRUE else if(basic_mob.bodytemperature > max_body_temp) basic_mob.adjust_health(heat_damage * seconds_per_tick) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 7c8b6e9d23799..8a81f9ddef583 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1384,7 +1384,7 @@ GLOBAL_LIST_EMPTY(features_by_species) humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 3) // Body temperature is too cold, and we do not have resist traits - else if(bodytemp < bodytemp_cold_damage_limit && !HAS_TRAIT(humi, TRAIT_RESISTCOLD)) + else if(bodytemp < bodytemp_cold_damage_limit && !HAS_TRAIT(humi, TRAIT_RESISTCOLD) && !humi.has_status_effect(/datum/status_effect/inebriated)) // clear any hot moods and apply cold mood humi.clear_mood_event("hot") humi.add_mood_event("cold", /datum/mood_event/cold) From 5e0f657c9244cfc36f579cb3f8da3b0ba3fa7e90 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 13 Mar 2024 11:01:08 +1300 Subject: [PATCH 14/75] Automatic changelog for PR #81939 [ci skip] --- html/changelogs/AutoChangeLog-pr-81939.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81939.yml diff --git a/html/changelogs/AutoChangeLog-pr-81939.yml b/html/changelogs/AutoChangeLog-pr-81939.yml new file mode 100644 index 0000000000000..b663519b2c7be --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81939.yml @@ -0,0 +1,4 @@ +author: "JohnFulpWillard, Atlasle" +delete-after: True +changes: + - balance: "You no longer feel cold if you're drunk. You still take damage, but get no warning or slowdown." \ No newline at end of file From 5161e8019a26a605236a2f1ff53a3c494e463dca Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 13 Mar 2024 00:19:23 +0000 Subject: [PATCH 15/75] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-81692.yml | 4 --- html/changelogs/AutoChangeLog-pr-81815.yml | 4 --- html/changelogs/AutoChangeLog-pr-81881.yml | 4 --- html/changelogs/AutoChangeLog-pr-81883.yml | 4 --- html/changelogs/AutoChangeLog-pr-81895.yml | 4 --- html/changelogs/AutoChangeLog-pr-81904.yml | 4 --- html/changelogs/AutoChangeLog-pr-81927.yml | 4 --- html/changelogs/AutoChangeLog-pr-81932.yml | 4 --- html/changelogs/AutoChangeLog-pr-81936.yml | 4 --- html/changelogs/AutoChangeLog-pr-81939.yml | 4 --- html/changelogs/AutoChangeLog-pr-81942.yml | 4 --- html/changelogs/archive/2024-03.yml | 29 ++++++++++++++++++++++ 12 files changed, 29 insertions(+), 44 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-81692.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81815.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81881.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81883.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81895.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81904.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81927.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81932.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81936.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81939.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81942.yml diff --git a/html/changelogs/AutoChangeLog-pr-81692.yml b/html/changelogs/AutoChangeLog-pr-81692.yml deleted file mode 100644 index 06ffa693d3e80..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81692.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "inserting a material sheet into an lathes should show the correct animation color" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81815.yml b/html/changelogs/AutoChangeLog-pr-81815.yml deleted file mode 100644 index 4664f0eac4f7b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81815.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "EEASAS" -delete-after: True -changes: - - rscadd: "New Lizard's Gas ruin, this time in lavaland" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81881.yml b/html/changelogs/AutoChangeLog-pr-81881.yml deleted file mode 100644 index f985d0920d9d8..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81881.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "vinylspiders" -delete-after: True -changes: - - bugfix: "fixes a spurious CI runtime caused by explosive mines quite literally blowing up the unit test area" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81883.yml b/html/changelogs/AutoChangeLog-pr-81883.yml deleted file mode 100644 index c0db0d05a8bb4..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81883.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Silicons can use asterisks in binary without fear of saying something interesting." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81895.yml b/html/changelogs/AutoChangeLog-pr-81895.yml deleted file mode 100644 index 14f537772f549..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81895.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "The museum piggy bank now spawns with at least 400 creds in it." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81904.yml b/html/changelogs/AutoChangeLog-pr-81904.yml deleted file mode 100644 index a3ea299bb053f..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81904.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Iajret" -delete-after: True -changes: - - bugfix: "As a borg you shouldn't be able to resist from grab while locked down" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81927.yml b/html/changelogs/AutoChangeLog-pr-81927.yml deleted file mode 100644 index 8b75f03b828c6..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81927.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "san7890" -delete-after: True -changes: - - bugfix: "All basic mobs are able to get wet. This means, among other things, that you can clear the \"slimed\" status effect off your holoparasite or dog or whatever." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81932.yml b/html/changelogs/AutoChangeLog-pr-81932.yml deleted file mode 100644 index a4216a6e6162e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81932.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Vermidia" -delete-after: True -changes: - - bugfix: "Doors with ID scan disabled will no longer open when an ID is thrown at them" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81936.yml b/html/changelogs/AutoChangeLog-pr-81936.yml deleted file mode 100644 index 2a1da861ad4a9..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81936.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Some things which should pacify people (but aren't) now will properly, like hypnoflash" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81939.yml b/html/changelogs/AutoChangeLog-pr-81939.yml deleted file mode 100644 index b663519b2c7be..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81939.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "JohnFulpWillard, Atlasle" -delete-after: True -changes: - - balance: "You no longer feel cold if you're drunk. You still take damage, but get no warning or slowdown." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81942.yml b/html/changelogs/AutoChangeLog-pr-81942.yml deleted file mode 100644 index f35d8802f4bbf..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81942.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ArcaneMusic" -delete-after: True -changes: - - bugfix: "The black market illegal fish case now correctly initializes." \ No newline at end of file diff --git a/html/changelogs/archive/2024-03.yml b/html/changelogs/archive/2024-03.yml index 525e488b3af9a..36bb09aecc786 100644 --- a/html/changelogs/archive/2024-03.yml +++ b/html/changelogs/archive/2024-03.yml @@ -353,3 +353,32 @@ - code_imp: autodoc procs & vars for the grill (the machine for grilling food) - refactor: grills (the machine for grilling food) has been refactored. report bugs on github, also they only start processing after putting food/fuel into them. +2024-03-13: + ArcaneMusic: + - bugfix: The black market illegal fish case now correctly initializes. + EEASAS: + - rscadd: New Lizard's Gas ruin, this time in lavaland + Ghommie: + - bugfix: The museum piggy bank now spawns with at least 400 creds in it. + Iajret: + - bugfix: As a borg you shouldn't be able to resist from grab while locked down + JohnFulpWillard, Atlasle: + - balance: You no longer feel cold if you're drunk. You still take damage, but get + no warning or slowdown. + Melbert: + - bugfix: Some things which should pacify people (but aren't) now will properly, + like hypnoflash + - bugfix: Silicons can use asterisks in binary without fear of saying something + interesting. + SyncIt21: + - bugfix: inserting a material sheet into an lathes should show the correct animation + color + Vermidia: + - bugfix: Doors with ID scan disabled will no longer open when an ID is thrown at + them + san7890: + - bugfix: All basic mobs are able to get wet. This means, among other things, that + you can clear the "slimed" status effect off your holoparasite or dog or whatever. + vinylspiders: + - bugfix: fixes a spurious CI runtime caused by explosive mines quite literally + blowing up the unit test area From c2ceb705e176b155c220a573546f317f61e1c5f5 Mon Sep 17 00:00:00 2001 From: starrm4nn <139372157+starrm4nn@users.noreply.github.com> Date: Wed, 13 Mar 2024 02:01:33 +0000 Subject: [PATCH 16/75] Makes Ephedrine not give spasms when holding a small or tiny item in your active hand, Also makes the movement speed scale with purity (#81773) ## About The Pull Request Makes Ephedrine not drop small and tiny items, Also makes the movement speed scale with purity ## Why It's Good For The Game Ephedrine right now is really hard to use as an escape tool cause you drop things usually escaped for running away like tools, teleporters etc, This makes it better as a tool for that without making it too powerful for combat, Also makes movement speed scale with purity to make it more meaningful ## Changelog :cl: balance: Ephedrine spasms won't affect small or tiny items balance: Ephedrine's movement speed bonus now scales with purity. /:cl: --------- Co-authored-by: Aki Ito <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com> --- code/modules/movespeed/modifiers/reagent.dm | 3 ++- .../reagents/chemistry/reagents/medicine_reagents.dm | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/code/modules/movespeed/modifiers/reagent.dm b/code/modules/movespeed/modifiers/reagent.dm index 6700854b11dd5..55726363310b1 100644 --- a/code/modules/movespeed/modifiers/reagent.dm +++ b/code/modules/movespeed/modifiers/reagent.dm @@ -5,7 +5,8 @@ multiplicative_slowdown = -0.55 /datum/movespeed_modifier/reagent/ephedrine - multiplicative_slowdown = -0.5 + variable = TRUE + // speed is based on purity of the reagent at the time of metabolization /datum/movespeed_modifier/reagent/pepperspray multiplicative_slowdown = 0.25 diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index d2bc311579b89..f883c819e69b5 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -586,6 +586,8 @@ /datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/affected_mob) . = ..() affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) + var/purity_movespeed_accounting = -0.375 * normalise_creation_purity() + affected_mob.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine, TRUE, purity_movespeed_accounting) /datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/affected_mob) . = ..() @@ -593,14 +595,15 @@ /datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(SPT_PROB(10 * (1.5-creation_purity), seconds_per_tick) && iscarbon(affected_mob)) - var/obj/item/I = affected_mob.get_active_held_item() - if(I && affected_mob.dropItemToGround(I)) + var/obj/item/active_held_item = affected_mob.get_active_held_item() + if(SPT_PROB(10 * (1.5-creation_purity), seconds_per_tick) && iscarbon(affected_mob) && active_held_item?.w_class > WEIGHT_CLASS_SMALL) + if(active_held_item && affected_mob.dropItemToGround(active_held_item)) to_chat(affected_mob, span_notice("Your hands spaz out and you drop what you were holding!")) affected_mob.set_jitter_if_lower(20 SECONDS) affected_mob.AdjustAllImmobility(-20 * REM * seconds_per_tick * normalise_creation_purity()) affected_mob.adjustStaminaLoss(-1 * REM * seconds_per_tick * normalise_creation_purity(), updating_stamina = FALSE) + return UPDATE_MOB_HEALTH /datum/reagent/medicine/ephedrine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) From 3708ba1be300d27323e2197e8046ec8eee357951 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 13 Mar 2024 15:01:54 +1300 Subject: [PATCH 17/75] Automatic changelog for PR #81773 [ci skip] --- html/changelogs/AutoChangeLog-pr-81773.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81773.yml diff --git a/html/changelogs/AutoChangeLog-pr-81773.yml b/html/changelogs/AutoChangeLog-pr-81773.yml new file mode 100644 index 0000000000000..ade57130c1824 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81773.yml @@ -0,0 +1,5 @@ +author: "starrm4nn" +delete-after: True +changes: + - balance: "Ephedrine spasms won't affect small or tiny items" + - balance: "Ephedrine's movement speed bonus now scales with purity." \ No newline at end of file From f86004ef7373c81873fc8595e4b4d346d3c488af Mon Sep 17 00:00:00 2001 From: ValuedEmployee <105574010+ValuedEmployee@users.noreply.github.com> Date: Tue, 12 Mar 2024 22:19:11 -0400 Subject: [PATCH 18/75] Moffers Crafting Recipe (#81829) ## About The Pull Request Adds a crafting recipe to make Moffers clown shoes, using 2 mothroach hides and 1 pair of clown shoes, to the entertainment section of the crafting menu. Only the basic clown shoes can be used to make it, so other clown shoes like meown shoes won't work. https://github.com/tgstation/tgstation/assets/105574010/527424d7-107b-4a62-aa29-92056be2b136 ![Screenshot 2024-03-04 095521](https://github.com/tgstation/tgstation/assets/105574010/ba3b53f4-3ebf-4f32-b61c-734360e00de2) ## Why It's Good For The Game Creates an additional use for mothroach hides so that they're not only for making moth plushies, giving another mechanical reason to butcher mothroaches. This will also allow the clown to psychotically pull the hide of a mothroach over each of their shoes and parade them around proudly to the horror of anyone watching. ## Changelog :cl: add: Added Moffers as a crafting recipe in the entertainment section. /:cl: --- .../components/crafting/entertainment.dm | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/code/datums/components/crafting/entertainment.dm b/code/datums/components/crafting/entertainment.dm index 6de554791a25a..370a98a7bfb52 100644 --- a/code/datums/components/crafting/entertainment.dm +++ b/code/datums/components/crafting/entertainment.dm @@ -1,3 +1,22 @@ +/datum/crafting_recipe/moffers + name = "Moffers" + result = /obj/item/clothing/shoes/clown_shoes/moffers + time = 6 SECONDS //opportunity to rethink your life + reqs = list( + /obj/item/stack/sheet/animalhide/mothroach = 2, + /obj/item/clothing/shoes/clown_shoes = 1, + ) + parts = list(/obj/item/clothing/shoes/clown_shoes = 1) + blacklist = list( + /obj/item/clothing/shoes/clown_shoes/combat, + /obj/item/clothing/shoes/clown_shoes/banana_shoes, + /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat, + /obj/item/clothing/shoes/clown_shoes/jester, + /obj/item/clothing/shoes/clown_shoes/meown_shoes, + /obj/item/clothing/shoes/clown_shoes/moffers, + ) + category = CAT_ENTERTAINMENT + /datum/crafting_recipe/mothplush name = "Moth Plushie" result = /obj/item/toy/plush/moth From 31e8fd8066fd005934252ae73cf7519069015daa Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 13 Mar 2024 15:19:35 +1300 Subject: [PATCH 19/75] Automatic changelog for PR #81829 [ci skip] --- html/changelogs/AutoChangeLog-pr-81829.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81829.yml diff --git a/html/changelogs/AutoChangeLog-pr-81829.yml b/html/changelogs/AutoChangeLog-pr-81829.yml new file mode 100644 index 0000000000000..45ca1a491c2ee --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81829.yml @@ -0,0 +1,4 @@ +author: "ValuedEmployee" +delete-after: True +changes: + - rscadd: "Added Moffers as a crafting recipe in the entertainment section." \ No newline at end of file From d04a384ec9374fd5a6f8acc43465694af6585ec7 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Wed, 13 Mar 2024 03:25:25 +0100 Subject: [PATCH 20/75] A skub-related station trait. Reduced weight of annoyingly frequent neutral traits. (#81388) ## About The Pull Request This PR introduces a new station trait that lets people choose if they want to be pro-skub or anti-skub (or neither, really). It works the same lobby buttons that job-related station traits also use. Depending on whether you chose to be pro or anti skub, you'll spawn in with a special box that contains the (bulky) skub and a pro-skub shirt, or an anti-skub shirt. EDIT: Both also receive a number of stickers to propagate their causes. Kudos to @Fikou for coding the lobby buttons to be accessible by any station trait rather than only job-related ones when you made the Cargorilla station trait. Another thing this PR also halves the exaggerated weight of low-cost traits such as scarves, wallets and glitched PDAs, which I clearly underestimated. ## Why It's Good For The Game We've learned that low-cost, high weight traits are a bit of a design mistake, because they tend to tip the scales toward themselves over and over and over, leveling the diverseness of the feature and therefore making it shallow and boring. Beside, I've been thinking of the popular [skub comic strip](https://pbfcomics.com/comics/skub/) lately. ## Changelog :cl: add: Added a Skub-related station trait. You can now choose if you want to be pro-skub or anti-skub, complete of shirt and stickers. Please don't shank each other over it. balance: Halved the weight of station traits such as scarves, wallets and glitched PDAs. /:cl: --- .../greyscale_configs/greyscale_clothes.dm | 9 ++ .../json_configs/wellworn_shirt_skub.json | 28 ++++ code/datums/station_traits/neutral_traits.dm | 138 +++++++++++++++++- code/game/objects/items/stickers.dm | 8 + code/modules/clothing/suits/shirt.dm | 13 ++ icons/hud/lobby/signup_button.dmi | Bin 799 -> 2318 bytes icons/mob/clothing/suits/costume.dmi | Bin 83123 -> 80906 bytes icons/obj/clothing/suits/costume.dmi | Bin 30250 -> 29328 bytes icons/obj/storage/box.dmi | Bin 12916 -> 13056 bytes icons/obj/toys/stickers.dmi | Bin 7280 -> 7987 bytes 10 files changed, 193 insertions(+), 3 deletions(-) create mode 100644 code/datums/greyscale/json_configs/wellworn_shirt_skub.json diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm index 1f4c8cb997380..3134666eb0370 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm @@ -705,6 +705,15 @@ name = "Well-Worn Shirt (Worn)" icon_file = 'icons/mob/clothing/suits/costume.dmi' +/datum/greyscale_config/wellworn_shirt_skub + name = "Well-Worn Shirt (Skub)" + icon_file = 'icons/obj/clothing/suits/costume.dmi' + json_config = 'code/datums/greyscale/json_configs/wellworn_shirt_skub.json' + +/datum/greyscale_config/wellworn_shirt_skub/worn + name = "Well-Worn Shirt (Skub)(Worn)" + icon_file = 'icons/mob/clothing/suits/costume.dmi' + /datum/greyscale_config/wellworn_shirt_graphic name = "Well-Worn Shirt (Graphic)" icon_file = 'icons/obj/clothing/suits/costume.dmi' diff --git a/code/datums/greyscale/json_configs/wellworn_shirt_skub.json b/code/datums/greyscale/json_configs/wellworn_shirt_skub.json new file mode 100644 index 0000000000000..6f6ed3fb1f1dc --- /dev/null +++ b/code/datums/greyscale/json_configs/wellworn_shirt_skub.json @@ -0,0 +1,28 @@ +{ + "wellworn_shirt_pro_skub": [ + { + "type": "icon_state", + "icon_state": "worn_out", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "skub_overlay", + "blend_mode": "overlay" + } + ], + "wellworn_shirt_anti_skub": [ + { + "type": "icon_state", + "icon_state": "worn_out", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "anti_skub_overlay", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index 4cb15c6b07e76..5f38a5a53c46f 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -104,7 +104,7 @@ /datum/station_trait/glitched_pdas name = "PDA glitch" trait_type = STATION_TRAIT_NEUTRAL - weight = 10 + weight = 5 show_in_report = TRUE cost = STATION_TRAIT_COST_MINIMAL report_message = "Something seems to be wrong with the PDAs issued to you all this shift. Nothing too bad though." @@ -283,7 +283,7 @@ /datum/station_trait/scarves name = "Scarves" trait_type = STATION_TRAIT_NEUTRAL - weight = 10 + weight = 5 cost = STATION_TRAIT_COST_MINIMAL show_in_report = TRUE var/list/scarves @@ -317,7 +317,7 @@ name = "Wallets!" trait_type = STATION_TRAIT_NEUTRAL show_in_report = TRUE - weight = 10 + weight = 5 cost = STATION_TRAIT_COST_MINIMAL report_message = "It has become temporarily fashionable to use a wallet, so everyone on the station has been issued one." @@ -394,3 +394,135 @@ ai_datum.spawn_positions = 3 ai_datum.total_positions = 3 + +#define PRO_SKUB "pro-skub" +#define ANTI_SKUB "anti-skub" +#define SKUB_IDFC "i don't frikkin' care" +#define RANDOM_SKUB null //This means that if you forgot to opt in/against/out, there's a 50/50 chance to be pro or anti + +/// A trait that lets players choose whether they want pro-skub or anti-skub (or neither), and receive the appropriate equipment. +/datum/station_trait/skub + name = "The Great Skub Contention" + trait_type = STATION_TRAIT_NEUTRAL + show_in_report = FALSE + weight = 2 + sign_up_button = TRUE + /// List of people signed up to be either pro_skub or anti_skub + var/list/skubbers = list() + +/datum/station_trait/skub/New() + . = ..() + RegisterSignal(SSdcs, COMSIG_GLOB_JOB_AFTER_SPAWN, PROC_REF(on_job_after_spawn)) + +/datum/station_trait/skub/setup_lobby_button(atom/movable/screen/lobby/button/sign_up/lobby_button) + RegisterSignal(lobby_button, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_lobby_button_update_overlays)) + lobby_button.desc = "Are you pro-skub or anti-skub? Click to cycle through pro-skub, anti-skub, random and neutral." + return ..() + +/// Let late-joiners jump on this gimmick too. +/datum/station_trait/skub/can_display_lobby_button(client/player) + return sign_up_button + +/// We don't destroy buttons on round start for those who are still in the lobby. +/datum/station_trait/skub/on_round_start() + return + +/datum/station_trait/skub/on_lobby_button_update_icon(atom/movable/screen/lobby/button/sign_up/lobby_button, location, control, params, mob/dead/new_player/user) + var/mob/player = lobby_button.get_mob() + var/skub_stance = skubbers[player.ckey] + switch(skub_stance) + if(PRO_SKUB) + lobby_button.base_icon_state = "signup_on" + if(ANTI_SKUB) + lobby_button.base_icon_state = "signup" + else + lobby_button.base_icon_state = "signup_neutral" + +/datum/station_trait/skub/on_lobby_button_click(atom/movable/screen/lobby/button/sign_up/lobby_button, updates) + var/mob/player = lobby_button.get_mob() + var/skub_stance = skubbers[player.ckey] + switch(skub_stance) + if(PRO_SKUB) + skubbers[player.ckey] = ANTI_SKUB + lobby_button.balloon_alert(player, "anti-skub") + if(ANTI_SKUB) + skubbers[player.ckey] = SKUB_IDFC + lobby_button.balloon_alert(player, "don't care") + if(SKUB_IDFC) + skubbers[player.ckey] = RANDOM_SKUB + lobby_button.balloon_alert(player, "on the best side") + if(RANDOM_SKUB) + skubbers[player.ckey] = PRO_SKUB + lobby_button.balloon_alert(player, "pro-skub") + +/datum/station_trait/skub/proc/on_lobby_button_update_overlays(atom/movable/screen/lobby/button/sign_up/lobby_button, list/overlays) + SIGNAL_HANDLER + var/mob/player = lobby_button.get_mob() + var/skub_stance = skubbers[player.ckey] + switch(skub_stance) + if(PRO_SKUB) + overlays += "pro_skub" + if(ANTI_SKUB) + overlays += "anti_skub" + if(SKUB_IDFC) + overlays += "neutral_skub" + if(RANDOM_SKUB) + overlays += "random_skub" + +/datum/station_trait/skub/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/spawned, client/player_client) + SIGNAL_HANDLER + + var/skub_stance = skubbers[player_client.ckey] + if(skub_stance == SKUB_IDFC) + return + + if((skub_stance == RANDOM_SKUB && prob(50)) || skub_stance == PRO_SKUB) + var/obj/item/storage/box/skub/boxie = new(spawned.loc) + spawned.equip_to_slot_if_possible(boxie, ITEM_SLOT_BACKPACK, indirect_action = TRUE) + if(ishuman(spawned)) + var/obj/item/clothing/suit/costume/wellworn_shirt/skub/shirt = new(spawned.loc) + if(!spawned.equip_to_slot_if_possible(shirt, ITEM_SLOT_OCLOTHING, indirect_action = TRUE)) + shirt.forceMove(boxie) + return + + var/obj/item/storage/box/stickers/anti_skub/boxie = new(spawned.loc) + spawned.equip_to_slot_if_possible(boxie, ITEM_SLOT_BACKPACK, indirect_action = TRUE) + if(!ishuman(spawned)) + return + var/obj/item/clothing/suit/costume/wellworn_shirt/skub/anti/shirt = new(spawned.loc) + if(!spawned.equip_to_slot_if_possible(shirt, ITEM_SLOT_OCLOTHING, indirect_action = TRUE)) + shirt.forceMove(boxie) + +/// A box containing a skub, for easier carry because skub is a bulky item. +/obj/item/storage/box/skub + name = "skub box" + desc = "A box to store your skub and pro-skub shirt in. A label on the back reads: \"Skubtide, Stationwide\"." + icon_state = "hugbox" + illustration = "skub" + +/obj/item/storage/box/skub/Initialize(mapload) + . = ..() + atom_storage.exception_hold = typecacheof(list(/obj/item/skub, /obj/item/clothing/suit/costume/wellworn_shirt/skub)) + +/obj/item/storage/box/skub/PopulateContents() + new /obj/item/skub(src) + new /obj/item/sticker/skub(src) + new /obj/item/sticker/skub(src) + +/obj/item/storage/box/stickers/anti_skub + name = "anti-skub stickers box" + desc = "The enemy may have been given a skub and a shirt, but I've more stickers! Plus the box can hold my anti-skub shirt." + +/obj/item/storage/box/stickers/anti_skub/Initialize(mapload) + . = ..() + atom_storage.exception_hold = typecacheof(list(/obj/item/clothing/suit/costume/wellworn_shirt/skub)) + +/obj/item/storage/box/stickers/anti_skub/PopulateContents() + for(var/i in 1 to 4) + new /obj/item/sticker/anti_skub(src) + +#undef PRO_SKUB +#undef ANTI_SKUB +#undef SKUB_IDFC +#undef RANDOM_SKUB + diff --git a/code/game/objects/items/stickers.dm b/code/game/objects/items/stickers.dm index c7288bed2dd5f..a8b800866a497 100644 --- a/code/game/objects/items/stickers.dm +++ b/code/game/objects/items/stickers.dm @@ -157,6 +157,14 @@ name = "assistant sticker" icon_state = "tider" +/obj/item/sticker/skub + name = "skub sticker" + icon_state = "skub" + +/obj/item/sticker/anti_skub + name = "anti-skub sticker" + icon_state = "anti_skub" + /obj/item/sticker/syndicate name = "syndicate sticker" icon_state = "synd" diff --git a/code/modules/clothing/suits/shirt.dm b/code/modules/clothing/suits/shirt.dm index e291250a580a6..3d5c8fb4462db 100644 --- a/code/modules/clothing/suits/shirt.dm +++ b/code/modules/clothing/suits/shirt.dm @@ -21,6 +21,19 @@ washer.visible_message("[src] implodes due to repeated washing.") qdel(src) +/obj/item/clothing/suit/costume/wellworn_shirt/skub + name = "pro-skub shirt" + desc = "A worn out, curiously comfortable t-shirt proclaiming your pro-skub stance. Fuck those anti-skubbies." + icon_state = "wellworn_shirt_pro_skub" + greyscale_colors = "#FFFF4D" + greyscale_config = /datum/greyscale_config/wellworn_shirt_skub + greyscale_config_worn = /datum/greyscale_config/wellworn_shirt_skub/worn + +/obj/item/clothing/suit/costume/wellworn_shirt/skub/anti + name = "anti-skub shirt" + desc = "A worn out, curiously comfortable t-shirt proclaiming your anti-skub stance. Fuck those pro-skubbies." + icon_state = "wellworn_shirt_anti_skub" + /obj/item/clothing/suit/costume/wellworn_shirt/graphic name = "well-worn graphic shirt" desc = "A worn out, curiously comfortable t-shirt with a character from Phanic the Weasel on the front. It adds some charm points to itself and the wearer, and reminds you of when the series was still good; way back in 2500." diff --git a/icons/hud/lobby/signup_button.dmi b/icons/hud/lobby/signup_button.dmi index b1e7be603c9c74eebce726e6b86be55a7ebb29ee..bc5f1f7f24ac02fbc636ee98d9fa65f817840653 100644 GIT binary patch literal 2318 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 diff --git a/icons/mob/clothing/suits/costume.dmi b/icons/mob/clothing/suits/costume.dmi index 3dfaf138da8dd97fc0cb6f96cabb4a65f6dd3776..4a1c107e8447268229ad71637bf956da7b6af85e 100644 GIT binary patch literal 80906 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 J5@oBP{{=U-oNNF9 diff --git a/icons/obj/clothing/suits/costume.dmi b/icons/obj/clothing/suits/costume.dmi index f87a74c263f76a63cfae5bc0216e194198d6a186..0bae97805b784b7610dd1f9c47054617bb13e95c 100644 GIT binary patch literal 29328 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≻HHi?cKYSUTaH}h5`!7M|6 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 TkQ00dEbv)UQKDANIOP8U2MK~W diff --git a/icons/obj/storage/box.dmi b/icons/obj/storage/box.dmi index 8e34ac8f8de0917998b4e80a954117eff3bf6c5a..8b037860144cc5a7bc5f6677b2bb68a2b5ad0e42 100644 GIT binary patch literal 13056 zcmcJ0XH-*Bv}O(y#xp-#R7sN(jf@aOF()FReFcen}A3S zMM!`^$i(;N*Q_^dy_q%h9mL%BNJV3?C-@(t#C%_Hl4FH5>e@z|qW`02)H;y(UPY#OB~vzMzeiIYPjr-)=ufT~}agKgRk<0r#MP7LahXB>!`xmCn(S^au7 z1}REyIgo3ACnMXC?)TkL#@-QuXrRdjoU|nHfEeuu9wAhm&lHm)l9MGs?%ng8JPWWwkRBGC&k3*+a;&(EG4eFWdFF;as^ zF%eNjKN?6uH4cc}sqCSP1|@f(K5IL@OHGl}ji$)ODPPO@EI{ zItu3++;o3n!SyL{4c4T^uTa$n}%T`$KZa;oN} zb%-*8%y;F=CkOZ6Xnqk1KIUa)dzw+z*_9x@`qOw%{ug<39jAHA4(^)0z-bu6dR={a z)N|+yhJ8RPUHl_xb|;uxR)smEHh{a1~vfoY>Csz*6AZ{P+wV-9)KqaQuc~pptHdVkPpEfN;#GQa@dk^5J74 zq2!1wbh8L>tvzCJe0)we263EmwJk4hd049_TgZ4%X%H4sLH;0|v#>B$V3gth{jM=& zmJH>$jK<~CifbRb?K9-zRCpMg_0<%LCiL{9neP4^)bq{z>D*0jA72ep`)}Vy<-YbP zDf0;MxFH0xoQma1IeaaxS{&c|d3T5WsP!j!DsY*ZClGCwJ?m?2ZB4F~#%I74b9M@I zfd;y_yxkrP1ZUh=P`Xpxbf0f58MfXF(_EHJYZleb&doj~cp3ASxtR?)*T0CdU>3Ku zT-)330IjvB&L+jj*VIAO)nf`#=Lgb`ZV?5xk-EhCN%Q87^fy|TnO3KwbaUfy43lJ4 zg#UEr*z23a(GbJ5zp3)L$;nCY(KIL&riFb?2yPJtV(4v#XqLkAtWJ^3?HXwq>Bgf; zC&@#hzo>0vK*aTei+5#|?QBG$-lwL0-kdi-ZA|5H^0@2TLKN=ma5!}qczVK|IvaWR zSu%B2{4Z+G8$g$qGSL_e@(P*%#JSjHyMpY0!Xgn+7IvX!`2as+Yvk+o3A-Y@A zK!AeJMbcT4>fyGHW_=qL|9b$qB$B_50FU z8NXVrJ>vwO9XGB8pw24BU{V0E0;}u6E8mji4if+v(}u44Kjr7iGh6!xNTFqQp7=#p z?`t57gw^(tL?RZ0yw_A*LudgcXs^>I$jg_KP}mBf^ZP#c-#P=jM8<4{5-4Yo8%;Tf5rLS;x5BhuV9`9u z!`57P<1p3LVkKW7M6qCEN^3jK_LZGEqfPLEt5{W9k5B)y_1_Qil0oCLEwg4l-{FK) zK{<8uJnpW$h54>jbO6t}#ha@`wDa^r(kD4OORz!DPv6?ILY<1KMT7xyVl zj8pt)nhY#mcY90DJG6j3+@qPq3P+~&xeL|FgYopuKg^50ZYsqIZxf5VOUu7fD7blaJ$HzOBvDLR*6^($IFbJ6Fzgo}|_+*NNdc_|KU1(P<3 z#3U?{m#&>**W`QKLqC5`pDbzTJ&G(QR7aZDqkql#W@Kb6)`9mHm-;TEuJQ)y73{xU zZ4wG}7oR^IvX=I1vx#5^%Zc;(%N3SVSJnfjxlS>DIscePfk zuT*PoKeaIZd6stTsj%>LsSco^q7?kv?GbWKMgk3HIVVG|S~#0i4ea%UoQ_Biu0j^~ z*J;@#?98#i2A9SqGQ)F1ruBde98>_ssyy%_+`95808qLOblca^k1y{qpEXh}>b{UW zH<&-}RW7hi>Vf3t66k+w{?s|vlIjA45GeZ`o*WGePPBiR(^B*n*t3GcF~rTyEwi_; z=1#QJC!Ft;u5VttM^*(;gBIoyWch}13lgZ2L682J=+r9hrQnEn2FK{e03AM&4 zD01#MEQz}#K#kdw?IA1Z07_a~Kl`gM4H^+Qryt_i|6~!k9tq3An#>!wI~@8GiAa{h z((yZPd<7X!(b2U23H$4pom9}ljxV-HE%EtNk(9f-5v`~On$ycUb|)wstm9h7tM~`+ zn)g>))*=r1@l6b?^ljgzgi^ru$)Sbrcrd;gaKQN67u&FkqhX}#%%;kMrPadZi^twc zxS%~7$KEyAtt;8+#vae5nYEhWppk8cX_#T$i}6a#7u-#{0Dj4Dwnu!A62i&oLm;Yh z!R)OKlu|MzwSVOP%u4ZrgK`DNaTH&QT1;@!Ux#(C=AcFdTrt$DpQe59aPmFEm#Y(q zK2diI{RHyOJW~D@+TwbA8Y7@$1-s-4DD-F15X#>1tpAZyD(Gf6s-wE%Pk+zA2 zrT;UqN)T043C286^n8OCusJ394Tn0Y)zvvaUT*fTOrYL4*f0cWRNvt|mjj1 z_`y|Tp~>XmR}*-Z5s$=XD`Oi2PQbzD|KyMt-`d$6mlFod>h5Ed?l{yjE8rLW%&Upo z0`G)-;>aiaQ0`3^%deH+)-?d9rt0?ZAg9-#eKeh8P-5)gjZoOjTJWtcD%8o|NKRJ$ z_Kl%@pN#Wtdur}jqxQf|!B}tq89x1?obT2wF3hvBKbeXUmw z6`@#a-cwRLX?A9<^yfFAI0QrS+jaJiQh+BssHn2=N;NBVIOlF>7O3r&$8P)NY`YIk z=&+q({N1DL97>MB+M?j2RmEWF?_UDAdwA4~ z6)5)`>_Bmzgin23g{1;i910)DTAyS=o-#8$>u19y#KYn9Zb~b^e>*x2tQ-M8HH2i+ zizOll2d8Pxlm-d`hRDGI*I6<{@t!e9D>eQ`6vi(9md~gtjR7sQSeDW(oDRU!WdC&? zq*C8#gdgrwjlXcq{(b~Ye~Y}S z)j^WRKH*9?jNGpm_R-76r#=Ig zyKYMJWq7&Nw{o7(Q*TAaXcnzDb9fo`XC$|h{DFi%8NekrHtvW2oB%za_0FVx-yYto zHt|+vM@0}!Up1Gt_OHT0f)4K`?1>~<-~OL_jQ_rG`QNwPoT^`E#m|~(i+NsanloKD zt8~zT{u7}H3Em|orOiP}*{%=2`>n=yOdbO1jYvD^nqObH?W)~GyoYMxNRkA! z(^FEuXNMg&1HKm*TRl+H(9rl0^D6_?pU8T*^Sj2EIx*3h&Up^Y9Q{)3=EoBaQr`@( zj^Tb#n1!qlU5hqa-o!l>bs;3VhzHvPIdaz7!E;O+6ve`sh zQgUH-vC<&0A1G;SQ49X)wb~XsdUKg1i%wt1g_rM#@jkxWiG{8Xa<7Cp|52wH*9$3J z2ncM@SDx#A5f11}WG$zFSvBguc=qo=K^sst+aSaV?|m*bwN$VCwY8sxisx3H#o0Xhm2UWItcxyUY*xBP{aVVJwc%r`V#+h$G%jHku`N_{P|M!VxqGjR2 zg@uI`c$Hc~=pys!=R#63EIr#W=-4`xhQ1oF#57o5CnAS=XY!hjj%_KHPQGN+C*#g#X3K^S?Zf{(r0N+w$mvS=MX5 zPfVOWWS0e}WM)1X8X9`~?Ab>9)uHsJpcdJ4zu)S}sXAg};)BKd;go*tn3vfzfZAri zo0m;ch124GxlZJ&_>(8kgh`$ChMrA(=%qhbd>0&(>%-QZ46~)AxK|cTOF%!S!!}WD5$oO)zzfNUk+<3}a zz}>rd)01;`t*u#To@hUJl2uJ4Hv~vQr;m)6VuRC-T4AX5TKk^ckCDF&@?W(W85(X( zZU!}zAO_|Ist=!5oVfA`Fhy>KY;}_fc-FAmjqZsSUHg01K3r&ClFJ5D-|}RiG@)w88H^OLX~7SBrG#HvItyP;HLK=&R;AwCgHcTlsqVbZ2=^6v}9`@9qNNV9chQI-A;K${ZEKUzS21aDR zH!acld9dr7n$oK!vDLpFpBG5^`n9>1F-bd9_oDZ+_d0hV5xZO|@ zxv2)?uSuln1t;iRF-}?@n~8S)0!%1INy7m@zVLL3!=n8EQ%S_Hi_;H zmZzbcwprrx|7s=6@zS8AwA6kqv)G<8Jx4w^HkQw}jWG&u><=G4G{-;-qe5jlOjdQU z{JR9Ql03N`70X>;zHBV~eO+2eu+v(e8*=3R+W`W2sj8Zsm8E53LT83R9LK^02?z*O zR8=z@C?5&7DQm2pm7y)Qboj-$0>yuT@{?Nxd&L6X^FNmIq(~?5f&vAwA0LPgHQ-lx zt7Tz)Ue5A@+X>tC3^ErQogeq5){}>a$GftVOt5X@>B-3Q<+7n*|G_VVV5Rb_sF79D zO3h|-&Xce(x7uKp@+(Mg1lnTyT*EpHS+A+Boe(51E}oVoe=~oE3h^7<9|9h>AS*65 z3i+AEJoV!!m{na}OCAMfAP4?X*iXqxw%>9Y(lvRm>IN5 zA}HFTa`KM(u;%)2ld#K;LFnmd8b6TAHz@suL)@+7Su0S+P3DrUSLUrxK&#<_t>Klb zBXnWLTEw}{*56^l;=H^lGhoEmZD{0b9k)HcKb~kXLdbEdgFxNtl0&*ST$}XUJxOui z4qQJ9amG)O*Cas|HL#)R3A?#Z%Hdy8O0MtCGQ}Q6=f;#kRUw28Z4?6h8O{CfkH0&}?x7cBm1GWZx#nIEzp*v&OeYFt{u@)y``YwuwFY z^JV|kLqhODO+R1gXrXRyg)y7#-OdZt{)#0@5}r%tl(8QRig%qE`25If`L(3)hRU;N z&(g&~t4u2e_g%zEIpSHhYPW}-lIB4XkC36Xy+p&a8h2{d0TvZ*$B5rrZ`HD8xuW>c zs7>^*$u~P?ar{3_^bPDsUzjSTzq~c@$^jxFdca(&f7*N&^>aZPUn9S=FtOQO>wER{ zJBr^4rYtw56}xVyIh@ZZ)Qu2QSa6bI!BxlM7I zR#^}JJBbzGb`!zqgHjfmkm^D)BPdPz>bpeM>nExN7nrPoBE77>rK2_nS9l@pF)vKu zk^vCBjH-UM< z*%+2+l8HC{11O*Hk!St=RaMh{?EVxMZ@+)%Dg<9Z09Cn6 z6rC=hKLo!z>XXE5{QQ2{k1Ki*(9+QKv;^*J?-PHlxELYTdsz{|EYWynBlp5#)Bd`utb9M)=N>60 zL)>BOk?IOb9fl$-i$RvT4_mdBL7s;O^Q9quwpO9jc6s~pKB0KTslz84FhU8P?$t_j zoOBHSw2lzpICCrR?o8mAuZMkl%WgB!*?un-9rDX~zC@8|7TrDKxA{?g(Q=VACpXu7 zPj?6LdVEP$K+70Etfed<2g4IuC3E%vdw>d=aZ#b&&<;3)pErc`DeJ*6HsW=$c8C$o zUk77O-AA=9jVJ&{QVc0eDHiY zRT(%pJ)NG*jv=@(p)`yZCT#nDV z@c|wm9&EsJVdsaa5T=e)%s-jk_!b^8xM{0A-k+IPTFz|Lu}5CNz#|j3IX(daRb<4j z7v2zxZ6ffxSU<-%0yyKT=FY7&ptpHt{9M(HljK?w^Y(0by)gdT=;+j0bAL0Sl;fwx ztC=zr%R5Z0at3fP!STg~r_}i&QD@D_rp%8gW4mI37FBWj$PpC`x{fNzd}r8X+m@tr zdzZb&H|XQE7vReINy7sryoM5P_%UsapxFuw?Q97H51PZz zI@Q2$CeZK_?F>H}{F2J)fVge_;r424&alA4fnQC&eQX5FwROh3a^SikoW5nI-*c{? z6PYyJx(GB@LMUI{*uY?N2V!wh7&5cCR)(snuNEHLZJ146u#Lby@ltC%0Ey+)dU?&9 zOGMGjoF<_2vrmiVGax(7bSR+qN-0+&JSM&+aO3TxehrIrR={~8i=!r%$H@EP`t`kw z%PZlKV;>}aUfafZ`@nJbNkwMJ;g_}h_wRSJ3t06Qw|aYt*jP_91tR{bNXxWPQfcJK zC3|`rNcC-R&)usDj+ITEe(z34)xLHd7%-MCmrL?y^x4bBsCC(%={cE#t@pqx{P@!@&3e|!xp zz7`Un(U`X)b{0hrlRv8Lk`dcv2FR@h^5TK~Ods*>+Yc} zY0^*JuXWlB=_~n9^F%+?@^;--eDEJ?bP_+&Gfb}hcTt#NxS_>GpAq0%XOqCZTfq!!Od3BUHFJ!KQET#(HW-{_7iaNZ&x6t^vNS~2SDKk&41^d=tJ;u|c1ASKYec&mXj!H(}vd(w>XnWCaTXnB-YRTVXz z8H-1Tq%~f)T!U>AZw2)dGuV8m*k_gd$4=pc1+reGWbZO)8*jWbaVSdYy%WWYx7YMh zwuNieP@&?bgp!W#*aq|f)4j;pH&PfL((NR>D|96}n~Zhq%HL_#Azs}F=)qQOkJ}JQ z$Ju(EJ^zubF-7|gtFk;6i$)r;5W1dH$@}~OtqJG%zi{Xye=H_OA62uqd)n1-n5+fZ z20JIBut&|7X_y(oh*|f4X0I!poBOszbPPQ*QX%*sWH!sYr~l`aHvi3oo7J!*(cg_6 zg6$XiMjbC}TH2|*SwL`?ah8~ zX&l0<$Q7f-6_q{Ve%yAAF11hCy(jCp63FJYA&bB3W2@}xD1Hn!#&rc7%9P1VPu60{ zjAY7jJ9SwyWw;&bqcG!0JVnVi!`|rpQ4K{S8-8Q77s8@f+u>T>F{KUn!v##}YBO z;B8G(&pxy>0Lc|@{*0>F`VeqpufCk1mqz2xBXF`%Ryl1axSZME&JOYBlb`n_Z|(wg z!#i>*8Im};s^vrXf$n129e>DXA(=X{x(s(oZ+XWjIJ))(HvgEb;Pk!@Y2o6k-on$y zVr^bC&uquXi>;x5FJc0|tEt8AZy?RuFCK2*F*`d_HSX{a-JFJHQbg80N~^fbTwgc_ zj4$W!0b+!iK@lkg@81JhZqQcw0`QdTi;$r9Yrop{6&{`hbIen#qfpH>4B*S_&j#pq zueZ|AMfQj$4XVK&r|XEG>gB<$21W&Z$eD4eTyYG<79|=RFOnd1_(^&xyb@&#&Z-Xq zDbG*=u3~S)-b92yh}Fi=L(JKc-fv3^{VB8^Yt-kZ{@cSEd?-M+>t?`{Wy;PyW}( zqO%7c7fiy=Pw}wOHPoF7xe8w@{qoAnqN9|(s@*nYXHG)3PKV#MK_m6%7&uT?PQX!F z6&EjeHBrDeF~wt)qU+tBmpC`;w;y&CYK-eR2Nn_q2OUx1xu&=^d0ev^3aFuN+`U4c zlArnD@XUwi;HYsmZ=SF>@T+LxwZkq6+YAnq=|Kwwo$t*dW_%a8p&`b&qMs^{5u>46 zQRgcwM1)NtNK0`oaWuBc*L&0@Fd~X`wcWG49*FWQNy6R=bWbX=>Q@N65FyPq?7i7# z*xp(t>;IgT#?WqS8{m8LLtL%A?D*vG^;0sCJSZFsfA{V#*8oYlr@j#tUEs&!{a+Li zTm5o{P<~prs-H{ar~OCUTd~kIh85``uAnnlzjn-r`N@KefZyDnbL0wxg0VVk<_pMh zFY7Tgpl?b3EqPhCjx-8(K|!TkHe_8>Ll4^EGDpMSHSf1aH>Zo{d7?9P9VlC~OHl$`H-CyMkQS!9?co>!+okYbN9)8Dt zhZu>Hyrp1l5;OZ}eib%*vut*8p}*-HxI=xQZ1+iUl5^D>(VWY{9*Y6T%3j`WZNutE zk+PN@AO8B-nD+656mwQ$sDZ&BEghTIc#v5&Ot1?A$rg4dCk952N;>p?s<$U(Pkhj8 zB=5x;Vs%eLx$kqMy>fwDVx>hiTbe8R@yV0UezJN7V>4Lwl{#s3J~J@N*Twb)VN2`= z(h1iID=RIqo!llYF;b^R1afR$T72w#yxO78Y}#Mym7^rJ|CfMv`IzC>PtgVFM7jU) zsUtK>$Y<{|xD0e;WTs~F#XGOo3(RPUl{ko#Tezg)hi7|F8)+$~n3zrTg`9nl)2mLR zvXWG>hEb{zVSb3hKb4f-$-i|=!rG+wm@|i`qQd^@^&@gT(jcH^JkWA|N0k;kv*}VB z$@!{Q@#jY^Ci-7VNenEo3Qidm6(Hcuv`M5cx1c|wWYS(-y&B5S+1`%uTppO%oz}2v zN$KK_XKF)7dY)Bnx}M8D^}zL`TcjFbz;QeTejIk`rxYF$NS3Dn1hI(s#063H&$XW5 zTHLI@!o*QhEcts#q|Tq$poNn@k7ZF=mZ%LX{}O@I&7U;l9@927EZy8R$+N*7uBd>ZY_O->=4%z>vX^+)tANi5uDX&0K zvksNpP0}YZJ5u((h@az|n%3^Z-TLg2ahQwR%7#qC!d&XCG|u(uP2{h?hCr?Gpg_NAif!s zdc@4EQQ`c=)$wuD;Fm$$_H4Y(ygzHGDQw7n6QeaSKJ>k2NY7Sm6!LW4rhD+&)Dif&a&SyuaUNCkv|snWt?kQ@P`cMB z)_0lr2DxxFmg-Cz6i{j@Y9$i>l;!oaRUKxLFayb@pd!OC1?Tr=AAb2La^|#LD)8gE ztfeOuPM3_#hN# z82Z~Gkynm|obr27yX9PXJKqyWa(=rVTl}&xyJ#o=%39 z`boP`9lg-vz&tE;^Dm=W6 z0pJknbCZe|BPsA#m;NXTDMOP&ilwNXvOAS4v)v+K>E!LE1HB8sNp7N;g|#S?UU_Cy zv%uq@q?7_S?j5HyX4KR};HWrk#oKnwkX(+`$1zRa`QXyqBp1HVd6S|oLc>o{eX7$$ zBo}VeyOntX%qNY@t4$~Dr}Yi2pte4|?wNW8U-)#7|C%ba#yU{SveoP4^jZA1dd^)U zU+gOQF5wPaRDAdH(hs1Gex4q7y>e#!$J&`^==C1#tTfW3(Hp6Ucq8uT7f`y^Q62`* ztbD5(Sjv8HvA7rA64{}x(&Mv1sJCZW{y2JN`Nz^P6-xZ^9Y<90~cosk&M;P5poC#b`NZN{sWV895D zU%|5AWUQfd*zfBMYH5Q}rBD-Y-$m$i_FDr?e7iy3o{ZAi6l~q`ydyIgzH)U(CVlsk z_gvqE?nF`Xj8QnQ0<~|`f<4$wlC6qtYl*8;yzw5j(m%Wue?3!QpMcpp@*ZtnZ;1@C zmS5GT(|y4|lq7N6(Lzc3!FQAKlJp=ajMBdQ-jQ zT{x=m)l z);LEmet4M8;!Ox8Z@&+YtPq_UYsH$&mm^6mlh2YVf%0brU^kQY|iqLm=PE+?D-&u!g z9AWHd236KqKrUZvcdioFl(nBhvZoIl?b@T{pHINHI?QOSyw5@DW`gd=66mOryX;Y6 z(Wbf{=B>d&4QiKQj*2;fr>Nn5RHnUVWa&#aIW zr7QOC40Lne$$GD?m6)xq>9R>z?5YiHL|E*0tey3Bw9aDTwsBop%{9X0xdVx=XU&Q_ zKQh`U{E-M81##6v#Hb7E$$9mqXJHFm^^PZ0px4j}Gr&Zqdfw_)aH z=Hy_xh+Ha>wX>F+rTu37gW})$wVHQNCRkZ??hmbdjNh0^6=S`y(<>7e}x!fsZu78ocJT-m;aLAtq-h;$w`&I36fueH0Y z+Xx4VG`_@7=1|4+WX#x{_$ziq#?Tg^Wk+c~)lhNm-sWzNyJ(h|m?`0D?wc}fi@6(-Q~Ld8c#aeyllU)L1;5{2Gx9LU3zK^SrhD1vu`Dn{KNg{gS- zTv~*(&FMCAb?ssplG+oZ>9PVVsb=LMX8T8j!;Mr#JJ*57OarJ#-`@62khT4~0*ftq zA^^2FfcotyBtt|G35RU?r{urSyu;A`w$Lz>@@X5nq18uMLH(QnN`|kSt0=Ces@AI4{&w%b(U?urF2)k4KvkLG6s+H4UMZXPxx z#}iH_BRDBQ6eaFjvDM^l;Z24OPJ1(e%2h3+$7jg$IGUOxlvd&WA@6K*Dwtg-?4=hf z`K%0SUJTF8Sp5^pnun#|{RtFw58y?OUt?Sz;B(<9#i`svREj~$R19BFf3gdBh=ezl zoKVSXYHHSKedn1DHz-l7VrsPHV@ra^$0m@L@f5tZ>OqM#T#L!r{TzLXrWu z_eCI%(d5pf9Aw&-TO&zIL8lMC>s8Cm)o`VEwaR$cbLU-UAZY#Va+b~=-&7xW_6gM_ zvF;e^d?$QPeFtQVo0di?yZv|e#DC!vaa8W?p3_r3`>FUpTL2m_bycdA?B4tjWTMQ> literal 12916 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 literal 7280 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 From 75da4f8cbb035316c0175bb6a3ce16eb418358f3 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 13 Mar 2024 15:25:43 +1300 Subject: [PATCH 21/75] Automatic changelog for PR #81388 [ci skip] --- html/changelogs/AutoChangeLog-pr-81388.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81388.yml diff --git a/html/changelogs/AutoChangeLog-pr-81388.yml b/html/changelogs/AutoChangeLog-pr-81388.yml new file mode 100644 index 0000000000000..bc8777db1b332 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81388.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Added a Skub-related station trait. You can now choose if you want to be pro-skub or anti-skub, complete of shirt and stickers. Please don't shank each other over it." + - balance: "Halved the weight of station traits such as scarves, wallets and glitched PDAs." \ No newline at end of file From b8667c320fd0e2fbb4e977a3a9033d8cbe041c97 Mon Sep 17 00:00:00 2001 From: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> Date: Wed, 13 Mar 2024 06:16:32 -0400 Subject: [PATCH 22/75] Ore vent fixes to spawning multiple megafauna. (#81935) ## About The Pull Request Ore vents can now no longer be scanned multiple times to spawn multiple nodes, nor can they be used to duplicate lavaland bosses. Vents now call for a `can_interact` check, as well as against the cooldown timer, which has been moved a bit in the order of operations in order to check things correctly when there's possibly multiple prompts open for starting the defense waves. Additionally, boss waves actually do what they're supposed to do, and don't spawn in a node drone on boss summoning, but instead summon the drone afterwards, which sets up the vent, then takes off visually. This is reflected in the tgui alert before starting waves. ## Why It's Good For The Game Fixes #81817. Improves visual clarity when doing boss vents so that players don't get the wrong idea that they need to protect the drone as well when fighting bosses. ## Changelog :cl: fix: Ore vents have to be scanned while standing next to them. fix: Menacing ore vents now correctly only spawn in a node drone after the boss is defeated, instead of before. /:cl: --- .../objects/structures/lavaland/ore_vent.dm | 64 +++++++++++-------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index 284f5df2a6d61..c3aa446916d85 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -21,6 +21,8 @@ var/discovered = FALSE /// Is this type of vent exempt from the map's vent budget/limit? Think the free iron/glass vent or boss vents. This also causes it to not roll for random mineral breakdown. var/unique_vent = FALSE + /// Does this vent spawn a node drone when tapped? Currently unique to boss vents so try not to VV it. + var/spawn_drone_on_tap = TRUE /// What icon_state do we use when the ore vent has been tapped? var/icon_state_tapped = "ore_vent_active" /// A weighted list of what minerals are contained in this vent, with weight determining how likely each mineral is to be picked in produced boulders. @@ -40,9 +42,7 @@ /// What string do we use to warn the player about the excavation event? var/excavation_warning = "Are you ready to excavate this ore vent?" - ///Are we currently spawning mobs? - var/spawning_mobs = FALSE - /// A list of mobs that can be spawned by this vent during a wave defense event. + /// A list of mobs that can be spawned by this vent during a wave defense event. var/list/defending_mobs = list( /mob/living/basic/mining/goliath, /mob/living/basic/mining/legion/spawner_made, @@ -198,6 +198,34 @@ /obj/structure/ore_vent/proc/ore_quantity_function(ore_floor) return SHEET_MATERIAL_AMOUNT * round(boulder_size * (log(rand(1 + ore_floor, 4 + ore_floor)) ** -1)) +/** + * This confirms that the user wants to start the wave defense event, and that they can start it. + */ +/obj/structure/ore_vent/proc/pre_wave_defense(mob/user, spawn_drone = TRUE) + if(tgui_alert(user, excavation_warning, "Begin defending ore vent?", list("Yes", "No")) != "Yes") + return FALSE + if(!can_interact(user)) + return FALSE + if(!COOLDOWN_FINISHED(src, wave_cooldown) || node) + return FALSE + //This is where we start spitting out mobs. + Shake(duration = 3 SECONDS) + if(spawn_drone) + node = new /mob/living/basic/node_drone(loc) + node.arrive(src) + RegisterSignal(node, COMSIG_QDELETING, PROC_REF(handle_wave_conclusion)) + particles = new /particles/smoke/ash() + for(var/i in 1 to 5) // Clears the surroundings of the ore vent before starting wave defense. + for(var/turf/closed/mineral/rock in oview(i)) + if(istype(rock, /turf/open/misc/asteroid) && prob(35)) // so it's too common + new /obj/effect/decal/cleanable/rubble(rock) + if(prob(100 - (i * 15))) + rock.gets_drilled(user, FALSE) + if(prob(50)) + new /obj/effect/decal/cleanable/rubble(rock) + sleep(0.6 SECONDS) + return TRUE + /** * Starts the wave defense event, which will spawn a number of lavaland mobs based on the size of the ore vent. * Called after the vent has been tapped by a scanning device. @@ -221,7 +249,6 @@ wave_timer = 150 SECONDS COOLDOWN_START(src, wave_cooldown, wave_timer) addtimer(CALLBACK(src, PROC_REF(handle_wave_conclusion)), wave_timer) - spawning_mobs = TRUE icon_state = icon_state_tapped update_appearance(UPDATE_ICON_STATE) @@ -272,7 +299,7 @@ if(tapped) balloon_alert_to_viewers("vent tapped!") return - if(!COOLDOWN_FINISHED(src, wave_cooldown)) + if(!COOLDOWN_FINISHED(src, wave_cooldown) || node) //We're already defending the vent, so don't scan it again. if(!scan_only) balloon_alert_to_viewers("protect the node drone!") return @@ -302,27 +329,9 @@ return if(scan_only) return - if(tgui_alert(user, excavation_warning, "Begin defending ore vent?", list("Yes", "No")) != "Yes") - return - if(!COOLDOWN_FINISHED(src, wave_cooldown)) - return - //This is where we start spitting out mobs. - Shake(duration = 3 SECONDS) - node = new /mob/living/basic/node_drone(loc) - node.arrive(src) - RegisterSignal(node, COMSIG_QDELETING, PROC_REF(handle_wave_conclusion)) - particles = new /particles/smoke/ash() - - for(var/i in 1 to 5) // Clears the surroundings of the ore vent before starting wave defense. - for(var/turf/closed/mineral/rock in oview(i)) - if(istype(rock, /turf/open/misc/asteroid) && prob(35)) // so it's too common - new /obj/effect/decal/cleanable/rubble(rock) - if(prob(100 - (i * 15))) - rock.gets_drilled(user, FALSE) - if(prob(50)) - new /obj/effect/decal/cleanable/rubble(rock) - sleep(0.6 SECONDS) + if(!pre_wave_defense(user, spawn_drone_on_tap)) + return start_wave_defense() /** @@ -463,6 +472,7 @@ name = "menacing ore vent" desc = "An ore vent, brimming with underground ore. This one has an evil aura about it. Better be careful." unique_vent = TRUE + spawn_drone_on_tap = FALSE boulder_size = BOULDER_SIZE_LARGE mineral_breakdown = list( // All the riches of the world, eeny meeny boulder room. /datum/material/iron = 1, @@ -481,7 +491,7 @@ /mob/living/simple_animal/hostile/megafauna/dragon, /mob/living/simple_animal/hostile/megafauna/colossus, ) - excavation_warning = "Something big is nearby. Are you ABSOLUTELY ready to excavate this ore vent?" + excavation_warning = "Something big is nearby. Are you ABSOLUTELY ready to excavate this ore vent? A NODE drone will be deployed after threat is neutralized." ///What boss do we want to spawn? var/summoned_boss = null @@ -506,6 +516,8 @@ . += span_notice("[boss_string] is etched onto the side of the vent.") /obj/structure/ore_vent/boss/start_wave_defense() + if(!COOLDOWN_FINISHED(src, wave_cooldown)) + return // Completely override the normal wave defense, and just spawn the boss. var/mob/living/simple_animal/hostile/megafauna/boss = new summoned_boss(loc) RegisterSignal(boss, COMSIG_LIVING_DEATH, PROC_REF(handle_wave_conclusion)) From 3bc2cf777f89d26a2b76e2eea06431731396fbfd Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 13 Mar 2024 23:16:51 +1300 Subject: [PATCH 23/75] Automatic changelog for PR #81935 [ci skip] --- html/changelogs/AutoChangeLog-pr-81935.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81935.yml diff --git a/html/changelogs/AutoChangeLog-pr-81935.yml b/html/changelogs/AutoChangeLog-pr-81935.yml new file mode 100644 index 0000000000000..15adf973bf014 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81935.yml @@ -0,0 +1,5 @@ +author: "ArcaneMusic" +delete-after: True +changes: + - bugfix: "Ore vents have to be scanned while standing next to them." + - bugfix: "Menacing ore vents now correctly only spawn in a node drone after the boss is defeated, instead of before." \ No newline at end of file From 558fae3b6465b09120d1ac133ebdb651141e6264 Mon Sep 17 00:00:00 2001 From: Justice <42555530+Justice12354@users.noreply.github.com> Date: Wed, 13 Mar 2024 10:17:32 +0000 Subject: [PATCH 24/75] Fixes grammar and formatting on the description of friendly megafauna (#81922) ## About The Pull Request Fixes grammar and formatting on the description of friendly megafauna ## Why It's Good For The Game It's not ## Changelog :cl: spellcheck: Fixed grammar and formatting on the description of friendly elite mining mobs. /:cl: --- .../living/simple_animal/hostile/mining_mobs/elites/elite.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 41fdf26250a19..bbe0927520bb2 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -383,7 +383,7 @@ While using this makes the system rely on OnFire, it still gives options for tim to_chat(E, "Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!") E.maxHealth = E.maxHealth * 0.4 E.health = E.maxHealth - E.desc = "[E.desc] However, this one appears appears less wild in nature, and calmer around people." + E.desc = "[E.desc] However, this one appears to be less wild in nature, and calmer around people." E.sentience_type = SENTIENCE_ORGANIC qdel(src) else From 776f20b4f71188fa5cf534f06999ea726f32fa2c Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 13 Mar 2024 23:17:53 +1300 Subject: [PATCH 25/75] Automatic changelog for PR #81922 [ci skip] --- html/changelogs/AutoChangeLog-pr-81922.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81922.yml diff --git a/html/changelogs/AutoChangeLog-pr-81922.yml b/html/changelogs/AutoChangeLog-pr-81922.yml new file mode 100644 index 0000000000000..29b776e6180b2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81922.yml @@ -0,0 +1,4 @@ +author: "Justice12354" +delete-after: True +changes: + - spellcheck: "Fixed grammar and formatting on the description of friendly elite mining mobs." \ No newline at end of file From e702d88c05f2f38146b1eb2988f4ce2ea8add110 Mon Sep 17 00:00:00 2001 From: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> Date: Wed, 13 Mar 2024 12:48:02 -0400 Subject: [PATCH 26/75] Laser Turret Resprite (#81956) --- icons/obj/weapons/turrets.dmi | Bin 81151 -> 80428 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/weapons/turrets.dmi b/icons/obj/weapons/turrets.dmi index 6582671eac0a26653560f313ccdceb37e3e0de14..acac1fb832e52b469c91ca36e96b688b1e3f87bc 100644 GIT binary patch literal 80428 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
Xp|Hc4We*EhJFgfDLkLfJsZ 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 literal 81151 zcmZ6y1yqx7+y?xNjgkiG1{IWUqz00T5~74iNlS->2pb>`0s;b(Ch(U|$&E%jleV@0{=3*$z9~c%I)Kzq+pLjxo^FrnuCx@_y%P?F4cVS8-Vgsp-OI~aK)9YhorSB21r+o<&IZq1_R%~;6a^0+xw#>Pj< zj%>x}v|low4v1!YU8wQkfV z&Si0wywP9g`t^kL=2*Rx73uu3*SR_{weio>pE0ZDCpIfD$pYdck;=DW{U3O(hji`v z%YBVyiADOdusfCq)7@q%8U1gfOWxG$rDou8?7SAI^YkyLO12Ubk<;Oy=Xa_Z zTeugP;ZAy4Ar;*hM^BYhhAw9o4#_1+``VMm8wCJ7z+DZsM*-Q}%?QuO6M?el9K5t} zSdW&>m0E53H8Q?Zdfus2J$qezeml(G`|*2I(}a6$6A!l8zn`wg?cZA zKR&DDy50l5@K!gA0e}92{(Qd9-qh)hs89LUoXL-AUpw}W;aOPWug3^mRlm-=f?&&+&S-T&5wfKKjb(kZX|nS7h?wq`WS)o&RIP;>cGZDbsKt-Zon(9rqIz0bd{anWi7Szo zusK$6>{IJH_3R0C-JY(_T>i(8ZAVil$H$r8hx0|?eACVQTr=|9dNu2(q;yM2i1S6* zKl42?Zd5>HK2#ASqE%sf|IgpQOd%$ZA2ViPVqPa|@+G6cghE~~K}?N|Ng69*Ufh#G zXbN$!u4fWEqi8^b&)r{NV@wEKh?SfsC22W1ey+q%<>j;^PSPt+;R!(5oh@VZ)M1_b z+;dEENeR_Vt(#N{dm0V0)tWxo@v$FDkvq&)pb%X4Wx2d{e@SArdWVNIFd36eiDmj^ zD*RRRlVP!G1<~5t8i2&(L*n1O;mf>#KG=yzto1UE*-}tYsI@UylUhG8%XBj{#dzuW zcjWEu67aje9Jw2pE z^6P2g#|Py`3^00!0|V?{6dWeDsz-&at(E1t?X7|64y~p`kHeF7tZ|rtNH3k!*sle} z^8@*cR$*oW#TZ6-A9pHXzF)P>{TeW5g*0LMSjd&^hHMl27%lGtTSxYWj~=aV1SppC zb8P{Q4Gs4b57qYqRti3RfPDG#g|(Z8n)+i^6@%*Z+<^Ax1@XzWpS?}r{OoKzXmWkM zfWz{_@Gt;0uyj9@uqa&F|E^Z}gG|t}o*vv7pDJ1`S2Q<%4%5b(lvXn$YV~k9+)J}3 zPo5;*`{H?i8=^awyuOiYdi;)=`4%G#gB;}-kw4Ta_qk!{UA%DAwO5D|pbD&#Rc(=}ZwXGGl} z&gLe%zhmsHVqIdl~IO_To>z;Aaxp~SpS;Q#>8D~a%2FOhHO0`%lRfBwv`uKrowKgEG# zz!+vM53SPNL)v4)xgc5l3}H;xc+-M!?`O%%851W$W7%m7hM}s&U+6em`@NUcIE^JU ze|C7hsJiQeTV|JiOW6Mbnx{`sX_Jr!QYRYXr2ku%Sm%yr-C>LPcBH zy~FiY$l{^E9#@zV6dLJ2q=zly2nir66b8`UTpiCOD5mbnecIUFm1BA0a4diy9et>q7$2q_cGa5oFAwo#EHjxlQgfZYjRVq`{b$Xz z>adAq;v#|)iu7-mm6qQ4>sC-$R5YS(e+~9A%Q0=q{W6Msb*iNBX!|}$W}m)N*+m-4 zS#uUDerDg9Cz6#(r^>JYlF6afr+DuzooX)deq5XZUds`}0x{+y`{uoO8v0_&12jxP zKR5M*ww0BY-IHn=NuuJ8h4?%{dazY%Z};_=tt1y&Zr)cY5O78B z%bQ-e3uwMrUN+wR7DmVk;?VhU6;J&H85qK3LtbuX*6yv=m&<$=8$Iz5JCE^!tk4VB zeR4B1SRZ_Y)*M*~@vNYmM)xPwzGvHGf29#%Zl2}f05dp}Lv0HQ2hbtV@T0-_hsfdg!{t9Rc!k%z}aU1S;hHf+Di zGQ@l)`K=3fqqzC4RTIJ(kxxT#GGgyT!bkrjlDgBcRTm{gOlMcE62~ZH%z~GbBEr-x zU<1|KzhM}3UI{V-)_JcYNm(JFr*g!>&8a1cfDJ7qCuY&a@5cvox)XYe<*tkN!xXxg zpm!Vb>yVc#r2;~;qCLd%nbU0nH-C`vK)%L%@uj|d*B}dM^sSN^XNTO8W*%aPeC+q| z&2=iWO|nj>X~;YWMwbtNRt-JT%AIN5tWIR@>gxIoldPZXMgv~Jp)Z? z7v-|Z**?C>vZ9%vm|%8xaghpuR9;tj?IgVwhY1KZ50M3=GVeDGYTF28SFVXuXw`(} zCR)GZ7}{CbeSYgTRV2(>fw(R1>#tYAMn)+`Jq^nGk8;H+X&WV@RZK{t+jd@4(g5{a zg3l*QE^-FH{MpM9^E&85wOzSGX=@?}oJ)#_nMtzDlPwNWupP}#oq3?S=}sPUi3u5e zEejViDV2}ySg5p*Q=u9j9bJCONY<%VEcYYCiDcv+ncS(G-*uSSd%vmaevR?XK0RLHZ}lB!qR?ua&SUr}|63BdGtR$WJi z=&QZHj)k3c?*92xrJVZ~P1{EOD7Jfr?g><%brrKJYrMEVpW~;LN*X#)B-ZYc{?@dX z!!iLd6opMI<_E0Z)8$vK=3DPg6FT?F|1&j5DzL17oa0vHS+e*GsL<79kAyr+iKI2h>zA zH(0i*gl8Aip$oooa&l^d6@~D-c`lP1G%87Y86E4bb<2*L>An3wNiP?EgX_BtQGYz` z0j#{ws>Dy@+CH<}wyi%mc9u1{d#x}1OQJ>d%Nmo0VY;u7Hhy*zG74k)G*UZ!fa=jB zv@yT!f2l@v-ip(*S&4qVyWI{NV9`>#UWp6X@VhBpvUr0imv2Z@OZCBngc7n8Ohx0w zkFV(K29npN$!T;*HDiewoJ)hj@@Vshym6ZgNr4tJjWkSS#$7?Rn*U?51XCnNk?uu7 zcb}yZQ!gL^*JtG!&(J4{-gHM+GRuZf=tWtj?D#1@lOq9!s6MYB{3z)Q_x@!xZC()L zVW-Nk!NxhA7Qu*^3PS4<=diKSyGJr~=>=RRyQ>9c8Rf;R`LWL*udI-y-?lR5;q+g= zv1fEc?IEoq-?Up?{|!N+MKkQq?4Dm3zISYWzenoN-dX4&CU8n&Y-R4R_HH_4`CVS= zO^T|@mrJM6svK@IcNFQjW+po-T2!Uo^n<&wWLI73HJ({21K5dO%clbBY285|#qV>! z2B{`TxOp@0v%Pz?pI;Qolg?Z@Q7c5zxY`#(TTaxGs5&)^FJ7$RqW3#hphwive$jL= zAqAWhJI|MwtI<;IWEC$?-kwhlGN30G?qR7Exu&6P^Nh`)hE42d2*bjs4KqRDiddSGfpnN+JYYOMzqjO+F zDa)Z2Yja=x!oTXlk|3%nC@f6*>#`>m)qP835pP2?1*~0N?+>x`s4&DTi_aYOiqg_%#AJS0AAD(t-=iUjuRJYV_K>-9 zqz(*dA?l#0cv3sjiOZQ3m}fQ%Df@1LX%0{g2gZz9}}GTPuP8Hfa0bL?CGP_klp4v=eQbckf?19j{Y$fvG-40f9uGfK3ok7L zk?(`I3VeG;C90wlxj50Yp!eEt>CvlgO!Jk+ok0&rWdHH`n2i0>>BTx@RoX%Y1jtAn z#WE45NQ7*!aV2U`8oo^80veUso5+wRU`@Rkg5*@L+8g7Mk|LUvrx>?h)||a7$#a6h zDgm)TR;~C80U>)qbm%j*hdpwZ`nbTQw{7=yh@u!{!3wB4l#lO-;$cF` z%=N>#RYr@ffsY&MOLUP*B*Z6YF#Gr)v1K{Y7lza)2vos>U3g``HKVT#^Vu93a%^xR zexU>yWDb#nuKE?hEsU5dck^7JKnCm10P{Ynq;`)mHp8WM*Au*|p#qShuhJY=xBQr`8c-rRbY&Lu+Q^b;(7_A~G=cFIK zY=VtlfQM`<0cwoar3a+V&dIF(0Yy&_*YHC4?L8qu!C95017LPgl=fd^effKY%7Hl> z;B%8qeV?>@sO`b~{(4Kq|9p$$JbOTeoT{dbipUba>wc!0*EqnS%$%+kGbj-xYOLfi zQMtk#oSSel#Mgf+HZuhFz9F56phF5O;G5pO+xt5OF|_?HK0*MpiOh7Mppi~h!9(^& znD|Pa!ua;tWR6t&U(}SpO*3N39WfO`xQYVpG1Gx*tcGj{bmR$SU7-`-6>cU&{(6za zv2G05pH=0=N*1b0X1WYTUU61AWmLzq@q5T3x3ka{4tBwSGDWaQH*~%ckpYw32Y~4 z&WBD0tU*&wNj;GbY6D+amK+r0gzF;B!4gC9$;zM~Ze0BL>8p&6;%=67=v4))~=Vosrk8RpT|b#+k+=e*@$3CHm#5p5n? z^#LD?2sx};h**NyB(5jK=2Ow)O_NV~b!egsafcIBy+HCB4Sg&ka>46{Dlzy#Ep-6< zTM&q30%Qtyt1g_hgIbN9r_!Fbl?JL|L(&Tv7#L)n8jwUws$yJXJR4bgk{@KrM*PL| z_h?xx{KeWdAjn*8fB50RrrZQOwX#k(ew8v*jeUC8{- z)0X=mX)dpJ9lb;*9^B2>56PDVu7VE-)>L4K2J-Iq1bO0ipfvEP2O<+RJ!aJ?0sftx9iYQqaD+U>7jO`*E1yMzG4wy^{vYD< z=|qK@V-sxECmiukSglWe)KXaOlb4Lu6fb3WNa5)i9IbU7*5(LhiE#!nH1G@77OW%U z#(>xnVAoE>%qe!R6i*ioZdP{4n1rgI7TTAR7E3ny{Onsi@RAiW^lL=SGw2NxM7B76c&$Md<@trcnS#_FzFTRzk@reJJ&7{ zTu}&BznQ##!QnnK)8BYvnJYPeur}2QsSr3!UMD1zZg1x)q7F*}MVHcUM`)BQcK>%! ziM3Qz75KzM*F*;J2w1E6-qG9AzjOV3J`PaijEGIzx!~@)kjt9MGoPi#TEZrUP$m$v z_X~PRkJEF~0sV>8i0zAX8(@;Ljml0)tZ%m(>f3H*Y3Uv)LRZ{7yRfipj>~D=!7=kj zC*0DQ$Q(F@$Dex0DiNl-c59(W;R|uV>sF8J=)(_qwZs3-S;WTJJ5ZzuY|%}~tRO9q z0;>n($vUpPqVRT!Ii{Q);>Xt_On8bS)Ul(osE5Tu>WFBWP?^9``u`fVu$#vou!Cq{ zl#>ApX^|tGL10GE9o?C!`-A9fu*lg{d~lMF!L8TPFP<3?To1mT2>cd+w9MrpYR`UM z_y_HSQTvq|rY+jK=4Y44zu0++-i37TilI^=*2XM!ZP9#SeE;{^C5kF{ncMHMfuKqo zsaI2t%rG;$n9}CpmSDfX-8bA&WQg|CiJD$5g*fwwsZ|+c+0&S)*tk}LtV_Nca*aC0 zM9oH)2UTm_S5`uWYaTMb@Bo_ujqLw$LVHf&yN&Lx@3(g#g@uK~Kz>=7*iS?M{oXWF za|5K2x_ad9|YW<0PKEzwL#=?Qw3F7Rcl3#6- zM3ukr0~(e!h+lYeyL=EfraY-Ln_B-&ieyCGF*i3~%muyy@c~L)HdYz=T7VUym4;8! zem^BEqHzB@eGH{uqn0a)-)CsQZ!OsQf-Qf%24Cp!-wxR-!B60how1A{D#iS+U8InA zpUgH@GZ)-#^Im?w_jbu`tc+6p6ys?F_Z{h~1*~PO5e+A=TnVrioCk<~Rdcu}51e?& zl-M7K9M0eL^K^1hnq~w145R$^F6^(yzj=+Ykq>I=L0?v;&U1yYfY+zz+WJZ#GJ_o>rpEE$?D~CgG{?-@K7Je;llPp^ z1wz1{AS6ccpTTR63AtV%#F^T`FInC4dI5})f7#AL39@SaQ0s5z^FOCq9t3c@j%-WL zNoF)ujm6$mVnbLjuX(U~cgf$F^Rv0=2?1=+N&gC7;%N6IYm0 zHu~>&CG%_3CUzfdC`Cj>MEc;qgNUR4WTidD^1l4D3Ksep*mz>%pM(ryX8}%I+u-JR z4SrOQA3tuuRK-LVzUfOBBL%K9GM+tynacPoCSM;`+#1*IWCz^b+yb!s-4Ni1-9x$R zjiB20>!CcuJy(&oUhhkG;A{z7Lu^RA-e~iFN*r#Xe-9YV@yXa(C>0jQx)Q*?mmCU( zf{-&!2y5a>J?`T80_dqhByWta>nmRfbH#U39>-~Y(z%fmd9oWtXFZOe3Z=4Mz|;8q zt6y7or$mA-(AuR19PH#ZeJQ5nc~1B$0UV(KYNR9-``{W;d0)+F8~1I902nDd$wi{Sc6sZ zF=fw?A-9KH!lTEJV}75D%gaX(4(c_(5fKr2nR$M3p^WnR*hK??OXT_dWvaGMSkvTN zRb@P8#mU8`Pn;6Ms{x3ahD^KSda^EW)lM>1T?zNvaE`q&7 z{vC>0GYFP)7lH#>70#SD`h?~)h>;Vnb-@2_LI8`xoN9!zubE9k=QGx2LZ7pkwPa?$ z6QMvquj`$NIgvBrT4Ci5!P=I8kOQ7;1C#H}-15x<|7Tpjx{+p74S6*D|AN#^`jVM2 z!1smyyoJJGB6IF8mW_?gbG3&~fdn*FO_-@Y6iRwzJI-_!#uVRf+4w&wHjtklqq4ib zEuA{28!pa3h>Rowmfs}D)3q>Iv%krqQ*H7UIq(IBJ5eZwWVzIK7?%X`Z`$^5zT!2iL~4X(H%pXJWHzZQ=lr>S^*UAX^uLc=lDXyV}` zOhQU}jB0;Q@U!1<#Er=eOcTUbyetX_;(>1`2#{a`=`DxoQXOoO-p7;ObUJ`#h7ewn zp+d|%gGYdS>%Q>sX)>OD((M_7&&8?ZeX5aWTPktY~d8k_z%BD{=T@Ie)WG3#i9U zxr`h|7UDasjEurTV7Oz&YYxcY1wrud-VeT=z)>^sq?`DUr6NQIYWm#SQu&$V>`&Rp@4@%25Nz(%4FZJ zOCQ~lUqeZYC++9lC+&FyJS<9e-%*I*KFqWHZDaoA$x*#TfqgO^g6QHIkvIzkj1=ce z)%^;a+{*i}yR>klPD~ljSl?j36}ns6y1EpAhXlk`pgQQ(UHLCEFQmMY2Hk)3lLmoN z2M*MbAnXfOd@t^T70}Bb-h~bgrCXe+%nt74S^uIbJP{MX!|=^35m{78(k_Ho1aw1X zNk^U-=?s3Z3pU&+_&&sQ27k&4r&d)VK~niuKPMPtKdz$}qT=r(j~2_G)`x)sFaPV; zuF|Hjm+*L*`gq2M{5MLI)do)}yzCcPqil40n0grsBdxHN%Y-dm-J{A1CQo4|b&!JO zDimN>ngG*wGe~`cY5RDv5!|EU;o-Gn@U(D+KaXxjjEoqD3#iuOi!oBCFxB5j?QhfZ z^XQ>@(s6rj2|mesRCh}r2ZSc%+dcdf?6i|y!10&sm`?o@@<1~Q9+0pQVTyA$)@=`X z^yrb3FBf4hhC#qr<-`NEXtzqEieldGlarS(q~PNI@LcBLqaL86O`QUUSl@IL1R2j^ z=7kOHa{TZ#NVGPO$Z4^J3{l~}(Q4_~_5Xg7CsE|02=JW;yV&EwVH;h3WD{T<>gwRE z4o0I)pXOSG0IfwFW2QL0zoFur&Swvu;|^V1WKOd4`?}kUFbtRzLSMjaxn!H$h5j}A zcOQjrMR98(w~xZ37m9I;1BNye_#MntWfm*XZKOnPNM>%$#@HbB0YZ+!4 z>`eYn`(%>IAhq#*@a;EXy)&Mg7K*d+S{Xs9_9?q~>SVR)2PJO7`FN`v-k2+4H>l#B zqxRzRw)?(w^J#oC9DXYfBChX{;_BOt|EC4WQ3`x0AEo_w{_-~8o6gmnqBv~3 z_J;~Ai~T3o{7PExt~*>cgnV&-e7vXV18=d2;P8U>$r>EAYMxageo4-%9lY`K!4}Ov zb|F~e6NhCya&wRwq{K<~uhuVU@`yffa-T!HR+pKrARITuugLEHOh7US=xuxo4%VY} z){iyAY3{%U1KbFDXsf7FeJxd%Xsu7+GvD6ESPKv#D9p~4Zx8JWv4G7|Lz2ZS^ApKBvc29-^qIsGOXf%C8dq zBdJ$9x0>Srl%KZt1$7_3CEYG))|LRR5u9u?LXmC6-@E$XlWbR1k4k=DtnIyQ@zfH>i(kP~H<{){ zgn z{Iy(}b7kwk{q?j5lP$rG^ICRi?epk+wKynVU#-XUJm%owAl|S4AEWf~uniDO)$7a~ zUdVfM@3acn7?FOW-?kY=<_IkoXrsKX+90t<6JudM7|u8sHlX;Rle^~#prx4sili2a zGZQ!$C5}U~T4{N0HDD@t^}zb_w>=CUO9NnA8zwBQ`a~{=kMn3eZwxhSw`mq8&hpib4HG#8&<`6ZKASOS(^L*Su%M`~T# z7ULPa=zrmV7)df$kkRy`I7dSy5gW!dn z!%9lXc>6%(zL9>_-Ocm;{rC$sn~f&LlVfjFkvLd?L27YFk_SQ0`bDY51$L(WJk zlJ_qIZacVQLc5toli=!Hj_#{mSi;7M?XIgKIw#W*-SBhAyY)~D=`??yBpU&4+>Nk2 zpHpMu#O>A|O@Eg(@}t>0*Qqc&$s#ex8awZ=6j;X7AvrD_MK~siGjy!+**N*D5|^i7 zI5@PPXam(C`5?LPwc;32`Q^*?@H~uZyAK${M#mmzW6HR>{W-h_3$z&LqAqa-3BgPE zokyJuw990#YFKwB&4+jY_un2E6YMKl6@C5uwkEvB@Zm`Aodt3&ZEdQZNnvg!5Yb;J zrUKna>e4?NMH1OVYH>!wcO^4@f8xzPT&+P&c`MZ+P+~g>kW>10!IQ$EmO-9WXBr?! zErtwgNCcS0AY!;?H5lekdDh!7Jh9fd0A-Q^?*sa!JLf$bk%t*40>^Ph=o+rl(qQk_=h$^ z)+$@P*RCLsIG#H@7v*jyYF)b=>Yl-qy>f*^1=p2RdWh~{#cwT1un>}S^?9^3oA+)Xz$ zDt%fTU#yUf;G5eLPj+F~J|{kYyma5c&YmyBg_AQ`YV59cCB!c!vwd!^ly5QAa|RWi zuK(HxY?q&Ns?6ZQwf#t{9y^V?e_JCc>bo;xU|?Xho;KP_miJ*K>EdORZFYT`HfFoE z?C&58gy?sSyoQ=~wMG=a;JRrO`$!C$ikh13op($?6O!utGlGLe^ViuCHqU!7{^v@* ziGigUm`vT?5KMLMnr|`Wv**V|HI&CWV@!0NStjy;ib7d0F<<!^omNf@tiy( z!f)!aX-t6KG`w~9CK-GNMOnz%R|+k-Cho8Ur!*i@p*JwRkP4qT(GR5Eo<^~jnK3Du z8C;N#f_Tb_$KyAkk1Lb3>0ZER=MqS5C2TI_R{Y;mNwh;%nIsvf;~tAPFyUlfUfV?& zGTkl{)oFM$QJua0V5qCf)HGXqTHsSmlfcnIGVwi2vX=O52~dr4ey9Y>Gg3)mIuu-a zqQ---9x1FdaoxJhCp! zD4BqUc$p7qU7YeGt3X{-PJho(*-0MN>mNhwM}+GsCU;~RMQRX|MAS0@a8r)Ie+PTQ zJvxW#5SG}>=wXPPdr73BMdrri8~Y4F>%l*JGi1Df4-N^I- zou<{+uWLNUeS*b{>kd5bgZx6%Ka{Nx7ok#pYB|4K%l`W>7TXTThX1}ngC8$3r&3&k zbSW>Gg@lyuUluE8yAz3t&~iO>;jjrDEvO=FiOZjBcAQ(WyGDz;Z+r)JqE_BOqnAHT znDrn`^@by?(!B(fPM&-`8T$KLpck=QgM+s2Mp^&D+gH*z%#o@+ms9m~*I^22CFH*FS`AIXIRgi;RSri`(xP7dTsk>D zUFoyJdw*_hG#3&R>;5~}s227Y1~TEle>$9P?t)zJdGLoxa(V)YKz)a8u>Qza9cSQ~ zejR1;@|NOzdw&f@Fe&lkS*mKpl5)9h8LmRe?qjDe7LPc}nqa^1?H&Z_=d#jJXp9y-JAbqK%H2GRomwiT1xlS?h4i~UE16Qwx#qo?skW4gZ!n~FEiNAM*|5IxzY zAH-#xoSh|#?_1ka z=x~HTwd}CGK!-vLi;I7z>sCTME|Df3V}U!WbfZNs69zInDxg3~;dToheG7I?jQ#E1 z+jAu8#H^5iB0-jUvF9x5BqZe_FWm#3tS{jdN#mRVGb?vT7$E+g+boehSiom@;N*Tm z4cga@3vAh~O0T}gFg&`@e|CB}M3IP~9WG#N`v(zB6v{v{vXb0+RYd{7Z#5k zOGp45rs0a39d!gSiu=mdFYH)>QjBA;ov#fBGtB)9#{@v~JLY89msGn~a7%xmj^asVN`-Q6m&8$1M4pj+_|_|yMsjCKMCNXEYhi-NWK_4~XO+1zLT{{Ei?;R~|o z%;JNcRS@-53hM^p=+0;I!RNkRf?|UE>uRDFZQ)}mT)bu8z|O)In;L{7SpWNS%|XW_ zsG?`!tWls-=XU0KS}}Y6#&{_iKmIZiUPiNk*Zla$!v1l+%7GzTPAH!iT8r>;jh^RkamANkZSjX8SUE>I<*2y_b=P z-;8C*y2g}9@Xf_UgtpxR)wgE);=y%(ry_~7`oCF;0zr*p0KUo8@pj zT#$AIQCv&88+`WJ>>~YU)Z+_*y`6;w3{;d7P<4gDc=1(K#yNCzN0+DslZNFBKkB3x zLuP56A~fvLcQ7Li`c9H!<>ru6=r-FErVzg#2Q7g3N%BSV90{Xmu1B7~`N4V&?55Mc zKy*Bkrvp*jS~{@r_EZ0F`3%bZA8*dne?r5fjx{%HQ%4Yg zEiDM*BsBUY=vTxuUTk-uESVKVGn%QsAY?q zddu`nmGNqudhPUw=Y%UEZNDT{iTP8%6pLFK7#dcTf>Z;!>QFoh&yz=wd_z?BL0og- z3W9*ZnLK(#5dR)J-+=~&BAL7 z3bL|(577w8w0nX2FP{zV2I1C=AqM8=1xqeKi!9DxXE7WZsik$aP+bs6`>dZ7QZZYd zGV@B3=&RA{7F=x~#`{?<++t{F;-bf2g$OoH4)Qm7_95XI3fe+C+DAB0N1h)C=e6TU zCIDY|G%tCM9x}2kuH`fr>RPI%WKUk1jWEVAi?rJy!fr(^++maMQ4Iz;mTeDIZ^%*` zF`(+^#yLIn2mAf=CD#wv#rlYn@TgDGavvX4JeymAw5v zd>WF5%XGwkkNtO_ENm?a+VyVd-NOH-U;q8fHMW~kjcsWYWfYt%5SN7}-_)hmLYgrN zhrmR8!>;qIxDwGz`hwu>Mv=a4g~!MLo*QYg4UQG)Up$8eFg~m!atAzCTbytqht5xb zSU>9%z2GP|c=+%wR|E$@%>lfrZ%+Dm+dtTMeLz(`YZPnSY(l(TNIxYF&)jX&8csp$ z`~9F;roR@%>Awp|29`HA2GJ%WxG%HGixf@2rbJU2@RYlp|eS@R$L78rj~b zXX>y> zz9_>9%P3p+HxOQpXaCj{UjhQ~0uL}yD{@*5+yh%+l1jS?3zLDfOJf2Z%wE@U7II>< zxz{`4Y4>=+XXgFx&qCp(XJA0`Fu>VgwJg2DEZfv+la}-m`{5A>(2oX&x8%edBD@ zDX#<7*hpG2DHrS!6dWA94%*#n@^zipsOah&H~C15b-y#s58w`W{q4~>w1lbAN{*iz=mp$Vh`GZ~MrN*p9p{4f8`#6AZR6nsP+g_tg25&|BKV z?@m-GsVG^#-q=t{!az6Y&X)Ig`A?SRq?93*0bXARLFs=aRrKV!oSfVx$&z`{&ti){ zr6PGZ;a^qSto-o6JH~HGi1|`X?mi(}T}R675Be)=ndZ%c?-eAY8k^f~wSOw_U;cLw z)RS@!8rN2-07?1mwxJT8xoquct0%0cG4L1~H#Obv{jh<9zb?;5b&wdU2O6TT$ruLa zeFm^v9vK}aLeKaDLhp80*U06y6~Z9{j2) z=$o`;wp=f`H0m_n$_a>uY5&~J2vy+cGUlxKC3&45R)7U-hx>^YTV!TXp0sMYd+>`4|AM6Ioy{P?`hu*b|fxWcG7!3&hZftK?U$r?2 z94W+M_Dvu??7-D^Kvj;&ZcEH1K2R;lBFA`Q{tejufXf{*e|dbN41-%5iiYIBx!fId zbIKqN?PW0x7V9_#cd?P^g8G#09dHg&2&{l;8%Xc*E9R>`vJF zq|%j3VsR9W_Wc?3#CNA7v3E)P{v~zy0Rt6hM2rMmTb#VI{>li39)6H&xRYA|0@Iu4 zS<0lfqLyBZNX%||{=aF7vPy*TsM$@JLsgxfZz?D%T39@l)_$Pmnkx4Pf1O$4B1IN`Y?}Tc-qVMmYxI>ntg_sI6y6k_9jErnq&idRucDS9}5P9)kmKa$s??qMZ58Kg|_x zc?c3;zY`uQ=&zi&{nb&|Vov5djEON9xP#DmXj;r{0d@*;$-zkf%DC>Y#3^Hi6| zrly=dFQDVPfLVDa)enY6yYr~trC$uHVVfFQGd#!@gO!24u2D`bdj z^ltni(IxtqgcdJ2vFOBB%Xam`(3!#ckE6TZghtnzD& z`zgGe-IcRYQb~&>n+COiG9Uc@I+3{Vs7>({Tt@meNGiNYZ~Eml3pRXrOt}ErFmuxM zTGQ0|j6nvG7nJnH1_~f&jzGXKLzaH>x*ilh03Kqw(R?k<3a9oXvMIJ)kVlp>`YV6a zN6<&TKYZ4(wMg30)chbC{_s+zaM7LzeJv1)?w^H&8tr{?IdgKK!|eKKF!AcIr(gmy z+xCh4%yP{^sXN@$S%Kt^lZFCduX_aLW46mM_;-cwJg8}$jY37dqG?W__rq0xmVe^x zw!&BL$^qKiL9d6{n14PeG6UgotB!7p*@LP+gPU*X2OjE_wcV`Z_(ge?TguJd4H9aN zEi~1_^vD+BQHp@{l?tlvBbgsIs{hm#+z3%?js&AsFFrNH_P?{csxN>1ynj?tad=%X z7E3Y;3ETbdkP_~y(O{KtZ>@0uZL6!JWw+OVoj1tn*h)JHEC53zQ?O}Q&C@@#@wR!6% zYF136%|8nM^VpRMW#DS+CHG^&#sXZdFkxR@s8I@90DDKj)rV!dM^QAC{}eY1XAk6{&*)AZl!P5+W%=I^ zWkL287wOvi!}ZzM%lZ8qn7A|beRdq|^{&yI!d0lzN>mkK(LxhSxd*B_y!JLm$oj-m z(!_Q4cP|hQVeu^^1_DaIBi{Mpc4G+>3$q)Scfng@zSKe;jNbOP>7TxkW|Ps7>dRdb zK!E3g{GY6-wdwru$i9-m39j~Qt!Qb5YN5ES^FNA9543ZknYl=i^S^}cHuVBPsmOU@ zb5ql7IYTc0E2`+`jNf)XTTpQ_H@;+@g~QG3J{6|tEXKZKke6C_1d@(n@^f?}!s8K2 zz$$Nsvw!ALD2gUD0Sm!SaKmG&9EX;D(k2g4AOWfjG0@u4ldUA8cZZ}WW${cB3~1bU0qR- zevN~%Er5s9sUbw6*3RiAl-E1OD5rTfywb zV&ZbYp~RY?Jf)W1=5h>bB4AHSCyqM-AR+uo%zJc9Q-_bNIkY*vIL7O;1HwID`r3!6 zv^Ds)FZ*ygOB$Z$k70AZJ^J$XvO@RVBaob-2lY5H3HIaiZmmy-;1S1{%!sy$(OvVG zj%Z(H%z4r}c=k2)FZrV8M4u0+I|Wa{_|hZ`o~TxDru}*oz5NKlHRm4ol$#S*<>vBq z=5_AviK}21!}CSqf6fqD8z}!yT+o6!$T*xX#E<{Q=;4AUzf1g-EdGwzEh{)9=mYER ztH#H>V&8*&yfL;rGEam56oqjv6me5m;oIBWd+KLHC3c2yF6MC^c#CwC0B+B1PjbdM zhl&@CU!S>Pyxd<3-2UctP|Xs#1}PVcn|WC#A_#JBVU%*!{qI_Qi+?Hd5x4q={%Y(@ z%+-G&W|2l`VFspV>n^FZc|{%zJ+`wdT|)NXXu&7JDf8((Zgy4n`GidtR0pc2=GWty znMVII@bm$k&{W{v{|sLP5>_BrLbQi%v^hYO?JqtA5dC|O!Y>{k)8KIzra@G?{EA+W z_bgbjAn0ra{+jE38$571{R+`4Z?A<%T^G&|nI_RTGdEHRdHyov4NeHVX?2`JfYFQOl-i z5N(I5Mp7Ic<`I+zbCu%~*yWa+Pv_ggSKQXt^H-;h3oqu#Yinzto0NTRoX|}dy}dj% zG(-wCo&C**+xiWl3SQQlvZm#Ia2XX~2Qv zwi?h=i2%^rLPSgOh2QYHurYY55_FDKs7WpDw$6Tz2#*P$_=?^vxQt!?cbLU2f1=<4d-+;9!xJd{3;k1#%S6I0 zj1quaw}iZI)?e=CP4+h)vwQZI(K}9cHK3N72u82b#caQs}r1>;_p@I}V z9sSG#JUmE`%w?rgtu8DSO#Q+FMp?&9go~Bc!reCrb3;Qza~7@wTCl`*YJ)s1i z{@M60#*URN{Prylhz6ovr>mXYe$*=~E7t?kz>}b$MrZ3V^+ZBm#E)5bI2QDr{ zJ+p{ht0Rs%HdQkxL~?I$Z%k3qO&rwl2t~$TkU}5)TPpADnt%Xlb8|CA(g}$jPq%YX z&v{WviTcHnWrxk3%e6;b?5$6X=YHU}Y?>NuIQo?6$4E`}*y^U}-)CnNGO~UpF0R`O z2yDRd*-E#6#k%>vSz3&8dap#ldQNxgRc8NvEHEj#T`6^KTlLkE`Wk1`;h-&Y7U#Ho zlfa4yE?BEtaqJVmmBLy!)x4bdCFT5ZXe3sf$)*Mcn)^d6WIqnm#@v#RkOeE)WA)4T z$jc8wBsg1o#fuY$>6daJIwJj-gzJYqenZOTTNF^WwSO`l4RB`#HKm8$i6(KSKPZsf zJ!9MQY@u&~^5gYBYX_J-=W*pas8A_p7Zz1{XZ185B#nLv6B@d-4wP7$cq}o2l=Fe> z60?Dh%%V>VNs9B}9z8z-Y$sRj23O7sc0+BBh8EQ4$@aYAVXg=eaGa@eVIIuB9lpPr zbDz9FHJo-k_qGQLCkv9@LQxt=N_Pzy+js4G z-|zQ*fABnRzcKEs&N$BVI4+K>g7#$Fz>kB@5YX??IzG+@TJ#QRdRJV1)=ztT?>fAV zszrxzf?sHVP*WNP{RgHT_G1jo*B{y)s^R|NbUZ|l@1u0M&X1k+0~ ztBLY4gC38GHR#Q`r9!@d+FwLEuu1%J*EgwIU#IxK` zb8!&`S_$qznc?;?$?kq=YJKfnnMob;0;}lCRt(6c=fX*c?=w5!2k-X>PE&8*ldL%GT$(bLMZ z&-I^2P1rMwY)VPY%#P9PXl5JskX8(KVDR<1iI;AM2mAbuQE=$wyjKIIUlAejH?_kH z9KrIb0nF(l0Q(CHG)}PqCjezJ4e(Y}RMf$G?5r?Fd2{K1Xbc&&xjDB@3=(^M(30+_ z$I@#QX}8=$CLS4vI6IFqLre*FWD_SLxyAzOiul!q?xK>lZGrJ0cP#R+p<>2*E8&^; zyiX8sjG59be3}f|G0Ppw_=xy)p+!X-dmmH z7kh_GAPyYNmzDMV0wT8RV%6TLyt73 zK=}tX#l&fUDMXiJ?b9-|Ps?H1ga;@DI~kJofsT&V^XF7@a+wzq`edM}q@u82i__Ht zi7OyrjZ7~@USNIr^r?*j15=lfkXDGGCmx)C2$+C>{}7R5RZ=9y>ccO#vg#b}ASZ-= zwi^)Xr6j?f5>c{9f^M4JM-Ia$ZQ#68V)VS6q$2|Ra*%c}huML>28}A5d zAC5;Fa3}K0up4{)9&#@^E5RY%@gFwq7$SjQa-JG#M%#xdq|To>N-HW+9hTtimV~Zd z`zb2U?|cjP^4a;hcnI>KCmVD3;JgX%W3fK;H*oeS0N>x=zq?jcW;Ic18)9-1e_Do* zi{=SoTOP6(ed-3JY^rNDMZwl8zVJ;+fHeV}&i%|hU)4$qYg?6?6Mt4kaeindY<6P6 zH4=c}9Y08w&oh5}PydKF)`mfIzw`2l@`qyJEB<~R`+5JC6UtRi!h`VFuV05jKvt#w z=LgLS5YY91M%-G)XY`U8Mu2b>NI;MR(`r!X_HIsrl}shaXBJXr_Y$$d=VScJ&kv_)u>1sDZ|vG^D{JTG_7LA#bX{uK zN?)Iq+iw4%JxQrfss zGkA&rezCX=>IPpBbeR~x9rm39_{eMCgwy?4zxEcqBD|3bmXWm$CxtP%%rrzw*$>VF zjg78qr!lwlQ}2#lTE!jcuipaAQ+>`3(H>}43MOh?Lw#~`V$k4qZL4uxIh=eJJoO+A z^5sh}A|{W}$C_+<0tJM5Nd?F}JD(qkXG-c*;ZLN`l3wgT;pH5e;KYQp%z<}erw3k~ zH~)Kk+|HwME|>c}7p}z*1c0dd!A#_tlZxNG83|m>d{-i8ozEtR%XD4n?ymcT2M>6~ z#B}>0HXa^L;8qAO+oqRcae3Lg_vICXZw{$ju>4o8zsOVo)ItMAwd_eEGlNqdr6RgK z;Y5(vZ!U^O81UtA^ogO%&unYwv(Twr{5|)IHhgaqMaNh8>(JzoJTa^^sd(PWc>w+n zSu4;U5m#1D0tIRV8Hg}Rq!(CLmSd@*c7nwO)`k-T4)2bc88>*bG6;QkhUZ)E=Mh1< z6BXp&*s0!?Hea0lcY77_7i*8^2?J9Thu3uvIyf!|=v7XZx9Y7@%=Xk<)cWcZQpZs*x7Ni1a3Gd8-$ps`^GXsapDZ#aBqv)3 z1zk!@OFOkw;TyJ7xxgZ#0v?7iGk&{Prr0~2M7^Mw?PLf-7MjB&>_JeI#|7p74HB9; z(MIsF5svaQHW5m)?mBmHyZ!ec_Ro;wQyR!rH*f8|t=|iQpu_r|^&zr+%Z4D;J$=;4 z(4QCQ9sh>x&hHGtrw(b?&h0f%fgqEdoLr1LANww3XVBzVA&Lc#za2#GG-EcGZK0;& zU#0kS8c3JtbJmGR!~BK>^N+ER|Ik7B02-RjJ_J3y@b6r~dh6(b0ncknW3@72+uBKWVO^74}l zzW7`5hhh-&HiDf!H+h?ovc#bk;5-*p49~7!z3R6APdoToE69RG%5JM72vN@aJMk%5 zS=DHkhq5B6ohq22B|-Xu zIx*qDzXHIuZ9@8Lfo^($JB!xP5Wj)5e9QbU<Uz0JxoW;azE!UM>5c#RCDZ51Pqq>@dT{#l@8{opsEIpF)78^AoVZ9HgnB zQxiDXP&m&y@hxuT=&0V@RdUqvl<&^LNNXsb)*sYofB;uX)b{b#Oc88nBTixg!O<$U z3a@IXoehCreO*qaD2sx^Xgi0%H{r3?lRQVC6y@bau!;>4g8ZOum<#rNK4Ip~-0^P!e#vRoja?X+IVb5}d7{&_qyEZ<6XtCc==rT;wh_574F5^8H(o=Rrw27YL4&- z+O2Jg#rtCj$nG*1zC|#v$^ZN`4X;VJsk=zYOAOA941YTOg3+2L8PxUw3*)41)kT~> zfm%D`Sz!?9BLvKIfO2poDF9rCfNp>ngyHyYHy`ih((YfbO2yxuZQk}aX{?psJi>Wf z_F&^-Ol2mSw2&)q`*?etfOITBIhVn2*rS507ADWrN20R{8>s0a8r2nEH|_51?LE24 z6L2muG?fPqS*-$moe~6I003x!si+3?4IfJ%n;RO&Y6(~g$#Sfz`k( zhc{FHKk!3lZrvQ;AoyQAK*%hCW#=Ifb;zJ(#l4sohS`$ZzwNKD>w^ML1u(bJswq`k zuK;L3b;q9{uV07E{Fj&^P-AQDv{PwK2>e)7bOB7kPVht|;qd?Wg=LtLsMg=VnXU>7 z?hfCko$H{5e|JTk8FxtJ;SLHbp8pZfmiNAwM^w%b61K33gsqGYeY-E<^x9^h4}^migsG&{r|%DGQpuR?df5$^ccH8v8u@F&Q+q3g7GD2b0&G#3gm9%4tkg zosT~FFKkDb+91Sd+lD@gTj?vtRSGu|H#uoU1If$FtCiS;=4-tsk1L>iV0LECvSS-? zMnYrV!MjHf-QCHS8#_AKIM^R)Aj2-|<^K+x69YuOH)N1EmMQVGBS%1Bp!?ReoF!d* z6bjzXHmJEp#(vlZRNUVP(7C!*$hE?xr-!sgi!*76~&mGY52Vco?ZC zgPKBpfvNPC&)-IY>=%>)-@(Aj(s0tIuo>LAElxbNP3D=yvm=`8QkJ%PI%HQ4 zwEy}kEEM!xg{XeZkzD?+H)hw*q@l?J1O>OAwdiR2gxn2WOnMgOX;yz~$-9){qy~tl z$x{Qe#ekGs<1#}90RrEJ0g9c*bD+?m%t;S*D0hM^gN_5ba^*@?a5SY}EQLDVZeW|q zA~}{z4k))dm;OfFx-Ec<$WMgKFa{f7Wc;dB5(oglV|oYF^ny0kr>TnziIK|hCsS*g z8qLqTDRyfU6W5ksn6|VNXsp_oKc$vX=&5xl>kztE{DyvRT96Qi(m_G-{@k7ovdh7P z4M~VaKuBcLgn(A03KJ$gT6lwiJq5YJ%Qn8{#A|*_?-J2G#^Or7$+oc zU|$}k(INz~TSY}%R1dJ~?cMXQi+JV_ca!O($SpMgJ|2I4CFZR4FR>XicE4v(%&{yP zL7f^iHN%)1c=&GKO62aj40pXXGk3E;*HkGYtkFZNssb=z|LZv!%oSs(bG;*zF`C#% z-fAHp+v2(BGFWpY)*utXn~2PxM72TXYuLhq0)jK0u5%~m3EBxAhA_Vil_Rg*e`5iB z`>!nea*BIF{}>Q#kFZtMIK>UK0Cpg&NLZ`J>%Nz_vg;zXM{L*YPcJL?nZ}^Cr}uK= z&+&_uodw-4jW|jzOxO{$(PRAFn1v-|no(+3@Y2Bj?N>*?-rG9pG?R~N-{W^IN_qse z4E^7)m?;MAH@pk+)rN03X$4$4>?5T&Pk^M}+0$^g8fhgHW=p2m(@o*t(w$O3;UtHf z!k|-y!IrGzwoZsm1r=dJF8sOykhQ^Wu!Q$=G(Y_1on4%K zG12@NwAgB19ocj>$r_Gi8zF1`AXCQw$Vv-1v*8w=p0H5K9<1}F(~%A0t3w!JH{#(=!aB+N@5`I* zx$)R}p20DzRC7?P?szpG^p_tT9j&2I%rj7{|5^Gy5_K3-AgHo?lCtto{qo?al44N$ zpV|jB0fIV?OT+UDU2ke;kR|LpH?<$Le@fm&N(uH#mYZ}Hv?1(biG$t=k>zJj=Qou40& z_boEw{Fm0E8-R2nVFpSE5D_&ph^7Cir%3IQ!z=Hs*YQ1EMZ=1l>;Yg_WqXy#Mh#(DpH&fG@Fd#vqong8U_=e6`xQo8_8H8Gp{$;+QaJr5K;75{q;@ZIdGLA*iYFbB9sc$Y@QDHob>!{7P@icrV_%E9Xqiv>hdaJgVfEY8wh(Xv#`{ zk=w#jgw!cF|LADBr8plTaFrjYa+;|K#76jZp@F!?73>?8zBRN#GycX?{m3z@G3|PTgFq;@5-^&4|Ar9i-eykBz zeP^a0?|6Ethu=DSs{ULdae%Vn{Qj3K&g#7Jz@v@GLQ>gEfh+{_xkbzk(2hjlAa9-k zkJE#BaO+kpwU6g{r7iI-$o_I4pT_+ zaZMK$9*!JXQ^wem82IxR_qCw`;T2!9LY6^Vwo4$r5`5a>HNxRGibJu(T}cE4))0-g zh+2xT=S!3Ih@09{Y>;cyE*X^H&@ky{qOYHhlVOMKKno080$%j>y}3|w?i69gWSPHy zx8b!PKMGjma{Ai$<2|@{+$n4<$}j2s1UB*gd%h0)2{$~kR2x#o?i{ocv8BkH-}+36 zbjvkldG8q;ow#Q=gIeUXL+snWBu$h)aUv4Wi9g~jKEnZv{KB-A5I&GH*%AZRT5H@8 zVPeeG3NTZ5^3(n!Wdp+a{9$V9>Z77&OvTd9bCUm@HDH&VdZz8F#B333w>?}8G0&3{ zgE%+0KjQcRL-$ZuWF1f#){-3tjmZ$f-mJJWE~#s4D4M(_am1?fVvlfMl}4bh-y$pU~J4fp@XwgT`qAMoqf3`Tb#-t1i7%l5mO zLqQt&z~|5V-Xu4R8YBMFN#6GN_y5ed&b-0E$fENY)}Pxg+UDWp+#klFaJ}XIXD4`_ zUq`4Z!&3L5tqNbct2|#*Nr^ULJDlhn?`2y~=o`3Q$B~TE(5RTR()0)pTk6vQDr@UH zAQ*4?WP12X5D~(Oe>SJ8-*x$@>yk;`g>iP+DJWRk>?z{WS>cKgi`WBnnk#TCVj{)~ z{YCKaJ6UCx!MoOM_2WoD--8kYfA0V;*>?THpqHGeS$n*by`prHn0->+%*9K^JE$$$ zC{zoTA{={taaxIS`lP+G(}C_m#q{gO;mXYmG{_;4>&XTjd@j-ofmT*lhVcbXiXa>& zR8Kw)0%|MB!Rj~NrEM()+ZO}u-8aT1W;zkzzjG2;NzL3M5bc8k^kduCN-npMVF&8v zdn|Qw$>s}GlHaV(UQtABxU%Q!=YW7|nsJJ+Dat?@x{g{L|&WCm5 zs>fhIV#H$M3c^=+q9W3c&|t>{drz~Omyoi2)wp6Gdyzm5Jlwv>%(2j9Q^=cbwWM@| zt)4;zfufP~b?pS?Q9!Ia{iYwL@WvVczNU;5lJ*#prqN91zGH38Zx(#`3`j{Yv>8xq z9&O$H;p^+|y=v8y-0t-JdHLDN@@~K1CBWFDg=57*jt~a|kZa-Z>+20CiFt|d8GHv} z3ITmr34q&HSr_vvoRa_IM!tE&vbxYghKfy|C`G6Sbze2#bvke+T_gGY)3_w(Fpw&Y zZZRO3<$b+M3qPH$%!mEK`W0+5()4ukDV9=6AO71DCL610uL`t7F@_0FjL_m}%>GaG z|EELx{>c3NU)e)LLq~BEhebFb@<#2aYaV^n>=;Xh8C@ST)2un)U#_q<03=Y+GBaw6 zLfp)nZ4osPr^VgrqAt;L-*;(|^71<^^L&B!aVN%!ds%Pan)s6! z4_>(cziO!bkaESn6revXuAj=HbIiM&ny7fpnI#Z0bkXcPnzl(9C*k&|nH5RUMBUli zaf_le8aQWt@z)W9IGp(hbH%>;_}_9n86|x=o)T9)D4nZ1>`bOiE(zJ!k6IsQN}D>; zJrukxv>7?>=pH5K0bB4X1F-PQ+S;%5hRjfJ`>FaGR}lS!$K9B$?k|^YeL!cU*;n}l z0tFeC5FIk)9|=8Peyy%*xVZQ%=F~EjC)0Rf>Bg9F-jKIMFy3q;37~_;bP0_^xt}v`SSmtz_YiWN#f&9j zgo^M}lzBaZ1r#b#DgvHckEcpT0E)(X@-lQtW^Hp*Z!Xd{ewV>h#8n;h6Q^%(7TI64 zlzV6B5ABVq7F^V$W$kMS!K+P%vmyYIE4OGPBE*bjNW*eANLpH2mWs%xnV!#DWw8&S z5AdRRoIU)^a1}#xeJGmQ?u-eU2HmM`OR)1Vp6F6Z?Vc*Y7gGDW5PUKvX!jn2OL(<> z?-j#SU8j&J&iRR9`efH@;m5B67yHPo5>lu{rF?KZqWM+#HI$*%d$b%0B251O_5#r1 zOZxR!MxZj9WQ)T7(@=8G`D5R5+C$VE$V%%NZG7{Fb=sdSUKbOZ$N>roLrn|RJKcw5L; zl^5N-AbWS^rupxq$g5YgFx|AER3@(zdjD?ZMyqIV;6kFz!Txv?lozxY+d?f4kW%0X z*vAa(+%9)@cZ1sPJ27IAHCBY&s8MuDhY821u3HbhUzllFGUt&grSK0v1=XT=X!uO1{2-YP=z0hV&;s{k6RWw_x$F5ij6z0Wh3dVI7in zyp#A0AED;oI|1@5+lC^)nWMJJHW->gl1#uGrx?><f__40xg9;|QzyCJdX19$azg$CmJJR+4!PZ4=i=6(W`)G20!4}!I_D(} zSf6XLIg8Ma70J#ue|K-YZG!OB4WO^9-qKP*%X@gKDGr~U>!&6b4paz<$RYgWhsZ#Z zvAtio-rFaxC%)m%_!qe_g;yXVE4$rQoVS_R%=-R}=*KriRgLQ!Y{zqiBXhkXa~E7$ z@SYQP^XAQ(RUZWf1)2|7ErGD?>`RMFOP2u(j7|qwFgXD)4+&9T609TpI6}VsKQ)s8 z2L88X?*z1p>2LpqO;o}>vN#6x%U$Zk8Fmfo(d}=;+^A4eX9IdT0MvYJ{w~tt1;(=a zd}3zZ<|QvZ&Q6||D2p5&hZdy`@my1aQgWk#5KZ~vSidSKg?m4G!$+OTWy5;^5_X(c z^|#%#GnpE=Qdg_hmyaT0+Sy{Exw*NTP=+Y&_&Ij}%`%)Kzv^or@1DQ`c-B^cWu#_h z#S`i+d8|xKHf#`(9_$$!8tV)J2>~M`W1aUp3xMTlqG0}-HvMEOD}ORd8;OcMRR>EkW%rXGL zC$0v4#QqNvSkO$>g!yT5melmAAZyluvWz{OgP@&WRT5$AqyFk<7j}~Rt{39z8ExtL zGLe+aN$N{iG^FWt7Qi-P3b9Y2VRn1ONh1*5FXXqTY-FJ?k2s~RU z{wn2)VGT_Yo7J&W7JewL{$aQ-%)sgT6|Il5!>o~^mMT>S_gSjTI+y9A|BN2x{JAMr zR-LoNlt&-jW#@K-MYtm@tb-x_|&(LlReGPS_WH= zPjFhuedBerle!_fz`Wo=SA1#nadnwf!eG|KmR!giM97NAb0dAClA*`r#)YA-#pTbJ zedxK8HKO&r-97QbL!LPpf#f1*1?vpTWQMU}y#G~2LC`?08tifQCVM;Q!VStM;ZQpN zS^jIqI+kM;Hfr*x9X(qBmbDJ^w9aV{1#vkF+DMlTh*Q z85}GK#s@avU3nYd1 zpkYwJ8+nH~e{S`YkY!dG;%yA2v4Vp7(+X+oqqr|!ytS-*PR4&CT~9ptNTzQavG8zD zA)F+iiJs@RR*j`%8UY>lP((x$%>_9~u^bce`9fFd=HIVhIjDL~&x=MG%G>1b4h!@1 zvBNZ^B$@vDI@w2$6IyTgeIP#Eb>GMSvnX-Mfe9mn*q6a9@Zg2A|22h;E`&afv2;8b zgF&GFV5%5!uwshFbjj?j7Upr3qW0H+34zGC0?_>1$1AKOhxce>5#Rz7!jV|c4b<_r zW?vsIxesm;QIox$#BuYU%%*M>r5x2oYU-E?SiOrdJOZ@*&?7J%JZ?uD6P?4~&BbMk z4WSQ`?HQzQQm6WJ(L5_$Mh^T1d4Jc185%;Tl7=^b2d2QHvQ4t$Ury;{CIh`@M*;12 z0iOF4>rFto<_+;EI;g0QHUuuPqv#9Cr(SI^%Z<;Zce^Gbpb;aCCVuvdQ-Phn*OCr8 zy&wO}&c-34U$a3q7M0+XgJ;S^`mpXSZyhN0%YrV+EgoIPUG@1ka-Q#?)cgsBO0$$7crfd9zz{T;S)Ah0i@G%l-7k|UJ#^OhYL{D$8Dk!LKHSOy(;ZD~b z=N0S+vtyw>$cC6LaDPAs1*+zk2sHqiLl-*;?4QdD3Y^y6Nz5bXUexE`t}E{)QSiQI z$tb{!nKnd#s^ooQq}UzM&o(>T77qBm2Q!c;Y=wN-b7!_quO6G904a=J?4#JZk9}t8 zM5z%t-P~Hl+GNi4?wS2}AS=yAEMODllwoK(JuQQ#X}|M)|D`P@$4NiBmp2-I!c}qR z@>EZcL)o=z-C@;ADL2XM^mmmM&%Z;Brb(05MokOQ|H&zuxvN&Uj#Q=JP}{ zq^Cz`O4(a&|84dIUeQto9MO4%{O1|`W<@uHPHt5nRClp;yexRr zDH!-s0`y{S{XrbsKvE+CGzmHkKD4xOBTh&1JRlQ!u%$#>TeIanHDGL{y!#l^KC5OacZZgQs-{zzE$T#keCintt2M4WM z^~+6d+A#w7{oi&?tG_O(3gvQxd;aQ*RR5s(8FT?+WFh6aat5$0S!1Fc9P`>76xoiR$pLe zXD93k&-_FT3Q7@oBCgtlIZ3>!I)&k85aUb6p&Ef>R41Va^peqv9!HHP%2dk~d`<3b zY8*^;J7mw6=a|r`VKMl>a;bI@WW~bEs&X0GD`odXc0)R40O%aLVKKWC(4dN^&-!ak zyoN=T3K{Ydkg81AvPc&*&;6<>MWl7$-=zxI96mUUW1buh7R3e~pup7&k7_}uU4>TS zk@E$V;fY49ABAGuW4dGbr6tYba9<)l`a!Jdm{5b!!>Wr1XRrBi^n4^VnRq;Q(y6rG z(gw0o@$9<}iPN|KW|y*ST3c-IPUb;Sw01*AuUic7K|%j`r(af&1G3cTQ;VP&q+^HZ`Aiyj;-km>zmSk7&IW4mtJmqJ=$q#B z6qQ~)Z(fEOFXpN4rM!Wj+G=8xTPuR*+DU?=8bwv#H3aCqZwMG<9zcL2`!uuMGdr0i zVkv@gpfcgX;xm20tp^$d%JPgWa$Z8O>^)0lVM$)0Nsv2Yl{>%He%a21|BW$Q~MWdN(Ja5xaNj zbNW}td22tCfa;3~70XaqXSmx#ljm?^OX_7a2l)GUKLgb;bA7L4i!39A;=!6p!N$~h zd9PCo;wdfF+c5qO2Jfj&_Agm+qg<9QjUn555|`2TPUyZ zUAU8}@u+;mC|_NkW8hV%l^XUM>ekE5Zi-jPh_R0T;J5U#Ewu6+Z-sy9Npd$>=J-Oh*D?)C>N!tYITh)>O(qRVUIlN;mw2Qy758ou&Zi$C z+8~T$l@3O-QpJz7?~Ix^A>X<$Xj0>6sAQvGEOO^K;zIhdg5j}a=g(*H{E>J3>Oaiv zG(J-}7r7CckJ$!oRIy}2Hx_@`^!@k~-VB<(RDh%13dgmb?9wHC=NYD`<3rH_#}upG zJ3V%ebh-CyOPXo(i(|K)JrP;k-^fn}FAV>Aev%$ryhuZ#cb8D?hjp z*>07JjK%<=O^fe%Qftq0nR+I07aW+B-SDLSd-T5HAEc^%|5D=p6?Ptk>xe%-!7sez zq{bj7hOB;J;AN|~JFIJ2SYU30h;Aw9QW1Gz=vQHo!>c6GcJpM9Mf1iZj#-TwP3}>{ zppeIs&+>$KO9RWRwX1$*8x2J`2OildJ~qfcB60zcTQrsUobAG2?hF>LD^aE?C zJZx*XxA3aJ#y3Pu3Bw_ebiiPYp1FClweL)L*t`CiWNvxhZ^s^Q%|B51pR8#dVT41jNV44VhkT;t{a7rFyH}`etwH(k@!d zOGeDFfDr-3q@&4H?l*X zKI+ZMUHTO{H)4@_RCDE1tm|8!TFPZ*GP+^v)_+&}rSGSC@4?~66>UF_K4kMW6dMcr z5=-qai=l^xf)lh)A|2~fW$psq0h4;k%dR=%9bo(~?wNT$u@i+T1X~w2=6JR@cK%T0 zAMS0`9KG6xA?i2^{9Ou?_cfR zM)-9nRq*Ftj+dhvLE8 zr{v>vMN{j8q{;Th*_`1YzGxOopYMC&(!`d(FRDBbUW?|DCMsVhF)%dDG(hZ^%zmKc z-*f#jz_7`iE;csfqVV|=;_0zd1bea6qWJZx7Z+%hE)*_pH~+TxOEA>z(S&Bq1-?6s zUBm9&<8i?ecg^djpcM@3{7b#~asB7Sd40DS5%t{Jco$#t;l|HKA#VM6+hrrzxF^w% zqEeldJYtJMMAhE2q095AsML1ER4SD0>%$hJM|)&-Xi>I>FtgCd=51k(AIZ4DT>F09 zxqUm_?RT2e(}7E&z@fNpzq&R*H#4Sy1bgj`82nE-x85;p?6(=1&vsrsJT!qW6Kk)q z(69$g%e6+Zp3iIj0B&nnJXx<4E;58!ktjGuNyywc#8otI{lwnp;3y9$AA7^BJA@pGp3}4BnGP1772jLpc-6Z$Ok%-M->Mv12U~5Fo z_Huu3MY#cCk-2UzKis#Em z)P;^xUl{YR$=09aTOJfGe0d}P1Z1(WAD0Xh+M~XXHf^YRmzpFs>7Jg}c&`Nb3gTLd zS(oq0?_idVf33}RQj9m*7+QgY{T0YI&3}0tq95AFx7UzE_U~_t#v&a2jd9ca5%lF? z)f0}sNRfTZWcqNne9=htHgjWcd`FE^pd?Ge01RIj8N}6~>`i2uFS}Z=J=G2*HmN)g zz>b)25}(tl9J6N9pZc`@DIQr{@O@}340*ru=mOvFRQfP|Q_)^%%^DR~NT`<+5)r9of3 za`6=kGrJTawua(`id1@DP1#rA!ZS0Vv9QgRh;81>Q<#(s{eftln)u8Wrp?yMb#G_z?`VHDWAl zINkhovBr`aZ-b{3yWyqg61ItS%3n2CKP#;$pYi5`b3T`@l5arj!|RI2oYW_e6!74y z*PSaiU@8rva-FV@sjJ=x9V+m_F3clw`6s`4^UbeRVi7 z;CexETg2TmYm=@8w)9=ukhgdqC_(8_PFNa#br99r`F+1G!;gE$o`>mJ`|z5a{z{QK zSxM-x3)0t6D&G*DuWky->3XTi{SFS8$rm@iY+=j* zqL3FCXsF>{dBja(gKNC=9q*OEgu6hT4>TNZUt}%{*k$qcp8IK?zLU7u48AcYOEdkQ z*Kh8p4-6LqmoWXB?HW&pNH}7Z{f?v*!Ow#}F^Z2t?eLq+^LcMQy+K%jO&(Xm@Kih< zzBI|G`$Ws7My>bzi6ag%3pmT6lxb$HRXjF9KjjsX-<<6eo${yTzPRe}xhZVv;~k~wi?%(MR^gM{7Ob6j zhxX?(B6;g>#Qy5Q-&7c1-9r#$@BZXg;r^lzINU{`UX58iHwXAUsa^6OY zLey5rv*wL|yGC;8p3J(aR1_o9v+v<-%J2K7xmZ21WPUQ5Uv!62@zqE3=rnXZxrjD8 zQ*Mqe77nFm<$wK3W&GlI_?G#r*IrT66Mqt~JU$sRH;;cgtp+)OyyEhSZ|RhZFDSRkHQ1#=TaCm?$(3%N<_b@IA%z`y>PLO}E{TDzY{tDWnZG zzA6bV_%Cw$zRKo-3$fQX!mN0AgbX}RkfRrAbI(OeOunL;lF@gmA>ks6mC6`L=Ua>_ zReVj{-ww(xUR=cdwW~@+3UhGeNAmvbV*3;RMo|_xHM9@29`D81BlONcQ_JR#nLa*} zQw{Zd;madS8Y(f5V4IB%Mtb40+OFfTT?}K!C-&Wp3$thaj!?;>6kk9YDiKl;jEdhJ z9^^hBK&*QOd;~-YU{s{bl_EG~xQ&WsN#{?8yd#v1wDjz_>2XYYvdF`?ktypv$#WA$ zxk~5nO2q4sSN%LL1=R=f+ETm!3VxXot}E*^rewwC@_OKwnt=e@s)QuN=OBeg zl;?fn7NZw+W~)tFuJqrRWDs-Taa73ob4!>XlS$n(;BR&UH*w$DRxB6--}`AE;XK98 z_Gf|?N8Gl28!SW4=ZKIc)$-@$jWHP4WPFVsB$PSW{G@K824LuZt|PQ7wQ6uO#tnEMjSg6aw5|Q&SuKze*qjiX$$gZqFxd; zI7eRM(Bvs{Q9k?0cn;;mD|7E21Z8bCkQ+N|I4-jPtN~G=>XK{U*z%RnU%$48{9}Z8 z#dnuC3A&q048Vu}^p~1a>K@t~qBX5qyhMuH4b(k!+dn}1iqEJL2FT0u=4#}0;1}9sK6V8~IaBZR!?6WT z2$ZW*V185P&uvMdVQu&xJLBn~&J^d;19adQ-TtDGF(r9^WO;Sf?HBq~YFK{-=-RS~ zvQodMy=sZ^S&sQMH8zv6#>XfBY!RVa-CNB`cb`VpMQnbo=4-q@ZiIn}m51SJBUa2U zl`Q=>8|(@r>>~!{-&;xY`r1BEWT(~JZ1piQ9JoE}1UDeL;~vtlfn>(p@6MR*kHeqf6eOX#WdUtZ&)wx&AjcW~_-(qNeCXLr{6a-@q9d zEQt2}>K7F6?eB>+BVgx7mwegQ#BQ{Y*7#T^IQRYNMEPRn2Ks3333aA}-XC7*uDa?| ztnKhC(a_w=|6A#(ag$nu&8{l#?@yYY=q>~Op2BjN6D|-0ECgI_*=SeI(mig!iAO~q z|1(zl=V3g)^8Zyi=9~MvHATUW3DSrvr1}@E@^D^kfpxj(q=5?(7dsi_w`!hIC}qY? z?ZKeOVv=YME0S87fsvySd?)K`9bx2&5r-VMcOJ+zxK5F`t|$=d0!Dmkd1uPDdC9&2 zMhy^jJ=G$v(*Te(6?~`&$3qWZ?}(cyCSZ6jx9@a_aSMCG)MMx_1EiR~)J6S1L{HRK zEgo!~bD%2AR7u-jT}eVW*VkFyil1vQ7lEnkAOipZ?0JP@^`6gcCD2P*`<}oq1wjCw zrX8TD)60f5m7=3VpwxwHNnCxx)RuBL$H2)BK*iS^Xe;NLLg=(ztN(H zHE%k|RA2pm)6tviJvTjG^Qw^JB?y3#g6+~o*hPHI1rnRc{NvW7S3(9I^{j7e#y(rr zEL}}-aOj{h#L9)`Ql>;ETaP6bs?m_xJY$9T|9cqgYV2fclo_&*5D#SW+4K_*??VkA z2D%So#%rn9=U6&=@u`<+yakZ)@HUr^hGG<9cz$7~a^|q4uupHz>V5l|Yy=sTe>k1e z0o?SOloEleaOI^jY%HfN=G&o`W$IjWucgVg7v*aTf;q^E`>y06@jvH34GGL|qMn85 zKlDOa%oj2!C)JF~+Z^#wUSZm?I1(}Vb0x-S)|vN$`0IMVRjJq?IR2JBAV$(Flv78h zwClaHnirKlz3RAp3jW#>YRuuY29ds5#jl;eHc4r1A5XXL{X>0qrcmX8sqUh^CG-8Y zc{sRhtIM@yw6~)rELh01a3S>{xLjYOj=q5Q0u-`++&PEEq0K6zEvq0<#6BkA2j zRw{cUo*{OLo_8g7$6?iU`w1X0$a35MEOW@sR`OMc|U#O9}lB*=roGQpO? z#T7@W{XQ936Ek1gqzZy3Mq)W0QI_Nq32R%ih1jF2^1VUCtx(#ro!49H$D3YF$6A6T!`xJ8ZT~ zSvF6n{-FMIaJl9c`m1djvDc_n{zXBcCpU2a&FXg^=&vw}S%rL%)^v2KeGA7omqpKO zd@_$y2yO12p8s~WC;h6Q#y6hy>3rJ($$QzBtYVJGCgLBLxP`ctG}wIS*?o!5k#vYn z!*9f(XWWJS&(k7s4Pi?31rMONVr0MGRQ?NQ96C1Rbk;u)_maB^rVkrWH{bMPb37L# z&-BW*s|9SH_nnM*ReZQ^l7Tb-Fiw6%&uqMaS9n)u0Ah^^aRcZ`7NO4fB`{rn1IfTTRr;ei`RK zA^4NgJo;BGr%7#x);~P>B`yrq8i#)snI7^+znFy1N`AJ$(RU%O?V#PIF9C)zkhyov z7o#zc5-2cClRm`jos_73UcMPj@d_>cE0SZW;os6FEvh1shSmAJhQfv3%JfCnQx_75 zj!5?~gWTB*RolpETan>%%?@-R^t`5Vm^e|-0+)1~-J98`z6PU5;h9e&KWpopIUU|* zw-!P@lObIJH~HnXm?m(4=+oQgp61wIR|;)0gB+w42Wi{V6i~5C-NRh)Y#(ey*o5pK zgA2S(>`+m|PD9{oMB;Z;{z@bCn9JI%jqLJo0cGdj;-4-U-KD0RES*}N{s6+@- zoBhJ=KcPZv_wLgfMISJ}j~^I2aRH7dFWB5a-UdRNM~yN>;I%-f=oK$4?!I7YTWGs5`je{(yHCIa8o6Ao2cYK%texRh)qGtFSjo zX{1@{XC1GvGyayXJpTBc%J>TI>8SfZPnE;*iBG110L>j!hGmOPAFH$!0zj$!lb45) z0u!h_JlBP(o!%2+5i?+4ps9McGS~Y*`{g_I=-%kTqMzmVFt-3}fa#)BE%Ne7@h` z{k!k`k9pLCX*#bn=RD8zc|EUlU0Q^S(`8X0?0{`CSwt&W7n~)c)$eWmd6wYtPr8dc z^ZW#CvdB0Yb*NFgbfAvEn*r`RA$tevSR9Ky7ti9s;2e^1W$`~Mp~$lQfLk^bbCK1} z1WF9-)nHV(zoP%hoRkm!gn= z|3{?|OLT~h;eg6}m}p9R5Uvs2%G@P3G%Y6O9T3l%$PIahtz&HA@GZCfc?$6GWs4NGfFQf)$bq1d^K zoBLyKP>8H$9%g6@7MhN=zvWTX5x1e7c2k%P5(_*|oa{}{y#R+^E|xqaYm(G-=i9%b%QVLUec`JJWW5(LWYocYj$c*jR|5M_8eiMKY#CI&hd_YdqTCZa=Ld zPS~^XW9JMc>w-j9=(ZOW@AwKPK5YL5oaN8_Gjn;i^NjP0JMUauYf%WE_%zb}+@I+a zK#TtkIEO?Hf&HGMt%R$%LF>u;_d&tJ*ZrYC-d;%m4gVxsN$kt}U%);-_0u*734(a4 zlMWYG@MpyKujW2-aNgSZ;lxE*E?)-17>G#RHoM8l*&G{8sQ9T~tS(j*WkL0QUSWt&BMLX!a6mFe@h4d`PRdVt;X?lnnSPr@n3 zZCN!rUW6(Xf2F>Ke2k_uyBm?vc9rvAW?4u4(!vJ%ip+2RToTP;Ca@_j3WGd%8W{MZ zIy;UnG?n+o!&JaQ*3)-y3a!c(!irE)6t(;3Vg-Pw_wf1D|NMM2(`qV(v(fO#x{DTd zpUbE75EW1K(N^lFYbSx1X`@j?$+T9f%*R&;-{qX-?3B}50_?V@4n1k#-S;w_0V|c} zCme(0u4u+s(jGNR1_S6lYjZ9Q-=G*sU8#GzEds2|0OY%5x#$}(RnW2ic-0J@({p= zw}yCE7(%PO^+6@6vO&zIwtJ#gaqk+N?@FK1Ei6D8uf)P$ zXmFEbQd7^_GpBK%)eCI~oHM&D3T^`k`hBxFB_89BlRuZ|uHQ94Yf!8w;yc|6+CvqA zrF3}_DXzsiL~y&u!O1qUon~_w*l29!Vvx_ZrrXl=S{Ky=d@@tTTB}!TU%ah6=1@|k zGo@C3on#mOt%FY8cVS=riv;;oO;Ztx(92rky1qdV128Fmp68l`hlEqV0t2o6kiBQ* z4=Yr-Kp@R!wy&5sArYwq<6(LYi&rEa`AkEXvEyVY!Pe7ygHlED9UWo}yrsP-lA@kGzxuoMTDbO(dFW4HKeu4Dt zqAtdY^DkAi&7_Pui^4~p0Q8-GIpo(Uy3>}<`SD5}o1HOtd|z@)DgJnX2W?kYNOJP3 ze`x<8)9;y8zgtO=`t0tGU%V=U;hYW2>za!=eF?H~QR7Y5>qvR1@p@JPP}m3?e2)yn z@vLqgcY@6&0hQ6yu`8(hBt(Sh%T?Px-`=9Ts{Ge8swnQ`KH3xoGAKYFVOs^D@_D#O zqFj9)kYxg>*kLlG%#n2R?Q9XIk4pt?TU{y$tDluiU#Q$zH`X(*U7f9M{nGW=m96$5 zSA1pLOqpwIzz$^e8*Pb~Nx~9hAap~f@=%&eX!s~Cy_Ye&)XG8QUPV&CT=ERtE7+wz zpHr5d&T9LMzb|DV2XL)hM#a;uni|A{SXvNAz{0xav05_F7N;sa)|WVe(7rj5)nJ+H z005hakkR>e&>ML#w(f~+e&hb)eE{-$dlf=X7K3OG$j~FZ__e0Qn2>`DA1D@-uUzXP z&-{ty{wHF576Dfjdo{v!I9Si|S&`Jil_UtSMUNEhjFD&h2{C;P1M14LRcXi^HhF?@gSgG@7L|msfNyBB!PkmtVl`DI-_Cm= zux1XLMQy_$M&=vSe|D(*Liu9cQ=Gwqk-S?=VGT?0ojlW}N-G8`h)7cEVZrrY$^xf! zw%6Wyy583~@I_xoFFsv7@agjO+1s+UpFxBoaNue2VN={aDSN+a-eSMAJDkJzw~)bW z2`O$20%txinV2f5@=rr3vTr7c7c1KS`qUm^;KVN#odnlO5%bC^*LlI%j={pL<0Sun_4{{ z{P_@T3yowoQgp zP-4+7K9#y4e5aL*D|3C!p~}4ye*_5AG#Q~Ex$Z4#7RIkHPVbt4rI? z?{}gR$J&1~iEky|WBS$&*SBOZTt%qyS@GC%VK-5$yqAQjA(`WPh8kq>Uo3PnPmB;W z2gbcv1JWA@cP=!vWVeV827YF#W!D}Q=vh>A*rx3I&2+8xI#)V9xI|zhL8tm9eA`Mz zPl4n*9sQ&YS7If6^#K>!`GB3pCIRp=@B=$vP`gfecDol%U*l8F-6n=9W#&icSz0% zAX`x-V`N;HpGqSqIF3*3jNm<*O3`?CAIIDAfu5sdUigiwQeZDN^ziy0K=De-6hAiI zXm3>iO|!Ps1xS6C;Tl<+*6`YQ^w8SwybuvPZ7shyp{mSijEz;*wf0jd5XxsRhS9+Z z=~E_b(T75w!=`QNk6U*!i#7;0*r$?X;>RCt1mbpI5#1PPT0XiJvcGp%RS({A^V=?~45m^eoj{1=-48H5IA zZg1XBmGpg*TfByo0o7kzo*q|wn-k6Gvj9NXOd&>wO}`v7@OBGWBEB$S4E7_Iv&C1o~r*(TD* z$O`U=jhQ{p`IxZqB^0fp4Pfc8haW#@l1#h2K@ObzH^;v|`FLQ+!Cl8~hW~&*pLHf9 z{H~%TueU5IY10KRcuD3;@c!#}i;Byq3z)nQkda5D{3Qu4bC*3)%kcbtg`X=#xYbK} zLp{Uf$#EWG=i$tgvbe&6f_Q^(${kFIp}BScB-cHJvN736)Ijx1=GG!8=QH%jUJn1A zeR~U>r2=cS6-+Q@p~Ac^8yhk&(~76iWn{t$y+eWXcwT%(;2TveXn41cct50-F(jG4 zsD$8*3fb#0yI7TEUitkybwk(gQ6X2wMs$r5Y3cX)gACS=fsMuAO@P}Bus;ep{=jv^ zdqHg$$8%!$ldQagm@vr)JUyA)Z`+PDQPCwB_JQH#&1MQjO#6^+@M^*xvNl9BXegw8uW7w-0jD2&p#sHl6`L0}eKvo^Uua=jrapxL zaVhUo=TIy!)m0LbUpl1Y%rh6w1ka!9&|YW4F<8cP|shAwmp-|xpS#L%HzJ$o!&XYe`(wR1@Bc=)&eN_VzWYc zEAHRqZHpNwv+dOufQWW%A7s;WIQpwpFe_}~8~&*mpd)b3 z;0$)vE}VS9qQ-{_3A+`(5MkC;x)e}e@TZxa{_0;i9JOajmBT~iMwo8SDNcIzi38wD zYXQo01oqcKu<-s6hp+m5sGy7stA@xN@HaT{*8z2|Mb)MdAF3DL4Sv-Zp0*Ug%^}2_ zYRBebbrsN_TvxAeA7@L1q~DIX>wSp%r#6_Nt8l(#^iXzwj9wweInueswPlKnJn_RaajD~9EK zhVqn*v~9|+U(Tq)uc!KdI*WX%x=XPTA!u-|_$7Uo5SCSWi1-O*Nbpy&R19x8J&Ch4 z+PUhh^-)j+J+*61!Zj=_!4NT^u6FkZE7V2F&=d+(FvbVhuq1GFs^p30M(qkP;$Lw4O=1B zaH%dR4nV>&OjywH0jpj?b`*1#gw`fyC^;Q(!G&g_Bdd2MFiw*+u>1Ep`LOj`q$>8D zaiBWj<_1kpbsN5v&;Bk!^2A(7vKxd+T2I2jwG^vGI!HPj;N)`Dcl-rtg`T{(+gw*x z{&98-vyR;_)6U8>kV_Z0pw5JXnEv5Pe`&DfiC+9v|KHH(N#@6g3cD`+kK_ZjllT$x z|3#H1bHd13ONuvhdIuR_#!m13^u6GnCJNAK@0(Q zFked_J~hor+|@Q94|)bS`3btCF$}N;|Dj`gWbWjkWtyGD(PQ*!+(y& zV;)Ji`iHaU-}o~nlnD}75&gxlwJmt`xvln(#?LBSZB;NO_M+whLQQ~wSZ%vf$9nvo zJU*|#BPxE2xTc#oBL%d%@nC!d&a`ng+V0Pv$6AM9zix_&?d7f!L*G2ULd;L}*zesd z!}mRWv}r+Sl=WTVJ?TZ#pqRckz$Qm-`Pq;QvVjf^0~{1c^E95V#I>>^}uyabarK!T!~r#ge`kn!`3c z9DgC~D&3ugv*T;HQI4Ir9q@mn#C0o401!Jo)NTjeoC**2ADWsE<>=4^-$gAZW{ITB z<{R+@We)r8&#HC*V8mb&IsC7l=< zeVnt{oY4ptd)jEdTT8F4ucwGrK;r+mCII=O-RV z0Mv3VmYwnbH7lhDb@%Ew;i<#{71o!=7@g)7^i5KecB?dMiPknfr7G8K1s+PRqC4Rn zCYTtMC}kBJ5FLN!_e0Z!^4k!+IyOWATe!ntjw3(UCpEK(OUj`)pS=4nfP6Vur0{eV zBURwu0Y6=N(F(s$)Y31j(QrnsOqxe+sfMAjQB~5$-6*ATw9Vko)ooZvGKQcGIMz1> zHTp-wJt=P-n0W=ue&Raa)jZM95rr9662(8x@cWAd|HFpnD>0-{OaT|CR%nhK8U9U& zCRX!oR?YP5`41V|_K5wueAid5Www^#l^UjP*%$1l>+Rp+Eru8huV|?6ol^(A7Cx+P z{V@tw5@80Ib{F`P*k|`~Ft<;=*8jx?fSp}}j;Nu1cW40Z{HW=}bsIoOTtLoyakl`d zhYE&o7QQMOJsYCjdJP8voyweD)RoLvnzwHg`JLnus2@ML=}!D?XQK_UToC1PiiDZW zbfDxiZo=r%`WfC%Uc$G5#=iIRz5W+3no@B(QxHTCZ>=Q>vPX8$pAY;0<-Yk90wN6R%=7n>0f4a3}SZAj0X$Y4Br7W z8V+KfSCrb&r`xe8XFWwYjg3||>*3bY_9>n7{ObQ?M&tXgdeo9XtA)oG%ID8Q-zLBy zs#I+Hqf1BontbntiM5X&+$?X%XMk>$Scntq<;WR~e0nE1*UYZkQp~1p-E*Hg*pGPs zB!`762D%D2+ojl=M(VvBt@toTF?=C)7HiwpNDcv5&-NMduu$*^t|*94)>X#hd4s*Q0~-+&h-qdcko61b%G{N0_uFV5}0!U4=- z7<2#y>I(c&;7+1ZP<%f~f<~DxKEhNBWK7QWL7?8El1|pQh#JLTBkWVr)TB<)YWzI2 zsg=3@tBZE0z4i@F>a#E4kJyTJm+E(wf>?p}Fw-X8n3UVZnx_Q+6L7XTLngz&IkRY0 zj(x%-mjJm1WL2dlvg6$G_9*&q_?QfOR)Cu{@+$Ayi3y27RL`ch@VzEDGvFfA)jPZr zBP2bodi6umvnyEgt>r(+biU=JyDR>1=mNoTFV47U^3$d+FCD3yTOJp$cim4$8yn&W z@!8;j5*+;N(bj?<$~z-C#^dyhb|=Xj3*+P*tsYmg4VZ5z=SM-H-!}btv!kjv64&01 z^Ep)%w)|v8yha6`hu?aXlpybd12mlPYVj(4qOa4v$aHD*ARl)2w=fO?TrkS+D|TQBdoc3 zlj{-L)P{RMNbw*ro?Hz$;VLY9$D!U`05%3aX_F2I#GmU?j%>vF?yG4^Mncz`XdNg* zlbN~8%8EykKYPgIxmf#vb$iL8cII)cD%KP|#I~KP^t*X(`}r8YNd|J5p#KfuHaL$9 zGYw@D!2+5RN|g}~$?j?k=0_7sA#T~<*ykm1I<@??gIhda?yug(SWQ~!Sa;Lb1>s>d zRQ{FR?4!)ntuQ;>+MB)mbdz_x1ileXogU~tb(}t20yz9DYg*`5@KChBjz(`(88gLM zOK6-V0*~E;S0wlw9$~ZkEp(||*{h#cAS8w!Oy7H>r66tPY5q}d(9ci%-+0oXq6Tfh zEkWE|8zt^P(DLmL93pf1x&+~qk0<~Na|Eq&Su~rgur`h1myY2}=tjclKQ4ag291TD z6`S8e-C*&~qkz2-@3@mYl0f!HOt?Ujqb(D4VH*1v&hj)VC>o}kLH z$k{Vvf?{G~nBDRX$D@wnS~yX8zpe94I!%{&R?oQ}tcfSaPKUkb#~P<#R=6y(zt|GS zsIbeQGG76&qhDo%Yi{X%yc$g?rfX&a8o*>)Y2tgcDtM7*&NJNq7g?GgfP1fFtw(0+f%`j3hiSmC)2qCL=Jy-r0bl!~nZ=mxrt85}?#4GA&QXwXw z=W~1~prOSPJ&VfwQNoV#Hl{7X#7Pyo&C#UdDuf@Z{_}O*f1IQ7@uZ97!1Ex4kEk2E71Jp_8@sPNup1$(d1|1YXET=_@9g$v)02jF#D9XRfs z=oj|4#l;Ex1Rq^4o+D4Vs}*HChj9SC4|&J48UD3}RqG7m%%V^6QuZLZ)wxpC&hlN> zW#1ne%tL#xJQ+|{2-c2TX1{;cyj;(d5IhSFSSp>*!|!1T92@(4s~BXs zE^B@&h`z4R@&K(xc-1v8b%pZMHSyE9VEF8W9Bbrvz zm53|YPa{@&4UoCWZjw6(?*KvCz3e{(X(K7zq zeF7UQ{zU`>;9MYl*ka54?9+PXn3M=W`=8z!-aaOgG7tC0d`qg5{-6~3@YTb*r_2S> zc8Rnh5eM&PLRbQwZgc9EF#>9|%CW=;s~-NIECZ9#$ndeFMAJ!1kWrsi&Y3z$Pqwv- zz!XY{oD(s+<3A#C&Xu@{M@&zYB$Sq=Q8p{aovmQ=-TE8`Qc!mG)1;q_>xnq|5IW>v zdUV>)Zp{CrM-QJ5Cv~={4FhIK1RSeDUW8ItzNM`4KajnCaW3`^5+qYU9HS&Y2CYsN zf+PQTJ`G@=`rsPeu1H0Y{@fmOz*0Mw%b>-Np;}{YC}(8SK-s zXStGiRA!pnO0*rMBF-J8sn7clV*Fg7onrR!bi+13^Q({hXX>irei|X0mCs?Sd+nXL zX#vo06~}q5e%PDexgftV__XDRHtvp;o757#!Tw^rLcbWrU;x9y%}`ygmgl6mmK^*9 zEP$4V{!l9oF73B+B&tMp7*li2j67_5q_6+!lQILVW1UaR;M?)uD5WcJkm(HgLa_YzGcN6W zTeqcZwXbq2a}`WbJh=R%8uYi0bGu?$jX2e{+S? ztD9R5KfE136ZKc~;vKGnxU(~Ycw7X>PhD&rPrug^zp zpy7FN3BYJlA;v^bGSZK(*&6t60LHOcNxsMmM=xr(8m}Z%?1;rpVlCUi!>M^*sj$YS)KDS%6uDJetqCAv!cM2FUqKG`A0;Dw&zZyY|mXA~X&}N50Nx zc9@aoN@^-^zE8E1FAsek?u4ikp4Dpf_Z`ACQ~?^fFSsv)npuGXwm@hS5kCIz+-_q3 z04Q|BubMN!m9^m3*5*k1tiI!5pOSrKLjUz8SOy-h_GPC_MDt!3>HEAxo(Px`W^;4XQHJ0V5Lc0``!|N10Wf4d zi8?2V-Oip+U2~WDKQwCJz-YQ8RAJl1`L9*AwIP$yK0%c){tf`2BWInD1qGK1p)CWI_0PJi2yO=>1kRqNY1J_rW_{$^%k4osp_nksKzY~b-; zi&YXYK}1mS?x&T#^4pStnKPyGeB8qR0l_M=YQ_FOT7I08`39OofQy41$!`B`F?B!( z)=%>h=k#I>0MQ|Uz|EldDT`(%{27nI@B%u8ZQo%~8aeAKQ?zFiqdl7Vc zAAj;>TzqwwPll5l2wa*auVL)SFjsZsiapVHGQ`jV=fYbZIG0Qb!eRm>FSzFh?)Y21 za1Uqu<&qP|Aew)~q_rP&Vc2f>F+IFRKCnP1o}syq`Yq0a-2Oo%ik*fpd#>^-HW-Jg zc7z@*s2qU{qQ?^Fapd%E1iQpmBBcC@76*W<9YeQpFDwJ&Z3W&`fKwxmq2rXNxE4=%bbI5kmTR{hT!>m zC%lk0(O1w<^r{N^r9y*}qcnHrClY{;?Zv?{MG?vSNbJ72Yvomd9Sgd$>3JdQl72;z z)4ya;j?t5HoKB=?CYY!hu{p;YLHJ1K^g#r>9QIdlsxN-K}!6auzT(X zmrz53pLT%!#}^J)nuh^B`B4iHy zINHUx@Bg)I=;~6nAP&Dy1lcWWTdPSB8i=sU5F~Y4E*`(7zE2GczBX})%+9iL{kFaf z3PY1Cy5Cacj#{PbdmEydn*)iCc8e91{#vy|veu`&Lp(^WmG6pJZQRCB6b5 z+5dhEkmMha(?FhUn+l)$UudcZvr7={d&tbejRjpYS0aA~{*`kvOF=OIxHczk(x0+& z2StG3*-kGntC%I4C0EaVN)jw_RVVsL=*R+ml9`Q)YTJcbKDF%0NQ&Y)e7cuxS&ak(a)O9xYJd5vh=il;Bz{R znb(kk3yurtOzLd*A=#;#59nB+03iAPQ6<;*!S~u#0=rw9?4sG0Tu4#A6Onto#q`;( zn(uF>J~wDi&ie1FzQ5$t6?&LL2bUKOp*kRSjc@t$AD%&~=-f0AK( zW`blT?JHQO_3Fn*l|(+hw@CoC*!^$%ey>sFFE0Bd219YkiaH;xJ8WkQq=!CpQP+3Z zb|RO$0~H2o9^uz$y_YcFIScO*wKH35p8*UDm1YlSYu!7wW#=8xkjG@MWDp{REb&k8 z(9k8%b8dR5t@0t8c$C87@NEE~5kmv%3Uc2ZUAVEJ)bv^V6cLVsoo|M?R)dne zt`w~@{UsSD>JK&o6zXvLXLFKwYac$PVAcv;ivo+0{pR;)qoc5-DFuNc3!ZPn;JATu?|29JmkcFMC(lAtZx;1^TOnS1)T18F zr~7U+A@c)@mZpISx=JF<#!D$FdW>%fsmrf~Uz^p5DM24N5YSocpu+*b4CKy4kQhh| z9lDhijY|RcV6DJ6W2TJ$UE$T!nv*Mn=rCa&koW{!0E`UMTJ6d6}Cpai_evMF+Gl<$08Jy2VFaP{XBETv}RMjr%hy zsdqL@-n?Wk^A$pvo#kNZs`7H(y~8GZqo3F#GpdsQP3Kx-^OZf@mw?E`r0}_AywZT833LOyy?31MreM!n(Z%xiBZa$WL$xMVd5Y3lxR@m`=gkWMcbjuB`|sC zv-d%Gv;>l3>B*t_G+>Wja=>z9VgAKzqfJPCj0UG_#eKXpNz*vN@Q@;=o#9STV^Cr) z>h0Srts04FZ_JbI6X)p)ey-yaovdy6*>SBUf7h-Iw)t4 zJ(veqt7G1|TEQF)=m-?NmJ3qgc5+CRHrR1<73Fh*Yd20rqB=8I^e1cxw<6g~BEZQ3 z*w4|^AxY-oy2xMhGYy+xpVkk;Wj*p1!1%SX!uaLoALyRJ)NQ{4F~WZ)b12=R+xtor zk#p02da)u#x+Gq16Ra#*Fe!we1D6V=(Y8gY_VXwK2(h(3bcbxg`u_Vq8I7i$oR1|2 z6PyQ8NEFbb+n5;>ED|01AfZNn&eLg(2HH!D*lig~_t%z>1BcDluf~~C$(tgX0gY+N zcaE{;W*EK%bf*tQH@c6v$x#iP`9SA;wD2k73RuBX=ZKc&Xy-o(vOqyVNY7@kZq$tc zG9DfIDCyW|*c=oX>W@B<3^-ZOdl5e@ftqsPrQk9LLEY!ixWRQGvgk@1Buu6utp0Pc zIa$)c;&cYyN;EmMgaaOdfr3(0*i9R#pm3FYFTZMB7$gLA@!t?Y(j(wIIJLwD(&O^cH~;l-o83ezAl9 z6DU9W{o+w7Cl5HX0G?fUiE>PAgQ;Tcg73b)W&u`kn;qUFv3N&|IKjp@pZb#UW9}q9 zM&ZZd;P?DgVntdkQch#v+nB!pl2!&=NTi}6;?!yKWd9pFBO}B4BhFhZW?}Hlbu(L7 z=rYh4RmV^m8BMM?G=;r1K=Q_;hI{5UW39vqkJ2(yt0s1Gt^llRy_7OqX&ZkZ3_x2i z{=dv^zbSfgr&(#_DR?HC?QB^QzVIo6BC}>wy5{O?AQAK#l36>IasQ3_P0<*1c0wHU z+Xr1BJA4dgaQ}(o@jfpnVMVOd)LYx@+l5b&wAvRaxDdGrI9M*o$a0a4fB-uwKuup2;6d?#rNX7vprHF3!=T+9h zI%j7snz>Ux>j)C)H>TO4t-C1}t1q?)2UFuD@cqaUO(6C=gBh2$w<`-eodn+tKl;NX zNJJ8W-GrF*9u4SjJ_Q_hK&*bkRm;#)2x~`VmP&o5IuCzFgx8Glk#4cQI*VW6i#+M_ zGCXBdOKN$6dfmu_#-t&O34$q^`MYRv;Qegyl>lF`j)6f0J~DnRX^61aPVWRK!s2&> zU+o}jF6}L}12^^Cz)08&I2eb7gjDPosq*X}13PO?pxE}UUOFFoS|`xQQ3jXg(S zC*{_c4VO8kv=nzY8o)KB>4&e?Zi`7A2*wT>)q6QE0zFwUz>|%_s==jh1; zp+^7jvK&FFll!NqrwfuaN^m&r&8ojZb93{&Co3enqRW;fG9F+d=`_n19o*J-OUSf= z2_GP}d=z1$VW$PSd(ZDnTqY=_BG6Cu7s<4?wyr5TDcM7RxB~HW27!Hv_td<=$aoH! z=ZVO@pIq03+uC}rL#wp=bEN}vt*2C$Bur&8*E6{8@TTDsF9MUTQN@toOQ(oFB>k z#@Q(yoD>J$g;65(JsR-EPT?14*g{pndAJe-5`?N^OU@d4Eqw*?Q&k$ zE6@1DyH%lwci(O;j(yREZcqk*1o&q&9JU{Ipu#%J!Ivcz+NpIYFR3N{pa*=M|~v=p(saMJ55?SJAvED|zT?+wHY%NiBo ze#!ZmT-vWKvAEgSo4l()ba?|(vJHN~HXA7l6m*SeVb1>hh4@$~w*Gt5ll12Z*`v&+ zCQ~LF{Isy+P-+G%x~GotQ_)yd^PC!%mWm4Dz02#OYhP6~MdfD$VwJA|9Bi&vCGfLN zdrY(QW5%SpgNp$p6LE1vw2Pldo?|QxDEALU*J8PPFl1DVP>(9)$WBSQ?5d@UxZ$`J zLGJ%0ZggKi|*y1;&VVQMtK-oNU9>gKa7HJwK zFE7cH(^Fx!5I0sxHf|&HHBn{(S%jHGX~Qg7KA(Nj8Hy7xt^1QW8KXFXq<`>lGUdTA zIA)2RO^(3E)^-UPA6Ggo3Y*F>R^tl;3*vi1FII zBAIT&zW2999I!lfS?qylEk})}_bGy+!0ET`Z-W!$-H%fW3Uym z-IcYS3CG4@XSt~AUH26N+O%-7`=7}&Uu^k7X}y;Q@Ko?(!B6u62`uUNta zH)J$@{i?xVrOH8HUC$O3{$@}j>t=AQoTqWT(U@L!KY08{$+5P6P>|_$Ep`XeA$2|$4pUXE z`0@v+uUYB(Wl85>_-eaVQ~$L71q;^9&Ufheh+RRL60AG>`}B;MjK`VZnNnFiB_L-~ zrqv5)_W~g)nrQP*9AIzVj-ast%!EW#O>r&RUWX#okt8nX@FQS5jkmZI+}@X=konw{ zwqJDX{7fgF*AR~sS3DA?zkB@`_GR{IN&f8B01iG(>1cGM)T|rj;`XUanFW8{QiNl5 znAsw&9iw!7%EZZ0b#n|z_gA!o@DqlL)Y5O-kS=+z;4g{CLqHq@6*1)}oj|)y#`(6J zAbYT~wS9`O^}QxT)_>x|TGPf!0quCgMt?PxpYo$eNs%NRCEM|ll4|cPp|Eshbp|?fogD56VAxU$PhSA4D#z7?XP-D zJcCzT6Ahx^hf5-6Gwe|88ISRRfFTmM(2Wsu{ZQe$nEW5D!MCV^Iro*>KX<;M3JBMd$wSf)jpG|P&52>w>CvMUsVXuJImv2 z0t6wky%p`wW3TkE`9(7w9Zn(Nt5d)@UIRYjN<>7IpP%pY*y=G_HNM}|uW4@Ip7_>s z-eAib?>5oVCf5E?bMmGjd+;99adv<{OMW!u_Zv8OR+*6f;=Jq`TX2*ouIHI~g7yR* zJT(4+GgmL@osP=2^e-=}c^(u}s}kbSXJ2;4Bk^^s0WnVPi8#kS*TQ?DPbH~^<61)W z_@2BDbC#pm5_hGMQdxUkW(x@XEaSBR90zDPxH?_UE&D3QoR|MRiR!~nRgP@)zHkcE z>ZED;KqQ}N6iOI-gG5mK&PPqh%WU0aBy2mvPzK*c+78>gtlvs0Sn_Hv{ngyS+^^2! z>N#`I;cpd&^eL<%4iVqn1A834bG3FuV$++aRA1&q4DuG@`f6ebJRX-#Xr{6H@zjk*K~1Zn^#&E0J+UcLdF zpSDe+PY@*;-aUx=BO%U>g*+q_f&hA^b&nyc(*-!Tf?f`74LfMJI(#*$mlS|??59nH zsIE9nd{s6vNn4f8{{^e7N^oDQoW%xB;9Z3b>!+^{??x=FEI zlaH|!&yFL<88gdm$6v`}Kzi0(wBHzAleOPC9^!oGK!TEOn<>AfL=DK6F8F&DRl|qD zbnU{?RjE)&;`@a74>F{F^pLOMG(6|b=-yN&e~2OQFP%NxILzKxGex(XL@YGn7DV7Rn_{!a@S90Mk9l~aw*K9( zrCDj0hXmziRw(`)@b2Fj*RM$>V&jYs6;YTbZdxB+u$S=;xKd{riy$aJ0X z1(h+}6Qf9~;6h@RSdKiz)$^*6bjmLra&ce2eib5%hvI>EZMHW0-DB)UM~LdUU+nzG zH&8@{r_RXdm#s~=2M$eM-m3CH3~1|Aw_9B(Zh!X+2e|a?xp7m+!PlCA%Q85s-z6oD zl;qtF|6aV3d&R5Y+fP&NQ?S~3JhBR`Sh~R$WPro~KscPLZI`kM>JZSIz*x8k8G&*> ztE}uifK0Das2Vb&@POu!;_36{J%)u8{LtCXv;is5dt{e85l9Hm^}_RZ6$xC zu^bdxbG|z7Z6wO+SPhxgd3C&8RW2p8QYf-WMK7IS>=W4RAL`{;Udk_*5Gf`vEVqjA zP0XMwR6K7Gn5bpo0g!(4Nh)E{v>f9^;t+1S8zJ-?=1R@O-|n zKkvR%NK@ZLjjX0+!!XZZ0b9Am4lJ z&~16iZF$vmwp}Wsu6{mc$>j&O9euUaoIsx%0b_K;ub`v?tk3nf5g3;lZZF%a7Wtdn zPT6^vjUlvkWQj(N1xkEZ%SrBZLDYESQNweikMPr@hq$9{?>*dPRvwTRFA-j{H-sdG?9K=>L&1EF7*Qr)k{gnP6SZH z9BPzuf?{}d==+-&z$)YCYqvia@yPIP`x4+1lCvs6`{&s@X=T~sC+Br`iX?1;c@CD7 zsPG2RS!(upVq`Q^=h^bz;f^>acVB#^E7@DTqR*f{jx~N%SU48~MooM0W%-`XoD~l{ zS?KVAfPjE`^$c?4zUUqD+4d+lLs=34QT=DZfm?qcR=zp9dkl2h_5q0E- zfWt!f+Y%C_t6H;tx-^B^kBiBOO;N>G;DKPotMQ000RQB`2ny-7q}`b&=S`?Ia8611 z36n!8bxA;Ea+aXTkMG^;Z7DY$I_m0VAJpitUpYr1n)Wg7ro#l&G!8$pUWXf-mH_s@ zDMVFo*?F$CxR}O7Ax!$P%MZEGNpo!#_)mfiqXn3dpHq6+#ErY>ch&SHI2R7x$MslL zV1KZbdCR6r&y75M-5qSS`8+rH2H~WDLEKa2;RO!$iYr7{q8>4|r4i(AKIh^n>Pm*0 z*H%jv@{y7FPW@Z~H;jk2YQKQNLHof`>Mr z&(qRF?9f|*0O*_N<|8DS3uUzuVGZc8syw~+R^wEI)!xa;$pb^fNMMcv z945_2YH$B6t)DquP1pEpRIZwH@OykZB{{?Bj*KB1ch>jqqy+p_sP7{9^wAvW>KWkL zLA5nkKN%l%*P8H+(1BY}n4qA>uhWy0_vtmQ?|{g8y?%epM39@|N%sis-Z677ya%P` zPRK{GE2YId%UQq9IP2p(-9JDPAAuNmqgrnM5|WVw1yi(|e@Vr5J9Lsy`+cfm;85W6 zV;XB2LvY7~vU98ttuk#-g=#q`+#qsQ8K^;?=*@ruD937RnW6U$2PYxB&N*t92?Y0XRP7_M-ci_f z6@m^W4hULXUk6?@=|y>YdD5byLnXEqC7y9t@|0tmrHv7Tu$| z-{?@E7BfW4);$MfavA|vf`*klfH952KT@GzgVn4c;+0jT^`;97!HJ z-ORtgEUttmdR%JxLcQ${n@itK21H8W&43IxQV0x!8md{IMTL{Zk$vB-nR8-%#eYTlsK));FJD*MbCi^&PrYq#Roo>Q7Qb}P7g+&`aW*W^`atdOmUj%E zgs$E;sw?I0>G1_c&2?4y)a%t3y1;8xCh1pm0)H@x_aId^HC3D+ibs|^*iZF^anY(D*CaG82U!m!?gmf_ZAo(5zW%i?#b`R8^Q5Xf%!xPqSOEx6l-mDd{R zUS+PU5QTy}4}RSm^Rn8^+jrbOOIx)C*zU_8?>0k$Me>szTan~5FuM^?v^ymBD-Pp` z@8h@)aBFO5ae{&lax_qg(wB)qztz)~iWRMphE!K;YsaFQ>SQ;6$S#Q`CON+lvYWbN zVZjNG^ceKPYPo}h6l?o5b@$I>W2ah@I2g9ZPUU=}eE$)t0pstXj5ttJ%IkYGdgEGN zdYjI+@0hu)YM>M`R7Zkcr4KUaoVtH!!004k&)RI8Em;HDgSx_LA^fcFU_+?2$J6cr z^c4RwAjWK+EL+_&s>6qI;Kh0!D9UZ^Q@1)*KLyXnN#Y`;L6FMkc~1AUhQ&4xAEd!@ zL!CrvGtrjv5%?x;Qx^;2@jI~gYrugeX5DvzgoF>N=h4aYZDv~<^C~$eJzD*>EQrRX zH{f*OV_Nsy+17S;Y)bfbKZlRcuW|n`y50gR%IMqwe&}wbr4bO26r~5GTToGuP(ngN zx@TyRZUiJH3Fj2fnnx<@OSTf*Z;onyVkgH%{y+8YV_O1tC zBAa-(g>1f-6sov5d-&;+enyI>F5cXlyOt2lcGA#sHp2`<^7DX4_sN01Wccx<_sSsr z8~B$F>;`{9L+<#ok4ECP;`Zq2VTClb2EpY$u%(MRD2Y6l{`~2aBQSL)-IU)Bk^b0n zh5O!rN%+jFKgA|ttsbZDPTUm!fKy@fi)m=b69;MpIJ3fmHkfPh1PndTqPDGk-=jnP zBApcRGz_HgRO6W0Up0) zTR7SG({h=I*A|ZI^scs5U~OVB%3qM{6p>9Ax%azY&5}ZAs~e)!ZNVldk<-ErEMI6Gw$Cm}G?46>No-)Q=ON(Dfjm7BE`1r_3 zp|NBWsXiLpN&|5ing|Rt6$JY26;_e8fxQYs#0d{9#mZeyet%^-L#=OQ#A{=1onKx~ z;o;#SSYPYzB=7lW*XDX6edBV3Ug2Kfh~Tlxse$L`Il%|8%)S+I(;cIjw$P8ASP;Hm zK%49!nBXB`>|eQ$-uB*WIGyxeh%+;pX;t&z=a4PXtMtL!A9XAF4JSGLIyC+^b{M4y zCU8ebh;iDE-(CX&u=$Mx{UQTdIapOq*{9yBp`)0uU%x(n!o$OJwow@GGH-4g1oXtp zE&0L+os)eovmO(RYHT~53ac`MV7T%*H0-#iFyQ`vA91(&>eyMG?dY3O03R+**u4MT z&eOA+;~0y-#sYNU0)4sLQXFn5&s-q$m!E040-qp!IDHwoAz+np%kOTy5UZB*qkTl4 zgTp>{J+kal=+bhNEhq59Nj!^{#N|`MoTU9@)Sb*^svXwb=N)}%Rd$ZD?^dl!RU!2= z0s?~j_wNURk@)R91ID}>O`niL!|s!F-8`oQ_*kNLoz$Qoo)||Qea(EJ3}ol@4Y)$k zk?^|I>+oj+%U{Qc_* zkm=%bT%iBVP(0{6CAWK?jLoz6CKtmwC2?-zi&^LE?(4i-t=AhQwKKoqg0&Ak6q((j z4bTx z_NRIEg}n8|*RJ?DZz^wAntTfN9lftkHPea?7%cvwt?<34;b7hI{aB*@nXAAigD!}f zRr|q}cy4m#_PifeaMeG{Rod4ygp4t_GXuMkkR$oKh|jXf1S!b>@6PLM0vYQ~V56~*a6GI<^e|0&HwcFSLi|!p zbPd?4nz(Y7!AyX-7X{u((nv{3{R!OiM;TC;A=v}TZeq;0)WLgvZzPk67S|)2wr1(Uq9`9nOK0$u5vF*T9)F#6Ad1^sEkb37#wWPSC&rT6wE9YJnxG# z1#FQ|&1X{6k2m$+h~a?}H~% zt78{t)@!6w_Vbe&p*SX2FZ7bD!#BPfR9S;EcnYjkaze6Mpfi5d8!z9o}y+6`b5O^NRHiC*KUXoh=i+i`R{cYX4cAZos(lS`=w_C`p zNkl!i9>iRip@YD*c?Nu2INBcoQniSoC^Ls(=y1&ejxz6SIB zYl3rE`U}SR(F33S+XcI_0cL~>3hpdGvtcvgvj{Y#;_r?O4XA`ef%~;_b|{#3%ao}Y za&9_NquR;kiC($I{mA5JLZLD<-yE#uh6?27wb9#4d>vbs8WKq^lbSDs&=;*1a0 zE(Y7m_FbEu^FR7ku~+%Di*QC(oWS`{qN)pc;?J(v0R!upAg0W3=-Cx_U7PAx)*T8N zuU)I7X4qLcx4qx}qtih`glb+5z|||$=4l|fF!GZDe%Ad=1rTjKWA&Mef<-k3%v`%W zIv%yPWe*KU)>Kr8XrED&`5o*CpSF{bkPMBJ<<*e^FaPf74Qn|+SyrfbhmHOc9EwCl zo;y67tM{2ay_mS4kWQwJmakZk{q6%bZ;61I1hhf_CjH^rRn^*SGnQvZY&*TrkGlW9 zGE$yVJIWDmIHrE>szSSBy}VKC0Qsj-2ACCZS^|#<+^tS`x;1~$apWACo#54m$$oOK zMpR;AY$NqnmuhCb$tQomj*0_q+uhgqO@|P_1IFH5je9H2HXS>Xzboi0wi}CGIQtZ4 z$4G$re9SrE2XOe$i&*;O{h-DB>>i&@8}loyIYWJp)_{?UFPr_<+xxndxuH+a70rZU zD`)^V8${h#xAuoAx2Ue~PP_Db>K*TV<=obgLqSs*G2<<>`n%805C572Pqc9Q_wSyw zg?p((QwopHCrrKG+Fx!4Y@DrARhFOYN_ir~T|n2x(4^+l-DVeDm~Jk-I z7+45>d`1O&71KpO-H_Fwy3I=N${W=OnqP${C{P_d7I=XtfHE?cATe_j+-&=aK(%dqpaD^iL`NQAyOEa_}Z=A>{xzqS{3 zq#^b%`ka;B4=ygwUa9n9(v+oytB#pRp}~cd9%k&NbKnsdS1Fue!R#acxS5ABvMv28 zl^pzlX`FA018+P#Y!}U}q|w0UI&XF{p}Ah=^<$uPeW0e?z~tyMNX^_lm;X{v3+*HK z%nI|*!!XE)d&dX}T%3Jx8v-r_P9`>ZT$YAVzDT{DAtWa!SKv<^{0RH3##uPlg8&x1 z^aO&PQD=L%N}(`Ij9~|_O`;-NT3RaN^sa-JKgj{!DqR9wiTThR9whu%1&%L9#2c{=h8R z+oS>LbWOPNtl)D54H?jER1O)i-)7~Lc|)x`=eH+!gI#sMIbCrcOT<{#v2eTm0YTAU zIB;LI^UG^4SD!s9^alP>VQe+#L4h3DGX+*F z8kw8WC*?G2ikte>H%)|UyZ@Y*xLq*+3NgOKTG$vWjESg)`v{1mZN}liKJYukqXWJ+IAbtV>e;^_5d1qj9PqDep_MfH7_u&xX{)9+v@uSZ{TY zOG6!n>)w;7BLd|z$A`ize`_|(XD$`SPV{bHx-Tv&DQS}gq>TZe!!)uYm$h z^EEFkDLxe`ezIb3FgC7YMeVGUXew8^`+}nIhmRjSrrTe<$zNByaGI`YZ3JIVNS0SXOo| zK;B$)JNFa1m|!R;qHPgoXA%3nG`ARkD!VDhe$rrQE)Dh3lDkhK8cI-1%H`E=N)#)?ZiUe9iEINJ0ov zdaPGd`O~1_T5RKRq{5%mq@?F^$E%eqxnmm}VXWsi1$lYwOLw+x&C2O-rT0lpaj&FE zRFy0kL5Me|6i`Cz2UWsCgN)=*Ei_|7N+2l6=>7Y1Q)dq|nqs4&v2l*FDDOe_$mWC9 z2u%M358b`eYg;^o!4?j-wv>iNkbr=IN7XB_Y-lSh2nO+;UE`b43!hnZVP_zNb*<5VX3@5APc}d*Qj*a; zhqnyVy*D8??t1m=rWmX%jGc67C&2;_b)B#H6tAQBO^>3)x3W6 z3^ZmIy(}p##A)8|E(1Tv$jFFz$!|+YL~2@h1p}2`yM*z2s;Z-7S?MaNvP^b|w(U^b zQCU}h6#YufAPKY`ANA9aAVhI|9t%;DsH3x%hINyeWd>x=+6BRY47CJnIUSay~;sJ zXlsMM!Spw-MB6|%;95CnNgf1#6ciL-1Fa-cton>o&4#=5RqT4}^UDVR4iYB*L6#WPP8_Pg`i`3HOev}d01R~C zAnY%r(}nz=M8z2^v(qsQp%0b}6f4L!SYEwrt9Pl_XXY6n9nFLHk*<82?3*J3cS?wh z4VIap><8K#JSyz)c+c48^x3ho4%@?U#s0#liu#w&Z%0Zjap#17xcTZNk*oQ56POfR zY>|Zn^`mx;X2i76XZ#96s93MdKAxbpB=_~M1`g>_r6sn2M34t$V5^I z+W(F5ZH~BnFDPYfVzTI3tNr%k#^XctkY8F9maB0eCuKO^u9){1vLe~YHtuNe?CbPdIS7B z^cAV}!ow~)7*$|m8yW=TNU8KOuUzV>$4&`zb92kc6Ci40 zWLHtdPX+jY+vLnE0;eV5V!^exqI*3#8`7i`r?QHqQxt3Dx%m5KXyJkb-F=p2O$!F( zcTyt|&MpGmpQ+o-dW#oEam)aRG9>J%{pH!5XmV9{+}(~?Ze7Eje$&$R1fHr|*LH~c z8zPZbj}I4#CW_HUVxslydggtQMs-~;k!;r^L|^YG#V{;Vr%-Pc3=u$q#~&r(Y&%{# z1XWhuS9vj-?}JYdzFIqe8NZYG_Z3O-FC=pb!*?xL=%>_-k4E`-J%T zAf>{k@$p9%BR33@B7VyhOk-3`%*#kUKbT;sEJCb*%S_spt?o$Y0ZZAH!Wzp}-a z@}tb2J|&Is0+oO?UqThq8c2xwroeq7kty691#zojJ*8hyzNA|l8~&|JqsjA1S1=~a zD_-zf-aGLv@;SZcC+aw_S)Ge`a&FOyV_tE75Hb@SjQwdw^k;6*QZ6-;_x{N1A0@`< zG4IhN%+Qxx5jcb6KLY&h%*@Q%J$TgE)2!jX*@@t}e>h%sAB}04y0n+==ECX1VyEQ8 zdsmCGt!E%>5t__ydX>p~o@_bQn7Tm`@F*J6ZX+Gxgj`!5)bZXw^OsLaPcH;!V9kmh zI}9ERE0_y3GD^>9oC2&?O;r{DM_nD3GSiY3A|}Ag>kddIze1yYMr;p=yug9E@~Pd} z9wM-yM0@zdf>xUZnBeM$3gF!^flA%^Pj*2KO+TocpFvDih$5p*IxOIB$lLZb*;D6H zcN5YHn{=wSaV+yzeXkJy-HP(0n zR!B(}_jxlX@Fl_276EGd@pW+P_sz`WVq!?`afTwTA4^;+vX`ip(*Uc^kj`;~7ZKwx zv8=b?b6Z+N#BH$-;zk<1h6cY;hN{JKG6p5`Vc^|?qxkg#z5iw~FP-#3H@y8B%=npq z$q4@;2bnQ70~4NrXQlU@x%*;``Flk(r=`cp!{cG2WfL<@P7Z4(M$a1_@|aTW{3UVo z+jo4Bbc8yndAVoZZ-;nUW1FDnWLohwmZ$4=p>f4?D* z2lK-SD^zLTQLe142ues#kGNWpR=9dKrCkBbqG-(t)Kyjmzea-Y{L5V|`%_l0yRBQf z>FM-iND-W%I&2qoClTb0TwQU(#U&N?)4;PGEeb^ofdhT#Yv21=UFte;f-Pu7UP37; zFe4*+sCmvmt5{K2`Roc6RMk+IfoogS@NXV$o%nJP2Jb+XG$-AY35!YPmc{oKC~McU za{3&XzPU`tnCGa1JJ~NZD>EIqGIi(YzRc!#st%EZGCb6WTsO}ZVt4tm^J$6lB=sui z+G$ex*^oyAE$c@utF9_B*vJ5!n7axbssFr~wiwpp>qc<5d?W&eu7yHAGtoQzrU3l;A4%iu314RGk3}vV!JR!mWD7wFNJIAe zS=dkphvadKS{C+#k4Q)(i~l8ZlK>%wUCjKfMMw%l(ZV+B-dBRg8@#>^W^0%9*RF+G zn~v;0uHY+`RjZzv@<9vrU3flY3hyubAY#!nQNQa0S38v`%Ua8Z^? zcsXglle`}rS^)>aHDJvr0RXtfl8tb7Qe0&uf=#_;zT$mFFabbNEtl!zcj8*VG!KJD-sckk*W2 z!HQ!cs++LYfAp0e22$8bl$YpX1IfdM(?X+HhnKxFy%gj{n4Y-Yk>& z{P6tr_;`PvBja@!YqD8rdPxImjm2&YyA>oRCbn?myXbOv;q>BF)|nu1GQ#HfKro1y z*bW1)u4T~`c2cPTR&LaBZB(7jFz+ZD z)k}j{tk^@`tdYFpc{eaG=6+CtKSN0vDnZN-E(pCdt@Y*Qlj*w=Az{t@By1o!Cc5tN zF%0bYRMRy_hGa!4VS2}x(>2jHVQr}!M;|GnX6^G(;3Ll9RXl`(O`7{|un}=*>Cs*W zD!h)4ZsP>8aIOc8D>j}wpd%|-QFVU#AVVp4y=D18WD&Sw;?|=@xDCg@L^Q1)IFxAh zWL(*Bdld3=|Kt;Sp3klvUeoJI>{Q!sF07iUf#+aXDeiAL;t~*(Z?Q|xISSH7s@)mCTKOXU3622DJm2A%XeM7E3=5V4B9xW9Mq*Ko0z zC3UL1-M{*Rgz(|R=bMRKF1opKNdXrb2YPGI)De~Z1{cShgnyv_j%TIf!N3dfn% zknkB9HNE=rQ55{5L}5`h zo`8IPUtN7}D26HM<`BH7oZ@7V==5SA^0}3Cr6Z-$uWn4PZs7mw>l#Ja`zT z^~WNN=G=DPYV~7%-mQdrw)&2>>zZ6YC%2#ERl(=*0FB%lDg>WQMaG z;`5zieRHw1je5=lHbsk&pHR<{By|wrFx%;z6ltjVr^tAIY)Cy^-;UpG^T(k9R2kX*I0(@RE@N41~v>FiAxp(#Klim?ksP?CLc7P0uFTt^s8&1q`V3L%?$l5i3{xAqJWUt`{vD4T{CS>mlFbQ z6QtqeYcwdndu1U!z9MRs7(>EOK$`FwV{#lD9P@&FO=o`E%^kXIka01ww$Ak7)p&^aYK_w;1mVje*F=P@1p4!QVTbv zB@%P!hv6j|%6UKj8@orT@&&VVlePy2;00#YvHALrLONB!m1p;E3y-e4@_XKzyNKx` zsop3_3*@9!a@b!L7DHQgBkvOh1cI5QiQ}-~a`!=>hU)d>))*mY%OG|_NpY5h2d4_r zfrlGi?sR}|%2K~EuiS|DKX+9&@#|*}2t1WXZUzqZsuQRo%C$b6Y22oGzYC|kY~M5? zM}&Q6Kjkx|!v3}a9%Fr;z5+so0MS?y@~VdN`qfndmK)$Iz(tdYtKM<#xWG zYrJ<~QvLwxuVIJ{=0ZnD2h=)%e}_qPdu&xb!rH=q;^)e*B#gSPT(Wcoj!uh(a%t{L z6Tf>r4`%4<*BzEi;ZZss1wYseE{ce-azrQr4DwQUe$l0Zp53R+{s%FlY>fByaF<{Id+H6)&5g%I|G)h7N2o;NLeFk!&RYao2@Fy^^MCGX(X z-s4SBkqH-nl68CkZS$u4QuCTaLhb%+wDpEYsf6z@>=Vr=-pdh|_gzxAbW4$?#4#sT~4F8&d$z?x2?~8Zl$5R`Y8fDrQdo>QZ{ooQzD&%M<;}kH7oPB zNTV2NpG+S(+x9*~@1=i|%ZQ^j%84n`FwM~5pbxXwaeQrvVdu;XIgTg7`0KRK~ zq|8q&?6(CY@cquQ!4Df;KsZup-_mUmJ~f!Te*OBN@BPZ4^%nch)axW5@k29WJDY@= z%;UzKO1};7Q8@9?LJJ|+?KZ>GPy%bv{sqCu%P*j$*395Yp$~V_8}=XR<;Fap`}?Bz zt0SGo>z~Any>Q2d*V?DHj*hY4`$_(QwGv~;4SNPJ`bt<&aBAv~DGNELJzrH@zv z9p9hw2XtWBFTWD)ZCbktp=B2VmZ2No|KF7A9!+bq%1>;Mc9n$siz}z#&RJk&6Sy`* zO8AM1NnhHrPNoErT0E-?@RpP(OaFsMGkzRWp79`tU~cFK;Vkc5Zs=s<<_<)FT_BS2 z#*2Bgn}pRjYD|<%zbTlS^-EiVkaYLd_ZR2&@XXB2N@MiBfsEW-Jj%b!J+V`D<5e(r z#M;_gMIfw|&5>N>{^P^)n5ik_>UVnasQGR80{#@5JOYVzP@1;1M2wS)02_4|GeSIrA8R>>{)%EM1-M6?d%R$RZFAILi?Dq@+D z@P`0r{-s#RU4n0S&=iLF=*To!k7#nLT@foXBZT{&TI zuaC2l25+cC4JE;N3z*?am#KuC;nC5|@qK)}oSKJ;KVT z%$*{%_>zcgtxrU^-b?CEn!A!akGCmZ{acL4nJq8r_5m_wZp$0SbygHfhdbQL*dw2 zoDr)a(kKo78W(z>3>QN;cW_`LcrOxeUpo^wuU(P@yVVVhAa-6_8J~GC?0U92TMu)) zHjTL9Z2s)w)&8AkpFp6yfR_ihj0YbobAD=X{n6x5J$wf~W3I+km8S;D0U{zC59|V7 z`oN{2&j5V^4%jK4TW>uo{!04ohuORL&b!ZA`70;1h_3XEG8j7{-Do;V%d&n<;DA5Oy{Zh zRUE~yB8GH6GBp` ziLK<4I*mVA82V@^fO(S7pZMv0k|npA1d_rH^2Qn@4%w#&x`RMSa0&?v-+4d;4ji>G zdtx(jsV?9$?r}oJlPPNxk>o@^wkyrM%YDmgLBOtdKb<73b$k8}n>&YxskhVoGlWdk z0>^rPEgwWyzU(HSz<`7MJD14Az!paaKQu&1TZv<&+E0_Ic$(dzpw^ru#=sW`Em)gByd&z zZNr++cF5l^Y07RBA??Coc4mpxxo1C;_uo82t;!w_QRK*1DPEyPgGcoo`cmWnpJ-^M zwoh@}2uWt)ke0UD)OloRab+shaIS`U0 zyOnPa_-vKK#MI~(HHn-S`lL@mM~~Z*7*|~wi4o2scw!h7WtPr^VURjxyG^7oK(zK; zBe*UjId8=siyxQo_47%)r;=H*{CI_SGy!H~K(UxDEiqK0`?j@U z*Qp+}*`14rm4=6*U>?>(CppG{FT3}y1@uvO2xy1IG^WJ&mhg!S;?eGu1V;Ac^{2Jq`!oa!7L6k0GCSG=QWOt5p{J(=`&#tnm$uCGTcTm}*8g2keMLX!NbZc#40I=C#!8#q{Ckf#vmNKa3V-9bwUrfEpRJ27 z&3mWc`qxe`uGkD9G~jjMO)5orPdAqUj{kjrk78PSYy-zWG7wDmSoru8Hx}*x)&jWG zZkaxL0)^kn6a9fkMfoXX03E6*d>kduA6U5N8>Eh$Z~(0j`V@XOm>fEj3nH6bRuzh4 z5$dHjqvNmr;J35)OL$O~tOk2qQ098hk3;=-x=7`F^3->a#$z)Mn&|=VILNu?(P$yk z{naU}l30WR_%hX~uH}OYkN5uT5@JMJlDT~6mx0wJET+6+Fvbbh!H0$A-i9LG8$f1f zxN#&4?D7qNM@Prvm>(&5>5Yu4QRjvrQGE8mcC^e0eR7NHozJe{J|fvLRp42cOv>5Wg%ewBiHS4;s*Lwx5$XTw~W0oRL# z?Nm6xDqui+ns_h=eekCySVwq$>sy4VN0Go*hqWyZ21JGcnFTP=PdeXEsk0~I7CvUz zyW#3QZL=JIZx&j8X>!FOVm<%EAwJ>st~=6T{lD0V(+bd(aOH&D=hEjnFF!uX51f`< z+nkt~nASIEOWRkv=-`cQ?8L+r41}<4j)J$ZlC)8?5{)k&YxmxHkfgE zkR=sOREK&aSZOG=;YYxwr3;WdCeylJr2CI5lw8X!aPTipD8?ZNvmq8gY0+_;iUGun znNrk4!IZs{V>DaQYG?1C{uiSNQOJF|gXt+?)4MA%cCvoW>*f}lfH%@e3?0>t;Z*m* zO+!(%T}`&w(k2cnh!rR^-jLuxl%nhFE_Yo3Z+`fcY=PVwV-BG6)ssN??Oo;yD$}r( zHFPA0*_xTv6Tyahi*WfNa5jW)xhR?R{J?wZ{b#sDhAGCIYJnP^vI4ghA*^|gx`S0p zvP#^IsZ+l>Bhi=&WJ=OtHHxgv?{^d`*^+%mb;Q8C6OPP?0{Wkx-6BVCR{<%(hgF7O z&YU8aeSMGF34?!;;&D?jfAGnF>HIPbbA(y#tK2A2xKsxDCFT&tH5R@e3?~HsriJ!s zO#%|Kf@3lbY;HcEzlYn$Z{{2H0)LoSiVZ7L?R#ikQ+U6|k%&}@Mt7G8s|g;0Hs}Lz zd=Sj=%f9=8d2&os;#`W8M?kwpK)D7Dp1M;ykqmMC-~57d7aH^eoD<(*79)7xIjHvo z2P);|dEDyU(i%nqrpIG-ig)c;-zT5_FM`pfo`wOO!?xeL>8M}E&YXaxt%3!?-9{Y5 zg!5ngqFFr!KDVKlA%X?DfZ}Quekp-9*+Iu@Gan%!%TNb73nn|+{m4#&+#SIP15bBZ z34<`Jqg9u?lhTvQl37F1?v7qO+#wV02@UQGL0w@tFhFlcNiX=AT{rtK70nIp=1?LU zP~HOpNST$5&C(x&7cPH8#Jhj~R5mwf!^g*;44~oFwZhzqZX#fNk~_SPUf|m9fKQ)4 zH$HCgP8@s!z3=bVAz(c&0Hk*1+gl&dbnQBj4hR)HJT`HVB56XkzvL^sR+Aw6F62)U z4u!AiFmQ;jije>ngtF+5GG+z_#IGA)bTQ@?7D3+mDmZC^Wz_U@{xnY~XrK2C-#kdY zKCNnXNj*i_z3N)z{v-|no#fh{C{|ma4G(gHOeKeWq$HP0r*ml1twJVN)EbQ@aAP&x zumR@VP!>bKbSccQG&7BJe~e%3`Ad6F5E1{rEKUI0GwI$?|kV6 z_$IG4)78NJ5q&v=_O-ouJDEkdd2t^s;7#R{VmWi7dY62 zC^fcNP+sMf<0JUBzop!G>uF?Yh=X2{InN=s-XVY6TGCDtpi2vuKj+jp-69n85Jk_~ zNNH}20%M>ro1CxrANAbT(?K`^ct$C(0@T5Gr(Kq(cZ{UN&yW5_bPPa2=8h<{}I(137JL;)<_d4JHVA8Fis5MRv;O1`Zzf`4N^u*2JOPNY*WP22J+L zYxZK(e&G8qp)pP^;13oATnFX)dNX0D!s{FC#HqDHX~i5R7nKLpfA8ooi*0PFmI^^+ zk-g;^jq)q-r%dTxiw#QR%6mvJSFvLLW{nG8IMZbygfXt)3WiPh^R1sO4IjyQAuBGPw1lY1oE{gWW_k=SN?Gn_1f`yWOl=n0P52$ucCfGWYLc~uQ8v~{egsn6RS!-qan#7cYD z@bG~4N_T@1s4s^$-LIrv4^2%!y>$23ToNz?iCS`CDRzAtNX4BUTdF-^V^c1??5T$o z>h%c+<;Em`u0ByyceN_W<7;j$sD%(U<2897ZErP7OIb0H@hoF{;~XW8v6^`y^iovr z@2e%NrujVYvo*ps-mvrowNXU9Gtj?`u~OhCG2pX+to&F$(j0oca{w#-@Or=d7w#{q zx~I3m0SVQo>v)e?$z$+|FZfec01WDAf7s^V-s&f4yO%)v-pn$S{HT>jWjLAzt09u- zf$lRegMEaATx-)&-V5$4jTXDG45c)y5i9!6hd|j|Hpul@OwL4~e$^wfN=E?@Y~{90m!g5LM9Uz5TlF6Ynb(6fs$mw9;* zUkL(~fU6-QeEat{x5_udr2W)C(_Qu3r}t0~A3bXQ>GtEF-YMt5^iEgki;($0N1C5x z(yYX3#NuZj6^gB}hl#sG8Q+O*{rj_dymziAaa@PHmU(Y|^{BpqxZZQ_?jt3x3O3pA z^D9WWl8#QSleMNUj584-SDqfGqLg#ycorF-^9ttqKnU}{$x>%7rVNNquZr-lIKT77 zX|7ZdZhITg5?!;EhPnq1rt`aD@A|JWWG-mcqVxdqYSf=rsGJRxE7!ASo!>aqAedGy#c5ZNwXEKv$33 z;D|kt%h;K#r{q^wjDI_!wE{5b`>BXI(?(m31RCj3cshkv`R5jg+s%ftu`vpT+l`ne z6Oo;PiPu%P=s&V4bOIGuvjfMAD+y0l4EJY*?c%5%+zcPKloj(#a6!%Eo&NhzYG{0K zC7$D36g@{nLEehi-F=VFb(~Ny=B8S=lDb`MqfODPy09PJO+d;EIy0DsaAU-s!}vSR z<3Op<&;SLmT^2EM@n4+uH28V}G?zC*TwLJ1&;n3e-YG&^jq-dBfckS4;(?ME4C{|MYz~OFl}rNO&Gc^X&ChN1L}jjQ#&dRh9bdGV`ss zQt%>itSX@PKnj^b-QC@7L9CI(Kr1X~R(ro8Xi*)alm`K13e3{da>lWhmqC>#5c+hT zP&G`khp5z8AiyZgt(fZl8$;pb8#=@F>tI?=R@%|HJuSZUVRR!r4rbdiFx__AA84>@^hG7|=;ErVoY8&9D^7$v8hTkSw7}hGr@NPJ%_kKGvkxk)cZ2A!TF%|qAlg_=q>VL*OjI?9_Lom! zTu{Sii$7d?TusrHqovJ}M8)pwx=0Ydu7veo2iU;nH+plLp%efd4%szF`*m?b`*NtwW>Q4pO@RIJ#&}K$U8WSb#(~!yMtA57y zPM}`cE`B7>=3A)D8CWKInOpD26jUMALdiyB#PMudk3HusK|Ezl;!H0U5 zX(r~jIlDJzpYqM6z~Me1j^q^b-BXf+gl&Hm?><@xA{*Z5+dfgE#GS^n<=p~cCkB=L zDUKUiG9&|CO`zS zJ8x*()gWoq#Se*E8e)!mgl;WZu_o-tmm4F~W+@!Le`V4+4oV z9b0c6_GMGtX41z>?I2Il6@ zN8YlWJF`x>dX=nf2~*)oW5d?Yf4!A3vaRPmTVE?2B>rK?LN%_rp!V3NY>L;PY=_z( zE@Fyoqs-)Ek}!vdu5GJL_4O>#^>c|F7<@)}@b5$TpGnbuLkHIovQQbqH*elhMIrpD zEj&FvC#wK2k8osBmY@kr49EXTJDIvQcZqDtojQb*tn0%b(PoTdThe#$4ci^b^IL+Y*anNu*Cy)Gr z2k&CxzLl6#9@M&F$PCgD5j@r%%-E@xvp+lvCbq2$F~F;;_~bD4*6C-4C{cubDr|e= zKWMV)tiAnvtb&4)XM|YOY99oETGv*6eFesGW3vT7Do{}h$HJeD-A7PJsKYrtoOUz) z&veOmYJ_)`^&2zJ!vQ@S1`dodhl>`PCK-+%Rk+%OyW-hiP(e(;Uc7j5l@Ph>wni#` zek{esg%c7ILWOxF@(df|e?rONNlD#<1;u2A#1kCOqN#fn7u=xdin0=`{YhIlA$i59 zT*KGu!9=qIB$$UT&-%yQ5Si_qSb{`0l(uriuM6+K1}PyCih82qrz{DNsk5g7PQcO0 z{6XNdd}*g!3Q;AqAyzo(=2fJk@TX46_NsDyUZhi~VH~o1dhsUd;Nr64_sgIBB3xYA zxzo6<>%Kl$2^=;I-s7DpXPtA9&nv82(?L9cbOOfV@$qJfH)a}W%t4jC<= zz`B2eGZ1Mu;~Mn$gH}>`jpvjk#Al|ItZu3suB5cO>yCoC3Q8+s# zkX*o#T0*F5iqA*!=6=^mG8V~|U`-hHpg4&-VSwl`U%D_fu{G#{Cy;#^O8BRFi2dJq zmC>$HEYD{jzkB=StCYcywF7T`eSM3mD1=pL_ZhhHZiHTU{6C@FBEu0Wg z1nys40_L*s+i>;rmJMeKVL3n#y{-pD(4MC3BjFJ_`tR`6-JziJ_&V2I;t(Z;=*FPRql_x6HhE~w?{ug3wwU@S&^rL zx^i@SfcM^stkd7tsTQ)VL^Fi4MR2-9a~%*S0lzLL%9uu`Wn zn}6HVYqA?EkrYdkcSdb0*Q?~~O+9PEg5hx51o6Qa{<$7lH6r6P9~4y8ar@aiieALg$f9Ap54fW{KMKq?SqcO308 z;+c*553g0XTxG6eX}KCCx!*L7UlH7Uy5=B;>`@d=Y6M!N+Jlm17cBO%tLSu)Kfs11 z+%3OPL4izUL9WP~qKN<|0S*H%$XP!=%N=MyINN?n};7i#5>FcYbqKdwM?*LLF-JQ}QARswNN{XPMbeEJM4Ks9u2na~G zpfm!)AT^{QE#2tQ-8Jv>{l52GZ>_i1;}00toO|!N`|SGcv(MfyFp}K}Rn>C8*m?Vj z*J@uC3^{Dg-1Vm71iZsh5rbw*6zof!Snb7%>8OlNvMp7p{jtwosN8uYzj$~=56W8b zT=OzA7P_z2D0_^y8bz7Ey737O^9Ko&C6p#BPh8mP>b;6ax}@mi1AVD55O4Qq!4*|* zk1s4f!F0%rieO(+@~s!C^ziM8qv4pfECM?*5MGBqm|b^w@OeavCj~&))F35eeI0=Z zxN?cT(g!Eo?z53^V7iGG?Eu^N6L80^7I3 zeKwr1i(~e=F3aoxgq-szY%0LRmVec_ULLPLQ`2~VeIXsx5nJ9t5s09HE9pR^>dm z4KjuL&bNNpVE;=URPTF&rQEUq-4Y_O%t=j9L&c0IVvYF=tuozOD7uC=Cg+h#k9;Vx zQMKbF%DAElM89$d_ghr`ih3-UK0cGnMkQ}vs)S6R=qrd?rm9_t&k&o&9-@Cs?M;C- z+@|tO{MpUGv;Nfd^olMng358UVG9c;^`-!*28oN&@iZdXcLic-U`2_tH#VQh_9y!C zs;F}PUo5JIRII{Jp7L%rfl<*pYJzZ%vwe5(V?#2yWCR;)sRmJ;6&r*1qY#{;Di*o? zwLO;gANrNTHFqg^|H+3~UhbxIAqP!ZpER>Ayp@3VO?Fn@rTC!5mdIzpx5 z_Jn|O$ z8HUi=ryh23Q2t9Q*&A>3K6Gy<*b+%e76(e?>*sgy$I!)if9P;h&NIdfJ=?oe`^*af zP86Bd&-o1+_y02-JRWWF*-+c#=i<|MA4vamTskW6LWQ@3{9PBiwd+MAmC)#oPl*(a ziZ<54WF-bgMj*8k*cs^CVROq%A@OMecl z<)w;AiaBDQ^T_!Zuq&R^P68tmn7*D-npCDD{XbI~aBw;L{UMIzy}r6_>6qm2J5W<3 zlRYW@E=OXy%xycg*aOFusElsn@$~sp2oVx5)wH51=}+h{!5$nYe<9YH6N})_`>>L= z=5wt+ug*X+=O!ZXp{|~PEp&5Mj|AURO}5-t}GB9-IgA!ukkM#Xe5YF&^A4;HT-sQ$?x55sXS* zWBXuGuig|r#s7&jJ(WoI9D2;KiEO{gDxm_h6Afj%+yNav~Uw1aHU25>}H=(d{y4b8NEc>m$4~3R%QO=j)pNfBju6s(74q zItdi05OPLGV8>HpP2^Wi&5D|?W`1Te=)u}Zt1%2n3ZGB{$D1G%we3GWg zcNnA8Idy0v&sH=G!2WXj_F(MB!n_(YL%an5(q8+@oR9pGkt>b=F_dZi!{BF&^$QT`KugegU8`Z7P(?Vq}W8Dz%t2L{+@^?C%#4eYVq#Dv{`H@aZH{BwrAG`d517Mu}TWrkD_ID6c+n_n^k9PNuYw-K%x$ez2U z*Z*^?c$96RV*F-V6L_19sk*FrmNC>e4WnEf+PH^(y0Ww=N1{$)(Sg34Wm0ZI&A@!H z8u8BqU;-B95ueFE2n-oM*g!I!JPQ;>ld( zw+=~|0Krh=m}tm0bCcVCl_2a2x(jS~H^*eH|js(5h4n!+-jXb!yU57g2OT;pP{3Nm> zj_-05F?)*D`uGR-8X@YIWf`6 zuAe1h2|1}KrG&f|-ufT6GeH1eM_BODV&=2PIXl%t#%k$3K|;p%wG~8K2?eQq*;T>E z1C;#E&Gmi5F7M(Zz)X7%o#`Jl=;Jwu(8&Nq?~liR*UHVnS5d<@MX-TBp(%?V>6 zL{$p|owLfR#mtZi54kFe>^_-{h&a95peS7|RL>Ej)i;q!$2&i}@gv{62qc`cVP?Ch zaxK%iTb%BFY{tt-^tZP^?jem6zDuB7Nvd&7adOd<^F<|Uj31a_T*0sl)O41ex`wXv zC$Qq??Yv!j^OX6!3RixykcQjfFT#j>LIbCpIt>%^6uF2y2P{< zk7fKJ_^uG4?OsqUs{CLetF*OEhpyXKeAz!+0)q9$*Y8as4m$5ot{zSDv_Go9e`EhD3wfspyCfx3uk7iYZ`@4eK zU{FqW=7xiCcP}>5%!uzif`{{`gm={C1E!p?qZe^ocuTZ7cLpPgh|#iB|7Ye~h*bCuLM?DugqDNT3{+_)#sp>OZ>uot3KEpy8 zY}w1s2xd;W_$?UKOSx6h0s#Nx2qGOlY5t9!-zdS}AuQCM?&k#|%)4bOd?Nos%tip` za%G8xo+l^av}^My8*p78B|0e2YSwVaxb-n)-h5S9&H8WO290*yduv(HSR;BZRzpo% z)yx8=_9LLNK!iSvtcs(hAsbL*<2R|B!R`9WVSq>Y?AJ&QwlK7YOLa9%gVLs^zK893 zhCiQhh$3qpjQ+^7Fcj$+Lpc@MMq6nwJypo?i@1kS5sN7QROLc%kw@Q4|E2y*uZ$zr z-o|<3vxSO;vrPBBC*nN9utDc|zwO(7pu3w5&yix-Uq+McI0C22_AHQ(-+=V&{MT=7 zE)u-j)yN3%*tuY(FIYn4pW1>m*W zklr{CYKXfR7doqVAU>+ks|?pYYvsmd-k)hzUFe~-xSl16l!KUc^_z0VoGAX|H~4aS zAVm&6QR+-FwO|@n&nYkhlKt__Zbjg6`w| zSzRw7weho^b^v=3o8CVQjs@5{`0x=Vn9GCn-x-|@ooONDkX&?$Fa|L$Rw09wS6*qJ z$%(IyTd7l+n_~Q8T1a=a(GuNi&Xe>c>#cm=+8>uTjIPxk^H9-38s1E4?tNg*=Sne{ z;eJ7Wo|E=B#Sa4#itGNoJv=&c1D0X=-}RinYB-S4Gi%2o$zX|-t*>L9BEw6%sz3i= zEGPe&SIRD#pnm^TZu8eMvzVyFp$pR3IF;vmMw0gQ746H>@;x!EPkhj}Isqq&$3{Cn z<$KC*TT;_A6StzeYyXCuainuvbp#+dq(AjVG3<785YBJrojv1c345vYCk~G&`SdQu zeBH6~hJCIPW)SE3#t@JumXjnt_4^SAOl0)a)O7|g$k!Z~O$_51h^qO)1_3A$ItwM> z#h_dOj0x`F`9$fxV@!#sZb~T3AoF|>c8=mxU(y4%LN0jSthQW^+*XpL(Nx!3l=`tBw& zdmdBmp%R}WX7oR_{WnhcnvXvjs_Y+~EqHbvq)E6BkY$tL3EO#o?D}Pu4B`tbgiAC(4k4MBD9PVi>Cvui?3(7T)lNXuiuS-zP64?tjFaRE_8{!V-M>;dGE88hrCuq62}8f{y+8D0cFC3d78vkW+Tu!q z)42K<*t~Q1VcoJ70M(-Oe=cXRLwM!sRr0^w73s`bxmc@5L&^U>S9A8zcy6-9%3 z$y|FnOV~o6sB{RlqOs_o%ze{qCP3Rw@_DQb66oy?_R< zdic#4D#hrqMUO0dOpKp}vy_d)_s4}@5c zxxsTX9-d=E^h`MA@{oK~CXy-glTb02rix$h;bVDomvS9>Wq_ChQ5^1T`1`?*l}ciX z!3n8dB0G&S+;0*mKu}X;4OKP$^UX6HkCod7>y;OK=2u@E95~7w9D5XA51di9=m_(G z9p)H*y)3C|wCK%3>>A`BU3t;T)V;5!IlzItlTihU_ZJB+NUgFQP=ztMnqHTd4+_3b z1cfJ>WJ#GFKBJ0r{3}+#&4V@<_=%R_ZI=FvJ4q@kfw@;j!>78Ji7HF+a_x)V$tvKoLBP8rbaLO?8!K1#z`Nv_lf80nx7lk zDYR&5%3FO@ITd1|&Cee(M@c4^1kLQ8sm$`*TsKj&=SXPS@E^Mbk~lMS`{?WstV5`7F% z=$rb}s-bqmxup4~sGRWl#e;H+bM1{w_3>w;-SZ(J@JGO=*l$l- zi0?7MLg$D!hxEs!FmY2@&zSp$=0+F#oftm!$f=ID*}<@gKO+GdLU4bi&CcPAK0n60 zXpO_(w1J1OSPH+i;{m6XwEdw!CEd_pM}ZPLi_NKMYjtzb1Vp#azQnd?V<#a+Q}Duq z1Y7O2=?>%q$`vRA_h=9iGfndACvxesj=Gv%>mj{+i%!S>0UMh3T`M_DetVS+H}PBy zRbLwQp2g&YY}sJ-o=$CS%=gKGC#<%amgQ)le<_M|_pI--am+#fkH@BolTU!w(6S5-fPGS`In~|pE z0i=QD>zIcK#85_wB1Yy+lFUnuRHJ~0N4k(9HhXu5s;BE{e zfnURyvo($^XE`CVIPXdI@c5VYo~CKcAh;+)9DL*B*CCm#4{#R)`S)i&??8O~+CM#zs z&{>y~Xlj`o!4Ij69Ex4q%4^UEI)yYOAMFsp4bn(<^}NwoKEF2}UcOOegAeb%XO1^N zx^Gx`r}%Gw#}s;>1fcF;Pf^r+H8I{@C#*5c2iIWN1$Bl-mpb{!A>_d$f=&(nDWI2F z_6nu1myY|YKFQ;w$DV1^3$VE3rhpK^(T5IfD6K;Nn}2jK#VlEnM%#K(PEBWmWM-If z^EAD7Z0KiUog+lDVHK_|kHhNEN<=w{!m{~*^x70 zvennsNRA5L93QYq#LmHZ=RQX&Fn@_4iHFY`vOR0a zd9y3G*sh-{F!Kq;7oNncF1oz-8C9f#$2t2beu6?N^7uiiiQ&aSZFH4qT||{<*5X2Z z2D9;%$_g5Mf$Wg&nrgrwy|;NK(L6bFx9SVwK^ zoI=*ee1@KC_`x15`Dean`0 zsWMqe9WYFJRNW7ftITrjyJm;>>R&s|PNDSPSUoSZ_evwllU%X9zA1fGps68$EBnw1 z=9A!Yp;lRldgPG)#YcAI0h}~W!DSnc2$roBqPlX)QBv_!J*z#wyq&d8+9|dlErNkM z#p=;QwL8@(NOHP|Dx9{#w8MsO5Ua1`yk$KOz{yB>_KFJA)9d|8ula@Vh8+<{EN&u6TOtr{E*z9h z2RMf&+3TiG6lwDYUmxopG!zF&`B9Yd)mhun&xCofChIe8(0vTkQz&#%y+BCp46jrH zBgt`7L@l=v=uH%u?!DE3T8i3Uo0+iD+ZIfZ5=kYcd$|%WYXjE(%7!vCGd$r#3kZ0O z7l0i7HvyALJBg1n+`L$vTO0`Q=rl0a3B3uhJ@~!$^U<3T_K{-Ocj+#A7l!!}HPSff z19FyOTA=-(Ek9nnMn7K z>C&dNFCRCawP{#@QW^Q&zbd99YkkVXbRZrxjqGgdD{u6NS@A->3Erc=9JFrxeK$E& zC<$|MASpY79sc89%>IGT#kFaxOb};{?HlJIRU2Gjt^V;QErzEx1Q^)~fS3*K-sJ8D zb!àQ-u#px7^)lG{BK!BKCb^P@;X;^cqv6*nDG$loPtBrV%j3>++KnGqu?T8Q< zoE#IC2mkf++|xe|Pw1*SB2!cB*p^sfVPtDCBjJG%gjus${vBCF#%TbjpfO(&eA;nl zaZZ*T*34-dXL8>r4#Jzx0_Up&)lte3irfk-*QxBBZiAN&LeN==8U6tHpLhU3UcmZF z;)k4cZlNEDaq#X*Q7S7b%w`)zF{isl(ziasiKFPKRvTZT;UzCGaxk=h5wisNIIx3G z7~*!&;;ll%VY9@aq$jV#sUUB-MHO|Qc`$+^An&DL(oRXnmUF~GO_z}SrO{(l!YHJZ zBENLrFU~64fRyKI(bIOX;m3SG(dE>09T0dxCVPu#cbmUqt?!-!q@?$xr zJ$pg^E%Lotr-k+RKremU(H+t{O8AUv^KT~i&n)vXVxR>8u(tq-tgnK;&%wog{#uv} z1g#+K4Jp6yT8S<`Y16)AD(9W4Yin)DSdc%kHzW|goBCkue4YV3+_YfeW=a4ju zSohyQ7pKN2T6Nmv0fEZ!{6rM^P1k)&h20)DcjA6O^4=h8Nc~5er@DNWt0XFuK;(Ul zo^CekCK-#SN`g+I4S3!>fNIregS1IaJCa7ryo8C=Ud={ilofVESy;=4f4t$_A>fo! zVkZ9Z+xaqmbrr0_LaM3oq45Lga*%eD7lA74^#Y9`F|Mkni1PkO8BC9c0_@+e)9&c- zrQz?~a|-2X>8`R=XbgMbI>ubHtes@8eK+p60K8at^7eEz^L%)_`ggd&R43B@ltDvA6wpx0DoNHx#Q2 z7Wg|2mYW>{UxIzjaEll83CbQx-&^w7nB-n|?lphE_6422+xVCe-)(Hu11cuwDGfID zD&(4#7ot8k`Z>y*_^8?vC6Ge0q}MxN5sNS0TliC$ppzIBss==+2FazOgbd-EDQa8~ zo^*Vvhm)-I|ATj6!uD`qyRL=ZRWch9g)&1!qZUu_xAclfSjwGVP17@<0?Y(CWk|-x z6bm|k4@CSAH2HzpZCAjN4uV2!LpIVfK6Nv6D=Xt(P7?+l7-fT>^4w2fXL z7atsEy&ZF~iOgz#K+BPI*)K%EW^s4x2)7u6un+mzoWPW!-MaZY`1Y}pEST^X`fev- zZV~qX3{{{m!vr*P?tD#LE*c7l(F0nMS^WykHjq+aAwggyVz%_@kKig#5@x?A1eSzi z0Co5?iegHL7U-Xbn^TATOjXxW0rzD(L07{{EZh^*3UmUfZG79YK@W_eQ#!N?(gyw& cB4R-kDGn3u#x|Q^1K`gyB`w8@r)I(b3rtfkVgLXD From 9892a346a87163be76d9c1719ce1421b9b94a9fa Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 05:48:27 +1300 Subject: [PATCH 27/75] Automatic changelog for PR #81956 [ci skip] --- html/changelogs/AutoChangeLog-pr-81956.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81956.yml diff --git a/html/changelogs/AutoChangeLog-pr-81956.yml b/html/changelogs/AutoChangeLog-pr-81956.yml new file mode 100644 index 0000000000000..37060c8a35619 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81956.yml @@ -0,0 +1,4 @@ +author: "ArcaneMusic" +delete-after: True +changes: + - image: "Your station's standard issue E-219 laser turrets within the AI upload and AI satellite have been updated to a newer, shinier model." \ No newline at end of file From e0c2639faf62e41f0d54752ba0768d7753fc5799 Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Wed, 13 Mar 2024 22:22:07 +0530 Subject: [PATCH 28/75] Fixes lag in search bars (#81968) ## About The Pull Request - Fixes #81132 - Fixes #80853 To properly reproduce the issue you only need to type slowly in the search bar(type the word "basic") of the shared engineering techfab in metastation. https://github.com/tgstation/tgstation/assets/110812394/1c2a5791-66e2-468a-9827-6541966c18a9 I don't fully understand why this fixes it so i need an explanation before it gets merged. This was implemented back in #80614 to fix this > Problem goes a little deeper than simply adding "selfClear" prop - ntos messenger is looking for more of a controlled component. Whenever messages are sent, it attempts to update the value in the input box But upon testing the chat messenger with this removed it appears to work fine so not sure what got fixed where but one thing i can assert is that it definitely has nothing to do with debounce. ## Changelog :cl: fix: search bars don't swallow characters or lag behind your typing speed /:cl: --- tgui/packages/tgui/components/Input.tsx | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/tgui/packages/tgui/components/Input.tsx b/tgui/packages/tgui/components/Input.tsx index b4993914c5c18..b6faa1f34740e 100644 --- a/tgui/packages/tgui/components/Input.tsx +++ b/tgui/packages/tgui/components/Input.tsx @@ -150,17 +150,6 @@ export function Input(props: Props) { }, 1); }, []); - /** Updates the initial value on props change */ - useEffect(() => { - const input = inputRef.current; - if (!input) return; - - const newValue = toInputValue(value); - if (input.value === newValue) return; - - input.value = newValue; - }, [value]); - return ( Date: Thu, 14 Mar 2024 05:52:28 +1300 Subject: [PATCH 29/75] Automatic changelog for PR #81968 [ci skip] --- html/changelogs/AutoChangeLog-pr-81968.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81968.yml diff --git a/html/changelogs/AutoChangeLog-pr-81968.yml b/html/changelogs/AutoChangeLog-pr-81968.yml new file mode 100644 index 0000000000000..ad81ed2e48d51 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81968.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "search bars don't swallow characters or lag behind your typing speed" \ No newline at end of file From fa8bf29424072fed964f8a3ca2a9ac31006f5857 Mon Sep 17 00:00:00 2001 From: _0Steven <42909981+00-Steven@users.noreply.github.com> Date: Wed, 13 Mar 2024 18:02:16 +0100 Subject: [PATCH 30/75] Making the fuck you coupon trigger only once, take two (#81953) ## About The Pull Request So a previous pr attempted to fix the fuck you coupon, by adding 1 to the arguments. ```dm (tgstation/code/modules/cargo/coupon.dm, line 87) cursed.AddComponent(/datum/component/omen, 1) ``` But this was setting the `vessel` rather than the `incidents_left` argument to 1. ```dm (tgstation/code/datums/components/omen.dm, line 20) /datum/component/omen/Initialize(obj/vessel, incidents_left, luck_mod, damage_mod) ``` Moving this argument over one fixes the issue. ```dm cursed.AddComponent(/datum/component/omen, null, 1) ``` However! We're now skipping over the `vessel` value, which is used to burn up a curse's vessel once the curse is expended. Setting this to `src` rather than `null` means the fuck you coupon actually gets 'expended', which I think it better than just using `null` or `incidents_left = 1`. The coupon's useless once it's done, and this way it's cooler anyway. For consistency, we then also add this behaviour to when the coupon gives you a heart attack instead. Then! I noticed there was a _second_ bug with fuck you coupons, where it would stop prematurely if the location wasn't a mob. ```dm (tgstation/code/modules/cargo/coupon.dm, line 80-81) if(!ismob(loc)) return FALSE ``` However, this also happens when you don't have a free hand for it to put the coupon in, and thus entirely negating the curse and just giving you a useless fuck you coupon. We fix this by just adding a `user` argument to `generate`, which it prefers to use when available, and is set to the user ripping off the coupon in the first place. ## Why It's Good For The Game Fixes #81946. As fuck you coupons are pretty much useless after expending their curse, and we have to add the vessel value anyway, I thought it'd be more fitting to add the coupon as the vessel rather than just putting in null. Then, for consistency, I felt it'd be best to make them *also* burn when giving you a heart attack when you already have a curse. Y'know, it's expending the coupon for it's one-time fuck you! Also fixes fuck you coupons not actually applying their curse if you didn't have any free hands for it to put the coupon in when ripping it off. ## Changelog :cl: fix: Fuck you coupons ACTUALLY trigger only once again. As a consequence, they also burn up when expended for their one-time fuck you. fix: Fuck you coupons work regardless of whether you had a free hand or not. /:cl: --- code/game/objects/items/storage/fancy.dm | 2 +- code/modules/cargo/coupon.dm | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index a7fbe6e7452f9..d83c80ed56514 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -223,7 +223,7 @@ balloon_alert(user, "ooh, free coupon") var/obj/item/coupon/attached_coupon = new user.put_in_hands(attached_coupon) - attached_coupon.generate(rigged_omen ? COUPON_OMEN : null) + attached_coupon.generate(rigged_omen ? COUPON_OMEN : null, null, user) attached_coupon = null spawn_coupon = FALSE name = "discarded cigarette packet" diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm index 4c5e56a7d4119..8eefcc8676613 100644 --- a/code/modules/cargo/coupon.dm +++ b/code/modules/cargo/coupon.dm @@ -63,7 +63,7 @@ update_name() /// Choose what our prize is :D -/obj/item/coupon/proc/generate(discount, datum/supply_pack/discounted_pack) +/obj/item/coupon/proc/generate(discount, datum/supply_pack/discounted_pack, mob/user) src.discounted_pack = discounted_pack || pick(GLOB.discountable_packs[pick_weight(GLOB.pack_discount_odds)]) var/static/list/chances = list("0.10" = 4, "0.15" = 8, "0.20" = 10, "0.25" = 8, "0.50" = 4, COUPON_OMEN = 1) discount_pct_off = discount || pick_weight(chances) @@ -77,14 +77,14 @@ name = "coupon - fuck you" desc = "The small text reads, 'You will be slaughtered'... That doesn't sound right, does it?" - if(!ismob(loc)) + var/mob/cursed = user || loc + if(!ismob(cursed)) return FALSE - var/mob/cursed = loc to_chat(cursed, span_warning("The coupon reads 'fuck you' in large, bold text... is- is that a prize, or?")) if(!cursed.GetComponent(/datum/component/omen)) - cursed.AddComponent(/datum/component/omen, 1) + cursed.AddComponent(/datum/component/omen, src, 1) return TRUE if(HAS_TRAIT(cursed, TRAIT_CURSED)) to_chat(cursed, span_warning("What a horrible night... To have a curse!")) @@ -98,6 +98,7 @@ /obj/item/coupon/proc/curse_heart(mob/living/cursed) if(!iscarbon(cursed)) cursed.gib(DROP_ALL_REMAINS) + burn_evilly() return TRUE var/mob/living/carbon/player = cursed @@ -105,6 +106,11 @@ to_chat(player, span_mind_control("What could that coupon mean?")) to_chat(player, span_userdanger("...The suspense is killing you!")) player.set_heartattack(status = TRUE) + burn_evilly() + +/obj/item/coupon/proc/burn_evilly() + visible_message(span_warning("[src] burns up in a sinister flash, taking an evil energy with it...")) + burn() /obj/item/coupon/attack_atom(obj/O, mob/living/user, params) if(!istype(O, /obj/machinery/computer/cargo)) From b1ea7b6313c3c1560a230143ffafaf6d40b0f9c6 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 06:02:38 +1300 Subject: [PATCH 31/75] Automatic changelog for PR #81953 [ci skip] --- html/changelogs/AutoChangeLog-pr-81953.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81953.yml diff --git a/html/changelogs/AutoChangeLog-pr-81953.yml b/html/changelogs/AutoChangeLog-pr-81953.yml new file mode 100644 index 0000000000000..61329d143849b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81953.yml @@ -0,0 +1,5 @@ +author: "00-Steven" +delete-after: True +changes: + - bugfix: "Fuck you coupons ACTUALLY trigger only once again. As a consequence, they also burn up when expended for their one-time fuck you." + - bugfix: "Fuck you coupons work regardless of whether you had a free hand or not." \ No newline at end of file From be2f292253a467753fa3edf0f3a095810aaaf458 Mon Sep 17 00:00:00 2001 From: Jacquerel Date: Wed, 13 Mar 2024 17:21:46 +0000 Subject: [PATCH 32/75] Gulag boulder mining adjustments (#81971) ## About The Pull Request This PR does two fairly simple things. Firstly, it triples the gulag point value of every material except glass. Secondly, it allows mining skill increases to effect the speed of boulder breaking and reduce the stamina "exertion" you take. I tried this out personally on Lavaland and Icebox and while this is very much dependent on RNG (and storm timing) this got earning 1000 points purely from mining and smashing boulders down to _about_ ten minutes of work, which I believe is the rough estimate of how much effort it was before that. It may skew a bit higher than that if the ash storm happens at a bad time or the game gives you predominantly iron, but not a _lot_ higher. The mining skill = faster smashing thing is... barely perceptible after ten minutes of mining to be honest but it's saving _some_ time and I think if it gives you the exp it might as well benefit from it too. I didn't do anything for _glass_ because you can just pick that up off the ground in Lavaland and I didn't want to make _that_ the ideal route to getting your sentence finished. ## Why It's Good For The Game Since ArcMining was merged, the gulag has changed to a system primarily about digging up boulders and smashing them with a pickaxe for random rewards. I think the chain gang thing is pretty flavourful, but the inability to just target high-value materials (because you could see them on the mining scanner) and the overall decrease in output has made it take a lot longer to get a similar amount of points. People are sending prisoners out to mine for 1000 points of materials assuming this is about 10 minutes work, when in reality it was more like 30-35 minutes. Longer on Lavaland, where you need to take breaks for ash storms. This was not an intentional "nerf" to prisoner miners and should hopefully bring it back down to somewhere closer to the previous level. ## Changelog :cl: balance: All materials except glass are now worth more gulag points than before. balance: Mining skill decreases the time it takes to break boulders, and makes it less tiring. /:cl: --- code/game/objects/items/stacks/bscrystal.dm | 2 +- .../game/objects/items/stacks/sheets/glass.dm | 4 ++-- .../objects/items/stacks/sheets/mineral.dm | 20 +++++++++---------- .../items/stacks/sheets/sheet_types.dm | 4 ++-- .../mining/boulder_processing/boulder.dm | 12 +++++------ 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 19b518157c8c2..75c35eabb1818 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -74,7 +74,7 @@ attack_verb_simple = list("bluespace polybash", "bluespace polybatter", "bluespace polybludgeon", "bluespace polythrash", "bluespace polysmash") novariants = TRUE grind_results = list(/datum/reagent/bluespace = 20) - point_value = 30 + point_value = 90 merge_type = /obj/item/stack/sheet/bluespace_crystal material_type = /datum/material/bluespace var/crystal_type = /obj/item/stack/ore/bluespace_crystal/refined diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 5a789d34350e2..d6bd65afe31e1 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -159,7 +159,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/rglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10) - point_value = 4 + point_value = 12 matter_amount = 6 tableVariant = /obj/structure/table/reinforced/rglass @@ -197,7 +197,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ material_flags = NONE merge_type = /obj/item/stack/sheet/plasmarglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10) - point_value = 23 + point_value = 69 matter_amount = 8 tableVariant = /obj/structure/table/reinforced/plasmarglass diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 8eafe6d52e5ae..0620d82cd9bf4 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ sheettype = "diamond" mats_per_unit = list(/datum/material/diamond=SHEET_MATERIAL_AMOUNT) grind_results = list(/datum/reagent/carbon = 20) - point_value = 25 + point_value = 75 merge_type = /obj/item/stack/sheet/mineral/diamond material_type = /datum/material/diamond walltype = /turf/closed/wall/mineral/diamond @@ -124,7 +124,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ sheettype = "uranium" mats_per_unit = list(/datum/material/uranium=SHEET_MATERIAL_AMOUNT) grind_results = list(/datum/reagent/uranium = 20) - point_value = 20 + point_value = 60 merge_type = /obj/item/stack/sheet/mineral/uranium material_type = /datum/material/uranium walltype = /turf/closed/wall/mineral/uranium @@ -157,7 +157,7 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ max_integrity = 100 mats_per_unit = list(/datum/material/plasma=SHEET_MATERIAL_AMOUNT) grind_results = list(/datum/reagent/toxin/plasma = 20) - point_value = 20 + point_value = 60 merge_type = /obj/item/stack/sheet/mineral/plasma material_type = /datum/material/plasma walltype = /turf/closed/wall/mineral/plasma @@ -192,7 +192,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ sheettype = "gold" mats_per_unit = list(/datum/material/gold=SHEET_MATERIAL_AMOUNT) grind_results = list(/datum/reagent/gold = 20) - point_value = 20 + point_value = 60 merge_type = /obj/item/stack/sheet/mineral/gold material_type = /datum/material/gold walltype = /turf/closed/wall/mineral/gold @@ -219,7 +219,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ sheettype = "silver" mats_per_unit = list(/datum/material/silver=SHEET_MATERIAL_AMOUNT) grind_results = list(/datum/reagent/silver = 20) - point_value = 20 + point_value = 60 merge_type = /obj/item/stack/sheet/mineral/silver material_type = /datum/material/silver tableVariant = /obj/structure/table/optable @@ -245,7 +245,7 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ sheettype = "bananium" mats_per_unit = list(/datum/material/bananium=SHEET_MATERIAL_AMOUNT) grind_results = list(/datum/reagent/consumable/banana = 20) - point_value = 50 + point_value = 150 merge_type = /obj/item/stack/sheet/mineral/bananium material_type = /datum/material/bananium walltype = /turf/closed/wall/mineral/bananium @@ -276,7 +276,7 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \ throw_range = 3 sheettype = "titanium" mats_per_unit = list(/datum/material/titanium=SHEET_MATERIAL_AMOUNT) - point_value = 20 + point_value = 60 merge_type = /obj/item/stack/sheet/mineral/titanium material_type = /datum/material/titanium walltype = /turf/closed/wall/mineral/titanium @@ -308,7 +308,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ throw_range = 3 sheettype = "plastitanium" mats_per_unit = list(/datum/material/alloy/plastitanium=SHEET_MATERIAL_AMOUNT) - point_value = 45 + point_value = 135 material_type = /datum/material/alloy/plastitanium merge_type = /obj/item/stack/sheet/mineral/plastitanium material_flags = NONE @@ -482,7 +482,7 @@ GLOBAL_LIST_INIT(metalhydrogen_recipes, list( singular_name = "metal hydrogen sheet" w_class = WEIGHT_CLASS_NORMAL resistance_flags = FIRE_PROOF | LAVA_PROOF | ACID_PROOF | INDESTRUCTIBLE - point_value = 100 + point_value = 300 mats_per_unit = list(/datum/material/metalhydrogen = SHEET_MATERIAL_AMOUNT) material_type = /datum/material/metalhydrogen merge_type = /obj/item/stack/sheet/mineral/metal_hydrogen @@ -497,7 +497,7 @@ GLOBAL_LIST_INIT(metalhydrogen_recipes, list( inhand_icon_state = "sheet-zaukerite" singular_name = "zaukerite crystal" w_class = WEIGHT_CLASS_NORMAL - point_value = 120 + point_value = 360 mats_per_unit = list(/datum/material/zaukerite = SHEET_MATERIAL_AMOUNT) merge_type = /obj/item/stack/sheet/mineral/zaukerite material_type = /datum/material/zaukerite diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 3b32e6b1d9356..bad21b87ac306 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -150,7 +150,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/iron grind_results = list(/datum/reagent/iron = 20) - point_value = 2 + point_value = 6 tableVariant = /obj/structure/table material_type = /datum/material/iron matter_amount = 4 @@ -277,7 +277,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/plasteel grind_results = list(/datum/reagent/iron = 20, /datum/reagent/toxin/plasma = 20) - point_value = 23 + point_value = 69 tableVariant = /obj/structure/table/reinforced material_flags = NONE matter_amount = 12 diff --git a/code/modules/mining/boulder_processing/boulder.dm b/code/modules/mining/boulder_processing/boulder.dm index 699358c6adbda..4aa7f57d8a738 100644 --- a/code/modules/mining/boulder_processing/boulder.dm +++ b/code/modules/mining/boulder_processing/boulder.dm @@ -108,6 +108,7 @@ /obj/item/boulder/proc/manual_process(obj/item/weapon, mob/living/user, override_speed_multiplier, continued = FALSE) var/process_speed = 0 //Handle weapon conditions. + var/skill_modifier = user.mind?.get_skill_modifier(/datum/skill/mining, SKILL_SPEED_MODIFIER) || 1 if(weapon) if(HAS_TRAIT(weapon, TRAIT_INSTANTLY_PROCESSES_BOULDERS)) durability = 0 @@ -118,25 +119,24 @@ // Handle user conditions/override conditions. else if (override_speed_multiplier || HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) - if(user) - if(HAS_TRAIT(user, TRAIT_INSTANTLY_PROCESSES_BOULDERS)) - durability = 0 + if(HAS_TRAIT(user, TRAIT_INSTANTLY_PROCESSES_BOULDERS)) + durability = 0 else if(override_speed_multiplier) process_speed = override_speed_multiplier else process_speed = INATE_BOULDER_SPEED_MULTIPLIER playsound(src, 'sound/effects/rocktap1.ogg', 50) if(!continued) - to_chat(user, span_notice("You scrape away at \the [src]... speed is [process_speed].")) + to_chat(user, span_notice("You scrape away at \the [src]...")) else CRASH("No weapon, acceptable user, or override speed multiplier passed to manual_process()") if(durability > 0) - if(!do_after(user, (2 * process_speed SECONDS), target = src)) + if(!do_after(user, (2 * process_speed * skill_modifier SECONDS), target = src)) return if(!user.Adjacent(src)) return durability-- - user.apply_damage(4, STAMINA) + user.apply_damage(4 * skill_modifier, STAMINA) if(durability <= 0) convert_to_ore() to_chat(user, span_notice("You finish working on \the [src], and it crumbles into ore.")) From 08421af5fb2b4f7b8718f1a053b88f9ce1b224a8 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 06:22:06 +1300 Subject: [PATCH 33/75] Automatic changelog for PR #81971 [ci skip] --- html/changelogs/AutoChangeLog-pr-81971.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81971.yml diff --git a/html/changelogs/AutoChangeLog-pr-81971.yml b/html/changelogs/AutoChangeLog-pr-81971.yml new file mode 100644 index 0000000000000..2c8cbd016211a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81971.yml @@ -0,0 +1,5 @@ +author: "Jacquerel" +delete-after: True +changes: + - balance: "All materials except glass are now worth more gulag points than before." + - balance: "Mining skill decreases the time it takes to break boulders, and makes it less tiring." \ No newline at end of file From b3336f42a672e31c984a99d04a59b74033f0b480 Mon Sep 17 00:00:00 2001 From: Interception&? <137328283+intercepti0n@users.noreply.github.com> Date: Wed, 13 Mar 2024 20:25:27 +0300 Subject: [PATCH 34/75] Resprites t-ray and geiger (#81958) --- icons/obj/devices/scanner.dmi | Bin 30368 -> 30120 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/devices/scanner.dmi b/icons/obj/devices/scanner.dmi index 0b4a5ef4684e11ca033c0cc7c7b1e41a71371f7c..cea20f32f7f381a66215ff4d0bc38dbdbbaee7d1 100644 GIT binary patch literal 30120 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 Date: Thu, 14 Mar 2024 06:25:47 +1300 Subject: [PATCH 35/75] Automatic changelog for PR #81958 [ci skip] --- html/changelogs/AutoChangeLog-pr-81958.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81958.yml diff --git a/html/changelogs/AutoChangeLog-pr-81958.yml b/html/changelogs/AutoChangeLog-pr-81958.yml new file mode 100644 index 0000000000000..374e685b5a019 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81958.yml @@ -0,0 +1,4 @@ +author: "intercepti0n" +delete-after: True +changes: + - image: "Resprited T-ray & Geiger counter." \ No newline at end of file From 737822398a1f967f2457ebfeed5628c438b89b1b Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Wed, 13 Mar 2024 20:22:01 +0100 Subject: [PATCH 36/75] Blackmarket refactor and balance, fixing spy bounties, plus a new category for people captured by pirates/tots/contractors. (#81818) ## About The Pull Request This PR aims to take care of a few potential hard dels and fix the fenced goods category first and foremost. The PR also adds a new one that enables you to buy mobs captured by antags in advance, before they're sent back to the station. Unlike other categories, it doesn't have "Launch" and "Teleport" as delivery methods, instead it uses a special "Supply Pod" delivery method that ships the chattel directly to your location. This method costs 400 credits, however, if you've built the LTSRBT, shipment will be free. Another thing, I always felt LTSRBT to be pretty fucking dumb as is. Way too overpriced for the benefits it offers: a slighty cheaper delivery method that, while definitely better than the other two, doesn't really pay off or honestly even remotely compensate the 4000 credits you just spent to get it, especially if you're only buying a couple items at most. So I decided to remove it from cargo and add it to the blackmarket as a 500 to 750 creds item, available every round. Human mobs sold by the pirate bounty pad are no longer deleted, instead they're properly ransomed and sent to the holding facility, much like for contractors and tots. This means they're also added to the black market. ## Why It's Good For The Game The blackmarket system has some issues to it that need to be fixed (otherwise the "Fenced Goods" and "Hostages" categories wouldn't work). The Pirate Pad deleting "ransomed" mobs instead of actually ransoming them is lame. The LTSRBT shouldn't suck as much. Also more market stuff. This will fix #81809. ## Changelog :cl: fix: Fixed the "Fenced Goods" black market category. balance: Removed the LTSRBT from cargo and added it to the blackmarket, reduced the price from 4000 to 625 on average. balance: The time it takes for captured mobs to be automatically sent back to the station from the holding facility has been increased from 3-4 minutes to 6. add: You can buy mobs captured by contractors, traitors and pirates from the black market and have them sent back to the station in advance. For safety, they'll also be handcuffed (not always) upon delivery. add: Human mobs sold by pirates are not deleted anymore. Instead, they're now captured and sent to the holding facility. /:cl: --- code/__DEFINES/antagonists.dm | 3 + code/__DEFINES/blackmarket.dm | 3 +- code/__DEFINES/cargo.dm | 7 ++ .../dcs/signals/signals_blackmarket.dm | 2 + .../signals/signals_mob/signals_mob_living.dm | 3 + code/controllers/subsystem/blackmarket.dm | 65 +++++++------- code/game/gamemodes/objective.dm | 5 ++ .../pirate/pirate_shuttle_equipment.dm | 74 +++++++++++++--- code/modules/antagonists/spy/spy_bounty.dm | 36 ++++---- .../traitor/contractor/syndicate_contract.dm | 72 ++++++---------- .../traitor/objectives/kidnapping.dm | 46 ++++------ code/modules/cargo/exports.dm | 65 +++++++++----- code/modules/cargo/markets/_market.dm | 68 +++++++++------ code/modules/cargo/markets/market_item.dm | 73 +++++++++++++--- .../cargo/markets/market_items/consumables.dm | 3 +- .../cargo/markets/market_items/hostages.dm | 84 +++++++++++++++++++ .../cargo/markets/market_items/misc.dm | 6 +- .../markets/market_items/stolen_goods.dm | 12 +++ .../cargo/markets/market_items/tools.dm | 12 +++ code/modules/cargo/markets/market_telepad.dm | 48 ++++++----- code/modules/cargo/markets/market_uplink.dm | 31 ++++--- code/modules/cargo/packs/imports.dm | 13 --- code/modules/cargo/supplypod.dm | 26 ++++++ .../clothing/under/accessories/badges.dm | 4 +- code/modules/mob/living/living.dm | 20 +++++ tgstation.dme | 3 + 26 files changed, 533 insertions(+), 251 deletions(-) create mode 100644 code/__DEFINES/dcs/signals/signals_blackmarket.dm create mode 100644 code/modules/cargo/markets/market_items/hostages.dm create mode 100644 code/modules/cargo/markets/market_items/stolen_goods.dm diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index af1cb68c41cad..0323bc1173512 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -36,6 +36,9 @@ ///How long pirates will wait for a response before attacking #define RESPONSE_MAX_TIME 2 MINUTES +/// How long till a spessman should come back after being captured and sent to the holding facility (which some antags use) +#define COME_BACK_FROM_CAPTURE_TIME 6 MINUTES + //ERT Types #define ERT_BLUE "Blue" #define ERT_RED "Red" diff --git a/code/__DEFINES/blackmarket.dm b/code/__DEFINES/blackmarket.dm index 5494c371db7b4..c3b8ad0bf4622 100644 --- a/code/__DEFINES/blackmarket.dm +++ b/code/__DEFINES/blackmarket.dm @@ -7,4 +7,5 @@ #define SHIPPING_METHOD_TELEPORT "Teleport" // Throws the item from somewhere at the station. #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/cargo.dm b/code/__DEFINES/cargo.dm index 63d5682ef0f37..1d34ed6b3cff8 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -64,3 +64,10 @@ #define SUPPLY_PACK_UNCOMMON_DISCOUNTABLE "uncommon_discount" ///Discount category for the silly, overpriced, joke content, sometimes useful or plain bad. #define SUPPLY_PACK_RARE_DISCOUNTABLE "rare_discount" + +///Standard export define for not selling the item. +#define EXPORT_NOT_SOLD 0 +///Sell the item +#define EXPORT_SOLD 1 +///Sell the item, but for the love of god, don't delete it, we're handling it in a fancier way. +#define EXPORT_SOLD_DONT_DELETE 2 diff --git a/code/__DEFINES/dcs/signals/signals_blackmarket.dm b/code/__DEFINES/dcs/signals/signals_blackmarket.dm new file mode 100644 index 0000000000000..86e3d9277a1c0 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_blackmarket.dm @@ -0,0 +1,2 @@ +///From /datum/market_item/spawn_item(): (uplink, shipping_method, shipping_loc) +#define COMSIG_MARKET_ITEM_SPAWNED "market_item_spawned" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index b1914cc966bd4..d947e42302ed8 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -171,6 +171,9 @@ ///From obj/item/toy/crayon/spraycan #define COMSIG_LIVING_MOB_PAINTED "living_mob_painted" +///From obj/closet/supplypod/return_victim: (turf/destination) +#define COMSIG_LIVING_RETURN_FROM_CAPTURE "living_return_from_capture" + ///From mob/living/proc/wabbajack(): (randomize_type) #define COMSIG_LIVING_PRE_WABBAJACKED "living_mob_wabbajacked" /// Return to stop the rest of the wabbajack from triggering. diff --git a/code/controllers/subsystem/blackmarket.dm b/code/controllers/subsystem/blackmarket.dm index bdd342cbf3d04..ea70b5c722904 100644 --- a/code/controllers/subsystem/blackmarket.dm +++ b/code/controllers/subsystem/blackmarket.dm @@ -5,9 +5,10 @@ SUBSYSTEM_DEF(blackmarket) /// Descriptions for each shipping methods. var/shipping_method_descriptions = list( - SHIPPING_METHOD_LAUNCH="Launches the item at the station from space, cheap but you might not receive your item at all.", - SHIPPING_METHOD_LTSRBT="Long-To-Short-Range-Bluespace-Transceiver, a machine that receives items outside the station and then teleports them to the location of the uplink.", - SHIPPING_METHOD_TELEPORT="Teleports the item in a random area in the station, you get 60 seconds to get there first though." + SHIPPING_METHOD_LAUNCH = "Launches the item at the station from space, cheap but you might not receive your item at all.", + SHIPPING_METHOD_LTSRBT = "Long-To-Short-Range-Bluespace-Transceiver, a machine that receives items outside the station and then teleports them to the location of the uplink.", + SHIPPING_METHOD_TELEPORT = "Teleports the item in a random area in the station, you get 60 seconds to get there first though.", + SHIPPING_METHOD_SUPPLYPOD = "Ships the item inside a supply pod at your exact location. Showy, speedy and expensive.", ) /// List of all existing markets. @@ -42,11 +43,7 @@ SUBSYSTEM_DEF(blackmarket) var/datum/market_purchase/purchase = queued_purchases[1] queued_purchases.Cut(1,2) - // Uh oh, uplink is gone. We will just keep the money and you will not get your order. - if(!purchase.uplink || QDELETED(purchase.uplink)) - queued_purchases -= purchase - qdel(purchase) - continue + var/mob/buyer = recursive_loc_check(purchase.uplink.loc, /mob) switch(purchase.method) // Find a ltsrbt pad and make it handle the shipping. @@ -54,65 +51,71 @@ SUBSYSTEM_DEF(blackmarket) if(!telepads.len) continue // Prioritize pads that don't have a cooldown active. - var/free_pad_found = FALSE - for(var/obj/machinery/ltsrbt/pad in telepads) + var/obj/machinery/ltsrbt/free_pad_found + for(var/obj/machinery/ltsrbt/pad as anything in telepads) if(pad.recharge_cooldown) continue pad.add_to_queue(purchase) - queued_purchases -= purchase - free_pad_found = TRUE + free_pad_found = pad break - if(free_pad_found) + if(isnull(free_pad_found)) continue - var/obj/machinery/ltsrbt/pad = pick(telepads) - - to_chat(recursive_loc_check(purchase.uplink.loc, /mob), span_notice("[purchase.uplink] flashes a message noting that the order is being processed by [pad].")) + to_chat(buyer, span_notice("[purchase.uplink] flashes a message noting that the order is being processed by [free_pad_found].")) - queued_purchases -= purchase - pad.add_to_queue(purchase) // Get random area, throw it somewhere there. if(SHIPPING_METHOD_TELEPORT) var/turf/targetturf = get_safe_random_station_turf() // This shouldn't happen. if (!targetturf) continue + queued_purchases -= purchase - to_chat(recursive_loc_check(purchase.uplink.loc, /mob), span_notice("[purchase.uplink] flashes a message noting that the order is being teleported to [get_area(targetturf)] in 60 seconds.")) + 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.entry.spawn_item(), targetturf), 60 SECONDS) - queued_purchases -= purchase - qdel(purchase) + 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) var/startSide = pick(GLOB.cardinals) var/turf/T = get_turf(purchase.uplink) var/pickedloc = spaceDebrisStartLoc(startSide, T.z) - var/atom/movable/item = purchase.entry.spawn_item(pickedloc) + var/atom/movable/item = purchase.entry.spawn_item(pickedloc, purchase) item.throw_at(purchase.uplink, 3, 3, spin = FALSE) - to_chat(recursive_loc_check(purchase.uplink.loc, /mob), span_notice("[purchase.uplink] flashes a message noting the order is being launched at the station from [dir2text(startSide)].")) + to_chat(buyer, span_notice("[purchase.uplink] flashes a message noting the order is being launched at the station from [dir2text(startSide)].")) + qdel(purchase) - queued_purchases -= purchase + if(SHIPPING_METHOD_SUPPLYPOD) + var/obj/structure/closet/supplypod/back_to_station/pod = new() + purchase.entry.spawn_item(pod, purchase) + new /obj/effect/pod_landingzone(get_turf(purchase.uplink), pod) + + to_chat(buyer, span_notice("[purchase.uplink] flashes a message noting the order is being launched at your location. Right here, right now!")) qdel(purchase) if(MC_TICK_CHECK) break /// Used to make a teleportation effect as do_teleport does not like moving items from nullspace. -/datum/controller/subsystem/blackmarket/proc/fake_teleport(atom/movable/item, turf/target) - item.forceMove(target) +/datum/controller/subsystem/blackmarket/proc/fake_teleport(datum/market_purchase/purchase, turf/target) + // Oopsie, whoopsie, the item is gone. So long, and thanks for all the money. + if(QDELETED(purchase)) + return + var/atom/movable/thing = purchase.entry.spawn_item(target, purchase) var/datum/effect_system/spark_spread/sparks = new sparks.set_up(5, 1, target) - sparks.attach(item) + sparks.attach(thing) sparks.start() + qdel(purchase) /// Used to add /datum/market_purchase to queued_purchases var. Returns TRUE when queued. -/datum/controller/subsystem/blackmarket/proc/queue_item(datum/market_purchase/P) - if(P.method == SHIPPING_METHOD_LTSRBT && !telepads.len) +/datum/controller/subsystem/blackmarket/proc/queue_item(datum/market_purchase/purchase) + if((purchase.method == SHIPPING_METHOD_LTSRBT && !telepads.len) || isnull(purchase.uplink)) + qdel(purchase) return FALSE - queued_purchases += P + queued_purchases += purchase return TRUE diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index a386dec8db2f5..50c75850647f8 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1006,6 +1006,11 @@ GLOBAL_LIST_EMPTY(possible_items) var/payout_bonus = 0 var/area/dropoff = null +/datum/objective/contract/is_valid_target(datum/mind/possible_target) + if(HAS_TRAIT(possible_target, TRAIT_HAS_BEEN_KIDNAPPED)) + return FALSE + return ..() + // Generate a random valid area on the station that the dropoff will happen. /datum/objective/contract/proc/generate_dropoff() var/found = FALSE diff --git a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm index 84f3a151dd2cb..2b323d51162a4 100644 --- a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm +++ b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm @@ -271,6 +271,10 @@ . = TRUE if("send") start_sending() + //We ensure that the holding facility is loaded in time in case we're selling mobs. + //This isn't the prettiest place to put it, but 'start_sending()' is also used by civilian bounty computers + //And we don't need them to also load the holding facility. + SSmapping.lazy_load_template(LAZY_TEMPLATE_KEY_NINJA_HOLDING_FACILITY) . = TRUE if("stop") stop_sending() @@ -283,12 +287,9 @@ status_report = "Predicted value: " var/value = 0 - var/datum/export_report/report = new + var/obj/machinery/piratepad/pad = pad_ref?.resolve() - for(var/atom/movable/AM in get_turf(pad)) - if(AM == pad) - continue - export_item_and_contents(AM, apply_elastic = FALSE, dry_run = TRUE, external_report = report, ignore_typecache = nosell_typecache) + var/datum/export_report/report = pirate_export_loop(pad) for(var/datum/export/exported_datum in report.total_amount) status_report += exported_datum.total_printout(report,notes = FALSE) @@ -303,13 +304,8 @@ if(!sending) return - var/datum/export_report/report = new var/obj/machinery/piratepad/pad = pad_ref?.resolve() - - for(var/atom/movable/item_on_pad in get_turf(pad)) - if(item_on_pad == pad) - continue - export_item_and_contents(item_on_pad, apply_elastic = FALSE, delete_unsold = FALSE, external_report = report, ignore_typecache = nosell_typecache) + var/datum/export_report/report = pirate_export_loop(pad, dry_run = FALSE) status_report = "Sold: " var/value = 0 @@ -341,6 +337,33 @@ pad.icon_state = pad.idle_state sending = FALSE +///The loop that calculates the value of stuff on a pirate pad, or plain sell them if dry_run is FALSE. +/obj/machinery/computer/piratepad_control/proc/pirate_export_loop(obj/machinery/piratepad/pad, dry_run = TRUE) + var/datum/export_report/report = new + for(var/atom/movable/item_on_pad as anything in get_turf(pad)) + if(item_on_pad == pad) + continue + var/list/hidden_mobs = list() + var/skip_movable = FALSE + var/list/item_contents = item_on_pad.get_all_contents() + for(var/atom/movable/thing in reverse_range(item_contents)) + ///Don't destroy/sell stuff like the captain's laser gun, or borgs. + if(thing.resistance_flags & INDESTRUCTIBLE || is_type_in_typecache(thing, nosell_typecache)) + skip_movable = TRUE + break + if(isliving(thing)) + hidden_mobs += thing + if(skip_movable) + continue + for(var/mob/living/hidden as anything in hidden_mobs) + ///Sell mobs, but leave their contents intact. + export_single_item(hidden, apply_elastic = FALSE, dry_run = dry_run, external_report = report) + ///there are still licing mobs inside that item. Stop, don't sell it ffs. + if(locate(/mob/living) in item_on_pad.get_all_contents()) + continue + export_item_and_contents(item_on_pad, apply_elastic = FALSE, dry_run = dry_run, delete_unsold = FALSE, external_report = report, ignore_typecache = nosell_typecache) + return report + /// Prepares to sell the items on the pad /obj/machinery/computer/piratepad_control/proc/start_sending() var/obj/machinery/piratepad/pad = pad_ref?.resolve() @@ -391,7 +414,7 @@ /datum/export/pirate/ransom/get_cost(atom/movable/exported_item) var/mob/living/carbon/human/ransomee = exported_item - if(ransomee.stat != CONSCIOUS || !ransomee.mind) //mint condition only + if(ransomee.stat != CONSCIOUS || !ransomee.mind || HAS_TRAIT(ransomee.mind, TRAIT_HAS_BEEN_KIDNAPPED)) //mint condition only return 0 else if(FACTION_PIRATE in ransomee.faction) //can't ransom your fellow pirates to CentCom! return 0 @@ -400,6 +423,33 @@ else return 1000 +/datum/export/pirate/ransom/sell_object(mob/living/carbon/human/sold_item, datum/export_report/report, dry_run = TRUE, apply_elastic = TRUE) + . = ..() + if(. == EXPORT_NOT_SOLD) + return + var/turf/picked_turf = pick(GLOB.holdingfacility) + sold_item.forceMove(picked_turf) + var/mob_cost = get_cost(sold_item) + sold_item.process_capture(mob_cost, mob_cost * 1.2) + do_sparks(8, FALSE, sold_item) + playsound(picked_turf, 'sound/weapons/emitter2.ogg', 25, TRUE) + sold_item.flash_act() + sold_item.adjust_confusion(10 SECONDS) + sold_item.adjust_dizzy(10 SECONDS) + addtimer(src, CALLBACK(src, PROC_REF(send_back_to_station), sold_item), COME_BACK_FROM_CAPTURE_TIME) + to_chat(sold_item, span_hypnophrase("A million voices echo in your head... \"Yaarrr, thanks for the booty, landlubber. \ + You will be ransomed back to your station, so it's only a matter of time before we ship you back...")) + + return EXPORT_SOLD_DONT_DELETE + +///Send them back to the station after a while. +/datum/export/pirate/ransom/proc/send_back_to_station(mob/living/prisoner) + ///Deleted or already bailed out of the place. + if(QDELETED(prisoner) || !istype(get_area(prisoner), /area/centcom/central_command_areas/holding)) + return + var/obj/structure/closet/supplypod/back_to_station/return_pod = new() + return_pod.return_from_capture(prisoner) + /datum/export/pirate/parrot cost = 2000 unit_name = "alive parrot" diff --git a/code/modules/antagonists/spy/spy_bounty.dm b/code/modules/antagonists/spy/spy_bounty.dm index e3c96fc815f3b..0a9422e07b807 100644 --- a/code/modules/antagonists/spy/spy_bounty.dm +++ b/code/modules/antagonists/spy/spy_bounty.dm @@ -133,13 +133,15 @@ do_sparks(3, FALSE, stealing) // Don't mess with it while it's going away + var/had_attack_hand_interaction = stealing.interaction_flags_atom & INTERACT_ATOM_ATTACK_HAND stealing.interaction_flags_atom &= ~INTERACT_ATOM_ATTACK_HAND + var/was_anchored = stealing.anchored stealing.anchored = TRUE // Add some pizzazz - animate(stealing, time = 0.5 SECONDS, transform = matrix(stealing.transform).Scale(0.01), easing = CUBIC_EASING) + animate(stealing, time = 0.5 SECONDS, transform = stealing.transform.Scale(0.01), easing = CUBIC_EASING) if(isitem(stealing) && ((stealing.resistance_flags & INDESTRUCTIBLE) || prob(black_market_prob))) - addtimer(CALLBACK(src, PROC_REF(send_to_black_market), stealing), 0.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(send_to_black_market), stealing, had_attack_hand_interaction, was_anchored), 0.5 SECONDS) else addtimer(CALLBACK(src, PROC_REF(finish_cleanup), stealing), 0.5 SECONDS) @@ -158,33 +160,31 @@ * * * thing - The item to put up on the black market. */ -/datum/spy_bounty/proc/send_to_black_market(atom/movable/thing) +/datum/spy_bounty/proc/send_to_black_market(atom/movable/thing, had_attack_hand_interaction, was_anchored) if(QDELETED(thing)) // Just in case anything does anything weird return FALSE - thing.interaction_flags_atom = initial(thing.interaction_flags_atom) - thing.anchored = initial(thing.anchored) + ///reset the appearance and all. + if(had_attack_hand_interaction) + thing.interaction_flags_atom |= INTERACT_ATOM_ATTACK_HAND + thing.anchored = was_anchored + thing.transform = thing.transform.Scale(10) thing.moveToNullspace() - var/datum/market_item/new_item = new() - new_item.item = thing - new_item.name = "Stolen [thing.name]" - new_item.desc = "A [thing.name], stolen from somewhere on the station. Whoever owned it probably wouldn't be happy to see it here." - new_item.category = "Fenced Goods" - new_item.stock = 1 - new_item.availability_prob = 100 - + var/item_price switch(difficulty) if(SPY_DIFFICULTY_EASY) - new_item.price = PAYCHECK_COMMAND * 2.5 + item_price = PAYCHECK_COMMAND * 2.5 if(SPY_DIFFICULTY_MEDIUM) - new_item.price = PAYCHECK_COMMAND * 5 + item_price = PAYCHECK_COMMAND * 5 if(SPY_DIFFICULTY_HARD) - new_item.price = PAYCHECK_COMMAND * 10 + item_price = PAYCHECK_COMMAND * 10 - new_item.price += rand(0, PAYCHECK_COMMAND * 5) + item_price += rand(0, PAYCHECK_COMMAND * 5) if(thing.resistance_flags & INDESTRUCTIBLE) - new_item.price *= 2 + item_price *= 2 + + var/datum/market_item/stolen_good/new_item = new(thing, item_price) return SSblackmarket.markets[/datum/market/blackmarket].add_item(new_item) diff --git a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm index f2868bdce3025..2c9d45e382dd4 100644 --- a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm @@ -15,6 +15,8 @@ var/wanted_message ///List of everything found on the victim at the time of contracting, used to return their stuff afterwards. var/list/victim_belongings = list() + ///timerid for stuff that handles victim chat messages, effects and returnal + var/victim_timerid /datum/syndicate_contract/New(contract_owner, blacklist, type=CONTRACT_PAYOUT_SMALL) contract = new(src) @@ -122,20 +124,8 @@ //we'll start the effects in a few seconds since it takes a moment for the pod to leave. addtimer(CALLBACK(src, PROC_REF(handle_victim_experience), person_sent), 3 SECONDS) - // This is slightly delayed because of the sleep calls above to handle the narrative. - // We don't want to tell the station instantly. - var/points_to_check - var/datum/bank_account/cargo_account = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(cargo_account) - points_to_check = cargo_account.account_balance - if(points_to_check >= ransom) - cargo_account.adjust_money(-ransom) - else - cargo_account.adjust_money(-points_to_check) - priority_announce( - text = "One of your crew was captured by a rival organisation - we've needed to pay their ransom to bring them back. \ - As is policy we've taken a portion of the station's funds to offset the overall cost.", - sender_override = "Nanotrasen Asset Protection") + var/datum/market_item/hostage/market_item = person_sent.process_capture(ransom * (rand(11, 13)/10)) + RegisterSignal(market_item, COMSIG_MARKET_ITEM_SPAWNED, PROC_REF(on_victim_shipped)) addtimer(CALLBACK(src, PROC_REF(finish_enter)), 3 SECONDS) @@ -166,10 +156,10 @@ * level - The current stage of harassement they are facing. This increases by itself, looping until finished. */ /datum/syndicate_contract/proc/handle_victim_experience(mob/living/victim, level = VICTIM_EXPERIENCE_START) - // Ship 'em back - dead or alive, 4 minutes wait. + // Ship 'em back - dead or alive // Even if they weren't the target, we're still treating them the same. if(!level) - addtimer(CALLBACK(src, PROC_REF(return_victim), victim), (60 * 10) * 4) + victim_timerid = addtimer(CALLBACK(src, PROC_REF(return_victim), victim), COME_BACK_FROM_CAPTURE_TIME, TIMER_STOPPABLE) if(victim.stat == DEAD) return @@ -209,7 +199,7 @@ level++ //move onto the next level. if(time_until_next) - addtimer(CALLBACK(src, PROC_REF(handle_victim_experience), victim, level), time_until_next) + victim_timerid = addtimer(CALLBACK(src, PROC_REF(handle_victim_experience), victim, level), time_until_next, TIMER_STOPPABLE) #undef VICTIM_EXPERIENCE_START #undef VICTIM_EXPERIENCE_FIRST_HIT @@ -217,34 +207,30 @@ #undef VICTIM_EXPERIENCE_THIRD_HIT #undef VICTIM_EXPERIENCE_LAST_HIT -// We're returning the victim +/// We're returning the victim to the station /datum/syndicate_contract/proc/return_victim(mob/living/victim) var/list/possible_drop_loc = list() - - for(var/turf/possible_drop in contract.dropoff.contents) + for(var/turf/possible_drop in shuffle(contract.dropoff.contents)) if(!isspaceturf(possible_drop) && !isclosedturf(possible_drop)) if(!possible_drop.is_blocked_turf()) possible_drop_loc.Add(possible_drop) - if(!possible_drop_loc.len) - to_chat(victim, span_hypnophrase("A million voices echo in your head... \"Seems where you got sent here from won't \ - be able to handle our pod... if we wanted the occupant to survive. Brace yourself, corporate dog.\"")) - for(var/turf/possible_drop in contract.dropoff.contents) - possible_drop_loc.Add(possible_drop) - if(iscarbon(victim)) - var/mob/living/carbon/carbon_victim = victim - if(carbon_victim.can_heartattack()) - carbon_victim.set_heartattack(TRUE) - - var/pod_rand_loc = rand(1, possible_drop_loc.len) - var/obj/structure/closet/supplypod/return_pod = new() - return_pod.bluespace = TRUE - return_pod.explosionSize = list(0,0,0,0) - return_pod.style = STYLE_SYNDICATE - - do_sparks(8, FALSE, victim) - victim.visible_message(span_notice("[victim] vanishes...")) + var/turf/destination + if(length(possible_drop_loc)) + destination = pick(possible_drop_loc) + var/obj/structure/closet/supplypod/back_to_station/return_pod = new() + return_pod.return_from_capture(victim, destination) + returnal_side_effects(return_pod, victim) + +///Called if the victim is being returned to the station early, when from the black market. +/datum/syndicate_contract/proc/on_victim_shipped(datum/market_item/source, obj/item/market_uplink/uplink, shipping_method, turf/shipping_loc) + SIGNAL_HANDLER + deltimer(victim_timerid) + returnal_side_effects(shipping_loc, source.item) + +///The annoying negative effects applied to the victim when returned to the station. +/datum/syndicate_contract/proc/returnal_side_effects(atom/dropoff_location, mob/living/victim) for(var/datum/weakref/belonging_ref in victim_belongings) var/obj/item/belonging = belonging_ref.resolve() if(!belonging) @@ -256,16 +242,12 @@ continue if(belonging == human_victim.shoes) continue - belonging.forceMove(return_pod) - - for(var/obj/item/W in victim_belongings) - W.forceMove(return_pod) + belonging.forceMove(dropoff_location) - victim.forceMove(return_pod) + for(var/obj/item/item in victim_belongings) + item.forceMove(dropoff_location) victim.flash_act() victim.adjust_eye_blur(3 SECONDS) victim.adjust_dizzy(3.5 SECONDS) victim.adjust_confusion(2 SECONDS) - - new /obj/effect/pod_landingzone(possible_drop_loc[pod_rand_loc], return_pod) diff --git a/code/modules/antagonists/traitor/objectives/kidnapping.dm b/code/modules/antagonists/traitor/objectives/kidnapping.dm index 73a3fc3b3f041..d6aec912fdbac 100644 --- a/code/modules/antagonists/traitor/objectives/kidnapping.dm +++ b/code/modules/antagonists/traitor/objectives/kidnapping.dm @@ -15,6 +15,8 @@ var/alive_bonus = 0 /// All stripped targets belongings (weakrefs) var/list/target_belongings = list() + /// The ID of the stoppable timer for returning the captured crew + var/list/victim_timerid duplicate_type = /datum/traitor_objective/target_player @@ -216,6 +218,7 @@ new /obj/effect/pod_landingzone(get_turf(user), new_pod) /datum/traitor_objective/target_player/kidnapping/proc/enter_check(obj/structure/closet/supplypod/extractionpod/source, entered_atom) + SIGNAL_HANDLER if(!istype(source)) CRASH("Kidnapping objective's enter_check called with source being not an extraction pod: [source ? source.type : "N/A"]") @@ -224,9 +227,6 @@ var/mob/living/carbon/human/sent_mob = entered_atom - if(sent_mob.mind) - ADD_TRAIT(sent_mob.mind, TRAIT_HAS_BEEN_KIDNAPPED, TRAIT_GENERIC) - for(var/obj/item/belonging in sent_mob.gather_belongings()) if(belonging == sent_mob.get_item_by_slot(ITEM_SLOT_ICLOTHING) || belonging == sent_mob.get_item_by_slot(ITEM_SLOT_FEET)) continue @@ -236,12 +236,8 @@ continue target_belongings.Add(WEAKREF(belonging)) - var/datum/bank_account/cargo_account = SSeconomy.get_dep_account(ACCOUNT_CAR) - - if(cargo_account) //Just in case - cargo_account.adjust_money(-min(rand(1000, 3000), cargo_account.account_balance)) //Not so much, especially for competent cargo. Plus this can't be mass-triggered like it has been done with contractors - - priority_announce("One of your crew was captured by a rival organisation - we've needed to pay their ransom to bring them back. As is policy we've taken a portion of the station's funds to offset the overall cost.", "Nanotrasen Asset Protection", has_important_message = TRUE) + var/datum/market_item/hostage/market_item = sent_mob.process_capture(rand(1000, 3000)) + RegisterSignal(market_item, COMSIG_MARKET_ITEM_SPAWNED, PROC_REF(on_victim_shipped)) addtimer(CALLBACK(src, PROC_REF(handle_target), sent_mob), 1.5 SECONDS) @@ -257,7 +253,7 @@ source.startExitSequence(source) /datum/traitor_objective/target_player/kidnapping/proc/handle_target(mob/living/carbon/human/sent_mob) - addtimer(CALLBACK(src, PROC_REF(return_target), sent_mob), 3 MINUTES) + victim_timerid = addtimer(CALLBACK(src, PROC_REF(return_target), sent_mob), COME_BACK_FROM_CAPTURE_TIME, TIMER_STOPPABLE) if(sent_mob.stat == DEAD) return @@ -266,29 +262,24 @@ sent_mob.adjust_dizzy(10 SECONDS) sent_mob.set_eye_blur_if_lower(100 SECONDS) sent_mob.dna.species.give_important_for_life(sent_mob) // so plasmamen do not get left for dead - to_chat(sent_mob, span_hypnophrase(span_reallybig("A million voices echo in your head... \"Your mind held many valuable secrets - \ + to_chat(sent_mob, span_hypnophrase("A million voices echo in your head... \"Your mind held many valuable secrets - \ we thank you for providing them. Your value is expended, and you will be ransomed back to your station. We always get paid, \ - so it's only a matter of time before we ship you back...\""))) + so it's only a matter of time before we ship you back...\"")) /datum/traitor_objective/target_player/kidnapping/proc/return_target(mob/living/carbon/human/sent_mob) if(!sent_mob || QDELETED(sent_mob)) //suicided and qdeleted themselves return - var/turf/return_turf = get_safe_random_station_turf() - if(!return_turf) //SOMEHOW - to_chat(sent_mob, span_hypnophrase(span_reallybig("A million voices echo in your head... \"Seems where you got sent here from won't \ - be able to handle our pod... You will die here instead.\""))) - if (sent_mob.can_heartattack()) - sent_mob.set_heartattack(TRUE) - return + var/obj/structure/closet/supplypod/back_to_station/return_pod = new() + return_pod.return_from_capture(sent_mob) + returnal_side_effects(return_pod, sent_mob) - var/obj/structure/closet/supplypod/return_pod = new() - return_pod.bluespace = TRUE - return_pod.explosionSize = list(0,0,0,0) - return_pod.style = STYLE_SYNDICATE +/datum/traitor_objective/target_player/kidnapping/proc/on_victim_shipped(datum/market_item/source, obj/item/market_uplink/uplink, shipping_method, turf/shipping_loc) + SIGNAL_HANDLER + deltimer(victim_timerid) + returnal_side_effects(shipping_loc, source.item) - do_sparks(8, FALSE, sent_mob) - sent_mob.visible_message(span_notice("[sent_mob] vanishes!")) +/datum/traitor_objective/target_player/kidnapping/proc/returnal_side_effects(atom/dropoff_location, mob/living/carbon/human/sent_mob) for(var/obj/item/belonging in sent_mob.gather_belongings()) if(belonging == sent_mob.get_item_by_slot(ITEM_SLOT_ICLOTHING) || belonging == sent_mob.get_item_by_slot(ITEM_SLOT_FEET)) continue @@ -298,13 +289,10 @@ var/obj/item/belonging = belonging_ref.resolve() if(!belonging) continue - belonging.forceMove(return_pod) + belonging.forceMove(dropoff_location) - sent_mob.forceMove(return_pod) sent_mob.flash_act() sent_mob.adjust_confusion(10 SECONDS) sent_mob.adjust_dizzy(10 SECONDS) sent_mob.set_eye_blur_if_lower(100 SECONDS) sent_mob.dna.species.give_important_for_life(sent_mob) // so plasmamen do not get left for dead - - new /obj/effect/pod_landingzone(return_turf, return_pod) diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index fd6e91a858038..224a27062f5dd 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -30,6 +30,14 @@ Then the player gets the profit from selling his own wasted time. ///set to false if any objects in a dry run were unscannable var/all_contents_scannable = TRUE +/// Makes sure the exports list is populated and that the report isn't null. +/proc/init_export(datum/export_report/external_report) + if(!length(GLOB.exports_list)) + setupExports() + if(isnull(external_report)) + external_report = new + return external_report + /* * Handles exporting a movable atom and its contents * Arguments: @@ -40,32 +48,15 @@ Then the player gets the profit from selling his own wasted time. ** ignore_typecache: typecache containing types that should be completely ignored */ /proc/export_item_and_contents(atom/movable/exported_atom, apply_elastic = TRUE, delete_unsold = TRUE, dry_run = FALSE, datum/export_report/external_report, list/ignore_typecache) - if(!GLOB.exports_list.len) - setupExports() + external_report = init_export() var/list/contents = exported_atom.get_all_contents_ignoring(ignore_typecache) - var/datum/export_report/report = external_report - - if(!report) //If we don't have any longer transaction going on - report = new - // We go backwards, so it'll be innermost objects sold first. We also make sure nothing is accidentally delete before everything is sold. var/list/to_delete = list() for(var/atom/movable/thing as anything in reverse_range(contents)) - var/sold = FALSE - for(var/datum/export/export as anything in GLOB.exports_list) - if(export.applies_to(thing, apply_elastic)) - if(!dry_run && (SEND_SIGNAL(thing, COMSIG_ITEM_PRE_EXPORT) & COMPONENT_STOP_EXPORT)) - break - //Don't add value of unscannable items for a dry run report - if(dry_run && !export.scannable) - report.all_contents_scannable = FALSE - break - sold = export.sell_object(thing, report, dry_run, apply_elastic) - report.exported_atoms += " [thing.name]" - break - if(!dry_run && (sold || delete_unsold)) + var/sold = _export_loop(thing, apply_elastic, dry_run, external_report) + if(!dry_run && (sold || delete_unsold) && sold != EXPORT_SOLD_DONT_DELETE) if(ismob(thing)) thing.investigate_log("deleted through cargo export", INVESTIGATE_CARGO) to_delete += thing @@ -74,7 +65,35 @@ Then the player gets the profit from selling his own wasted time. if(!QDELETED(thing)) qdel(thing) - return report + return external_report + +/// It works like export_item_and_contents(), however it ignores the contents. Meaning only `exported_atom` will be valued. +/proc/export_single_item(atom/movable/exported_atom, apply_elastic = TRUE, delete_unsold = TRUE, dry_run = FALSE, datum/export_report/external_report) + external_report = init_export() + + var/sold = _export_loop(exported_atom, apply_elastic, dry_run, external_report) + if(!dry_run && (sold || delete_unsold) && sold != EXPORT_SOLD_DONT_DELETE) + if(ismob(exported_atom)) + exported_atom.investigate_log("deleted through cargo export", INVESTIGATE_CARGO) + qdel(exported_atom) + + return external_report + +/// The main bit responsible for selling the item. Shared by export_single_item() and export_item_and_contents() +/proc/_export_loop(atom/movable/exported_atom, apply_elastic = TRUE, dry_run = FALSE, datum/export_report/external_report) + var/sold = EXPORT_NOT_SOLD + for(var/datum/export/export as anything in GLOB.exports_list) + if(export.applies_to(exported_atom, apply_elastic)) + if(!dry_run && (SEND_SIGNAL(exported_atom, COMSIG_ITEM_PRE_EXPORT) & COMPONENT_STOP_EXPORT)) + break + //Don't add value of unscannable items for a dry run report + if(dry_run && !export.scannable) + external_report.all_contents_scannable = FALSE + break + sold = export.sell_object(exported_atom, exported_atom, dry_run, apply_elastic) + external_report.exported_atoms += " [exported_atom.name]" + break + return sold /datum/export /// Unit name. Only used in "Received [total_amount] [name]s [message]." @@ -164,7 +183,7 @@ Then the player gets the profit from selling his own wasted time. var/export_amount = get_amount(sold_item) if(export_amount <= 0 || (export_value <= 0 && !allow_negative_cost)) - return FALSE + return EXPORT_NOT_SOLD // If we're not doing a dry run, send COMSIG_ITEM_EXPORTED to the sold item var/export_result @@ -180,7 +199,7 @@ Then the player gets the profit from selling his own wasted time. if(apply_elastic) cost *= NUM_E**(-1 * k_elasticity * export_amount) //marginal cost modifier SSblackbox.record_feedback("nested tally", "export_sold_cost", 1, list("[sold_item.type]", "[export_value]")) - return TRUE + return EXPORT_SOLD /* * Total printout for the cargo console. diff --git a/code/modules/cargo/markets/_market.dm b/code/modules/cargo/markets/_market.dm index a4af2bc981d94..78585ed842f2e 100644 --- a/code/modules/cargo/markets/_market.dm +++ b/code/modules/cargo/markets/_market.dm @@ -20,39 +20,53 @@ categories += item.category available_items[item.category] = list() - available_items[item.category] += item + available_items[item.category][item.identifier] = item + RegisterSignal(item, COMSIG_QDELETING, PROC_REF(on_item_del)) return TRUE +/datum/market/proc/on_item_del(datum/market_item/item) + SIGNAL_HANDLER + available_items[item.category] -= item.identifier + 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. -/datum/market/proc/purchase(item, category, method, obj/item/market_uplink/uplink, user) - if(!istype(uplink) || !(method in shipping)) +/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)) + return FALSE + + if(!istype(uplink) || !((method in shipping) || (method in item.shipping_override))) + return FALSE + + var/shipment_fee = item.shipping_override?[method] + if(isnull(shipment_fee)) + shipment_fee = shipping[method] + var/price = item.price + shipment_fee + + if(!uplink.current_user)///There is no ID card on the user, or the ID card has no account + to_chat(user, span_warning("The uplink sparks, as it can't identify an ID card with a bank account on you.")) return FALSE + var/balance = uplink?.current_user.account_balance - for(var/datum/market_item/I in available_items[category]) - if(I.type != item) - continue - var/price = I.price + shipping[method] - - if(!uplink.current_user)///There is no ID card on the user, or the ID card has no account - to_chat(user, span_warning("The uplink sparks, as it can't identify an ID card with a bank account on you.")) - return FALSE - var/balance = uplink?.current_user.account_balance - - // I can't get the price of the item and shipping in a clean way to the UI, so I have to do this. - if(balance < price) - to_chat(user, span_warning("You don't have enough credits in [uplink] for [I] with [method] shipping.")) - return FALSE - - if(I.buy(uplink, user, method)) - uplink.current_user.adjust_money(-price, "Other: Third Party Transaction") - if(ismob(user)) - var/mob/m_user = user - m_user.playsound_local(get_turf(m_user), 'sound/machines/twobeep_high.ogg', 50, TRUE) - return TRUE + // I can't get the price of the item and shipping in a clean way to the UI, so I have to do this. + if(balance < price) + 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)) + uplink.current_user.adjust_money(-price, "Other: Third Party Transaction") + if(ismob(user)) + var/mob/m_user = user + m_user.playsound_local(get_turf(m_user), 'sound/machines/twobeep_high.ogg', 50, TRUE) + return TRUE + + return FALSE + /datum/market/blackmarket name = "Black Market" - shipping = list(SHIPPING_METHOD_LTSRBT =50, - SHIPPING_METHOD_LAUNCH =10, - SHIPPING_METHOD_TELEPORT=75) + shipping = list( + SHIPPING_METHOD_LTSRBT = 40, + SHIPPING_METHOD_LAUNCH = 10, + SHIPPING_METHOD_TELEPORT= 75, + ) diff --git a/code/modules/cargo/markets/market_item.dm b/code/modules/cargo/markets/market_item.dm index d5689c17a45e6..01eb37c077ba2 100644 --- a/code/modules/cargo/markets/market_item.dm +++ b/code/modules/cargo/markets/market_item.dm @@ -14,7 +14,7 @@ var/stock /// Path to or the item itself what this entry is for, this should be set even if you override spawn_item to spawn your item. - var/obj/item/item + var/atom/movable/item /// Minimum price for the item if generated randomly. var/price_min = 0 @@ -27,27 +27,60 @@ /// Probability for this item to be available. Used by SSblackmarket on init. var/availability_prob = 0 + ///The identifier for the market item, generated on runtime and used to access them in the market categories. + var/identifier + + ///If set, these will override the shipment methods set by the market + var/list/shipping_override + /datum/market_item/New() if(isnull(price)) price = rand(price_min, price_max) if(isnull(stock)) stock = rand(stock_min, stock_max) + identifier = "[type]" + +///For 'dynamic' market items generated on runtime, this proc is to be used to properly sets the item, especially if it's a hardref. +/datum/market_item/proc/set_item(path_or_ref) + //we're replacing the item to sell, and the old item is an instance! + if(ismovable(item)) + UnregisterSignal(item, COMSIG_QDELETING) + item = path_or_ref + identifier = "[path_or_ref]" + if(ismovable(path_or_ref)) + RegisterSignal(item, COMSIG_QDELETING, PROC_REF(on_item_del)) + identifier = "[REF(src)]" /datum/market_item/Destroy() item = null return ..() +/datum/market_item/proc/on_item_del(datum/source) + SIGNAL_HANDLER + qdel(src) + /// Used for spawning the wanted item, override if you need to do something special with the item. -/datum/market_item/proc/spawn_item(loc) +/datum/market_item/proc/spawn_item(loc, datum/market_purchase/purchase) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_MARKET_ITEM_SPAWNED, purchase.uplink, purchase.method, loc) if(ismovable(item)) - item.forceMove(loc) - return item + var/atom/movable/return_item = item + UnregisterSignal(item, COMSIG_QDELETING) + if(isnull(loc)) + item.moveToNullspace() + else + do_sparks(8, FALSE, item) + item.visible_message(span_notice("[item] vanishes...")) + item.forceMove(loc) + item = null + return return_item if(ispath(item)) 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) + SHOULD_CALL_PARENT(TRUE) // Sanity if(!istype(uplink) || !istype(buyer)) return FALSE @@ -70,16 +103,34 @@ /datum/market_purchase /// The entry being purchased. var/datum/market_item/entry - /// Instance of the item being sent. - var/item + /// Instance of the item being sent, used by the market telepad + var/atom/movable/item /// The uplink where this purchase was done from. var/obj/item/market_uplink/uplink /// Shipping method used to buy this item. var/method -/datum/market_purchase/New(_entry, _uplink, _method) - entry = _entry - if(!ispath(entry.item)) +/datum/market_purchase/New(datum/market_item/entry, obj/item/market_uplink/uplink, method) + 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 + RegisterSignal(entry, COMSIG_QDELETING, PROC_REF(on_instance_del)) + RegisterSignal(uplink, COMSIG_QDELETING, PROC_REF(on_instance_del)) + if(ismovable(entry.item)) item = entry.item - uplink = _uplink - method = _method + RegisterSignal(entry.item, COMSIG_QDELETING, PROC_REF(on_instance_del)) + +/datum/market_purchase/Destroy() + entry = null + uplink = null + SSblackmarket.queued_purchases -= src + return ..() + +/datum/market_purchase/proc/on_instance_del(datum/source) + SIGNAL_HANDLER + if(QDELETED(src)) + return + // Uh oh, uplink or item is gone. We will just keep the money and you will not get your order. + qdel(src) diff --git a/code/modules/cargo/markets/market_items/consumables.dm b/code/modules/cargo/markets/market_items/consumables.dm index 153241e5d3db6..5550d31c5f865 100644 --- a/code/modules/cargo/markets/market_items/consumables.dm +++ b/code/modules/cargo/markets/market_items/consumables.dm @@ -39,7 +39,8 @@ /obj/item/storage/pill_bottle/lsd, /obj/item/storage/pill_bottle/aranesp, /obj/item/storage/pill_bottle/stimulant)) - return new pillbottle(loc) + item = pillbottle + return ..() /datum/market_item/consumable/floor_pill name = "Strange Pill" diff --git a/code/modules/cargo/markets/market_items/hostages.dm b/code/modules/cargo/markets/market_items/hostages.dm new file mode 100644 index 0000000000000..6551ee6156b46 --- /dev/null +++ b/code/modules/cargo/markets/market_items/hostages.dm @@ -0,0 +1,84 @@ +///A special category for mobs captured by pirates, tots and contractors, should someone ever want to get them back in advance. +/datum/market_item/hostage + category = "Hostages" + stock = 1 + availability_prob = 100 + shipping_override = list(SHIPPING_METHOD_LTSRBT = 0, SHIPPING_METHOD_SUPPLYPOD = 350) + /// temporary reference to the 4 in 7 chances of signaler and electropack. + var/obj/item/assembly/signaler/signaler + +/datum/market_item/hostage/New(mob/living/mob, new_price) + ..() + set_item(mob) + name = "[mob.real_name]" + var/specimen = initial(mob.name) + var/humie_mob = ishuman(mob) + if(humie_mob) + var/mob/living/carbon/human/humie = mob + specimen = humie.dna.species.name + desc = pick(list( + "If you're looking for a recently stolen [specimen], you've come to the right place.", + "we've recently aquired a fine [specimen] from a station around here, eheh...", + "For a limited time, we're offering this [specimen] for you to buy (back).", + )) + desc += " DISCLAIMER: The offer will expire once the creature is returned to the station." + if(humie_mob) + desc += "[mob.p_they(TRUE)] may be delivered handcuffed, for safety of course." + + price = new_price + RegisterSignal(mob, COMSIG_LIVING_RETURN_FROM_CAPTURE, PROC_REF(on_return_from_capture)) + +/datum/market_item/hostage/proc/on_return_from_capture(mob/living/source, turf/destination) + SIGNAL_HANDLER + qdel(src) //as if we never existed, our mentions we'll be removed from the market. + +/datum/market_item/hostage/Destroy() + signaler = null + return ..() + +/datum/market_item/hostage/buy(obj/item/market_uplink/uplink, mob/buyer, shipping_method) + . = ..() + var/mob/living/humie = item + if(!. || !istype(humie) || !prob(57)) // 3 in 7 chance of the electropack set not spawning... + return + signaler = new(uplink.drop_location()) + RegisterSignal(signaler, COMSIG_QDELETING, PROC_REF(clear_signaler_ref)) + signaler.set_frequency(sanitize_frequency(rand(MIN_FREE_FREQ, MAX_FREE_FREQ))) + signaler.code = rand(1, 100) + buyer.put_in_hands(signaler) + to_chat(buyer, span_notice("A [signaler] appears [buyer.is_holding(signaler) ? "in your hands" : "at your feet"]!")) + +/datum/market_item/hostage/proc/clear_signaler_ref(datum/source) + SIGNAL_HANDLER + signaler = null + +/datum/market_item/hostage/spawn_item(loc, datum/market_purchase/purchase) + var/mob/living/mob = item + UnregisterSignal(mob, COMSIG_LIVING_RETURN_FROM_CAPTURE) + if(!mob.IsUnconscious()) + to_chat(mob, span_boldnicegreen("You have been bought back to the station. Be grateful to whoever got you out of the holding facility early.")) + if(!ishuman(item)) + return ..() + var/mob/living/carbon/human/humie = item + if(signaler) //57% chance that the mob is equipped with electropack and cuffs + humie.equip_to_slot_or_del(new /obj/item/restraints/handcuffs, ITEM_SLOT_HANDCUFFED, indirect_action = TRUE) + if(humie.back) //try to remove the neck item if possible before we attempt to install the collar bomb + humie.transferItemToLoc(humie.back, loc) + var/obj/item/electropack/pack = new(loc) + pack.set_frequency(signaler.frequency) + pack.code = signaler.code + humie.equip_to_slot_if_possible(pack, ITEM_SLOT_BACK, disable_warning = TRUE) + UnregisterSignal(signaler, COMSIG_QDELETING) + signaler = null + else if(prob(66)) // 29% chance of just cuffs + humie.equip_to_slot_or_del(new /obj/item/restraints/handcuffs, ITEM_SLOT_HANDCUFFED, indirect_action = TRUE) + else // 14% chance of just a tee souvenir and pin, no cuffs and shit. + var/obj/item/clothing/under/misc/syndicate_souvenir/souvenir = new(loc) + humie.equip_to_slot_if_possible(souvenir, ITEM_SLOT_ICLOTHING, indirect_action = TRUE) + var/obj/item/clothing/accessory/anti_sec_pin/pin = new(loc) + pin.attach(souvenir) + + if(isnull(humie.w_uniform)) + //FUCKING SLAVES, GET YOUR CLOTHES BACK ON! + humie.equip_to_slot_or_del(new /obj/item/clothing/under/costume/jabroni(humie), ITEM_SLOT_ICLOTHING, indirect_action = TRUE) + return ..() diff --git a/code/modules/cargo/markets/market_items/misc.dm b/code/modules/cargo/markets/market_items/misc.dm index 0953a73e0acc5..de0fcaa9256a4 100644 --- a/code/modules/cargo/markets/market_items/misc.dm +++ b/code/modules/cargo/markets/market_items/misc.dm @@ -68,9 +68,11 @@ stock_max = 3 availability_prob = 40 -/datum/market_item/misc/holywater/spawn_item(loc) +/datum/market_item/misc/holywater/spawn_item(loc, datum/market_purchase/purchase) if (prob(6.66)) - return new /obj/item/reagent_containers/cup/beaker/unholywater(loc) + item = /obj/item/reagent_containers/cup/beaker/unholywater + else + item = initial(item) return ..() /datum/market_item/misc/strange_seed diff --git a/code/modules/cargo/markets/market_items/stolen_goods.dm b/code/modules/cargo/markets/market_items/stolen_goods.dm new file mode 100644 index 0000000000000..c9c17f1d2b6c8 --- /dev/null +++ b/code/modules/cargo/markets/market_items/stolen_goods.dm @@ -0,0 +1,12 @@ +///A special category for goods stolen by spies for their bounties. +/datum/market_item/stolen_good + category = "Fenced Goods" + stock = 1 + availability_prob = 100 + +/datum/market_item/stolen_good/New(atom/movable/thing, thing_price) + ..() + set_item(thing) + name = "Stolen [thing.name]" + desc = "A [thing.name], stolen from somewhere on the station. Whoever owned it probably wouldn't be happy to see it here." + price = thing_price diff --git a/code/modules/cargo/markets/market_items/tools.dm b/code/modules/cargo/markets/market_items/tools.dm index c20834e640b16..5d036fae0ef5b 100644 --- a/code/modules/cargo/markets/market_items/tools.dm +++ b/code/modules/cargo/markets/market_items/tools.dm @@ -1,6 +1,18 @@ /datum/market_item/tool category = "Tools" +/datum/market_item/tool/blackmarket_telepad + name = "Black Market LTSRBT" + desc = "Need a faster and better way of transporting your illegal goods from and to the \ + station? Fear not, the Long-To-Short-Range-Bluespace-Transceiver is here to help. \ + Contains a LTSRBT circuit. Bluespace crystals and ansible not included." + item = /obj/item/circuitboard/machine/ltsrbt + stock_min = 2 + stock_max = 4 + price_min = CARGO_CRATE_VALUE * 2.5 + price_max = CARGO_CRATE_VALUE * 3.75 + availability_prob = 100 + /datum/market_item/tool/caravan_wrench name = "Experimental Wrench" desc = "The extra fast and handy wrench you always wanted!" diff --git a/code/modules/cargo/markets/market_telepad.dm b/code/modules/cargo/markets/market_telepad.dm index e99e4b88d223e..7a3365d7a0faf 100644 --- a/code/modules/cargo/markets/market_telepad.dm +++ b/code/modules/cargo/markets/market_telepad.dm @@ -26,13 +26,13 @@ /// The time it takes for the machine to recharge before being able to send or receive items. var/recharge_time = 0 /// Current recharge progress. - var/recharge_cooldown = 0 + COOLDOWN_DECLARE(recharge_cooldown) /// Base recharge time in seconds which is used to get recharge_time. var/base_recharge_time = 100 /// Current /datum/market_purchase being received. - var/receiving + var/datum/market_purchase/receiving /// Current /datum/market_purchase being sent to the target uplink. - var/transmitting + var/datum/market_purchase/transmitting /// Queue for purchases that the machine should receive and send. var/list/datum/market_purchase/queue = list() @@ -67,46 +67,48 @@ /obj/machinery/ltsrbt/proc/add_to_queue(datum/market_purchase/purchase) if(!recharge_cooldown && !receiving && !transmitting) receiving = purchase - return - queue += purchase + else + queue += purchase + RegisterSignal(receiving, COMSIG_QDELETING, PROC_REF(on_receiving_del)) + +/obj/machinery/ltsrbt/proc/on_receiving_del(datum/market_purchase/purchase) + SIGNAL_HANDLER + queue -= purchase + if(receiving == purchase) + receiving = null + if(transmitting == purchase) + transmitting = null /obj/machinery/ltsrbt/process(seconds_per_tick) if(machine_stat & NOPOWER) return - if(recharge_cooldown > 0) - recharge_cooldown -= seconds_per_tick + if(!COOLDOWN_FINISHED(src, recharge_cooldown) && isnull(receiving) && isnull(transmitting)) return - var/turf/T = get_turf(src) + COOLDOWN_START(src, recharge_cooldown, recharge_time) + + var/turf/turf = get_turf(src) if(receiving) - var/datum/market_purchase/P = receiving - P.item = P.entry.spawn_item(T) + receiving.item = receiving.entry.spawn_item(turf, receiving) use_power(power_usage_per_teleport / power_efficiency) var/datum/effect_system/spark_spread/sparks = new sparks.set_up(5, 1, get_turf(src)) - sparks.attach(P.item) + sparks.attach(receiving.item) sparks.start() + transmitting = receiving receiving = null - transmitting = P recharge_cooldown = recharge_time return - else if(transmitting) - var/datum/market_purchase/P = transmitting - if(!P.item) - QDEL_NULL(transmitting) - if(!(P.item in T.contents)) - QDEL_NULL(transmitting) - return - do_teleport(P.item, get_turf(P.uplink)) - use_power(power_usage_per_teleport / power_efficiency) + if(transmitting) + if(transmitting.item.loc == turf) + do_teleport(transmitting.item, get_turf(transmitting.uplink)) + use_power(power_usage_per_teleport / power_efficiency) QDEL_NULL(transmitting) - - recharge_cooldown = recharge_time return if(queue.len) diff --git a/code/modules/cargo/markets/market_uplink.dm b/code/modules/cargo/markets/market_uplink.dm index a82218082e90d..da86161e46ab2 100644 --- a/code/modules/cargo/markets/market_uplink.dm +++ b/code/modules/cargo/markets/market_uplink.dm @@ -9,7 +9,7 @@ var/viewing_category /// What market is currently being bought from by the uplink? var/viewing_market - /// What item is the current uplink attempting to buy? + /// the identifier of the item that the current uplink is attempting to buy var/selected_item /// Is the uplink in the process of buying the selected item? var/buying @@ -56,25 +56,31 @@ current_user = null data["categories"] = market ? market.categories : null data["delivery_methods"] = list() - if(market) - for(var/delivery in market.shipping) - data["delivery_methods"] += list(list("name" = delivery, "price" = market.shipping[delivery])) data["money"] = "N/A cr" if(current_user) data["money"] = current_user.account_balance data["buying"] = buying + if(buying && market) + var/datum/market_item/target_item = market.available_items[viewing_category][selected_item] + var/list/shipping_list = market.shipping + if(length(target_item?.shipping_override)) + shipping_list = target_item.shipping_override + for(var/delivery in shipping_list) + UNTYPED_LIST_ADD(data["delivery_methods"], list("name" = delivery, "price" = shipping_list[delivery])) data["items"] = list() - data["viewing_category"] = viewing_category + data["viewing_category"] = market.categories[viewing_category] ? viewing_category : null data["viewing_market"] = viewing_market if(viewing_category && market) if(market.available_items[viewing_category]) - for(var/datum/market_item/I in market.available_items[viewing_category]) + var/list/market_category = market.available_items[viewing_category] + for(var/id in market_category) + var/datum/market_item/item = market_category[id] data["items"] += list(list( - "id" = I.type, - "name" = I.name, - "cost" = I.price, - "amount" = I.stock, - "desc" = I.desc || I.name + "id" = id, + "name" = item.name, + "cost" = item.price, + "amount" = item.stock, + "desc" = item.desc || item.name )) return data @@ -123,8 +129,7 @@ if("select") if(isnull(params["item"])) return - var/item = text2path(params["item"]) - selected_item = item + selected_item = params["item"] buying = TRUE . = TRUE if("cancel") diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm index 781205eb03bf8..94849d61ef527 100644 --- a/code/modules/cargo/packs/imports.dm +++ b/code/modules/cargo/packs/imports.dm @@ -118,19 +118,6 @@ if(prob(10)) //A little extra sugar every now and then to shake things up. new /obj/item/switchblade(our_crate) -/datum/supply_pack/imports/blackmarket_telepad - name = "Black Market LTSRBT" - desc = "Need a faster and better way of transporting your illegal goods from and to the \ - station? Fear not, the Long-To-Short-Range-Bluespace-Transceiver (LTSRBT for short) \ - is here to help. Contains a LTSRBT circuit, two bluespace crystals, and one ansible." - cost = CARGO_CRATE_VALUE * 20 - contraband = TRUE - contains = list( - /obj/item/circuitboard/machine/ltsrbt, - /obj/item/stack/ore/bluespace_crystal/artificial = 2, - /obj/item/stock_parts/subspace/ansible, - ) - /datum/supply_pack/imports/contraband name = "'Contraband' Crate" desc = "Psst.. bud... want some contraband? I can get you a poster, some nice cigs, dank, even some \ diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 6b0517d07b272..8f814412fb305 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -90,6 +90,14 @@ delays = list(POD_TRANSIT = 20, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF +/obj/structure/closet/supplypod/back_to_station + name = "blood-red supply pod" + desc = "An intimidating supply pod, covered in the blood-red markings" + bluespace = TRUE + explosionSize = list(0,0,0,0) + style = STYLE_SYNDICATE + specialised = TRUE + /datum/armor/closet_supplypod melee = 30 bullet = 50 @@ -213,6 +221,24 @@ /obj/structure/closet/supplypod/open(mob/living/user, force = FALSE, special_effects = TRUE) return +///Called by the drop pods that return captured crewmembers from the ninja den. +/obj/structure/closet/supplypod/proc/return_from_capture(mob/living/victim, turf/destination = get_safe_random_station_turf()) + if(isnull(destination)) //Uuuuh, something went wrong. This is gonna hurt. + to_chat(victim, span_hypnophrase("A million voices echo in your head... \"Seems where you got sent won't \ + be able to handle our pod... as if we wanted the occupant to survive. Brace yourself, corporate dog.\"")) + flags_1 &= ~PREVENT_CONTENTS_EXPLOSION_1 + explosionSize = list(0,1,1,1) + destination = get_random_station_turf() + + do_sparks(8, FALSE, victim) + victim.visible_message(span_notice("[victim] vanishes...")) + + victim.forceMove(src) + + new /obj/effect/pod_landingzone(destination, src) + + SEND_SIGNAL(victim, COMSIG_LIVING_RETURN_FROM_CAPTURE, destination) + /obj/structure/closet/supplypod/proc/handleReturnAfterDeparting(atom/movable/holder = src) reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open_pod() ) bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index 24d973e773d64..0a0348e7408a9 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -216,8 +216,8 @@ GLOBAL_LIST_INIT(pride_pin_reskins, list( /obj/item/clothing/accessory/anti_sec_pin/attach(obj/item/clothing/under/attach_to, mob/living/attacher) . = ..() - if (!.) - return FALSE + if (!. || isnull(attacher)) + return var/target = ishuman(attach_to.loc) ? attach_to.loc : attach_to log_combat(attacher, target, "pinned an 'arrest me immediately' pin onto", src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 73db5d419a440..57d06a6d92d94 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -2538,6 +2538,26 @@ GLOBAL_LIST_EMPTY(fire_appearances) SEND_SIGNAL(src, COMSIG_LIVING_UNFRIENDED, old_friend) return TRUE +/** + * Common proc used to deduct money from cargo, announce the kidnapping and add src to the black market. + * Returns the black market item, for extra stuff like signals that need to be registered. + */ +/mob/living/proc/process_capture(ransom_price, black_market_price) + if(ransom_price > 0) + var/datum/bank_account/cargo_account = SSeconomy.get_dep_account(ACCOUNT_CAR) + + if(cargo_account) //Just in case + cargo_account.adjust_money(-min(ransom_price, cargo_account.account_balance)) //Not so much, especially for competent cargo. Plus this can't be mass-triggered like it has been done with contractors + priority_announce("One of your crew was captured by a rival organisation - we've needed to pay their ransom to bring them back. As is policy we've taken a portion of the station's funds to offset the overall cost.", "Nanotrasen Asset Protection", has_important_message = TRUE) + + ///The price should be high enough that the contractor can't just buy 'em back with their cut alone. + var/datum/market_item/hostage/market_item = new(src, black_market_price || ransom_price) + SSblackmarket.markets[/datum/market/blackmarket].add_item(market_item) + + if(mind) + ADD_TRAIT(mind, TRAIT_HAS_BEEN_KIDNAPPED, TRAIT_GENERIC) + return market_item + /// Admin only proc for making the mob hallucinate a certain thing /mob/living/proc/admin_give_hallucination(mob/admin) if(!admin || !check_rights(NONE)) diff --git a/tgstation.dme b/tgstation.dme index 142cfb5600209..56f3dcf6a27ac 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -294,6 +294,7 @@ #include "code\__DEFINES\dcs\signals\signals_backpack.dm" #include "code\__DEFINES\dcs\signals\signals_beam.dm" #include "code\__DEFINES\dcs\signals\signals_bitrunning.dm" +#include "code\__DEFINES\dcs\signals\signals_blackmarket.dm" #include "code\__DEFINES\dcs\signals\signals_blob.dm" #include "code\__DEFINES\dcs\signals\signals_bot.dm" #include "code\__DEFINES\dcs\signals\signals_camera.dm" @@ -3560,7 +3561,9 @@ #include "code\modules\cargo\markets\market_uplink.dm" #include "code\modules\cargo\markets\market_items\clothing.dm" #include "code\modules\cargo\markets\market_items\consumables.dm" +#include "code\modules\cargo\markets\market_items\hostages.dm" #include "code\modules\cargo\markets\market_items\misc.dm" +#include "code\modules\cargo\markets\market_items\stolen_goods.dm" #include "code\modules\cargo\markets\market_items\tools.dm" #include "code\modules\cargo\markets\market_items\weapons.dm" #include "code\modules\cargo\packs\_packs.dm" From 782a364c4faedda191c967cd14c3e3b472e5dfcf Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 08:22:29 +1300 Subject: [PATCH 37/75] Automatic changelog for PR #81818 [ci skip] --- html/changelogs/AutoChangeLog-pr-81818.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81818.yml diff --git a/html/changelogs/AutoChangeLog-pr-81818.yml b/html/changelogs/AutoChangeLog-pr-81818.yml new file mode 100644 index 0000000000000..d75b68a1f847c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81818.yml @@ -0,0 +1,8 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed the \"Fenced Goods\" black market category." + - balance: "Removed the LTSRBT from cargo and added it to the blackmarket, reduced the price from 4000 to 625 on average." + - balance: "The time it takes for captured mobs to be automatically sent back to the station from the holding facility has been increased from 3-4 minutes to 6." + - rscadd: "You can buy mobs captured by contractors, traitors and pirates from the black market and have them sent back to the station in advance. For safety, they'll also be handcuffed (not always) upon delivery." + - rscadd: "Human mobs sold by pirates are not deleted anymore. Instead, they're now captured and sent to the holding facility." \ No newline at end of file From d3c19afd9e2ac4e0c2555daaf660250e20f3dfa3 Mon Sep 17 00:00:00 2001 From: san7890 Date: Wed, 13 Mar 2024 13:28:37 -0600 Subject: [PATCH 38/75] Fixes Spontaneous Harddel with Boned Fish Revive Ability (#81959) ## About The Pull Request You can find an example of the failing stack trace here: https://github.com/tgstation/tgstation/actions/runs/8242191499/job/22540786029?pr=81937#step:10:1323 Here's a screenshot: ![image](https://github.com/tgstation/tgstation/assets/34697715/2a7c1c70-c82e-4790-b8e5-e05187a77f1a) Explanation: The boned fish's revive ability added a timer that would randomly fire in the next one-to-two minutes. Due to this inherent randomness, create-and-destroy would locate the fact that we were hanging refs to this fish since the timer may not have processed by the time the fish was deleted (probably if the timer was considerably more than one minute), so in order to fix this let's just add the `TIMER_DELETE_ME` flag to the revive ability so that the timer get's `qdel`'d on the fish's `Destroy()`. simple i probably cocked up some detail of the above explanation but the timer flag was literally created to prevent stuff like this from happening so let's use it ## Changelog don't matter --- code/modules/fishing/fish/fish_traits.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/fishing/fish/fish_traits.dm b/code/modules/fishing/fish/fish_traits.dm index f247d11ef8484..8dee817f3e57f 100644 --- a/code/modules/fishing/fish/fish_traits.dm +++ b/code/modules/fishing/fish/fish_traits.dm @@ -213,9 +213,10 @@ GLOBAL_LIST_INIT(fish_traits, init_subtypes_w_path_keys(/datum/fish_trait, list( /datum/fish_trait/revival/proc/check_status(obj/item/fish/source) SIGNAL_HANDLER if(source.status == FISH_DEAD) - addtimer(CALLBACK(src, PROC_REF(revive), source), rand(1 MINUTES, 2 MINUTES)) + addtimer(CALLBACK(src, PROC_REF(revive), WEAKREF(source)), rand(1 MINUTES, 2 MINUTES)) -/datum/fish_trait/revival/proc/revive(obj/item/fish/source) +/datum/fish_trait/revival/proc/revive(datum/weakref/fish_ref) + var/obj/item/fish/source = fish_ref.resolve() if(QDELETED(source) || source.status != FISH_DEAD) return source.set_status(FISH_ALIVE) From 4fa9f9331cf9df389e4f15cccc36f68bb1126330 Mon Sep 17 00:00:00 2001 From: Derpguy3 <85206687+Derpguy3@users.noreply.github.com> Date: Wed, 13 Mar 2024 13:29:02 -0600 Subject: [PATCH 39/75] Adds a missing recharger to the Birdshot science testing range (#81957) ## About The Pull Request As per the title, adds a recharger to the testing range in science on Birdshot. I noticed that this was missing from the room, and without it there's no way to recharge the nearby practice weaponry. So I added one for the practice weapons and for the consistency with testing ranges in other maps. ## Why It's Good For The Game If you have a firing range with (practice) weaponry and no way to recharge them after firing, it kind of sucks. By adding one, we both fix this problem and the inconsistency with other testing ranges. ## Changelog :cl: fix: A missing recharger has been added into science's testing range on Birdshot station. /:cl: --- _maps/map_files/Birdshot/birdshot.dmm | 1 + 1 file changed, 1 insertion(+) diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 7f2a071eec9bd..49deea1fe47d5 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -5554,6 +5554,7 @@ "ciT" = ( /obj/structure/table/glass, /obj/item/radio/intercom/directional/east, +/obj/machinery/recharger, /turf/open/floor/iron/white, /area/station/science/auxlab/firing_range) "cjm" = ( From c88d937e9a232f582cfb7196cd80257bba12cd8c Mon Sep 17 00:00:00 2001 From: _0Steven <42909981+00-Steven@users.noreply.github.com> Date: Wed, 13 Mar 2024 20:29:34 +0100 Subject: [PATCH 40/75] Fix buttons not letting you take out their electronics (#81967) ## About The Pull Request So as part of its AI-like fuckery changes, #81681 changed `attack_hand` to `interact` in `buttons.dm`. ```dm (code/game/machinery/buttons.dm, line 187, #81681) - /obj/machinery/button/attack_hand(mob/user, list/modifiers) + /obj/machinery/button/interact(mob/user) ``` Now, buttons use this proc both for activating itself, yes, but also for letting people take out the electronics _when the panel is open_. ```dm (code/game/machinery/buttons.dm, line 187-206) /obj/machinery/button/interact(mob/user) (...) if(panel_open) if(device || board) (...) balloon_alert(user, "electronics removed") to_chat(user, span_notice("You remove electronics from the button frame.")) ``` And, well, `interact` gets called from `attack_hand`! So it's fine, right? Well, not entirely. Interact _doesn't_ get called in that whole convoluted chain if the panel is open, unless it has `INTERACT_MACHINE_OPEN` set in its `interaction_flags_machine`. But so, just adding `interaction_flags_machine = parent_type::interaction_flags_machine | INTERACT_MACHINE_OPEN` solves the issue. ## Why It's Good For The Game Fixes #81961. ## Changelog :cl: fix: Buttons let you take out their electronics again, hooray. /:cl: --- code/game/machinery/buttons.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index d9f9bc5280b28..ccb21be468c3f 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -21,6 +21,7 @@ armor_type = /datum/armor/machinery_button idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.02 resistance_flags = LAVA_PROOF | FIRE_PROOF + interaction_flags_machine = parent_type::interaction_flags_machine | INTERACT_MACHINE_OPEN /obj/machinery/button/indestructible resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF From 5372c519c876cee979f2533045b9ad80b9d9249d Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Thu, 14 Mar 2024 01:00:52 +0530 Subject: [PATCH 41/75] Typescript refactor for Number Input (#81913) ## About The Pull Request - Fixes #80971 - Fixes #81379 You now only click once to highlight & edit the value. Converted NumberInput to typescript ## Changelog :cl: fix: NumberInput(used in chem heater, plumbing reaction chamber etc) highlighting & editing requires only single click like before refactor: Typescript conversion for NumberInput TGUI Component /:cl: --------- Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com> --- tgui/packages/tgui/components/NumberInput.jsx | 288 --------------- tgui/packages/tgui/components/NumberInput.tsx | 337 ++++++++++++++++++ tgui/packages/tgui/interfaces/BountyBoard.tsx | 2 +- .../CentcomPodLauncher/PresetsPage.tsx | 1 - tgui/packages/tgui/interfaces/ChemPress.tsx | 6 +- .../tgui/interfaces/ColorMatrixEditor.tsx | 5 +- .../tgui/interfaces/MatrixMathTester.tsx | 14 + .../tgui/interfaces/Mecha/ModulesPane.tsx | 4 +- .../interfaces/ParticleEdit/EntriesBasic.tsx | 19 +- .../ParticleEdit/EntriesGenerators.tsx | 14 +- .../interfaces/ParticleEdit/Generators.tsx | 15 + tgui/packages/tgui/interfaces/Signaler.tsx | 4 +- 12 files changed, 403 insertions(+), 306 deletions(-) delete mode 100644 tgui/packages/tgui/components/NumberInput.jsx create mode 100644 tgui/packages/tgui/components/NumberInput.tsx diff --git a/tgui/packages/tgui/components/NumberInput.jsx b/tgui/packages/tgui/components/NumberInput.jsx deleted file mode 100644 index f5579731c0b9a..0000000000000 --- a/tgui/packages/tgui/components/NumberInput.jsx +++ /dev/null @@ -1,288 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { clamp } from 'common/math'; -import { classes } from 'common/react'; -import { Component, createRef } from 'react'; - -import { AnimatedNumber } from './AnimatedNumber'; -import { Box } from './Box'; - -const DEFAULT_UPDATE_RATE = 400; - -export class NumberInput extends Component { - constructor(props) { - super(props); - const { value } = props; - this.inputRef = createRef(); - this.state = { - value, - dragging: false, - editing: false, - internalValue: null, - origin: null, - suppressingFlicker: false, - }; - - // Suppresses flickering while the value propagates through the backend - this.flickerTimer = null; - this.suppressFlicker = () => { - const { suppressFlicker } = this.props; - if (suppressFlicker > 0) { - this.setState({ - suppressingFlicker: true, - }); - clearTimeout(this.flickerTimer); - this.flickerTimer = setTimeout( - () => - this.setState({ - suppressingFlicker: false, - }), - suppressFlicker, - ); - } - }; - - this.handleDragStart = (e) => { - const { value } = this.props; - const { editing } = this.state; - if (editing) { - return; - } - document.body.style['pointer-events'] = 'none'; - this.ref = e.target; - this.setState({ - dragging: false, - origin: e.screenY, - value, - internalValue: value, - }); - this.timer = setTimeout(() => { - this.setState({ - dragging: true, - }); - }, 250); - this.dragInterval = setInterval(() => { - const { dragging, value } = this.state; - const { onDrag } = this.props; - if (dragging && onDrag) { - onDrag(e, value); - } - }, this.props.updateRate || DEFAULT_UPDATE_RATE); - document.addEventListener('mousemove', this.handleDragMove); - document.addEventListener('mouseup', this.handleDragEnd); - }; - - this.handleDragMove = (e) => { - const { minValue, maxValue, step, stepPixelSize } = this.props; - this.setState((prevState) => { - const state = { ...prevState }; - const offset = state.origin - e.screenY; - if (prevState.dragging) { - const stepOffset = Number.isFinite(minValue) ? minValue % step : 0; - // Translate mouse movement to value - // Give it some headroom (by increasing clamp range by 1 step) - state.internalValue = clamp( - state.internalValue + (offset * step) / stepPixelSize, - minValue - step, - maxValue + step, - ); - // Clamp the final value - state.value = clamp( - state.internalValue - (state.internalValue % step) + stepOffset, - minValue, - maxValue, - ); - state.origin = e.screenY; - } else if (Math.abs(offset) > 4) { - state.dragging = true; - } - return state; - }); - }; - - this.handleDragEnd = (e) => { - const { onChange, onDrag } = this.props; - const { dragging, value, internalValue } = this.state; - document.body.style['pointer-events'] = 'auto'; - clearTimeout(this.timer); - clearInterval(this.dragInterval); - this.setState({ - dragging: false, - editing: !dragging, - origin: null, - }); - document.removeEventListener('mousemove', this.handleDragMove); - document.removeEventListener('mouseup', this.handleDragEnd); - if (dragging) { - this.suppressFlicker(); - if (onChange) { - onChange(e, value); - } - if (onDrag) { - onDrag(e, value); - } - } else if (this.inputRef) { - const input = this.inputRef.current; - input.value = internalValue; - // IE8: Dies when trying to focus a hidden element - // (Error: Object does not support this action) - try { - input.focus(); - input.select(); - } catch {} - } - }; - } - - render() { - const { - dragging, - editing, - value: intermediateValue, - suppressingFlicker, - } = this.state; - const { - className, - fluid, - animated, - value, - unit, - minValue, - maxValue, - height, - width, - lineHeight, - fontSize, - format, - onChange, - onDrag, - } = this.props; - let displayValue = value; - if (dragging || suppressingFlicker) { - displayValue = intermediateValue; - } - - const contentElement = ( -
- {animated && !dragging && !suppressingFlicker ? ( - - ) : format ? ( - format(displayValue) - ) : ( - displayValue - )} - - {unit ? ' ' + unit : ''} -
- ); - - return ( - -
-
-
- {contentElement} - { - if (!editing) { - return; - } - const value = clamp(parseFloat(e.target.value), minValue, maxValue); - if (Number.isNaN(value)) { - this.setState({ - editing: false, - }); - return; - } - this.setState({ - editing: false, - value, - }); - this.suppressFlicker(); - if (onChange) { - onChange(e, value); - } - if (onDrag) { - onDrag(e, value); - } - }} - onKeyDown={(e) => { - if (e.keyCode === 13) { - // prettier-ignore - const value = clamp( - parseFloat(e.target.value), - minValue, - maxValue - ); - if (Number.isNaN(value)) { - this.setState({ - editing: false, - }); - return; - } - this.setState({ - editing: false, - value, - }); - this.suppressFlicker(); - if (onChange) { - onChange(e, value); - } - if (onDrag) { - onDrag(e, value); - } - return; - } - if (e.keyCode === 27) { - this.setState({ - editing: false, - }); - return; - } - }} - /> - - ); - } -} - -NumberInput.defaultProps = { - minValue: -Infinity, - maxValue: +Infinity, - step: 1, - stepPixelSize: 1, - suppressFlicker: 50, -}; diff --git a/tgui/packages/tgui/components/NumberInput.tsx b/tgui/packages/tgui/components/NumberInput.tsx new file mode 100644 index 0000000000000..dbbcfb62dacc8 --- /dev/null +++ b/tgui/packages/tgui/components/NumberInput.tsx @@ -0,0 +1,337 @@ +import { KEY } from 'common/keys'; +import { clamp } from 'common/math'; +import { BooleanLike, classes } from 'common/react'; +import { + Component, + createRef, + FocusEventHandler, + KeyboardEventHandler, + MouseEventHandler, + RefObject, +} from 'react'; + +import { AnimatedNumber } from './AnimatedNumber'; +import { Box } from './Box'; + +const DEFAULT_UPDATE_RATE = 400; + +type Props = Required<{ + value: number | string; + minValue: number; + maxValue: number; +}> & + Partial<{ + step: number; + stepPixelSize: number; + suppressFlicker: number; + disabled: BooleanLike; + + className: string; + fluid: BooleanLike; + animated: BooleanLike; + unit: string; + height: string; + width: string; + lineHeight: string; + fontSize: string; + updateRate: number; + format: (value: number) => string; + onChange: (e: any, value: number) => void; + onDrag: (e: any, value: number) => void; + }>; + +type State = { + value: number; + dragging: BooleanLike; + editing: BooleanLike; + internalValue: number; + origin: number; + suppressingFlicker: BooleanLike; +}; + +export class NumberInput extends Component { + // Ref to the input field to set focus & highlight + inputRef: RefObject = createRef(); + + // Timer id for the flicker id + flickerTimer: NodeJS.Timeout; + + // After this time has elapsed we are in drag mode so no editing when dragging ends + dragTimeout: NodeJS.Timeout; + + // Call onDrag at this interval + dragInterval: NodeJS.Timeout; + + // default values for the number input state + state: State = { + value: 0, + dragging: false, + editing: false, + internalValue: 0, + origin: 0, + suppressingFlicker: false, + }; + + // default values for the number input props + static defaultProps = { + step: 1, + stepPixelSize: 1, + suppressFlicker: 50, + }; + + constructor(props: Props) { + super(props); + } + + suppressFlicker = () => { + const { suppressFlicker } = this.props; + if (suppressFlicker) { + this.setState({ + suppressingFlicker: true, + }); + clearTimeout(this.flickerTimer); + this.flickerTimer = setTimeout( + () => + this.setState({ + suppressingFlicker: false, + }), + suppressFlicker, + ); + } + }; + + handleDragStart: MouseEventHandler = (event) => { + const { value, updateRate, disabled } = this.props; + const { editing } = this.state; + if (disabled || editing) { + return; + } + this.setState({ + dragging: false, + origin: event.screenY, + internalValue: parseFloat(value.toString()), + }); + this.dragTimeout = setTimeout(() => { + this.setState({ + dragging: true, + }); + }, 250); + + this.dragInterval = setInterval(() => { + const { dragging, value } = this.state; + const { onDrag } = this.props; + if (dragging) { + onDrag?.(event, value); + } + }, updateRate || DEFAULT_UPDATE_RATE); + }; + + handleDragMove: MouseEventHandler = (event) => { + const { minValue, maxValue, step, stepPixelSize, disabled } = this.props; + const { dragging } = this.state; + if (disabled || !dragging) { + return; + } + + this.setState((prevState) => { + const state = { ...prevState }; + const offset = state.origin - event.screenY; + if (prevState.dragging && step) { + const stepOffset = isFinite(minValue) ? minValue % step : 0; + // Translate mouse movement to value + // Give it some headroom (by increasing clamp range by 1 step) + state.internalValue = clamp( + state.internalValue + (offset * step) / (stepPixelSize || 1), + minValue - step, + maxValue + step, + ); + // Clamp the final value + state.value = clamp( + state.internalValue - (state.internalValue % step) + stepOffset, + minValue, + maxValue, + ); + state.origin = event.screenY; + } else if (Math.abs(offset) > 4) { + state.dragging = true; + } + return state; + }); + }; + + handleDragEnd: MouseEventHandler = (event) => { + const { value, dragging, internalValue } = this.state; + const { onDrag, onChange, disabled } = this.props; + if (disabled) { + return; + } + + clearInterval(this.dragInterval); + clearTimeout(this.dragTimeout); + this.setState({ + dragging: false, + editing: !dragging, + }); + + if (dragging) { + this.suppressFlicker(); + onChange?.(event, value); + onDrag?.(event, value); + } else if (this.inputRef) { + const input = this.inputRef.current; + if (input) { + input.value = `${internalValue}`; + setTimeout(() => { + input.focus(); + input.select(); + }, 1); + } + } + }; + + handleBlur: FocusEventHandler = (event) => { + const { editing } = this.state; + const { minValue, maxValue, onChange, onDrag, disabled } = this.props; + + if (disabled || !editing) { + return; + } + + const targetValue = clamp( + parseFloat(event.target.value), + minValue, + maxValue, + ); + if (isNaN(targetValue)) { + this.setState({ + editing: false, + }); + return; + } + this.setState({ + editing: false, + }); + this.suppressFlicker(); + onChange?.(event, targetValue); + onDrag?.(event, targetValue); + }; + + handleKeyDown: KeyboardEventHandler = (event) => { + const { minValue, maxValue, onChange, onDrag, disabled } = this.props; + if (disabled) { + return; + } + + if (event.key === KEY.Enter) { + const targetValue = clamp( + parseFloat(event.currentTarget.value), + minValue, + maxValue, + ); + if (isNaN(targetValue)) { + this.setState({ + editing: false, + }); + return; + } + this.setState({ + editing: false, + value: targetValue, + }); + this.suppressFlicker(); + onChange?.(event, targetValue); + onDrag?.(event, targetValue); + } else if (event.key === KEY.Escape) { + this.setState({ + editing: false, + }); + } + }; + + render() { + const { + dragging, + editing, + value: intermediateValue, + suppressingFlicker, + } = this.state; + + const { + className, + fluid, + animated, + value, + unit, + minValue, + maxValue, + height, + width, + lineHeight, + fontSize, + format, + } = this.props; + + let displayValue = parseFloat(value.toString()); + if (dragging || suppressingFlicker) { + displayValue = intermediateValue; + } + + const contentElement = ( +
+ {animated && !dragging && !suppressingFlicker ? ( + + ) : format ? ( + format(displayValue) + ) : ( + displayValue + )} + + {unit ? ' ' + unit : ''} +
+ ); + + return ( + +
+
+
+ {contentElement} + + + ); + } +} diff --git a/tgui/packages/tgui/interfaces/BountyBoard.tsx b/tgui/packages/tgui/interfaces/BountyBoard.tsx index fcaa3556a7080..f0e0eecd86c3a 100644 --- a/tgui/packages/tgui/interfaces/BountyBoard.tsx +++ b/tgui/packages/tgui/interfaces/BountyBoard.tsx @@ -173,7 +173,7 @@ export const BountyBoardContent = (props) => { /> Hue: setHue(value)} diff --git a/tgui/packages/tgui/interfaces/ChemPress.tsx b/tgui/packages/tgui/interfaces/ChemPress.tsx index f388106169697..6d3c0ead35e3b 100644 --- a/tgui/packages/tgui/interfaces/ChemPress.tsx +++ b/tgui/packages/tgui/interfaces/ChemPress.tsx @@ -23,10 +23,10 @@ type Category = { }; type Data = { - current_volume: Number; + current_volume: number; product_name: string; - min_volume: Number; - max_volume: Number; + min_volume: number; + max_volume: number; packaging_category: string; packaging_types: Category[]; packaging_type: string; diff --git a/tgui/packages/tgui/interfaces/ColorMatrixEditor.tsx b/tgui/packages/tgui/interfaces/ColorMatrixEditor.tsx index 2b3ae69291549..c3b9529fd9f9d 100644 --- a/tgui/packages/tgui/interfaces/ColorMatrixEditor.tsx +++ b/tgui/packages/tgui/interfaces/ColorMatrixEditor.tsx @@ -41,14 +41,15 @@ export const ColorMatrixEditor = (props) => { {`${PREFIXES[row]}${PREFIXES[col]}:`} toFixed(value, 2)} onDrag={(_, value) => { let retColor = currentColor; - retColor[row * 4 + col] = value; + retColor[row * 4 + col] = `${value}`; act('transition_color', { color: retColor, }); diff --git a/tgui/packages/tgui/interfaces/MatrixMathTester.tsx b/tgui/packages/tgui/interfaces/MatrixMathTester.tsx index 1f67fd3f3eb27..6ba7bce637704 100644 --- a/tgui/packages/tgui/interfaces/MatrixMathTester.tsx +++ b/tgui/packages/tgui/interfaces/MatrixMathTester.tsx @@ -9,6 +9,8 @@ const MatrixMathTesterInput = (props: { value: number; varName: string }) => { const { act } = useBackend(); return ( toFixed(value, 3)} @@ -111,6 +113,8 @@ export const MatrixMathTester = (props) => { toFixed(value, 2)} @@ -120,6 +124,8 @@ export const MatrixMathTester = (props) => { toFixed(value, 2)} @@ -142,6 +148,8 @@ export const MatrixMathTester = (props) => { toFixed(value, 0)} @@ -151,6 +159,8 @@ export const MatrixMathTester = (props) => { toFixed(value, 0)} @@ -171,6 +181,8 @@ export const MatrixMathTester = (props) => { toFixed(value, 3)} @@ -180,6 +192,8 @@ export const MatrixMathTester = (props) => { toFixed(value, 3)} diff --git a/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx b/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx index 99b0fd4b7a78f..f8f6af31f3e32 100644 --- a/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx +++ b/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx @@ -547,7 +547,7 @@ const SnowflakeRadio = (props) => { { minValue={tank_pump_pressure_min} maxValue={tank_pump_pressure_max} step={10} - format={(value) => Math.round(value)} + format={(value) => `${Math.round(value)}`} onChange={(e, value) => act('equip_act', { ref: ref, diff --git a/tgui/packages/tgui/interfaces/ParticleEdit/EntriesBasic.tsx b/tgui/packages/tgui/interfaces/ParticleEdit/EntriesBasic.tsx index 3509c6d185198..7e48a4f46fb54 100644 --- a/tgui/packages/tgui/interfaces/ParticleEdit/EntriesBasic.tsx +++ b/tgui/packages/tgui/interfaces/ParticleEdit/EntriesBasic.tsx @@ -40,6 +40,7 @@ export const EntryFloat = (props: EntryFloatProps) => { animated value={float} minValue={0} + maxValue={Infinity} onDrag={(e, value) => act('edit', { var: var_name, @@ -64,7 +65,9 @@ export const EntryCoord = (props: EntryCoordProps) => { /> act('edit', { var: var_name, @@ -74,7 +77,9 @@ export const EntryCoord = (props: EntryCoordProps) => { /> act('edit', { var: var_name, @@ -84,7 +89,9 @@ export const EntryCoord = (props: EntryCoordProps) => { /> act('edit', { var: var_name, @@ -274,8 +281,9 @@ export const EntryIcon = (props: EntryIconStateProps) => { act('edit', { var: var_name, @@ -363,8 +371,9 @@ export const EntryIconState = (props: EntryIconStateProps) => { act('edit', { var: var_name, diff --git a/tgui/packages/tgui/interfaces/ParticleEdit/EntriesGenerators.tsx b/tgui/packages/tgui/interfaces/ParticleEdit/EntriesGenerators.tsx index 3365b55a61cad..9299228f4ae02 100644 --- a/tgui/packages/tgui/interfaces/ParticleEdit/EntriesGenerators.tsx +++ b/tgui/packages/tgui/interfaces/ParticleEdit/EntriesGenerators.tsx @@ -52,7 +52,9 @@ export const FloatGenerator = (props: FloatGeneratorProps) => { act('edit', { var: var_name, @@ -177,7 +179,9 @@ export const EntryGeneratorNumbersList = ( act('edit', { var: var_name, @@ -196,6 +200,8 @@ export const EntryGeneratorNumbersList = ( act('edit', { @@ -206,6 +212,8 @@ export const EntryGeneratorNumbersList = ( /> act('edit', { @@ -217,6 +225,8 @@ export const EntryGeneratorNumbersList = ( {allow_z ? ( act('edit', { diff --git a/tgui/packages/tgui/interfaces/ParticleEdit/Generators.tsx b/tgui/packages/tgui/interfaces/ParticleEdit/Generators.tsx index c92e4b5be0736..367493acc421c 100644 --- a/tgui/packages/tgui/interfaces/ParticleEdit/Generators.tsx +++ b/tgui/packages/tgui/interfaces/ParticleEdit/Generators.tsx @@ -74,6 +74,7 @@ export const GeneratorListEntry = (props: GeneratorProps) => { new_value: [type, value, B, RandToNumber[rand_type]], }) } + maxValue={Infinity} /> ) : ( <> @@ -92,6 +93,8 @@ export const GeneratorListEntry = (props: GeneratorProps) => { ], }) } + minValue={-Infinity} + maxValue={Infinity} /> { new_value: [type, [A[0], value, A[2]], B, rand_type], }) } + minValue={-Infinity} + maxValue={Infinity} /> { new_value: [type, [A[0], A[1], value], B, rand_type], }) } + minValue={-Infinity} + maxValue={Infinity} /> )} @@ -131,6 +138,8 @@ export const GeneratorListEntry = (props: GeneratorProps) => { new_value: [type, A, value, RandToNumber[rand_type]], }) } + minValue={-Infinity} + maxValue={Infinity} /> ) : ( <> @@ -149,6 +158,8 @@ export const GeneratorListEntry = (props: GeneratorProps) => { ], }) } + minValue={-Infinity} + maxValue={Infinity} /> { ], }) } + minValue={-Infinity} + maxValue={Infinity} /> { ], }) } + minValue={-Infinity} + maxValue={Infinity} /> )} diff --git a/tgui/packages/tgui/interfaces/Signaler.tsx b/tgui/packages/tgui/interfaces/Signaler.tsx index 15a486a62dfba..a50ecae700233 100644 --- a/tgui/packages/tgui/interfaces/Signaler.tsx +++ b/tgui/packages/tgui/interfaces/Signaler.tsx @@ -35,7 +35,7 @@ export const SignalerContent = (props) => { Frequency: { Date: Thu, 14 Mar 2024 08:31:04 +1300 Subject: [PATCH 42/75] Automatic changelog for PR #81957 [ci skip] --- html/changelogs/AutoChangeLog-pr-81957.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81957.yml diff --git a/html/changelogs/AutoChangeLog-pr-81957.yml b/html/changelogs/AutoChangeLog-pr-81957.yml new file mode 100644 index 0000000000000..f0697eef7ba89 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81957.yml @@ -0,0 +1,4 @@ +author: "Derpguy3" +delete-after: True +changes: + - bugfix: "A missing recharger has been added into science's testing range on Birdshot station." \ No newline at end of file From 29bb1255b76169216612429320ec02082d06ad86 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 08:31:39 +1300 Subject: [PATCH 43/75] Automatic changelog for PR #81967 [ci skip] --- html/changelogs/AutoChangeLog-pr-81967.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81967.yml diff --git a/html/changelogs/AutoChangeLog-pr-81967.yml b/html/changelogs/AutoChangeLog-pr-81967.yml new file mode 100644 index 0000000000000..f2515e2ef2f7f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81967.yml @@ -0,0 +1,4 @@ +author: "00-Steven" +delete-after: True +changes: + - bugfix: "Buttons let you take out their electronics again, hooray." \ No newline at end of file From caeedf018a655b0711e9599588b98bd36346822e Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Thu, 14 Mar 2024 01:04:48 +0530 Subject: [PATCH 44/75] Clicking sub sections in lathes will auto scroll to them (#81933) ## About The Pull Request - Fixes #80931 To answer the question > Would be valid to see if it's actually getting the element. if it is, perhaps the issue is with section I guess the problem is with the section because `getElementByID()` requires the `div` element of the section to actually have an `id` which we can retrive & scroll to. I don't like the solution entirely as `key` & `id` are redundant and if there was a way to access the `key` or some other way to access the section without using `getElementByID()` I'm all up for it. ## Changelog :cl: fix: Clicking sub sections in the design menu of lathe's UIs will auto scroll to them. /:cl: --- tgui/packages/tgui/components/Section.tsx | 4 ++++ tgui/packages/tgui/interfaces/Fabrication/DesignBrowser.tsx | 1 + 2 files changed, 5 insertions(+) diff --git a/tgui/packages/tgui/components/Section.tsx b/tgui/packages/tgui/components/Section.tsx index a400324eadf18..7718299b92e67 100644 --- a/tgui/packages/tgui/components/Section.tsx +++ b/tgui/packages/tgui/components/Section.tsx @@ -23,6 +23,8 @@ type Props = Partial<{ scrollableHorizontal: boolean; /** Title of the section. */ title: ReactNode; + /** id to assosiate with the parent div element used by this section, for uses with procs like getElementByID */ + container_id: string; /** @member Callback function for the `scroll` event */ onScroll: ((this: GlobalEventHandlers, ev: Event) => any) | null; }> & @@ -67,6 +69,7 @@ export const Section = forwardRef( scrollable, scrollableHorizontal, title, + container_id, ...rest } = props; @@ -87,6 +90,7 @@ export const Section = forwardRef( return (
(
{body} From 2afb907d95d9b1b5db9559812aae5b5b6f6bd868 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 08:37:48 +1300 Subject: [PATCH 45/75] Automatic changelog for PR #81913 [ci skip] --- html/changelogs/AutoChangeLog-pr-81913.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81913.yml diff --git a/html/changelogs/AutoChangeLog-pr-81913.yml b/html/changelogs/AutoChangeLog-pr-81913.yml new file mode 100644 index 0000000000000..2ffc617ce4164 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81913.yml @@ -0,0 +1,5 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "NumberInput(used in chem heater, plumbing reaction chamber etc) highlighting & editing requires only single click like before" + - refactor: "Typescript conversion for NumberInput TGUI Component" \ No newline at end of file From 0981acb23db2561073a9a4e7605e9e5f5e11a468 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 08:41:21 +1300 Subject: [PATCH 46/75] Automatic changelog for PR #81933 [ci skip] --- html/changelogs/AutoChangeLog-pr-81933.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81933.yml diff --git a/html/changelogs/AutoChangeLog-pr-81933.yml b/html/changelogs/AutoChangeLog-pr-81933.yml new file mode 100644 index 0000000000000..3d14553472d6d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81933.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "Clicking sub sections in the design menu of lathe's UIs will auto scroll to them." \ No newline at end of file From 9f4a8dfc50254784717b35e763be07dca583e394 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Wed, 13 Mar 2024 23:25:29 +0100 Subject: [PATCH 47/75] Buffs the SC/FISHER Saboteur Handgun. (#81553) ## About The Pull Request The saboteur gun will now silence pAIs, toggle off radio broadcasting (won't auto-relay nearby speech), disable turrets, chill out secbots a little, and turn off APCs like power outages do. The disrupt duration has also been buffed from 10/20 to 15/25 for ranged and point-blank respectively. Removed a conspicious chat message from an otherwise inconspicious gun. Brought the code up to date. ## Why It's Good For The Game The concept is cool, alas it's also undermined by how much of a joke it's right now, and the game has plenty already. The amount of interactions it has with things is underwhelming, so you could barely consider it a stealth tool. The duration is also quite scarce, I pointed that out in the original PR too. Basically, I want to make the item cooler. ## Changelog :cl: balance: Buffed the duration of the SC/FISHER Saboteur Handgun's disruption effects. It's also stealthier and it won't conspiciously alert living mobs hit by it. add: Added saboteur interactions with radios, pAIs, turrets, secbots and APCs. /:cl: --------- Co-authored-by: Jacquerel --- code/__DEFINES/dcs/signals/signals_object.dm | 4 ++ .../__DEFINES/dcs/signals/signals_saboteur.dm | 5 -- code/__DEFINES/robots.dm | 5 ++ code/game/machinery/camera/camera.dm | 3 +- .../machinery/porta_turret/portable_turret.dm | 63 +++++++++++-------- .../game/objects/items/devices/radio/radio.dm | 8 +++ code/game/objects/items/melee/baton.dm | 9 +++ .../cargo/markets/market_items/weapons.dm | 2 +- code/modules/clothing/head/hardhat.dm | 13 +++- code/modules/clothing/spacesuits/plasmamen.dm | 19 +++++- code/modules/mob/living/carbon/human/human.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- .../mob/living/simple_animal/bot/secbot.dm | 13 ++++ code/modules/mod/modules/modules_general.dm | 12 ++++ code/modules/pai/card.dm | 18 ++++-- code/modules/pai/pai.dm | 7 +++ code/modules/power/apc/apc_main.dm | 6 ++ .../projectile/special/lightbreaker.dm | 35 ----------- .../projectile/special/saboteur.dm | 30 +++++++++ code/modules/vehicles/mecha/_mecha.dm | 7 +++ tgstation.dme | 3 +- 21 files changed, 181 insertions(+), 85 deletions(-) delete mode 100644 code/__DEFINES/dcs/signals/signals_saboteur.dm delete mode 100644 code/modules/projectiles/projectile/special/lightbreaker.dm create mode 100644 code/modules/projectiles/projectile/special/saboteur.dm diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 91dbba15ff4d6..da4fc0fcb2f36 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -406,6 +406,10 @@ ///sent to the projectile when spawning the item (shrapnel) that may be embedded: (new_item) #define COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED "projectile_on_spawn_embedded" +/// from /obj/projectile/energy/fisher/on_hit() or /obj/item/gun/energy/recharge/fisher when striking a target +#define COMSIG_HIT_BY_SABOTEUR "hit_by_saboteur" + #define COMSIG_SABOTEUR_SUCCESS (1<<0) + // /obj/vehicle/sealed/car/vim signals ///from /datum/action/vehicle/sealed/noise/chime/Trigger(): () diff --git a/code/__DEFINES/dcs/signals/signals_saboteur.dm b/code/__DEFINES/dcs/signals/signals_saboteur.dm deleted file mode 100644 index 5b0fef52aee66..0000000000000 --- a/code/__DEFINES/dcs/signals/signals_saboteur.dm +++ /dev/null @@ -1,5 +0,0 @@ -// Light disruptor. Not to be confused with the light eater, which permanently disables lights. - -/// from /obj/projectile/energy/fisher/on_hit() or /obj/item/gun/energy/recharge/fisher when striking a target -#define COMSIG_HIT_BY_SABOTEUR "HIT_BY_SABOTEUR" - #define COMSIG_SABOTEUR_SUCCESS (1<<0) diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index e822c0c2a77cd..73351de60f2c4 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -189,6 +189,8 @@ DEFINE_BITFIELD(bot_cover_flags, list( #define JUDGE_IDCHECK (1<<1) #define JUDGE_WEAPONCHECK (1<<2) #define JUDGE_RECORDCHECK (1<<3) +///lowered threat level +#define JUDGE_CHILLOUT (1<<4) /// Above this level of assessed threat, Beepsky will attack you #define THREAT_ASSESS_DANGEROUS 4 @@ -206,6 +208,8 @@ DEFINE_BITFIELD(bot_cover_flags, list( #define SECBOT_CHECK_RECORDS (1<<3) ///Whether we will stun & cuff or endlessly stun #define SECBOT_HANDCUFF_TARGET (1<<4) +///if it's currently affected by a saboteur bolt (lowered perp threat level) +#define SECBOT_SABOTEUR_AFFECTED (1<<5) DEFINE_BITFIELD(security_mode_flags, list( "SECBOT_DECLARE_ARRESTS" = SECBOT_DECLARE_ARRESTS, @@ -213,6 +217,7 @@ DEFINE_BITFIELD(security_mode_flags, list( "SECBOT_CHECK_WEAPONS" = SECBOT_CHECK_WEAPONS, "SECBOT_CHECK_RECORDS" = SECBOT_CHECK_RECORDS, "SECBOT_HANDCUFF_TARGET" = SECBOT_HANDCUFF_TARGET, + "SECBOT_SABOTEUR_AFFECTED" = SECBOT_SABOTEUR_AFFECTED, )) //MedBOT defines diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 257cce51ab84e..e3a26fb54b68b 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -185,7 +185,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) /obj/machinery/camera/proc/on_saboteur(datum/source, disrupt_duration) SIGNAL_HANDLER - emp_act(EMP_LIGHT, reset_time = disrupt_duration) + //lasts twice as much so we don't have to constantly shoot cameras just to be S T E A L T H Y + emp_act(EMP_LIGHT, reset_time = disrupt_duration * 2) return COMSIG_SABOTEUR_SUCCESS /obj/machinery/camera/proc/post_emp_reset(thisemp, previous_network) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 809171af1efa7..f5f8327607af3 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -103,6 +103,8 @@ DEFINE_BITFIELD(turret_flags, list( var/datum/action/turret_toggle/toggle_action /// Mob that is remotely controlling the turret var/mob/remote_controller + /// While the cooldown is still going on, it cannot be re-enabled. + COOLDOWN_DECLARE(disabled_time) /datum/armor/machinery_porta_turret melee = 50 @@ -133,18 +135,32 @@ DEFINE_BITFIELD(turret_flags, list( if(!has_cover) INVOKE_ASYNC(src, PROC_REF(popUp)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + AddElement(/datum/element/hostile_machine) -/obj/machinery/porta_turret/proc/toggle_on(set_to) - var/current = on - if (!isnull(set_to)) - on = set_to - else - on = !on - if (current != on) - check_should_process() - if (!on) - popDown() +///Toggles the turret on or off depending on the value of the turn_on arg. +/obj/machinery/porta_turret/proc/toggle_on(turn_on = TRUE) + if(on == turn_on) + return + if(on && !COOLDOWN_FINISHED(src, disabled_time)) + return + on = turn_on + check_should_process() + if (!on) + popDown() + +///Prevents turned from being turned on for a duration, then restarts them after that if the second ard is true. +/obj/machinery/porta_turret/proc/set_disabled(duration = 6 SECONDS, will_restart = on) + COOLDOWN_START(src, disabled_time, duration) + if(will_restart) + addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), duration + 1) //the cooldown isn't over until the tick after its end. + toggle_on(FALSE) + +/obj/machinery/porta_turret/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(set_disabled), disrupt_duration) + return COMSIG_SABOTEUR_SUCCESS /obj/machinery/porta_turret/proc/check_should_process() if (datum_flags & DF_ISPROCESSING) @@ -256,7 +272,7 @@ DEFINE_BITFIELD(turret_flags, list( switch(action) if("power") if(anchored) - toggle_on() + toggle_on(!on) return TRUE else to_chat(usr, span_warning("It has to be secured first!")) @@ -364,10 +380,8 @@ DEFINE_BITFIELD(turret_flags, list( audible_message(span_hear("[src] hums oddly...")) obj_flags |= EMAGGED controllock = TRUE - toggle_on(FALSE) //turns off the turret temporarily + set_disabled(6 SECONDS) update_appearance() - //6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit - addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), 6 SECONDS) //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here return TRUE @@ -385,11 +399,9 @@ DEFINE_BITFIELD(turret_flags, list( if(prob(20)) turret_flags |= TURRET_FLAG_SHOOT_ALL // Shooting everyone is a pretty big deal, so it's least likely to get turned on - toggle_on(FALSE) + set_disabled(rand(6 SECONDS, 20 SECONDS)) remove_control() - addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), rand(60,600)) - /obj/machinery/porta_turret/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() if(. && atom_integrity > 0) //damage received @@ -1186,17 +1198,14 @@ DEFINE_BITFIELD(turret_flags, list( installation = /obj/item/gun/energy/laser/bluetag team_color = "blue" -/obj/machinery/porta_turret/lasertag/bullet_act(obj/projectile/P) +/obj/machinery/porta_turret/lasertag/bullet_act(obj/projectile/projectile) . = ..() - if(on) - if(team_color == "blue") - if(istype(P, /obj/projectile/beam/lasertag/redtag)) - toggle_on(FALSE) - addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), 10 SECONDS) - else if(team_color == "red") - if(istype(P, /obj/projectile/beam/lasertag/bluetag)) - toggle_on(FALSE) - addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), 10 SECONDS) + if(!on) + return + if(team_color == "blue" && istype(projectile, /obj/projectile/beam/lasertag/redtag)) + set_disabled(10 SECONDS) + else if(team_color == "red" && istype(projectile, /obj/projectile/beam/lasertag/bluetag)) + set_disabled(10 SECONDS) #undef TURRET_STUN #undef TURRET_LETHAL diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 433cf51062f3e..bf662fcc1b90a 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -120,6 +120,8 @@ slapcraft_recipes = list(/datum/crafting_recipe/improv_explosive)\ ) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + /obj/item/radio/Destroy() remove_radio_all(src) //Just to be sure QDEL_NULL(wires) @@ -127,6 +129,12 @@ QDEL_NULL(keyslot) return ..() +/obj/item/radio/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(broadcasting) //no broadcasting but it can still be used to send radio messages. + set_broadcasting(FALSE) + return COMSIG_SABOTEUR_SUCCESS + /obj/item/radio/proc/set_frequency(new_frequency) SEND_SIGNAL(src, COMSIG_RADIO_NEW_FREQUENCY, args) remove_radio(src, frequency) diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index b692b58bfcf2d..90baa8f986b38 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -454,6 +454,7 @@ else cell = new preload_cell_type(src) RegisterSignal(src, COMSIG_ATOM_ATTACKBY, PROC_REF(convert)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) update_appearance() /obj/item/melee/baton/security/get_cell() @@ -488,6 +489,14 @@ qdel(item) qdel(src) +/obj/item/melee/baton/security/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(!active) + return + toggle_light() + active = FALSE + update_appearance() + return COMSIG_SABOTEUR_SUCCESS /obj/item/melee/baton/security/Exited(atom/movable/mov_content) . = ..() if(mov_content == cell) diff --git a/code/modules/cargo/markets/market_items/weapons.dm b/code/modules/cargo/markets/market_items/weapons.dm index 052074a30b38d..11f242d57c874 100644 --- a/code/modules/cargo/markets/market_items/weapons.dm +++ b/code/modules/cargo/markets/market_items/weapons.dm @@ -66,7 +66,7 @@ /datum/market_item/weapon/fisher name = "SC/FISHER Saboteur Handgun" - desc = "A self-recharging, compact pistol that disrupts flashlights and security cameras, if only temporarily. Also usable in melee." + desc = "A self-recharging, compact pistol that disrupts lights, cameras, APCs, turrets and more, if only temporarily. Also usable in melee." item = /obj/item/gun/energy/recharge/fisher price_min = CARGO_CRATE_VALUE * 2 diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index be8323a1186e2..c2e4b9c9ef7f6 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -40,9 +40,7 @@ /obj/item/clothing/head/utility/hardhat/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) - -/obj/item/clothing/head/utility/hardhat/attack_self(mob/living/user) - toggle_helmet_light(user) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /obj/item/clothing/head/utility/hardhat/proc/toggle_helmet_light(mob/living/user) on = !on @@ -62,6 +60,15 @@ /obj/item/clothing/head/utility/hardhat/proc/turn_off(mob/user) set_light_on(FALSE) +/obj/item/clothing/head/utility/hardhat/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(on) + toggle_helmet_light() + return COMSIG_SABOTEUR_SUCCESS + +/obj/item/clothing/head/utility/hardhat/attack_self(mob/living/user) + toggle_helmet_light(user) + /obj/item/clothing/head/utility/hardhat/orange icon_state = "hardhat0_orange" inhand_icon_state = null diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 64b83c076505e..860ac12d20209 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -78,6 +78,7 @@ . = ..() visor_toggling() update_appearance() + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /obj/item/clothing/head/helmet/space/plasmaman/examine() . = ..() @@ -108,6 +109,11 @@ playsound(src, 'sound/mecha/mechmove03.ogg', 50, TRUE) //Visors don't just come from nothing update_appearance() +/obj/item/clothing/head/helmet/space/plasmaman/update_icon_state() + . = ..() + icon_state = "[initial(icon_state)][helmet_on ? "-light":""]" + inhand_icon_state = icon_state + /obj/item/clothing/head/helmet/space/plasmaman/update_overlays() . = ..() . += visor_icon @@ -139,6 +145,7 @@ hitting_clothing.forceMove(src) update_appearance() +///By the by, helmets have the update_icon_updates_onmob element, so we don't have to call mob.update_worn_head() /obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(mutable_appearance/standing, isinhands) . = ..() if(!isinhands && smile) @@ -161,9 +168,7 @@ /obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user) helmet_on = !helmet_on - icon_state = "[initial(icon_state)][helmet_on ? "-light":""]" - inhand_icon_state = icon_state - user.update_worn_head() //So the mob overlay updates + update_appearance() if(helmet_on) if(!up) @@ -176,6 +181,14 @@ update_item_action_buttons() +/obj/item/clothing/head/helmet/space/plasmaman/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(!helmet_on) + return + helmet_on = FALSE + update_appearance() + return COMSIG_SABOTEUR_SUCCESS + /obj/item/clothing/head/helmet/space/plasmaman/attack_hand_secondary(mob/user) ..() . = SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b20cb463c833b..cef7abf8c0a1a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -362,7 +362,7 @@ if(judgement_criteria & JUDGE_EMAGGED || HAS_TRAIT(src, TRAIT_ALWAYS_WANTED)) return 10 //Everyone is a criminal! - var/threatcount = 0 + var/threatcount = judgement_criteria & JUDGE_CHILLOUT ? -THREAT_ASSESS_DANGEROUS : 0 //Lasertag bullshit if(lasercolor) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4952ce57fe6eb..fa6b2d0571630 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -436,7 +436,7 @@ SIGNAL_HANDLER if(lamp_enabled) toggle_headlamp(TRUE) - to_chat(src, span_warning("Your headlamp was forcibly turned off. Restarting it should fix it, though.")) + balloon_alert(src, "headlamp off!") return COMSIG_SABOTEUR_SUCCESS /** diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 2f9c3f25f3580..62e7ea7d0d0d5 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -141,6 +141,7 @@ ) AddElement(/datum/element/connect_loc, loc_connections) AddComponent(/datum/component/security_vision, judgement_criteria = NONE, update_judgement_criteria = CALLBACK(src, PROC_REF(judgement_criteria))) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /mob/living/simple_animal/bot/secbot/Destroy() QDEL_NULL(weapon) @@ -164,6 +165,16 @@ SSmove_manager.stop_looping(src) last_found = world.time +/mob/living/simple_animal/bot/secbot/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(!(security_mode_flags & SECBOT_SABOTEUR_AFFECTED)) + security_mode_flags |= SECBOT_SABOTEUR_AFFECTED + addtimer(CALLBACK(src, PROC_REF(remove_saboteur_effect)), disrupt_duration) + return COMSIG_SABOTEUR_SUCCESS + +/mob/living/simple_animal/bot/secbot/proc/remove_saboteur_effect() + security_mode_flags &= ~SECBOT_SABOTEUR_AFFECTED + /mob/living/simple_animal/bot/secbot/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)//shocks only make him angry if(base_speed < initial(base_speed) + 3) base_speed += 3 @@ -232,6 +243,8 @@ final |= JUDGE_RECORDCHECK if(security_mode_flags & SECBOT_CHECK_WEAPONS) final |= JUDGE_WEAPONCHECK + if(security_mode_flags & SECBOT_SABOTEUR_AFFECTED) + final |= JUDGE_CHILLOUT return final /mob/living/simple_animal/bot/secbot/proc/special_retaliate_after_attack(mob/user) //allows special actions to take place after being attacked. diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 5cc542703d23d..f03b0ac44c69e 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -377,6 +377,12 @@ /// Maximum range we can set. var/max_range = 5 +/obj/item/mod/module/flashlight/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + +/obj/item/mod/module/flashlight/on_suit_deactivation(deleting = FALSE) + UnregisterSignal(mod.wearer, COMSIG_HIT_BY_SABOTEUR) + /obj/item/mod/module/flashlight/on_activation() . = ..() if(!.) @@ -392,6 +398,12 @@ set_light_flags(light_flags & ~LIGHT_ATTACHED) set_light_on(active) +/obj/item/mod/module/flashlight/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(active) + on_deactivation() + return COMSIG_SABOTEUR_SUCCESS + /obj/item/mod/module/flashlight/on_process(seconds_per_tick) active_power_cost = base_power * light_range return ..() diff --git a/code/modules/pai/card.dm b/code/modules/pai/card.dm index c1a9c5a88ba04..77ca42aeebcee 100644 --- a/code/modules/pai/card.dm +++ b/code/modules/pai/card.dm @@ -21,6 +21,14 @@ /// Prevents a crew member from hitting "request pAI" repeatedly var/request_spam = FALSE +/obj/item/pai_card/Initialize(mapload) + . = ..() + + update_appearance() + SSpai.pai_card_list += src + ADD_TRAIT(src, TRAIT_CASTABLE_LOC, INNATE_TRAIT) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + /obj/item/pai_card/attackby(obj/item/used, mob/user, params) if(pai && istype(used, /obj/item/encryptionkey)) if(!pai.encrypt_mod) @@ -63,12 +71,10 @@ emotion_icon = initial(emotion_icon) update_appearance() -/obj/item/pai_card/Initialize(mapload) - . = ..() - - update_appearance() - SSpai.pai_card_list += src - ADD_TRAIT(src, TRAIT_CASTABLE_LOC, INNATE_TRAIT) +/obj/item/pai_card/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(pai) + return pai.on_saboteur(source, disrupt_duration) /obj/item/pai_card/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is staring sadly at [src]! [user.p_They()] can't keep living without real human intimacy!")) diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index d5403f28e6af0..e5f0f080a79e2 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -238,6 +238,7 @@ RegisterSignal(src, COMSIG_LIVING_CULT_SACRIFICED, PROC_REF(on_cult_sacrificed)) RegisterSignals(src, list(COMSIG_LIVING_ADJUST_BRUTE_DAMAGE, COMSIG_LIVING_ADJUST_BURN_DAMAGE), PROC_REF(on_shell_damaged)) RegisterSignal(src, COMSIG_LIVING_ADJUST_STAMINA_DAMAGE, PROC_REF(on_shell_weakened)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) /mob/living/silicon/pai/make_laws() laws = new /datum/ai_laws/pai() @@ -351,6 +352,12 @@ to_chat(src, span_danger("WARN: Holochasis range restrictions disabled.")) return TRUE +/mob/living/silicon/pai/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + set_silence_if_lower(disrupt_duration) + balloon_alert(src, "muted!") + return COMSIG_SABOTEUR_SUCCESS + /** * Resets the pAI and any emagged status. * diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index 9f900c5a4c793..df0cbe9eda979 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -205,6 +205,7 @@ register_context() addtimer(CALLBACK(src, PROC_REF(update)), 5) RegisterSignal(SSdcs, COMSIG_GLOB_GREY_TIDE, PROC_REF(grey_tide)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) update_appearance() var/static/list/hovering_mob_typechecks = list( @@ -235,6 +236,11 @@ disconnect_terminal() return ..() +/obj/machinery/power/apc/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + energy_fail(disrupt_duration) + return COMSIG_SABOTEUR_SUCCESS + /obj/machinery/power/apc/proc/assign_to_area(area/target_area = get_area(src)) if(area == target_area) return diff --git a/code/modules/projectiles/projectile/special/lightbreaker.dm b/code/modules/projectiles/projectile/special/lightbreaker.dm deleted file mode 100644 index 2be6d9e4470da..0000000000000 --- a/code/modules/projectiles/projectile/special/lightbreaker.dm +++ /dev/null @@ -1,35 +0,0 @@ -/obj/projectile/energy/fisher - name = "attenuated kinetic force" - alpha = 0 - damage = 0 - damage_type = BRUTE - armor_flag = BOMB - range = 21 - projectile_phasing = PASSTABLE | PASSMOB | PASSMACHINE | PASSSTRUCTURE - hitscan = TRUE - var/disrupt_duration = 10 SECONDS - -/obj/projectile/energy/fisher/on_hit(atom/target, blocked, pierce_hit) - . = ..() - var/lights_flickered = 0 - if(SEND_SIGNAL(target, COMSIG_HIT_BY_SABOTEUR, disrupt_duration) & COMSIG_SABOTEUR_SUCCESS) - lights_flickered++ - if(!isliving(target)) - return - var/list/things_to_disrupt = list() - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - things_to_disrupt = human_target.get_all_gear() - else - var/mob/living/living_target = target // i guess this covers borgs too? - things_to_disrupt = living_target.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE) - for(var/obj/item/thingy as anything in things_to_disrupt) - if(SEND_SIGNAL(thingy, COMSIG_HIT_BY_SABOTEUR, disrupt_duration) & COMSIG_SABOTEUR_SUCCESS) - lights_flickered++ - if(lights_flickered) - to_chat(target, span_warning("Your light [lights_flickered > 1 ? "sources flick" : "source flicks"] off.")) - -/obj/projectile/energy/fisher/melee - range = 1 - suppressed = SUPPRESSED_VERY - disrupt_duration = 20 SECONDS diff --git a/code/modules/projectiles/projectile/special/saboteur.dm b/code/modules/projectiles/projectile/special/saboteur.dm new file mode 100644 index 0000000000000..4ef6b9ffcbe6d --- /dev/null +++ b/code/modules/projectiles/projectile/special/saboteur.dm @@ -0,0 +1,30 @@ +/obj/projectile/energy/fisher + name = "attenuated kinetic force" + alpha = 0 + damage = 0 + damage_type = BRUTE + armor_flag = BOMB + range = 21 + projectile_phasing = PASSTABLE | PASSMOB | PASSMACHINE | PASSSTRUCTURE + hitscan = TRUE + var/disrupt_duration = 15 SECONDS + +/obj/projectile/energy/fisher/on_hit(atom/target, blocked, pierce_hit) + . = ..() + var/list/things_to_disrupt = list(target) + if(isliving(target)) + var/mob/living/live_target = target + things_to_disrupt += live_target.get_all_gear() + + var/success = FALSE + for(var/atom/disrupted as anything in things_to_disrupt) + if(SEND_SIGNAL(disrupted, COMSIG_HIT_BY_SABOTEUR, disrupt_duration) & COMSIG_SABOTEUR_SUCCESS) + success = TRUE + + if(success && ismob(firer)) + target.balloon_alert(firer, "disrupted") + +/obj/projectile/energy/fisher/melee + range = 1 + suppressed = SUPPRESSED_VERY + disrupt_duration = 25 SECONDS diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 85d408f5348c9..f718bd5c6951f 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -221,6 +221,7 @@ ui_view.generate_view("mech_view_[REF(src)]") RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) + RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) spark_system = new spark_system.set_up(2, 0, src) @@ -799,6 +800,12 @@ remove_action_type_from_mob(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, occupant) return COMPONENT_BLOCK_LIGHT_EATER +/obj/vehicle/sealed/mecha/proc/on_saboteur(datum/source, disrupt_duration) + SIGNAL_HANDLER + if(mecha_flags &= HAS_LIGHTS && light_on) + set_light_on(FALSE) + return COMSIG_SABOTEUR_SUCCESS + /// Apply corresponding accesses /obj/vehicle/sealed/mecha/proc/update_access() req_access = one_access ? list() : accesses diff --git a/tgstation.dme b/tgstation.dme index 56f3dcf6a27ac..9edf71d40ccd9 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -340,7 +340,6 @@ #include "code\__DEFINES\dcs\signals\signals_radiation.dm" #include "code\__DEFINES\dcs\signals\signals_reagent.dm" #include "code\__DEFINES\dcs\signals\signals_restaurant.dm" -#include "code\__DEFINES\dcs\signals\signals_saboteur.dm" #include "code\__DEFINES\dcs\signals\signals_scangate.dm" #include "code\__DEFINES\dcs\signals\signals_screentips.dm" #include "code\__DEFINES\dcs\signals\signals_spatial_grid.dm" @@ -5387,12 +5386,12 @@ #include "code\modules\projectiles\projectile\special\floral.dm" #include "code\modules\projectiles\projectile\special\gravity.dm" #include "code\modules\projectiles\projectile\special\ion.dm" -#include "code\modules\projectiles\projectile\special\lightbreaker.dm" #include "code\modules\projectiles\projectile\special\meteor.dm" #include "code\modules\projectiles\projectile\special\mindflayer.dm" #include "code\modules\projectiles\projectile\special\neurotoxin.dm" #include "code\modules\projectiles\projectile\special\plasma.dm" #include "code\modules\projectiles\projectile\special\rocket.dm" +#include "code\modules\projectiles\projectile\special\saboteur.dm" #include "code\modules\projectiles\projectile\special\temperature.dm" #include "code\modules\projectiles\projectile\special\wormhole.dm" #include "code\modules\reagents\chem_splash.dm" From fba108f37f1031389edb8e2bd29bdd216012cacc Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 11:25:59 +1300 Subject: [PATCH 48/75] Automatic changelog for PR #81553 [ci skip] --- html/changelogs/AutoChangeLog-pr-81553.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81553.yml diff --git a/html/changelogs/AutoChangeLog-pr-81553.yml b/html/changelogs/AutoChangeLog-pr-81553.yml new file mode 100644 index 0000000000000..53037f4542c93 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81553.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - balance: "Buffed the duration of the SC/FISHER Saboteur Handgun's disruption effects. It's also stealthier and it won't conspiciously alert living mobs hit by it." + - rscadd: "Added saboteur interactions with radios, pAIs, turrets, secbots and APCs." \ No newline at end of file From 4bc21eeb965da27ed99ee21f78bb774c18aff7a9 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Thu, 14 Mar 2024 09:36:05 +1100 Subject: [PATCH 49/75] Thermal Pistol Rework Attempt Two: You Spin to Win (it uses the crank energy weapon mechanics) (#81819) ## About The Pull Request Thermal pistols now can be 'cranked' in order to reload them, similar to a smoothbore disabler. Each 'crank' recharges one shot out of 8 shots. And by crank, I mean you SPIN THE GUN. In order to spin guns, you need a holster. So, without a holster, you can't utilize this mechanic of the pistols. (Also they're more accurate while dual-wielded hoo haa) Thermal pistol crates are now slightly more expensive, at 2000 credits. (is this even a balancing point now that we have stocks?) ## Why It's Good For The Game People really liked what was going on in this [PR with the gun flipping resulting in a reload](https://github.com/tgstation/tgstation/pull/76076). However, it was...maybe a little too strong. As a more middle ground approach, the gun crank component was a particularly helpful addition to the game that allows for things like...slow bullet-by-bullet reloading of even energy weapons. ## Changelog :cl: balance: Thermal pistols can now be 'cranked' to recharge shots. You must have a holster equipped in order to utilize this feature. Also, they have a tighter dual-wield cone. balance: Thermal pistol crates are now 2000 credits, up from 1400 credits. /:cl: --- code/datums/components/crank_recharge.dm | 11 +++- code/modules/cargo/packs/security.dm | 4 +- .../projectiles/guns/energy/crank_guns.dm | 53 +++++++++++++++++++ code/modules/projectiles/guns/energy/laser.dm | 42 --------------- 4 files changed, 65 insertions(+), 45 deletions(-) diff --git a/code/datums/components/crank_recharge.dm b/code/datums/components/crank_recharge.dm index 5c3c7aad24ed6..10449a337e140 100644 --- a/code/datums/components/crank_recharge.dm +++ b/code/datums/components/crank_recharge.dm @@ -2,6 +2,8 @@ /datum/component/crank_recharge /// Our cell to charge var/obj/item/stock_parts/cell/charging_cell + /// Whether we spin our gun to reload (and therefore need the relevant trait) + var/spin_to_win = FALSE /// How much charge we give our cell on each crank var/charge_amount /// How long is the cooldown time between each charge @@ -14,13 +16,14 @@ var/is_charging = FALSE COOLDOWN_DECLARE(charge_sound_cooldown) -/datum/component/crank_recharge/Initialize(charging_cell, charge_amount = 500, cooldown_time = 2 SECONDS, charge_sound = 'sound/weapons/laser_crank.ogg', charge_sound_cooldown_time = 1.8 SECONDS) +/datum/component/crank_recharge/Initialize(charging_cell, spin_to_win = FALSE, charge_amount = 500, cooldown_time = 2 SECONDS, charge_sound = 'sound/weapons/laser_crank.ogg', charge_sound_cooldown_time = 1.8 SECONDS) . = ..() if(!isitem(parent)) return COMPONENT_INCOMPATIBLE if(isnull(charging_cell) || !istype(charging_cell, /obj/item/stock_parts/cell)) return COMPONENT_INCOMPATIBLE src.charging_cell = charging_cell + src.spin_to_win = spin_to_win src.charge_amount = charge_amount src.cooldown_time = cooldown_time src.charge_sound = charge_sound @@ -45,6 +48,10 @@ return if(is_charging) return + if(spin_to_win && !HAS_TRAIT(user, TRAIT_GUNFLIP)) + source.balloon_alert(user, "need holster to spin!") + return + is_charging = TRUE if(COOLDOWN_FINISHED(src, charge_sound_cooldown)) COOLDOWN_START(src, charge_sound_cooldown, charge_sound_cooldown_time) @@ -56,4 +63,6 @@ charging_cell.give(charge_amount) source.update_appearance() is_charging = FALSE + if(spin_to_win) + source.SpinAnimation(4, 2) //What a badass source.balloon_alert(user, "charged") diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index 0b0073258298b..b8e93f2815c0d 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -330,8 +330,8 @@ /datum/supply_pack/security/armory/thermal name = "Thermal Pistol Crate" desc = "Contains a pair of holsters each with two experimental thermal pistols, \ - using nanites as the basis for their ammo." - cost = CARGO_CRATE_VALUE * 7 + using nanites as the basis for their ammo. Can be shaken to reload." + cost = CARGO_CRATE_VALUE * 10 contains = list(/obj/item/storage/belt/holster/energy/thermal = 2) crate_name = "thermal pistol crate" diff --git a/code/modules/projectiles/guns/energy/crank_guns.dm b/code/modules/projectiles/guns/energy/crank_guns.dm index 23cd6a297ed34..5faaf3ea015df 100644 --- a/code/modules/projectiles/guns/energy/crank_guns.dm +++ b/code/modules/projectiles/guns/energy/crank_guns.dm @@ -72,3 +72,56 @@ ammo_type = list(/obj/item/ammo_casing/energy/disabler/smoothbore/prime) charge_sections = 2 spread = 0 //could be like 5, but having just very tiny spread kinda feels like bullshit + +//Inferno and Cryo Pistols + +/obj/item/gun/energy/laser/thermal //the common parent of these guns, it just shoots hard bullets, somoene might like that? + name = "nanite pistol" + desc = "A modified handcannon with a metamorphic reserve of decommissioned weaponized nanites. Spit globs of angry robots into the bad guys." + icon_state = "infernopistol" + inhand_icon_state = null + ammo_type = list(/obj/item/ammo_casing/energy/nanite) + shaded_charge = TRUE + ammo_x_offset = 1 + obj_flags = UNIQUE_RENAME + can_bayonet = TRUE + knife_x_offset = 19 + knife_y_offset = 13 + w_class = WEIGHT_CLASS_NORMAL + dual_wield_spread = 5 //as intended by the coders + +/obj/item/gun/energy/laser/thermal/Initialize(mapload) + . = ..() + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) + AddComponent( \ + /datum/component/crank_recharge, \ + charging_cell = get_cell(), \ + spin_to_win = TRUE, \ + charge_amount = 125, \ + cooldown_time = 0.8 SECONDS, \ + charge_sound = 'sound/weapons/kinetic_reload.ogg', \ + charge_sound_cooldown_time = 0.8 SECONDS, \ + ) + +/obj/item/gun/energy/laser/thermal/add_seclight_point() + AddComponent(/datum/component/seclite_attachable, \ + light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', \ + light_overlay = "flight", \ + overlay_x = 15, \ + overlay_y = 9) + +/obj/item/gun/energy/laser/thermal/inferno //the magma gun + name = "inferno pistol" + desc = "A modified handcannon with a metamorphic reserve of decommissioned weaponized nanites. Spit globs of molten angry robots into the bad guys. \ + While it doesn't manipulate temperature in and of itself, it does cause an violent eruption in anyone who is severely cold. Able to generate \ + ammunition by manually spinning the weapon's nanite canister." + icon_state = "infernopistol" + ammo_type = list(/obj/item/ammo_casing/energy/nanite/inferno) + +/obj/item/gun/energy/laser/thermal/cryo //the ice gun + name = "cryo pistol" + desc = "A modified handcannon with a metamorphic reserve of decommissioned weaponized nanites. Spit shards of frozen angry robots into the bad guys. \ + While it doesn't manipulate temperature in and of itself, it does cause an internal explosion in anyone who is severely hot. Able to generate \ + ammunition by manually spinning the weapon's nanite canister." + icon_state = "cryopistol" + ammo_type = list(/obj/item/ammo_casing/energy/nanite/cryo) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 3cafe80a9d82a..6cb50018c7926 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -188,48 +188,6 @@ /obj/item/gun/energy/laser/redtag/hitscan ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag/hitscan) -//Inferno and Cryo Pistols - -/obj/item/gun/energy/laser/thermal //the common parent of these guns, it just shoots hard bullets, somoene might like that? - name = "nanite pistol" - desc = "A modified handcannon with a metamorphic reserve of decommissioned weaponized nanites. Spit globs of angry robots into the bad guys." - icon_state = "infernopistol" - inhand_icon_state = null - ammo_type = list(/obj/item/ammo_casing/energy/nanite) - shaded_charge = TRUE - ammo_x_offset = 1 - obj_flags = UNIQUE_RENAME - can_bayonet = TRUE - knife_x_offset = 19 - knife_y_offset = 13 - w_class = WEIGHT_CLASS_NORMAL - dual_wield_spread = 10 //as intended by the coders - -/obj/item/gun/energy/laser/thermal/Initialize(mapload) - . = ..() - AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) - -/obj/item/gun/energy/laser/thermal/add_seclight_point() - AddComponent(/datum/component/seclite_attachable, \ - light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', \ - light_overlay = "flight", \ - overlay_x = 15, \ - overlay_y = 9) - -/obj/item/gun/energy/laser/thermal/inferno //the magma gun - name = "inferno pistol" - desc = "A modified handcannon with a metamorphic reserve of decommissioned weaponized nanites. Spit globs of molten angry robots into the bad guys. \ - While it doesn't manipulate temperature in and of itself, it does cause an violent eruption in anyone who is severely cold." - icon_state = "infernopistol" - ammo_type = list(/obj/item/ammo_casing/energy/nanite/inferno) - -/obj/item/gun/energy/laser/thermal/cryo //the ice gun - name = "cryo pistol" - desc = "A modified handcannon with a metamorphic reserve of decommissioned weaponized nanites. Spit shards of frozen angry robots into the bad guys. \ - While it doesn't manipulate temperature in and of itself, it does cause an internal explosion in anyone who is severely hot." - icon_state = "cryopistol" - ammo_type = list(/obj/item/ammo_casing/energy/nanite/cryo) - // luxury shuttle funnies /obj/item/firing_pin/paywall/luxury multi_payment = TRUE From fabdf1cdb97553c6bdb6d9309de5be95b91a6a44 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 11:36:26 +1300 Subject: [PATCH 50/75] Automatic changelog for PR #81819 [ci skip] --- html/changelogs/AutoChangeLog-pr-81819.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81819.yml diff --git a/html/changelogs/AutoChangeLog-pr-81819.yml b/html/changelogs/AutoChangeLog-pr-81819.yml new file mode 100644 index 0000000000000..ba8d3d2c3ed3b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81819.yml @@ -0,0 +1,5 @@ +author: "necromanceranne" +delete-after: True +changes: + - balance: "Thermal pistols can now be 'cranked' to recharge shots. You must have a holster equipped in order to utilize this feature. Also, they have a tighter dual-wield cone." + - balance: "Thermal pistol crates are now 2000 credits, up from 1400 credits." \ No newline at end of file From d890c9b747f8d00674b880b825c07d12af24cf23 Mon Sep 17 00:00:00 2001 From: IndieanaJones <47086570+IndieanaJones@users.noreply.github.com> Date: Wed, 13 Mar 2024 18:37:47 -0400 Subject: [PATCH 51/75] Summon Simians Max Level Reward Change (#81875) ## About The Pull Request Summon Simian now, as opposed to summoning actual gorillas at max level, the caster is instead granted a free gorilla transformation spell instead. ## Why It's Good For The Game I wasn't exactly aware that Summon Simians could summon actual gorillas when I buffed gorillas mainly for traitors, so wizards could use the max level spell to spam powerful gorillas who could easily wipe the station in a very short amount of time. Ideally, this change should reign in max level Summon Simians while still giving users a reason to max it out. ## Changelog :cl: balance: Max level Summon Simians now grants the wizard a free gorilla transformation spell as opposed to allowing the wizard to summon fully-grown gorillas. /:cl: --- code/modules/spells/spell_types/conjure/simian.dm | 8 ++++++-- code/modules/spells/spell_types/shapeshift/gorilla.dm | 9 +++++++++ tgstation.dme | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 code/modules/spells/spell_types/shapeshift/gorilla.dm diff --git a/code/modules/spells/spell_types/conjure/simian.dm b/code/modules/spells/spell_types/conjure/simian.dm index aa9aabc681009..9306a39336526 100644 --- a/code/modules/spells/spell_types/conjure/simian.dm +++ b/code/modules/spells/spell_types/conjure/simian.dm @@ -13,6 +13,9 @@ invocation = "OOGA OOGA OOGA!!!!" invocation_type = INVOCATION_SHOUT + ///Our gorilla transformation spell, additionally granted to the user at max level. + var/datum/action/cooldown/spell/shapeshift/gorilla/gorilla_transformation + summon_radius = 2 summon_type = list( /mob/living/basic/gorilla/lesser, @@ -25,9 +28,10 @@ . = ..() summon_amount++ // MORE, MOOOOORE if(spell_level == spell_max_level) // We reward the faithful. - summon_type = list(/mob/living/carbon/human/species/monkey/angry, /mob/living/basic/gorilla) + gorilla_transformation = new(owner) + gorilla_transformation.Grant(owner) spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC // Max level lets you cast it naked, for monkey larp. - to_chat(owner, span_notice("Your simian power has reached maximum capacity! You can now cast this spell naked, and you will create adult Gorillas with each cast.")) + to_chat(owner, span_notice("Your simian power has reached maximum capacity! You can now cast this spell naked, and have additionally been granted a gorilla transformation spell!")) /datum/action/cooldown/spell/conjure/simian/cast(atom/cast_on) . = ..() diff --git a/code/modules/spells/spell_types/shapeshift/gorilla.dm b/code/modules/spells/spell_types/shapeshift/gorilla.dm new file mode 100644 index 0000000000000..938583f22b754 --- /dev/null +++ b/code/modules/spells/spell_types/shapeshift/gorilla.dm @@ -0,0 +1,9 @@ + +/datum/action/cooldown/spell/shapeshift/gorilla + name = "Gorilla Form" + desc = "Take on the shape of a powerful gorilla." + invocation = "B'NA NAH-SLEMA!" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + + possible_shapes = list(/mob/living/basic/gorilla) diff --git a/tgstation.dme b/tgstation.dme index 9edf71d40ccd9..c4d30eeb56b87 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5688,6 +5688,7 @@ #include "code\modules\spells\spell_types\shapeshift\_shape_status.dm" #include "code\modules\spells\spell_types\shapeshift\_shapeshift.dm" #include "code\modules\spells\spell_types\shapeshift\dragon.dm" +#include "code\modules\spells\spell_types\shapeshift\gorilla.dm" #include "code\modules\spells\spell_types\shapeshift\polar_bear.dm" #include "code\modules\spells\spell_types\shapeshift\shapechange.dm" #include "code\modules\spells\spell_types\teleport\_teleport.dm" From 9095acc570910c07039a1302d49e955a968729af Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 11:38:09 +1300 Subject: [PATCH 52/75] Automatic changelog for PR #81875 [ci skip] --- html/changelogs/AutoChangeLog-pr-81875.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81875.yml diff --git a/html/changelogs/AutoChangeLog-pr-81875.yml b/html/changelogs/AutoChangeLog-pr-81875.yml new file mode 100644 index 0000000000000..1296287b298e2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81875.yml @@ -0,0 +1,4 @@ +author: "IndieanaJones" +delete-after: True +changes: + - balance: "Max level Summon Simians now grants the wizard a free gorilla transformation spell as opposed to allowing the wizard to summon fully-grown gorillas." \ No newline at end of file From 4e96a0a4061c9ee4a4e18bc4e21e41d093ea5d10 Mon Sep 17 00:00:00 2001 From: Pickle-Coding <58013024+Pickle-Coding@users.noreply.github.com> Date: Wed, 13 Mar 2024 23:10:24 +0000 Subject: [PATCH 53/75] Prevent bioware list deletion runtime for human destroy (what the fuck is a bioware?). (#81907) ## About The Pull Request Prevent bioware list deletion runtime (biowares remove themselves from the biowares list when deleted) by making it a lazy list delete. ## Why It's Good For The Game Removes a runtime. ## Changelog :cl: fix: Prevent runtime from humans with biowares gettingn deleted. /:cl: --- code/modules/mob/living/carbon/human/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index cef7abf8c0a1a..ed408049e3ceb 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -61,7 +61,7 @@ /mob/living/carbon/human/Destroy() QDEL_NULL(physiology) if(biowares) - QDEL_LIST(biowares) + QDEL_LAZYLIST(biowares) GLOB.human_list -= src if (mob_mood) From 7ff633a39e5710671ac0863e24c6189b0d0a490e Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 12:15:15 +1300 Subject: [PATCH 54/75] Automatic changelog for PR #81907 [ci skip] --- html/changelogs/AutoChangeLog-pr-81907.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81907.yml diff --git a/html/changelogs/AutoChangeLog-pr-81907.yml b/html/changelogs/AutoChangeLog-pr-81907.yml new file mode 100644 index 0000000000000..f9cf994bf444f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81907.yml @@ -0,0 +1,4 @@ +author: "Pickle-Coding" +delete-after: True +changes: + - bugfix: "Prevent runtime from humans with biowares gettingn deleted." \ No newline at end of file From 5d77f75ca4e38e70636a5ea7eb5f52e2fb7b909d Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Thu, 14 Mar 2024 00:18:30 +0100 Subject: [PATCH 55/75] [NO GBP] Fixes the larva "hide" ability not properly hiding larvas under tables. (#81921) ## About The Pull Request This PR fixes yet another small issue with elevation. ## Why It's Good For The Game This PR fixes yet another small issue with elevation. ## Changelog :cl: fix: Fixed the larva "hide" ability not properly hiding larvas under tables. /:cl: --- code/__DEFINES/traits/declarations.dm | 2 ++ code/_globalvars/traits/_traits.dm | 1 + code/_globalvars/traits/admin_tooling.dm | 1 + code/datums/elements/elevation.dm | 24 +++++++++++++++---- .../mob/living/carbon/alien/larva/powers.dm | 2 ++ 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 47adc0552ba54..df1a5c5029367 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -509,6 +509,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Is the mob standing on an elevated surface? This prevents them from dropping down if not elevated first. #define TRAIT_ON_ELEVATED_SURFACE "on_elevated_surface" +/// Does the mob ignore elevation? (e.g. xeno larvas on hiding) +#define TRAIT_IGNORE_ELEVATION "ignore_elevation" /// Prevents you from twohanding weapons. #define TRAIT_NO_TWOHANDING "no_twohanding" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 3fc7e801265e5..5f4208a532ef9 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -255,6 +255,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_HULK" = TRAIT_HULK, "TRAIT_HUSK" = TRAIT_HUSK, "TRAIT_ID_APPRAISER" = TRAIT_ID_APPRAISER, + "TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION, "TRAIT_IGNOREDAMAGESLOWDOWN" = TRAIT_IGNOREDAMAGESLOWDOWN, "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, "TRAIT_IGNORING_GRAVITY" = TRAIT_IGNORING_GRAVITY, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 1d2b5f748c3f1..e424b014b3a76 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -96,6 +96,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_HIDE_EXTERNAL_ORGANS" = TRAIT_HIDE_EXTERNAL_ORGANS, "TRAIT_HOLY" = TRAIT_HOLY, "TRAIT_HUSK" = TRAIT_HUSK, + "TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION, "TRAIT_IGNOREDAMAGESLOWDOWN" = TRAIT_IGNOREDAMAGESLOWDOWN, "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, diff --git a/code/datums/elements/elevation.dm b/code/datums/elements/elevation.dm index ffa6de398b6e4..92fba97a09414 100644 --- a/code/datums/elements/elevation.dm +++ b/code/datums/elements/elevation.dm @@ -113,6 +113,8 @@ for(var/mob/living/living in target) ADD_TRAIT(living, TRAIT_ON_ELEVATED_SURFACE, REF(src)) RegisterSignal(living, COMSIG_LIVING_SET_BUCKLED, PROC_REF(on_set_buckled)) + RegisterSignal(living, SIGNAL_ADDTRAIT(TRAIT_IGNORE_ELEVATION), PROC_REF(on_ignore_elevation_add)) + RegisterSignal(living, SIGNAL_REMOVETRAIT(TRAIT_IGNORE_ELEVATION), PROC_REF(on_ignore_elevation_remove)) elevate_mob(living) /datum/element/elevation_core/Detach(datum/source) @@ -133,7 +135,7 @@ continue REMOVE_TRAIT(living, TRAIT_ON_ELEVATED_SURFACE, REF(src)) elevate_mob(living, -pixel_shift) - UnregisterSignal(living, COMSIG_LIVING_SET_BUCKLED) + UnregisterSignal(living, list(COMSIG_LIVING_SET_BUCKLED, SIGNAL_ADDTRAIT(TRAIT_IGNORE_ELEVATION), SIGNAL_REMOVETRAIT(TRAIT_IGNORE_ELEVATION))) return ..() /datum/element/elevation_core/proc/on_entered(turf/source, atom/movable/entered, atom/old_loc) @@ -143,6 +145,8 @@ var/elevate_time = isturf(old_loc) && source.Adjacent(old_loc) ? ELEVATE_TIME : 0 elevate_mob(entered, elevate_time = elevate_time) RegisterSignal(entered, COMSIG_LIVING_SET_BUCKLED, PROC_REF(on_set_buckled)) + RegisterSignal(entered, SIGNAL_ADDTRAIT(TRAIT_IGNORE_ELEVATION), PROC_REF(on_ignore_elevation_add)) + RegisterSignal(entered, SIGNAL_REMOVETRAIT(TRAIT_IGNORE_ELEVATION), PROC_REF(on_ignore_elevation_remove)) /datum/element/elevation_core/proc/on_initialized_on(turf/source, atom/movable/spawned) SIGNAL_HANDLER @@ -152,15 +156,17 @@ /datum/element/elevation_core/proc/on_exited(turf/source, atom/movable/gone) SIGNAL_HANDLER if((isnull(gone.loc) || !HAS_TRAIT_FROM(gone.loc, TRAIT_ELEVATED_TURF, REF(src))) && isliving(gone)) - // Always unregister the signal, we're still leaving even if already shifted down. - UnregisterSignal(gone, COMSIG_LIVING_SET_BUCKLED) + // Always unregister the signals, we're still leaving even if not affected by elevation. + UnregisterSignal(gone, list(COMSIG_LIVING_SET_BUCKLED, SIGNAL_ADDTRAIT(TRAIT_IGNORE_ELEVATION), SIGNAL_REMOVETRAIT(TRAIT_IGNORE_ELEVATION))) if(!HAS_TRAIT_FROM(gone, TRAIT_ON_ELEVATED_SURFACE, REF(src))) return REMOVE_TRAIT(gone, TRAIT_ON_ELEVATED_SURFACE, REF(src)) var/elevate_time = isturf(gone.loc) && source.Adjacent(gone.loc) ? ELEVATE_TIME : 0 elevate_mob(gone, -pixel_shift, elevate_time) -/datum/element/elevation_core/proc/elevate_mob(mob/living/target, z_shift = pixel_shift, elevate_time = ELEVATE_TIME) +/datum/element/elevation_core/proc/elevate_mob(mob/living/target, z_shift = pixel_shift, elevate_time = ELEVATE_TIME, force = FALSE) + if(HAS_TRAIT(target, TRAIT_IGNORE_ELEVATION) && !force) + return var/buckled_to_vehicle = FALSE if(target.buckled) if(isvehicle(target.buckled)) @@ -181,6 +187,8 @@ */ /datum/element/elevation_core/proc/on_set_buckled(mob/living/source, atom/movable/new_buckled) SIGNAL_HANDLER + if(HAS_TRAIT(source, TRAIT_IGNORE_ELEVATION)) + return if(source.buckled) if(isvehicle(source.buckled)) animate(source.buckled, pixel_z = -pixel_shift, time = ELEVATE_TIME, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) @@ -193,6 +201,14 @@ else if(!isliving(new_buckled)) animate(source, pixel_z = -pixel_shift, time = ELEVATE_TIME, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) +/datum/element/elevation_core/proc/on_ignore_elevation_add(mob/living/source, trait) + SIGNAL_HANDLER + elevate_mob(source, -pixel_shift, force = TRUE) + +/datum/element/elevation_core/proc/on_ignore_elevation_remove(mob/living/source, trait) + SIGNAL_HANDLER + elevate_mob(source, pixel_shift) + /datum/element/elevation_core/proc/on_reset_elevation(turf/source, list/current_values) SIGNAL_HANDLER current_values[ELEVATION_CURRENT_PIXEL_SHIFT] = pixel_shift diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index e8b3c0b2e8a5d..d330983f20eb9 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -13,6 +13,7 @@ span_notice("[owner] slowly peeks up from the ground..."), span_noticealien("You stop hiding."), ) + ADD_TRAIT(owner, TRAIT_IGNORE_ELEVATION, ACTION_TRAIT) else owner.layer = hide_layer @@ -20,6 +21,7 @@ span_name("[owner] scurries to the ground!"), span_noticealien("You are now hiding."), ) + REMOVE_TRAIT(owner, TRAIT_IGNORE_ELEVATION, ACTION_TRAIT) return TRUE From b312c6ed380db4179bcbe49c8d5ab082d871334f Mon Sep 17 00:00:00 2001 From: Rhials <28870487+Rhials@users.noreply.github.com> Date: Wed, 13 Mar 2024 19:31:18 -0400 Subject: [PATCH 56/75] Revamps irradiated meteor effects (#81941) ## About The Pull Request Irradiated meteors have been given a little tune-up, because they are kind of underwhelming right now. Presently, they do less damage than a standard meteor. At some point its impact effect was reduced to a single radiation pulse (which does absolutely nothing). Now, they hit harder, deeper, and leave behind a pile of radioactive sludge. Let's see how it looks: ![image](https://github.com/tgstation/tgstation/assets/28870487/d4670bc7-fe42-4f6b-ab1b-b56f55b1b12e) Oof, wouldn't want that hitting MY department! You'll have to clean up the radioactive sludge, and should probably wear protective equipment while doing so. Also, they will show up slightly less often now, as they are more threatening now. ## Why It's Good For The Game Re-implements Flavor for an effect that lost its taste since being added 10 years ago. An irradiated meteor doesn't do anything besides look pretty and green right now. Currently irradiated meteors are really boring and not threatening -- antithetical to the idea of a "radioactive meteor". Now, there's a much more interactive and measurable impact when one hits. ## Changelog :cl: Rhials balance: Irradiated meteors now hit harder and leave behind radioactive goop. /:cl: --- .../objects/effects/decals/cleanable/misc.dm | 16 ++++++++++++++++ code/modules/meteors/meteor_types.dm | 10 ++++++---- code/modules/meteors/meteor_waves.dm | 4 ++-- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 4b23987b97914..f21bfc4788426 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -124,6 +124,22 @@ desc = "You know who to call." light_power = 2 +/obj/effect/decal/cleanable/greenglow/radioactive + name = "radioactive goo" + desc = "Holy crap, stop looking at this and move away immediately! It's radioactive!" + light_power = 5 + light_range = 3 + light_color = LIGHT_COLOR_NUCLEAR + +/obj/effect/decal/cleanable/greenglow/radioactive/Initialize(mapload, list/datum/disease/diseases) + . = ..() + AddComponent( + /datum/component/radioactive_emitter, \ + cooldown_time = 5 SECONDS, \ + range = 4, \ + threshold = RAD_MEDIUM_INSULATION, \ + ) + /obj/effect/decal/cleanable/cobweb name = "cobweb" desc = "Somebody should remove that." diff --git a/code/modules/meteors/meteor_types.dm b/code/modules/meteors/meteor_types.dm index c59a153b02238..2b37a55aaa413 100644 --- a/code/modules/meteors/meteor_types.dm +++ b/code/modules/meteors/meteor_types.dm @@ -257,15 +257,17 @@ desc = "An irradiated chunk of space rock. You could probably stop and appreciate its incandescent green glow, if it weren't moving so fast." icon_state = "glowing" heavy = TRUE + hits = 9 meteordrop = list(/obj/item/stack/ore/uranium) - threat = 15 + threat = 35 signature = "radiation" /obj/effect/meteor/irradiated/meteor_effect() ..() - explosion(src, light_impact_range = 4, flash_range = 3, adminlog = FALSE) - new /obj/effect/decal/cleanable/greenglow(get_turf(src)) - radiation_pulse(src, max_range = 3, threshold = RAD_MEDIUM_INSULATION, chance = 80) + explosion(src, heavy_impact_range = 1, light_impact_range = 3, flash_range = 6, adminlog = FALSE) + for(var/turf/open/floor/surviving_ground in range(2, get_turf(src))) + if(prob(70)) + new /obj/effect/decal/cleanable/greenglow/radioactive(get_turf(surviving_ground)) //Cluster meteor /obj/effect/meteor/cluster diff --git a/code/modules/meteors/meteor_waves.dm b/code/modules/meteors/meteor_waves.dm index 7d832d5371337..5edaed4c867ee 100644 --- a/code/modules/meteors/meteor_waves.dm +++ b/code/modules/meteors/meteor_waves.dm @@ -5,14 +5,14 @@ GLOBAL_VAR_INIT(meteor_wave_delay, 625) //minimum wait between waves in tenths o //Meteors probability of spawning during a given wave GLOBAL_LIST_INIT(meteors_normal, list(/obj/effect/meteor/dust=3, /obj/effect/meteor/medium=8, /obj/effect/meteor/big=3, \ - /obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=3, /obj/effect/meteor/carp=1, /obj/effect/meteor/bluespace=1, \ + /obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=2, /obj/effect/meteor/carp=1, /obj/effect/meteor/bluespace=1, \ /obj/effect/meteor/banana=1, /obj/effect/meteor/emp = 1)) //for normal meteor event GLOBAL_LIST_INIT(meteors_threatening, list(/obj/effect/meteor/medium=4, /obj/effect/meteor/big=8, /obj/effect/meteor/flaming=3, \ /obj/effect/meteor/irradiated=3, /obj/effect/meteor/cluster=1, /obj/effect/meteor/carp=1, /obj/effect/meteor/bluespace=2, /obj/effect/meteor/emp = 2)) //for threatening meteor event GLOBAL_LIST_INIT(meteors_catastrophic, list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=75, \ - /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/cluster=8, /obj/effect/meteor/tunguska=1, \ + /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=8, /obj/effect/meteor/cluster=8, /obj/effect/meteor/tunguska=1, \ /obj/effect/meteor/carp=2, /obj/effect/meteor/bluespace=10, /obj/effect/meteor/emp = 8)) //for catastrophic meteor event GLOBAL_LIST_INIT(meateors, list(/obj/effect/meteor/meaty=5, /obj/effect/meteor/meaty/xeno=1)) //for meaty ore event From dae5a54cec79887f9fa8accc903ef8070de09394 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 13:01:46 +1300 Subject: [PATCH 57/75] Automatic changelog for PR #81921 [ci skip] --- html/changelogs/AutoChangeLog-pr-81921.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81921.yml diff --git a/html/changelogs/AutoChangeLog-pr-81921.yml b/html/changelogs/AutoChangeLog-pr-81921.yml new file mode 100644 index 0000000000000..5bef329718e73 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81921.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed the larva \"hide\" ability not properly hiding larvas under tables." \ No newline at end of file From 38b63207f4a630e9b58a4e107bbdc63e001e39cf Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 13:08:41 +1300 Subject: [PATCH 58/75] Automatic changelog for PR #81941 [ci skip] --- html/changelogs/AutoChangeLog-pr-81941.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81941.yml diff --git a/html/changelogs/AutoChangeLog-pr-81941.yml b/html/changelogs/AutoChangeLog-pr-81941.yml new file mode 100644 index 0000000000000..878d01ae227bd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81941.yml @@ -0,0 +1,4 @@ +author: "Rhials" +delete-after: True +changes: + - balance: "Irradiated meteors now hit harder and leave behind radioactive goop." \ No newline at end of file From 26753d799624443ae2b21319eddb1dba9a832c38 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 14 Mar 2024 00:37:00 +0000 Subject: [PATCH 59/75] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-81388.yml | 5 -- html/changelogs/AutoChangeLog-pr-81553.yml | 5 -- html/changelogs/AutoChangeLog-pr-81773.yml | 5 -- html/changelogs/AutoChangeLog-pr-81818.yml | 8 --- html/changelogs/AutoChangeLog-pr-81819.yml | 5 -- html/changelogs/AutoChangeLog-pr-81829.yml | 4 -- html/changelogs/AutoChangeLog-pr-81875.yml | 4 -- html/changelogs/AutoChangeLog-pr-81907.yml | 4 -- html/changelogs/AutoChangeLog-pr-81913.yml | 5 -- html/changelogs/AutoChangeLog-pr-81921.yml | 4 -- html/changelogs/AutoChangeLog-pr-81922.yml | 4 -- html/changelogs/AutoChangeLog-pr-81933.yml | 4 -- html/changelogs/AutoChangeLog-pr-81935.yml | 5 -- html/changelogs/AutoChangeLog-pr-81941.yml | 4 -- html/changelogs/AutoChangeLog-pr-81953.yml | 5 -- html/changelogs/AutoChangeLog-pr-81956.yml | 4 -- html/changelogs/AutoChangeLog-pr-81957.yml | 4 -- html/changelogs/AutoChangeLog-pr-81958.yml | 4 -- html/changelogs/AutoChangeLog-pr-81967.yml | 4 -- html/changelogs/AutoChangeLog-pr-81968.yml | 4 -- html/changelogs/AutoChangeLog-pr-81971.yml | 5 -- html/changelogs/archive/2024-03.yml | 69 ++++++++++++++++++++++ 22 files changed, 69 insertions(+), 96 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-81388.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81553.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81773.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81818.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81819.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81829.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81875.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81907.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81913.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81921.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81922.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81933.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81935.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81941.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81953.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81956.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81957.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81958.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81967.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81968.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81971.yml diff --git a/html/changelogs/AutoChangeLog-pr-81388.yml b/html/changelogs/AutoChangeLog-pr-81388.yml deleted file mode 100644 index bc8777db1b332..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81388.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - rscadd: "Added a Skub-related station trait. You can now choose if you want to be pro-skub or anti-skub, complete of shirt and stickers. Please don't shank each other over it." - - balance: "Halved the weight of station traits such as scarves, wallets and glitched PDAs." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81553.yml b/html/changelogs/AutoChangeLog-pr-81553.yml deleted file mode 100644 index 53037f4542c93..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81553.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - balance: "Buffed the duration of the SC/FISHER Saboteur Handgun's disruption effects. It's also stealthier and it won't conspiciously alert living mobs hit by it." - - rscadd: "Added saboteur interactions with radios, pAIs, turrets, secbots and APCs." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81773.yml b/html/changelogs/AutoChangeLog-pr-81773.yml deleted file mode 100644 index ade57130c1824..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81773.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "starrm4nn" -delete-after: True -changes: - - balance: "Ephedrine spasms won't affect small or tiny items" - - balance: "Ephedrine's movement speed bonus now scales with purity." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81818.yml b/html/changelogs/AutoChangeLog-pr-81818.yml deleted file mode 100644 index d75b68a1f847c..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81818.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed the \"Fenced Goods\" black market category." - - balance: "Removed the LTSRBT from cargo and added it to the blackmarket, reduced the price from 4000 to 625 on average." - - balance: "The time it takes for captured mobs to be automatically sent back to the station from the holding facility has been increased from 3-4 minutes to 6." - - rscadd: "You can buy mobs captured by contractors, traitors and pirates from the black market and have them sent back to the station in advance. For safety, they'll also be handcuffed (not always) upon delivery." - - rscadd: "Human mobs sold by pirates are not deleted anymore. Instead, they're now captured and sent to the holding facility." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81819.yml b/html/changelogs/AutoChangeLog-pr-81819.yml deleted file mode 100644 index ba8d3d2c3ed3b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81819.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - balance: "Thermal pistols can now be 'cranked' to recharge shots. You must have a holster equipped in order to utilize this feature. Also, they have a tighter dual-wield cone." - - balance: "Thermal pistol crates are now 2000 credits, up from 1400 credits." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81829.yml b/html/changelogs/AutoChangeLog-pr-81829.yml deleted file mode 100644 index 45ca1a491c2ee..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81829.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ValuedEmployee" -delete-after: True -changes: - - rscadd: "Added Moffers as a crafting recipe in the entertainment section." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81875.yml b/html/changelogs/AutoChangeLog-pr-81875.yml deleted file mode 100644 index 1296287b298e2..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81875.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "IndieanaJones" -delete-after: True -changes: - - balance: "Max level Summon Simians now grants the wizard a free gorilla transformation spell as opposed to allowing the wizard to summon fully-grown gorillas." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81907.yml b/html/changelogs/AutoChangeLog-pr-81907.yml deleted file mode 100644 index f9cf994bf444f..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81907.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Pickle-Coding" -delete-after: True -changes: - - bugfix: "Prevent runtime from humans with biowares gettingn deleted." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81913.yml b/html/changelogs/AutoChangeLog-pr-81913.yml deleted file mode 100644 index 2ffc617ce4164..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81913.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "NumberInput(used in chem heater, plumbing reaction chamber etc) highlighting & editing requires only single click like before" - - refactor: "Typescript conversion for NumberInput TGUI Component" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81921.yml b/html/changelogs/AutoChangeLog-pr-81921.yml deleted file mode 100644 index 5bef329718e73..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81921.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed the larva \"hide\" ability not properly hiding larvas under tables." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81922.yml b/html/changelogs/AutoChangeLog-pr-81922.yml deleted file mode 100644 index 29b776e6180b2..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81922.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Justice12354" -delete-after: True -changes: - - spellcheck: "Fixed grammar and formatting on the description of friendly elite mining mobs." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81933.yml b/html/changelogs/AutoChangeLog-pr-81933.yml deleted file mode 100644 index 3d14553472d6d..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81933.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "Clicking sub sections in the design menu of lathe's UIs will auto scroll to them." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81935.yml b/html/changelogs/AutoChangeLog-pr-81935.yml deleted file mode 100644 index 15adf973bf014..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81935.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ArcaneMusic" -delete-after: True -changes: - - bugfix: "Ore vents have to be scanned while standing next to them." - - bugfix: "Menacing ore vents now correctly only spawn in a node drone after the boss is defeated, instead of before." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81941.yml b/html/changelogs/AutoChangeLog-pr-81941.yml deleted file mode 100644 index 878d01ae227bd..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81941.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Rhials" -delete-after: True -changes: - - balance: "Irradiated meteors now hit harder and leave behind radioactive goop." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81953.yml b/html/changelogs/AutoChangeLog-pr-81953.yml deleted file mode 100644 index 61329d143849b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81953.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "00-Steven" -delete-after: True -changes: - - bugfix: "Fuck you coupons ACTUALLY trigger only once again. As a consequence, they also burn up when expended for their one-time fuck you." - - bugfix: "Fuck you coupons work regardless of whether you had a free hand or not." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81956.yml b/html/changelogs/AutoChangeLog-pr-81956.yml deleted file mode 100644 index 37060c8a35619..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81956.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ArcaneMusic" -delete-after: True -changes: - - image: "Your station's standard issue E-219 laser turrets within the AI upload and AI satellite have been updated to a newer, shinier model." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81957.yml b/html/changelogs/AutoChangeLog-pr-81957.yml deleted file mode 100644 index f0697eef7ba89..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81957.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Derpguy3" -delete-after: True -changes: - - bugfix: "A missing recharger has been added into science's testing range on Birdshot station." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81958.yml b/html/changelogs/AutoChangeLog-pr-81958.yml deleted file mode 100644 index 374e685b5a019..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81958.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "intercepti0n" -delete-after: True -changes: - - image: "Resprited T-ray & Geiger counter." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81967.yml b/html/changelogs/AutoChangeLog-pr-81967.yml deleted file mode 100644 index f2515e2ef2f7f..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81967.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "00-Steven" -delete-after: True -changes: - - bugfix: "Buttons let you take out their electronics again, hooray." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81968.yml b/html/changelogs/AutoChangeLog-pr-81968.yml deleted file mode 100644 index ad81ed2e48d51..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81968.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "search bars don't swallow characters or lag behind your typing speed" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81971.yml b/html/changelogs/AutoChangeLog-pr-81971.yml deleted file mode 100644 index 2c8cbd016211a..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81971.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Jacquerel" -delete-after: True -changes: - - balance: "All materials except glass are now worth more gulag points than before." - - balance: "Mining skill decreases the time it takes to break boulders, and makes it less tiring." \ No newline at end of file diff --git a/html/changelogs/archive/2024-03.yml b/html/changelogs/archive/2024-03.yml index 36bb09aecc786..e8ac03c6d7f60 100644 --- a/html/changelogs/archive/2024-03.yml +++ b/html/changelogs/archive/2024-03.yml @@ -382,3 +382,72 @@ vinylspiders: - bugfix: fixes a spurious CI runtime caused by explosive mines quite literally blowing up the unit test area +2024-03-14: + 00-Steven: + - bugfix: Buttons let you take out their electronics again, hooray. + - bugfix: Fuck you coupons ACTUALLY trigger only once again. As a consequence, they + also burn up when expended for their one-time fuck you. + - bugfix: Fuck you coupons work regardless of whether you had a free hand or not. + ArcaneMusic: + - bugfix: Ore vents have to be scanned while standing next to them. + - bugfix: Menacing ore vents now correctly only spawn in a node drone after the + boss is defeated, instead of before. + - image: Your station's standard issue E-219 laser turrets within the AI upload + and AI satellite have been updated to a newer, shinier model. + Derpguy3: + - bugfix: A missing recharger has been added into science's testing range on Birdshot + station. + Ghommie: + - rscadd: Added a Skub-related station trait. You can now choose if you want to + be pro-skub or anti-skub, complete of shirt and stickers. Please don't shank + each other over it. + - balance: Halved the weight of station traits such as scarves, wallets and glitched + PDAs. + - balance: Buffed the duration of the SC/FISHER Saboteur Handgun's disruption effects. + It's also stealthier and it won't conspiciously alert living mobs hit by it. + - rscadd: Added saboteur interactions with radios, pAIs, turrets, secbots and APCs. + - bugfix: Fixed the larva "hide" ability not properly hiding larvas under tables. + - bugfix: Fixed the "Fenced Goods" black market category. + - balance: Removed the LTSRBT from cargo and added it to the blackmarket, reduced + the price from 4000 to 625 on average. + - balance: The time it takes for captured mobs to be automatically sent back to + the station from the holding facility has been increased from 3-4 minutes to + 6. + - rscadd: You can buy mobs captured by contractors, traitors and pirates from the + black market and have them sent back to the station in advance. For safety, + they'll also be handcuffed (not always) upon delivery. + - rscadd: Human mobs sold by pirates are not deleted anymore. Instead, they're now + captured and sent to the holding facility. + IndieanaJones: + - balance: Max level Summon Simians now grants the wizard a free gorilla transformation + spell as opposed to allowing the wizard to summon fully-grown gorillas. + Jacquerel: + - balance: All materials except glass are now worth more gulag points than before. + - balance: Mining skill decreases the time it takes to break boulders, and makes + it less tiring. + Justice12354: + - spellcheck: Fixed grammar and formatting on the description of friendly elite + mining mobs. + Pickle-Coding: + - bugfix: Prevent runtime from humans with biowares gettingn deleted. + Rhials: + - balance: Irradiated meteors now hit harder and leave behind radioactive goop. + SyncIt21: + - bugfix: search bars don't swallow characters or lag behind your typing speed + - bugfix: Clicking sub sections in the design menu of lathe's UIs will auto scroll + to them. + - bugfix: NumberInput(used in chem heater, plumbing reaction chamber etc) highlighting + & editing requires only single click like before + - refactor: Typescript conversion for NumberInput TGUI Component + ValuedEmployee: + - rscadd: Added Moffers as a crafting recipe in the entertainment section. + intercepti0n: + - image: Resprited T-ray & Geiger counter. + necromanceranne: + - balance: Thermal pistols can now be 'cranked' to recharge shots. You must have + a holster equipped in order to utilize this feature. Also, they have a tighter + dual-wield cone. + - balance: Thermal pistol crates are now 2000 credits, up from 1400 credits. + starrm4nn: + - balance: Ephedrine spasms won't affect small or tiny items + - balance: Ephedrine's movement speed bonus now scales with purity. From 405d369694ee924d19768a875d2440ed569dace6 Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Wed, 13 Mar 2024 20:41:56 -0400 Subject: [PATCH 60/75] Crushers and PKAs: Coop Upgrades (#81940) ## About The Pull Request This PR makes 2 changes, one to the crusher and one to the PKA Crushers: Their projectile no longer overrides eachother, so a mob can have the blue bubble from several crushers. Triggering it will only trigger the one that you own, so each player has to go hit the mob to strike. PKA: Fixed the minebot passthrough upgrade, and also adds a human passthrough upgrade. They are incompatible with eachother, so you choose between solo+minebot or coop, which is a compromise I thought as a better alternative to taking mod space (the minebot passthrough currently takes none). This upgrade is available solely at the mining vendor, for 750 points. ## Why It's Good For The Game The new mining has been great, and one thing I love is that it encourages more coop play. Excavating boulders with other miners is much more engaging and has good teamwork in it, and also is a good way to encourage miners to stick together more and even fight megafauna in pairs. This hopes to make that easier to do, because currently having anyone with a crusher is sort of a detriment to the whole team. Either the PKA dude will accidentally shoot the crusher user while they're going in for a melee kill, or 2 crusher users will be constantly erasing the mark of the other. This will hopefully make that aspect better, and make mining with friends a little better. ## Changelog :cl: balance: Crusher marks no longer overwrite eachother, fauna can have one from each crusher. balance: Ash drake's crusher trophy no longer affects people the same faction as you (like hiero trophy), so you won't friendly fire people with it. add: Added a new upgrade: Human Passthrough. You can shoot your PKA without having to worry about friendly fire with this, for 750 mining points at your mining vendor. fix: Minebot passthrough upgrade now properly makes PKAs pass through minebots. /:cl: --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> --- .../status_effects/_status_effect_helpers.dm | 13 +- code/datums/status_effects/debuffs/debuffs.dm | 8 +- .../orders/order_items/mining/order_pka.dm | 4 + .../mining/equipment/kinetic_crusher.dm | 186 ++++++++++-------- .../hostile/megafauna/hierophant.dm | 1 + .../guns/energy/kinetic_accelerator.dm | 77 +++++--- code/modules/projectiles/projectile.dm | 2 +- 7 files changed, 172 insertions(+), 119 deletions(-) diff --git a/code/datums/status_effects/_status_effect_helpers.dm b/code/datums/status_effects/_status_effect_helpers.dm index 0ee9522006106..f887afd91428e 100644 --- a/code/datums/status_effects/_status_effect_helpers.dm +++ b/code/datums/status_effects/_status_effect_helpers.dm @@ -56,7 +56,7 @@ . = FALSE for(var/datum/status_effect/existing_effect as anything in status_effects) - if(existing_effect.id == initial(removed_effect.id) && existing_effect.before_remove(arguments)) + if(existing_effect.id == initial(removed_effect.id) && existing_effect.before_remove(arglist(arguments))) qdel(existing_effect) . = TRUE @@ -84,6 +84,17 @@ return null +///Gets every status effect of an ID and returns all of them in a list, rather than the individual 'has_status_effect' +/mob/living/proc/get_all_status_effect_of_id(datum/status_effect/checked_effect) + RETURN_TYPE(/list/datum/status_effect) + + var/list/all_effects_of_type = list() + for(var/datum/status_effect/present_effect as anything in status_effects) + if(present_effect.id == initial(checked_effect.id)) + all_effects_of_type += present_effect + + return all_effects_of_type + /** * Checks if this mob has a status effect that shares the passed effect's ID * and has the passed sources are in its list of sources (ONLY works for grouped efects!) diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 74eb198cfcec9..17963bbb40953 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -343,7 +343,7 @@ /datum/status_effect/crusher_mark id = "crusher_mark" duration = 300 //if you leave for 30 seconds you lose the mark, deal with it - status_type = STATUS_EFFECT_REPLACE + status_type = STATUS_EFFECT_MULTIPLE alert_type = null var/mutable_appearance/marked_underlay var/obj/item/kinetic_crusher/hammer_synced @@ -370,9 +370,9 @@ QDEL_NULL(marked_underlay) return ..() -/datum/status_effect/crusher_mark/be_replaced() - owner.underlays -= marked_underlay //if this is being called, we should have an owner at this point. - ..() +//we will only clear ourselves if the crusher is the one that owns us. +/datum/status_effect/crusher_mark/before_remove(obj/item/kinetic_crusher/attacking_hammer) + return (attacking_hammer == hammer_synced) /datum/status_effect/stacking/saw_bleed id = "saw_bleed" diff --git a/code/game/machinery/computer/orders/order_items/mining/order_pka.dm b/code/game/machinery/computer/orders/order_items/mining/order_pka.dm index 251343e6f8e2c..f239e9f2a7eaf 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_pka.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_pka.dm @@ -40,3 +40,7 @@ /datum/orderable_item/accelerator/minebot_passthrough item_path = /obj/item/borg/upgrade/modkit/minebot_passthrough cost_per_order = 800 + +/datum/orderable_item/accelerator/friendly_fire + item_path = /obj/item/borg/upgrade/modkit/human_passthrough + cost_per_order = 750 diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 6a6df5452bd54..92ded187109fb 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -1,4 +1,10 @@ -/*********************Mining Hammer****************/ +/** + * Kinetic Crusher + * + * Lavaland's "Hard Mode" option for players, requiring melee attacks (backstabs even better), + * but allowing you to upgrade it with trophies gained from fighting lavaland monsters, making it + * a good tradeoff and a decent playstyle. + */ /obj/item/kinetic_crusher icon = 'icons/obj/mining.dmi' icon_state = "crusher" @@ -6,8 +12,9 @@ lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi' name = "proto-kinetic crusher" - desc = "An early design of the proto-kinetic accelerator, it is little more than a combination of various mining tools cobbled together, forming a high-tech club. \ - While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna." + desc = "An early design of the proto-kinetic accelerator, it is little more than a combination of various mining tools cobbled together, \ + forming a high-tech club. While it is an effective mining tool, it did little to aid any but the most skilled and/or \ + suicidal miners against local fauna." force = 0 //You can't hit stuff unless wielded w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK @@ -26,9 +33,10 @@ light_power = 1.2 light_color = "#ffff66" light_on = FALSE - var/list/trophies = list() + ///List of all crusher trophies attached to this. + var/list/obj/item/crusher_trophy/trophies = list() var/charged = TRUE - var/charge_time = 15 + var/charge_time = 1.5 SECONDS var/detonation_damage = 50 var/backstab_bonus = 30 @@ -54,75 +62,81 @@ . = ..() . += span_notice("Mark a large creature with a destabilizing force with right-click, then hit them in melee to do [force + detonation_damage] damage.") . += span_notice("Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage].") - for(var/t in trophies) - var/obj/item/crusher_trophy/T = t - . += span_notice("It has \a [T] attached, which causes [T.effect_desc()].") - -/obj/item/kinetic_crusher/attackby(obj/item/I, mob/living/user) - if(I.tool_behaviour == TOOL_CROWBAR) - if(LAZYLEN(trophies)) - to_chat(user, span_notice("You remove [src]'s trophies.")) - I.play_tool_sound(src) - for(var/t in trophies) - var/obj/item/crusher_trophy/T = t - T.remove_from(src, user) - else - to_chat(user, span_warning("There are no trophies on [src].")) - else if(istype(I, /obj/item/crusher_trophy)) - var/obj/item/crusher_trophy/T = I - T.add_to(src, user) - else - return ..() + for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies) + . += span_notice("It has \a [crusher_trophy] attached, which causes [crusher_trophy.effect_desc()].") + +/obj/item/kinetic_crusher/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/crusher_trophy)) + var/obj/item/crusher_trophy/crusher_trophy = attacking_item + crusher_trophy.add_to(src, user) + return + return ..() + +/obj/item/kinetic_crusher/crowbar_act(mob/living/user, obj/item/tool) + . = ..() + if(!LAZYLEN(trophies)) + user.balloon_alert(user, "no trophies!") + return ITEM_INTERACT_BLOCKING + user.balloon_alert(user, "trophies removed") + tool.play_tool_sound(src) + for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies) + crusher_trophy.remove_from(src, user) + return ITEM_INTERACT_SUCCESS /obj/item/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user) if(!HAS_TRAIT(src, TRAIT_WIELDED)) to_chat(user, span_warning("[src] is too heavy to use with one hand! You fumble and drop everything.")) user.drop_all_held_items() return - var/datum/status_effect/crusher_damage/C = target.has_status_effect(/datum/status_effect/crusher_damage) - if(!C) - C = target.apply_status_effect(/datum/status_effect/crusher_damage) + var/datum/status_effect/crusher_damage/crusher_damage_effect = target.has_status_effect(/datum/status_effect/crusher_damage) + if(!crusher_damage_effect) + crusher_damage_effect = target.apply_status_effect(/datum/status_effect/crusher_damage) var/target_health = target.health ..() - for(var/t in trophies) + for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies) if(!QDELETED(target)) - var/obj/item/crusher_trophy/T = t - T.on_melee_hit(target, user) - if(!QDELETED(C) && !QDELETED(target)) - C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did - -/obj/item/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams) - if(proximity_flag && isliving(target)) - var/mob/living/L = target - var/datum/status_effect/crusher_mark/CM = L.has_status_effect(/datum/status_effect/crusher_mark) - if(!CM || CM.hammer_synced != src || !L.remove_status_effect(/datum/status_effect/crusher_mark)) - return - var/datum/status_effect/crusher_damage/C = L.has_status_effect(/datum/status_effect/crusher_damage) - if(!C) - C = L.apply_status_effect(/datum/status_effect/crusher_damage) - var/target_health = L.health - for(var/t in trophies) - var/obj/item/crusher_trophy/T = t - T.on_mark_detonation(target, user) - if(!QDELETED(L)) - if(!QDELETED(C)) - C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did - new /obj/effect/temp_visual/kinetic_blast(get_turf(L)) - var/backstabbed = FALSE - var/combined_damage = detonation_damage - var/backstab_dir = get_dir(user, L) - var/def_check = L.getarmor(type = BOMB) - if((user.dir & backstab_dir) && (L.dir & backstab_dir)) - backstabbed = TRUE - combined_damage += backstab_bonus - playsound(user, 'sound/weapons/kinetic_accel.ogg', 100, TRUE) //Seriously who spelled it wrong - - if(!QDELETED(C)) - C.total_damage += combined_damage - - - SEND_SIGNAL(user, COMSIG_LIVING_CRUSHER_DETONATE, L, src, backstabbed) - L.apply_damage(combined_damage, BRUTE, blocked = def_check) + crusher_trophy.on_melee_hit(target, user) + if(!QDELETED(crusher_damage_effect) && !QDELETED(target)) + crusher_damage_effect.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did + +/obj/item/kinetic_crusher/afterattack(mob/living/target, mob/living/user, proximity_flag, clickparams) + . = ..() + if(.) + return + if(!proximity_flag || !isliving(target)) + return + var/valid_crusher_attack = FALSE + for(var/datum/status_effect/crusher_mark/crusher_mark_effect as anything in target.get_all_status_effect_of_id(/datum/status_effect/crusher_mark)) + //this will erase ALL crusher marks, not only ones by you. + if(crusher_mark_effect.hammer_synced != src || !target.remove_status_effect(/datum/status_effect/crusher_mark, src)) + continue + valid_crusher_attack = TRUE + break + if(!valid_crusher_attack) + return + var/datum/status_effect/crusher_damage/crusher_damage_effect = target.has_status_effect(/datum/status_effect/crusher_damage) + if(!crusher_damage_effect) + crusher_damage_effect = target.apply_status_effect(/datum/status_effect/crusher_damage) + var/target_health = target.health + for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies) + crusher_trophy.on_mark_detonation(target, user) + if(QDELETED(target)) + return + if(!QDELETED(crusher_damage_effect)) + crusher_damage_effect.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did + new /obj/effect/temp_visual/kinetic_blast(get_turf(target)) + var/backstabbed = FALSE + var/combined_damage = detonation_damage + var/backstab_dir = get_dir(user, target) + var/def_check = target.getarmor(type = BOMB) + if((user.dir & backstab_dir) && (target.dir & backstab_dir)) + backstabbed = TRUE + combined_damage += backstab_bonus + playsound(user, 'sound/weapons/kinetic_accel.ogg', 100, TRUE) //Seriously who spelled it wrong + if(!QDELETED(crusher_damage_effect)) + crusher_damage_effect.total_damage += combined_damage + SEND_SIGNAL(user, COMSIG_LIVING_CRUSHER_DETONATE, target, src, backstabbed) + target.apply_damage(combined_damage, BRUTE, blocked = def_check) /obj/item/kinetic_crusher/attack_secondary(atom/target, mob/living/user, clickparams) return SECONDARY_ATTACK_CONTINUE_CHAIN @@ -155,9 +169,9 @@ destabilizer.fire() charged = FALSE update_appearance() - addtimer(CALLBACK(src, PROC_REF(Recharge)), charge_time) + addtimer(CALLBACK(src, PROC_REF(recharge_projectile)), charge_time) -/obj/item/kinetic_crusher/proc/Recharge() +/obj/item/kinetic_crusher/proc/recharge_projectile() if(!charged) charged = TRUE update_appearance() @@ -197,6 +211,7 @@ armor_flag = BOMB range = 6 log_override = TRUE + ///The crusher that's firing this projectile. var/obj/item/kinetic_crusher/hammer_synced /obj/projectile/destabilizer/Destroy() @@ -205,19 +220,21 @@ /obj/projectile/destabilizer/on_hit(atom/target, blocked = 0, pierce_hit) if(isliving(target)) - var/mob/living/L = target - var/had_effect = (L.has_status_effect(/datum/status_effect/crusher_mark)) //used as a boolean - var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(/datum/status_effect/crusher_mark, hammer_synced) - if(hammer_synced) - for(var/t in hammer_synced.trophies) - var/obj/item/crusher_trophy/T = t - T.on_mark_application(target, CM, had_effect) + var/mob/living/living_target = target + var/has_mark_from_this_crusher = FALSE + for(var/datum/status_effect/crusher_mark/crusher_mark_effect as anything in living_target.get_all_status_effect_of_id(/datum/status_effect/crusher_mark)) + if(crusher_mark_effect.hammer_synced != hammer_synced) + continue + has_mark_from_this_crusher = TRUE + break + if(!has_mark_from_this_crusher) + living_target.apply_status_effect(/datum/status_effect/crusher_mark, hammer_synced) var/target_turf = get_turf(target) if(ismineralturf(target_turf)) - var/turf/closed/mineral/M = target_turf - new /obj/effect/temp_visual/kinetic_blast(M) - M.gets_drilled(firer) - ..() + var/turf/closed/mineral/hit_mineral = target_turf + new /obj/effect/temp_visual/kinetic_blast(hit_mineral) + hit_mineral.gets_drilled(firer) + return ..() //trophies /obj/item/crusher_trophy @@ -258,7 +275,6 @@ /obj/item/crusher_trophy/proc/on_melee_hit(mob/living/target, mob/living/user) //the target and the user /obj/item/crusher_trophy/proc/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user) //the projectile fired and the user -/obj/item/crusher_trophy/proc/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark) //the target, the mark applied, and if the target had a mark before /obj/item/crusher_trophy/proc/on_mark_detonation(mob/living/target, mob/living/user) //the target and the user //watcher @@ -350,13 +366,13 @@ return "mark detonation to do [bonus_value] damage to nearby creatures and push them back" /obj/item/crusher_trophy/tail_spike/on_mark_detonation(mob/living/target, mob/living/user) - for(var/mob/living/L in oview(2, user)) - if(L.stat == DEAD) + for(var/mob/living/living_target in oview(2, user)) + if(user.faction_check_atom(living_target) || living_target.stat == DEAD) continue - playsound(L, 'sound/magic/fireball.ogg', 20, TRUE) - new /obj/effect/temp_visual/fire(L.loc) - addtimer(CALLBACK(src, PROC_REF(pushback), L, user), 1) //no free backstabs, we push AFTER module stuff is done - L.adjustFireLoss(bonus_value, forced = TRUE) + playsound(living_target, 'sound/magic/fireball.ogg', 20, TRUE) + new /obj/effect/temp_visual/fire(living_target.loc) + addtimer(CALLBACK(src, PROC_REF(pushback), living_target, user), 1) //no free backstabs, we push AFTER module stuff is done + living_target.adjustFireLoss(bonus_value, forced = TRUE) /obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user) if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 375d4993cfdda..d7fceecf0532f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -618,6 +618,7 @@ Difficulty: Hard moving-- sleep(speed) targetturf = get_turf(target) + /obj/effect/temp_visual/hierophant/chaser/proc/make_blast() var/obj/effect/temp_visual/hierophant/blast/damaging/B = new(loc, caster, friendly_fire_check) B.damage = damage diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 7ff033d772028..b7cb05a99eaea 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -11,11 +11,13 @@ can_bayonet = TRUE knife_x_offset = 20 knife_y_offset = 12 - var/mob/holder - var/max_mod_capacity = 100 - var/list/modkits = list() gun_flags = NOT_A_REAL_GUN - + ///List of all mobs that projectiles fired from this gun will ignore. + var/list/ignored_mob_types + ///List of all modkits currently in the kinetic accelerator. + var/list/obj/item/borg/upgrade/modkit/modkits = list() + ///The max capacity of modkits the PKA can have installed at once. + var/max_mod_capacity = 100 /obj/item/gun/energy/recharge/kinetic_accelerator/Initialize(mapload) . = ..() @@ -68,18 +70,16 @@ if(max_mod_capacity) . += "[get_remaining_mod_capacity()]% mod capacity remaining." . += span_info("You can use a crowbar to remove all modules or right-click with an empty hand to remove a specific one.") - for(var/A in modkits) - var/obj/item/borg/upgrade/modkit/M = A - . += span_notice("There is \a [M] installed, using [M.cost]% capacity.") + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in modkits) + . += span_notice("There is \a [modkit_upgrade] installed, using [modkit_upgrade.cost]% capacity.") /obj/item/gun/energy/recharge/kinetic_accelerator/crowbar_act(mob/living/user, obj/item/I) . = TRUE if(modkits.len) to_chat(user, span_notice("You pry all the modifications out.")) I.play_tool_sound(src, 100) - for(var/a in modkits) - var/obj/item/borg/upgrade/modkit/M = a - M.forceMove(drop_location()) //uninstallation handled in Exited(), or /mob/living/silicon/robot/remove_from_upgrades() for borgs + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in modkits) + modkit_upgrade.forceMove(drop_location()) //uninstallation handled in Exited(), or /mob/living/silicon/robot/remove_from_upgrades() for borgs else to_chat(user, span_notice("There are no modifications currently installed.")) @@ -138,16 +138,14 @@ /obj/item/gun/energy/recharge/kinetic_accelerator/proc/get_remaining_mod_capacity() var/current_capacity_used = 0 - for(var/A in modkits) - var/obj/item/borg/upgrade/modkit/M = A - current_capacity_used += M.cost + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in modkits) + current_capacity_used += modkit_upgrade.cost return max_mod_capacity - current_capacity_used -/obj/item/gun/energy/recharge/kinetic_accelerator/proc/modify_projectile(obj/projectile/kinetic/K) - K.kinetic_gun = src //do something special on-hit, easy! - for(var/A in modkits) - var/obj/item/borg/upgrade/modkit/M = A - M.modify_projectile(K) +/obj/item/gun/energy/recharge/kinetic_accelerator/proc/modify_projectile(obj/projectile/kinetic/kinetic_projectile) + kinetic_projectile.kinetic_gun = src //do something special on-hit, easy! + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in modkits) + modkit_upgrade.modify_projectile(kinetic_projectile) /obj/item/gun/energy/recharge/kinetic_accelerator/cyborg icon_state = "kineticgun_b" @@ -193,13 +191,14 @@ return ..() /obj/projectile/kinetic/prehit_pierce(atom/target) + if(is_type_in_typecache(target, kinetic_gun.ignored_mob_types)) + return PROJECTILE_PIERCE_PHASE . = ..() if(. == PROJECTILE_PIERCE_PHASE) return if(kinetic_gun) - var/list/mods = kinetic_gun.modkits - for(var/obj/item/borg/upgrade/modkit/modkit in mods) - modkit.projectile_prehit(src, target, kinetic_gun) + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in kinetic_gun.modkits) + modkit_upgrade.projectile_prehit(src, target, kinetic_gun) if(!pressure_decrease_active && !lavaland_equipment_pressure_check(get_turf(target))) name = "weakened [name]" damage = damage * pressure_decrease @@ -219,10 +218,10 @@ target_turf = get_turf(src) if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate. var/list/mods = kinetic_gun.modkits - for(var/obj/item/borg/upgrade/modkit/M in mods) - M.projectile_strike_predamage(src, target_turf, target, kinetic_gun) - for(var/obj/item/borg/upgrade/modkit/M in mods) - M.projectile_strike(src, target_turf, target, kinetic_gun) + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in mods) + modkit_upgrade.projectile_strike_predamage(src, target_turf, target, kinetic_gun) + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in mods) + modkit_upgrade.projectile_strike(src, target_turf, target, kinetic_gun) if(ismineralturf(target_turf)) var/turf/closed/mineral/M = target_turf M.gets_drilled(firer, TRUE) @@ -284,9 +283,8 @@ return FALSE if(denied_type) var/number_of_denied = 0 - for(var/A in KA.modkits) - var/obj/item/borg/upgrade/modkit/M = A - if(istype(M, denied_type)) + for(var/obj/item/borg/upgrade/modkit/modkit_upgrade as anything in KA.modkits) + if(istype(modkit_upgrade, denied_type)) number_of_denied++ if(number_of_denied >= maximum_of_type) . = FALSE @@ -434,8 +432,31 @@ /obj/item/borg/upgrade/modkit/minebot_passthrough name = "minebot passthrough" desc = "Causes kinetic accelerator shots to pass through minebots." + denied_type = /obj/item/borg/upgrade/modkit/human_passthrough + cost = 0 + +/obj/item/borg/upgrade/modkit/minebot_passthrough/install(obj/item/gun/energy/recharge/kinetic_accelerator/KA, mob/user, transfer_to_loc) + . = ..() + LAZYADD(KA.ignored_mob_types, typecacheof(/mob/living/basic/mining_drone)) + +/obj/item/borg/upgrade/modkit/minebot_passthrough/uninstall(obj/item/gun/energy/recharge/kinetic_accelerator/KA) + . = ..() + LAZYREMOVE(KA.ignored_mob_types, typecacheof(/mob/living/basic/mining_drone)) + +/obj/item/borg/upgrade/modkit/human_passthrough + name = "human passthrough" + desc = "Causes kinetic accelerator shots to pass through humans, good for preventing friendly fire." + denied_type = /obj/item/borg/upgrade/modkit/minebot_passthrough cost = 0 +/obj/item/borg/upgrade/modkit/human_passthrough/install(obj/item/gun/energy/recharge/kinetic_accelerator/KA, mob/user, transfer_to_loc) + . = ..() + LAZYADD(KA.ignored_mob_types, typecacheof(/mob/living/carbon/human)) + +/obj/item/borg/upgrade/modkit/human_passthrough/uninstall(obj/item/gun/energy/recharge/kinetic_accelerator/KA) + . = ..() + LAZYREMOVE(KA.ignored_mob_types, typecacheof(/mob/living/carbon/human)) + //Tendril-unique modules /obj/item/borg/upgrade/modkit/cooldown/repeater name = "rapid repeater" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d1dd5364477ac..60adbfed24d6b 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -707,7 +707,7 @@ if(ismovable(A)) var/atom/movable/AM = A if(AM.throwing) - return (projectile_phasing & LETPASSTHROW)? PROJECTILE_PIERCE_PHASE : ((projectile_piercing & LETPASSTHROW)? PROJECTILE_PIERCE_HIT : PROJECTILE_PIERCE_NONE) + return (projectile_phasing & LETPASSTHROW) ? PROJECTILE_PIERCE_PHASE : ((projectile_piercing & LETPASSTHROW)? PROJECTILE_PIERCE_HIT : PROJECTILE_PIERCE_NONE) return PROJECTILE_PIERCE_NONE /obj/projectile/proc/check_ricochet(atom/A) From 1a79cb89d34010483a50735dd3bdedf4eabf2675 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 13:42:19 +1300 Subject: [PATCH 61/75] Automatic changelog for PR #81940 [ci skip] --- html/changelogs/AutoChangeLog-pr-81940.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81940.yml diff --git a/html/changelogs/AutoChangeLog-pr-81940.yml b/html/changelogs/AutoChangeLog-pr-81940.yml new file mode 100644 index 0000000000000..746d336b1b7b2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81940.yml @@ -0,0 +1,7 @@ +author: "JohnFulpWillard" +delete-after: True +changes: + - balance: "Crusher marks no longer overwrite eachother, fauna can have one from each crusher." + - balance: "Ash drake's crusher trophy no longer affects people the same faction as you (like hiero trophy), so you won't friendly fire people with it." + - rscadd: "Added a new upgrade: Human Passthrough. You can shoot your PKA without having to worry about friendly fire with this, for 750 mining points at your mining vendor." + - bugfix: "Minebot passthrough upgrade now properly makes PKAs pass through minebots." \ No newline at end of file From 18d734ef7efe3edac1925d9dd9c65f158595f748 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Thu, 14 Mar 2024 01:45:42 +0100 Subject: [PATCH 62/75] Closet Anomaly station trait. (#81393) ## About The Pull Request Well, it's a station trait that makes a small number of (non-secure) closets function as if splashed with eigenstatium (which turns them into teleportation cabins of some sort). However, they're subtler, they lack the transparency and blueish tint, and don't make sparks. This PR also demotes the Eigenstate subsystem to a singleton global datum. It doesn't fire, it doesn't init, it plain doesn't belong amongst the big boys. ## Why It's Good For The Game This should be a mildly interesting station trait. ## Changelog :cl: add: Added a 'Closet Anomaly' station trait, which links and turns a portion of the roundstart closets into impromptu teleporters. /:cl: --- .../subsystem => datums}/eigenstate.dm | 59 +++++++++++-------- code/datums/station_traits/neutral_traits.dm | 35 +++++++++++ .../chemistry/reagents/unique/eigenstasium.dm | 2 +- tgstation.dme | 2 +- 4 files changed, 70 insertions(+), 28 deletions(-) rename code/{controllers/subsystem => datums}/eigenstate.dm (66%) diff --git a/code/controllers/subsystem/eigenstate.dm b/code/datums/eigenstate.dm similarity index 66% rename from code/controllers/subsystem/eigenstate.dm rename to code/datums/eigenstate.dm index f167fdf24d1ef..3bba746320997 100644 --- a/code/controllers/subsystem/eigenstate.dm +++ b/code/datums/eigenstate.dm @@ -1,7 +1,7 @@ -///Subsystem used to teleport people to a linked web of itterative entries. If one entry is deleted, the 2 around it will forge a link instead. -SUBSYSTEM_DEF(eigenstates) - name = "Eigenstates" - flags = SS_NO_INIT | SS_NO_FIRE +GLOBAL_DATUM_INIT(eigenstate_manager, /datum/eigenstate_manager, new) + +///A singleton used to teleport people to a linked web of itterative entries. If one entry is deleted, the 2 around it will forge a link instead. +/datum/eigenstate_manager ///The list of objects that something is linked to indexed by UID var/list/eigen_targets = list() ///UID to object reference @@ -12,7 +12,7 @@ SUBSYSTEM_DEF(eigenstates) var/spark_time = 0 ///Creates a new link of targets unique to their own id -/datum/controller/subsystem/eigenstates/proc/create_new_link(targets) +/datum/eigenstate_manager/proc/create_new_link(targets, subtle = TRUE) if(length(targets) <= 1) return FALSE for(var/atom/target as anything in targets) //Clear out any connected @@ -20,40 +20,44 @@ SUBSYSTEM_DEF(eigenstates) if(!already_linked) continue if(length(eigen_targets[already_linked]) > 1) //Eigenstates are notorious for having cliques! - target.visible_message("[target] fizzes, it's already linked to something else!") + if(!subtle) + target.visible_message("[target] fizzes, it's already linked to something else!") targets -= target continue - target.visible_message("[target] fizzes, collapsing it's unique wavefunction into the others!") //If we're in a eigenlink all on our own and are open to new friends + if(!subtle) + target.visible_message("[target] fizzes, collapsing it's unique wavefunction into the others!") //If we're in a eigenlink all on our own and are open to new friends remove_eigen_entry(target) //clearup for new stuff //Do we still have targets? if(!length(targets)) return FALSE var/atom/visible_atom = targets[1] //The object that'll handle the messages if(length(targets) == 1) - visible_atom.visible_message("[targets[1]] fizzes, there's nothing it can link to!") + if(!subtle) + visible_atom.visible_message("[targets[1]] fizzes, there's nothing it can link to!") return FALSE - eigen_targets["[id_counter]"] = list() //Add to the master list + var/subtle_keyword = subtle ? "subtle" : "" + eigen_targets["[id_counter][subtle_keyword]"] = list() //Add to the master list for(var/atom/target as anything in targets) - eigen_targets["[id_counter]"] += target - eigen_id[target] = "[id_counter]" + eigen_targets["[id_counter][subtle_keyword]"] += target + eigen_id[target] = "[id_counter][subtle_keyword]" RegisterSignal(target, COMSIG_CLOSET_INSERT, PROC_REF(use_eigenlinked_atom)) RegisterSignal(target, COMSIG_QDELETING, PROC_REF(remove_eigen_entry)) - RegisterSignal(target, COMSIG_ATOM_TOOL_ACT(TOOL_WELDER), PROC_REF(tool_interact)) + if(!subtle) + RegisterSignal(target, COMSIG_ATOM_TOOL_ACT(TOOL_WELDER), PROC_REF(tool_interact)) target.RegisterSignal(target, COMSIG_EIGENSTATE_ACTIVATE, TYPE_PROC_REF(/obj/structure/closet,bust_open)) ADD_TRAIT(target, TRAIT_BANNED_FROM_CARGO_SHUTTLE, REF(src)) - var/obj/item = target - if(item) - item.color = COLOR_PERIWINKLEE //Tint the locker slightly. - item.alpha = 200 - do_sparks(3, FALSE, item) + if(!subtle) + target.add_atom_colour(COLOR_PERIWINKLEE, FIXED_COLOUR_PRIORITY) //Tint the locker slightly. + target.alpha = 200 + do_sparks(3, FALSE, target) visible_atom.visible_message("The items shimmer and fizzle, turning a shade of violet blue.") id_counter++ return TRUE ///reverts everything back to start -/datum/controller/subsystem/eigenstates/Destroy() +/datum/eigenstate_manager/eigenstates/Destroy() for(var/index in 1 to id_counter) for(var/entry in eigen_targets["[index]"]) remove_eigen_entry(entry) @@ -63,12 +67,12 @@ SUBSYSTEM_DEF(eigenstates) return ..() ///removes an object reference from the master list -/datum/controller/subsystem/eigenstates/proc/remove_eigen_entry(atom/entry) +/datum/eigenstate_manager/proc/remove_eigen_entry(atom/entry) SIGNAL_HANDLER var/id = eigen_id[entry] eigen_targets[id] -= entry eigen_id -= entry - entry.color = COLOR_WHITE + entry.remove_atom_colour(FIXED_COLOUR_PRIORITY, COLOR_PERIWINKLEE) entry.alpha = 255 UnregisterSignal(entry, list( COMSIG_QDELETING, @@ -83,13 +87,14 @@ SUBSYSTEM_DEF(eigenstates) eigen_targets -= targets ///Finds the object within the master list, then sends the thing to the object's location -/datum/controller/subsystem/eigenstates/proc/use_eigenlinked_atom(atom/object_sent_from, atom/movable/thing_to_send) +/datum/eigenstate_manager/proc/use_eigenlinked_atom(atom/object_sent_from, atom/movable/thing_to_send) SIGNAL_HANDLER var/id = eigen_id[object_sent_from] if(!id) stack_trace("[object_sent_from] attempted to eigenlink to something that didn't have a valid id!") return FALSE + var/subtle = findtext(id, "subtle") var/list/items = eigen_targets[id] var/index = (items.Find(object_sent_from))+1 //index + 1 if(!index) @@ -104,19 +109,21 @@ SUBSYSTEM_DEF(eigenstates) if(check_teleport_valid(thing_to_send, eigen_target, TELEPORT_CHANNEL_EIGENSTATE)) thing_to_send.forceMove(get_turf(eigen_target)) else - object_sent_from.balloon_alert(thing_to_send, "nothing happens!") + if(!subtle) + object_sent_from.balloon_alert(thing_to_send, "nothing happens!") return FALSE //Create ONE set of sparks for ALL times in iteration - if(spark_time != world.time) + if(!subtle && spark_time != world.time) do_sparks(5, FALSE, eigen_target) do_sparks(5, FALSE, object_sent_from) - spark_time = world.time + spark_time = world.time //Calls a special proc for the atom if needed (closets use bust_open()) SEND_SIGNAL(eigen_target, COMSIG_EIGENSTATE_ACTIVATE) - return COMPONENT_CLOSET_INSERT_INTERRUPT + if(!subtle) + return COMPONENT_CLOSET_INSERT_INTERRUPT ///Prevents tool use on the item -/datum/controller/subsystem/eigenstates/proc/tool_interact(atom/source, mob/user, obj/item/item) +/datum/eigenstate_manager/proc/tool_interact(atom/source, mob/user, obj/item/item) SIGNAL_HANDLER to_chat(user, span_notice("The unstable nature of [source] makes it impossible to use [item] on [source.p_them()]!")) return ITEM_INTERACT_BLOCKING diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index 5f38a5a53c46f..7545b2fb39582 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -363,6 +363,41 @@ show_in_report = TRUE report_message = "There sure are a lot of trees out there." +/datum/station_trait/linked_closets + name = "Closet Anomaly" + trait_type = STATION_TRAIT_NEUTRAL + show_in_report = TRUE + weight = 1 + report_message = "We've reports of high amount of trace eigenstasium on your station. Ensure that your closets are working correctly." + +/datum/station_trait/linked_closets/on_round_start() + . = ..() + var/list/roundstart_non_secure_closets = GLOB.roundstart_station_closets.Copy() + for(var/obj/structure/closet/closet in roundstart_non_secure_closets) + if(closet.secure) + roundstart_non_secure_closets -= closet + + /** + * The number of links to perform. + * Combined with 50/50 the probability of the link being triangular, the boundaries of any given + * on-station, non-secure closet being linked are as high as 1 in 7/8 and as low as 1 in 16-17, + * nearing an a mean of 1 in 9 to 11/12 the more repetitions are done. + * + * There are more than 220 roundstart closets on meta, around 150 of which aren't secure, + * so, about 13 to 17 closets will be affected by this most of the times. + */ + var/number_of_links = round(length(roundstart_non_secure_closets) * (rand(350, 450)*0.0001), 1) + for(var/repetition in 1 to number_of_links) + var/closets_left = length(roundstart_non_secure_closets) + if(closets_left < 2) + return + var/list/targets = list() + for(var/how_many in 1 to min(closets_left, rand(2,3))) + targets += pick_n_take(roundstart_non_secure_closets) + if(closets_left == 1) //there's only one closet left. Let's not leave it alone. + targets += roundstart_non_secure_closets[1] + GLOB.eigenstate_manager.create_new_link(targets) + /datum/station_trait/triple_ai name = "AI Triumvirate" trait_type = STATION_TRAIT_NEUTRAL diff --git a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm index 1cb0e6204c2e7..7c18c7e201466 100644 --- a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm +++ b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm @@ -118,4 +118,4 @@ lockers += closet if(!length(lockers)) return - SSeigenstates.create_new_link(lockers) + GLOB.eigenstate_manager.create_new_link(lockers) diff --git a/tgstation.dme b/tgstation.dme index c4d30eeb56b87..22f3828a85c3b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -631,7 +631,6 @@ #include "code\controllers\subsystem\disease.dm" #include "code\controllers\subsystem\early_assets.dm" #include "code\controllers\subsystem\economy.dm" -#include "code\controllers\subsystem\eigenstate.dm" #include "code\controllers\subsystem\events.dm" #include "code\controllers\subsystem\explosions.dm" #include "code\controllers\subsystem\fluids.dm" @@ -769,6 +768,7 @@ #include "code\datums\dna.dm" #include "code\datums\dog_fashion.dm" #include "code\datums\ductnet.dm" +#include "code\datums\eigenstate.dm" #include "code\datums\emotes.dm" #include "code\datums\ert.dm" #include "code\datums\hailer_phrase.dm" From ea3fb047c46c9534d9c0cbddd091af3876ef5794 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Thu, 14 Mar 2024 13:48:03 +1300 Subject: [PATCH 63/75] Automatic changelog for PR #81393 [ci skip] --- html/changelogs/AutoChangeLog-pr-81393.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81393.yml diff --git a/html/changelogs/AutoChangeLog-pr-81393.yml b/html/changelogs/AutoChangeLog-pr-81393.yml new file mode 100644 index 0000000000000..4585db9c2d1f7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81393.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Added a 'Closet Anomaly' station trait, which links and turns a portion of the roundstart closets into impromptu teleporters." \ No newline at end of file From 86c8df6a5567b6f117fc6627ad2044957740421f Mon Sep 17 00:00:00 2001 From: Jacquerel Date: Thu, 14 Mar 2024 13:17:46 +0000 Subject: [PATCH 64/75] [no GBP] Reference handling for Summon Simians (#81988) ## About The Pull Request I merged #81875 when there was still an open review. As penance I have completed the requested review because the PR should not actually have been merged yet. Additionally while I was there I generated different icons for both "Summon Simians" and its granted gorilla transformation spell. ![image](https://github.com/tgstation/tgstation/assets/7483112/a541bf96-f277-445a-8019-f1bb88fcf1c6) They aren't really original art, they're composites of existing sprites, but I think they look better than what they were before. ## Why It's Good For The Game This might have caused some small reference management issues if left unaddressed. ## Changelog :cl: image: Updated button icon for Summon Simians and Gorilla Transformation. /:cl: Other change isn't user-facing. --- .../spells/spell_types/conjure/simian.dm | 4 ++++ .../spells/spell_types/shapeshift/gorilla.dm | 2 +- icons/mob/actions/actions_spells.dmi | Bin 36263 -> 39439 bytes 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/spells/spell_types/conjure/simian.dm b/code/modules/spells/spell_types/conjure/simian.dm index 9306a39336526..9fef5629d0379 100644 --- a/code/modules/spells/spell_types/conjure/simian.dm +++ b/code/modules/spells/spell_types/conjure/simian.dm @@ -24,6 +24,10 @@ ) summon_amount = 4 +/datum/action/cooldown/spell/conjure/simian/Destroy() + . = ..() + QDEL_NULL(gorilla_transformation) + /datum/action/cooldown/spell/conjure/simian/level_spell(bypass_cap) . = ..() summon_amount++ // MORE, MOOOOORE diff --git a/code/modules/spells/spell_types/shapeshift/gorilla.dm b/code/modules/spells/spell_types/shapeshift/gorilla.dm index 938583f22b754..fe93c0f2bc414 100644 --- a/code/modules/spells/spell_types/shapeshift/gorilla.dm +++ b/code/modules/spells/spell_types/shapeshift/gorilla.dm @@ -2,8 +2,8 @@ /datum/action/cooldown/spell/shapeshift/gorilla name = "Gorilla Form" desc = "Take on the shape of a powerful gorilla." + button_icon_state = "return_to_monkey" invocation = "B'NA NAH-SLEMA!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE - possible_shapes = list(/mob/living/basic/gorilla) diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi index 39ea58104173c76168ab70945f164f553600739c..fb8c121218ffc4b4ff538cea68af8a60fcfc298b 100644 GIT binary patch delta 18186 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≷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 bV&?_n!5U*_qRp}t1p6txJInFaqJRgQ}7 From 1766a366cbbd57e17d5b8ac221cc78f04b271e96 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 15 Mar 2024 02:18:05 +1300 Subject: [PATCH 65/75] Automatic changelog for PR #81988 [ci skip] --- html/changelogs/AutoChangeLog-pr-81988.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81988.yml diff --git a/html/changelogs/AutoChangeLog-pr-81988.yml b/html/changelogs/AutoChangeLog-pr-81988.yml new file mode 100644 index 0000000000000..fd12f3bebb6bf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81988.yml @@ -0,0 +1,4 @@ +author: "Jacquerel" +delete-after: True +changes: + - image: "Updated button icon for Summon Simians and Gorilla Transformation." \ No newline at end of file From 66b3696abffb905e9316ef003350adc42d3a6138 Mon Sep 17 00:00:00 2001 From: Lucy Date: Thu, 14 Mar 2024 12:02:47 -0400 Subject: [PATCH 66/75] Add `LOWMEMORYMODE` versions of all the build/run tasks (#81906) ## About The Pull Request This simply adds versions of the build/run vscode tasks that add `-DLOWMEMORYMODE` when calling the build script, which compiles the server with the `LOWMEMORYMODE` define, for faster testing of features. ![image](https://github.com/tgstation/tgstation/assets/65794972/ca679fef-2415-475b-86c0-2b40757f9bc3) --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- .vscode/launch.json | 27 +++++++++++++++++++++++++++ .vscode/tasks.json | 24 ++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index 42a293a333805..bf3a209531db0 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,6 +8,13 @@ "preLaunchTask": "Build All", "dmb": "${workspaceFolder}/${command:CurrentDMB}" }, + { + "type": "byond", + "request": "launch", + "name": "Launch DreamSeeker (low memory mode)", + "preLaunchTask": "Build All (low memory mode)", + "dmb": "${workspaceFolder}/${command:CurrentDMB}" + }, { "type": "byond", "request": "launch", @@ -16,6 +23,14 @@ "dmb": "${workspaceFolder}/${command:CurrentDMB}", "dreamDaemon": true }, + { + "type": "byond", + "request": "launch", + "name": "Launch DreamDaemon (low memory mode)", + "preLaunchTask": "Build All (low memory mode)", + "dmb": "${workspaceFolder}/${command:CurrentDMB}", + "dreamDaemon": true + }, { "name": "Debug External Libraries", "type": "cppvsdbg", @@ -27,6 +42,18 @@ "-trusted" ], "preLaunchTask": "Build All" + }, + { + "name": "Debug External Libraries (low memory mode)", + "type": "cppvsdbg", + "request": "launch", + "program": "${command:dreammaker.returnDreamDaemonPath}", + "cwd": "${workspaceRoot}", + "args": [ + "${command:dreammaker.getFilenameDmb}", + "-trusted" + ], + "preLaunchTask": "Build All (low memory mode)" } ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 711a13c7846c1..18fb2fde15296 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -24,6 +24,30 @@ "dependsOn": "dm: reparse", "label": "Build All" }, + { + "type": "process", + "command": "tools/build/build", + "args": ["-DLOWMEMORYMODE"], + "windows": { + "command": ".\\tools\\build\\build.bat", + "args": ["-DLOWMEMORYMODE"] + }, + "options": { + "env": { + "DM_EXE": "${config:dreammaker.byondPath}" + } + }, + "problemMatcher": [ + "$dreammaker", + "$tsc", + "$eslint-stylish" + ], + "group": { + "kind": "build" + }, + "dependsOn": "dm: reparse", + "label": "Build All (low memory mode)" + }, { "type": "dreammaker", "dme": "tgstation.dme", From 31996c114b50fed1fb35e8f61da0e97c20a8491d Mon Sep 17 00:00:00 2001 From: 13spacemen <46101244+13spacemen@users.noreply.github.com> Date: Thu, 14 Mar 2024 22:36:08 +0500 Subject: [PATCH 67/75] [no gbp] fix span type errors with poll alerts (#81979) type mismatch due to feeding non text into span defines --- code/modules/antagonists/cult/cult_comms.dm | 2 +- code/modules/mob/transform_procs.dm | 2 +- code/modules/research/xenobiology/xenobiology.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm index 01aac3e869161..17dcdc377895f 100644 --- a/code/modules/antagonists/cult/cult_comms.dm +++ b/code/modules/antagonists/cult/cult_comms.dm @@ -147,7 +147,7 @@ asked_cultists += team_member.current var/list/yes_voters = SSpolling.poll_candidates( - question = "[span_notice(nominee)] seeks to lead your cult, do you support [nominee.p_them()]?", + question = "[span_notice(nominee.name)] seeks to lead your cult, do you support [nominee.p_them()]?", poll_time = 30 SECONDS, group = asked_cultists, alert_pic = nominee, diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 28d89cf4cb4ae..270136ddd9465 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -184,7 +184,7 @@ to_chat(src, "You are job banned from cyborg! Appeal your job ban if you want to avoid this in the future!") ghostize(FALSE) - var/mob/chosen_one = SSpolling.poll_ghosts_for_target("Do you want to play as [span_notice(src)]?", check_jobban = JOB_CYBORG, poll_time = 5 SECONDS, checked_target = src, alert_pic = src, role_name_text = "cyborg") + var/mob/chosen_one = SSpolling.poll_ghosts_for_target("Do you want to play as [span_notice(name)]?", check_jobban = JOB_CYBORG, poll_time = 5 SECONDS, checked_target = src, alert_pic = src, role_name_text = "cyborg") if(chosen_one) message_admins("[key_name_admin(chosen_one)] has taken control of ([key_name_admin(src)]) to replace a jobbanned player.") key = chosen_one.key diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index ba568c4bc74a7..d3f9c9b5a8d1e 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -709,7 +709,7 @@ balloon_alert(user, "offering...") being_used = TRUE var/mob/chosen_one = SSpolling.poll_ghosts_for_target( - question = "[span_danger(user)] is offering [span_notice(dumb_mob)] an intelligence potion! Reason: [span_boldnotice(potion_reason)]", + question = "[span_danger(user.name)] is offering [span_notice(dumb_mob.name)] an intelligence potion! Reason: [span_boldnotice(potion_reason)]", check_jobban = ROLE_SENTIENCE, poll_time = 20 SECONDS, checked_target = dumb_mob, From a0101088477b87fde4f614a095ef267a401c979b Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 15 Mar 2024 06:36:29 +1300 Subject: [PATCH 68/75] Automatic changelog for PR #81979 [ci skip] --- html/changelogs/AutoChangeLog-pr-81979.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81979.yml diff --git a/html/changelogs/AutoChangeLog-pr-81979.yml b/html/changelogs/AutoChangeLog-pr-81979.yml new file mode 100644 index 0000000000000..47198b1bc584b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81979.yml @@ -0,0 +1,4 @@ +author: "13spacemen" +delete-after: True +changes: + - bugfix: "Fixed some poll alerts runtiming" \ No newline at end of file From bd8c1aebffc4142f0f8aba4d8964625f43185092 Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Thu, 14 Mar 2024 13:43:05 -0400 Subject: [PATCH 69/75] Instrument editor now uses TGUI (#81923) ## About The Pull Request Instruments now use TGUI as their editor which is pretty cool. It's mostly a 1:1 remake of the HTML UI except I did make a change to make the playback options a little more compact, leaving some more space for the editor before you have to scroll, and some other minor things that were made to make the UI hopefully nicer to look at and mess with. When there's a song to play - While playing, Repeat section can't be edited ![image](https://github.com/tgstation/tgstation/assets/53777086/33f21ca3-98d8-4147-83e7-74e7611463e6) Help section and UI when there's no song put in ![image](https://github.com/tgstation/tgstation/assets/53777086/babd30ab-9551-448b-9fe6-24e0b0535caf) ## Why It's Good For The Game It is yet another step in finishing up https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA?view Instruments especially were in a poor spot because they didn't respect things like ``IN_USE`` to not refresh if it's not the "UI" you are on, and such. ## Changelog :cl: refactor: Instruments now use TGUI. /:cl: --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/__DEFINES/instruments.dm | 6 +- .../subsystem/processing/instruments.dm | 5 +- code/datums/ai/generic/generic_behaviors.dm | 2 +- code/modules/instruments/items.dm | 58 ++- code/modules/instruments/piano_synth.dm | 6 +- code/modules/instruments/songs/_song.dm | 26 +- code/modules/instruments/songs/editor.dm | 401 ++++++++---------- .../instruments/songs/play_synthesized.dm | 3 +- tgui/packages/tgui/components/Collapsible.tsx | 5 +- .../tgui/interfaces/InstrumentEditor.tsx | 341 +++++++++++++++ 10 files changed, 567 insertions(+), 286 deletions(-) create mode 100644 tgui/packages/tgui/interfaces/InstrumentEditor.tsx diff --git a/code/__DEFINES/instruments.dm b/code/__DEFINES/instruments.dm index fa09eee0dd799..bf54ddf1b908e 100644 --- a/code/__DEFINES/instruments.dm +++ b/code/__DEFINES/instruments.dm @@ -6,6 +6,8 @@ /// Max number of playing notes per instrument. #define CHANNELS_PER_INSTRUMENT 128 +/// Minimum length a note should ever go for +#define INSTRUMENT_MIN_TOTAL_SUSTAIN 0.1 /// Maximum length a note should ever go for #define INSTRUMENT_MAX_TOTAL_SUSTAIN (5 SECONDS) @@ -16,8 +18,8 @@ /// Minimum volume for when the sound is considered dead. #define INSTRUMENT_MIN_SUSTAIN_DROPOFF 0 -#define SUSTAIN_LINEAR 1 -#define SUSTAIN_EXPONENTIAL 2 +#define SUSTAIN_LINEAR "Linear" +#define SUSTAIN_EXPONENTIAL "Exponential" // /datum/instrument instrument_flags #define INSTRUMENT_LEGACY (1<<0) //Legacy instrument. Implies INSTRUMENT_DO_NOT_AUTOSAMPLE diff --git a/code/controllers/subsystem/processing/instruments.dm b/code/controllers/subsystem/processing/instruments.dm index acee4480b946f..1cfbb144e5f8a 100644 --- a/code/controllers/subsystem/processing/instruments.dm +++ b/code/controllers/subsystem/processing/instruments.dm @@ -20,7 +20,10 @@ PROCESSING_SUBSYSTEM_DEF(instruments) var/static/current_instrument_channels = 0 /// Single cached list for synthesizer instrument ids, so you don't have to have a new list with every synthesizer. var/static/list/synthesizer_instrument_ids - var/static/list/note_sustain_modes = list("Linear" = SUSTAIN_LINEAR, "Exponential" = SUSTAIN_EXPONENTIAL) + var/static/list/note_sustain_modes = list( + SUSTAIN_LINEAR, + SUSTAIN_EXPONENTIAL, + ) /datum/controller/subsystem/processing/instruments/Initialize() initialize_instrument_data() diff --git a/code/datums/ai/generic/generic_behaviors.dm b/code/datums/ai/generic/generic_behaviors.dm index 43e37f66e8c8a..b70375ef3933f 100644 --- a/code/datums/ai/generic/generic_behaviors.dm +++ b/code/datums/ai/generic/generic_behaviors.dm @@ -333,7 +333,7 @@ //just in case- it won't do anything if the instrument isn't playing song.stop_playing() - song.ParseSong(song_lines) + song.ParseSong(new_song = song_lines) song.repeat = 10 song.volume = song.max_volume - 10 finish_action(controller, TRUE) diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index d9a7e2f3e8b18..dcc4ef8daba3d 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -34,20 +34,7 @@ user.visible_message(span_suicide("[user] begins to play 'Gloomy Sunday'! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS -/obj/item/instrument/attack_self(mob/user) - if(!ISADVANCEDTOOLUSER(user)) - to_chat(user, span_warning("You don't have the dexterity to do this!")) - return TRUE - interact(user) - -/obj/item/instrument/interact(mob/user) - ui_interact(user) - -/obj/item/instrument/ui_interact(mob/living/user) - if(!isliving(user) || user.stat != CONSCIOUS || (HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) && !ispAI(user))) - return - - user.set_machine(src) +/obj/item/instrument/ui_interact(mob/user, datum/tgui/ui) song.ui_interact(user) /obj/item/instrument/violin @@ -130,9 +117,9 @@ . = ..() AddElement(/datum/element/spooky) -/obj/item/instrument/trumpet/spectral/attack(mob/living/carbon/C, mob/user) - playsound (src, 'sound/runtime/instruments/trombone/En4.mid', 100,1,-1) - ..() +/obj/item/instrument/trumpet/spectral/attack(mob/living/target_mob, mob/living/user, params) + playsound(src, 'sound/runtime/instruments/trombone/En4.mid', 1000, 1, -1) + return ..() /obj/item/instrument/saxophone name = "saxophone" @@ -154,9 +141,9 @@ . = ..() AddElement(/datum/element/spooky) -/obj/item/instrument/saxophone/spectral/attack(mob/living/carbon/C, mob/user) - playsound (src, 'sound/runtime/instruments/saxophone/En4.mid', 100,1,-1) - ..() +/obj/item/instrument/saxophone/spectral/attack(mob/living/target_mob, mob/living/user, params) + playsound(src, 'sound/runtime/instruments/trombone/En4.mid', 1000, 1, -1) + return ..() /obj/item/instrument/trombone name = "trombone" @@ -178,9 +165,9 @@ . = ..() AddElement(/datum/element/spooky) -/obj/item/instrument/trombone/spectral/attack(mob/living/carbon/C, mob/user) - playsound (src, 'sound/runtime/instruments/trombone/Cn4.mid', 100,1,-1) - ..() +/obj/item/instrument/trombone/spectral/attack(mob/living/target_mob, mob/living/user, params) + playsound(src, 'sound/runtime/instruments/trombone/Cn4.mid', 1000, 1, -1) + return ..() /obj/item/instrument/recorder name = "recorder" @@ -201,19 +188,24 @@ w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/instrument) -/obj/item/instrument/harmonica/proc/handle_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - if(song.playing && ismob(loc)) - to_chat(loc, span_warning("You stop playing the harmonica to talk...")) - song.playing = FALSE - -/obj/item/instrument/harmonica/equipped(mob/M, slot) +/obj/item/instrument/harmonica/equipped(mob/user, slot, initial = FALSE) . = ..() - RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + if(!(slot & slot_flags)) + return + RegisterSignal(user, COMSIG_MOB_SAY, PROC_REF(handle_speech)) -/obj/item/instrument/harmonica/dropped(mob/M) +/obj/item/instrument/harmonica/dropped(mob/user, silent = FALSE) . = ..() - UnregisterSignal(M, COMSIG_MOB_SAY) + UnregisterSignal(user, COMSIG_MOB_SAY) + +/obj/item/instrument/harmonica/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + if(!song.playing) + return + if(!ismob(loc)) + CRASH("[src] was still registered to listen in on [source] but was not found to be on their mob.") + to_chat(loc, span_warning("You stop playing the harmonica to talk...")) + song.playing = FALSE /datum/action/item_action/instrument name = "Use Instrument" diff --git a/code/modules/instruments/piano_synth.dm b/code/modules/instruments/piano_synth.dm index 71d0d96ef560d..8e107d494c779 100644 --- a/code/modules/instruments/piano_synth.dm +++ b/code/modules/instruments/piano_synth.dm @@ -148,7 +148,7 @@ stopped_playing.set_output(COMPONENT_SIGNAL) /obj/item/circuit_component/synth/proc/import_song() - synth.song.ParseSong(song.value) + synth.song.ParseSong(new_song = song.value) /obj/item/circuit_component/synth/proc/set_repetitions() synth.song.set_repeats(repetitions.value) @@ -169,7 +169,9 @@ synth.song.note_shift = clamp(note_shift.value, synth.song.note_shift_min, synth.song.note_shift_max) /obj/item/circuit_component/synth/proc/set_sustain_mode() - synth.song.sustain_mode = SSinstruments.note_sustain_modes[sustain_mode.value] + if(!(sustain_mode.value in SSinstruments.note_sustain_modes)) + return + synth.song.sustain_mode = sustain_mode.value /obj/item/circuit_component/synth/proc/set_sustain_value() switch(synth.song.sustain_mode) diff --git a/code/modules/instruments/songs/_song.dm b/code/modules/instruments/songs/_song.dm index 68039df21468e..fb0e4f087449a 100644 --- a/code/modules/instruments/songs/_song.dm +++ b/code/modules/instruments/songs/_song.dm @@ -23,11 +23,6 @@ /// Are we currently playing? var/playing = FALSE - /// Are we currently editing? - var/editing = TRUE - /// Is the help screen open? - var/help = FALSE - /// Repeats left var/repeat = 0 /// Maximum times we can repeat @@ -107,7 +102,6 @@ var/note_shift = 0 var/note_shift_min = -100 var/note_shift_max = 100 - var/can_noteshift = TRUE /// The kind of sustain we're using var/sustain_mode = SUSTAIN_LINEAR /// When a note is considered dead if it is below this in volume @@ -129,7 +123,7 @@ tempo = sanitize_tempo(tempo, TRUE) src.parent = parent if(instrument_ids) - allowed_instrument_ids = islist(instrument_ids)? instrument_ids : list(instrument_ids) + allowed_instrument_ids = islist(instrument_ids) ? instrument_ids : list(instrument_ids) if(length(allowed_instrument_ids)) set_instrument(allowed_instrument_ids[1]) hearing_mobs = list() @@ -217,8 +211,6 @@ delay_by = 0 current_chord = 1 music_player = user - if(ismob(music_player)) - updateDialog(music_player) START_PROCESSING(SSinstruments, src) /** @@ -328,12 +320,6 @@ /datum/song/proc/set_bpm(bpm) tempo = sanitize_tempo(600 / bpm) -/** - * Updates the window for our users. Override down the line. - */ -/datum/song/proc/updateDialog(mob/user) - ui_interact(user) - /datum/song/process(wait) if(!playing) return PROCESS_KILL @@ -359,7 +345,6 @@ /datum/song/proc/set_volume(volume) src.volume = clamp(round(volume, 1), max(0, min_volume), min(100, max_volume)) update_sustain() - updateDialog() /** * Setter for setting how low the volume has to get before a note is considered "dead" and dropped @@ -367,7 +352,6 @@ /datum/song/proc/set_dropoff_volume(volume) sustain_dropoff_volume = clamp(round(volume, 0.01), INSTRUMENT_MIN_SUSTAIN_DROPOFF, 100) update_sustain() - updateDialog() /** * Setter for setting exponential falloff factor. @@ -375,7 +359,6 @@ /datum/song/proc/set_exponential_drop_rate(drop) sustain_exponential_dropoff = clamp(round(drop, 0.00001), INSTRUMENT_EXP_FALLOFF_MIN, INSTRUMENT_EXP_FALLOFF_MAX) update_sustain() - updateDialog() /** * Setter for setting linear falloff duration. @@ -383,7 +366,6 @@ /datum/song/proc/set_linear_falloff_duration(duration) sustain_linear_duration = clamp(round(duration * 10, world.tick_lag), world.tick_lag, INSTRUMENT_MAX_TOTAL_SUSTAIN) update_sustain() - updateDialog() /datum/song/vv_edit_var(var_name, var_value) . = ..() @@ -401,9 +383,6 @@ // subtype for handheld instruments, like violin /datum/song/handheld -/datum/song/handheld/updateDialog(mob/user) - parent.ui_interact(user || usr) - /datum/song/handheld/should_stop_playing(atom/player) . = ..() if(. == STOP_PLAYING || . == IGNORE_INSTRUMENT_CHECKS) @@ -414,9 +393,6 @@ // subtype for stationary structures, like pianos /datum/song/stationary -/datum/song/stationary/updateDialog(mob/user) - parent.ui_interact(user || usr) - /datum/song/stationary/should_stop_playing(atom/player) . = ..() if(. == STOP_PLAYING || . == IGNORE_INSTRUMENT_CHECKS) diff --git a/code/modules/instruments/songs/editor.dm b/code/modules/instruments/songs/editor.dm index 58c0562c9b04d..927e03d055dcf 100644 --- a/code/modules/instruments/songs/editor.dm +++ b/code/modules/instruments/songs/editor.dm @@ -1,96 +1,189 @@ -/** - * Returns the HTML for the status UI for this song datum. - */ -/datum/song/proc/instrument_status_ui() - . = list() - . += "
" - . += "Current instrument: " - if(!using_instrument) - . += "[span_danger("No instrument loaded!")]
" - else - . += "[using_instrument.name]
" - . += "Playback Settings:
" - if(can_noteshift) - . += "Note Shift/Note Transpose: [note_shift] keys / [round(note_shift / 12, 0.01)] octaves
" - var/smt - var/modetext = "" +/datum/song/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "InstrumentEditor", parent.name) + ui.open() + +/datum/song/ui_host(mob/user) + return parent + +/datum/song/ui_data(mob/user) + var/list/data = ..() + data["using_instrument"] = using_instrument?.name || "No instrument loaded!" + data["note_shift"] = note_shift + data["octaves"] = round(note_shift / 12, 0.01) + data["sustain_mode"] = sustain_mode switch(sustain_mode) if(SUSTAIN_LINEAR) - smt = "Linear" - modetext = "Linear Sustain Duration: [sustain_linear_duration / 10] seconds
" + data["sustain_mode_button"] = "Linear Sustain Duration (in seconds)" + data["sustain_mode_duration"] = sustain_linear_duration / 10 + data["sustain_mode_min"] = INSTRUMENT_MIN_TOTAL_SUSTAIN + data["sustain_mode_max"] = INSTRUMENT_MAX_TOTAL_SUSTAIN if(SUSTAIN_EXPONENTIAL) - smt = "Exponential" - modetext = "Exponential Falloff Factor: [sustain_exponential_dropoff]% per decisecond
" - . += "Sustain Mode: [smt]
" - . += modetext - . += using_instrument?.ready()? "Status: Ready
" : "Status: !Instrument Definition Error!
" - . += "Instrument Type: [legacy? "Legacy" : "Synthesized"]
" - . += "Volume: [volume]
" - . += "Volume Dropoff Threshold: [sustain_dropoff_volume]
" - . += "Sustain indefinitely last held note: [full_sustain_held_note? "Enabled" : "Disabled"].
" - . += "
" - -/datum/song/ui_interact(mob/user) - var/list/dat = list() - - dat += instrument_status_ui() - - if(lines.len > 0) - dat += "

Playback

" - if(!playing) - dat += "Play Stop

" - dat += "Repeat Song: " - dat += repeat > 0 ? "--" : "--" - dat += " [repeat] times " - dat += repeat < max_repeats ? "++" : "++" - dat += "
" - else - dat += "Play Stop
" - dat += "Repeats left: [repeat]
" - if(!editing) - dat += "
Show Editor
" - else - dat += "

Editing

" - dat += "Hide Editor" - dat += " Start a New Song" - dat += " Import a Song

" - var/bpm = round(600 / tempo) - dat += "Tempo: - [bpm] BPM +

" - var/linecount = 0 - for(var/line in lines) - linecount += 1 - dat += "Line [linecount]: Edit X [line]
" - dat += "Add Line

" - if(help) - dat += "Hide Help
" - dat += {" - Lines are a series of chords, separated by commas (,), each with notes separated by hyphens (-).
- Every note in a chord will play together, with chord timed by the tempo.
-
- Notes are played by the names of the note, and optionally, the accidental, and/or the octave number.
- By default, every note is natural and in octave 3. Defining otherwise is remembered for each note.
- Example: C,D,E,F,G,A,B will play a C major scale.
- After a note has an accidental placed, it will be remembered: C,C4,C,C3 is C3,C4,C4,C3
- Chords can be played simply by seperating each note with a hyphon: A-C#,Cn-E,E-G#,Gn-B
- A pause may be denoted by an empty chord: C,E,,C,G
- To make a chord be a different time, end it with /x, where the chord length will be length
- defined by tempo / x: C,G/2,E/4
- Combined, an example is: E-E4/4,F#/2,G#/8,B/8,E3-E4/4 -
- Lines may be up to [MUSIC_MAXLINECHARS] characters.
- A song may only contain up to [MUSIC_MAXLINES] lines.
- "} - else - dat += "Show Help
" - - var/datum/browser/popup = new(user, "instrument", parent?.name || "instrument", 700, 500) - popup.set_content(dat.Join("")) - popup.open() + data["sustain_mode_button"] = "Exponential Falloff Factor (% per decisecond)" + data["sustain_mode_duration"] = sustain_exponential_dropoff + data["sustain_mode_min"] = INSTRUMENT_EXP_FALLOFF_MIN + data["sustain_mode_max"] = INSTRUMENT_EXP_FALLOFF_MAX + data["instrument_ready"] = using_instrument?.ready() + data["volume"] = volume + data["volume_dropoff_threshold"] = sustain_dropoff_volume + data["sustain_indefinitely"] = full_sustain_held_note + data["playing"] = playing + data["repeat"] = repeat + data["bpm"] = round(60 SECONDS / tempo) + data["lines"] = list() + var/linecount + for(var/line in lines) + linecount++ + data["lines"] += list(list( + "line_count" = linecount, + "line_text" = line, + )) + return data + +/datum/song/ui_static_data(mob/user) + var/list/data = ..() + data["can_switch_instrument"] = (length(allowed_instrument_ids) > 1) + data["possible_instruments"] = list() + for(var/instrument in allowed_instrument_ids) + UNTYPED_LIST_ADD(data["possible_instruments"], list("name" = SSinstruments.instrument_data[instrument], "id" = instrument)) + data["sustain_modes"] = SSinstruments.note_sustain_modes + data["max_repeats"] = max_repeats + data["min_volume"] = min_volume + data["max_volume"] = max_volume + data["note_shift_min"] = note_shift_min + data["note_shift_max"] = note_shift_max + data["max_line_chars"] = MUSIC_MAXLINECHARS + data["max_lines"] = MUSIC_MAXLINES + return data + +/datum/song/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + var/mob/user = ui.user + if(!istype(user)) + return FALSE + + switch(action) + //SETTINGS + if("play_music") + if(!playing) + INVOKE_ASYNC(src, PROC_REF(start_playing), user) + else + stop_playing() + return TRUE + if("change_instrument") + var/new_instrument = params["new_instrument"] + //only one instrument, so no need to bother changing it. + if(!length(allowed_instrument_ids)) + return FALSE + if(!(new_instrument in allowed_instrument_ids)) + return FALSE + set_instrument(new_instrument) + return TRUE + if("tempo") + var/move_direction = params["tempo_change"] + var/tempo_diff + if(move_direction == "increase_speed") + tempo_diff = world.tick_lag + else + tempo_diff = -world.tick_lag + tempo = sanitize_tempo(tempo + tempo_diff) + return TRUE + + //SONG MAKING + if("import_song") + var/song_text = "" + do + song_text = tgui_input_text(user, "Please paste the entire song, formatted:", name, max_length = (MUSIC_MAXLINES * MUSIC_MAXLINECHARS)) + if(!in_range(parent, user)) + return + if(length_char(song_text) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS) + var/should_continue = tgui_alert(user, "Your message is too long! Would you like to continue editing it?", "Warning", list("Yes", "No")) + if(should_continue != "Yes") + break + while(length_char(song_text) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS) + ParseSong(user, song_text) + return TRUE + if("start_new_song") + name = "" + lines = new() + tempo = sanitize_tempo(5) // default 120 BPM + return TRUE + if("add_new_line") + var/newline = tgui_input_text(user, "Enter your line", parent.name) + if(!newline || !in_range(parent, user)) + return + if(lines.len > MUSIC_MAXLINES) + return + if(length(newline) > MUSIC_MAXLINECHARS) + newline = copytext(newline, 1, MUSIC_MAXLINECHARS) + lines.Add(newline) + if("delete_line") + var/line_to_delete = params["line_deleted"] + if(line_to_delete > lines.len || line_to_delete < 1) + return FALSE + lines.Cut(line_to_delete, line_to_delete + 1) + return TRUE + if("modify_line") + var/line_to_edit = params["line_editing"] + if(line_to_edit > lines.len || line_to_edit < 1) + return FALSE + var/new_line_text = tgui_input_text(user, "Enter your line ", parent.name, lines[line_to_edit], MUSIC_MAXLINECHARS) + if(isnull(new_line_text) || !in_range(parent, user)) + return FALSE + lines[line_to_edit] = new_line_text + return TRUE + + //MODE STUFF + if("set_sustain_mode") + var/new_mode = params["new_mode"] + if(isnull(new_mode) || !(new_mode in SSinstruments.note_sustain_modes)) + return FALSE + sustain_mode = new_mode + return TRUE + if("set_note_shift") + var/amount = params["amount"] + if(!isnum(amount)) + return FALSE + note_shift = clamp(amount, note_shift_min, note_shift_max) + return TRUE + if("set_volume") + var/new_volume = params["amount"] + if(!isnum(new_volume)) + return FALSE + set_volume(new_volume) + return TRUE + if("set_dropoff_volume") + var/dropoff_threshold = params["amount"] + if(!isnum(dropoff_threshold)) + return FALSE + set_dropoff_volume(dropoff_threshold) + return TRUE + if("toggle_sustain_hold_indefinitely") + full_sustain_held_note = !full_sustain_held_note + return TRUE + if("set_repeat_amount") + if(playing) + return + var/repeat_amount = params["amount"] + if(!isnum(repeat_amount)) + return FALSE + set_repeats(repeat_amount) + return TRUE + if("edit_sustain_mode") + var/sustain_amount = params["amount"] + if(isnull(sustain_amount) || !isnum(sustain_amount)) + return + switch(sustain_mode) + if(SUSTAIN_LINEAR) + set_linear_falloff_duration(sustain_amount) + if(SUSTAIN_EXPONENTIAL) + set_exponential_drop_rate(sustain_amount) /** * Parses a song the user has input into lines and stores them. */ -/datum/song/proc/ParseSong(new_song) +/datum/song/proc/ParseSong(mob/user, new_song) set waitfor = FALSE //split into lines lines = islist(new_song) ? new_song : splittext(new_song, "\n") @@ -103,142 +196,14 @@ else tempo = sanitize_tempo(5) // default 120 BPM if(lines.len > MUSIC_MAXLINES) - to_chat(usr, "Too many lines!") + if(user) + to_chat(user, "Too many lines!") lines.Cut(MUSIC_MAXLINES + 1) var/linenum = 1 for(var/l in lines) if(length_char(l) > MUSIC_MAXLINECHARS) - to_chat(usr, "Line [linenum] too long!") + if(user) + to_chat(user, "Line [linenum] too long!") lines.Remove(l) else linenum++ - updateDialog(usr) // make sure updates when complete - -/datum/song/Topic(href, href_list) - if(!usr.can_perform_action(parent, ALLOW_RESTING)) - usr << browse(null, "window=instrument") - usr.unset_machine() - return - - parent.add_fingerprint(usr) - - if(href_list["newsong"]) - lines = new() - tempo = sanitize_tempo(5) // default 120 BPM - name = "" - - else if(href_list["import"]) - var/t = "" - do - t = html_encode(input(usr, "Please paste the entire song, formatted:", name, t) as message) - if(!in_range(parent, usr)) - return - - if(length_char(t) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS) - var/cont = tgui_alert(usr, "Your message is too long! Would you like to continue editing it?", "Warning", list("Yes", "No")) - if(cont != "Yes") - break - while(length_char(t) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS) - ParseSong(t) - - else if(href_list["help"]) - help = text2num(href_list["help"]) - 1 - - else if(href_list["edit"]) - editing = text2num(href_list["edit"]) - 1 - - if(href_list["repeat"]) //Changing this from a toggle to a number of repeats to avoid infinite loops. - set_repeats(repeat + text2num(href_list["repeat"])) - - else if(href_list["tempo"]) - tempo = sanitize_tempo(tempo + text2num(href_list["tempo"])) - - else if(href_list["play"]) - INVOKE_ASYNC(src, PROC_REF(start_playing), usr) - - else if(href_list["newline"]) - var/newline = tgui_input_text(usr, "Enter your line ", parent.name) - if(!newline || !in_range(parent, usr)) - return - if(lines.len > MUSIC_MAXLINES) - return - if(length(newline) > MUSIC_MAXLINECHARS) - newline = copytext(newline, 1, MUSIC_MAXLINECHARS) - lines.Add(newline) - - else if(href_list["deleteline"]) - var/num = round(text2num(href_list["deleteline"])) - if(num > lines.len || num < 1) - return - lines.Cut(num, num+1) - - else if(href_list["modifyline"]) - var/num = round(text2num(href_list["modifyline"]),1) - var/content = tgui_input_text(usr, "Enter your line ", parent.name, lines[num], MUSIC_MAXLINECHARS) - if(!content || !in_range(parent, usr)) - return - if(num > lines.len || num < 1) - return - lines[num] = content - - else if(href_list["stop"]) - stop_playing() - - else if(href_list["setlinearfalloff"]) - var/amount = tgui_input_number(usr, "Set linear sustain duration in seconds", "Linear Sustain Duration", 0.1, INSTRUMENT_MAX_TOTAL_SUSTAIN, 0.1, round_value = FALSE) - if(!isnull(amount)) - set_linear_falloff_duration(amount) - - else if(href_list["setexpfalloff"]) - var/amount = tgui_input_number(usr, "Set exponential sustain factor", "Exponential sustain factor", INSTRUMENT_EXP_FALLOFF_MIN, INSTRUMENT_EXP_FALLOFF_MAX, INSTRUMENT_EXP_FALLOFF_MIN, round_value = FALSE) - if(!isnull(amount)) - set_exponential_drop_rate(amount) - - else if(href_list["setvolume"]) - var/amount = tgui_input_number(usr, "Set volume", "Volume", 1, 75, 1) - if(!isnull(amount)) - set_volume(amount) - - else if(href_list["setdropoffvolume"]) - var/amount = tgui_input_number(usr, "Set dropoff threshold", "Dropoff Volume", max_value = 100) - if(!isnull(amount)) - set_dropoff_volume(amount) - - else if(href_list["switchinstrument"]) - if(!length(allowed_instrument_ids)) - return - else if(length(allowed_instrument_ids) == 1) - set_instrument(allowed_instrument_ids[1]) - return - var/list/categories = list() - for(var/i in allowed_instrument_ids) - var/datum/instrument/I = SSinstruments.get_instrument(i) - if(I) - LAZYSET(categories[I.category || "ERROR CATEGORY"], I.name, I.id) - var/cat = tgui_input_list(usr, "Select Category", "Instrument Category", categories) - if(isnull(cat)) - return - var/list/instruments = categories[cat] - var/choice = tgui_input_list(usr, "Select Instrument", "Instrument Selection", instruments) - if(isnull(choice)) - return - if(isnull(instruments[choice])) - return - choice = instruments[choice] //get id - if(choice) - set_instrument(choice) - - else if(href_list["setnoteshift"]) - var/amount = input(usr, "Set note shift", "Note Shift") as null|num - if(!isnull(amount)) - note_shift = clamp(amount, note_shift_min, note_shift_max) - - else if(href_list["setsustainmode"]) - var/choice = tgui_input_list(usr, "Choose a sustain mode", "Sustain Mode", SSinstruments.note_sustain_modes) - if(choice) - sustain_mode = SSinstruments.note_sustain_modes[choice] - - else if(href_list["togglesustainhold"]) - full_sustain_held_note = !full_sustain_held_note - - updateDialog(usr) diff --git a/code/modules/instruments/songs/play_synthesized.dm b/code/modules/instruments/songs/play_synthesized.dm index 3b5f3d5b9f42c..836c2fdd86bce 100644 --- a/code/modules/instruments/songs/play_synthesized.dm +++ b/code/modules/instruments/songs/play_synthesized.dm @@ -43,8 +43,7 @@ * Does a hearing check if enough time has passed. */ /datum/song/proc/playkey_synth(key, atom/player) - if(can_noteshift) - key = clamp(key + note_shift, key_min, key_max) + key = clamp(key + note_shift, key_min, key_max) if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck) do_hearcheck() var/datum/instrument_key/K = using_instrument.samples[num2text(key)] //See how fucking easy it is to make a number text? You don't need a complicated 9 line proc! diff --git a/tgui/packages/tgui/components/Collapsible.tsx b/tgui/packages/tgui/components/Collapsible.tsx index b470ed5ce6ddf..9f5f944b0ec04 100644 --- a/tgui/packages/tgui/components/Collapsible.tsx +++ b/tgui/packages/tgui/components/Collapsible.tsx @@ -13,11 +13,12 @@ type Props = Partial<{ buttons: ReactNode; open: boolean; title: ReactNode; + icon: string; }> & BoxProps; export function Collapsible(props: Props) { - const { children, color, title, buttons, ...rest } = props; + const { children, color, title, buttons, icon, ...rest } = props; const [open, setOpen] = useState(props.open); return ( @@ -27,7 +28,7 @@ export function Collapsible(props: Props) { + + )} + + Repeats Left: + + act('set_repeat_amount', { + amount: value, + }) + } + /> + + + {!!can_switch_instrument && ( + + Instrument Using + + instrument.name, + )} + onSelected={(value) => + act('change_instrument', { + new_instrument: instrument_id_by_name(value), + }) + } + /> + + + )} + + + + Playback Settings: + + + act('set_note_shift', { + amount: value, + }) + } + /> + keys / {octaves} octaves + + + Mode: + + + act('set_sustain_mode', { + new_mode: value, + }) + } + /> + + + + {sustain_mode_button}: + + act('edit_sustain_mode', { + amount: value, + }) + } + /> + + + + + + Status: + {instrument_ready ? ( + Ready + ) : ( + + {' '} + Instrument Definition Error! + + )} + + + Volume: + + act('set_volume', { + amount: value, + }) + } + /> + + + Volume Dropoff Threshold: + + act('set_dropoff_volume', { + amount: value, + }) + } + /> + + + + + + +
+ ); +}; + +const EditingSettings = (props) => { + const { act, data } = useBackend(); + const { bpm, lines } = data; + + return ( +
+ + + + + + Tempo:{' '} + {' '} + {bpm} BPM{' '} + + + + {lines.map((line, index) => ( + + Line {index}: + + + {line.line_text} + + ))} + + + + +
+ ); +}; + +const HelpSection = (props) => { + const { data } = useBackend(); + const { max_line_chars, max_lines } = data; + + return ( +
+ + Lines are a series of chords, separated by commas (,), each with notes + separated by hyphens (-). +
+ Every note in a chord will play together, with chord timed by the tempo. +
+ Notes are played by the names of the note, and optionally, the + accidental, and/or the octave number. +
+ By default, every note is natural and in octave 3. Defining otherwise is + remembered for each note. +
+ Example: C,D,E,F,G,A,B will play a C major scale. +
+ After a note has an accidental placed, it will be remembered:{' '} + C,C4,C,C3 is C3,C4,C4,C3 +
+ Chords can be played simply by seperating each note with a hyphon:{' '} + A-C#,Cn-E,E-G#,Gn-B +
A pause may be denoted by an empty chord: C,E,,C,G +
+ To make a chord be a different time, end it with /x, where the chord + length will be length +
+ defined by tempo / x: C,G/2,E/4 +
+ Combined, an example is: E-E4/4,F#/2,G#/8,B/8,E3-E4/4 +
+ Lines may be up to {max_line_chars} characters. +
A song may only contain up to {max_lines} lines. +
+
+
+ ); +}; From c6ea5fb77324649017027de32de80e1466fb71c9 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 15 Mar 2024 06:43:23 +1300 Subject: [PATCH 70/75] Automatic changelog for PR #81923 [ci skip] --- html/changelogs/AutoChangeLog-pr-81923.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81923.yml diff --git a/html/changelogs/AutoChangeLog-pr-81923.yml b/html/changelogs/AutoChangeLog-pr-81923.yml new file mode 100644 index 0000000000000..c4cba0e8676c1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81923.yml @@ -0,0 +1,4 @@ +author: "JohnFulpWillard" +delete-after: True +changes: + - refactor: "Instruments now use TGUI." \ No newline at end of file From 610cf3681a9cbfef8c83a46a15acdb963add2dc6 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Thu, 14 Mar 2024 18:47:30 +0100 Subject: [PATCH 71/75] Adds a persistent piggy bank to the vault. (#81900) ## About The Pull Request This PR adds a **persistent** piggy bank to the station vault that, while it can hold up to 3300 credits carried between shifts. However, you can only insert up to 1600 (on top of the 50 creds it auto-generates) each shift, so it does take a small, itsy bitsy of patience to fill it to the brim. ## Why It's Good For The Game I put some effort coding persistent piggy banks when making the cafeteria PR for the museum away mission a while ago (which apparently isn't enabled yet because the key holders forgot to ig). It'd be a shame of all the existing code were only used for a single persistent piggy bank. --- _maps/map_files/Birdshot/birdshot.dmm | 2 +- .../map_files/Deltastation/DeltaStation2.dmm | 2 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 2 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- _maps/map_files/NorthStar/north_star.dmm | 6 ++++++ _maps/map_files/tramstation/tramstation.dmm | 2 +- code/game/objects/items/piggy_bank.dm | 21 ++++++++++++++++++- code/game/objects/structures/safe.dm | 8 +++++++ code/modules/unit_tests/required_map_items.dm | 1 + 9 files changed, 40 insertions(+), 6 deletions(-) diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 49deea1fe47d5..eeb946983e820 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -50925,7 +50925,7 @@ /turf/open/misc/sandy_dirt, /area/station/maintenance/starboard/aft) "rLN" = ( -/obj/structure/safe, +/obj/structure/safe/vault, /obj/item/lazarus_injector, /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/siding/thinplating_new{ diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 30e548835e8be..20e27418cb07f 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -36847,7 +36847,7 @@ /turf/open/floor/iron/large, /area/station/security/processing) "jeZ" = ( -/obj/structure/safe, +/obj/structure/safe/vault, /obj/item/clothing/neck/stethoscope, /obj/item/book{ desc = "An undeniably handy book."; diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 759e4f09d46df..524ffda66ae84 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -25361,7 +25361,7 @@ /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat_interior) "hPf" = ( -/obj/structure/safe, +/obj/structure/safe/vault, /obj/item/clothing/head/costume/bearpelt, /obj/item/reagent_containers/cup/glass/drinkingglass/shotglass, /obj/item/reagent_containers/cup/glass/drinkingglass/shotglass, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 7ac2807b4801e..aa526f33de7b0 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -41714,7 +41714,7 @@ /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) "oXK" = ( -/obj/structure/safe, +/obj/structure/safe/vault, /obj/item/storage/briefcase/secure/riches, /obj/item/storage/backpack/duffelbag/syndie/hitman, /obj/item/card/id/advanced/silver/reaper, diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index e83a6941c8855..794c008083714 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -77446,6 +77446,8 @@ "tVp" = ( /obj/machinery/light_switch/directional/north, /obj/machinery/status_display/ai/directional/east, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/piggy_bank/vault, /turf/open/floor/circuit, /area/station/ai_monitored/command/nuke_storage) "tVq" = ( @@ -80646,6 +80648,10 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /obj/machinery/status_display/ai/directional/west, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/maneki_neko{ + pixel_y = 4 + }, /turf/open/floor/circuit, /area/station/ai_monitored/command/nuke_storage) "uNp" = ( diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index ae87f6f63578c..e4edbf305c607 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -44635,7 +44635,7 @@ /turf/open/floor/iron, /area/station/construction/mining/aux_base) "oQO" = ( -/obj/structure/safe, +/obj/structure/safe/vault, /obj/item/clothing/head/costume/bearpelt, /obj/item/gun/ballistic/revolver/russian, /obj/item/ammo_box/a357, diff --git a/code/game/objects/items/piggy_bank.dm b/code/game/objects/items/piggy_bank.dm index 012ff91b0216c..8d50e8a39e8fe 100644 --- a/code/game/objects/items/piggy_bank.dm +++ b/code/game/objects/items/piggy_bank.dm @@ -4,7 +4,7 @@ */ /obj/item/piggy_bank name = "piggy bank" - desc = "A pig-shaped money container made of porkelain, oink. Do not throw." //pun very intended. + desc = "A pig-shaped money container made of porkelain, oink. Do not throw." //pun very intended. icon = 'icons/obj/fluff/general.dmi' icon_state = "piggy_bank" max_integrity = 8 @@ -20,6 +20,8 @@ var/datum/callback/persistence_cb ///How much dosh can this piggy bank hold. var/maximum_value = PAYCHECK_COMMAND * 20 + ///A limit to much dosh can you put inside this piggy bank each round. If 0, there's no limit. Only applies to persistent piggies. + var/maximum_savings_per_shift = 0 ///How much dosh this piggy bank spawns with. var/initial_value = 0 @@ -49,6 +51,9 @@ if(initial_value && initial_value + calculate_dosh_amount() <= maximum_value) new /obj/item/holochip(src, initial_value) + if(maximum_savings_per_shift) + maximum_value = calculate_dosh_amount() + maximum_savings_per_shift + /obj/item/piggy_bank/proc/save_cash() SSpersistence.save_piggy_bank(src) @@ -127,3 +132,17 @@ /obj/item/piggy_bank/museum/Initialize(mapload) . = ..() AddComponent(/datum/component/areabound) //do not steal. + +/obj/item/piggy_bank/vault + name = "vault piggy bank" + desc = "A pig-shaped money container made of porkelain, containing the station's emergency funds carried between shifts, oink. Do not throw." + persistence_id = "vault_piggy" + greyscale_colors = COLOR_LIGHT_ORANGE + maximum_value = PAYCHECK_COMMAND * 33 + initial_value = PAYCHECK_CREW //it takes about 66 shifts for it to hit its max value on its own. + maximum_savings_per_shift = PAYCHECK_COMMAND * 16 //and 2 if you actively use it. + +/obj/item/piggy_bank/vault/Initialize(mapload) + . = ..() + //one piggy bank should exist, preferibly inside the vault's safe. + REGISTER_REQUIRED_MAP_ITEM(1, 1) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 9c1a8f1c4f3c0..a000dee8cd625 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -247,5 +247,13 @@ FLOOR SAFES . = ..() AddElement(/datum/element/undertile) +///Special safe for the station's vault. Not explicitly required, but the piggy bank inside it is. +/obj/structure/safe/vault + +/obj/structure/safe/vault/Initialize(mapload) + . = ..() + var/obj/item/piggy_bank/vault/piggy = new(src) + space += piggy.w_class + #undef SOUND_CHANCE #undef BROKEN_THRESHOLD diff --git a/code/modules/unit_tests/required_map_items.dm b/code/modules/unit_tests/required_map_items.dm index 5cbef64539109..73499c83b6dcc 100644 --- a/code/modules/unit_tests/required_map_items.dm +++ b/code/modules/unit_tests/required_map_items.dm @@ -21,6 +21,7 @@ expected_types += /mob/living/carbon/human/species/monkey/punpun expected_types += /obj/machinery/computer/communications expected_types += /obj/machinery/drone_dispenser + expected_types += /obj/item/piggy_bank/vault /datum/unit_test/required_map_items/Run() setup_expected_types() From 0a75b1793757ead97549ee238d4332caa0769e28 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 15 Mar 2024 06:47:50 +1300 Subject: [PATCH 72/75] Automatic changelog for PR #81900 [ci skip] --- html/changelogs/AutoChangeLog-pr-81900.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81900.yml diff --git a/html/changelogs/AutoChangeLog-pr-81900.yml b/html/changelogs/AutoChangeLog-pr-81900.yml new file mode 100644 index 0000000000000..2e663bc660a34 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81900.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Added a persistent piggy bank to the vault, which can carry up to a modest 2000 credits worth of dosh between rounds." \ No newline at end of file From 9802508ab95bbd11fcb9c8560b03e57f1294d6c6 Mon Sep 17 00:00:00 2001 From: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> Date: Thu, 14 Mar 2024 17:25:50 -0400 Subject: [PATCH 73/75] Adds logging to SSore_generation on subsystem initialize (#81488) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR adds a new logging category and a logging message specific to SSore_generation's initialize, logging the number of vents of each size, as well as the number of random and proximity based ore spawns due to cave generation and map generation. Currently drafted as I could use some feedback as to why I'm not seeing the logger.log() messages not appearing on any of the current in-game log files 👍 Useful for data logging to determine how many of each type of ore is spawned on the map, for the purposes of determining how much ore is being spawned manually over the automatic amounts based on the vents, with the quantity of ores spawning being a product of the ore vent sizes being logged as well. --- code/__DEFINES/logging.dm | 1 + code/__DEFINES/mining.dm | 11 ++++ code/_globalvars/lists/mapping.dm | 23 ++++++++ code/controllers/subsystem/ore_generation.dm | 58 ++++++++++++------- .../objects/structures/lavaland/ore_vent.dm | 6 +- code/game/turfs/closed/minerals.dm | 14 ++--- .../logging/categories/log_category_misc.dm | 3 + 7 files changed, 84 insertions(+), 32 deletions(-) diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 492a0a06a8850..d4730ce0bb711 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -115,6 +115,7 @@ #define LOG_CATEGORY_TOOL "tool" #define LOG_CATEGORY_TRANSPORT "transport" #define LOG_CATEGORY_VIRUS "virus" +#define LOG_CATEGORY_CAVE_GENERATION "cave-generation" // Admin categories #define LOG_CATEGORY_ADMIN "admin" diff --git a/code/__DEFINES/mining.dm b/code/__DEFINES/mining.dm index 11d150a453db8..4b233a5d4f171 100644 --- a/code/__DEFINES/mining.dm +++ b/code/__DEFINES/mining.dm @@ -39,6 +39,17 @@ /// The chance of ore spawning in a wall that is VENT_PROX_FAR tiles to a vent. #define VENT_CHANCE_FAR 1 +/// The amount of ore that is mined from a wall that is VENT_PROX_VERY_HIGH tiles to a vent. +#define ORE_WALL_VERY_HIGH 5 +/// The amount of ore that is mined from a wall that is VENT_PROX_HIGH tiles to a vent. +#define ORE_WALL_HIGH 4 +/// The amount of ore that is mined from a wall that is VENT_PROX_MEDIUM tiles to a vent. +#define ORE_WALL_MEDIUM 3 +/// The amount of ore that is mined from a wall that is VENT_PROX_LOW tiles to a vent. +#define ORE_WALL_LOW 2 +/// The amount of ore that is mined from a wall that is VENT_PROX_FAR tiles to a vent. +#define ORE_WALL_FAR 1 + /// The number of points a miner gets for discovering a vent, multiplied by BOULDER_SIZE when completing a wave defense minus the discovery bonus. #define MINER_POINT_MULTIPLIER 100 /// The multiplier that gets applied for automatically generated mining points. diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index b77942bad8719..8719f45f18fc0 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -151,3 +151,26 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list( /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/dragon = 4, )) + +/// List of how many minerals spawned based on proximity to an ore vent. +GLOBAL_LIST_INIT(post_ore_random, list( + "[ORE_WALL_FAR]" = 0, + "[ORE_WALL_LOW]" = 0, + "[ORE_WALL_MEDIUM]" = 0, + "[ORE_WALL_HIGH]" = 0, + "[ORE_WALL_VERY_HIGH]" = 0, +)) +/// List of how many minerals spawned randomly off of mining Z-levels, and at what quantity. +GLOBAL_LIST_INIT(post_ore_manual, list( + "[ORE_WALL_FAR]" = 0, + "[ORE_WALL_LOW]" = 0, + "[ORE_WALL_MEDIUM]" = 0, + "[ORE_WALL_HIGH]" = 0, + "[ORE_WALL_VERY_HIGH]" = 0, +)) +/// List of how many ore vents spawned, and of what size. +GLOBAL_LIST_INIT(ore_vent_sizes, list( + LARGE_VENT_TYPE = 0, + MEDIUM_VENT_TYPE = 0, + SMALL_VENT_TYPE = 0, +)) diff --git a/code/controllers/subsystem/ore_generation.dm b/code/controllers/subsystem/ore_generation.dm index ca8aa09d6111c..e36dd577794e1 100644 --- a/code/controllers/subsystem/ore_generation.dm +++ b/code/controllers/subsystem/ore_generation.dm @@ -20,27 +20,6 @@ SUBSYSTEM_DEF(ore_generation) var/list/ore_vent_minerals = list() /// A tracker of how many of each ore vent size we have in the game. Useful for tracking purposes. - var/list/ore_vent_sizes = list( - LARGE_VENT_TYPE = 0, - MEDIUM_VENT_TYPE = 0, - SMALL_VENT_TYPE = 0, - ) - /// Ores spawned by proximity to an ore vent. Useful for logging purposes. - var/list/post_ore_random = list( - "1" = 0, - "2" = 0, - "3" = 0, - "4" = 0, - "5" = 0, - ) - /// Ores spawned randomly on the map without proximity to an ore vent. Useful for logging purposes. - var/list/post_ore_manual = list( - "1" = 0, - "2" = 0, - "3" = 0, - "4" = 0, - "5" = 0, - ) /datum/controller/subsystem/ore_generation/Initialize() //Basically, we're going to round robin through the list of ore vents and assign a mineral to them until complete. @@ -56,8 +35,43 @@ SUBSYSTEM_DEF(ore_generation) else stallbreaker++ if(stallbreaker >= length(possible_vents)) - return SS_INIT_SUCCESS //We've done all we can here. + break //We've done all we can here. break inner loop continue + if(stallbreaker >= length(possible_vents)) + break //We've done all we can here. break outer loop + + /// Handles roundstart logging + logger.Log( + LOG_CATEGORY_CAVE_GENERATION, + "Ore Generation spawned the following ores based on vent proximity", + list( + "[ORE_WALL_FAR]" = GLOB.post_ore_random["[ORE_WALL_FAR]"], + "[ORE_WALL_LOW]" = GLOB.post_ore_random["[ORE_WALL_LOW]"], + "[ORE_WALL_MEDIUM]" = GLOB.post_ore_random["[ORE_WALL_MEDIUM]"], + "[ORE_WALL_HIGH]" = GLOB.post_ore_random["[ORE_WALL_HIGH]"], + "[ORE_WALL_VERY_HIGH]" = GLOB.post_ore_random["[ORE_WALL_VERY_HIGH]"], + ), + ) + logger.Log( + LOG_CATEGORY_CAVE_GENERATION, + "Ore Generation spawned the following ores randomly", + list( + "[ORE_WALL_FAR]" = GLOB.post_ore_manual["[ORE_WALL_FAR]"], + "[ORE_WALL_LOW]" = GLOB.post_ore_manual["[ORE_WALL_LOW]"], + "[ORE_WALL_MEDIUM]" = GLOB.post_ore_manual["[ORE_WALL_MEDIUM]"], + "[ORE_WALL_HIGH]" = GLOB.post_ore_manual["[ORE_WALL_HIGH]"], + "[ORE_WALL_VERY_HIGH]" = GLOB.post_ore_manual["[ORE_WALL_VERY_HIGH]"], + ), + ) + logger.Log( + LOG_CATEGORY_CAVE_GENERATION, + "Ore Generation spawned the following vent sizes", + list( + "large" = LAZYACCESS(GLOB.ore_vent_sizes, LARGE_VENT_TYPE), + "medium" = LAZYACCESS(GLOB.ore_vent_sizes, MEDIUM_VENT_TYPE), + "small" = LAZYACCESS(GLOB.ore_vent_sizes, SMALL_VENT_TYPE), + ), + ) return SS_INIT_SUCCESS /datum/controller/subsystem/ore_generation/fire(resumed) diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index c3aa446916d85..70ab15427b759 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -425,15 +425,15 @@ if(LARGE_VENT_TYPE) boulder_size = BOULDER_SIZE_LARGE if(mapload) - SSore_generation.ore_vent_sizes["large"] += 1 + GLOB.ore_vent_sizes["large"] += 1 if(MEDIUM_VENT_TYPE) boulder_size = BOULDER_SIZE_MEDIUM if(mapload) - SSore_generation.ore_vent_sizes["medium"] += 1 + GLOB.ore_vent_sizes["medium"] += 1 if(SMALL_VENT_TYPE) boulder_size = BOULDER_SIZE_SMALL if(mapload) - SSore_generation.ore_vent_sizes["small"] += 1 + GLOB.ore_vent_sizes["small"] += 1 else boulder_size = BOULDER_SIZE_SMALL //Might as well set a default value name = initial(name) diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 4d2a1d7ba6d18..74f14c56cbb32 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -141,15 +141,15 @@ return rand(1,5) if(distance < VENT_PROX_VERY_HIGH) - return 5 + return ORE_WALL_VERY_HIGH if(distance < VENT_PROX_HIGH) - return 4 + return ORE_WALL_HIGH if(distance < VENT_PROX_MEDIUM) - return 3 + return ORE_WALL_MEDIUM if(distance < VENT_PROX_LOW) - return 2 + return ORE_WALL_LOW if(distance < VENT_PROX_FAR) - return 1 + return ORE_WALL_FAR return 0 /turf/closed/mineral/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) @@ -319,7 +319,7 @@ var/turf/closed/mineral/M = T M.turf_type = src.turf_type M.mineralAmt = scale_ore_to_vent() - SSore_generation.post_ore_random["[M.mineralAmt]"] += 1 + GLOB.post_ore_random["[M.mineralAmt]"] += 1 src = M M.levelupdate() else @@ -330,7 +330,7 @@ Change_Ore(path, FALSE) Spread_Vein(path) mineralAmt = scale_ore_to_vent() - SSore_generation.post_ore_manual["[mineralAmt]"] += 1 + GLOB.post_ore_manual["[mineralAmt]"] += 1 /turf/closed/mineral/random/high_chance icon_state = "rock_highchance" diff --git a/code/modules/logging/categories/log_category_misc.dm b/code/modules/logging/categories/log_category_misc.dm index 2d200e63aa27a..4d69c7cb35bdd 100644 --- a/code/modules/logging/categories/log_category_misc.dm +++ b/code/modules/logging/categories/log_category_misc.dm @@ -65,3 +65,6 @@ category = LOG_CATEGORY_QDEL // We want this human readable so it's easy to see at a glance entry_flags = ENTRY_USE_DATA_W_READABLE + +/datum/log_category/cave_generation + category = LOG_CATEGORY_CAVE_GENERATION From 54684c53379eb8ad7c5ffd3d3472afd5e008e83a Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Fri, 15 Mar 2024 10:26:11 +1300 Subject: [PATCH 74/75] Automatic changelog for PR #81488 [ci skip] --- html/changelogs/AutoChangeLog-pr-81488.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-81488.yml diff --git a/html/changelogs/AutoChangeLog-pr-81488.yml b/html/changelogs/AutoChangeLog-pr-81488.yml new file mode 100644 index 0000000000000..14be330563222 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-81488.yml @@ -0,0 +1,4 @@ +author: "ArcaneMusic" +delete-after: True +changes: + - code_imp: "We now log how many ores spawned on lavaland each round, as well as the sizes of all of the ore vents." \ No newline at end of file From bd3a460a1a985c529fe2747d5e70ba2efc10ee91 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 15 Mar 2024 00:19:32 +0000 Subject: [PATCH 75/75] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-81393.yml | 4 ---- html/changelogs/AutoChangeLog-pr-81488.yml | 4 ---- html/changelogs/AutoChangeLog-pr-81900.yml | 4 ---- html/changelogs/AutoChangeLog-pr-81923.yml | 4 ---- html/changelogs/AutoChangeLog-pr-81940.yml | 7 ------- html/changelogs/AutoChangeLog-pr-81979.yml | 4 ---- html/changelogs/AutoChangeLog-pr-81988.yml | 4 ---- html/changelogs/archive/2024-03.yml | 23 ++++++++++++++++++++++ 8 files changed, 23 insertions(+), 31 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-81393.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81488.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81900.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81923.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81940.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81979.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-81988.yml diff --git a/html/changelogs/AutoChangeLog-pr-81393.yml b/html/changelogs/AutoChangeLog-pr-81393.yml deleted file mode 100644 index 4585db9c2d1f7..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81393.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - rscadd: "Added a 'Closet Anomaly' station trait, which links and turns a portion of the roundstart closets into impromptu teleporters." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81488.yml b/html/changelogs/AutoChangeLog-pr-81488.yml deleted file mode 100644 index 14be330563222..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81488.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ArcaneMusic" -delete-after: True -changes: - - code_imp: "We now log how many ores spawned on lavaland each round, as well as the sizes of all of the ore vents." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81900.yml b/html/changelogs/AutoChangeLog-pr-81900.yml deleted file mode 100644 index 2e663bc660a34..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81900.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - rscadd: "Added a persistent piggy bank to the vault, which can carry up to a modest 2000 credits worth of dosh between rounds." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81923.yml b/html/changelogs/AutoChangeLog-pr-81923.yml deleted file mode 100644 index c4cba0e8676c1..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81923.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "JohnFulpWillard" -delete-after: True -changes: - - refactor: "Instruments now use TGUI." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81940.yml b/html/changelogs/AutoChangeLog-pr-81940.yml deleted file mode 100644 index 746d336b1b7b2..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81940.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "JohnFulpWillard" -delete-after: True -changes: - - balance: "Crusher marks no longer overwrite eachother, fauna can have one from each crusher." - - balance: "Ash drake's crusher trophy no longer affects people the same faction as you (like hiero trophy), so you won't friendly fire people with it." - - rscadd: "Added a new upgrade: Human Passthrough. You can shoot your PKA without having to worry about friendly fire with this, for 750 mining points at your mining vendor." - - bugfix: "Minebot passthrough upgrade now properly makes PKAs pass through minebots." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81979.yml b/html/changelogs/AutoChangeLog-pr-81979.yml deleted file mode 100644 index 47198b1bc584b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81979.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "13spacemen" -delete-after: True -changes: - - bugfix: "Fixed some poll alerts runtiming" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-81988.yml b/html/changelogs/AutoChangeLog-pr-81988.yml deleted file mode 100644 index fd12f3bebb6bf..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-81988.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Jacquerel" -delete-after: True -changes: - - image: "Updated button icon for Summon Simians and Gorilla Transformation." \ No newline at end of file diff --git a/html/changelogs/archive/2024-03.yml b/html/changelogs/archive/2024-03.yml index e8ac03c6d7f60..186f2d5a3be16 100644 --- a/html/changelogs/archive/2024-03.yml +++ b/html/changelogs/archive/2024-03.yml @@ -451,3 +451,26 @@ starrm4nn: - balance: Ephedrine spasms won't affect small or tiny items - balance: Ephedrine's movement speed bonus now scales with purity. +2024-03-15: + 13spacemen: + - bugfix: Fixed some poll alerts runtiming + ArcaneMusic: + - code_imp: We now log how many ores spawned on lavaland each round, as well as + the sizes of all of the ore vents. + Ghommie: + - rscadd: Added a 'Closet Anomaly' station trait, which links and turns a portion + of the roundstart closets into impromptu teleporters. + - rscadd: Added a persistent piggy bank to the vault, which can carry up to a modest + 2000 credits worth of dosh between rounds. + Jacquerel: + - image: Updated button icon for Summon Simians and Gorilla Transformation. + JohnFulpWillard: + - refactor: Instruments now use TGUI. + - balance: Crusher marks no longer overwrite eachother, fauna can have one from + each crusher. + - balance: Ash drake's crusher trophy no longer affects people the same faction + as you (like hiero trophy), so you won't friendly fire people with it. + - rscadd: 'Added a new upgrade: Human Passthrough. You can shoot your PKA without + having to worry about friendly fire with this, for 750 mining points at your + mining vendor.' + - bugfix: Minebot passthrough upgrade now properly makes PKAs pass through minebots.