From d26452bb9a846091214ced880c5d7a34a6b61048 Mon Sep 17 00:00:00 2001 From: Unknownity <83834638+Unknownity@users.noreply.github.com> Date: Thu, 13 Jul 2023 11:56:45 +0200 Subject: [PATCH] Burrower burrow changes and fixes (#3818) # About the pull request The PR contains mostly fixes for the Burrower that have been around, that being that other xenos could slash them while they were burrowed, that they could resist (and get rid of fire) while burrowed, that they still took shrapnel and direct flame damage while burrowed, that SG autofire and sentries were shooting at a burrowed burrower, wasting ammo in the process. Two other notable changes are that the unburrow stun now also works on other non-friendly xenomorphs (and it works on all of them, skill issue if you manage to get stunned from that as a T3/Queen) and that burrowing and unburrowing now has sounds (a change many people were positive about when it was initially included in the Impaler PR) which may find tracking and noticing the presence of burrowers easier. burrowing sound: https://voca.ro/1dQ0pvBMidsr unburrowing sound: https://vocaroo.com/1zzEz3NQ2Kx5 # Explain why it's good for the game Bugfixes and a counter to one of the most annoying abilities (that people consider) in the game. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Unknownity fix: Fixed burrowed mobs being able to be targeted by sentries, mines and SG autofire. fix: Fixed burrowed mobs being able to grab mobs on the surface. fix: Fixed burrowed mobs being able to resist while burrowed. fix: Fixed burrowers taking damage from direct flame and shrapnel from explosions. fix: Fixed burrowers being able to get slashed from enemy Xenos on the surface. fix: Fixed burrowers unburrow stun to now properly target and stun enemy Xenos. soundadd: Added sounds for the Burrower when they are burrowing and unburrowing. /:cl: Co-authored-by: Unknownity --- code/__DEFINES/traits.dm | 5 +++- code/game/objects/items/explosives/mine.dm | 2 ++ code/modules/defenses/sentry.dm | 2 +- .../living/carbon/xenomorph/XenoAttacks.dm | 3 +++ .../mob/living/carbon/xenomorph/Xenomorph.dm | 2 ++ .../abilities/burrower/burrower_powers.dm | 25 +++++++++++++----- code/modules/mob/living/living_verbs.dm | 6 +++++ sound/effects/burrowing_b.ogg | Bin 0 -> 8146 bytes sound/effects/burrowoff.ogg | Bin 0 -> 10718 bytes 9 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 sound/effects/burrowing_b.ogg create mode 100644 sound/effects/burrowoff.ogg diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 4897a04fea82..288604434e34 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -181,6 +181,8 @@ #define TRAIT_ABILITY_NO_PLASMA_TRANSFER "t_ability_no_plasma_transfer" /// Shows that the xeno queen is on ovi #define TRAIT_ABILITY_OVIPOSITOR "t_ability_ovipositor" +/// Used for burrowed mobs, prevent's SG/sentrys/claymores from autofiring +#define TRAIT_ABILITY_BURROWED "t_ability_burrowed" //-- item traits -- // TOOL TRAITS @@ -233,7 +235,8 @@ GLOBAL_LIST_INIT(mob_traits, list( TRAIT_TWOBORE_TRAINING, TRAIT_LEADERSHIP, TRAIT_DEXTROUS, - TRAIT_REAGENT_SCANNER + TRAIT_REAGENT_SCANNER, + TRAIT_ABILITY_BURROWED )) /* diff --git a/code/game/objects/items/explosives/mine.dm b/code/game/objects/items/explosives/mine.dm index 6b8c9bccd299..742a5f314c4a 100644 --- a/code/game/objects/items/explosives/mine.dm +++ b/code/game/objects/items/explosives/mine.dm @@ -198,6 +198,8 @@ return if(L.get_target_lock(iff_signal) || isrobot(L)) return + if(HAS_TRAIT(L, TRAIT_ABILITY_BURROWED)) + return L.visible_message(SPAN_DANGER("[icon2html(src, viewers(src))] The [name] clicks as [L] moves in front of it."), \ SPAN_DANGER("[icon2html(src, L)] The [name] clicks as you move in front of it."), \ SPAN_DANGER("You hear a click.")) diff --git a/code/modules/defenses/sentry.dm b/code/modules/defenses/sentry.dm index 946c347efaa0..fc52c254c0b8 100644 --- a/code/modules/defenses/sentry.dm +++ b/code/modules/defenses/sentry.dm @@ -370,7 +370,7 @@ targets.Remove(A) continue - if(M.get_target_lock(faction_group) || M.invisibility) + if(M.get_target_lock(faction_group) || M.invisibility || HAS_TRAIT(M, TRAIT_ABILITY_BURROWED)) if(M == target) target = null targets.Remove(M) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoAttacks.dm b/code/modules/mob/living/carbon/xenomorph/XenoAttacks.dm index be772e3a0a4f..b12ff5d6c3bb 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoAttacks.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoAttacks.dm @@ -93,6 +93,9 @@ if (M.fortify || M.burrow) return XENO_NO_DELAY_ACTION + if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) + return XENO_NO_DELAY_ACTION + if(islarva(M)) //Larvas can't eat people M.visible_message(SPAN_DANGER("[M] nudges its head against \the [src]."), \ SPAN_DANGER("You nudge your head against \the [src]."), null, null, CHAT_TYPE_XENO_FLUFF) diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index f1d03d6507b1..40d38c24085a 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -745,6 +745,8 @@ if(SEND_SIGNAL(AM, COMSIG_MOVABLE_XENO_START_PULLING, src) & COMPONENT_ALLOW_PULL) return do_pull(AM, lunge, no_msg) + if(burrow) + return if(!isliving(AM)) return FALSE var/mob/living/L = AM diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm index 4f104c00f92e..4d3aae33ae9c 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm @@ -42,7 +42,12 @@ density = FALSE if(caste.fire_immunity == FIRE_IMMUNITY_NONE) RegisterSignal(src, COMSIG_LIVING_PREIGNITION, PROC_REF(fire_immune)) - RegisterSignal(src, COMSIG_LIVING_FLAMER_CROSSED, PROC_REF(flamer_crossed_immune)) + RegisterSignal(src, list( + COMSIG_LIVING_FLAMER_CROSSED, + COMSIG_LIVING_FLAMER_FLAMED, + ), PROC_REF(flamer_crossed_immune)) + ADD_TRAIT(src, TRAIT_ABILITY_BURROWED, TRAIT_SOURCE_ABILITY("Burrow")) + playsound(src.loc, 'sound/effects/burrowing_b.ogg', 25) update_canmove() update_icons() addtimer(CALLBACK(src, PROC_REF(do_burrow_cooldown)), (caste ? caste.burrow_cooldown : 5 SECONDS)) @@ -65,21 +70,29 @@ to_chat(src, SPAN_NOTICE("You resurface.")) burrow = FALSE if(caste.fire_immunity == FIRE_IMMUNITY_NONE) - UnregisterSignal(src, COMSIG_LIVING_PREIGNITION) - UnregisterSignal(src, COMSIG_LIVING_FLAMER_CROSSED) + UnregisterSignal(src, list( + COMSIG_LIVING_PREIGNITION, + COMSIG_LIVING_FLAMER_CROSSED, + COMSIG_LIVING_FLAMER_FLAMED, + )) + REMOVE_TRAIT(src, TRAIT_ABILITY_BURROWED, TRAIT_SOURCE_ABILITY("Burrow")) frozen = FALSE invisibility = FALSE anchored = FALSE density = TRUE - for(var/mob/living/carbon/human/H in loc) - H.apply_effect(2, WEAKEN) + playsound(loc, 'sound/effects/burrowoff.ogg', 25) + for(var/mob/living/carbon/mob in loc) + if(!can_not_harm(mob)) + mob.apply_effect(2, WEAKEN) + addtimer(CALLBACK(src, PROC_REF(do_burrow_cooldown)), (caste ? caste.burrow_cooldown : 5 SECONDS)) update_canmove() update_icons() /mob/living/carbon/xenomorph/proc/do_burrow_cooldown() used_burrow = FALSE - to_chat(src, SPAN_NOTICE("You can now surface.")) + if(burrow) + to_chat(src, SPAN_NOTICE("You can now surface.")) for(var/X in actions) var/datum/action/act = X act.update_button_icon() diff --git a/code/modules/mob/living/living_verbs.dm b/code/modules/mob/living/living_verbs.dm index 9b003562825d..fe95f14182ea 100644 --- a/code/modules/mob/living/living_verbs.dm +++ b/code/modules/mob/living/living_verbs.dm @@ -11,6 +11,12 @@ to_chat(src, SPAN_WARNING("You can't resist in your current state.")) return + if(isxeno(src)) + var/mob/living/carbon/xenomorph/xeno = src + if(xeno.burrow) + to_chat(src, SPAN_WARNING("You can't resist in your current state.")) + return + resisting = TRUE next_move = world.time + 20 diff --git a/sound/effects/burrowing_b.ogg b/sound/effects/burrowing_b.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cc44a8e192824f1e68efafae579962ddac7a859f GIT binary patch literal 8146 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 literal 0 HcmV?d00001 diff --git a/sound/effects/burrowoff.ogg b/sound/effects/burrowoff.ogg new file mode 100644 index 0000000000000000000000000000000000000000..66f10b253612d17d922e6b2d8a909b242e0a7bcf GIT binary patch literal 10718 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 literal 0 HcmV?d00001