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