From a989156ca046842b15eaef5bcee4887d897c7ed0 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Tue, 29 Apr 2025 23:10:03 +0000 Subject: [PATCH 01/43] Bubberstation automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3668.yml | 4 ---- html/changelogs/AutoChangeLog-bubber-pr-3669.yml | 5 ----- html/changelogs/bubber_archive/2025-04.yml | 3 +++ 3 files changed, 3 insertions(+), 9 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3668.yml delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3669.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3668.yml b/html/changelogs/AutoChangeLog-bubber-pr-3668.yml deleted file mode 100644 index 89d2772d9f2..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3668.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TealSeer" -delete-after: True -changes: - - bugfix: "fixed port tarkon bounty pad returning 0 for all sales" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3669.yml b/html/changelogs/AutoChangeLog-bubber-pr-3669.yml deleted file mode 100644 index 9ae89cc95ec..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3669.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "TealSeer" -delete-after: True -changes: - - bugfix: "fixed the featherweight quirk doing nothing when you're picked up" - - bugfix: "fixed rider always layering above carrier when fireman carrying/piggybacking" \ No newline at end of file diff --git a/html/changelogs/bubber_archive/2025-04.yml b/html/changelogs/bubber_archive/2025-04.yml index 86ab0fabda8..65c4263343e 100644 --- a/html/changelogs/bubber_archive/2025-04.yml +++ b/html/changelogs/bubber_archive/2025-04.yml @@ -312,6 +312,9 @@ up - bugfix: hairline and compound fractures are no longer instantly healed with bone gel, sorry! + - bugfix: fixed port tarkon bounty pad returning 0 for all sales + - bugfix: fixed the featherweight quirk doing nothing when you're picked up + - bugfix: fixed rider always layering above carrier when fireman carrying/piggybacking nevimer: - code_imp: moffson should work without needing an ai to be damaged now. thegrb93: From 6ec69752ac8b6f5796d2f012502980af35f391e9 Mon Sep 17 00:00:00 2001 From: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Wed, 30 Apr 2025 02:21:05 -0400 Subject: [PATCH 02/43] Modify some suspicious-looking Destroy overrides (#3649) ## About The Pull Request 99% of the time you want to do all your implementation-specific `Destroy` logic and then call the parent, these ones don't. I've seen a couple of these types getting hard deleted often (especially the taur body) and I don't trust it ## Why It's Good For The Game Maybe reduce hard dels ## Proof Of Testing no but its not gonna break anything and it could unbreak something ## Changelog No --- code/_onclick/hud/hud.dm | 1 + .../code/modules/clothing/suits/skinsuits.dm | 4 +- .../code/modules/clothing/under/akula_jobs.dm | 8 ++-- .../code/modules/language/language_holder.dm | 2 +- .../modules/surgery/organs/taur_body.dm | 45 +++++++------------ .../modular_items/code/modular_glasses.dm | 2 +- .../code/lewd_clothing/hypnogoggles.dm | 6 +-- .../code/lewd_structures/dancing_pole.dm | 2 +- .../modules/mutants/code/mutant_cure.dm | 2 +- .../code/subsystem/player_ranks.dm | 3 +- .../stasisrework/code/stasissleeper.dm | 3 -- .../_onclick/hud/screen_objects/hud_timer.dm | 4 +- .../nanites/nanite_programs/utility.dm | 4 +- .../code/modules/ratqueen/regalrat.dm | 2 +- 14 files changed, 36 insertions(+), 52 deletions(-) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 9916ecf7394..84fae38b58a 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -296,6 +296,7 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list( //SKYRAT EDIT ADDITION START - SKYRAT HUD wanted_lvl = null + ammo_counter = null // SKYRAT EDIT ADDITION END - SKYRAT HUD QDEL_LIST_ASSOC_VAL(master_groups) diff --git a/modular_skyrat/master_files/code/modules/clothing/suits/skinsuits.dm b/modular_skyrat/master_files/code/modules/clothing/suits/skinsuits.dm index 0b78049a650..404ba0c5d3b 100644 --- a/modular_skyrat/master_files/code/modules/clothing/suits/skinsuits.dm +++ b/modular_skyrat/master_files/code/modules/clothing/suits/skinsuits.dm @@ -25,8 +25,8 @@ AddComponent(/datum/component/wetsuit) /obj/item/clothing/under/skinsuit/Destroy() - . = ..() qdel(GetComponent(/datum/component/wetsuit)) + . = ..() /obj/item/clothing/head/helmet/space/skinsuit_helmet name = "\improper Stardress helm" @@ -44,8 +44,8 @@ AddComponent(/datum/component/wetsuit) /obj/item/clothing/head/helmet/space/skinsuit_helmet/Destroy() - . = ..() qdel(GetComponent(/datum/component/wetsuit)) + . = ..() /obj/item/clothing/suit/armor/riot/skinsuit_armor name = "\improper Shorebreaker plating" diff --git a/modular_skyrat/master_files/code/modules/clothing/under/akula_jobs.dm b/modular_skyrat/master_files/code/modules/clothing/under/akula_jobs.dm index c0a9768080f..3887c12167e 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/akula_jobs.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/akula_jobs.dm @@ -25,16 +25,16 @@ update_appearance() /obj/item/clothing/under/akula_wetsuit/Destroy() - . = ..() var/mob/user = loc if(!istype(user)) - return + return ..() if(tail_overlay) user.cut_overlay(tail_overlay) tail_overlay = null qdel(GetComponent(/datum/component/wetsuit)) + . = ..() /obj/item/clothing/under/akula_wetsuit/equipped(mob/user, slot) . = ..() @@ -183,15 +183,15 @@ update_appearance() /obj/item/clothing/head/helmet/space/akula_wetsuit/Destroy() - . = ..() var/mob/user = loc if(attached_hat) attached_hat.forceMove(drop_location()) if(!istype(user)) - return + return ..() qdel(GetComponent(/datum/component/wetsuit)) + . = ..() // Wearing hats inside the wetworks helmet /obj/item/clothing/head/helmet/space/akula_wetsuit/examine() diff --git a/modular_skyrat/master_files/code/modules/language/language_holder.dm b/modular_skyrat/master_files/code/modules/language/language_holder.dm index 815d47d7c83..7106f678a87 100644 --- a/modular_skyrat/master_files/code/modules/language/language_holder.dm +++ b/modular_skyrat/master_files/code/modules/language/language_holder.dm @@ -23,8 +23,8 @@ GLOBAL_DATUM_INIT(language_holder_adjustor, /datum/language_holder_adjustor, new language_holder.adjust_languages_to_prefs(new_crewmember.client?.prefs) /datum/language_holder_adjustor/Destroy() - ..() UnregisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED) + . = ..() /datum/language_holder/proc/adjust_languages_to_prefs(datum/preferences/preferences) // no prefs? then don't remove any languages diff --git a/modular_skyrat/modules/customization/modules/surgery/organs/taur_body.dm b/modular_skyrat/modules/customization/modules/surgery/organs/taur_body.dm index 0fcc65ae1e2..0bac46b8627 100644 --- a/modular_skyrat/modules/customization/modules/surgery/organs/taur_body.dm +++ b/modular_skyrat/modules/customization/modules/surgery/organs/taur_body.dm @@ -16,9 +16,9 @@ var/right_leg_name = "back legs" /// The mob's old right leg. Used if the person switches to this organ and then back, so they don't just, have no legs anymore. Can be null. - var/obj/item/bodypart/leg/right/old_right_leg = null + var/old_right_leg = null /// The mob's old left leg. Used if the person switches to this organ and then back, so they don't just, have no legs anymore. Can be null. - var/obj/item/bodypart/leg/right/old_left_leg = null + var/old_left_leg = null /// If true, our sprite accessory will not render. var/hide_self @@ -109,8 +109,8 @@ if(sprite_accessory_flags & SPRITE_ACCESSORY_HIDE_SHOES) external_bodyshapes |= BODYSHAPE_HIDE_SHOES - old_right_leg = receiver.get_bodypart(BODY_ZONE_R_LEG) - old_left_leg = receiver.get_bodypart(BODY_ZONE_L_LEG) + var/obj/item/bodypart/leg/right/current_right_leg = receiver.get_bodypart(BODY_ZONE_R_LEG) + var/obj/item/bodypart/leg/left/current_left_leg = receiver.get_bodypart(BODY_ZONE_L_LEG) var/obj/item/bodypart/leg/left/taur/new_left_leg var/obj/item/bodypart/leg/right/taur/new_right_leg @@ -131,58 +131,45 @@ new_left_leg.bodyshape |= external_bodyshapes new_left_leg.replace_limb(receiver, TRUE) - if(old_left_leg) - old_left_leg.forceMove(src) + if(current_left_leg) + old_left_leg = current_left_leg.type + qdel(current_left_leg) new_left_leg.bodytype |= BODYTYPE_TAUR new_right_leg.bodyshape |= external_bodyshapes new_right_leg.replace_limb(receiver, TRUE) - if(old_right_leg) - old_right_leg.forceMove(src) + if(current_right_leg) + old_right_leg = current_right_leg.type + qdel(current_right_leg) new_right_leg.bodytype |= BODYTYPE_TAUR return ..() /obj/item/organ/taur_body/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) - if(QDELETED(owner)) - return ..() - var/obj/item/bodypart/leg/left/left_leg = organ_owner.get_bodypart(BODY_ZONE_L_LEG) var/obj/item/bodypart/leg/right/right_leg = organ_owner.get_bodypart(BODY_ZONE_R_LEG) if(left_leg) left_leg.drop_limb() - - if(left_leg) - qdel(left_leg) + qdel(left_leg) if(right_leg) right_leg.drop_limb() - - if(right_leg) - qdel(right_leg) + qdel(right_leg) if(old_left_leg) - old_left_leg.replace_limb(organ_owner, TRUE) - old_left_leg = null + var/obj/item/bodypart/leg/left/new_left_leg = new old_left_leg() + new_left_leg.replace_limb(organ_owner, TRUE) if(old_right_leg) - old_right_leg.replace_limb(organ_owner, TRUE) - old_right_leg = null + var/obj/item/bodypart/leg/right/new_right_leg = new old_right_leg() + new_right_leg.replace_limb(organ_owner, TRUE) // We don't call `synchronize_bodytypes()` here, because it's already going to get called in the parent because `external_bodyshapes` has a value. return ..() -/obj/item/organ/taur_body/Destroy() - . = ..() - if(old_left_leg) - QDEL_NULL(old_left_leg) - - if(old_right_leg) - QDEL_NULL(old_right_leg) - /obj/item/organ/taur_body/proc/get_riding_offset(oversized = FALSE) var/size_scaling = (owner.dna.features["body_size"] / BODY_SIZE_NORMAL) - 1 var/scaling_mult = 1 + (size_scaling * riding_offset_scaling_mult) diff --git a/modular_skyrat/modules/modular_items/code/modular_glasses.dm b/modular_skyrat/modules/modular_items/code/modular_glasses.dm index 9c7198bf440..4f37b1267c2 100644 --- a/modular_skyrat/modules/modular_items/code/modular_glasses.dm +++ b/modular_skyrat/modules/modular_items/code/modular_glasses.dm @@ -35,8 +35,8 @@ glasses_type = type /obj/item/clothing/glasses/hud/ar/Destroy() - . = ..() STOP_PROCESSING(SSobj, src) + . = ..() /obj/item/clothing/glasses/hud/ar/equipped(mob/living/carbon/human/user, slot) if(mode != MODE_OFF || slot != slot_flags) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/hypnogoggles.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/hypnogoggles.dm index 094bee37fc3..da17f505de3 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/hypnogoggles.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/hypnogoggles.dm @@ -40,12 +40,12 @@ victim = null /obj/item/clothing/glasses/hypno/Destroy() - . = ..() if(!victim) - return + return ..() if(!(victim.glasses == src)) - return + return ..() victim.cure_trauma_type(/datum/brain_trauma/very_special/induced_hypnosis, TRAUMA_RESILIENCE_MAGIC) + . = ..() /obj/item/clothing/glasses/hypno/attack_self(mob/user)//Setting up hypnotising phrase . = ..() diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_structures/dancing_pole.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_structures/dancing_pole.dm index f739d033934..6888dc63fa7 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_structures/dancing_pole.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_structures/dancing_pole.dm @@ -145,7 +145,6 @@ /obj/structure/stripper_pole/Destroy() - . = ..() if(dancer) dancer.SetStun(0) dancer.pixel_y = 0 @@ -154,6 +153,7 @@ dancer.layer = layer dancer.forceMove(get_turf(src)) dancer = null + . = ..() /obj/structure/stripper_pole/click_ctrl_shift(mob/user) add_fingerprint(user) diff --git a/modular_skyrat/modules/mutants/code/mutant_cure.dm b/modular_skyrat/modules/mutants/code/mutant_cure.dm index c873827a3ce..495ea4be62f 100644 --- a/modular_skyrat/modules/mutants/code/mutant_cure.dm +++ b/modular_skyrat/modules/mutants/code/mutant_cure.dm @@ -77,10 +77,10 @@ . += "It has an extracted RNA sample in it." /obj/item/rna_extractor/Destroy() - . = ..() if(loaded_vial) loaded_vial.forceMove(loc) loaded_vial = null + . = ..() /obj/item/rna_vial name = "raw RNA vial" diff --git a/modular_skyrat/modules/player_ranks/code/subsystem/player_ranks.dm b/modular_skyrat/modules/player_ranks/code/subsystem/player_ranks.dm index b5df997558b..4533953bf31 100644 --- a/modular_skyrat/modules/player_ranks/code/subsystem/player_ranks.dm +++ b/modular_skyrat/modules/player_ranks/code/subsystem/player_ranks.dm @@ -32,11 +32,10 @@ SUBSYSTEM_DEF(player_ranks) /datum/controller/subsystem/player_ranks/Destroy() - . = ..() - QDEL_NULL(donator_controller) QDEL_NULL(mentor_controller) QDEL_NULL(vetted_controller) + . = ..() /** * Returns whether or not the user is qualified as a donator. diff --git a/modular_skyrat/modules/stasisrework/code/stasissleeper.dm b/modular_skyrat/modules/stasisrework/code/stasissleeper.dm index fc852d7d81d..a7b833c14ef 100644 --- a/modular_skyrat/modules/stasisrework/code/stasissleeper.dm +++ b/modular_skyrat/modules/stasisrework/code/stasissleeper.dm @@ -15,9 +15,6 @@ payment_department = ACCOUNT_MED interaction_flags_click = ALLOW_SILICON_REACH -/obj/machinery/stasissleeper/Destroy() - . = ..() - /obj/machinery/stasissleeper/examine(mob/user) . = ..() . += span_notice("Alt-click to [state_open ? "close" : "open"] the machine.") diff --git a/modular_zubbers/code/_onclick/hud/screen_objects/hud_timer.dm b/modular_zubbers/code/_onclick/hud/screen_objects/hud_timer.dm index 91f9faaaadb..89729506b57 100644 --- a/modular_zubbers/code/_onclick/hud/screen_objects/hud_timer.dm +++ b/modular_zubbers/code/_onclick/hud/screen_objects/hud_timer.dm @@ -134,11 +134,11 @@ attach(source, FALSE) /atom/movable/screen/text/screen_timer/Destroy() - . = ..() if(length(timer_mobs)) remove_from(timer_mobs) STOP_PROCESSING(SSprocessing, src) + . = ..() /atom/movable/screen/text/screen_timer/attached maptext_x = 0 @@ -202,6 +202,6 @@ abstract_move(get_turf(tracked)) /atom/movable/screen/text/screen_timer/attached/Destroy() - . = ..() if(following_object) unregister_follower() + . = ..() diff --git a/modular_zubbers/code/modules/nanites/nanite_programs/utility.dm b/modular_zubbers/code/modules/nanites/nanite_programs/utility.dm index 5b317979bf2..5c2fd152a23 100644 --- a/modular_zubbers/code/modules/nanites/nanite_programs/utility.dm +++ b/modular_zubbers/code/modules/nanites/nanite_programs/utility.dm @@ -226,10 +226,10 @@ var/decay_timer /datum/nanite_program/nanite_sting/Destroy() - . = ..() if(!decay_timer) - return + return ..() decay_sting() + . = ..() /datum/nanite_program/nanite_sting/on_trigger(comm_message) consume_nanites(-15) diff --git a/modular_zubbers/code/modules/ratqueen/regalrat.dm b/modular_zubbers/code/modules/ratqueen/regalrat.dm index 57a74975ed8..69609994f7e 100644 --- a/modular_zubbers/code/modules/ratqueen/regalrat.dm +++ b/modular_zubbers/code/modules/ratqueen/regalrat.dm @@ -32,9 +32,9 @@ current_look.apply(src) /mob/living/basic/regal_rat/Destroy() - . = ..() QDEL_NULL(fashion_select) QDEL_NULL(current_look) + . = ..() /// Regal rat swallows sludge to transform themselves into a different looking rat /datum/action/cooldown/rat_fashion From 40002fe0dfc6c7b28baba059c4edb2e08c98c443 Mon Sep 17 00:00:00 2001 From: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Wed, 30 Apr 2025 19:42:02 -0400 Subject: [PATCH 03/43] Fix bug with loadout items replacing properties of similar job items (#3674) ## About The Pull Request Loadout equipping code checks mob equipment when running `on_equip_item` which would normally be fine because it eventually loops to the items in the case but if a job has the same type path as something in the loadout, say `/obj/item/clothing/head/beret` in the loadout and `/obj/item/clothing/head/beret/blueshield` in the job, it'll apply the loadout prefs to the job item because that's earlier in the list and that can break shit ## Why It's Good For The Game Fixes #3667 ## Proof Of Testing
Screenshots/Videos ![image](https://github.com/user-attachments/assets/da7df967-6cc6-463e-a2b1-ab5553e9bf0f)
## Changelog :cl: fix: fixed loadout item customization breaking job equipment under certain circumstances /:cl: --- code/modules/loadout/loadout_helpers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/loadout/loadout_helpers.dm b/code/modules/loadout/loadout_helpers.dm index 03d83e4326a..2a1a709e06f 100644 --- a/code/modules/loadout/loadout_helpers.dm +++ b/code/modules/loadout/loadout_helpers.dm @@ -76,7 +76,7 @@ var/update = NONE for(var/datum/loadout_item/item as anything in loadout_datums) update |= item.on_equip_item( - equipped_item = locate(item.item_path) in new_contents, + equipped_item = loadout_placement_preference == LOADOUT_OVERRIDE_CASE ? locate(item.item_path) in travel_suitcase : locate(item.item_path) in new_contents, // BUBBER EDIT CHANGE - ORIGINAL: equipped_item = locate(item.item_path) in new_contents, preference_source = preference_source, preference_list = preference_list, equipper = src, From b13c9128cbdeee51e5661a717bdc81b9b5a36d57 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu, 1 May 2025 01:42:25 +0200 Subject: [PATCH 04/43] Automatic changelog for PR #3674 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3674.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3674.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3674.yml b/html/changelogs/AutoChangeLog-bubber-pr-3674.yml new file mode 100644 index 00000000000..500f00173a5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3674.yml @@ -0,0 +1,4 @@ +author: "TealSeer" +delete-after: True +changes: + - bugfix: "fixed loadout item customization breaking job equipment under certain circumstances" \ No newline at end of file From 364f615978fa61b128d82dc7d125bfcc0104d001 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Wed, 30 Apr 2025 23:59:59 +0000 Subject: [PATCH 05/43] Bubberstation automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3674.yml | 4 ---- html/changelogs/bubber_archive/2025-04.yml | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3674.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3674.yml b/html/changelogs/AutoChangeLog-bubber-pr-3674.yml deleted file mode 100644 index 500f00173a5..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3674.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TealSeer" -delete-after: True -changes: - - bugfix: "fixed loadout item customization breaking job equipment under certain circumstances" \ No newline at end of file diff --git a/html/changelogs/bubber_archive/2025-04.yml b/html/changelogs/bubber_archive/2025-04.yml index 65c4263343e..6aa068a4ed1 100644 --- a/html/changelogs/bubber_archive/2025-04.yml +++ b/html/changelogs/bubber_archive/2025-04.yml @@ -319,3 +319,7 @@ - code_imp: moffson should work without needing an ai to be damaged now. thegrb93: - rscdel: Remove asynchronous blinking due to eyes getting stuck closed +2025-04-30: + TealSeer: + - bugfix: fixed loadout item customization breaking job equipment under certain + circumstances From 13a608a949dd0cf690241a95cf1277fce4170ec9 Mon Sep 17 00:00:00 2001 From: Vanilla1040 <94153240+Vanilla1040@users.noreply.github.com> Date: Thu, 1 May 2025 16:03:11 +0200 Subject: [PATCH 06/43] QOL for Entombed (#3465) ## About The Pull Request Adds a Emergency Reboot button in the strip menu so entombed people dont get stuck in a death loop port from Nova ## Why It's Good For The Game Fixes the issue of entombed people being stuck in a constant death loop because of toxin buildup killing them over and over and so you can reboot the MOD on a dead person so they dont have to do it when they are alive again. ## Proof Of Testing Complies and tested on localhost ## Changelog :cl: qol: Add Emergency Reboot button in strip menu for entombed people /:cl: --------- Co-authored-by: Ephemeralis --- .../datums/quirks/neutral_quirks/entombed.dm | 7 +++-- .../code/entombed_alt_actions.dm | 28 +++++++++++++++++++ .../entombed_quirk/code/entombed_mod.dm | 7 +++++ tgstation.dme | 1 + tgui/packages/tgui/interfaces/StripMenu.tsx | 5 ++++ 5 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 modular_zubbers/master_files/code/modules/entombed_quirk/code/entombed_alt_actions.dm diff --git a/modular_zubbers/code/datums/quirks/neutral_quirks/entombed.dm b/modular_zubbers/code/datums/quirks/neutral_quirks/entombed.dm index 5f6f2f26454..19b86646a9a 100644 --- a/modular_zubbers/code/datums/quirks/neutral_quirks/entombed.dm +++ b/modular_zubbers/code/datums/quirks/neutral_quirks/entombed.dm @@ -29,9 +29,10 @@ // This also helps for when the modsuit is out of power, as (to my awareness), there is no way currently to turn on someone else's entombed modsuit. return if (!modsuit || life_support_failed) - // we've got no modsuit or life support. take damage ow - human_holder.adjustToxLoss(ENTOMBED_TICK_DAMAGE * seconds_per_tick, updating_health = TRUE, forced = TRUE) - human_holder.set_jitter_if_lower(10 SECONDS) + if (!HAS_TRAIT(human_holder, TRAIT_STASIS)) + // we've got no modsuit or life support and we're not on stasis. take damage ow + human_holder.adjustToxLoss(ENTOMBED_TICK_DAMAGE * seconds_per_tick, updating_health = TRUE, forced = TRUE) + human_holder.set_jitter_if_lower(10 SECONDS) if (!modsuit.active) if (!life_support_timer) diff --git a/modular_zubbers/master_files/code/modules/entombed_quirk/code/entombed_alt_actions.dm b/modular_zubbers/master_files/code/modules/entombed_quirk/code/entombed_alt_actions.dm new file mode 100644 index 00000000000..24dffc324c1 --- /dev/null +++ b/modular_zubbers/master_files/code/modules/entombed_quirk/code/entombed_alt_actions.dm @@ -0,0 +1,28 @@ +// This code handles the strip menu minutae for re-enabling someone's deactivated entombed suit. + +/datum/strippable_item/mob_item_slot/back/get_alternate_actions(atom/source, mob/user) + . = ..() + var/obj/item/mod/control/pre_equipped/entombed/entombed_suit = get_item(source) + if (!istype(entombed_suit)) + return null + + if (!entombed_suit.active) + return list("entombed_emergency_reactivate") + +/datum/strippable_item/mob_item_slot/back/perform_alternate_action(atom/source, mob/user, action_key) + . = ..() + var/obj/item/mod/control/pre_equipped/entombed/entombed_suit = get_item(source) + if (!istype(entombed_suit)) + return null + + switch (action_key) + if ("entombed_emergency_reactivate") + if (!entombed_suit.active) + user.visible_message(span_info("[user] begins initiating emergency reactivation procedures on [entombed_suit]...")) + if (do_after(user, 3 SECONDS, entombed_suit.wearer)) + // deploy all our parts so activation actually works + for (var/obj/item/part as anything in entombed_suit.mod_parts) + entombed_suit.deploy(user, part) + entombed_suit.toggle_activate(user, TRUE) + else + user.balloon_alert(usr, "their suit is already online!") diff --git a/modular_zubbers/master_files/code/modules/entombed_quirk/code/entombed_mod.dm b/modular_zubbers/master_files/code/modules/entombed_quirk/code/entombed_mod.dm index 75f21179ac9..27572b2483f 100644 --- a/modular_zubbers/master_files/code/modules/entombed_quirk/code/entombed_mod.dm +++ b/modular_zubbers/master_files/code/modules/entombed_quirk/code/entombed_mod.dm @@ -39,6 +39,8 @@ /obj/item/mod/module/storage/large_capacity ) +// CUSTOM BEHAVIOR + /obj/item/mod/control/pre_equipped/entombed/canStrip(mob/who) return TRUE //you can always try, and it'll hit doStrip below @@ -82,3 +84,8 @@ /obj/item/mod/control/pre_equipped/entombed/Initialize(mapload, new_theme, new_skin, new_core) . = ..() ADD_TRAIT(src, TRAIT_NODROP, QUIRK_TRAIT) + +/obj/item/mod/control/pre_equipped/entombed/dropped(mob/user) + . = ..() + // we do this so that in the rare event that someone gets gibbed/destroyed, their suit can be retrieved easily w/o requiring admin intervention + REMOVE_TRAIT(src, TRAIT_NODROP, QUIRK_TRAIT) diff --git a/tgstation.dme b/tgstation.dme index 8e4d2a1d080..d361828e2f5 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9676,6 +9676,7 @@ #include "modular_zubbers\master_files\code\modules\client\preferences\hypnopref.dm" #include "modular_zubbers\master_files\code\modules\client\preferences\obscurity_examine.dm" #include "modular_zubbers\master_files\code\modules\client\preferences\scaling_method.dm" +#include "modular_zubbers\master_files\code\modules\entombed_quirk\code\entombed_alt_actions.dm" #include "modular_zubbers\master_files\code\modules\entombed_quirk\code\entombed_mod.dm" #include "modular_zubbers\master_files\code\modules\events\carp_migration.dm" #include "modular_zubbers\master_files\code\modules\events\gravity_generator_blackout.dm" diff --git a/tgui/packages/tgui/interfaces/StripMenu.tsx b/tgui/packages/tgui/interfaces/StripMenu.tsx index 2e8b78828cf..d9896e6b5ba 100644 --- a/tgui/packages/tgui/interfaces/StripMenu.tsx +++ b/tgui/packages/tgui/interfaces/StripMenu.tsx @@ -78,6 +78,11 @@ const ALTERNATE_ACTIONS: Record = { icon: 'microchip', text: 'Adjust sensors', }, + // BUBBER EDIT BEGIN - entombed quirk suit reactivation + entombed_emergency_reactivate: { + icon: 'power-off', + text: 'Emergency MODsuit reactivation', + }, // BUBBER EDIT END }; const SLOTS: Record< From db86b17e83663453cad43fbf57bf225d2a562072 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu, 1 May 2025 16:03:34 +0200 Subject: [PATCH 07/43] Automatic changelog for PR #3465 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3465.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3465.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3465.yml b/html/changelogs/AutoChangeLog-bubber-pr-3465.yml new file mode 100644 index 00000000000..8077890b30d --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3465.yml @@ -0,0 +1,4 @@ +author: "Vanilla1040" +delete-after: True +changes: + - qol: "Add Emergency Reboot button in strip menu for entombed people" \ No newline at end of file From 0cd35045a28bce07b5956111237a4fa1c36ab896 Mon Sep 17 00:00:00 2001 From: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Thu, 1 May 2025 17:36:33 -0400 Subject: [PATCH 08/43] Add default to arrivals shuttle auto return config (#3681) ## About The Pull Request Yeah ## Why It's Good For The Game Fixes #3680 ## Proof Of Testing Yeag ## Changelog :cl: config: the arrivals shuttle should automatically return to the interlink again /:cl: --- modular_skyrat/master_files/code/_globalvars/configuration.dm | 4 +++- modular_skyrat/modules/advanced_shuttles/code/shuttles.dm | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modular_skyrat/master_files/code/_globalvars/configuration.dm b/modular_skyrat/master_files/code/_globalvars/configuration.dm index f2f60e22a42..3ee51edbb66 100644 --- a/modular_skyrat/master_files/code/_globalvars/configuration.dm +++ b/modular_skyrat/master_files/code/_globalvars/configuration.dm @@ -67,5 +67,7 @@ GLOBAL_VAR_INIT(looc_allowed, TRUE) /// Split the threat budget between roundstart and midrounds /datum/config_entry/flag/split_threat_budget -// How much time arrivals shuttle should stay at station after its engines recharged before returning to interlink. In deciseconds. 150 - 15 seconds. 0 - disables autoreturn +// How much time arrivals shuttle should stay at station after its engines recharged before returning to interlink, in deciseconds. 0 - disables autoreturn /datum/config_entry/number/arrivals_wait + default = 150 + min_val = 0 diff --git a/modular_skyrat/modules/advanced_shuttles/code/shuttles.dm b/modular_skyrat/modules/advanced_shuttles/code/shuttles.dm index ebcbf017b3b..77fde6c19b5 100644 --- a/modular_skyrat/modules/advanced_shuttles/code/shuttles.dm +++ b/modular_skyrat/modules/advanced_shuttles/code/shuttles.dm @@ -16,7 +16,7 @@ ///Our shuttle's control console var/obj/machinery/computer/shuttle/arrivals/console - ///How much time are we waiting before returning to interlink. Sets itself automatically from config file + ///How much time are we waiting before returning to interlink. Sets itself automatically from config file. 0 = no auto return var/wait_time ///State variable. True when our shuttle is waiting before autoreturn var/waiting = FALSE // would've been better to use shuttle's mode variable, but check() resets it to SHUTTLE_IDLE so it's more sane way to make this fully modular From 204deee8712bdfbef5480cacf5405a3924c314bf Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu, 1 May 2025 23:36:57 +0200 Subject: [PATCH 09/43] Automatic changelog for PR #3681 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3681.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3681.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3681.yml b/html/changelogs/AutoChangeLog-bubber-pr-3681.yml new file mode 100644 index 00000000000..dc2c6a88bd6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3681.yml @@ -0,0 +1,4 @@ +author: "TealSeer" +delete-after: True +changes: + - config: "the arrivals shuttle should automatically return to the interlink again" \ No newline at end of file From 511154d5bf7f500cc89d08a60551babc4c6966a1 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu, 1 May 2025 23:27:33 +0000 Subject: [PATCH 10/43] Bubberstation automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3465.yml | 4 ---- html/changelogs/AutoChangeLog-bubber-pr-3681.yml | 4 ---- html/changelogs/bubber_archive/2025-05.yml | 5 +++++ 3 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3465.yml delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3681.yml create mode 100644 html/changelogs/bubber_archive/2025-05.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3465.yml b/html/changelogs/AutoChangeLog-bubber-pr-3465.yml deleted file mode 100644 index 8077890b30d..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3465.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Vanilla1040" -delete-after: True -changes: - - qol: "Add Emergency Reboot button in strip menu for entombed people" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3681.yml b/html/changelogs/AutoChangeLog-bubber-pr-3681.yml deleted file mode 100644 index dc2c6a88bd6..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3681.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TealSeer" -delete-after: True -changes: - - config: "the arrivals shuttle should automatically return to the interlink again" \ No newline at end of file diff --git a/html/changelogs/bubber_archive/2025-05.yml b/html/changelogs/bubber_archive/2025-05.yml new file mode 100644 index 00000000000..9f95c52322a --- /dev/null +++ b/html/changelogs/bubber_archive/2025-05.yml @@ -0,0 +1,5 @@ +2025-05-01: + TealSeer: + - config: the arrivals shuttle should automatically return to the interlink again + Vanilla1040: + - qol: Add Emergency Reboot button in strip menu for entombed people From 386a60aec3d980790b4bcf3585e1197408b9647d Mon Sep 17 00:00:00 2001 From: Arturlang <24881678+Arturlang@users.noreply.github.com> Date: Fri, 2 May 2025 02:37:28 +0300 Subject: [PATCH 11/43] fix nanites leaving bad moods stuck forever (#3682) ## About The Pull Request fix nanites leaving bad moods stuck forever ## Why It's Good For The Game bug bad ## Proof Of Testing nope
Screenshots/Videos
## Changelog :cl: fix: fix nanites leaving bad moods stuck forever /:cl: --- .../nanites/nanite_programs/suppression.dm | 36 ++++++++----------- .../code/modules/nanites/program_designs.dm | 4 +-- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/modular_zubbers/code/modules/nanites/nanite_programs/suppression.dm b/modular_zubbers/code/modules/nanites/nanite_programs/suppression.dm index 7d539fc8a30..f8b01ba027f 100644 --- a/modular_zubbers/code/modules/nanites/nanite_programs/suppression.dm +++ b/modular_zubbers/code/modules/nanites/nanite_programs/suppression.dm @@ -256,38 +256,30 @@ else extra_settings.Remove(NES_HALLUCINATION_DETAIL) -/datum/nanite_program/good_mood +/datum/nanite_program/mood name = "Happiness Enhancer" desc = "The nanites synthesize serotonin inside the host's brain, creating an artificial sense of happiness." use_rate = 0.1 rogue_types = list(/datum/nanite_program/brain_decay) + var/mood_event = /datum/mood_event/nanite_happiness + var/default_text = "HAPPINESS ENHANCEMENT" + var/mood_category = "nanite_happy" -/datum/nanite_program/good_mood/register_extra_settings() +/datum/nanite_program/mood/register_extra_settings() . = ..() - extra_settings[NES_MOOD_MESSAGE] = new /datum/nanite_extra_setting/text("HAPPINESS ENHANCEMENT") + extra_settings[NES_MOOD_MESSAGE] = new /datum/nanite_extra_setting/text(default_text) -/datum/nanite_program/good_mood/enable_passive_effect() +/datum/nanite_program/mood/enable_passive_effect() . = ..() - host_mob.add_mood_event("nanite_happy", /datum/mood_event/nanite_happiness, get_extra_setting_value(NES_MOOD_MESSAGE)) + host_mob.add_mood_event(mood_category, mood_event, get_extra_setting_value(NES_MOOD_MESSAGE)) -/datum/nanite_program/good_mood/disable_passive_effect() +/datum/nanite_program/mood/disable_passive_effect() . = ..() - host_mob.clear_mood_event("nanite_happy") + host_mob.clear_mood_event(mood_category) -/datum/nanite_program/bad_mood +/datum/nanite_program/mood/bad name = "Happiness Suppressor" desc = "The nanites suppress the production of serotonin inside the host's brain, creating an artificial state of depression." - use_rate = 0.1 - rogue_types = list(/datum/nanite_program/brain_decay) - -/datum/nanite_program/bad_mood/register_extra_settings() - . = ..() - extra_settings[NES_MOOD_MESSAGE] = new /datum/nanite_extra_setting/text("HAPPINESS SUPPRESSION") - -/datum/nanite_program/bad_mood/enable_passive_effect() - . = ..() - host_mob.add_mood_event("nanite_unhappy", /datum/mood_event/nanite_sadness, get_extra_setting_value(NES_MOOD_MESSAGE)) - -/datum/nanite_program/bad_mood/disable_passive_effect() - . = ..() - host_mob.add_mood_event("nanite_unhappy") + mood_event = /datum/mood_event/nanite_sadness + default_text = "HAPPINESS SUPPRESSION" + mood_category = "nanite_unhappy" diff --git a/modular_zubbers/code/modules/nanites/program_designs.dm b/modular_zubbers/code/modules/nanites/program_designs.dm index 6dbfb469664..1dc20be7da3 100644 --- a/modular_zubbers/code/modules/nanites/program_designs.dm +++ b/modular_zubbers/code/modules/nanites/program_designs.dm @@ -451,14 +451,14 @@ name = "Happiness Enhancer" desc = "The nanites synthesize serotonin inside the host's brain, creating an artificial sense of happiness." id = "good_mood_nanites" - program_type = /datum/nanite_program/good_mood + program_type = /datum/nanite_program/mood category = list("Suppression Nanites") /datum/design/nanites/bad_mood name = "Happiness Suppressor" desc = "The nanites suppress the production of serotonin inside the host's brain, creating an artificial state of depression." id = "bad_mood_nanites" - program_type = /datum/nanite_program/bad_mood + program_type = /datum/nanite_program/mood/bad category = list("Suppression Nanites") ////////////////////SENSOR NANITES////////////////////////////////////// From 2aa0d1734c4b53b97d8c9a00006c66e8da5ade5c Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri, 2 May 2025 01:37:54 +0200 Subject: [PATCH 12/43] Automatic changelog for PR #3682 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3682.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3682.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3682.yml b/html/changelogs/AutoChangeLog-bubber-pr-3682.yml new file mode 100644 index 00000000000..b02737b271e --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3682.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - bugfix: "fix nanites leaving bad moods stuck forever" \ No newline at end of file From 3a06d0b520c1cc48288b04e2892f209e0b7904e9 Mon Sep 17 00:00:00 2001 From: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Thu, 1 May 2025 23:48:05 -0400 Subject: [PATCH 13/43] Fix colony ore silo trying to add a new repackable element to it every time someone inserts materials (#3686) ## About The Pull Request I don't fucking know what happened here ## Why It's Good For The Game This thing is runtiming like crazy because its constantly overwriting its own signal listeners ## Proof Of Testing I didn't but I physically cannot make it worse than it already is ## Changelog Nothing player facing --- .../modules/colony_fabricator/code/machines/ore_silo.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modular_skyrat/modules/colony_fabricator/code/machines/ore_silo.dm b/modular_skyrat/modules/colony_fabricator/code/machines/ore_silo.dm index 6f71fb37498..1d92d7ff861 100644 --- a/modular_skyrat/modules/colony_fabricator/code/machines/ore_silo.dm +++ b/modular_skyrat/modules/colony_fabricator/code/machines/ore_silo.dm @@ -7,10 +7,13 @@ /// What this packs into var/packed_type = /obj/item/flatpacked_machine/ore_silo +/obj/machinery/ore_silo/colony_lathe/Initialize(mapload) + . = ..() + AddElement(/datum/element/repackable, packed_type, 10 SECONDS) + /obj/machinery/ore_silo/colony_lathe/silo_log(obj/machinery/machinery_in_question, action, amount, noun, list/mats) . = ..() playsound(src, 'sound/machines/beep/beep.ogg', 30, TRUE) - AddElement(/datum/element/repackable, packed_type, 10 SECONDS) /obj/machinery/ore_silo/colony_lathe/default_deconstruction_crowbar() return From 8c0ad7bcb6436a1d9c2392375344bc50ff61bf52 Mon Sep 17 00:00:00 2001 From: chestlet <98193039+chestlet@users.noreply.github.com> Date: Fri, 2 May 2025 02:13:53 -0700 Subject: [PATCH 14/43] Optimize character loading TGUI windows by denying dummies their eyelids (#90924) ## About The Pull Request I update. One preference. It runs many many calls for `animate_eyelid`. This is extremely resource intensive and we shouldn't do it. The previews do not need to blink anyway. ## Why It's Good For The Game Makes character previews less expensive on the server-side. ## Changelog :cl: Chestlet fix: Removed eyelids from dummies to make all TGUI windows in which they appear more optimized. /:cl: --- code/modules/mob/living/carbon/human/dummy.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index d1fb4596dec..3a312af3ba2 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -10,6 +10,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) /mob/living/carbon/human/dummy/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_GODMODE, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_PREVENT_BLINKING, INNATE_TRAIT) /mob/living/carbon/human/dummy/Destroy() in_use = FALSE From 11c357c549e941ce4113726e69176c5825b24a68 Mon Sep 17 00:00:00 2001 From: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri, 2 May 2025 15:51:46 -0400 Subject: [PATCH 15/43] Change a RegisterSignal to RegisterSignals (#3689) ## About The Pull Request Not supposed to pass lists of signals into `RegisterSignal` anymore ## Why It's Good For The Game ![image](https://github.com/user-attachments/assets/03b51ef0-d6f6-4bc1-819d-daf90bb93458) ## Proof Of Testing You know I'm good for it... ## Changelog N/A --- modular_skyrat/modules/borgs/code/robot_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_skyrat/modules/borgs/code/robot_items.dm b/modular_skyrat/modules/borgs/code/robot_items.dm index afd3362fb10..df70a29c2b9 100644 --- a/modular_skyrat/modules/borgs/code/robot_items.dm +++ b/modular_skyrat/modules/borgs/code/robot_items.dm @@ -734,7 +734,7 @@ return if(listeningTo) UnregisterSignal(listeningTo, signalCache) - RegisterSignal(user, signalCache, PROC_REF(disrupt)) + RegisterSignals(user, signalCache, PROC_REF(disrupt)) listeningTo = user /obj/item/borg_shapeshifter/proc/deactivate(mob/living/silicon/robot/user) From 964e6382b15a34021e310768c159956bf71d3c89 Mon Sep 17 00:00:00 2001 From: Arturlang <24881678+Arturlang@users.noreply.github.com> Date: Sat, 3 May 2025 00:32:09 +0300 Subject: [PATCH 16/43] Fix screen color not cleaning up and add erroring on invalid usage (#3694) ## About The Pull Request Fix screen color not cleaning up and add erroring on invalid usage, this includes the echolocation quirk, NV helmet, frenzy. https://github.com/tgstation/tgstation/pull/89843 refactored the procs and we didn't update our usage of it ## Why It's Good For The Game Bug fixes ## Proof Of Testing
Screenshots/Videos :blushes: umm
## Changelog :cl: fix: Fixes NV helmets, frenzy, echolocation quirk leaving screen colors permanently on /:cl: --- modular_skyrat/modules/exp_corps/code/clothing.dm | 4 ++-- .../modules/quirks/echolocation/echolocation.dm | 6 +++--- modular_zubbers/code/modules/client/client_color.dm | 10 ++++++++++ .../code/modules/status_effects/buffs/frenzy.dm | 4 ++-- tgstation.dme | 1 + 5 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 modular_zubbers/code/modules/client/client_color.dm diff --git a/modular_skyrat/modules/exp_corps/code/clothing.dm b/modular_skyrat/modules/exp_corps/code/clothing.dm index a5b57e04cfd..f1a0196d199 100644 --- a/modular_skyrat/modules/exp_corps/code/clothing.dm +++ b/modular_skyrat/modules/exp_corps/code/clothing.dm @@ -229,7 +229,7 @@ if(my_eyes) my_eyes.color_cutoffs = list(10, 30, 10) my_eyes.flash_protect = FLASH_PROTECTION_SENSITIVE - current_user.add_client_colour(/datum/client_colour/glass_colour/lightgreen) + current_user.add_client_colour(/datum/client_colour/glass_colour/lightgreen, REF(src)) /obj/item/clothing/head/helmet/expeditionary_corps/proc/disable_nv() if(current_user) @@ -237,7 +237,7 @@ if(my_eyes) my_eyes.color_cutoffs = initial(my_eyes.color_cutoffs) my_eyes.flash_protect = initial(my_eyes.flash_protect) - current_user.remove_client_colour(/datum/client_colour/glass_colour/lightgreen) + current_user.remove_client_colour(REF(src)) current_user.update_sight() /obj/item/clothing/head/helmet/expeditionary_corps/click_alt(mob/user) diff --git a/modular_skyrat/modules/quirks/echolocation/echolocation.dm b/modular_skyrat/modules/quirks/echolocation/echolocation.dm index 64aa4b9fd45..c296a38db6b 100644 --- a/modular_skyrat/modules/quirks/echolocation/echolocation.dm +++ b/modular_skyrat/modules/quirks/echolocation/echolocation.dm @@ -43,8 +43,8 @@ ) esp = human_holder.GetComponent(/datum/component/echolocation) - human_holder.remove_client_colour(/datum/client_colour/monochrome) - esp_color = human_holder.add_client_colour(/datum/client_colour/echolocation_custom) + human_holder.remove_client_colour(REF(src)) + esp_color = human_holder.add_client_colour(/datum/client_colour/echolocation_custom, REF(src)) esp_color.update_color(col) // add an action/spell to allow the player to toggle echolocation off for a bit (eyestrain on longer rounds, or just roleplay) @@ -57,7 +57,7 @@ QDEL_NULL(esp) // echolocation component removal handles graceful disposal of everything above QDEL_NULL(added_action) // remove the stall action, too var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.remove_client_colour(/datum/client_colour/echolocation_custom) // clean up the custom colour override we added + human_holder.remove_client_colour(REF(src)) // clean up the custom colour override we added UnregisterSignal(human_holder, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine_text)) /datum/quirk/echolocation/proc/on_examine_text(client/client_source, mob/user, list/examine_list) diff --git a/modular_zubbers/code/modules/client/client_color.dm b/modular_zubbers/code/modules/client/client_color.dm new file mode 100644 index 00000000000..416694035bd --- /dev/null +++ b/modular_zubbers/code/modules/client/client_color.dm @@ -0,0 +1,10 @@ + +/mob/add_client_colour(datum/client_colour/new_color, source, force = FALSE) + if(!source) + stack_trace("[src] tried to add a client colour with no source.") + . = ..() + +/mob/remove_client_colour(source) + if(ispath(source)) + stack_trace("[src] tried to remove a client colour with a path source.") + . = ..() diff --git a/modular_zubbers/code/modules/status_effects/buffs/frenzy.dm b/modular_zubbers/code/modules/status_effects/buffs/frenzy.dm index 1726752d560..0c4831d998d 100644 --- a/modular_zubbers/code/modules/status_effects/buffs/frenzy.dm +++ b/modular_zubbers/code/modules/status_effects/buffs/frenzy.dm @@ -48,7 +48,7 @@ was_tooluser = TRUE REMOVE_TRAIT(owner, TRAIT_ADVANCEDTOOLUSER, SPECIES_TRAIT) owner.add_movespeed_modifier(/datum/movespeed_modifier/frenzy_speedup) - owner.add_client_colour(/datum/client_colour/manual_heart_blood) + owner.add_client_colour(/datum/client_colour/manual_heart_blood, REF(src)) var/obj/cuffs = user.get_item_by_slot(ITEM_SLOT_HANDCUFFED) var/obj/legcuffs = user.get_item_by_slot(ITEM_SLOT_LEGCUFFED) if((user.handcuffed && cuffs) || (user.legcuffed && legcuffs)) @@ -64,7 +64,7 @@ ADD_TRAIT(owner, TRAIT_ADVANCEDTOOLUSER, SPECIES_TRAIT) was_tooluser = FALSE owner.remove_movespeed_modifier(/datum/movespeed_modifier/frenzy_speedup) - owner.remove_client_colour(/datum/client_colour/manual_heart_blood) + owner.remove_client_colour(REF(src)) SEND_SIGNAL(bloodsuckerdatum, COMSIG_BLOODSUCKER_EXITS_FRENZY) bloodsuckerdatum.frenzied = FALSE diff --git a/tgstation.dme b/tgstation.dme index d361828e2f5..24851b2edd6 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -9137,6 +9137,7 @@ #include "modular_zubbers\code\modules\changeling_zombies\reagent.dm" #include "modular_zubbers\code\modules\changeling_zombies\virus.dm" #include "modular_zubbers\code\modules\character_preview_background\character_preview_background.dm" +#include "modular_zubbers\code\modules\client\client_color.dm" #include "modular_zubbers\code\modules\client\examine_tgui.dm" #include "modular_zubbers\code\modules\client\preferences.dm" #include "modular_zubbers\code\modules\client\ssd.dm" From 0edb4c088713a6bf1fc8ccded1371b92ff60d285 Mon Sep 17 00:00:00 2001 From: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri, 2 May 2025 17:32:23 -0400 Subject: [PATCH 17/43] Fix hair gradients not working for changelings (#3693) ## About The Pull Request Pending my eventual attempt to eliminate this file completely and the subsequent spiral into madness, copies over the appropriate code from the tg `dna.dm` to transfer hair/facial hair gradient style and color when updating appearance from DNA ## Why It's Good For The Game Fixes #3690 ## Proof Of Testing
Screenshots/Videos ![image](https://github.com/user-attachments/assets/3f5ff084-d261-4ed5-bcea-8e29efc6ecf2) me and the bestie
## Changelog :cl: fix: fixed changelings/paradox clones not copying victim hair gradients /:cl: --- modular_skyrat/modules/customization/datums/dna.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modular_skyrat/modules/customization/datums/dna.dm b/modular_skyrat/modules/customization/datums/dna.dm index 8882b93ebd6..7a1e5afc96d 100644 --- a/modular_skyrat/modules/customization/datums/dna.dm +++ b/modular_skyrat/modules/customization/datums/dna.dm @@ -12,6 +12,8 @@ GLOBAL_LIST_INIT(identity_block_lengths, list( "[DNA_FACIAL_HAIR_COLOR_BLOCK]" = DNA_BLOCK_SIZE_COLOR, "[DNA_EYE_COLOR_LEFT_BLOCK]" = DNA_BLOCK_SIZE_COLOR, "[DNA_EYE_COLOR_RIGHT_BLOCK]" = DNA_BLOCK_SIZE_COLOR, + "[DNA_HAIR_COLOR_GRADIENT_BLOCK]" = DNA_BLOCK_SIZE_COLOR, + "[DNA_FACIAL_HAIR_COLOR_GRADIENT_BLOCK]" = DNA_BLOCK_SIZE_COLOR, )) /** @@ -199,6 +201,8 @@ GLOBAL_LIST_EMPTY(total_uf_len_by_block) eye_color_right = sanitize_hexcolor(get_uni_identity_block(structure, DNA_EYE_COLOR_RIGHT_BLOCK)) set_haircolor(sanitize_hexcolor(get_uni_identity_block(structure, DNA_HAIR_COLOR_BLOCK)), update = FALSE) set_facial_haircolor(sanitize_hexcolor(get_uni_identity_block(structure, DNA_FACIAL_HAIR_COLOR_BLOCK)), update = FALSE) + set_hair_gradient_color(sanitize_hexcolor(get_uni_identity_block(structure, DNA_HAIR_COLOR_GRADIENT_BLOCK)), update = FALSE) + set_facial_hair_gradient_color(sanitize_hexcolor(get_uni_identity_block(structure, DNA_FACIAL_HAIR_COLOR_GRADIENT_BLOCK)), update = FALSE) if(eyeorgancolor_update) add_eye_color_left(eye_color_left, EYE_COLOR_ORGAN_PRIORITY, update_body = FALSE) @@ -208,13 +212,17 @@ GLOBAL_LIST_EMPTY(total_uf_len_by_block) set_facial_hairstyle("Shaved", update = FALSE) else var/style = SSaccessories.facial_hairstyles_list[deconstruct_block(get_uni_identity_block(structure, DNA_FACIAL_HAIRSTYLE_BLOCK), SSaccessories.facial_hairstyles_list.len)] + var/gradient_style = SSaccessories.facial_hair_gradients_list[deconstruct_block(get_uni_identity_block(structure, DNA_FACIAL_HAIRSTYLE_GRADIENT_BLOCK), length(SSaccessories.facial_hair_gradients_list))] set_facial_hairstyle(style, update = FALSE) + set_facial_hair_gradient_style(gradient_style, update = FALSE) if(HAS_TRAIT(src, TRAIT_BALD)) set_hairstyle("Bald", update = FALSE) else var/style = SSaccessories.hairstyles_list[deconstruct_block(get_uni_identity_block(structure, DNA_HAIRSTYLE_BLOCK), SSaccessories.hairstyles_list.len)] + var/gradient_style = SSaccessories.hair_gradients_list[deconstruct_block(get_uni_identity_block(structure, DNA_HAIRSTYLE_GRADIENT_BLOCK), length(SSaccessories.hair_gradients_list))] set_hairstyle(style, update = FALSE) + set_hair_gradient_style(gradient_style, update = FALSE) var/features = dna.unique_features if(dna.features["mcolor"]) From c37691f469dea3d7311ee1e4d415fdb7457f9828 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri, 2 May 2025 23:32:33 +0200 Subject: [PATCH 18/43] Automatic changelog for PR #3694 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3694.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3694.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3694.yml b/html/changelogs/AutoChangeLog-bubber-pr-3694.yml new file mode 100644 index 00000000000..afbf57042fe --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3694.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - bugfix: "Fixes NV helmets, frenzy, echolocation quirk leaving screen colors permanently on" \ No newline at end of file From bf2e16c8ccc50d24b0b2e31be7676d8be090878f Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri, 2 May 2025 23:32:47 +0200 Subject: [PATCH 19/43] Automatic changelog for PR #3693 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3693.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3693.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3693.yml b/html/changelogs/AutoChangeLog-bubber-pr-3693.yml new file mode 100644 index 00000000000..22c323dca60 --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3693.yml @@ -0,0 +1,4 @@ +author: "TealSeer" +delete-after: True +changes: + - bugfix: "fixed changelings/paradox clones not copying victim hair gradients" \ No newline at end of file From 859196cf7aa0c88818a0c5281ae5d10ede76653d Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri, 2 May 2025 23:23:59 +0000 Subject: [PATCH 20/43] Bubberstation automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3682.yml | 4 ---- html/changelogs/AutoChangeLog-bubber-pr-3693.yml | 4 ---- html/changelogs/AutoChangeLog-bubber-pr-3694.yml | 4 ---- html/changelogs/bubber_archive/2025-05.yml | 7 +++++++ 4 files changed, 7 insertions(+), 12 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3682.yml delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3693.yml delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3694.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3682.yml b/html/changelogs/AutoChangeLog-bubber-pr-3682.yml deleted file mode 100644 index b02737b271e..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3682.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - bugfix: "fix nanites leaving bad moods stuck forever" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3693.yml b/html/changelogs/AutoChangeLog-bubber-pr-3693.yml deleted file mode 100644 index 22c323dca60..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3693.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TealSeer" -delete-after: True -changes: - - bugfix: "fixed changelings/paradox clones not copying victim hair gradients" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3694.yml b/html/changelogs/AutoChangeLog-bubber-pr-3694.yml deleted file mode 100644 index afbf57042fe..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3694.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - bugfix: "Fixes NV helmets, frenzy, echolocation quirk leaving screen colors permanently on" \ No newline at end of file diff --git a/html/changelogs/bubber_archive/2025-05.yml b/html/changelogs/bubber_archive/2025-05.yml index 9f95c52322a..523647627a0 100644 --- a/html/changelogs/bubber_archive/2025-05.yml +++ b/html/changelogs/bubber_archive/2025-05.yml @@ -3,3 +3,10 @@ - config: the arrivals shuttle should automatically return to the interlink again Vanilla1040: - qol: Add Emergency Reboot button in strip menu for entombed people +2025-05-02: + Arturlang: + - bugfix: Fixes NV helmets, frenzy, echolocation quirk leaving screen colors permanently + on + - bugfix: fix nanites leaving bad moods stuck forever + TealSeer: + - bugfix: fixed changelings/paradox clones not copying victim hair gradients From 2673c8a274eee254db38955f51330a6eda1c4ba7 Mon Sep 17 00:00:00 2001 From: SapphoQueer <94389951+SapphoQueer@users.noreply.github.com> Date: Sat, 3 May 2025 02:26:12 +0200 Subject: [PATCH 21/43] Adds the IRS outfit back to the autodrobe (#3691) ## About The Pull Request Adds the IRS outfit back to the autodrobe ## Why It's Good For The Game i use this outfit on my human female on /tg/ and i should be able to use it here ## Proof Of Testing
Screenshots/Videos ![Untitled](https://github.com/user-attachments/assets/b1e78b3e-72c3-48e3-81f4-4b1d91fdb6a2)
## Changelog :cl: add: Added the IRS outfit back to the autodrobe /:cl: --- modular_skyrat/modules/modular_vending/code/autodrobe.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modular_skyrat/modules/modular_vending/code/autodrobe.dm b/modular_skyrat/modules/modular_vending/code/autodrobe.dm index 237d1c32cc7..588e3a98f55 100644 --- a/modular_skyrat/modules/modular_vending/code/autodrobe.dm +++ b/modular_skyrat/modules/modular_vending/code/autodrobe.dm @@ -77,6 +77,8 @@ /obj/item/clothing/shoes/winterboots/christmas = 5, /obj/item/clothing/shoes/winterboots/christmas/green = 5, /obj/item/clothing/under/pants/tactical = 5, + /obj/item/clothing/head/costume/irs = 5, + /obj/item/clothing/suit/costume/irs = 5 ), ), ) From 8ecc8f355e03e08e4b0d87b31f6b0f905a7b4af2 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat, 3 May 2025 02:26:36 +0200 Subject: [PATCH 22/43] Automatic changelog for PR #3691 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3691.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3691.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3691.yml b/html/changelogs/AutoChangeLog-bubber-pr-3691.yml new file mode 100644 index 00000000000..04d4db9c3df --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3691.yml @@ -0,0 +1,4 @@ +author: "SapphoQueer" +delete-after: True +changes: + - rscadd: "Added the IRS outfit back to the autodrobe" \ No newline at end of file From 7aa9ba2a93a4571691f4fc9a3955a95d7167cf1c Mon Sep 17 00:00:00 2001 From: Shadow-Quill <44811257+Shadow-Quill@users.noreply.github.com> Date: Fri, 2 May 2025 18:37:32 -0600 Subject: [PATCH 23/43] Percy has been rust-proofed. (#3695) ## About The Pull Request I added rustoleum. ## Changelog :cl: fix: Percy no longer rusts away. /:cl: --------- Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com> --- modular_zubbers/maps/offstation/persistence/area.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/modular_zubbers/maps/offstation/persistence/area.dm b/modular_zubbers/maps/offstation/persistence/area.dm index 6dff743a124..fb8da5bc189 100644 --- a/modular_zubbers/maps/offstation/persistence/area.dm +++ b/modular_zubbers/maps/offstation/persistence/area.dm @@ -6,6 +6,7 @@ icon_state = "syndie-ship" outdoors = FALSE ignore_weather_sfx = TRUE + flags_1 = parent_type::flags_1 & ~(CAN_BE_DIRTY_1) // Stops SSDecay from affecting the Persistance // Cargo From b2575bb40f55f00b59d6e69d5956bc7f1a137788 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat, 3 May 2025 02:37:55 +0200 Subject: [PATCH 24/43] Automatic changelog for PR #3695 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3695.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3695.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3695.yml b/html/changelogs/AutoChangeLog-bubber-pr-3695.yml new file mode 100644 index 00000000000..dace9672268 --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3695.yml @@ -0,0 +1,4 @@ +author: "Shadow-Quill" +delete-after: True +changes: + - bugfix: "Percy no longer rusts away." \ No newline at end of file From 59ea33a2a31a30c79d65736567512232889b8fde Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat, 3 May 2025 00:39:11 +0000 Subject: [PATCH 25/43] Bubberstation automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3691.yml | 4 ---- html/changelogs/AutoChangeLog-bubber-pr-3695.yml | 4 ---- html/changelogs/bubber_archive/2025-05.yml | 5 +++++ 3 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3691.yml delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3695.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3691.yml b/html/changelogs/AutoChangeLog-bubber-pr-3691.yml deleted file mode 100644 index 04d4db9c3df..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3691.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SapphoQueer" -delete-after: True -changes: - - rscadd: "Added the IRS outfit back to the autodrobe" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3695.yml b/html/changelogs/AutoChangeLog-bubber-pr-3695.yml deleted file mode 100644 index dace9672268..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3695.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Shadow-Quill" -delete-after: True -changes: - - bugfix: "Percy no longer rusts away." \ No newline at end of file diff --git a/html/changelogs/bubber_archive/2025-05.yml b/html/changelogs/bubber_archive/2025-05.yml index 523647627a0..3ea39cd2fa2 100644 --- a/html/changelogs/bubber_archive/2025-05.yml +++ b/html/changelogs/bubber_archive/2025-05.yml @@ -10,3 +10,8 @@ - bugfix: fix nanites leaving bad moods stuck forever TealSeer: - bugfix: fixed changelings/paradox clones not copying victim hair gradients +2025-05-03: + SapphoQueer: + - rscadd: Added the IRS outfit back to the autodrobe + Shadow-Quill: + - bugfix: Percy no longer rusts away. From ca25d72608b84b248359298a3e5e47cffbf9b734 Mon Sep 17 00:00:00 2001 From: _0Steven <42909981+00-Steven@users.noreply.github.com> Date: Sat, 3 May 2025 02:47:43 +0200 Subject: [PATCH 26/43] Custom emotes actually use `+|_` emphasis formatting, your own emotes don't trip highlights (#90858) So I was running into the bit where custom emotes actually don't get the `+|_` emphasis formatting applied to them, _except_ for the runechat portion which *does*. This felt annoying, especially given I've seen a lot of people try it and have it not work. Add to that that your own emotes would keep getting highlighted, blotting out other people mentioning your highlighted messages, and here's this pr. In this pr we add a few flags to audible/visible messages, `WITH_EMPHASIS_MESSAGE` and `BLOCK_SELF_HIGHLIGHT_MESSAGE`, which respectively apply emphasis formatting and block highlighting the message to oneself. We're doing this with flags because I felt always applying this would be unnecessary. Most audible/visible messages won't need to check for formatting, and quite a lot we *do* want to be highlighted. As such, we apply these flags as need be. For emotes we do this by having `get_message_flags(intentional)`, which applies `BLOCK_SELF_HIGHLIGHT_MESSAGE` based on whether the message is intentional, and on the custom emote subtype applies `WITH_EMPHASIS_MESSAGE`. Because it's not just for _say_ anymore, and already was also used for emote runechats, we rename `say_emphasis(input)` into `apply_message_emphasis(input)`. We additionally move it down to `/atom` from `/atom/movable`, such that visible/audible messages can in fact call it. That resolves our issues. We also apply `BLOCK_SELF_HIGHLIGHT_MESSAGE` to sign language tone messages, as they're essentially a part of speech. Being able to do `+|_` emphasis formatting on your emotes is nice, I've seen a lot of people try it and have it not work. Especially weird given it DOES apply to the runechat message, just not the text chat message. It's annoying when your own emotes trip your own highlights! Like if you have a name highlight, your own emotes getting constantly highlighted would blot out other people talking to you. So having your own emotes not trip it just like your own talking makes that less of a pain. But sometimes emotes are forced, and in that case I think it's better to keep the highlight because it's just like other people's messages information the player might want to be notified of. Generally, I think if it's the player's input it probably shouldn't be highlighted, while if it isn't the player's input it probably should. There's no need for us to ever highlight our own sign language tone messages, because they're essentially a part of our talking. :cl: add: When performing a custom emote, `+|_` emphasis formatting applies to the text chat message instead of just the runechat message. qol: Intentional emotes don't trip your own highlights. qol: Sign language tone messages don't trip your own highlights. /:cl: --- code/__DEFINES/say.dm | 4 ++++ code/datums/brain_damage/imaginary_friend.dm | 2 +- code/datums/chatmessage.dm | 2 +- code/datums/components/sign_language.dm | 6 +++--- code/datums/emotes.dm | 19 ++++++++++++++++--- code/game/say.dm | 10 +++++----- code/modules/mob/living/emote.dm | 4 ++++ code/modules/mob/mob.dm | 20 +++++++++++++++----- code/modules/mob/mob_say.dm | 2 +- 9 files changed, 50 insertions(+), 19 deletions(-) diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 70eb0c03062..248264c8e75 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -129,6 +129,10 @@ /// Meaning that if the message is visual, and sourced from a blind mob, they will not see it. /// This flag skips that behavior, and will always show the self message to the mob. #define ALWAYS_SHOW_SELF_MESSAGE (1<<1) +/// Applies emphasis formatting to the message. +#define WITH_EMPHASIS_MESSAGE (1<<2) +/// Blocks chat highlighting from being applied to the message sent to the self. +#define BLOCK_SELF_HIGHLIGHT_MESSAGE (1<<3) ///Defines for priorities for the bubble_icon_override comp #define BUBBLE_ICON_PRIORITY_ACCESSORY 2 diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index a134a9f6752..bb1e149ffe6 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -258,7 +258,7 @@ else log_talk(message, LOG_SAY, tag="imaginary friend", forced_by = forced, custom_say_emote = message_mods[MODE_CUSTOM_SAY_EMOTE]) - var/quoted_message = say_quote(say_emphasis(message), spans, message_mods) + var/quoted_message = say_quote(apply_message_emphasis(message), spans, message_mods) var/rendered = "[span_name("[name]")] [quoted_message]" var/dead_rendered = "[span_name("[name] (Imaginary friend of [owner])")] [quoted_message]" diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 3af62b77ca6..d3426e7ed97 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -191,7 +191,7 @@ var/tgt_color = extra_classes.Find("italics") ? target.chat_color_darkened : target.chat_color // Approximate text height - var/complete_text = "[owner.say_emphasis(text)]" + var/complete_text = "[owner.apply_message_emphasis(text)]" var/mheight WXH_TO_HEIGHT(owned_by.MeasureText(complete_text, null, CHAT_MESSAGE_WIDTH), mheight) diff --git a/code/datums/components/sign_language.dm b/code/datums/components/sign_language.dm index e1bf27e5a3a..994c93bd9a2 100644 --- a/code/datums/components/sign_language.dm +++ b/code/datums/components/sign_language.dm @@ -312,11 +312,11 @@ /datum/component/sign_language/proc/emote_tone(mob/living/carbon/carbon_parent, emote_tone) switch(emote_tone) if(TONE_INQUISITIVE) - carbon_parent.visible_message(span_bold("quirks [carbon_parent.p_their()] brows quizzically."), visible_message_flags = EMOTE_MESSAGE) + carbon_parent.visible_message(span_bold("quirks [carbon_parent.p_their()] brows quizzically."), visible_message_flags = EMOTE_MESSAGE|BLOCK_SELF_HIGHLIGHT_MESSAGE) if(TONE_EMPHATIC) - carbon_parent.visible_message(span_bold("widens [carbon_parent.p_their()] eyes emphatically!"), visible_message_flags = EMOTE_MESSAGE) + carbon_parent.visible_message(span_bold("widens [carbon_parent.p_their()] eyes emphatically!"), visible_message_flags = EMOTE_MESSAGE|BLOCK_SELF_HIGHLIGHT_MESSAGE) if(TONE_INQUISITIVE_EMPHATIC) - carbon_parent.visible_message(span_bold("wears an intense, befuddled expression!"), visible_message_flags = EMOTE_MESSAGE) + carbon_parent.visible_message(span_bold("wears an intense, befuddled expression!"), visible_message_flags = EMOTE_MESSAGE|BLOCK_SELF_HIGHLIGHT_MESSAGE) /// Removes the tonal indicator overlay completely diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index b5e07509d0e..80e10fc8259 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -118,6 +118,7 @@ var/is_important = emote_type & EMOTE_IMPORTANT var/is_visual = emote_type & EMOTE_VISIBLE var/is_audible = emote_type & EMOTE_AUDIBLE + var/additional_message_flags = get_message_flags(intentional) var/space = should_have_space_before_emote(html_decode(msg)[1]) ? " " : "" // SKYRAT EDIT ADDITION // Emote doesn't get printed to chat, runechat only @@ -174,7 +175,7 @@ message = msg, deaf_message = span_emote("You see how [user] [msg]"), self_message = msg, - audible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE, + audible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE|additional_message_flags, separation = space, // SKYRAT EDIT ADDITION pref_to_check = pref_to_check // SKYRAT EDIT ADDITION - Pref checked emotes ) @@ -183,7 +184,7 @@ user.audible_message( message = msg, self_message = msg, - audible_message_flags = EMOTE_MESSAGE, + audible_message_flags = EMOTE_MESSAGE|additional_message_flags, separation = space, // SKYRAT EDIT ADDITION pref_to_check = pref_to_check // SKYRAT EDIT ADDITION - Pref checked emotes ) @@ -192,7 +193,7 @@ user.visible_message( message = msg, self_message = msg, - visible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE, + visible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE|additional_message_flags, separation = space, // SKYRAT EDIT ADDITION pref_to_check = pref_to_check // SKYRAT EDIT ADDITION - Pref checked emotes ) @@ -289,6 +290,18 @@ /datum/emote/proc/get_sound(mob/living/user) return sound //by default just return this var. +/** + * To get the flags visible/audible messages for ran by the emote. + * + * Arguments: + * * intentional - Bool that says whether the emote was forced (FALSE) or not (TRUE). + * + * Returns the additional message flags we should be using, if any. + */ +/datum/emote/proc/get_message_flags(intentional) + // If we did it, we most often already know what's in it, so we try to avoid highlight clutter. + return intentional ? BLOCK_SELF_HIGHLIGHT_MESSAGE : NONE + /** * To replace pronouns in the inputed string with the user's proper pronouns. * diff --git a/code/game/say.dm b/code/game/say.dm index 380ed4accca..7d6416e2573 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -244,20 +244,20 @@ GLOBAL_LIST_INIT(freqtospan, list( /* all inputs should be fully figured out past this point */ - var/processed_input = say_emphasis(input) //This MUST be done first so that we don't get clipped by spans + var/processed_input = apply_message_emphasis(input) //This MUST be done first so that we don't get clipped by spans processed_input = attach_spans(processed_input, spans) - var/processed_say_mod = say_emphasis(say_mod) + var/processed_say_mod = apply_message_emphasis(say_mod) return "[processed_say_mod], \"[processed_input]\"" -/// Transforms the speech emphasis mods from [/atom/movable/proc/say_emphasis] into the appropriate HTML tags. Includes escaping. +/// Transforms the message emphasis mods from [/atom/proc/apply_message_emphasis] into the appropriate HTML tags. Includes escaping. #define ENCODE_HTML_EMPHASIS(input, char, html, varname) \ var/static/regex/##varname = regex("(?$1​") //zero-width space to force maptext to respect closing tags. -/// Scans the input sentence for speech emphasis modifiers, notably |italics|, +bold+, and _underline_ -mothblocks -/atom/movable/proc/say_emphasis(input) +/// Scans the input sentence for message emphasis modifiers, notably |italics|, +bold+, and _underline_ -mothblocks +/atom/proc/apply_message_emphasis(input) ENCODE_HTML_EMPHASIS(input, "\\|", "i", italics) ENCODE_HTML_EMPHASIS(input, "\\+", "b", bold) ENCODE_HTML_EMPHASIS(input, "\\_", "u", underline) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index d9df210f11e..bd6d250ee70 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -729,6 +729,10 @@ return TRUE +/datum/emote/living/custom/get_message_flags(intentional) + . = ..() + return .|WITH_EMPHASIS_MESSAGE + /datum/emote/living/custom/proc/get_custom_emote_from_user() return stripped_multiline_input(usr, "Choose an emote to display.", "Me" , null, MAX_MESSAGE_LEN) // SKYRAT EDIT CHANGE - ORIGINAL : return copytext(sanitize(input("Choose an emote to display.") as text|null), 1, MAX_MESSAGE_LEN) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 04ea7484503..07d9ec5b945 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -304,6 +304,8 @@ hearers -= src var/raw_msg = message + if(visible_message_flags & WITH_EMPHASIS_MESSAGE) + message = apply_message_emphasis(message) if(visible_message_flags & EMOTE_MESSAGE) message = span_emote("[src][separation][message]") // SKYRAT EDIT - Better emotes @@ -351,15 +353,17 @@ return var/raw_self_message = self_message var/self_runechat = FALSE + var/block_self_highlight = (visible_message_flags & BLOCK_SELF_HIGHLIGHT_MESSAGE) + if(visible_message_flags & WITH_EMPHASIS_MESSAGE) + self_message = apply_message_emphasis(self_message) if(visible_message_flags & EMOTE_MESSAGE) self_message = span_emote("[src] [self_message]") // May make more sense as "You do x" if(visible_message_flags & ALWAYS_SHOW_SELF_MESSAGE) - to_chat(src, self_message) + to_chat(src, self_message, avoid_highlighting = block_self_highlight) self_runechat = TRUE - else - self_runechat = show_message(self_message, MSG_VISUAL, blind_message, MSG_AUDIBLE) + self_runechat = show_message(self_message, MSG_VISUAL, blind_message, MSG_AUDIBLE, avoid_highlighting = block_self_highlight) if(self_runechat && (visible_message_flags & EMOTE_MESSAGE) && runechat_prefs_check(src, visible_message_flags)) create_chat_message(src, raw_message = raw_self_message, runechat_flags = visible_message_flags) @@ -393,6 +397,8 @@ if(self_message) hearers -= src var/raw_msg = message + if(audible_message_flags & WITH_EMPHASIS_MESSAGE) + message = apply_message_emphasis(message) if(audible_message_flags & EMOTE_MESSAGE) message = span_emote("[src][separation][message]") //SKYRAT EDIT CHANGE for(var/mob/M in hearers) @@ -421,13 +427,17 @@ return var/raw_self_message = self_message var/self_runechat = FALSE + var/block_self_highlight = (audible_message_flags & BLOCK_SELF_HIGHLIGHT_MESSAGE) + if(audible_message_flags & WITH_EMPHASIS_MESSAGE) + self_message = apply_message_emphasis(self_message) if(audible_message_flags & EMOTE_MESSAGE) self_message = span_emote("[src] [self_message]") + if(audible_message_flags & ALWAYS_SHOW_SELF_MESSAGE) - to_chat(src, self_message) + to_chat(src, self_message, avoid_highlighting = block_self_highlight) self_runechat = TRUE else - self_runechat = show_message(self_message, MSG_AUDIBLE, deaf_message, MSG_VISUAL) + self_runechat = show_message(self_message, MSG_AUDIBLE, deaf_message, MSG_VISUAL, avoid_highlighting = block_self_highlight) if(self_runechat && (audible_message_flags & EMOTE_MESSAGE) && runechat_prefs_check(src, audible_message_flags)) create_chat_message(src, raw_message = raw_self_message, runechat_flags = audible_message_flags) diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm index a58d15801c0..a56757892c7 100644 --- a/code/modules/mob/mob_say.dm +++ b/code/modules/mob/mob_say.dm @@ -156,7 +156,7 @@ if(name != real_name) alt_name = " (died as [real_name])" - var/spanned = say_quote(say_emphasis(message)) + var/spanned = say_quote(apply_message_emphasis(message)) var/source = "DEAD: [name][alt_name]" var/rendered = " [emoji_parse(spanned)]" log_talk(message, LOG_SAY, tag="DEAD") From f8755fb8b4b1e934f2a49a341dacee9263f87848 Mon Sep 17 00:00:00 2001 From: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri, 2 May 2025 21:59:11 -0400 Subject: [PATCH 27/43] changelog --- html/changelogs/archive/2025-05.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/archive/2025-05.yml diff --git a/html/changelogs/archive/2025-05.yml b/html/changelogs/archive/2025-05.yml new file mode 100644 index 00000000000..fa0b09823e6 --- /dev/null +++ b/html/changelogs/archive/2025-05.yml @@ -0,0 +1,6 @@ +2025-05-02: + 00-Steven: + - rscadd: When performing a custom emote, `+|_` emphasis formatting applies to the + text chat message instead of just the runechat message. + - qol: Intentional emotes don't trip your own highlights. + - qol: Sign language tone messages don't trip your own highlights. From 71f5f95e8ffe7d3ad4891f723feb17951b6a1933 Mon Sep 17 00:00:00 2001 From: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri, 2 May 2025 22:06:13 -0400 Subject: [PATCH 28/43] nope nevermind --- code/__DEFINES/say.dm | 4 ---- code/datums/brain_damage/imaginary_friend.dm | 2 +- code/datums/chatmessage.dm | 2 +- code/datums/components/sign_language.dm | 6 +++--- code/datums/emotes.dm | 19 +++---------------- code/game/say.dm | 10 +++++----- code/modules/mob/living/emote.dm | 4 ---- code/modules/mob/mob.dm | 20 +++++--------------- code/modules/mob/mob_say.dm | 2 +- html/changelogs/archive/2025-05.yml | 6 ------ 10 files changed, 19 insertions(+), 56 deletions(-) delete mode 100644 html/changelogs/archive/2025-05.yml diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 248264c8e75..70eb0c03062 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -129,10 +129,6 @@ /// Meaning that if the message is visual, and sourced from a blind mob, they will not see it. /// This flag skips that behavior, and will always show the self message to the mob. #define ALWAYS_SHOW_SELF_MESSAGE (1<<1) -/// Applies emphasis formatting to the message. -#define WITH_EMPHASIS_MESSAGE (1<<2) -/// Blocks chat highlighting from being applied to the message sent to the self. -#define BLOCK_SELF_HIGHLIGHT_MESSAGE (1<<3) ///Defines for priorities for the bubble_icon_override comp #define BUBBLE_ICON_PRIORITY_ACCESSORY 2 diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index bb1e149ffe6..a134a9f6752 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -258,7 +258,7 @@ else log_talk(message, LOG_SAY, tag="imaginary friend", forced_by = forced, custom_say_emote = message_mods[MODE_CUSTOM_SAY_EMOTE]) - var/quoted_message = say_quote(apply_message_emphasis(message), spans, message_mods) + var/quoted_message = say_quote(say_emphasis(message), spans, message_mods) var/rendered = "[span_name("[name]")] [quoted_message]" var/dead_rendered = "[span_name("[name] (Imaginary friend of [owner])")] [quoted_message]" diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index d3426e7ed97..3af62b77ca6 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -191,7 +191,7 @@ var/tgt_color = extra_classes.Find("italics") ? target.chat_color_darkened : target.chat_color // Approximate text height - var/complete_text = "[owner.apply_message_emphasis(text)]" + var/complete_text = "[owner.say_emphasis(text)]" var/mheight WXH_TO_HEIGHT(owned_by.MeasureText(complete_text, null, CHAT_MESSAGE_WIDTH), mheight) diff --git a/code/datums/components/sign_language.dm b/code/datums/components/sign_language.dm index 994c93bd9a2..e1bf27e5a3a 100644 --- a/code/datums/components/sign_language.dm +++ b/code/datums/components/sign_language.dm @@ -312,11 +312,11 @@ /datum/component/sign_language/proc/emote_tone(mob/living/carbon/carbon_parent, emote_tone) switch(emote_tone) if(TONE_INQUISITIVE) - carbon_parent.visible_message(span_bold("quirks [carbon_parent.p_their()] brows quizzically."), visible_message_flags = EMOTE_MESSAGE|BLOCK_SELF_HIGHLIGHT_MESSAGE) + carbon_parent.visible_message(span_bold("quirks [carbon_parent.p_their()] brows quizzically."), visible_message_flags = EMOTE_MESSAGE) if(TONE_EMPHATIC) - carbon_parent.visible_message(span_bold("widens [carbon_parent.p_their()] eyes emphatically!"), visible_message_flags = EMOTE_MESSAGE|BLOCK_SELF_HIGHLIGHT_MESSAGE) + carbon_parent.visible_message(span_bold("widens [carbon_parent.p_their()] eyes emphatically!"), visible_message_flags = EMOTE_MESSAGE) if(TONE_INQUISITIVE_EMPHATIC) - carbon_parent.visible_message(span_bold("wears an intense, befuddled expression!"), visible_message_flags = EMOTE_MESSAGE|BLOCK_SELF_HIGHLIGHT_MESSAGE) + carbon_parent.visible_message(span_bold("wears an intense, befuddled expression!"), visible_message_flags = EMOTE_MESSAGE) /// Removes the tonal indicator overlay completely diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 80e10fc8259..b5e07509d0e 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -118,7 +118,6 @@ var/is_important = emote_type & EMOTE_IMPORTANT var/is_visual = emote_type & EMOTE_VISIBLE var/is_audible = emote_type & EMOTE_AUDIBLE - var/additional_message_flags = get_message_flags(intentional) var/space = should_have_space_before_emote(html_decode(msg)[1]) ? " " : "" // SKYRAT EDIT ADDITION // Emote doesn't get printed to chat, runechat only @@ -175,7 +174,7 @@ message = msg, deaf_message = span_emote("You see how [user] [msg]"), self_message = msg, - audible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE|additional_message_flags, + audible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE, separation = space, // SKYRAT EDIT ADDITION pref_to_check = pref_to_check // SKYRAT EDIT ADDITION - Pref checked emotes ) @@ -184,7 +183,7 @@ user.audible_message( message = msg, self_message = msg, - audible_message_flags = EMOTE_MESSAGE|additional_message_flags, + audible_message_flags = EMOTE_MESSAGE, separation = space, // SKYRAT EDIT ADDITION pref_to_check = pref_to_check // SKYRAT EDIT ADDITION - Pref checked emotes ) @@ -193,7 +192,7 @@ user.visible_message( message = msg, self_message = msg, - visible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE|additional_message_flags, + visible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE, separation = space, // SKYRAT EDIT ADDITION pref_to_check = pref_to_check // SKYRAT EDIT ADDITION - Pref checked emotes ) @@ -290,18 +289,6 @@ /datum/emote/proc/get_sound(mob/living/user) return sound //by default just return this var. -/** - * To get the flags visible/audible messages for ran by the emote. - * - * Arguments: - * * intentional - Bool that says whether the emote was forced (FALSE) or not (TRUE). - * - * Returns the additional message flags we should be using, if any. - */ -/datum/emote/proc/get_message_flags(intentional) - // If we did it, we most often already know what's in it, so we try to avoid highlight clutter. - return intentional ? BLOCK_SELF_HIGHLIGHT_MESSAGE : NONE - /** * To replace pronouns in the inputed string with the user's proper pronouns. * diff --git a/code/game/say.dm b/code/game/say.dm index 7d6416e2573..380ed4accca 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -244,20 +244,20 @@ GLOBAL_LIST_INIT(freqtospan, list( /* all inputs should be fully figured out past this point */ - var/processed_input = apply_message_emphasis(input) //This MUST be done first so that we don't get clipped by spans + var/processed_input = say_emphasis(input) //This MUST be done first so that we don't get clipped by spans processed_input = attach_spans(processed_input, spans) - var/processed_say_mod = apply_message_emphasis(say_mod) + var/processed_say_mod = say_emphasis(say_mod) return "[processed_say_mod], \"[processed_input]\"" -/// Transforms the message emphasis mods from [/atom/proc/apply_message_emphasis] into the appropriate HTML tags. Includes escaping. +/// Transforms the speech emphasis mods from [/atom/movable/proc/say_emphasis] into the appropriate HTML tags. Includes escaping. #define ENCODE_HTML_EMPHASIS(input, char, html, varname) \ var/static/regex/##varname = regex("(?$1​") //zero-width space to force maptext to respect closing tags. -/// Scans the input sentence for message emphasis modifiers, notably |italics|, +bold+, and _underline_ -mothblocks -/atom/proc/apply_message_emphasis(input) +/// Scans the input sentence for speech emphasis modifiers, notably |italics|, +bold+, and _underline_ -mothblocks +/atom/movable/proc/say_emphasis(input) ENCODE_HTML_EMPHASIS(input, "\\|", "i", italics) ENCODE_HTML_EMPHASIS(input, "\\+", "b", bold) ENCODE_HTML_EMPHASIS(input, "\\_", "u", underline) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index bd6d250ee70..d9df210f11e 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -729,10 +729,6 @@ return TRUE -/datum/emote/living/custom/get_message_flags(intentional) - . = ..() - return .|WITH_EMPHASIS_MESSAGE - /datum/emote/living/custom/proc/get_custom_emote_from_user() return stripped_multiline_input(usr, "Choose an emote to display.", "Me" , null, MAX_MESSAGE_LEN) // SKYRAT EDIT CHANGE - ORIGINAL : return copytext(sanitize(input("Choose an emote to display.") as text|null), 1, MAX_MESSAGE_LEN) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 07d9ec5b945..04ea7484503 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -304,8 +304,6 @@ hearers -= src var/raw_msg = message - if(visible_message_flags & WITH_EMPHASIS_MESSAGE) - message = apply_message_emphasis(message) if(visible_message_flags & EMOTE_MESSAGE) message = span_emote("[src][separation][message]") // SKYRAT EDIT - Better emotes @@ -353,17 +351,15 @@ return var/raw_self_message = self_message var/self_runechat = FALSE - var/block_self_highlight = (visible_message_flags & BLOCK_SELF_HIGHLIGHT_MESSAGE) - if(visible_message_flags & WITH_EMPHASIS_MESSAGE) - self_message = apply_message_emphasis(self_message) if(visible_message_flags & EMOTE_MESSAGE) self_message = span_emote("[src] [self_message]") // May make more sense as "You do x" if(visible_message_flags & ALWAYS_SHOW_SELF_MESSAGE) - to_chat(src, self_message, avoid_highlighting = block_self_highlight) + to_chat(src, self_message) self_runechat = TRUE + else - self_runechat = show_message(self_message, MSG_VISUAL, blind_message, MSG_AUDIBLE, avoid_highlighting = block_self_highlight) + self_runechat = show_message(self_message, MSG_VISUAL, blind_message, MSG_AUDIBLE) if(self_runechat && (visible_message_flags & EMOTE_MESSAGE) && runechat_prefs_check(src, visible_message_flags)) create_chat_message(src, raw_message = raw_self_message, runechat_flags = visible_message_flags) @@ -397,8 +393,6 @@ if(self_message) hearers -= src var/raw_msg = message - if(audible_message_flags & WITH_EMPHASIS_MESSAGE) - message = apply_message_emphasis(message) if(audible_message_flags & EMOTE_MESSAGE) message = span_emote("[src][separation][message]") //SKYRAT EDIT CHANGE for(var/mob/M in hearers) @@ -427,17 +421,13 @@ return var/raw_self_message = self_message var/self_runechat = FALSE - var/block_self_highlight = (audible_message_flags & BLOCK_SELF_HIGHLIGHT_MESSAGE) - if(audible_message_flags & WITH_EMPHASIS_MESSAGE) - self_message = apply_message_emphasis(self_message) if(audible_message_flags & EMOTE_MESSAGE) self_message = span_emote("[src] [self_message]") - if(audible_message_flags & ALWAYS_SHOW_SELF_MESSAGE) - to_chat(src, self_message, avoid_highlighting = block_self_highlight) + to_chat(src, self_message) self_runechat = TRUE else - self_runechat = show_message(self_message, MSG_AUDIBLE, deaf_message, MSG_VISUAL, avoid_highlighting = block_self_highlight) + self_runechat = show_message(self_message, MSG_AUDIBLE, deaf_message, MSG_VISUAL) if(self_runechat && (audible_message_flags & EMOTE_MESSAGE) && runechat_prefs_check(src, audible_message_flags)) create_chat_message(src, raw_message = raw_self_message, runechat_flags = audible_message_flags) diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm index a56757892c7..a58d15801c0 100644 --- a/code/modules/mob/mob_say.dm +++ b/code/modules/mob/mob_say.dm @@ -156,7 +156,7 @@ if(name != real_name) alt_name = " (died as [real_name])" - var/spanned = say_quote(apply_message_emphasis(message)) + var/spanned = say_quote(say_emphasis(message)) var/source = "DEAD: [name][alt_name]" var/rendered = " [emoji_parse(spanned)]" log_talk(message, LOG_SAY, tag="DEAD") diff --git a/html/changelogs/archive/2025-05.yml b/html/changelogs/archive/2025-05.yml deleted file mode 100644 index fa0b09823e6..00000000000 --- a/html/changelogs/archive/2025-05.yml +++ /dev/null @@ -1,6 +0,0 @@ -2025-05-02: - 00-Steven: - - rscadd: When performing a custom emote, `+|_` emphasis formatting applies to the - text chat message instead of just the runechat message. - - qol: Intentional emotes don't trip your own highlights. - - qol: Sign language tone messages don't trip your own highlights. From 630ecefd74f154cb372a31c8d0df0a5cd45d7ec8 Mon Sep 17 00:00:00 2001 From: Shadow-Quill <44811257+Shadow-Quill@users.noreply.github.com> Date: Sat, 3 May 2025 12:22:10 -0600 Subject: [PATCH 29/43] Tableclocks are now loadout items (#3698) ## About The Pull Request Adds table clocks as a loadout item ## Why It's Good For The Game someone wanted it ## Changelog :cl: add: Table clocks are now a loadout item. /:cl: --- modular_zubbers/code/modules/loadout/categories/pocket.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modular_zubbers/code/modules/loadout/categories/pocket.dm b/modular_zubbers/code/modules/loadout/categories/pocket.dm index 470eb28b36d..3caf0b44153 100644 --- a/modular_zubbers/code/modules/loadout/categories/pocket.dm +++ b/modular_zubbers/code/modules/loadout/categories/pocket.dm @@ -70,6 +70,9 @@ name = "Pocket Watch" item_path = /obj/item/clothing/accessory/pocketwatch +/datum/loadout_item/pocket_items/table_clock + name = "Table Clock" + item_path = /obj/item/table_clock /datum/loadout_item/pocket_items/cigarettesleary name = "Mindbreaker Cigs" From 693238ce9f9ae2c0543690a1c3059693ff77f37d Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat, 3 May 2025 20:22:34 +0200 Subject: [PATCH 30/43] Automatic changelog for PR #3698 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3698.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3698.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3698.yml b/html/changelogs/AutoChangeLog-bubber-pr-3698.yml new file mode 100644 index 00000000000..c27ac74267e --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3698.yml @@ -0,0 +1,4 @@ +author: "Shadow-Quill" +delete-after: True +changes: + - rscadd: "Table clocks are now a loadout item." \ No newline at end of file From cbbe6f65b2da7bf721b6de7a0017f324bee495f3 Mon Sep 17 00:00:00 2001 From: Ssalty <65713506+KazooBard@users.noreply.github.com> Date: Sat, 3 May 2025 20:22:51 +0200 Subject: [PATCH 31/43] Icarus Sunbeam is better now (#3678) ## Proof Of Testing Trust me ## Changelog :cl: balance: The Icarus Sunbeam weapons system melts all tiles in it's flame's reach balance: The Icarus Sunbeam weapons system husks direct hits and deals damage in a wider range /:cl: --------- Co-authored-by: Arturlang <24881678+Arturlang@users.noreply.github.com> --- modular_skyrat/modules/assault_operatives/code/sunbeam.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modular_skyrat/modules/assault_operatives/code/sunbeam.dm b/modular_skyrat/modules/assault_operatives/code/sunbeam.dm index 3cd5c79e1e7..09dc4ab49f3 100644 --- a/modular_skyrat/modules/assault_operatives/code/sunbeam.dm +++ b/modular_skyrat/modules/assault_operatives/code/sunbeam.dm @@ -90,6 +90,10 @@ for(var/turf/open/turf_to_incinerate in circle_range(src, obliteration_range_fire)) turf_to_incinerate.hotspot_expose(5500) new /obj/effect/hotspot(turf_to_incinerate) + turf_to_incinerate.Melt() + for(var/mob/living/mob_to_husk in circle_range(src, obliteration_range_fire)) + mob_to_husk.apply_damage(300, BURN) + mob_to_husk.throw_at(pick(orange(15)), spin = TRUE, diagonals_first = FALSE, force = MOVE_FORCE_STRONG, gentle = FALSE, quickstart = TRUE) if(obliteration_range_flatten) for(var/atom/atom_to_obliterate in circle_range(src, obliteration_range_flatten)) @@ -109,7 +113,8 @@ if(isliving(atom_to_obliterate)) var/mob/living/mob_to_obliterate = atom_to_obliterate - mob_to_obliterate.apply_damage(200, BURN) + mob_to_obliterate.apply_damage(300, BURN) + mob_to_obliterate.add_traits(TRAIT_HUSK, BURN) continue COOLDOWN_START(src, oblirerate_cooldown, obliteration_cooldown) From 46892eb4e255fcefbfdab673f59919649d94a8b4 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat, 3 May 2025 20:23:17 +0200 Subject: [PATCH 32/43] Automatic changelog for PR #3678 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3678.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3678.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3678.yml b/html/changelogs/AutoChangeLog-bubber-pr-3678.yml new file mode 100644 index 00000000000..68a0bc7caf6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3678.yml @@ -0,0 +1,5 @@ +author: "KazooBard" +delete-after: True +changes: + - balance: "The Icarus Sunbeam weapons system melts all tiles in it's flame's reach" + - balance: "The Icarus Sunbeam weapons system husks direct hits and deals damage in a wider range" \ No newline at end of file From 96e5a7ce9d7673c78f9f4237c3f20570fd4ff6a7 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat, 3 May 2025 23:23:13 +0000 Subject: [PATCH 33/43] Bubberstation automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3678.yml | 5 ----- html/changelogs/AutoChangeLog-bubber-pr-3698.yml | 4 ---- html/changelogs/bubber_archive/2025-05.yml | 5 +++++ 3 files changed, 5 insertions(+), 9 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3678.yml delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3698.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3678.yml b/html/changelogs/AutoChangeLog-bubber-pr-3678.yml deleted file mode 100644 index 68a0bc7caf6..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3678.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "KazooBard" -delete-after: True -changes: - - balance: "The Icarus Sunbeam weapons system melts all tiles in it's flame's reach" - - balance: "The Icarus Sunbeam weapons system husks direct hits and deals damage in a wider range" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3698.yml b/html/changelogs/AutoChangeLog-bubber-pr-3698.yml deleted file mode 100644 index c27ac74267e..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3698.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Shadow-Quill" -delete-after: True -changes: - - rscadd: "Table clocks are now a loadout item." \ No newline at end of file diff --git a/html/changelogs/bubber_archive/2025-05.yml b/html/changelogs/bubber_archive/2025-05.yml index 3ea39cd2fa2..7e26020fc35 100644 --- a/html/changelogs/bubber_archive/2025-05.yml +++ b/html/changelogs/bubber_archive/2025-05.yml @@ -11,7 +11,12 @@ TealSeer: - bugfix: fixed changelings/paradox clones not copying victim hair gradients 2025-05-03: + KazooBard: + - balance: The Icarus Sunbeam weapons system melts all tiles in it's flame's reach + - balance: The Icarus Sunbeam weapons system husks direct hits and deals damage + in a wider range SapphoQueer: - rscadd: Added the IRS outfit back to the autodrobe Shadow-Quill: - bugfix: Percy no longer rusts away. + - rscadd: Table clocks are now a loadout item. From 37ee96f2979a90f6d7965ef1fa403e8dd4cdef2b Mon Sep 17 00:00:00 2001 From: Arturlang <24881678+Arturlang@users.noreply.github.com> Date: Sun, 4 May 2025 05:04:30 +0300 Subject: [PATCH 34/43] Feed tweaks and fixes (#3692) refactor feed a bunch, fix frenzy making any type of feed being max speed, remove being able to stealthfeed past safe threshold, allow grabbed bloodsuckers to automatically aggrofeed the grabber, handcuffs slow down feed start, change min feed timer to 1 second, frenzy now halves feed time instead of limiting it to 2 seconds or less ## About The Pull Request Refactors feed a bunch, removes being able to stealthfeed past safe threshold, allow grabbed bloodsuckers to automatically aggrofeed the grabber, handcuffs slow down feed start, changes min feed timer to 1 second, also makes frenzied bloodsuckers unable to stealthfeed. ## Why It's Good For The Game Hopefully makes feed a little bit more fair for both parties ## Proof Of Testing
Screenshots/Videos
## Changelog :cl: balance: Frenzied bloodsuckers cannot stealthfeed balance: Minimum feed timer is now 1 second balance: Handcuffs double the feed begin time, meaning it takes longer to start drinking blood. balance: Frenzy now halves feed begin time, instead of setting it to 2 or below. balance: Trying to feed while handcuffed and grabbed will always make you feed aggresively. fix: Fixes feed detailed description lying about the time it takes to start feeding /:cl: --- .../antagonists/bloodsucker/powers/feed.dm | 126 +++++++++++------- 1 file changed, 79 insertions(+), 47 deletions(-) diff --git a/modular_zubbers/code/modules/antagonists/bloodsucker/powers/feed.dm b/modular_zubbers/code/modules/antagonists/bloodsucker/powers/feed.dm index 2fb642481ea..bbae8eceea0 100644 --- a/modular_zubbers/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/modular_zubbers/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -1,5 +1,6 @@ #define FEED_NOTICE_RANGE 2 #define FEED_DEFAULT_TIMER (10 SECONDS) +#define FEED_MIN_TIMER (1 SECONDS) /datum/action/cooldown/bloodsucker/feed name = "Feed" @@ -29,30 +30,35 @@ var/warning_target_bloodvol = BLOOD_VOLUME_MAX_LETHAL ///Reference to the target we've fed off of var/datum/weakref/target_ref - ///Are we feeding with passive grab or not? - var/silent_feed = TRUE ///Have we notified you already that you are at maximum blood? var/notified_overfeeding = FALSE ///assoc list of weakrefs to targets and how much blood we've taken from them. var/list/targets_and_blood = list() + /// What level of protection you need to prevent feeding + var/penetration = INJECT_CHECK_PENETRATE_THICK + ///Did we start feeding with aggressive grab or not, or grabbed by someone else? + var/aggressive_feed = TRUE /datum/action/cooldown/bloodsucker/feed/get_power_explanation_extended() . = list() . += "Activate Feed while next to someone and you will begin to feed blood off of them." - . += "The time needed before you start feeding is [DisplayTimeText(FEED_DEFAULT_TIMER)]." + . += "The time needed before you start feeding is [DisplayTimeText(get_feed_start_time())]." . += "Feeding off of someone while you have them aggressively grabbed will put them to sleep for [DisplayTimeText(get_sleep_time())]." . += "While feeding, you can't speak, as you are using your mouth to drink blood." . += "Feeding while nearby ([FEED_NOTICE_RANGE] tiles away from) a mortal who is unaware of Bloodsuckers' existence, will cause a Masquerade Infraction" . += "If you get too many Masquerade Infractions, you will break the Masquerade." . += "If you are in desperate need of blood, mice can be fed off of, at a cost to your humanity." + . += "If you are handcuffed, you can use feed to feed off whoever is grabbing you, however this is slower, and very obvious." . += "You must use the ability again to stop sucking blood." /datum/action/cooldown/bloodsucker/feed/can_use(mob/living/carbon/user, trigger_flags) . = ..() if(!.) return FALSE - if(target_ref) //already sucking blood. - if(!ContinueActive(user, target_ref?.resolve(), !silent_feed, !silent_feed)) + var/mob/target = target_ref?.resolve() + if(target) //already sucking blood. + var/aggro_feed = check_aggro_feed(target) + if(!ContinueActive(user, target, aggro_feed)) target_ref = null else owner.balloon_alert(owner, "already feeding!") @@ -65,14 +71,12 @@ return FALSE return TRUE -/datum/action/cooldown/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target, check_grab, check_aggresive_grab) +/datum/action/cooldown/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target, check_aggresive_grab) if(!target) return FALSE if(!user.Adjacent(target)) return FALSE - if(check_grab && user.pulling != target) - return FALSE - if(check_aggresive_grab && user.grab_state < GRAB_AGGRESSIVE) + if(check_aggresive_grab && !check_aggro_feed(target)) return FALSE return TRUE @@ -107,7 +111,6 @@ // if this happens this means that we didn't properly deactivate the power if(HAS_TRAIT_FROM(owner, TRAIT_IMMOBILIZED, FEED_TRAIT) || HAS_TRAIT_FROM(owner, TRAIT_MUTE, FEED_TRAIT)) DeactivatePower() - silent_feed = TRUE var/mob/living/feed_target = target_ref?.resolve() if(!feed_target) DeactivatePower() @@ -122,17 +125,15 @@ feed_target.death() StartCooldown() return FALSE - var/feed_timer = get_feed_start_time() - if(bloodsuckerdatum_power.frenzied) - feed_timer = min(2 SECONDS, feed_timer) owner.balloon_alert(owner, "feeding off [feed_target]...") owner.face_atom(feed_target) - if(!do_after(owner, feed_timer, feed_target, hidden = TRUE)) + if(!do_after(owner, get_feed_start_time(), feed_target, hidden = TRUE)) owner.balloon_alert(owner, "feed stopped") target_ref = null return FALSE - if(owner.pulling == feed_target && owner.grab_state >= GRAB_AGGRESSIVE) + if(check_aggro_feed(feed_target)) + aggressive_feed = TRUE if(!IS_BLOODSUCKER(feed_target) && !IS_GHOUL(feed_target) && !IS_MONSTERHUNTER(feed_target)) feed_target.Unconscious(get_sleep_time()) if(!feed_target.density) @@ -140,16 +141,24 @@ owner.visible_message( span_warning("[owner] closes [owner.p_their()] mouth around [feed_target]'s neck!"), span_warning("You sink your fangs into [feed_target]'s neck.")) - silent_feed = FALSE //no more mr nice guy else + aggressive_feed = FALSE // Only people who AREN'T the target will notice this action. var/dead_message = feed_target.stat != DEAD ? " [feed_target.p_they(TRUE)] looks dazed, and will not remember this." : "" owner.visible_message( - span_warning("[owner] puts [feed_target]'s wrist up to [owner.p_their()] mouth."), \ - span_notice("You slip your fangs into [feed_target]'s wrist.[dead_message]"), \ - vision_distance = FEED_NOTICE_RANGE, ignored_mobs = feed_target) + span_warning("[owner] puts [feed_target]'s wrist up to [owner.p_their()] mouth."), + span_notice("You slip your fangs into [feed_target]'s wrist.[dead_message]"), + vision_distance = FEED_NOTICE_RANGE, ignored_mobs = feed_target + ) - //check if we were seen + check_if_seen(feed_target) + + ADD_TRAIT(owner, TRAIT_MUTE, FEED_TRAIT) + ADD_TRAIT(owner, TRAIT_IMMOBILIZED, FEED_TRAIT) + RegisterSignal(owner, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, PROC_REF(notify_move_block)) + return TRUE + +/datum/action/cooldown/bloodsucker/feed/proc/check_if_seen(mob/living/feed_target) for(var/mob/living/watchers in oviewers(FEED_NOTICE_RANGE) - feed_target) if(!watchers.client) continue @@ -165,11 +174,6 @@ bloodsuckerdatum_power.give_masquerade_infraction() break - ADD_TRAIT(owner, TRAIT_MUTE, FEED_TRAIT) - ADD_TRAIT(owner, TRAIT_IMMOBILIZED, FEED_TRAIT) - RegisterSignal(owner, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, PROC_REF(notify_move_block)) - return TRUE - /datum/action/cooldown/bloodsucker/feed/process(seconds_per_tick) if(!active) //If we aren't active (running on SSfastprocess) return ..() //Manage our cooldown timers @@ -178,11 +182,12 @@ if(!feed_target) DeactivatePower() return - if(!ContinueActive(user, feed_target, !silent_feed, !silent_feed)) - if(!silent_feed) + if(!ContinueActive(user, feed_target, aggressive_feed)) + if(aggressive_feed) user.visible_message( span_warning("[user] is ripped from [feed_target]'s throat. [feed_target.p_Their(TRUE)] blood sprays everywhere!"), - span_warning("Your teeth are ripped from [feed_target]'s throat. [feed_target.p_Their(TRUE)] blood sprays everywhere!")) + span_warning("Your teeth are ripped from [feed_target]'s throat. [feed_target.p_Their(TRUE)] blood sprays everywhere!") + ) // Deal Damage to Target (should have been more careful!) if(iscarbon(feed_target)) var/mob/living/carbon/carbon_target = feed_target @@ -201,18 +206,17 @@ DeactivatePower() return - var/feed_strength_mult = 0 - if(bloodsuckerdatum_power.frenzied) - feed_strength_mult = 2 - else if(owner.pulling == feed_target && owner.grab_state >= GRAB_AGGRESSIVE) + var/feed_strength_mult = 0.3 + if(aggressive_feed) feed_strength_mult = 1 - else - feed_strength_mult = 0.3 + if(bloodsuckerdatum_power.frenzied) + feed_strength_mult *= 2 + var/already_drunk = targets_and_blood[target_ref] || 0 var/blood_eaten = bloodsuckerdatum_power.handle_feeding(feed_target, feed_strength_mult, level_current, already_drunk) blood_taken += blood_eaten targets_and_blood[target_ref] += blood_eaten - decrement_blood_drunk(blood_eaten * 0.5) + modify_blood_drunk(blood_eaten * 0.5) if(feed_strength_mult > 5 && feed_target.stat < DEAD) user.add_mood_event("drankblood", /datum/mood_event/drankblood) @@ -229,9 +233,10 @@ owner.balloon_alert(owner, "your victim's blood is dangerously low.") else if(feed_target.blood_volume <= BLOOD_VOLUME_SAFE && warning_target_bloodvol > BLOOD_VOLUME_SAFE) owner.balloon_alert(owner, "your victim's blood is at an unsafe level.") - else if(feed_target.blood_volume <= BLOOD_VOLUME_SAFE && bloodsuckerdatum_power.GetBloodVolume() >= BLOOD_VOLUME_SAFE && owner.pulling != feed_target) + else if(feed_target.blood_volume <= BLOOD_VOLUME_SAFE && owner.pulling != feed_target) owner.balloon_alert(owner, "you cannot drink more without first getting a better grip!.") DeactivatePower() + return warning_target_bloodvol = feed_target.blood_volume if(bloodsuckerdatum_power.GetBloodVolume() >= bloodsuckerdatum_power.max_blood_volume && !notified_overfeeding) @@ -241,18 +246,31 @@ user.balloon_alert(owner, "no blood left!") DeactivatePower() return - owner.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, TRUE) + owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, TRUE) //play sound to target to show they're dying. - if(owner.pulling == feed_target && owner.grab_state >= GRAB_AGGRESSIVE) - feed_target.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, TRUE) + if(aggressive_feed) + feed_target.playsound_local(get_turf(src), 'sound/effects/singlebeat.ogg', 40, TRUE) + +/datum/action/cooldown/bloodsucker/feed/proc/check_aggro_feed(mob/living/feed_target) + var/mob/living/carbon/carbon = owner + if(owner.pulling != feed_target && owner.pulledby != feed_target \ + || (feed_target.pulledby != owner && iscarbon(carbon) && carbon.handcuffed)) + return FALSE + return TRUE /datum/action/cooldown/bloodsucker/feed/proc/find_target() - if(owner.pulling && isliving(owner.pulling)) - if(!can_feed_from(owner.pulling, give_warnings = TRUE)) - return FALSE - set_target(owner.pulling) + // grabbing or grabbed, you're close enough to bite. + if(safe_set_target(owner.pulling)) return TRUE - + if(safe_set_target(owner.pulledby)) + return TRUE + if(bloodsuckerdatum_power.frenzied) + owner.balloon_alert(owner, "beast active! must grab someone to feed!") + return FALSE + var/mob/living/carbon/carbon = owner + if(iscarbon(carbon) && carbon.handcuffed) + owner.balloon_alert(owner, "you cannot stealthily feed while handcuffed!") + return FALSE var/list/close_living_mobs = list() var/list/close_dead_mobs = list() for(var/mob/living/near_targets in oview(1, owner)) @@ -275,6 +293,12 @@ //No one to suck blood from. return FALSE +/datum/action/cooldown/bloodsucker/feed/proc/safe_set_target(mob/living/target, give_warnings = TRUE) + if(!can_feed_from(target, give_warnings)) + return FALSE + set_target(target) + return TRUE + // this lets us compare and access things by weakrefs, if we use the actual same weakref instance in the assoc list /datum/action/cooldown/bloodsucker/feed/proc/set_target(mob/living/target) if(!length(targets_and_blood)) @@ -305,7 +329,7 @@ if(give_warnings) owner.balloon_alert(owner, "no blood!") return FALSE - if(!target_user.can_inject(owner, BODY_ZONE_HEAD, INJECT_CHECK_PENETRATE_THICK)) + if(!target_user.can_inject(owner, BODY_ZONE_HEAD, penetration)) if(give_warnings) owner.balloon_alert(owner, "suit too thick!") return FALSE @@ -323,7 +347,14 @@ return (5 + bloodsuckerdatum_power?.GetRank() || 1) SECONDS /datum/action/cooldown/bloodsucker/feed/proc/get_feed_start_time() - return clamp(round(FEED_DEFAULT_TIMER / (1.25 * (bloodsuckerdatum_power?.GetRank() || 1))), 1, FEED_DEFAULT_TIMER) + var/bloodsucker_level_divider = 1.25 * (bloodsuckerdatum_power?.GetRank() || 1) + var/feed_time = FEED_DEFAULT_TIMER / bloodsucker_level_divider + if(bloodsuckerdatum_power.frenzied) + feed_time *= 0.5 + var/mob/living/carbon/carbon = owner + if(iscarbon(carbon) && carbon.handcuffed) + feed_time *= 2 + return clamp(round(feed_time), FEED_MIN_TIMER, FEED_DEFAULT_TIMER) /datum/action/cooldown/bloodsucker/feed/proc/notify_move_block() SIGNAL_HANDLER @@ -335,7 +366,7 @@ COOLDOWN_START(src, feed_movement_notify_cooldown, 3 SECONDS) owner.balloon_alert(owner, "you cannot move while feeding! Click the power to stop.") -/datum/action/cooldown/bloodsucker/feed/proc/decrement_blood_drunk(amount = 0) +/datum/action/cooldown/bloodsucker/feed/proc/modify_blood_drunk(amount = 0) for(var/datum/weakref/weakref as anything in targets_and_blood) if(weakref == target_ref) continue @@ -345,3 +376,4 @@ #undef FEED_NOTICE_RANGE #undef FEED_DEFAULT_TIMER +#undef FEED_MIN_TIMER From 363d96f64217d419560ed448fb2260cde410ee87 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun, 4 May 2025 04:04:53 +0200 Subject: [PATCH 35/43] Automatic changelog for PR #3692 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3692.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3692.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3692.yml b/html/changelogs/AutoChangeLog-bubber-pr-3692.yml new file mode 100644 index 00000000000..5bee04f1a51 --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3692.yml @@ -0,0 +1,9 @@ +author: "Arturlang" +delete-after: True +changes: + - balance: "Frenzied bloodsuckers cannot stealthfeed" + - balance: "Minimum feed timer is now 1 second" + - balance: "Handcuffs double the feed begin time, meaning it takes longer to start drinking blood." + - balance: "Frenzy now halves feed begin time, instead of setting it to 2 or below." + - balance: "Trying to feed while handcuffed and grabbed will always make you feed aggresively." + - bugfix: "Fixes feed detailed description lying about the time it takes to start feeding" \ No newline at end of file From d919054df1d7b4970561c8d1b5555d9981c52abd Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun, 4 May 2025 03:06:17 +0000 Subject: [PATCH 36/43] Bubberstation automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3692.yml | 9 --------- html/changelogs/bubber_archive/2025-05.yml | 11 +++++++++++ 2 files changed, 11 insertions(+), 9 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3692.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3692.yml b/html/changelogs/AutoChangeLog-bubber-pr-3692.yml deleted file mode 100644 index 5bee04f1a51..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-3692.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - balance: "Frenzied bloodsuckers cannot stealthfeed" - - balance: "Minimum feed timer is now 1 second" - - balance: "Handcuffs double the feed begin time, meaning it takes longer to start drinking blood." - - balance: "Frenzy now halves feed begin time, instead of setting it to 2 or below." - - balance: "Trying to feed while handcuffed and grabbed will always make you feed aggresively." - - bugfix: "Fixes feed detailed description lying about the time it takes to start feeding" \ No newline at end of file diff --git a/html/changelogs/bubber_archive/2025-05.yml b/html/changelogs/bubber_archive/2025-05.yml index 7e26020fc35..1f1f4b47c68 100644 --- a/html/changelogs/bubber_archive/2025-05.yml +++ b/html/changelogs/bubber_archive/2025-05.yml @@ -20,3 +20,14 @@ Shadow-Quill: - bugfix: Percy no longer rusts away. - rscadd: Table clocks are now a loadout item. +2025-05-04: + Arturlang: + - balance: Frenzied bloodsuckers cannot stealthfeed + - balance: Minimum feed timer is now 1 second + - balance: Handcuffs double the feed begin time, meaning it takes longer to start + drinking blood. + - balance: Frenzy now halves feed begin time, instead of setting it to 2 or below. + - balance: Trying to feed while handcuffed and grabbed will always make you feed + aggresively. + - bugfix: Fixes feed detailed description lying about the time it takes to start + feeding From 4328d3129989ced56bd1a4f3843c8fa33688b2bf Mon Sep 17 00:00:00 2001 From: Arturlang <24881678+Arturlang@users.noreply.github.com> Date: Sun, 4 May 2025 20:46:35 +0300 Subject: [PATCH 37/43] blinking is now config toggleable (#3703) ## About The Pull Request blinking is now config toggleable for perf reasons, may be chugging quite a bit, kept support to toggle it ingame as well ## Why It's Good For The Game lag fixes i hope ## Proof Of Testing
Screenshots/Videos
## Changelog :cl: config: added config options for toggling blinking /:cl: --- .../modules/surgery/organs/internal/eyes/_eyes.dm | 3 +++ config/bubbers/bubbers_config.txt | 3 +++ .../controllers/configuration/entries/blinking.dm | 15 +++++++++++++++ tgstation.dme | 1 + 4 files changed, 22 insertions(+) create mode 100644 modular_zubbers/code/controllers/configuration/entries/blinking.dm diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index 3e96ccb30ed..ce189def69a 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -461,6 +461,7 @@ /// Animates one eyelid at a time, thanks BYOND and thanks animation chains /obj/item/organ/eyes/proc/animate_eyelid(obj/effect/abstract/eyelid_effect/eyelid, mob/living/carbon/human/parent, sync_blinking = TRUE, list/anim_times = null) . = list() + var/prevent_loops = HAS_TRAIT(parent, TRAIT_PREVENT_BLINK_LOOPS) animate(eyelid, alpha = 0, time = 0, loop = (prevent_loops ? 0 : -1)) @@ -516,6 +517,8 @@ addtimer(CALLBACK(src, PROC_REF(animate_eyelids), owner), blink_delay + duration) /obj/item/organ/eyes/proc/animate_eyelids(mob/living/carbon/human/parent) + if(!CONFIG_GET(flag/blinking)) return // BUBBER EDIT - CONFIG BLINKING + var/sync_blinking = TRUE // synchronized_blinking && (parent.get_organ_loss(ORGAN_SLOT_BRAIN) < ASYNC_BLINKING_BRAIN_DAMAGE) // BUBBER EDIT - REMOVE ASYNC BLINKING UNTIL https://github.com/tgstation/tgstation/issues/90269 is fixed // Randomize order for unsynched animations if (sync_blinking || prob(50)) diff --git a/config/bubbers/bubbers_config.txt b/config/bubbers/bubbers_config.txt index 9626e2b805c..9ea0fa6133e 100644 --- a/config/bubbers/bubbers_config.txt +++ b/config/bubbers/bubbers_config.txt @@ -19,3 +19,6 @@ INTERN_THRESHOLD_COMMAND 20 ## Respawn grace period (deciseconds), which allows to return to the lobby some amount of time after the world loads - default 30 minutes RESPAWN_GRACE_PERIOD 18000 + +#If enabled, /human mobs will ocassionaly blink (somewhat expensive) +BLINKING diff --git a/modular_zubbers/code/controllers/configuration/entries/blinking.dm b/modular_zubbers/code/controllers/configuration/entries/blinking.dm new file mode 100644 index 00000000000..03e862e26ce --- /dev/null +++ b/modular_zubbers/code/controllers/configuration/entries/blinking.dm @@ -0,0 +1,15 @@ +/datum/config_entry/flag/blinking + default = TRUE + +// blinking won't update without re-running the animate +/datum/config_entry/flag/blinking/vv_edit_var(var_name, var_value) + . = ..() + if(var_name == NAMEOF(src, config_entry_value)) + INVOKE_ASYNC(src, PROC_REF(update_blinkers)) + + +/datum/config_entry/flag/blinking/proc/update_blinkers() + for(var/mob/living/carbon/human/blinker in GLOB.alive_mob_list) + var/obj/item/organ/eyes/eyes = blinker.get_organ_slot(ORGAN_SLOT_EYES) + eyes?.blink() + CHECK_TICK diff --git a/tgstation.dme b/tgstation.dme index 24851b2edd6..abfe370d448 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -8805,6 +8805,7 @@ #include "modular_zubbers\code\_globalvars\lists\~maintenance_loot.dm" #include "modular_zubbers\code\_onclick\hud\screen_objects\hud_timer.dm" #include "modular_zubbers\code\controllers\configuration\general.dm" +#include "modular_zubbers\code\controllers\configuration\entries\blinking.dm" #include "modular_zubbers\code\controllers\configuration\entries\nsfw.dm" #include "modular_zubbers\code\controllers\subsystem\air.dm" #include "modular_zubbers\code\controllers\subsystem\job.dm" From 94d00efac8f2fe1b35e1aa900bc71e6a77f0b555 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun, 4 May 2025 19:46:58 +0200 Subject: [PATCH 38/43] Automatic changelog for PR #3703 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3703.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3703.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3703.yml b/html/changelogs/AutoChangeLog-bubber-pr-3703.yml new file mode 100644 index 00000000000..229f525c85e --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3703.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - config: "added config options for toggling blinking" \ No newline at end of file From ab55ba33e886142e760ae9e7cc9e616dbf82d75f Mon Sep 17 00:00:00 2001 From: Manatee <74586965+MajManatee@users.noreply.github.com> Date: Sun, 4 May 2025 14:11:06 -0500 Subject: [PATCH 39/43] Tarkon Service Job (#3688) ## About The Pull Request Atomization 2/2 Adds a tarkon service job and a place in the vault for it with some fun goodies that help with service-ing idk what service people like this PR is basically good to go, unlike the borg one. ## Why It's Good For The Game A dedicated "Service" job slot helps reduce ambiguity (good) and gives people incentive to do so ala vault stuff, skill chips, and an actual official destination over just saying "ill make food" ## Proof Of Testing
Screenshots/Videos Same as the other PR, I forgot to take pictures but it works on local and on main.
## Changelog :cl: add: New job on tarkon, Generic Service Man --- .../SpaceRuins/skyrat/port_tarkon.dmm | 24 +++++++++++++++---- .../modules/tarkon/code/misc-fluff/card.dm | 12 ++++++++++ .../code/misc-fluff/port_tarkon_fluff.dm | 12 ++++++++++ .../modules/tarkon/code/misc-fluff/spawner.dm | 16 +++++++++++++ 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon.dmm index e6404b01774..2bd142d2879 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon.dmm @@ -3159,6 +3159,18 @@ }, /turf/open/floor/wood/large, /area/ruin/space/has_grav/port_tarkon/dorms) +"lu" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/rack, +/obj/item/mod/module/noslip, +/obj/item/soap/omega, +/obj/item/sharpener, +/obj/item/sharpener, +/obj/item/food/cake/lemon, +/obj/item/kitchen/rollingpin/illegal, +/obj/item/grenade/clusterbuster/cleaner, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav) "lw" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 @@ -6575,7 +6587,7 @@ /obj/effect/turf_decal/tile/yellow/half{ dir = 1 }, -/obj/effect/mob_spawn/ghost_role/human/tarkon, +/obj/effect/mob_spawn/ghost_role/human/tarkon/service, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon) "yj" = ( @@ -7912,6 +7924,10 @@ /obj/item/stock_parts/power_store/cell/super, /turf/open/floor/iron/white, /area/ruin/space/has_grav/port_tarkon/trauma) +"CP" = ( +/obj/machinery/door/puzzle/keycard/personal_service, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav) "CQ" = ( /obj/effect/turf_decal/tile/purple/anticorner{ dir = 1 @@ -22318,8 +22334,8 @@ za "} (67,1,1) = {" Vt -TD -Mv +lu +CP jY Mv wY @@ -22567,7 +22583,7 @@ Mv jY Dr Dr -nl +TD Vt za za diff --git a/modular_skyrat/modules/tarkon/code/misc-fluff/card.dm b/modular_skyrat/modules/tarkon/code/misc-fluff/card.dm index aa47c9787b4..76171d7cc60 100644 --- a/modular_skyrat/modules/tarkon/code/misc-fluff/card.dm +++ b/modular_skyrat/modules/tarkon/code/misc-fluff/card.dm @@ -40,6 +40,18 @@ desc = "An access card designated for \"security members\". Everyone wants your guns, partner. Yee-haw." trim = /datum/id_trim/away/tarkon/sec +/datum/id_trim/away/tarkon/service + assignment = "P-T Service Personnel" + access = list(ACCESS_AWAY_GENERAL, ACCESS_WEAPONS, ACCESS_TARKON) + department_color = COLOR_GREEN + department_state = "department" + sechud_icon_state = SECHUD_CHEF + trim_state = "trim_cook" + +/obj/item/card/id/advanced/tarkon/service + name = "P-T service techs access card" + desc = "An access card designated for \"the stations` support\". Cook, clean, and keep everyone on the crew happy." + trim = /datum/id_trim/away/tarkon/service /datum/id_trim/away/tarkon/med assignment = "P-T Trauma Medic" diff --git a/modular_skyrat/modules/tarkon/code/misc-fluff/port_tarkon_fluff.dm b/modular_skyrat/modules/tarkon/code/misc-fluff/port_tarkon_fluff.dm index e72ab792458..f08f10fc3fe 100644 --- a/modular_skyrat/modules/tarkon/code/misc-fluff/port_tarkon_fluff.dm +++ b/modular_skyrat/modules/tarkon/code/misc-fluff/port_tarkon_fluff.dm @@ -96,6 +96,12 @@ color = "#1b50d5" puzzle_id = "tarkon_vaultensign" +/obj/item/keycard/tarkon_job_service + name = "Personal keycard" + desc = "Tarkon industries secure storage lock key. This one has a label reading 'Service Secure Storage'" + color = "#1cac40" + puzzle_id = "tarkon_vaultservice" + // End job specific vault keys // JOB SPECIFIC VAULT DOORS @@ -133,4 +139,10 @@ name = "Personal Ensign Secure Airlock" desc = "Tarkon industries secure storage lock. This one has blue and red markings on it." puzzle_id = "tarkon_vaultensign" + +/obj/machinery/door/puzzle/keycard/personal_service + name = "Personal Service Secure Airlock" + desc = "Tarkon industries secure storage lock. This one has dark green markings on it." + puzzle_id = "tarkon_vaultservice" + // End job specific vault doors diff --git a/modular_skyrat/modules/tarkon/code/misc-fluff/spawner.dm b/modular_skyrat/modules/tarkon/code/misc-fluff/spawner.dm index e5521ae92a2..ec7208e8349 100644 --- a/modular_skyrat/modules/tarkon/code/misc-fluff/spawner.dm +++ b/modular_skyrat/modules/tarkon/code/misc-fluff/spawner.dm @@ -106,6 +106,22 @@ prompt_name = "a port researcher" outfit = /datum/outfit/tarkon/sci +/obj/effect/mob_spawn/ghost_role/human/tarkon/service + name = "Port Tarkon Service Crew Member" + prompt_name = "a port tarkon chef, and janitor" + outfit = /datum/outfit/tarkon/service + +/datum/outfit/tarkon/service + name = "Port Tarkon Service Outfit" + back = /obj/item/storage/backpack + id = /obj/item/card/id/advanced/tarkon/service + id_trim = /datum/id_trim/away/tarkon/service + backpack_contents = list( + /obj/item/storage/box/survival = 1, + /obj/item/keycard/tarkon_job_service, + /obj/item/crowbar = 1, + ) + skillchips = list(/obj/item/skillchip/chefs_kiss, /obj/item/skillchip/intj) /datum/outfit/tarkon/sci name = "Port Tarkon Science Outfit" From 405b85859928fef38377f8c5881b5767efab9ec5 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun, 4 May 2025 21:11:29 +0200 Subject: [PATCH 40/43] Automatic changelog for PR #3688 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3688.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3688.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3688.yml b/html/changelogs/AutoChangeLog-bubber-pr-3688.yml new file mode 100644 index 00000000000..398f11762af --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3688.yml @@ -0,0 +1,4 @@ +author: "MajManatee" +delete-after: True +changes: + - rscadd: "New job on tarkon, Generic Service Man" \ No newline at end of file From 1e9d2ceccdcd95bd8942c17fd971bf241f7388d7 Mon Sep 17 00:00:00 2001 From: Jeremiah <42397676+jlsnow301@users.noreply.github.com> Date: Sun, 4 May 2025 09:39:43 -0700 Subject: [PATCH 41/43] Prevents protected audio from crashing the server with no survivors (#90975) Fixes #90694 I believe the heart of this issue is that the audio player was trying to log an error object, but logs only take strings. This should prevent the blue screen and provide admin feedback - Everyone survives your fatal attempt to play king gizzard the lizard wizard - Better admin feedback why you cannot play aforementioned song :cl: fix: We're no strangers to bugs: Playing protected audio shouldn't crash the server anymore! /:cl: --- code/modules/tgui_panel/tgui_panel.dm | 11 ++++++++ html/changelogs/bubber_archive/2025-05.yml | 5 ++++ tgui/packages/tgui-panel/audio/player.ts | 30 +++++++++++++++++++--- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/code/modules/tgui_panel/tgui_panel.dm b/code/modules/tgui_panel/tgui_panel.dm index 2d270ac72aa..24b1e865ffc 100644 --- a/code/modules/tgui_panel/tgui_panel.dm +++ b/code/modules/tgui_panel/tgui_panel.dm @@ -12,6 +12,8 @@ var/datum/tgui_window/window var/broken = FALSE var/initialized_at + /// Each client notifies on protected playback, so this prevents spamming admins. + var/static/admins_warned = FALSE /datum/tgui_panel/New(client/client, id) src.client = client @@ -86,9 +88,18 @@ ), )) return TRUE + if(type == "audio/setAdminMusicVolume") client.admin_music_volume = payload["volume"] return TRUE + + if(type == "audio/protected") + if(!admins_warned) + message_admins(span_notice("Audio returned a protected playback error, likely due to being copyrighted.")) + admins_warned = TRUE + addtimer(VARSET_CALLBACK(src, admins_warned, FALSE), 10 SECONDS) + return TRUE + if(type == "telemetry") analyze_telemetry(payload) return TRUE diff --git a/html/changelogs/bubber_archive/2025-05.yml b/html/changelogs/bubber_archive/2025-05.yml index 1f1f4b47c68..90695000b5a 100644 --- a/html/changelogs/bubber_archive/2025-05.yml +++ b/html/changelogs/bubber_archive/2025-05.yml @@ -31,3 +31,8 @@ aggresively. - bugfix: Fixes feed detailed description lying about the time it takes to start feeding +2025-05-05: + LT3: + - bugfix: Everyone's chat log no longer bluescreens due to Admins' bad taste in + music. Their fatal attempts to make you listen to king gizzard the lizard + wizard will now fail silently diff --git a/tgui/packages/tgui-panel/audio/player.ts b/tgui/packages/tgui-panel/audio/player.ts index d75fab4487e..9f5f35987d2 100644 --- a/tgui/packages/tgui-panel/audio/player.ts +++ b/tgui/packages/tgui-panel/audio/player.ts @@ -14,6 +14,15 @@ type AudioOptions = { end?: number; }; +function isProtectedError(error: ErrorEvent): boolean { + return ( + typeof error === 'object' && + error !== null && + 'isTrusted' in error && + error.isTrusted + ); +} + export class AudioPlayer { element: HTMLAudioElement | null; options: AudioOptions; @@ -40,7 +49,13 @@ export class AudioPlayer { this.options = options; - const audio = (this.element = new Audio(url)); + const audio = new Audio(url); + if (!audio) { + logger.log('failed to create audio element'); + return; + } + this.element = audio; + audio.volume = this.volume; audio.playbackRate = this.options.pitch || 1; @@ -52,7 +67,11 @@ export class AudioPlayer { }); audio.addEventListener('error', (error) => { - logger.log('playback error', error); + if (isProtectedError(error)) { + Byond.sendMessage('audio/protected'); + } + logger.log('playback error:', JSON.stringify(error)); + this.stop(); }); if (this.options.end) { @@ -67,7 +86,10 @@ export class AudioPlayer { }); } - audio.play(); + audio.play()?.catch(() => { + // no error is passed here, it's sent to the event listener + logger.log('playback failed'); + }); this.onPlaySubscribers.forEach((subscriber) => subscriber()); } @@ -78,7 +100,7 @@ export class AudioPlayer { logger.log('stopping'); this.element.pause(); - this.element = null; + this.destroy(); this.onStopSubscribers.forEach((subscriber) => subscriber()); } From c8a3c20a3e0861558b20b3ac8a25c112ddf5b3e9 Mon Sep 17 00:00:00 2001 From: Ssalty <65713506+KazooBard@users.noreply.github.com> Date: Sun, 4 May 2025 21:39:07 +0200 Subject: [PATCH 42/43] Unifies coco powder to one reagent instead of two (#3618) ## About The Pull Request This PR aims to solve this issue by making any ways to obtain the non-crafting-friendly hot chocolate powder give the regular hot chocolate powder instead ![yeahs](https://github.com/user-attachments/assets/87184d3d-f416-4b29-8cc9-3717ccc62d1a) ## Why It's Good For The Game Unintuitive, now with less hassle, now with more ease, harms noone, makes people happy. I swear if hot chocolate causes the destruction of the server or controversy on merge I will eat a sheet of paper. ## Proof Of Testing Basic replacement, trust me bro ## Changelog :cl: qol: unifies the two existing coco powder related reagents into one /:cl: --- .../code/appliances/chem_machines.dm | 2 +- .../modules/food_replicator/code/reagents.dm | 18 ------------------ .../code/replicator_designs/replicator_food.dm | 4 ++-- 3 files changed, 3 insertions(+), 21 deletions(-) diff --git a/modular_skyrat/modules/colony_fabricator/code/appliances/chem_machines.dm b/modular_skyrat/modules/colony_fabricator/code/appliances/chem_machines.dm index 4addf92cf02..39ebb0a7da5 100644 --- a/modular_skyrat/modules/colony_fabricator/code/appliances/chem_machines.dm +++ b/modular_skyrat/modules/colony_fabricator/code/appliances/chem_machines.dm @@ -101,7 +101,7 @@ /datum/reagent/consumable/powdered_milk, /datum/reagent/consumable/sugar, /datum/reagent/consumable/powdered_lemonade, - /datum/reagent/consumable/powdered_coco, + /datum/reagent/consumable/coco, /datum/reagent/consumable/powdered_coffee, /datum/reagent/consumable/powdered_tea, /datum/reagent/consumable/vanilla, diff --git a/modular_skyrat/modules/food_replicator/code/reagents.dm b/modular_skyrat/modules/food_replicator/code/reagents.dm index 2fb2e731404..f6cf80fb5cd 100644 --- a/modular_skyrat/modules/food_replicator/code/reagents.dm +++ b/modular_skyrat/modules/food_replicator/code/reagents.dm @@ -34,24 +34,6 @@ mix_message = "The mixture instantly heats up." reaction_flags = REACTION_INSTANT -/datum/reagent/consumable/powdered_coco - name = "Powdered Coco" - description = "Made with love (citation needed), and reclaimed biomass." - nutriment_factor = 0 - color = "#403010" - taste_description = "dry chocolate" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - default_container = /obj/item/reagent_containers/cup/glass/mug/coco - -/datum/chemical_reaction/food/unpowdered_coco - required_reagents = list( - /datum/reagent/consumable/milk = 1, - /datum/reagent/consumable/powdered_coco = 1, - ) - results = list(/datum/reagent/consumable/hot_coco = 2) - mix_message = "The mixture instantly heats up." - reaction_flags = REACTION_INSTANT - /datum/reagent/consumable/powdered_lemonade name = "Powdered Lemonade" description = "Sweet, tangy base of a lemonade. Would be good if you'd mix it with water." diff --git a/modular_skyrat/modules/food_replicator/code/replicator_designs/replicator_food.dm b/modular_skyrat/modules/food_replicator/code/replicator_designs/replicator_food.dm index f16364159e7..164568734fe 100644 --- a/modular_skyrat/modules/food_replicator/code/replicator_designs/replicator_food.dm +++ b/modular_skyrat/modules/food_replicator/code/replicator_designs/replicator_food.dm @@ -111,10 +111,10 @@ /datum/design/cocoa name = "Powdered Hot Chocolate" - id = "slavic_coco" + id = "cocoa" build_type = BIOGENERATOR materials = list(/datum/material/biomass = 4) - make_reagent = /datum/reagent/consumable/powdered_coco + make_reagent = /datum/reagent/consumable/coco category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_NRI_FOOD, From 9e35455ae13f96589fba3b8878dad076e703f290 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun, 4 May 2025 21:43:08 +0200 Subject: [PATCH 43/43] Automatic changelog for PR #3618 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-3618.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-3618.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-3618.yml b/html/changelogs/AutoChangeLog-bubber-pr-3618.yml new file mode 100644 index 00000000000..4df552e4c83 --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-3618.yml @@ -0,0 +1,4 @@ +author: "KazooBard" +delete-after: True +changes: + - qol: "unifies the two existing coco powder related reagents into one" \ No newline at end of file