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 ..()