From daa33d89fef10650f89f7db160f110141ab99e5d Mon Sep 17 00:00:00 2001 From: IndieanaJones <47086570+IndieanaJones@users.noreply.github.com> Date: Sat, 24 Jun 2023 20:59:07 -0400 Subject: [PATCH] Xenomorph/Alien Rework 2023: Part 1 (#75286) ## About The Pull Request Alternative to #75277 Kept you waiting, huh? This PR is the first part of a Xenomorph rework which seeks to make the big lugs more balanced and up to date with /tg/'s current design. This mainly involves curtailing xenomorph's infamous hardstuns into more interactive forms of combat, while also giving some buffs to the xenomorph's more unique abilities in order to keep them threatening. Part 1 will focus on simple number changes and some simple mechanic changes. In the future, changes will be made to endgame involving xenomorphs, along with changes to other facets of Xenomorphs. Highly based off of #55937. Changes: - Xenomorph disarm has been completely reworked. While a disarm will attempt to, well, disarm, a human opponent should they be holding something, it will no longer immediately hardstun targets when they aren't. Instead, the xenomorph will shove the target several tiles back and inflict 35 stamina damage. If the target slams into a wall, this will also come with the added effect of knocking them down. If a human is incapacitated, however, right click will slam them into the ground, which paralyzes them for a lengthy 5 seconds (which is ultimately half the time xenos could stun you for before), allowing for safe transport back to the nest as long as you keep them close. - Humans can now shove xenomorphs. Due to being the superior predator, however, you can't knock down xenomorphs from shoving. You can slow them for a little bit akin to humans though. - Neurotoxin no longer is a hardstun. Instead, it deals 50 stamina damage on contact. It is still resisted by BIO armor. **HUNTER:** - Speed reduced from -1 to -0.3. - Pounce speed is twice as fast as before (1 to 2) - Hardstun time on pounce reduced from 10 seconds to 5 seconds. Hunters being insanely fast has been a major balance-ruining factor of xenomorphs for many years now. These buggers could practically ambush anyone, hardstun them immediately, and then leave before anyone could do anything. Now, with their speed nerfed and in combination with the xeno shove changes, hunters will need to spend more time to down a target. Their pounce was practically useless, so its been sped up in order to make it more practical to use. **SENTINEL** - Speed reduced from 0 to 0.2 - Cloak alpha reduced from 0.75 to 0.25 (you're more hidden now) Sentinels receive a large nerf in regards to their spit, but their before useless cloaking ability has been greatly improved upon as compensation. They now serve better as defenders and ranged ambushers. **XENOMORPH DRONE** - No changes As in the original PR, drones are perfeclty balanced in my eyes, so no changes were required. **XENOMORPH PRAETORIAN** - Speed increased from 1 to 0.5 - No changes Praetorians get affected by the nerfs of the other xeno abilities, but now they're a bit faster in order to close the gap to use their abilities. **XENOMORPH QUEEN** - Speed increased from 3 to 2 - Health increased from 400 to 500 - Damage increased from 20 to 50 Xenomorph queens have been sped up and made more tanky and lethal in close-range combat. Fighting this beast up-close should be a death sentence to almost anything else in the game. Speed increases will help her re-position and close the gap on potential prey. **OTHER CHANGES** - Fixed a bug where simplemobs didn't actually use xenomorph's damage values when they were attacked by them. ## Why It's Good For The Game Xenomorphs are old, and haven't been updated for quite a long time. This has left them as sources of a bunch of hardstuns which made counterplay from a modern spaceman extremely difficult. With these changes, fighting xenomorphs is more interactive and should end up being more enjoyable for both crew and xenos. Buffs were also given out to incentivize usage of xenomorph's unique abilities as opposed to the standard disarm spam which was most effective for them until now. ## Changelog :cl: balance: Xenos have been rebalanced, removing their hardstuns on their disarm and neurotoxin, along with a slew of other changes. Xenos have received buffs to their more unique abilities in return. fix: Fixed simplemobs ignoring xenomorph's melee damage values when being attacked by them. /:cl: --- .../configuration/entries/game_options.dm | 3 --- .../carbon/alien/adult/adult_defense.dm | 10 ++------ .../living/carbon/alien/adult/alien_powers.dm | 3 ++- .../living/carbon/alien/adult/caste/hunter.dm | 7 ++++-- .../carbon/alien/adult/caste/praetorian.dm | 1 + .../carbon/alien/adult/caste/sentinel.dm | 1 + .../mob/living/carbon/alien/adult/queen.dm | 7 ++++-- code/modules/mob/living/carbon/alien/alien.dm | 8 +++++++ .../mob/living/carbon/human/human_defense.dm | 23 +++++++++++++------ .../living/simple_animal/animal_defense.dm | 2 +- code/modules/movespeed/modifiers/mobs.dm | 3 +++ .../projectile/special/neurotoxin.dm | 6 ++--- 12 files changed, 46 insertions(+), 28 deletions(-) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 5d1b46599e4..88e0326b1c5 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -199,9 +199,6 @@ default = list( //DEFAULTS /mob/living/simple_animal = 1, /mob/living/silicon/pai = 1, - /mob/living/carbon/alien/adult/hunter = -1, - /mob/living/carbon/alien/adult/royal/praetorian = 1, - /mob/living/carbon/alien/adult/royal/queen = 3 ) /datum/config_entry/keyed_list/multiplicative_movespeed/ValidateAndSet() diff --git a/code/modules/mob/living/carbon/alien/adult/adult_defense.dm b/code/modules/mob/living/carbon/alien/adult/adult_defense.dm index 9edb0319aab..b4a119d5aba 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult_defense.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult_defense.dm @@ -18,14 +18,8 @@ if(!..() || !user.combat_mode) return if(LAZYACCESS(modifiers, RIGHT_CLICK)) - if (body_position == STANDING_UP) - if (prob(5)) - Unconscious(40) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - log_combat(user, src, "pushed") - visible_message(span_danger("[user] pushes [src] down!"), \ - span_userdanger("[user] pushes you down!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), null, user) - to_chat(user, span_danger("You push [src] down!")) + if(stat < UNCONSCIOUS) + user.disarm(src) return TRUE var/damage = rand(1, 9) if (prob(90)) diff --git a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm index b3ef7f92ab4..07dfa328ed7 100644 --- a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm @@ -246,7 +246,7 @@ Doesn't work on other aliens/AI.*/ /datum/action/cooldown/alien/acid/neurotoxin name = "Spit Neurotoxin" - desc = "Spits neurotoxin at someone, paralyzing them for a short time." + desc = "Spits neurotoxin at someone, dealing large amounts of stamina damage." button_icon_state = "alien_neurotoxin_0" plasma_cost = 50 @@ -351,6 +351,7 @@ Doesn't work on other aliens/AI.*/ button_icon_state = "alien_sneak" background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" + sneak_alpha = 25 /datum/action/cooldown/alien/regurgitate name = "Regurgitate" diff --git a/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm b/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm index 72cdd3bbf4b..3a346bf8255 100644 --- a/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/adult/caste/hunter.dm @@ -4,7 +4,10 @@ maxHealth = 125 health = 125 icon_state = "alienh" + alien_speed = -0.3 var/atom/movable/screen/leap_icon = null + ///How fast does our pounce move us? + var/pounce_speed = 2 /mob/living/carbon/alien/adult/hunter/create_internal_organs() organs += new /obj/item/organ/internal/alien/plasmavessel/small @@ -50,7 +53,7 @@ body_position_pixel_y_offset = -32 update_icons() ADD_TRAIT(src, TRAIT_MOVE_FLOATING, LEAPING_TRAIT) //Throwing itself doesn't protect mobs against lava (because gulag). - throw_at(A, MAX_ALIEN_LEAP_DIST, 1, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(leap_end))) + throw_at(A, MAX_ALIEN_LEAP_DIST, pounce_speed, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(leap_end))) /mob/living/carbon/alien/adult/hunter/proc/leap_end() leaping = FALSE @@ -75,7 +78,7 @@ blocked = TRUE if(!blocked) L.visible_message(span_danger("[src] pounces on [L]!"), span_userdanger("[src] pounces on you!")) - L.Paralyze(100) + L.Paralyze(5 SECONDS) sleep(0.2 SECONDS)//Runtime prevention (infinite bump() calls on hulks) step_towards(src,L) else diff --git a/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm index 3064068b32f..a26eb31231c 100644 --- a/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/adult/caste/praetorian.dm @@ -4,6 +4,7 @@ maxHealth = 250 health = 250 icon_state = "alienp" + alien_speed = 0.5 /mob/living/carbon/alien/adult/royal/praetorian/Initialize(mapload) real_name = name diff --git a/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm index 3a6cc5f7b34..6b6f370388a 100644 --- a/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm @@ -4,6 +4,7 @@ maxHealth = 150 health = 150 icon_state = "aliens" + alien_speed = 0.2 /mob/living/carbon/alien/adult/sentinel/Initialize(mapload) var/datum/action/cooldown/sneak/alien/sneaky_beaky = new(src) diff --git a/code/modules/mob/living/carbon/alien/adult/queen.dm b/code/modules/mob/living/carbon/alien/adult/queen.dm index 1f344a98fb2..cb0f6119a2d 100644 --- a/code/modules/mob/living/carbon/alien/adult/queen.dm +++ b/code/modules/mob/living/carbon/alien/adult/queen.dm @@ -34,9 +34,12 @@ /mob/living/carbon/alien/adult/royal/queen name = "alien queen" caste = "q" - maxHealth = 400 - health = 400 + maxHealth = 500 + health = 500 icon_state = "alienq" + melee_damage_lower = 50 + melee_damage_upper = 50 + alien_speed = 2 /mob/living/carbon/alien/adult/royal/queen/Initialize(mapload) //there should only be one queen diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 639586b2974..d17b02d8817 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -15,7 +15,10 @@ heat_protection = 0.5 // minor heat insulation + ///Whether or not the alien is leaping. Only used by hunters. var/leaping = FALSE + ///The speed this alien should move at. + var/alien_speed = 0 gib_type = /obj/effect/decal/cleanable/xenoblood/xgibs unique_name = TRUE @@ -32,6 +35,8 @@ add_traits(list(TRAIT_NEVER_WOUNDED, TRAIT_VENTCRAWLER_ALWAYS), INNATE_TRAIT) . = ..() + if(alien_speed) + update_alien_speed() /mob/living/carbon/alien/create_internal_organs() organs += new /obj/item/organ/internal/brain/alien @@ -137,3 +142,6 @@ Des: Removes all infected images from the alien. /mob/living/carbon/alien/on_standing_up() . = ..() update_icons() + +/mob/living/carbon/alien/proc/update_alien_speed() + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/alien_speed, multiplicative_slowdown = alien_speed) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 9659d0c66fd..7ddf614e7fc 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -280,20 +280,29 @@ if(!.) return - if(LAZYACCESS(modifiers, RIGHT_CLICK)) //Always drop item in hand, if no item, get stun instead. + if(LAZYACCESS(modifiers, RIGHT_CLICK)) //Always drop item in hand if there is one. If there's no item, shove the target. If the target is incapacitated, slam them into the ground to stun them. var/obj/item/I = get_active_held_item() if(I && dropItemToGround(I)) playsound(loc, 'sound/weapons/slash.ogg', 25, TRUE, -1) visible_message(span_danger("[user] disarms [src]!"), \ span_userdanger("[user] disarms you!"), span_hear("You hear aggressive shuffling!"), null, user) to_chat(user, span_danger("You disarm [src]!")) - else + else if(!HAS_TRAIT(src, TRAIT_INCAPACITATED)) playsound(loc, 'sound/weapons/pierce.ogg', 25, TRUE, -1) - Paralyze(100) - log_combat(user, src, "tackled") - visible_message(span_danger("[user] tackles [src] down!"), \ - span_userdanger("[user] tackles you down!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), null, user) - to_chat(user, span_danger("You tackle [src] down!")) + var/shovetarget = get_edge_target_turf(user, get_dir(user, get_step_away(src, user))) + adjustStaminaLoss(35) + throw_at(shovetarget, 4, 2, user, force = MOVE_FORCE_OVERPOWERING) + log_combat(user, src, "shoved") + visible_message("[user] tackles [src] down!", \ + "[user] shoves you with great force!", "You hear aggressive shuffling followed by a loud thud!", null, user) + to_chat(user, "You shove [src] with great force!") + else + Paralyze(5 SECONDS) + playsound(loc, 'sound/weapons/punch3.ogg', 25, TRUE, -1) + visible_message("[user] slams [src] into the floor!", \ + "[user] slams you into the ground!", "You hear something slam loudly onto the floor!", null, user) + to_chat(user, "You slam [src] into the floor beneath you!") + log_combat(user, src, "slammed into the ground") return TRUE if(user.combat_mode) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 2ee3598c79c..df97740e69c 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -75,7 +75,7 @@ to_chat(user, span_danger("You [response_disarm_simple] [name]!")) log_combat(user, src, "disarmed") else - var/damage = rand(15, 30) + var/damage = rand(user.melee_damage_lower, user.melee_damage_upper) visible_message(span_danger("[user] slashes at [src]!"), \ span_userdanger("You're slashed at by [user]!"), null, COMBAT_MESSAGE_RANGE, user) to_chat(user, span_danger("You slash at [src]!")) diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index 6267de09a02..1c29c740aba 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -147,5 +147,8 @@ /datum/movespeed_modifier/health_scaling_speed_buff variable = TRUE +/datum/movespeed_modifier/alien_speed + variable = TRUE + /datum/movespeed_modifier/grown_killer_tomato variable = TRUE diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm index 0dcac83f02c..5283d967dfd 100644 --- a/code/modules/projectiles/projectile/special/neurotoxin.dm +++ b/code/modules/projectiles/projectile/special/neurotoxin.dm @@ -1,15 +1,13 @@ /obj/projectile/neurotoxin name = "neurotoxin spit" icon_state = "neurotoxin" - damage = 5 - damage_type = TOX - paralyze = 10 SECONDS + damage = 50 + damage_type = STAMINA armor_flag = BIO impact_effect_type = /obj/effect/temp_visual/impact_effect/neurotoxin /obj/projectile/neurotoxin/on_hit(atom/target, blocked = FALSE) if(isalien(target)) - paralyze = 0 SECONDS damage = 0 return ..()