Most fleshy mobs are vulnerable to stamina and stuns (#90675)

## About The Pull Request

This PR enables most mobs to take stamina damage, become slowed as a
result of taking stamina damage.
It also gives most mobs CANSTUN which not only allows them to enter
stamcrit from taking stamina damage but also makes them vulnerable to
mechanics like stun batons.

Mobs which already took stamina damage (Spiders and Space Dragons) still
work the same way.
Mechanical or artificial mobs, mining mobs, simple xenomorphs, ghosts,
and most kinds of mob closely associated with antagonists still don't
take stamina damage.

## Why It's Good For The Game

A new player armed with a disabler will probably try and use it on
aggressive animals and be disappointed, but I don't think there is any
_reason_ for them to be disappointed when it's already something they
are doing merely to delay being attacked rather than to kill the target.
It's not intuitive for these mechanics not to function against simple
mobs when they do against humans, _especially_ the kinds of mobs which
look like humans, and there isn't any technical reason why it _couldn't_
work against most mobs which it looks like they should work against.

While this reduces the threat level of some mobs against Security
players I think the greater interaction with the sandbox is beneficial.
I'm hopeful it doesn't have that much effect on many of the most common
places you encounter dangerous mobs like Space Ruins or Gateways as they
are also places where you can't reliably recharge your energy-based
stamina weapons as most that don't require energy do require getting
into melee and endangering yourself.

## Changelog

🆑
balance: Most biological mobs are now slowed by taking stamina damage,
and can be stunned. Mechanical mobs, mining mobs, and several other
special kinds (chiefly those invoked by antagonists) are unaffected. If
this seems to effect any mob it probably shouldn't, please report it as
a bug.
/🆑
This commit is contained in:
Jacquerel
2025-05-11 05:05:53 +10:00
committed by GitHub
parent e706689c15
commit d19b8de989
56 changed files with 162 additions and 34 deletions
@@ -14,6 +14,7 @@
response_disarm_continuous = "gently pushes aside"
response_disarm_simple = "gently push aside"
max_stamina = 120
maxHealth = 60
health = 60
speed = 0
@@ -88,7 +89,7 @@
maxHealth = 250
health = 250
faction = list(FACTION_NEUTRAL)
status_flags = CANPUSH
status_flags = CANPUSH | CANSTUN
/mob/living/basic/bear/snow/ancient
name = "ancient polar bear"
@@ -22,6 +22,7 @@
mob_biotypes = MOB_ORGANIC | MOB_BEAST | MOB_AQUATIC
health = 25
maxHealth = 25
max_stamina = 120
pressure_resistance = 200
combat_mode = TRUE
obj_damage = 50
@@ -26,7 +26,7 @@
habitable_atmos = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 7.5
faction = list(FACTION_HOSTILE)
status_flags = CANPUSH
status_flags = CANPUSH | CANSTUN
basic_mob_flags = DEL_ON_DEATH
ai_controller = /datum/ai_controller/basic_controller/cat_butcherer
@@ -41,6 +41,10 @@
lighting_cutoff_blue = 5
butcher_results = list(/obj/item/food/meat/slab/spider = 2, /obj/item/food/spiderleg = 8)
ai_controller = /datum/ai_controller/basic_controller/giant_spider
max_stamina = 200
stamina_crit_threshold = BASIC_MOB_NO_STAMCRIT
stamina_recovery = 5
max_stamina_slowdown = 12
/mob/living/basic/flesh_spider/Initialize(mapload)
. = ..()
@@ -12,6 +12,7 @@
gender = NEUTER
health = 50
maxHealth = 50
max_stamina = 120
melee_damage_lower = 5
melee_damage_upper = 5
attack_verb_continuous = "chomps"
@@ -47,6 +47,8 @@
lighting_cutoff_green = 10
lighting_cutoff_blue = 20
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
/// Typepath of the antag datum to add to the demon when applicable
var/datum/antagonist/antag_type = null
@@ -18,7 +18,7 @@
attack_verb_simple = "punch"
attack_sound = 'sound/items/weapons/punch1.ogg'
melee_attack_cooldown = 1.2 SECONDS
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 1, OXY = 1)
speak_emote = list("announces")
unsuitable_atmos_damage = 0
@@ -10,6 +10,7 @@
response_help_simple = "pass through"
combat_mode = TRUE
basic_mob_flags = DEL_ON_DEATH
status_flags = CANPUSH
maxHealth = 40
health = 40
melee_damage_lower = 15
@@ -26,6 +27,7 @@
light_range = 2.5 // same glowing as visible player ghosts
light_power = 0.6
ai_controller = /datum/ai_controller/basic_controller/ghost
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
///What hairstyle will this ghost have
var/ghost_hairstyle
@@ -32,6 +32,7 @@
habitable_atmos = null
minimum_survivable_temperature = TCMB
ai_controller = /datum/ai_controller/basic_controller/hivebot
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
///does this type do range attacks?
var/ranged_attacker = FALSE
/// How often can we shoot?
@@ -34,7 +34,7 @@
verb_exclaim = "zaps"
verb_yell = "bangs"
initial_language_holder = /datum/language_holder/lightbringer
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0)
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 1, OXY = 0)
light_range = 4
faction = list(FACTION_NEUTRAL)
unsuitable_atmos_damage = 0
@@ -10,6 +10,7 @@
icon = 'icons/mob/simple/meteor_heart.dmi'
icon_state = "heart"
icon_living = "heart"
status_flags = NONE
mob_biotypes = MOB_ORGANIC
basic_mob_flags = DEL_ON_DEATH
mob_size = MOB_SIZE_HUGE
@@ -27,6 +28,7 @@
maximum_survivable_temperature = 1500
combat_mode = TRUE
move_resist = INFINITY // This mob IS the floor
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
/// Looping heartbeat sound
var/datum/looping_sound/heartbeat/soundloop
@@ -27,6 +27,7 @@
lighting_cutoff_blue = 40
ai_controller = /datum/ai_controller/basic_controller/simple/simple_hostile_obstacles
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
/mob/living/basic/blankbody/Initialize(mapload)
. = ..()
@@ -28,6 +28,7 @@
lighting_cutoff_blue = 15
ai_controller = /datum/ai_controller/basic_controller/simple/simple_hostile_obstacles
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
var/health_scaling = TRUE
/mob/living/basic/creature/Initialize(mapload)
@@ -29,6 +29,7 @@
lighting_cutoff_blue = 50
ai_controller = /datum/ai_controller/basic_controller/simple/simple_hostile_obstacles
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
var/static/list/migo_sounds
/// Odds migo will dodge
var/dodge_prob = 10
@@ -13,6 +13,7 @@
response_disarm_simple = "push"
basic_mob_flags = DEL_ON_DEATH
status_flags = CANPUSH
maxHealth = 1000
health = 1000
melee_damage_lower = 10
@@ -20,6 +21,7 @@
obj_damage = 50
attack_sound = 'sound/effects/hallucinations/growl1.ogg'
ai_controller = /datum/ai_controller/basic_controller/paper_wizard
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
///spell to summon minions
var/datum/action/cooldown/spell/conjure/wizard_summon_minions/summon
///spell to summon clones
@@ -11,6 +11,7 @@
maxHealth = 70
health = 70
max_stamina = 120
butcher_results = list(/obj/item/food/meat/slab/mouse = 2, /obj/item/clothing/head/costume/crown = 1)
@@ -11,6 +11,7 @@
icon_living = "amerifat"
max_grab = GRAB_AGGRESSIVE
status_flags = CANPUSH
basic_mob_flags = DEL_ON_DEATH
mob_biotypes = MOB_ROBOTIC|MOB_HUMANOID
sentience_type = SENTIENCE_ARTIFICIAL
@@ -20,6 +21,7 @@
maximum_survivable_temperature = T0C + 1000
ai_controller = /datum/ai_controller/robot_customer
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
/// The clothes that we draw on this tourist.
var/clothes_set = "amerifat_clothes"
@@ -18,6 +18,7 @@
health_doll_icon = "spacedragon"
faction = list(FACTION_CARP)
mob_biotypes = MOB_SPECIAL
status_flags = CANPUSH
flags_1 = PREVENT_CONTENTS_EXPLOSION_1
gender = NEUTER
maxHealth = 400
@@ -51,6 +52,10 @@
lighting_cutoff_red = 12
lighting_cutoff_green = 15
lighting_cutoff_blue = 34
max_stamina = 200
stamina_crit_threshold = BASIC_MOB_NO_STAMCRIT
stamina_recovery = 5
max_stamina_slowdown = 12
/// The colour of the space dragon
var/chosen_colour
@@ -30,6 +30,11 @@
lighting_cutoff_red = 22
lighting_cutoff_green = 5
lighting_cutoff_blue = 5
max_stamina = 200
stamina_crit_threshold = BASIC_MOB_NO_STAMCRIT
stamina_recovery = 5
max_stamina_slowdown = 12
/// Speed modifier to apply if controlled by a human player
var/player_speed_modifier = -4
/// What reagent the mob injects targets with
@@ -9,8 +9,10 @@
maxHealth = 300
melee_damage_lower = 15
melee_damage_upper = 30
status_flags = CANPUSH
sentience_type = SENTIENCE_ARTIFICIAL
ai_controller = /datum/ai_controller/basic_controller/stares_at_people
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
/// the path to a fake item we will hold in our right hand
var/obj/item/held_item
/// the path to a fake hat we will wear
@@ -29,6 +29,7 @@
attack_vis_effect = ATTACK_EFFECT_CLAW
melee_attack_cooldown = 1 SECONDS
status_flags = CANPUSH
faction = list(FACTION_STATUE)
speak_emote = list("screams")
death_message = "falls apart into a fine dust."
@@ -50,6 +51,7 @@
move_resist = MOVE_FORCE_EXTREMELY_STRONG
pull_force = MOVE_FORCE_EXTREMELY_STRONG
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
ai_controller = /datum/ai_controller/basic_controller/statue
/mob/living/basic/statue/Initialize(mapload)
@@ -9,6 +9,7 @@
icon_dead = "smspider_dead"
gender = NEUTER
status_flags = CANPUSH
mob_biotypes = MOB_BUG|MOB_ROBOTIC
speak_emote = list("vibrates")
@@ -24,6 +25,7 @@
maximum_survivable_temperature = T0C + 1250
habitable_atmos = null
death_message = "falls to the ground, its shard dulling to a miserable grey!"
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
faction = list(FACTION_HOSTILE)
@@ -16,7 +16,7 @@
health_doll_icon = "Fugu0"
pixel_x = -16
base_pixel_x = -16
status_flags = NONE
status_flags = CANSTUN
gold_core_spawnable = HOSTILE_SPAWN
mob_biotypes = MOB_ORGANIC | MOB_BEAST
mob_size = MOB_SIZE_SMALL