From abbd040526ddeacd3917cd5bf943d37e8fe0660f Mon Sep 17 00:00:00 2001 From: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com> Date: Tue, 25 Jun 2024 05:28:52 +0300 Subject: [PATCH 01/25] basic vibebot (and small rework) (#84143) ## About The Pull Request this refactors vibebots and reworks them to be a little more useful. vibebots can now play a range of MIDI songs. they will seek out depressed players and play an upbeat tune for them and celebrate with them to cheer them up and increase their mood a little bit. if its ur birthday, it will play a happy birthday tune for u. emagged vibebots are ruthless, they will look for sad people and go play grim music for them to ruin their day even more and decrease their moods. ## Why It's Good For The Game refactors vibebots into basic bots and gives them a bit more character ## Changelog :cl: refactor: vibebots are not basic bots add: vibebots will now seek out the depressed and cheer them up /:cl: --- _maps/shuttles/emergency_cruise.dmm | 2 +- code/__DEFINES/ai/bot_keys.dm | 13 +++ code/__DEFINES/song.dm | 6 ++ code/__DEFINES/traits/declarations.dm | 2 + code/_globalvars/traits/_traits.dm | 1 + code/datums/ai/_ai_controller.dm | 2 +- code/datums/components/crafting/robot.dm | 2 +- code/datums/station_traits/neutral_traits.dm | 1 + .../mob/living/basic/bots/vibebot/vibebot.dm | 30 ++++++ .../basic/bots/vibebot/vibebot_abilities.dm | 59 +++++++++++ .../living/basic/bots/vibebot/vibebot_ai.dm | 88 +++++++++++++++++ .../mob/living/simple_animal/bot/vibebot.dm | 97 ------------------- .../unit_tests/simple_animal_freeze.dm | 1 - tgstation.dme | 4 +- tools/UpdatePaths/Scripts/84143_vibebots.txt | 1 + 15 files changed, 207 insertions(+), 102 deletions(-) create mode 100644 code/modules/mob/living/basic/bots/vibebot/vibebot.dm create mode 100644 code/modules/mob/living/basic/bots/vibebot/vibebot_abilities.dm create mode 100644 code/modules/mob/living/basic/bots/vibebot/vibebot_ai.dm delete mode 100644 code/modules/mob/living/simple_animal/bot/vibebot.dm create mode 100644 tools/UpdatePaths/Scripts/84143_vibebots.txt diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm index 7e20dc7d47d58..8045930388cef 100644 --- a/_maps/shuttles/emergency_cruise.dmm +++ b/_maps/shuttles/emergency_cruise.dmm @@ -1648,7 +1648,7 @@ /turf/open/floor/carpet/executive, /area/shuttle/escape) "Jl" = ( -/mob/living/simple_animal/bot/vibebot, +/mob/living/basic/bot/vibebot, /turf/open/floor/iron, /area/shuttle/escape) "Jo" = ( diff --git a/code/__DEFINES/ai/bot_keys.dm b/code/__DEFINES/ai/bot_keys.dm index 61189861141d7..05c0b7aff1899 100644 --- a/code/__DEFINES/ai/bot_keys.dm +++ b/code/__DEFINES/ai/bot_keys.dm @@ -109,3 +109,16 @@ DEFINE_BITFIELD(honkbot_flags, list( ///key that holds our honk ability #define BB_HONK_ABILITY "honk_ability" +//vibebots +///key that holds our partying ability +#define BB_VIBEBOT_PARTY_ABILITY "party_ability" +///key that holds our birthday song +#define BB_VIBEBOT_BIRTHDAY_SONG "birthday_song" +///key that holds happy songs we play to depressed targets +#define BB_VIBEBOT_HAPPY_SONG "happy_song" +///key that holds grim song we play when emagged +#define BB_VIBEBOT_GRIM_SONG "GRIM_song" +///key that holds neutral targets we vibe with +#define BB_VIBEBOT_PARTY_TARGET "party_target" +///key that holds our instrument +#define BB_VIBEBOT_INSTRUMENT "instrument" diff --git a/code/__DEFINES/song.dm b/code/__DEFINES/song.dm index 782a7923ea14f..0e7e9f0ce0692 100644 --- a/code/__DEFINES/song.dm +++ b/code/__DEFINES/song.dm @@ -15,3 +15,9 @@ #define MONKEY_SONG "BPM: 200\nC4/0,14,C,A4-F2,F3,A3,F-F2,A-F,F4,G4,F,D4-Bb2-G2\nD3,G3,D-G2,G3-G2,D,D4-G3,D,B4-B2,G,B3,G-B2,B3-B2\nG4,A4,G,E4-C3,E3,G3,E-C,G-C,E,E4-G,E,C5-E-A3,C4\nA-E3,C,E4-C3,A4-C4,B4-A3-A2,C5-C4,D5-F-B3,D4,B-F3\nD,F4-D3,D4,F-B-B2,G4-D,A4-C-F3,F,C/2,B3/2,A3-C3/2\nB/2,C4,E-C3,F4,G-C,F-F3,F-C,C4/2,B/2,A-A2/2,G3/2\nF/I" ///song played by the mook bard #define MOOK_SONG "BPM: 240\nA5,B5,C#6,D6,E6/0.17,A/0.5,A/0.25,A3/0.25\nA4/0.25,C#5/0.25,E5/0.25,A/0.25,C#/0.25,E/0.12\nC#6/0.25,C#/0.25,E6/0.25,A3/0.25,A4/0.25\nC#5/0.25,E5/0.25,A/0.25,C#/0.25,E/0.25,D/0.25\nG6/0.25,D/0.17,F6/0.17,C#6/0.5,E6/0.5,D4/0.25\nA/0.25,D5/0.25,F5/0.25,A/0.25,D/0.25,F/0.25\nD6/0.08,F6/0.08,D4/0.25,A/0.25,D5/0.25,F5/0.25\nCn4/0.2,B/0.17,D6/0.17,G5/0.5,G/0.25,B3/0.25\nD4/0.25,G4/0.25,B4/0.25,D/0.25,G/0.25,B/0.12\nB5/0.25,B/0.25,D6/0.25,G3/0.25,G4/0.25,B4/0.25\nF/0.25,G/0.25,B/0.25,F/0.25,D/0.25,F6/0.25\nC6/0.17,E/0.17,B5/0.5,D#/0.5,C4/0.25,G/0.25\nC5/0.25,E5/0.25,G/0.25,C/0.25,E/0.25,C6/0.08\nE6/0.08,C4/0.25,Dn4/0.25,E4/0.25,A5/0.17,B/0.5\nC6/0.25,F5/0.08,F4/0.08,C5/0.08,E5/0.12,G5/0.12\nC6/0.25,E6/0.25,E4/0.08,C5/0.08,B/0.17,F6/0.17\nE6/0.5,B/0.25,E4/0.08,G#4/0.08,C6/0.17,D6/0.5\nE6/0.25,A3/0.25,E4/0.25,C5/0.25,Gn3/0.25\nF5/0.12,A5/0.12,A6/0.25,F3/0.25,F4/0.12,A4/0.12\nC/0.12,F6/0.17,A6/0.17,G#6/0.5,A/0.25,F3/0.25\nF4/0.12,A4/0.12,D#5/0.12,B/0.17,G#/0.17,B6/0.5\nB5/0.25,G#/0.25,E3/0.25,E4/0.12,G#4/0.12\nDn/0.12,E6/0.08,E3/0.25,F#3/0.25,G#3/0.25\nE5/0.17,A5/0.17,E/0.5,E/0.25,A3/0.25,C#4/0.25\nE4/0.25,C#/0.25,E/0.12,A5/0.5,B/0.5,C#6/0.5\nD6/0.5,A3/0.25,C#4/0.25,E/0.25,C#/0.25,E/0.25\nE6/0.08,Gn/0.25,E4/0.25,A4/0.25,C#5/0.25,E/0.25\nA/0.25,C#/0.25,E6/0.17,E/0.5,Fn6/0.5,G6/0.5\nG3/0.25,E4/0.25,A/0.25,C#/0.25,E/0.25,A/0.25\nC#/0.25,F/0.08,A6/0.08,F3/0.25,F4/0.25,A4/0.25\nCn/0.25,F/0.25,A/0.25,C/0.25,G6/0.12,A6/0.12\nG A G F6 G3/0.25 D4/0.25 G4/0.25 B4/0.25 D/0.25\nG/0.25 B/0.25 E6/0.12 G6/0.12 F/0.71 G/0.71 F/0.71\nE3/0.25 E4/0.25 G4/0.25 B/0.25 E/0.25 G/0.25 B/0.25\nA5/0.08 E6/0.08 A3/0.25 E4/0.25 A4/0.25 C#/0.25 E/0.25 A/0.25 C#/0.25 D6/0.17 E6/0.5 F/0.25 B3/0.25 D4/0.12 F4/0.12 B4/0.12 F6/0.25 E/0.25 D6/0.25 G#3/0.25 E4/0.12 G#4/0.12 B/0.12 Cn6/0.12 D/0.25 A3/0.25 A4/0.25 C5/0.25 E5/0.25 G#3/0.25 Gn/0.25 C4/0.25 E4/0.25 A/" +///song played by the vibebot when cheering people up +#define VIBEBOT_CHEER_SONG "BPM: 360\nE4/0.5,B4-G4/0.5,G-B-E/0.5,D4,Gb,A4-D-G/0.25\nGn-B3-E/0.5,G-B-E/0.5,A3-D-Gb/0.5,E-Gn-B/0.17,E,G\nB4/0.5,E-B-G/0.5,D,Gb,A4-D-G/0.25,B3-Gn-E/0.5\nG-B-E/0.5,A3-D-Gb/0.5,E-Gn-B/0.17,E-G-C5/0.5,G,E,G\nC,B4-Eb-Gb/0.5,B3-E-G/0.5,B-E-G3/0.5,C-Gn4-En/0.5\nG,E,G,C,Eb-Gb-B4/0.17,C-Gn-En/0.5,G,E,G,C\nB-C-Eb-Gb/0.5,B3-E-G/0.5,E-B-G3/0.5,C-En-Gn4,E,G,C\nE,G,A4-Gb-D5/0.17,E/0.5,B4-Gn/0.5,G-B-E/0.5,D4,Gb\nA-D-G/0.25,Gn-B3-E/0.5,G-B-E/0.5,A3-D-Gb/0.5\nE-Gn-B/0.17,E,G,B4/0.5,E-B-G/0.5,D,Gb,A4-D-G/0.25\nB3-Gn-E/0.5,G-B-E/0.5,A3-D-Gb/0.5,E-Gn-B/0.17\nE-G-C/0.5,G,E,G,C,B4-Eb-Gb/0.5,B3-E-G/0.5\nB-E-G3/0.5,C-Gn4-En/0.5,G,E,G,C,Eb-Gb-B4/0.17\nC-Gn-En/0.5,G,E,G,C,B-C-Eb-Gb/0.5,B3-E-G/0.5\nE-B-G3/0.5,C-En-Gn4,E,G,C,E,G,A4-Gb-D5/0.17\nGn-E-B/0.5,B-G3-E,E3-G-B,G4-E4-B/0.5,A3-D4-Gb/0.5\nA-D-G3/0.5,D3-G-A/0.5,Gn4-E-B/0.5,B-G3-E,E3-G-B\nG4-E4-B/0.5,A-D4-Gb/0.17,A4-F4-C4/0.5,C-A3-F\nF3-A-C,C-F4-A4/0.5,B-Gn-E/0.5,B-G3-E/0.5\nG-E3-B/0.5,A3-D-Gb4/0.5,D-A-G3/0.5,D3-A-G/0.5\nA-D4-G4/0.17,Gn-E4-B/0.5,B-G3-E,E3-G-B,G4-E4-B/0.5\nA-D-Gb/0.5,A-D-G3/0.5,D3-G-A/0.5,Gn4-E-B/0.5\nB-G3-E,E3-G-B,G4-E4-B/0.5,A-D4-Gb/0.17,A4-F-C/0.5\nC-A3-F,F3-A-C,C-F4-A4/0.5,B-Gn-E/0.5,B-G3-E/0.5\nG-E3-B/0.5,A3-D-Gb4/0.5,D-A-G3/0.5,D3-A-G/0.5\nE4-A-Db4/0.17,A2,E3,Gn-B-E4,A,E3,B-G-E4\nA3-Dn-F-D3/0.5,F3-A-D4/0.5,D3/0.5,A2,E3,B-E4-G,A\nE3,B-G-E4,F-D4-A3/0.17,A2,E3,B-E4-G,A,E3,B-G-E4\nB-A3-F4-D-D3/0.5,F3-D4-A/0.5,F-A-D3/0.5,A2,E3\nB-E4-G,A,E3,B-E4-G,F-A3-D4-D3/0.17,A2,E3,G-B-E4,A\nE3,B-G-E4,A3-D4-F4-D3/0.5,F3-A-D4/0.5,D3/0.5,A2,E3\nB-E4-G,A,E3,B-G-E4,F-D4-A3/0.17,A2,E3,B-E4-G,A,E3\nB-G-E4,B-A3-F4-D-D3/0.5,F3-D4-A/0.5,F-A-D3/0.5,A2\nE3,B-E4-G,A,E3,B-E4-G,F-A3-D4-D3/0.17,E/0.5\nB4-G4/0.5,G-B-E/0.5,D4,Gb,A4-D-G/0.25,Gn-B3-E/0.5\nG-B-E/0.5,A3-D-Gb/0.5,E-Gn-B/0.17,E,G,B4/0.5\nE-B-G/0.5,D,Gb,A4-D-G/0.25,B3-Gn-E/0.5,G-B-E/0.5\nA3-D-Gb/0.5,E-Gn-B/0.17,E-G-C5/0.5,G,E,G,C\nB4-Eb-Gb/0.5,B3-E-G/0.5,B-E-G3/0.5,C-Gn4-En/0.5,G\nE,G,C,Eb-Gb-B4/0.17,C-Gn-En/0.5,G,E,G,C\nB-Eb-Gb/0.5,B3-E-G/0.5,E-B-G3/0.53,En-Gn4/8,C,G,E\nB4,G,E,B3-E-G/0.07" +///grim music played by the vibebot +#define VIBEBOT_GRIM_MUSIC "BPM: 92\nG5/0.5,C#7-F#5/1.08,G6-G5/0.52,D6-D5,B6-E5/0.52\nG6-G5/1.08,D6-D5/0.34,Cn6-C5-G6/0.5,D,B5-F#6/13\nB4/0.52,C6-C5-G,A4/0.28,G-G5/0.5\nC#7-F#-F#5/1.08,G6-G5/0.52,D6-D5,B6-E/0.52,G-G6\nB5,D7/13,D6/0.52,Cn6,B6-B5,G-G5,G/0.5\nF#-C#7/1.08,G6-G5/0.22,G/0.5,C#-F#/1.08\nG6-G5/0.52,D-D5,B6-E/0.52,G6-G5/1.08,D6-D5/0.34\nCn6-C5-G6/0.5,D,B5-F#6/13,B4/0.52,C6-G-C5/0.25\nG-G5/0.5,C#7-F#-F#5/1.08,G6-G5/0.52,D6-D5\nB6-E/0.52,G-G6,B5,D7/13,D6/0.52,Cn6,B6-B5,G-G5\nG/0.5,F#-C#7/1.08,G6-G5/0.65" +///happy birthday music we play to the birthday boy +#define VIBEBOT_HAPPY_BIRTHDAY "BPM: 120\nG4/0.5,G4/0.25,A4/0.5,G4/0.5,C5/0.5,B4/1\nG4/0.5,G4/0.25,A4/0.5,G4/0.5,D5/0.5,C5/1\nG4/0.5,G4/0.5,G5/0.5,E5/0.5,C5/0.5,B4/0.5,A4/0.5\nF5/0.5,F5/0.5,E5/0.5,C5/0.5,D5/0.5,C5/1" diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 6cc90893c0f7e..8d2b54ab72f87 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -1167,4 +1167,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// This trait lets you attach limbs to any player without surgery. #define TRAIT_EASY_ATTACH "easy_attach" +///Trait given to the birthday boy +#define TRAIT_BIRTHDAY_BOY "birthday_boy" // END TRAIT DEFINES diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 62805b578d559..5d1e88667b738 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -140,6 +140,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BATON_RESISTANCE" = TRAIT_BATON_RESISTANCE, "TRAIT_BEAST_EMPATHY" = TRAIT_BEAST_EMPATHY, "TRAIT_BEING_BLADE_SHIELDED" = TRAIT_BEING_BLADE_SHIELDED, + "TRAIT_BIRTHDAY_BOY" = TRAIT_BIRTHDAY_BOY, "TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY, "TRAIT_BLOCK_SHUTTLE_MOVEMENT" = TRAIT_BLOCK_SHUTTLE_MOVEMENT, "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 58e9746cbf086..7b46a7b06e803 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -625,7 +625,7 @@ multiple modular subtrees with behaviors /datum/ai_controller/proc/post_blackboard_key_set(key) if (isnull(pawn)) return - SEND_SIGNAL(pawn, COMSIG_AI_BLACKBOARD_KEY_SET(key)) + SEND_SIGNAL(pawn, COMSIG_AI_BLACKBOARD_KEY_SET(key), key) /** * Adds the passed "thing" to the associated key diff --git a/code/datums/components/crafting/robot.dm b/code/datums/components/crafting/robot.dm index 11a5887bf91c5..2398a8b54fbbe 100644 --- a/code/datums/components/crafting/robot.dm +++ b/code/datums/components/crafting/robot.dm @@ -119,7 +119,7 @@ /datum/crafting_recipe/vibebot name = "Vibebot" - result = /mob/living/simple_animal/bot/vibebot + result = /mob/living/basic/bot/vibebot reqs = list( /obj/item/light/bulb = 2, /obj/item/bodypart/head/robot = 1, diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index e066079802d7a..0ecb49f96a063 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -197,6 +197,7 @@ if(length(birthday_options)) birthday_person = pick(birthday_options) birthday_person_name = birthday_person.real_name + ADD_TRAIT(birthday_person, TRAIT_BIRTHDAY_BOY, REF(src)) addtimer(CALLBACK(src, PROC_REF(announce_birthday)), 10 SECONDS) /datum/station_trait/birthday/proc/check_valid_override() diff --git a/code/modules/mob/living/basic/bots/vibebot/vibebot.dm b/code/modules/mob/living/basic/bots/vibebot/vibebot.dm new file mode 100644 index 0000000000000..c872e1ea5959c --- /dev/null +++ b/code/modules/mob/living/basic/bots/vibebot/vibebot.dm @@ -0,0 +1,30 @@ +/mob/living/basic/bot/vibebot + name = "\improper Vibebot" + desc = "A little robot. It's just vibing, doing its thing." + icon = 'icons/mob/silicon/aibots.dmi' + icon_state = "vibebot1" + base_icon_state = "vibebot" + pass_flags = PASSMOB | PASSFLAPS + light_system = OVERLAY_LIGHT + light_range = 6 + ai_controller = /datum/ai_controller/basic_controller/bot/vibebot + light_power = 2 + + hackables = "vibing scanners" + radio_key = /obj/item/encryptionkey/headset_service + radio_channel = RADIO_CHANNEL_SERVICE + bot_type = VIBE_BOT + data_hud_type = DATA_HUD_DIAGNOSTIC_BASIC + path_image_color = "#2cac12" + possessed_message = "You are a vibebot! Maintain the station's vibes to the best of your ability!" + +/mob/living/basic/bot/vibebot/Initialize(mapload) + . = ..() + var/static/list/innate_actions = list( + /datum/action/cooldown/mob_cooldown/bot/vibe = BB_VIBEBOT_PARTY_ABILITY, + ) + + grant_actions_by_list(innate_actions) + var/obj/item/instrument/piano_synth/piano = new(src) + ai_controller.set_blackboard_key(BB_SONG_INSTRUMENT, piano) + update_appearance(UPDATE_ICON) diff --git a/code/modules/mob/living/basic/bots/vibebot/vibebot_abilities.dm b/code/modules/mob/living/basic/bots/vibebot/vibebot_abilities.dm new file mode 100644 index 0000000000000..b3fcec9813b0b --- /dev/null +++ b/code/modules/mob/living/basic/bots/vibebot/vibebot_abilities.dm @@ -0,0 +1,59 @@ +/** + * Vibebot's vibe ability + * + * Given to vibebots so sentient ones can change/reset thier colors at will. + */ +#define VIBE_MOOD_TIMER 30 SECONDS +/datum/action/cooldown/mob_cooldown/bot/vibe + name = "Vibe" + desc = "Use on yourself to remove color!" + click_to_activate = TRUE + button_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "funk" + ///cooldown to apply a new mood + COOLDOWN_DECLARE(change_mood) + +/datum/action/cooldown/mob_cooldown/bot/vibe/Grant(mob/granted_to) + . = ..() + if(isnull(granted_to)) + return + RegisterSignal(granted_to, COMSIG_BOT_RESET, PROC_REF(remove_colors)) + +/datum/action/cooldown/mob_cooldown/bot/vibe/Activate(atom/target) + if(target == owner) + remove_colors() + return TRUE + vibe() + StartCooldown() + return TRUE + +///Gives a random color +/datum/action/cooldown/mob_cooldown/bot/vibe/proc/vibe() + var/mob/living/basic/bot/bot_owner = owner + var/final_color = (bot_owner.bot_access_flags & BOT_COVER_EMAGGED) ? COLOR_GRAY : "#[random_color()]" + owner.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + owner.add_atom_colour(final_color, TEMPORARY_COLOUR_PRIORITY) + owner.set_light_color(owner.color) + if(!COOLDOWN_FINISHED(src, change_mood)) + return + var/mood_to_add = bot_owner.bot_access_flags & BOT_COVER_EMAGGED ? /datum/mood_event/depressing_party : /datum/mood_event/festive_party + for(var/mob/living/carbon/human/human_target in oview(1, owner)) + human_target.add_mood_event("vibebot_party", mood_to_add) + COOLDOWN_START(src, change_mood, VIBE_MOOD_TIMER) + +///Removes all colors +/datum/action/cooldown/mob_cooldown/bot/vibe/proc/remove_colors() + owner.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + owner.set_light_color(null) + +/datum/mood_event/depressing_party + description = "That was a really grim party..." + mood_change = -1 + timeout = 30 SECONDS + +/datum/mood_event/festive_party + description = "That was a really fantastic party!" + mood_change = 2 + timeout = 30 SECONDS + +#undef VIBE_MOOD_TIMER diff --git a/code/modules/mob/living/basic/bots/vibebot/vibebot_ai.dm b/code/modules/mob/living/basic/bots/vibebot/vibebot_ai.dm new file mode 100644 index 0000000000000..945b09274d783 --- /dev/null +++ b/code/modules/mob/living/basic/bots/vibebot/vibebot_ai.dm @@ -0,0 +1,88 @@ +/datum/ai_controller/basic_controller/bot/vibebot + blackboard = list( + BB_UNREACHABLE_LIST_COOLDOWN = 2 MINUTES, + BB_VIBEBOT_HAPPY_SONG = VIBEBOT_CHEER_SONG, + BB_VIBEBOT_GRIM_SONG = VIBEBOT_GRIM_MUSIC, + BB_VIBEBOT_BIRTHDAY_SONG = VIBEBOT_HAPPY_BIRTHDAY, + ) + planning_subtrees = list( + /datum/ai_planning_subtree/respond_to_summon, + /datum/ai_planning_subtree/manage_unreachable_list, + /datum/ai_planning_subtree/find_party_friends, + /datum/ai_planning_subtree/find_patrol_beacon, + ) + reset_keys = list( + BB_BEACON_TARGET, + BB_PREVIOUS_BEACON_TARGET, + BB_VIBEBOT_PARTY_TARGET, + BB_BOT_SUMMON_TARGET, + ) + ai_traits = PAUSE_DURING_DO_AFTER + +/datum/ai_controller/basic_controller/bot/vibebot/TryPossessPawn(atom/new_pawn) + . = ..() + if(. & AI_CONTROLLER_INCOMPATIBLE) + return + RegisterSignal(new_pawn, COMSIG_AI_BLACKBOARD_KEY_SET(BB_VIBEBOT_PARTY_TARGET), PROC_REF(play_music)) + +/datum/ai_controller/basic_controller/bot/vibebot/proc/play_music(datum/source, blackboard_key) + SIGNAL_HANDLER + + var/mob/living/basic/bot/living_bot = pawn + var/obj/item/instrument/instrument = blackboard[BB_SONG_INSTRUMENT] + if(isnull(instrument)) + return + var/atom/target = blackboard[blackboard_key] + var/datum/song/song = instrument.song + song.stop_playing() + var/song_lines + if(living_bot.bot_access_flags & BOT_COVER_EMAGGED) + song_lines = blackboard[BB_VIBEBOT_GRIM_SONG] + else + song_lines = HAS_TRAIT(target, TRAIT_BIRTHDAY_BOY) ? blackboard[BB_VIBEBOT_BIRTHDAY_SONG] : blackboard[BB_VIBEBOT_HAPPY_SONG] + if(isnull(song_lines)) + return + song.ParseSong(new_song = song_lines) + song.start_playing(pawn) + addtimer(CALLBACK(song, TYPE_PROC_REF(/datum/song, stop_playing)), 10 SECONDS) //in 10 seconds, stop playing music + +///subtree we use to find party friends in general +/datum/ai_planning_subtree/find_party_friends + +/datum/ai_planning_subtree/find_party_friends/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/static/list/type_to_search = typecacheof(list(/mob/living/carbon/human)) + if(!controller.blackboard_key_exists(BB_VIBEBOT_PARTY_TARGET)) + controller.queue_behavior(/datum/ai_behavior/bot_search/party_friends, BB_VIBEBOT_PARTY_TARGET, type_to_search) + return + + controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/and_clear_target/vibebot_party, BB_VIBEBOT_PARTY_ABILITY, BB_VIBEBOT_PARTY_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + +///behavior we use to party with people +/datum/ai_behavior/targeted_mob_ability/and_clear_target/vibebot_party + behavior_flags = AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_REQUIRE_MOVEMENT + +/datum/ai_behavior/targeted_mob_ability/and_clear_target/vibebot_party/setup(datum/ai_controller/controller, ability_key, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/targeted_mob_ability/and_clear_target/vibebot_party/finish_action(datum/ai_controller/controller, succeeded, ability_key, target_key) + var/atom/target = controller.blackboard[target_key] + controller.set_blackboard_key_assoc_lazylist(BB_TEMPORARY_IGNORE_LIST, target, TRUE) + if(succeeded) + var/mob/living/living_pawn = controller.pawn + living_pawn.manual_emote("celebrates with [target]!") + living_pawn.emote("flip") + return ..() + +///behavior that searches for party friends +/datum/ai_behavior/bot_search/party_friends + action_cooldown = 5 SECONDS + +/datum/ai_behavior/bot_search/party_friends/valid_target(datum/ai_controller/basic_controller/bot/controller, mob/living/carbon/human/my_target) + if(my_target.stat != CONSCIOUS || isnull(my_target.mind)) + return FALSE + return (my_target.mob_mood.mood_level < MOOD_LEVEL_NEUTRAL || HAS_TRAIT(my_target, TRAIT_BIRTHDAY_BOY)) diff --git a/code/modules/mob/living/simple_animal/bot/vibebot.dm b/code/modules/mob/living/simple_animal/bot/vibebot.dm deleted file mode 100644 index 582b1b5371da5..0000000000000 --- a/code/modules/mob/living/simple_animal/bot/vibebot.dm +++ /dev/null @@ -1,97 +0,0 @@ -/mob/living/simple_animal/bot/vibebot - name = "\improper Vibebot" - desc = "A little robot. It's just vibing, doing its thing." - icon = 'icons/mob/silicon/aibots.dmi' - icon_state = "vibebot1" - base_icon_state = "vibebot" - density = FALSE - anchored = FALSE - health = 25 - maxHealth = 25 - pass_flags = PASSMOB | PASSFLAPS - light_system = OVERLAY_LIGHT - light_range = 6 - light_power = 2 - - hackables = "vibing scanners" - radio_key = /obj/item/encryptionkey/headset_service - radio_channel = RADIO_CHANNEL_SERVICE - bot_type = VIBE_BOT - data_hud_type = DATA_HUD_DIAGNOSTIC_BASIC - path_image_color = "#2cac12" - possessed_message = "You are a vibebot! Maintain the station's vibes to the best of your ability!" - - ///The vibe ability given to vibebots, so sentient ones can still change their color. - var/datum/action/innate/vibe/vibe_ability - -/mob/living/simple_animal/bot/vibebot/Initialize(mapload) - . = ..() - vibe_ability = new(src) - vibe_ability.Grant(src) - update_appearance(UPDATE_ICON) - -/mob/living/simple_animal/bot/vibebot/Destroy() - QDEL_NULL(vibe_ability) - return ..() - -/mob/living/simple_animal/bot/vibebot/handle_automated_action() - . = ..() - if(!.) - return - - if(bot_mode_flags & BOT_MODE_ON) - vibe_ability.Trigger() - - if(!(bot_mode_flags & BOT_MODE_AUTOPATROL)) - return - - switch(mode) - if(BOT_IDLE, BOT_START_PATROL) - start_patrol() - if(BOT_PATROL) - bot_patrol() - -/mob/living/simple_animal/bot/vibebot/turn_off() - vibe_ability.remove_colors() - return ..() - -/** - * Vibebot's vibe ability - * - * Given to vibebots so sentient ones can change/reset thier colors at will. - */ -/datum/action/innate/vibe - name = "Vibe" - desc = "LMB: Change vibe color. RMB: Reset vibe color." - button_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "funk" - -/datum/action/innate/vibe/IsAvailable(feedback = FALSE) - . = ..() - if(!.) - return FALSE - if(isbot(owner)) - var/mob/living/simple_animal/bot/bot_mob = owner - if(!(bot_mob.bot_mode_flags & BOT_MODE_ON)) - return FALSE - return TRUE - -/datum/action/innate/vibe/Trigger(trigger_flags) - . = ..() - if(!.) - return - if(trigger_flags & TRIGGER_SECONDARY_ACTION) - remove_colors() - else - vibe() - -///Gives a random color -/datum/action/innate/vibe/proc/vibe() - owner.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) - owner.add_atom_colour("#[random_color()]", TEMPORARY_COLOUR_PRIORITY) - owner.set_light_color(owner.color) - -///Removes all colors -/datum/action/innate/vibe/proc/remove_colors() - owner.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) - owner.set_light_color(null) diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index 7db63d6b48df6..706fe290cccf4 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -21,7 +21,6 @@ /mob/living/simple_animal/bot/secbot/grievous, /mob/living/simple_animal/bot/secbot/grievous/toy, /mob/living/simple_animal/bot/secbot/pingsky, - /mob/living/simple_animal/bot/vibebot, /mob/living/simple_animal/hostile, /mob/living/simple_animal/hostile/asteroid, /mob/living/simple_animal/hostile/asteroid/curseblob, diff --git a/tgstation.dme b/tgstation.dme index f8e2a62d09775..95898ab0e9dc2 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4666,6 +4666,9 @@ #include "code\modules\mob\living\basic\bots\hygienebot\hygienebot_ai.dm" #include "code\modules\mob\living\basic\bots\medbot\medbot.dm" #include "code\modules\mob\living\basic\bots\medbot\medbot_ai.dm" +#include "code\modules\mob\living\basic\bots\vibebot\vibebot.dm" +#include "code\modules\mob\living\basic\bots\vibebot\vibebot_abilities.dm" +#include "code\modules\mob\living\basic\bots\vibebot\vibebot_ai.dm" #include "code\modules\mob\living\basic\clown\clown.dm" #include "code\modules\mob\living\basic\clown\clown_ai.dm" #include "code\modules\mob\living\basic\cult\shade.dm" @@ -5116,7 +5119,6 @@ #include "code\modules\mob\living\simple_animal\bot\mulebot.dm" #include "code\modules\mob\living\simple_animal\bot\secbot.dm" #include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm" -#include "code\modules\mob\living\simple_animal\bot\vibebot.dm" #include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" #include "code\modules\mob\living\simple_animal\hostile\illusion.dm" diff --git a/tools/UpdatePaths/Scripts/84143_vibebots.txt b/tools/UpdatePaths/Scripts/84143_vibebots.txt new file mode 100644 index 0000000000000..e5474e517e350 --- /dev/null +++ b/tools/UpdatePaths/Scripts/84143_vibebots.txt @@ -0,0 +1 @@ +/mob/living/simple_animal/bot/secbot/vibebot/@SUBTYPES : /mob/living/basic/bot/vibebot/@SUBTYPES{@OLD} \ No newline at end of file From 930d55f4cce9265b2431b095fb50f3cee8466f93 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 25 Jun 2024 14:31:29 +1200 Subject: [PATCH 02/25] Automatic changelog for PR #84143 [ci skip] --- html/changelogs/AutoChangeLog-pr-84143.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84143.yml diff --git a/html/changelogs/AutoChangeLog-pr-84143.yml b/html/changelogs/AutoChangeLog-pr-84143.yml new file mode 100644 index 0000000000000..68b36d831d4f6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84143.yml @@ -0,0 +1,5 @@ +author: "Ben10Omintrix" +delete-after: True +changes: + - refactor: "vibebots are not basic bots" + - rscadd: "vibebots will now seek out the depressed and cheer them up" \ No newline at end of file From edfaad18a42f1f0872603ed05b8de33225318e93 Mon Sep 17 00:00:00 2001 From: combustor <79808856+combustor@users.noreply.github.com> Date: Tue, 25 Jun 2024 07:51:46 +0400 Subject: [PATCH 03/25] Fixes the visor of the welding mask going down when you use internals (#84135) ## About The Pull Request The visor of the welding mask no longer goes down when you enable internals ## Why It's Good For The Game You'll no longer go semi-blind when you activate internals while using this mask Fixes #83728 ## Changelog :cl: Guestify fix: The visor of the welding mask no longer goes down when you enable internals /:cl: --------- Co-authored-by: san7890 --- code/__DEFINES/obj_flags.dm | 2 ++ code/_globalvars/bitfields.dm | 1 + code/modules/clothing/masks/gasmask.dm | 1 + code/modules/mob/living/carbon/human/inventory.dm | 4 ++-- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 62ae5a7394a0a..c050c73f23133 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -87,6 +87,8 @@ #define INEDIBLE_CLOTHING (1<<16) /// Headgear/helmet allows internals #define HEADINTERNALS (1<<17) +/// Prevents masks from getting adjusted from enabling internals +#define INTERNALS_ADJUST_EXEMPT (1<<18) /// Integrity defines for clothing (not flags but close enough) #define CLOTHING_PRISTINE 0 // We have no damage on the clothing diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index ead7b324cea13..f98178d537fa3 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -99,6 +99,7 @@ DEFINE_BITFIELD(clothing_flags, list( "THICKMATERIAL" = THICKMATERIAL, "VOICEBOX_DISABLED" = VOICEBOX_DISABLED, "VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE, + "INTERNALS_ADJUST_EXEMPT" = INTERNALS_ADJUST_EXEMPT, )) DEFINE_BITFIELD(datum_flags, list( diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 807e795568821..ef90fcf97e10a 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -221,6 +221,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( visor_flags_cover = MASKCOVERSEYES visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT resistance_flags = FIRE_PROOF + clothing_flags = parent_type::clothing_flags | INTERNALS_ADJUST_EXEMPT /datum/armor/gas_welding melee = 10 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 19e4b7a43deb6..b1efa734321c5 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -292,8 +292,8 @@ return toggle_open_internals(tank, is_external) // Use mask in absence of tube. if(isclothing(wear_mask) && ((wear_mask.visor_flags & MASKINTERNALS) || (wear_mask.clothing_flags & MASKINTERNALS))) - // Adjust dishevelled breathing mask back onto face. - if (wear_mask.up) + // Adjust dishevelled breathing mask back onto face unless it is exempt. + if ((wear_mask.up) && !(wear_mask.clothing_flags & INTERNALS_ADJUST_EXEMPT)) wear_mask.adjust_visor(src) return toggle_open_internals(tank, is_external) // Use helmet in absence of tube or valid mask. From 650ce06e7344e71be5ad4d8910a0acc29a31cb33 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:52:04 +1200 Subject: [PATCH 04/25] Automatic changelog for PR #84135 [ci skip] --- html/changelogs/AutoChangeLog-pr-84135.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84135.yml diff --git a/html/changelogs/AutoChangeLog-pr-84135.yml b/html/changelogs/AutoChangeLog-pr-84135.yml new file mode 100644 index 0000000000000..b503e29e311d5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84135.yml @@ -0,0 +1,4 @@ +author: "Guestify" +delete-after: True +changes: + - bugfix: "The visor of the welding mask no longer goes down when you enable internals" \ No newline at end of file From c0b83500e52af41b213865487b995ef86e8a907d Mon Sep 17 00:00:00 2001 From: GoblinBackwards <22856555+GoblinBackwards@users.noreply.github.com> Date: Tue, 25 Jun 2024 05:01:45 +0100 Subject: [PATCH 05/25] Makes interacting with an assembly bomb interact with the assembly instead of opening the tank UI (#84075) ## About The Pull Request Changes it so that interacting in hand with an assembly bomb will interact with the assemble instead of opening the tank UI. ## Why It's Good For The Game Currently when you interact with an assembly bomb in hand it opens the tank UI instead of interacting with the assembly, which makes them awkward to use as you have to configure the assembly before attaching it to the tank and welding the tank. Fixes #84073 ## Changelog :cl: fix: Interacting with an assembly bomb in hand will now allow you to interact with the attached assembly instead of opening the gas tank UI. Right-clicking will display the gas tank UI instead. /:cl: --- code/game/objects/items/tanks/tanks.dm | 10 ++++++++++ code/modules/assembly/mousetrap.dm | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index b4d35efdda12a..bdbfa79001ddf 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -415,6 +415,16 @@ if(tank_assembly) tank_assembly.attack_hand() +/obj/item/tank/attack_self(mob/user, modifiers) + if (tank_assembly) + tank_assembly.attack_self(user) + return TRUE + return ..() + +/obj/item/tank/attack_self_secondary(mob/user, modifiers) + . = ..() + ui_interact(user) + /obj/item/tank/Move() . = ..() if(tank_assembly) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 1d8936e6068da..5c7f5208254f0 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -153,7 +153,7 @@ * * user: The mob handling the trap */ /obj/item/assembly/mousetrap/proc/clumsy_check(mob/living/carbon/human/user) - if(!armed) + if(!armed || !user) return FALSE if((HAS_TRAIT(user, TRAIT_DUMB) || HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50)) var/which_hand = BODY_ZONE_PRECISE_L_HAND From e5e116b06c0ca67294296ae205ff98e6d28f4f37 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:02:05 +1200 Subject: [PATCH 06/25] Automatic changelog for PR #84075 [ci skip] --- html/changelogs/AutoChangeLog-pr-84075.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84075.yml diff --git a/html/changelogs/AutoChangeLog-pr-84075.yml b/html/changelogs/AutoChangeLog-pr-84075.yml new file mode 100644 index 0000000000000..427cc4f1ae6d0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84075.yml @@ -0,0 +1,4 @@ +author: "GoblinBackwards" +delete-after: True +changes: + - bugfix: "Interacting with an assembly bomb in hand will now allow you to interact with the attached assembly instead of opening the gas tank UI. Right-clicking will display the gas tank UI instead." \ No newline at end of file From 89f1b937076f21e655623bbdd9296a844f1b36fa Mon Sep 17 00:00:00 2001 From: GPeckman <21979502+GPeckman@users.noreply.github.com> Date: Tue, 25 Jun 2024 00:04:00 -0400 Subject: [PATCH 07/25] Anomaly fix/code improvement (#84072) ## About The Pull Request Makes anomaly cores use `analyzer_act` instead of `attackby`. Fixes #83994. ## Why It's Good For The Game `attackby` is old and kinda poor practice to use in this case. `analyzer_act` does everything necessary, so it just makes sense to do that instead. ## Changelog :cl: fix: Analyzers should work on bioscrambler anomalies again. /:cl: --------- Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Co-authored-by: Jacquerel --- code/game/objects/effects/anomalies/_anomalies.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index ee02cab9e036b..ce9bab6a511cc 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -113,12 +113,13 @@ qdel(src) -/obj/effect/anomaly/attackby(obj/item/weapon, mob/user, params) - if(weapon.tool_behaviour == TOOL_ANALYZER && anomaly_core) +/obj/effect/anomaly/analyzer_act(mob/living/user, obj/item/analyzer/tool) + if(!isnull(anomaly_core)) to_chat(user, span_notice("Analyzing... [src]'s unstable field is fluctuating along frequency [format_frequency(anomaly_core.frequency)], code [anomaly_core.code].")) - return TRUE + return ITEM_INTERACT_SUCCESS + to_chat(user, span_notice("Analyzing... [src]'s unstable field is not fluctuating along a stable frequency.")) + return ITEM_INTERACT_BLOCKING - return ..() ///Stabilize an anomaly, letting it stay around forever or untill destabilizes by a player. An anomaly without a core can't be signalled, but can be destabilized /obj/effect/anomaly/proc/stabilize(anchor = FALSE, has_core = TRUE) From 78aaa4b9720e20b339bec66e5d5cdb6b7dd8456c Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:04:19 +1200 Subject: [PATCH 08/25] Automatic changelog for PR #84072 [ci skip] --- html/changelogs/AutoChangeLog-pr-84072.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84072.yml diff --git a/html/changelogs/AutoChangeLog-pr-84072.yml b/html/changelogs/AutoChangeLog-pr-84072.yml new file mode 100644 index 0000000000000..c36813ba598d8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84072.yml @@ -0,0 +1,4 @@ +author: "GPeckman" +delete-after: True +changes: + - bugfix: "Analyzers should work on bioscrambler anomalies again." \ No newline at end of file From 38b7580894aa4d4ebf8b043dd7be0892e6dfd90f Mon Sep 17 00:00:00 2001 From: jimmyl <70376633+mc-oofert@users.noreply.github.com> Date: Tue, 25 Jun 2024 06:05:59 +0200 Subject: [PATCH 09/25] durand shield is a tad bit stronger and also doesnt immediately depower the mech when taking stamina damage (#84043) ## About The Pull Request durand shield is a tad bit stronger and also doesnt immediately depower the mech when taking stamina damage ## Why It's Good For The Game i mean this shit almost immediately depowers the mecha if you hit it a few times with a toolbox and thats bad for something that costs shittons of mats making it not as bad should make it not a noob trap also bug bad ## Changelog :cl: fix: durand shield doesnt immediately depower the mech when taking stamina damage balance: durand shield is a bit stronger /:cl: --- code/modules/vehicles/mecha/combat/durand.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index b44478582c031..c6fcae75bc98f 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -271,7 +271,9 @@ own integrity back to max. Shield is automatically dropped if we run out of powe return . = ..() flick("shield_impact", src) - if(!chassis.use_energy((max_integrity - atom_integrity) * 0.1 * STANDARD_CELL_CHARGE)) + if(!.) + return + if(!chassis.use_energy(. * (STANDARD_CELL_CHARGE / 15))) chassis.cell?.charge = 0 for(var/O in chassis.occupants) var/mob/living/occupant = O From 5b4a41bb6d55f5845a117aead1f0f0d866172502 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:06:18 +1200 Subject: [PATCH 10/25] Automatic changelog for PR #84043 [ci skip] --- html/changelogs/AutoChangeLog-pr-84043.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84043.yml diff --git a/html/changelogs/AutoChangeLog-pr-84043.yml b/html/changelogs/AutoChangeLog-pr-84043.yml new file mode 100644 index 0000000000000..5397404f75b8d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84043.yml @@ -0,0 +1,5 @@ +author: "mc-oofert" +delete-after: True +changes: + - bugfix: "durand shield doesnt immediately depower the mech when taking stamina damage" + - balance: "durand shield is a bit stronger" \ No newline at end of file From 064c5263af07e7d0d77255f36d9502ed27f49910 Mon Sep 17 00:00:00 2001 From: carlarctg <53100513+carlarctg@users.noreply.github.com> Date: Tue, 25 Jun 2024 01:15:33 -0300 Subject: [PATCH 11/25] Fixed teeth pill overload by adding a teeth count to species (#83831) ## About The Pull Request There's now a limit to how many dental implants you can cram into your mouth, which is governed by your species' teeth limit. Most species have 32 teeth, due to being based on humans, weirding me out when thinking about their teeth, or lack of enough information Moths and flypeople have NO teeth. They CAN'T get dental implants. I'm NERFING moths. Lizards have seventy-five (!!!) teeth. Lizards are weird. ## Why It's Good For The Game > There's now a limit to how many dental implants you can cram into your mouth, which is governed by your species' teeth limit. Closes #83820 by, uh. Well I guess it doesn't really do anything about being able to have 32 pills in your teeth... but now it's realistically limited. Yay! Anyone willing to make someone else suffer through 32 dental surgeries deserves it. > Most species have 32 teeth, due to being based on humans, weirding me out when thinking about their teeth, or lack of enough information Bro do slimegirls have teeth? Podpeople? Zombies?? Ayys???? > Moths and flypeople have NO teeth. They CAN'T get dental implants. I'm NERFING moths. Moths and flies DON'T have teeth. It's UNREALISTIC. And it's a small and funny touch, balanced out by... > Lizards have seventy-five (!!!) teeth. Lizards are weird. Lizards are weird. ## Changelog :cl: fix: There's now a limit to how many dental implants you can cram into your mouth, which is governed by your species' teeth limit. refactor: Most species have 32 teeth, due to being based on humans, weirding me out when thinking about their teeth, or lack of enough information refactor: Moths and flypeople have NO teeth. They CAN'T get dental implants. I'm NERFING moths. refactor: Lizards have seventy-five (!!!) teeth. Lizards are weird. /:cl: --- code/modules/surgery/bodyparts/head.dm | 3 +++ .../species_parts/ethereal_bodyparts.dm | 1 + .../species_parts/lizard_bodyparts.dm | 2 ++ .../bodyparts/species_parts/misc_bodyparts.dm | 7 ++++++ .../bodyparts/species_parts/moth_bodyparts.dm | 1 + code/modules/surgery/dental_implant.dm | 24 +++++++++++++++++-- 6 files changed, 36 insertions(+), 2 deletions(-) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 5685b12b9ef62..66f42c1e039ba 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -76,6 +76,9 @@ ///Current lipstick trait, if any (such as TRAIT_KISS_OF_DEATH) var/stored_lipstick_trait + /// How many teeth the head's species has, humans have 32 so that's the default. Used for a limit to dental pill implants. + var/teeth_count = 32 + /// Offset to apply to equipment worn on the ears var/datum/worn_feature_offset/worn_ears_offset /// Offset to apply to equipment worn on the eyes diff --git a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm index 20e4b58660795..05645ed20df2e 100644 --- a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm @@ -103,3 +103,4 @@ icon_state = "lustrous_head" limb_id = SPECIES_ETHEREAL_LUSTROUS head_flags = NONE + teeth_count = 0 // bro you seen these thinsg. they got a crystal for a head aint no teeth here diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm index 157e5b04fe68e..350e2f32883fb 100644 --- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm @@ -3,6 +3,8 @@ limb_id = SPECIES_LIZARD is_dimorphic = FALSE head_flags = HEAD_LIPS|HEAD_EYESPRITES|HEAD_EYECOLOR|HEAD_EYEHOLES|HEAD_DEBRAIN + // lizardshave many teeth + teeth_count = 72 /obj/item/bodypart/chest/lizard icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm index fa3ab9cc49d39..f9a71a4e6d4dd 100644 --- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm @@ -5,6 +5,7 @@ burn_modifier = 2 head_flags = HEAD_EYESPRITES|HEAD_DEBRAIN biological_state = (BIO_FLESH|BIO_BLOODED) + teeth_count = 0 /obj/item/bodypart/chest/snail limb_id = SPECIES_SNAIL @@ -51,6 +52,7 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE head_flags = NONE + teeth_count = 0 /obj/item/bodypart/chest/abductor limb_id = SPECIES_ABDUCTOR @@ -146,6 +148,7 @@ ///LUMINESCENT /obj/item/bodypart/head/jelly/luminescent limb_id = SPECIES_LUMINESCENT + teeth_count = 0 /obj/item/bodypart/chest/jelly/luminescent limb_id = SPECIES_LUMINESCENT @@ -250,6 +253,7 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE head_flags = HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN + teeth_count = 0 /obj/item/bodypart/chest/fly limb_id = SPECIES_FLYPERSON @@ -367,6 +371,7 @@ is_dimorphic = TRUE burn_modifier = 1.25 head_flags = NONE + teeth_count = 0 /obj/item/bodypart/chest/mushroom limb_id = SPECIES_MUSHROOM @@ -436,6 +441,8 @@ should_draw_greyscale = FALSE dmg_overlay_type = null head_flags = NONE + // too hard to drill through + teeth_count = 0 /obj/item/bodypart/head/golem/Initialize(mapload) worn_ears_offset = new( diff --git a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm index 375b37ca434d6..323cef05b8c5d 100644 --- a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm @@ -6,6 +6,7 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE head_flags = HEAD_LIPS|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN //what the fuck, moths have lips? + teeth_count = 0 /obj/item/bodypart/chest/moth icon = 'icons/mob/human/species/moth/bodyparts.dmi' diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index d720039d56b7e..3c645f240d484 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -2,16 +2,35 @@ name = "Dental implant" possible_locs = list(BODY_ZONE_PRECISE_MOUTH) steps = list( - /datum/surgery_step/drill, + /datum/surgery_step/drill/pill, /datum/surgery_step/insert_pill, ) +/datum/surgery_step/drill/pill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + . = ..() + var/count = 0 + var/obj/item/bodypart/head/teeth_receptangle = target.get_bodypart(BODY_ZONE_HEAD) + + ASSERT(teeth_receptangle) + + for(var/obj/item/reagent_containers/pill/dental in teeth_receptangle) + count++ + + if(teeth_receptangle.teeth_count == 0) + to_chat(user, span_notice("[user] has no teeth, doofus!")) + return SURGERY_STEP_FAIL + + if(count >= teeth_receptangle.teeth_count) + to_chat(user, span_notice("[user]'s teeth have all been replaced with pills already!")) + return SURGERY_STEP_FAIL + /datum/surgery_step/insert_pill name = "insert pill" implements = list(/obj/item/reagent_containers/pill = 100) time = 16 /datum/surgery_step/insert_pill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results( user, target, @@ -25,7 +44,8 @@ if(!istype(tool)) return FALSE - user.transferItemToLoc(tool, target, TRUE) + // Pills go into head + user.transferItemToLoc(tool, target.get_bodypart(BODY_ZONE_HEAD), TRUE) var/datum/action/item_action/activate_pill/pill_action = new(tool) pill_action.name = "Activate [tool.name]" From 50062b718bd77f13023a699814e9052f708263ef Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:16:06 +1200 Subject: [PATCH 12/25] Automatic changelog for PR #83831 [ci skip] --- html/changelogs/AutoChangeLog-pr-83831.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83831.yml diff --git a/html/changelogs/AutoChangeLog-pr-83831.yml b/html/changelogs/AutoChangeLog-pr-83831.yml new file mode 100644 index 0000000000000..b3e655a55ddf2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83831.yml @@ -0,0 +1,7 @@ +author: "carlarctg" +delete-after: True +changes: + - bugfix: "There's now a limit to how many dental implants you can cram into your mouth, which is governed by your species' teeth limit." + - refactor: "Most species have 32 teeth, due to being based on humans, weirding me out when thinking about their teeth, or lack of enough information" + - refactor: "Moths and flypeople have NO teeth. They CAN'T get dental implants. I'm NERFING moths." + - refactor: "Lizards have seventy-five (!!!) teeth. Lizards are weird." \ No newline at end of file From d85b05fb9b57333713e76eac846d64036a84c0c6 Mon Sep 17 00:00:00 2001 From: jimmyl <70376633+mc-oofert@users.noreply.github.com> Date: Tue, 25 Jun 2024 06:17:05 +0200 Subject: [PATCH 13/25] space dragon can see in the dark + unga-brain-proofs the rift ballon alert (#83811) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## About The Pull Request ![2024-06-08 08_24_13-Window](https://github.com/tgstation/tgstation/assets/70376633/6b343f1a-7091-4868-84cd-0c4f02dd6b5b) ![image](https://github.com/tgstation/tgstation/assets/70376633/c7021764-3062-4aab-a444-09d3a52fc968) ## Why It's Good For The Game the space dragon as some leviathan space carp creature god thing somehow cannot see in the dark and does not have hands to turn lights on, especially problematic in icemoon wastes. Nightvision = see = good 👍🏻 balloon alert directly telling you to check your objectives is a lot more informational than previously ## Changelog :cl: qol: space dragon can see in the dark and the invalid rift location alert is more informative /:cl: --- code/modules/antagonists/space_dragon/carp_rift.dm | 2 +- .../living/basic/space_fauna/space_dragon/space_dragon.dm | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/space_dragon/carp_rift.dm b/code/modules/antagonists/space_dragon/carp_rift.dm index 4b8a20acba8d1..828ee94587fcb 100644 --- a/code/modules/antagonists/space_dragon/carp_rift.dm +++ b/code/modules/antagonists/space_dragon/carp_rift.dm @@ -19,7 +19,7 @@ return var/area/rift_location = get_area(owner) if(!(rift_location in dragon.chosen_rift_areas)) - owner.balloon_alert(owner, "can't summon a rift here!") + owner.balloon_alert(owner, "can't summon a rift here! check your objectives!") return for(var/obj/structure/carp_rift/rift as anything in dragon.rift_list) var/area/used_location = get_area(rift) diff --git a/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm b/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm index 2286f65b79758..1776e69358139 100644 --- a/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm +++ b/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm @@ -4,7 +4,7 @@ #define DOAFTER_SOURCE_SPACE_DRAGON_INTERACTION "space dragon interaction" /** - * Advanced stage of the space carp life cycle, spawned as a midround antagonist or via traitor transformation. + * Advanced stage of the space carp life cycle, spawned as a midround antagonist * Can eat corpses to heal, blow people back with its wings, and obviously as a dragon it breathes fire. It can even tear through walls. * The midround even version also creates rifts which summon carp, and heals when near them. */ @@ -47,6 +47,9 @@ death_message = "screeches in agony as it collapses to the floor, its life extinguished." butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30) can_buckle_to = FALSE + lighting_cutoff_red = 12 + lighting_cutoff_green = 15 + lighting_cutoff_blue = 34 /// The colour of the space dragon var/chosen_colour From dc8fcb4b08a2acaf1003828de2108d30f417c398 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:17:41 +1200 Subject: [PATCH 14/25] Automatic changelog for PR #83811 [ci skip] --- html/changelogs/AutoChangeLog-pr-83811.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83811.yml diff --git a/html/changelogs/AutoChangeLog-pr-83811.yml b/html/changelogs/AutoChangeLog-pr-83811.yml new file mode 100644 index 0000000000000..2aaf9471f4b48 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83811.yml @@ -0,0 +1,4 @@ +author: "mc-oofert" +delete-after: True +changes: + - qol: "space dragon can see in the dark and the invalid rift location alert is more informative" \ No newline at end of file From 5b25331e7ad8c64a208bfa9fe8394e16aac735e0 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Tue, 25 Jun 2024 07:18:16 +0300 Subject: [PATCH 15/25] Adds rounding to research points to prevent floating point errors from occuring (#84282) ## About The Pull Request Right now research points sometimes bug out and get additional .000...1 added to them due to a floating point error. I just added rounding to only keep one digit after the point. ## Why It's Good For The Game No more annoying numbers in the RND console ## Changelog :cl: fix: RND console now properly rounds research points /:cl: --- code/modules/research/techweb/_techweb.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index b4b137d8e2187..3c920f6b9a6fe 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -108,7 +108,7 @@ /datum/techweb/proc/add_point_list(list/pointlist) for(var/i in pointlist) if((i in SSresearch.point_types) && pointlist[i] > 0) - research_points[i] += pointlist[i] + research_points[i] = FLOOR(research_points[i] + pointlist[i], 0.1) /datum/techweb/proc/add_points_all(amount) var/list/l = SSresearch.point_types.Copy() @@ -119,7 +119,7 @@ /datum/techweb/proc/remove_point_list(list/pointlist) for(var/i in pointlist) if((i in SSresearch.point_types) && pointlist[i] > 0) - research_points[i] = max(0, research_points[i] - pointlist[i]) + research_points[i] = FLOOR(max(0, research_points[i] - pointlist[i]), 0.1) /datum/techweb/proc/remove_points_all(amount) var/list/l = SSresearch.point_types.Copy() @@ -130,7 +130,7 @@ /datum/techweb/proc/modify_point_list(list/pointlist) for(var/i in pointlist) if((i in SSresearch.point_types) && pointlist[i] != 0) - research_points[i] = max(0, research_points[i] + pointlist[i]) + research_points[i] = FLOOR(max(0, research_points[i] + pointlist[i]), 0.1) /datum/techweb/proc/modify_points_all(amount) var/list/l = SSresearch.point_types.Copy() From 593accd2be2a82583b56941c1b30e642c9f5e19a Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:21:52 +1200 Subject: [PATCH 16/25] Automatic changelog for PR #84282 [ci skip] --- html/changelogs/AutoChangeLog-pr-84282.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84282.yml diff --git a/html/changelogs/AutoChangeLog-pr-84282.yml b/html/changelogs/AutoChangeLog-pr-84282.yml new file mode 100644 index 0000000000000..fe26b6cb2c010 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84282.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "RND console now properly rounds research points" \ No newline at end of file From 9ab7d8f2e819c4bdf9c2227e4cc6380e149a6681 Mon Sep 17 00:00:00 2001 From: Jeremiah <42397676+jlsnow301@users.noreply.github.com> Date: Mon, 24 Jun 2024 21:25:33 -0700 Subject: [PATCH 17/25] Bitrunning: Avatars get silly hacker names (#84279) ## About The Pull Request Bit avatars now get corny names while spawning in to the virtual domain. You can change your alias in prefs or have it randomized for s0meth1ng 1337. Added sechud icons (and thereby orbit ui icons) for bit avatars since "Cyb3rHaxx0r" might be confusing to find in the living players section. ## Why It's Good For The Game This was done as a request and after discussion in the code channel. A little bit of character persistence across simulations. ## Changelog :cl: add: Bitrunning: You can now choose your hacker alias in prefs. add: Bit avatars get orbit icons. /:cl: --- code/__DEFINES/atom_hud.dm | 1 + code/_globalvars/lists/names.dm | 1 + code/datums/id_trim/outfits.dm | 1 + .../components/avatar_connection.dm | 24 ++++++++- .../bitrunning/server/obj_generation.dm | 3 -- code/modules/client/preferences/names.dm | 12 +++++ icons/mob/huds/hud.dmi | Bin 10830 -> 10885 bytes strings/names/hackers.txt | 46 ++++++++++++++++++ .../tgui/interfaces/Orbit/OrbitContent.tsx | 2 +- 9 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 strings/names/hackers.txt diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 7df79b7e57a26..86de96f07a1d1 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -81,6 +81,7 @@ #define SECHUD_ASSISTANT "hudassistant" #define SECHUD_ATMOSPHERIC_TECHNICIAN "hudatmospherictechnician" #define SECHUD_BARTENDER "hudbartender" +#define SECHUD_BITAVATAR "hudbitavatar" #define SECHUD_BITRUNNER "hudbitrunner" #define SECHUD_BOTANIST "hudbotanist" #define SECHUD_BRIDGE_ASSISTANT "hudbridgeassistant" diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index 81fe08373b31a..dce2dc69a50ae 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -24,6 +24,7 @@ GLOBAL_LIST_INIT(nightmare_names, world.file2list("strings/names/nightmare.txt") GLOBAL_LIST_INIT(megacarp_first_names, world.file2list("strings/names/megacarp1.txt")) GLOBAL_LIST_INIT(megacarp_last_names, world.file2list("strings/names/megacarp2.txt")) GLOBAL_LIST_INIT(cyberauth_names, world.file2list("strings/names/cyberauth.txt")) +GLOBAL_LIST_INIT(hacker_aliases, world.file2list("strings/names/hackers.txt")) GLOBAL_LIST_INIT(syndicate_monkey_names, world.file2list("strings/names/syndicate_monkey.txt")) GLOBAL_LIST_INIT(cargorilla_names, world.file2list("strings/names/cargorilla.txt")) GLOBAL_LIST_INIT(guardian_first_names, world.file2list("strings/names/guardian_descriptions.txt")) diff --git a/code/datums/id_trim/outfits.dm b/code/datums/id_trim/outfits.dm index 2e7aebff26a1b..a2944a469f43e 100644 --- a/code/datums/id_trim/outfits.dm +++ b/code/datums/id_trim/outfits.dm @@ -62,6 +62,7 @@ trim_state = "trim_bitavatar" department_color = COLOR_BLACK subdepartment_color = COLOR_GREEN + sechud_icon_state = SECHUD_BITAVATAR /// Trim for cyber police in the Virtual Domain. /datum/id_trim/cyber_police diff --git a/code/modules/bitrunning/components/avatar_connection.dm b/code/modules/bitrunning/components/avatar_connection.dm index b533e2b5661d6..a92e8ef3d2e6e 100644 --- a/code/modules/bitrunning/components/avatar_connection.dm +++ b/code/modules/bitrunning/components/avatar_connection.dm @@ -60,9 +60,16 @@ var/datum/action/avatar_domain_info/action = new(help_datum) action.Grant(avatar) + var/client/our_client = old_body.client + var/alias = our_client?.prefs?.read_preference(/datum/preference/name/hacker_alias) || pick(GLOB.hacker_aliases) + + if(alias && avatar.real_name != alias) + avatar.fully_replace_character_name(avatar.real_name, alias) + avatar.playsound_local(avatar, 'sound/magic/blink.ogg', 25, TRUE) avatar.set_static_vision(2 SECONDS) - avatar.set_temp_blindness(1 SECONDS) + avatar.set_temp_blindness(1 SECONDS) // I'm in + /datum/component/avatar_connection/PostTransfer() var/obj/machinery/netpod/pod = netpod_ref?.resolve() @@ -74,6 +81,7 @@ pod.avatar_ref = WEAKREF(parent) + /datum/component/avatar_connection/RegisterWithParent() ADD_TRAIT(parent, TRAIT_TEMPORARY_BODY, REF(src)) /** @@ -87,6 +95,7 @@ RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(on_sever_connection)) RegisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_linked_damage)) + /datum/component/avatar_connection/UnregisterFromParent() REMOVE_TRAIT(parent, TRAIT_TEMPORARY_BODY, REF(src)) UnregisterSignal(parent, list( @@ -98,6 +107,7 @@ COMSIG_MOB_APPLY_DAMAGE, )) + /// Disconnects the avatar and returns the mind to the old_body. /datum/component/avatar_connection/proc/full_avatar_disconnect(cause_damage = FALSE, datum/source) #ifndef UNIT_TESTS @@ -115,6 +125,7 @@ qdel(src) + /// Triggers whenever the server gets a loot crate pushed to goal area /datum/component/avatar_connection/proc/on_domain_completed(datum/source, atom/entered) SIGNAL_HANDLER @@ -127,6 +138,7 @@ new_master = entered, ) + /// Transfers damage from the avatar to the old_body /datum/component/avatar_connection/proc/on_linked_damage(datum/source, damage, damage_type, def_zone, blocked, ...) SIGNAL_HANDLER @@ -147,6 +159,7 @@ if(old_body.stat > SOFT_CRIT) // KO! full_avatar_disconnect(cause_damage = TRUE) + /// Handles minds being swapped around in subsequent avatars /datum/component/avatar_connection/proc/on_mind_transfer(datum/mind/source, mob/living/previous_body) SIGNAL_HANDLER @@ -157,6 +170,7 @@ source.current.TakeComponent(src) + /// Triggers when someone starts prying open our netpod /datum/component/avatar_connection/proc/on_netpod_crowbar(datum/source, mob/living/intruder) SIGNAL_HANDLER @@ -171,6 +185,7 @@ alert.name = "Netpod Breached" alert.desc = "Someone is prying open the netpod. Find an exit." + /// Triggers when the netpod is taking damage and is under 50% /datum/component/avatar_connection/proc/on_netpod_damaged(datum/source) SIGNAL_HANDLER @@ -184,24 +199,28 @@ alert.name = "Integrity Compromised" alert.desc = "The netpod is damaged. Find an exit." + //if your bitrunning avatar somehow manages to acquire and consume a red pill, they will be ejected from the Matrix /datum/component/avatar_connection/proc/disconnect_if_red_pill(datum/source, obj/item/reagent_containers/pill/pill, mob/feeder) SIGNAL_HANDLER if(pill.icon_state == "pill4") full_avatar_disconnect() + /// Triggers when a safe disconnect is called /datum/component/avatar_connection/proc/on_safe_disconnect(datum/source) SIGNAL_HANDLER full_avatar_disconnect() + /// Received message to sever connection /datum/component/avatar_connection/proc/on_sever_connection(datum/source) SIGNAL_HANDLER full_avatar_disconnect(cause_damage = TRUE, source = source) + /// Triggers when the server is shutting down /datum/component/avatar_connection/proc/on_shutting_down(datum/source, mob/living/hackerman) SIGNAL_HANDLER @@ -216,6 +235,7 @@ alert.name = "Domain Rebooting" alert.desc = "The domain is rebooting. Find an exit." + /// Triggers whenever an antag steps onto an exit turf and the server is emagged /datum/component/avatar_connection/proc/on_station_spawn(datum/source) SIGNAL_HANDLER @@ -230,6 +250,7 @@ alert.name = "Security Breach" alert.desc = "A hostile entity is breaching the safehouse. Find an exit." + /// Server has spawned a ghost role threat /datum/component/avatar_connection/proc/on_threat_created(datum/source) SIGNAL_HANDLER @@ -243,6 +264,7 @@ alert.name = "Threat Detected" alert.desc = "Data stream abnormalities present." + /// Returns the mind to the old body /datum/component/avatar_connection/proc/return_to_old_body() var/datum/mind/old_mind = old_mind_ref?.resolve() diff --git a/code/modules/bitrunning/server/obj_generation.dm b/code/modules/bitrunning/server/obj_generation.dm index e8dbd72228c1d..34a870a3426d5 100644 --- a/code/modules/bitrunning/server/obj_generation.dm +++ b/code/modules/bitrunning/server/obj_generation.dm @@ -76,9 +76,6 @@ var/obj/item/card/id/outfit_id = avatar.wear_id if(outfit_id) - outfit_id.assignment = "Bit Avatar" - outfit_id.registered_name = avatar.real_name - outfit_id.registered_account = new() outfit_id.registered_account.replaceable = FALSE diff --git a/code/modules/client/preferences/names.dm b/code/modules/client/preferences/names.dm index 9afc8da18c1aa..8456eb9a62709 100644 --- a/code/modules/client/preferences/names.dm +++ b/code/modules/client/preferences/names.dm @@ -174,3 +174,15 @@ return TRUE return FALSE + + +/// The name to use while bitrunning +/datum/preference/name/hacker_alias + explanation = "Hacker alias" + group = "bitrunning" + savefile_key = "hacker_alias" + allow_numbers = TRUE + relevant_job = /datum/job/bitrunner + +/datum/preference/name/hacker_alias/create_default_value() + return pick(GLOB.hacker_aliases) diff --git a/icons/mob/huds/hud.dmi b/icons/mob/huds/hud.dmi index a3bbdf2ede075bf1d15aaf868a7505413d65787b..086e886bab7b29d06045dd90e7d4db2a8bc758c7 100644 GIT binary patch delta 8763 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 aIY0|Js>NVu%qk4}*q=OoqSVUw-v0uM-8|6% delta 8765 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 diff --git a/strings/names/hackers.txt b/strings/names/hackers.txt new file mode 100644 index 0000000000000..e2722fb09fd21 --- /dev/null +++ b/strings/names/hackers.txt @@ -0,0 +1,46 @@ +Ne0Phyte +CipherX +Gh0stWire +L33tByt3 +Vortex9 +Syn4pse +DarkMatt3r +QuantumDr1ft +Crash0verr1de +Z3r0C00l +NyxShad0w +Gl1tchR3aper +CryptoWra1th +Raz0rEdge +VoidWalk3r +Neur0mancer +EchoH3xx +DataSt0rm +CyberS1ren +Rogu3Protocol +Nexu5Prim3 +CircuitBr3aker +EnigmaPulse +PhantomBit +FluxC4pac1tor +OmegaC0dec +Ne0nRon1n +Senpa1Sw1pe +MechaM0chii +SakuraSn1per +WaifuWarri0r +KatanaKid99 +xXDarkL0rd69Xx +H4xx0rNinja +CyberNinja1337 +Ub3r1337Sk1llz +PhrEaK420 +IRCWizard69 +EliteWar3zKing +Y2KPwn3r +BBSPh34r +BlackWill0w69 +2038Pr0blem +Sp4ceW1nd +B0bbyT4bles +C0deInjector diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx index 91502644faade..24aab8eba74bc 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx @@ -15,7 +15,7 @@ type ContentSection = { /** * The primary content display for points of interest. - * Renders a scrollable section replete collapsibles for each + * Renders a scrollable section replete with collapsibles for each * observable group. */ export function OrbitContent(props) { From e180cdcd41573f861122547887db2ef65a0fbbd1 Mon Sep 17 00:00:00 2001 From: hyperjll <105099113+hyperjll@users.noreply.github.com> Date: Tue, 25 Jun 2024 00:26:47 -0400 Subject: [PATCH 18/25] Slime Nutrition Minimization (#84278) Substantially decreases the nutrition needed or otherwise held by slimes without altering their hunger too drastically. This results in: Roughly 3x Monkey Efficiency (A single monkey can cause one slime to become an adult, split, then become an adult again), Faster slime growth and splitting (especially when the server is lagging and the slimes take MINUTES to eat a single monkey), and a more accessible xenobiology for midgame/lategame interaction. Tested this in-game, and by god does it feel so much better. ## About The Pull Request Recently got back into xenobiology and quickly learned why i stopped. As fun and (often) powerful as xenobiology can be, it's almost never seen because xenobiology TAKES WAY TO FUCKING LONG TO ACHIEVE WHAT YOU WANT. For example, in my most recent round i wanted the following: Green Slimes (For lumi species), Bluespace Slimes (For stabilized bluespace extract, and bluespace extract for the lumi specie), and a stabilized purple extract. Wanna know how long that took? A little over an hour! How's anyone supposed to use xenobiology until late into the round when the shuttle is likely about to be called? This is unfortunately due to two noteable factors: RNG and Lag. Sometimes the RNG just won't give you what you want and it'll take 30 minutes to get one slime color, sometimes 5 minutes. (Looking at YOU, virology.) Sometimes it's thirty minutes in on a 70 pop, and the server is chugging so badly that the slime AI slows to a crawl and it takes 10 minutes for a single slime to become an adult. ## Why It's Good For The Game Altering the nutrition actually makes Xenobiology MUCH faster now that slimes hardly have to eat a monkey to death, unlatch, latch onto another monkey, eat it till it dies, THEN split. The RNG if it's unfavorable to the player can actually be reasonably bruteforced by mass slime+monkey action, and the less actions required on the slime AI's part to make progress will be surely appreciated when the server begins chugging. Additionally, this makes xenobiology relatively viable atleast for midround interaction, as farming up some slime cores doesn't practically require roundstart investment to get anywhere at all. Finally, most maps have one-or-two monkey cube boxes to start, which isn't a whole lot and the first thing i do as an experienced xenobiologist is grind up grays and inject my own blood to effectively triple my monkey cubes. Saving me time and likely any new xenobiologists a LOT of wiki reading on 'how to xenobio effectively'. ## Changelog :cl: balance: Thanks to incredible strides in selective slime breeding, slimes require substantially less nutrients to grow into adults, and split into children. /:cl: --- code/__DEFINES/mobs.dm | 2 +- code/__DEFINES/research/slimes.dm | 10 +++++----- code/modules/mob/living/basic/slime/life.dm | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index b8acef70a0648..f1a48df79faee 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -309,7 +309,7 @@ #define SLIME_EVOLUTION_THRESHOLD 10 //Slime evolution cost in nutrition -#define SLIME_EVOLUTION_COST 200 +#define SLIME_EVOLUTION_COST 100 //Slime extract crossing. Controls how many extracts is required to feed to a slime to core-cross. #define SLIME_EXTRACT_CROSSING_REQUIRED 10 diff --git a/code/__DEFINES/research/slimes.dm b/code/__DEFINES/research/slimes.dm index e03c6af8f581d..03671ee24d2a0 100644 --- a/code/__DEFINES/research/slimes.dm +++ b/code/__DEFINES/research/slimes.dm @@ -11,15 +11,15 @@ #define SLIME_MAX_POWER 10 ///The maximum amount of nutrition a slime can contain -#define SLIME_MAX_NUTRITION 1000 +#define SLIME_MAX_NUTRITION 200 ///The starting nutrition of a slime -#define SLIME_STARTING_NUTRITION 700 +#define SLIME_STARTING_NUTRITION 100 /// Above it we grow our amount_grown and our power_level, below it we can eat -#define SLIME_GROW_NUTRITION 800 +#define SLIME_GROW_NUTRITION 150 /// Below this, we feel hungry -#define SLIME_HUNGER_NUTRITION 500 +#define SLIME_HUNGER_NUTRITION 50 /// Below this, we feel starving -#define SLIME_STARVE_NUTRITION 200 +#define SLIME_STARVE_NUTRITION 10 ///The slime is not hungry. It might try to feed anyways. #define SLIME_HUNGER_NONE 0 diff --git a/code/modules/mob/living/basic/slime/life.dm b/code/modules/mob/living/basic/slime/life.dm index 68cd33ce7750b..d101b48fea7a1 100644 --- a/code/modules/mob/living/basic/slime/life.dm +++ b/code/modules/mob/living/basic/slime/life.dm @@ -36,10 +36,10 @@ ///Handles the consumption of nutrition, and growth /mob/living/basic/slime/proc/handle_nutrition(seconds_per_tick = SSMOBS_DT) if(hunger_disabled) //God as my witness, I will never go hungry again - set_nutrition(700) + set_nutrition(100) return - if(SPT_PROB(7.5, seconds_per_tick)) + if(SPT_PROB(1.25, seconds_per_tick)) adjust_nutrition((life_stage == SLIME_LIFE_STAGE_ADULT ? -1 : -0.5) * seconds_per_tick) if(nutrition < SLIME_STARVE_NUTRITION) @@ -63,7 +63,7 @@ if (SLIME_GROW_NUTRITION <= nutrition) if(amount_grown < SLIME_EVOLUTION_THRESHOLD) - adjust_nutrition(-10 * seconds_per_tick) + adjust_nutrition(-2.5 * seconds_per_tick) amount_grown++ if(powerlevel < SLIME_MAX_POWER && SPT_PROB(30-powerlevel*2, seconds_per_tick)) From c46edf802896a224326de741a1bcd020c1f529c6 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:31:43 +1200 Subject: [PATCH 19/25] Automatic changelog for PR #84279 [ci skip] --- html/changelogs/AutoChangeLog-pr-84279.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84279.yml diff --git a/html/changelogs/AutoChangeLog-pr-84279.yml b/html/changelogs/AutoChangeLog-pr-84279.yml new file mode 100644 index 0000000000000..9fcd48259c7bb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84279.yml @@ -0,0 +1,5 @@ +author: "jlsnow301" +delete-after: True +changes: + - rscadd: "Bitrunning: You can now choose your hacker alias in prefs." + - rscadd: "Bit avatars get orbit icons." \ No newline at end of file From ca6857cff69c6b14ffa16a0c5d9d88fbd86a1b1e Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:31:59 +1200 Subject: [PATCH 20/25] Automatic changelog for PR #84278 [ci skip] --- html/changelogs/AutoChangeLog-pr-84278.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84278.yml diff --git a/html/changelogs/AutoChangeLog-pr-84278.yml b/html/changelogs/AutoChangeLog-pr-84278.yml new file mode 100644 index 0000000000000..e29caa1b8963f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84278.yml @@ -0,0 +1,4 @@ +author: "hyperjll" +delete-after: True +changes: + - balance: "Thanks to incredible strides in selective slime breeding, slimes require substantially less nutrients to grow into adults, and split into children." \ No newline at end of file From 4a9b6804b0a2a783682fb9a5ee3fa4f19ede7a93 Mon Sep 17 00:00:00 2001 From: FlufflesTheDog Date: Mon, 24 Jun 2024 21:34:17 -0700 Subject: [PATCH 21/25] fix tile/rod/rcd multi-z hole repairs (#84255) ## About The Pull Request Fixes some interactions with attempting to patch multi-z holes. 1. openspace clicks happen on different z levels, so it's inherently a *ranged* interaction- it was being ignored due to using the non ranged signal 2. RCD was lacking the open space click handler, 3. #77540 still exists to a degree, I've refactored the click handler to use parse_caught_click_modifiers to always grab the tile you're aiming at rather than going off of whatever item you happened to click on 4. handle_openspace_click was treating the modifiers list as the old parameters list ## Why It's Good For The Game fix bugs, being able to repair holes is a very important and time sensitive task that needs to flow well, and not require pixel hunting ## Changelog :cl: fix: multi-z hole repair works better, especially when the turf below is blocked by items /:cl: --- code/datums/components/trapdoor.dm | 4 ++-- .../elements/openspace_item_click_handler.dm | 17 +++++++---------- code/game/objects/items.dm | 2 +- code/game/objects/items/holosign_creator.dm | 4 ++-- code/game/objects/items/rcd/RCD.dm | 4 ++++ code/game/objects/items/stacks/rods.dm | 4 ++-- .../objects/items/stacks/tiles/tile_types.dm | 4 ++-- 7 files changed, 20 insertions(+), 19 deletions(-) diff --git a/code/datums/components/trapdoor.dm b/code/datums/components/trapdoor.dm index f76dcf35e705a..32b72c48853e5 100644 --- a/code/datums/components/trapdoor.dm +++ b/code/datums/components/trapdoor.dm @@ -349,8 +349,8 @@ . = ..() AddElement(/datum/element/openspace_item_click_handler) -/obj/item/trapdoor_kit/handle_openspace_click(turf/target, mob/user, click_parameters) - interact_with_atom(target, user, click_parameters) +/obj/item/trapdoor_kit/handle_openspace_click(turf/target, mob/user, list/modifiers) + interact_with_atom(target, user, modifiers) /obj/item/trapdoor_kit/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) var/turf/target_turf = get_turf(interacting_with) diff --git a/code/datums/elements/openspace_item_click_handler.dm b/code/datums/elements/openspace_item_click_handler.dm index f34bd0f0bda1f..9059223fb0c35 100644 --- a/code/datums/elements/openspace_item_click_handler.dm +++ b/code/datums/elements/openspace_item_click_handler.dm @@ -8,22 +8,19 @@ . = ..() if(!isitem(target)) return ELEMENT_INCOMPATIBLE - RegisterSignal(target, COMSIG_ITEM_INTERACTING_WITH_ATOM, PROC_REF(divert_interaction)) + RegisterSignal(target, COMSIG_RANGED_ITEM_INTERACTING_WITH_ATOM, PROC_REF(divert_interaction)) /datum/element/openspace_item_click_handler/Detach(datum/source) - UnregisterSignal(source, COMSIG_ITEM_INTERACTING_WITH_ATOM) + UnregisterSignal(source, COMSIG_RANGED_ITEM_INTERACTING_WITH_ATOM) return ..() //Invokes the proctype with a turf above as target. -/datum/element/openspace_item_click_handler/proc/divert_interaction(obj/item/source, mob/user, atom/target, click_parameters) +/datum/element/openspace_item_click_handler/proc/divert_interaction(obj/item/source, mob/user, atom/target, list/modifiers) SIGNAL_HANDLER if((target.z == 0) || (user.z == 0) || target.z == user.z) return NONE - var/turf/checked_turf = get_turf(target) - while(!isnull(checked_turf)) - checked_turf = GET_TURF_ABOVE(checked_turf) - if(checked_turf?.z == user.z && user.CanReach(checked_turf, source)) - INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, handle_openspace_click), checked_turf, user, click_parameters) - return ITEM_INTERACT_BLOCKING - + var/turf/target_turf = parse_caught_click_modifiers(modifiers, get_turf(user.client?.eye || user), user.client) + if(target_turf?.z == user.z && user.CanReach(target_turf, source)) + INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, handle_openspace_click), target_turf, user, modifiers) + return ITEM_INTERACT_BLOCKING return NONE diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 79dd9d7e6ed05..6a63488d4cb8e 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1426,7 +1426,7 @@ mob_loc.update_clothing(slot_flags) /// Called on [/datum/element/openspace_item_click_handler/proc/on_afterattack]. Check the relative file for information. -/obj/item/proc/handle_openspace_click(turf/target, mob/user, click_parameters) +/obj/item/proc/handle_openspace_click(turf/target, mob/user, list/modifiers) stack_trace("Undefined handle_openspace_click() behaviour. Ascertain the openspace_item_click_handler element has been attached to the right item and that its proc override doesn't call parent.") /** diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index ff4d0260c4f35..926131151e92b 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -26,8 +26,8 @@ AddElement(/datum/element/openspace_item_click_handler) RegisterSignal(src, COMSIG_OBJ_PAINTED, TYPE_PROC_REF(/obj/item/holosign_creator, on_color_change)) -/obj/item/holosign_creator/handle_openspace_click(turf/target, mob/user, click_parameters) - interact_with_atom(target, user, click_parameters) +/obj/item/holosign_creator/handle_openspace_click(turf/target, mob/user, list/modifiers) + interact_with_atom(target, user, modifiers) /obj/item/holosign_creator/examine(mob/user) . = ..() diff --git a/code/game/objects/items/rcd/RCD.dm b/code/game/objects/items/rcd/RCD.dm index 2a7611235310c..cf254e447818d 100644 --- a/code/game/objects/items/rcd/RCD.dm +++ b/code/game/objects/items/rcd/RCD.dm @@ -70,6 +70,7 @@ construction_mode = mode GLOB.rcd_list += src + AddElement(/datum/element/openspace_item_click_handler) /obj/item/construction/rcd/Destroy() QDEL_NULL(airlock_electronics) @@ -420,6 +421,9 @@ rcd_create(interacting_with, user) return ITEM_INTERACT_SUCCESS +/obj/item/construction/rcd/handle_openspace_click(turf/target, mob/user, list/modifiers) + interact_with_atom(target, user, modifiers) + /obj/item/construction/rcd/proc/detonate_pulse() audible_message("[src] begins to vibrate and \ buzz loudly!","[src] begins \ diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 6011e0b396159..82f19d09d9692 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -63,8 +63,8 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ slapcraft_recipes = slapcraft_recipe_list,\ ) -/obj/item/stack/rods/handle_openspace_click(turf/target, mob/user, click_parameters) - target.attackby(src, user, click_parameters) +/obj/item/stack/rods/handle_openspace_click(turf/target, mob/user, list/modifiers) + target.attackby(src, user, list2params(modifiers)) /obj/item/stack/rods/get_main_recipes() . = ..() diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 700116ac1e18f..073a35ed1013c 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -101,8 +101,8 @@ playsound(target_plating, 'sound/weapons/genhit.ogg', 50, TRUE) return target_plating -/obj/item/stack/tile/handle_openspace_click(turf/target, mob/user, click_parameters) - target.attackby(src, user, click_parameters) +/obj/item/stack/tile/handle_openspace_click(turf/target, mob/user, list/modifiers) + target.attackby(src, user, list2params(modifiers)) //Grass /obj/item/stack/tile/grass From c3d29e8a3dc0809a7818c3e7e106a304b7790066 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:34:51 +1200 Subject: [PATCH 22/25] Automatic changelog for PR #84255 [ci skip] --- html/changelogs/AutoChangeLog-pr-84255.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84255.yml diff --git a/html/changelogs/AutoChangeLog-pr-84255.yml b/html/changelogs/AutoChangeLog-pr-84255.yml new file mode 100644 index 0000000000000..95d0dd0b54f27 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84255.yml @@ -0,0 +1,4 @@ +author: "FlufflesTheDog" +delete-after: True +changes: + - bugfix: "multi-z hole repair works better, especially when the turf below is blocked by items" \ No newline at end of file From 9d3ad2b7a679bf17f573cf462fdc2b0185cf770f Mon Sep 17 00:00:00 2001 From: NewyearnewmeUwu <70115628+NewyearnewmeUwu@users.noreply.github.com> Date: Tue, 25 Jun 2024 04:11:50 -0700 Subject: [PATCH 23/25] Adds a means to clean up multiple monkey bodies using the xenobio console. (#83810) ## About The Pull Request This adds a functionality to the 'feed slimes' ctrl-click action for the xenobio console. Before placing a monkey, it checks for dead and therefore recycleable monkies, and then calls the proc to recycle said monkeys. It will also not place a monkey if it clears dead monkeys, meaning you can avoid adding more monkeys if you want to empty the pen. ## Why It's Good For The Game Pixel hunting for dead monkeys is just dogshit and this is way better. It's so easy to accidentally place monkeys while trying to clear ONE dead monkey. ## Changelog :cl: qol: The xenobio console's monkey placing command also clears dead monkeys on the tile. /:cl: --------- Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com> --- code/modules/research/xenobiology/xenobio_camera.dm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index ea4ef0e9b7ed1..5dbe284026d59 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -426,13 +426,20 @@ Due to keyboard shortcuts, the second one is not necessarily the remote eye's lo if(!isopenturf(target_turf)) return + var/cleanup = FALSE var/mob/camera/ai_eye/remote/xenobio/remote_eye = user.remote_control var/obj/machinery/computer/camera_advanced/xenobio/xeno_console = remote_eye.origin if(!xeno_console.validate_area(user, remote_eye, target_turf)) return - xeno_console.feed_slime(user, target_turf) + for(var/mob/monkey in target_turf) + if(ismonkey(monkey) && monkey.stat == DEAD) + cleanup = TRUE + xeno_console.monkey_recycle(user, monkey) + + if(!cleanup) + xeno_console.feed_slime(user, target_turf) ///Picks up a dead monkey for recycling /obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/human/target_mob) From 4a9579dc1cf68b8a8e3d9ecdcd549613e3f632ec Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 25 Jun 2024 23:12:13 +1200 Subject: [PATCH 24/25] Automatic changelog for PR #83810 [ci skip] --- html/changelogs/AutoChangeLog-pr-83810.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-83810.yml diff --git a/html/changelogs/AutoChangeLog-pr-83810.yml b/html/changelogs/AutoChangeLog-pr-83810.yml new file mode 100644 index 0000000000000..7ad0ea2812cd5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83810.yml @@ -0,0 +1,4 @@ +author: "NewyearnewmeUwu" +delete-after: True +changes: + - qol: " The xenobio console's monkey placing command also clears dead monkeys on the tile." \ No newline at end of file From 6fd82c8271649fe3131e09d33699b0df8a6cf3ce Mon Sep 17 00:00:00 2001 From: Paxilmaniac Date: Tue, 25 Jun 2024 10:33:39 -0400 Subject: [PATCH 25/25] fixes codeowners --- .github/CODEOWNERS | 219 --------------------------------------------- 1 file changed, 219 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 915dda724d53c..104b108bb9ccb 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -3,222 +3,3 @@ # This list is alphabetized by User -> Filename and separated into sections for Maintainers/Contributors KEEP IT THAT WAY # In the event that people are to be informed of changes # to the same file or dir, add them to the end of under Multiple Owners - -# MAINTAINERS - -# Dominion/Cyberboss - -/.github/workflows/update_tgs_dmapi.yml @Cyberboss -/.tgs.yml @Cyberboss -/code/world.dm @Cyberboss -/code/__DEFINES/tgs.config.dm @Cyberboss -/code/__DEFINES/tgs.dm @Cyberboss -/code/__DEFINES/_globals.dm @Cyberboss -/code/__HELPERS/chat.dm @Cyberboss -/code/__HELPERS/jatum.dm @Cyberboss -/code/game/world.dm @Cyberboss -/code/controllers/subsystem/atoms.dm @Cyberboss -/code/controllers/globals.dm @Cyberboss -/code/datums/helper_datums/getrev.dm @Cyberboss -/code/modules/tgs/ @Cyberboss -/code/ze_genesis_call/ @Cyberboss -/tools/tgs_test/ @Cyberboss - -# Cobby - -/code/modules/reagents/ @ExcessiveUseOfCobblestone -/code/modules/research/designs/medical_designs.dm @ExcessiveUseOfCobblestone -/code/game/objects/items/storage/medkit.dm @ExcessiveUseOfCobblestone - -# Fikou - -/code/modules/awaymissions/ @Fikou -/code/modules/mining/ @Fikou -/code/modules/mod/ @Fikou -/code/modules/mapfluff/ruins/lavalandruin_code/ @Fikou -/code/modules/mapfluff/ruins/lavaland_ruin_code.dm @Fikou - -# JohnFulpWizard - -/code/modules/mob/living/simple_animal/bot/ @JohnFulpWillard -/code/modules/modular_computers/ @JohnFulpWillard - -# Kylerace - -/code/__DEFINES/spatial_gridmap.dm @Kylerace -/code/controllers/subsystem/spatial_gridmap.dm @Kylerace - -# LemonInTheDark - -/.github/guides/VISUALS.md @LemonInTheDark -/code/_onclick/hud/ @LemonInTheDark -/code/__DEFINES/layers.dm @LemonInTheDark - -# Mothblocks - -/.github/workflows/ @Mothblocks -/code/game/gamemodes/ @Mothblocks -/code/modules/autowiki/ @Mothblocks -/code/modules/unit_tests/ @Mothblocks -/code/modules/client/preferences/ @Mothblocks -/code/modules/client/preferences_menu.dm @Mothblocks -/tgui/packages/tgui/interfaces/PreferencesMenu/ @Mothblocks -/tools/ezdb/ @Mothblocks -/tools/maplint/source/ @Mothblocks -/tools/pull_request_hooks/ @Mothblocks -/tools/screenshot-test-comparison/ @Mothblocks -/tools/test_merge_bot/ @Mothblocks - -# MrMelbert - -/code/modules/hydroponics/ @MrMelbert - -# ninjanomnom - -/code/controllers/subsystem/dcs.dm @ninjanomnom -/code/datums/signals.dm @ninjanomnom -/code/datums/components/_component.dm @ninjanomnom -/code/datums/elements/_element.dm @ninjanomnom -/code/datums/greyscale/_greyscale_config.dm @ninjanomnom -/code/datums/greyscale/json_reader.dm @ninjanomnom -/code/datums/greyscale/layer.dm @ninjanomnom - -# Ryll-Ryll/Shaps - -/code/datums/wounds/ @Ryll-Ryll -/code/datums/status_effects/wound_effects.dm @Ryll-Ryll -/code/__DEFINES/wounds.dm @Ryll-Ryll - -# san7890 - -/code/game/area/ @san7890 -/icons/area/ @san7890 - -# stylemistake - -/code/__DEFINES/chat.dm @stylemistake -/code/__DEFINES/tgui.dm @stylemistake -/code/controllers/subsystem/chat.dm @stylemistake -/code/controllers/subsystem/ping.dm @stylemistake -/code/controllers/subsystem/tgui.dm @stylemistake -/code/modules/tgchat/ @stylemistake -/code/modules/tgui/ @stylemistake -/code/modules/tgui_panel/ @stylemistake -/tgui/ @stylemistake - -# stylemistake (explicitly disowned) - -/tgui/packages/tgui/interfaces/ -/tgui/packages/tgui/styles/interfaces/ -/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss -/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss - -# SuperNovaa41 - -/code/modules/forensics/ @SuperNovaa41 -/code/datums/mood.dm @SuperNovaa41 - -# Time-Green - -/code/modules/plumbing/ @Time-Green -/code/modules/surgery/organs/external/ @Time-Green - -# tralezab -/code/__DEFINES/basic_mobs.dm @tralezab -/code/datums/ai/ @tralezab -/code/modules/religion/ @tralezab - -# Watermelon914 - -/code/modules/wiremod/ @Watermelon914 -/code/modules/antagonists/traitor/ @Watermelon914 -/code/controllers/subsystem/tts.dm @Watermelon914 - -# ZephyrTFA - -/code/__HELPERS/admin_verb.dm @ZephyrTFA -/code/controllers/subsystem/admin_verbs.dm @ZephyrTFA -/code/datums/json_savefile.dm @ZephyrTFA -/code/datums/armor/ @ZephyrTFA -/code/modules/admin/verbs/ @ZephyrTFA -/code/modules/logging/ @ZephyrTFA -/tools/ci/check_grep.sh @ZephyrTFA - - -# CONTRIBUTORS - -# Jordie0608 - -/code/controllers/subsystem/dbcore.dm @Jordie0608 -/tools/SQLAlertEmail/ @Jordie0608 - -# Kapu1178 - -/code/modules/surgery/bodyparts/ @Kapu1178 -/code/modules/surgery/organs/ @Kapu1178 -/code/modules/mob/living/carbon/carbon_update_icons.dm @Kapu1178 -/code/modules/mob/living/carbon/human/human_update_icons.dm @Kapu1178 - -# MrStonedOne - -/code/__DEFINES/MC.dm @MrStonedOne -/code/controllers/admin.dm @MrStonedOne -/code/controllers/master.dm @MrStonedOne -/code/controllers/failsafe.dm @MrStonedOne -/code/controllers/subsystem.dm @MrStonedOne -/code/controllers/subsystem/timer.dm @MrStonedOne -/code/controllers/configuration/entries @MrStonedOne -/config/ @MrStonedOne - -# NamelessFairy - -/code/modules/capture_the_flag/ @NamelessFairy -/_maps/map_files/CTF/ @NamelessFairy - -# Pickle-Coding - -/code/__DEFINES/atmospherics/ @Pickle-Coding -/code/__DEFINES/reactions.dm @Pickle-Coding -/code/modules/atmospherics/ @Pickle-Coding -/code/modules/power/ @Pickle-Coding - -# MULTIPLE OWNERS - -/SQL/ @Jordie0608 @MrStonedOne - -/_maps/ @EOBGames @Maurukas @MMMiracles @san7890 @ShizCalev - -/icons/ @Imaginos16 @Krysonism @Twaticus @Wallemations -/icons/ass/ @Ghilker @tralezab - -/code/__DEFINES/atmospherics/ @Ghilker @LemonInTheDark - -/code/__HELPERS/logging/ @dragomagol @ZephyrTFA - -/code/controllers/subsystem/air.dm @LemonInTheDark @MrStonedOne - -/code/modules/atmospherics/ @Ghilker @LemonInTheDark - -/code/modules/client/preferences.dm @Mothblocks @ZephyrTFA -/code/modules/client/preferences_savefile.dm @Mothblocks @ZephyrTFA - -/code/modules/jobs/job_types/chief_medical_officer.dm @ExcessiveUseOfCobblestone @Ryll-Ryll -/code/modules/jobs/job_types/medical_doctor.dm @ExcessiveUseOfCobblestone @Ryll-Ryll -/code/modules/jobs/job_types/paramedic.dm @ExcessiveUseOfCobblestone @Ryll-Ryll - -/code/modules/mob/living/basic/ @Jacquerel @san7890 @tralezab - -/code/modules/surgery/ @ExcessiveUseOfCobblestone @Ryll-Ryll - -/tools/build/ @MrStonedOne @stylemistake -/tools/tgs_scripts/ @Cyberboss @MrStonedOne - -/tools/WebhookProcessor/ @BraveMole @TiviPlus - -# Expensive files that touching basically always cause performance problems -## Init times -**/*_EXPENSIVE.dm @Mothblocks @LemonInTheDark - -# SIC SEMPER TYRANNIS - -/code/modules/hydroponics/grown/citrus.dm @optimumtact