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
+6 -2
View File
@@ -1,7 +1,11 @@
#define BASIC_MOB_MAX_STAMINALOSS 200
///Basic mob flags
/// Stamina threshold to not experience stamina crit
#define BASIC_MOB_NO_STAMCRIT 0
/// Max stamina should be equal to max health
#define BASIC_MOB_STAMINA_MATCH_HEALTH -1
/// Delete mob upon death
#define DEL_ON_DEATH (1<<0)
/// Rotate mob 180 degrees while it is dead
+1 -1
View File
@@ -68,7 +68,7 @@
//Bitflags defining which status effects could be or are inflicted on a mob
/// If set, this mob can be stunned.
#define CANSTUN (1<<0)
/// If set, this mob can be knocked down (or stamcrit)
/// If set, this mob can be knocked down
#define CANKNOCKDOWN (1<<1)
/// If set, this mob can be knocked unconscious via status effect.
/// NOTE, does not mean immune to sleep. Unconscious and sleep are two different things.
@@ -96,6 +96,8 @@
/// from base of mob/living/updatehealth()
#define COMSIG_LIVING_HEALTH_UPDATE "living_health_update"
/// from base of mob/living/updatestamina()
#define COMSIG_LIVING_STAMINA_UPDATE "living_stamina_update"
///from base of mob/living/death(): (gibbed)
#define COMSIG_LIVING_DEATH "living_death"
@@ -0,0 +1,33 @@
/// Applies a simple scaling slowdown as a mob's stamina is depleted
/datum/element/basic_stamina_slowdown
element_flags = ELEMENT_BESPOKE
argument_hash_start_idx = 2
/// How much stamina damage need we take before we start moving slower?
var/minium_stamina_threshold
/// How much stamina damage can we have at maximum?
var/maximum_stamina
/// How slow do we move with the maximum stamina damage?
var/maximum_slowdown
/datum/element/basic_stamina_slowdown/Attach(datum/target, minium_stamina_threshold = 40, maximum_stamina = 120, maximum_slowdown = 12)
. = ..()
if (!isliving(target))
return ELEMENT_INCOMPATIBLE
src.minium_stamina_threshold = minium_stamina_threshold
src.maximum_stamina = maximum_stamina
src.maximum_slowdown = maximum_slowdown
RegisterSignal(target, COMSIG_LIVING_STAMINA_UPDATE, PROC_REF(on_stamina_changed))
/datum/element/basic_stamina_slowdown/Detach(datum/source)
. = ..()
UnregisterSignal(source, COMSIG_LIVING_STAMINA_UPDATE)
/// When our stamina changes check how slow we should be
/datum/element/basic_stamina_slowdown/proc/on_stamina_changed(mob/living/source)
SIGNAL_HANDLER
if (source.staminaloss >= minium_stamina_threshold)
var/current_slowdown = (source.staminaloss / maximum_stamina) * maximum_slowdown
source.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/basic_stamina_slowdown, TRUE, multiplicative_slowdown = current_slowdown)
else
source.remove_movespeed_modifier(/datum/movespeed_modifier/basic_stamina_slowdown)
@@ -22,12 +22,12 @@
// Same
RegisterSignal(owner, COMSIG_LIVING_ADJUST_STAMINA_DAMAGE, PROC_REF(update_diminishing_return))
RegisterSignal(owner, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(check_remove))
RegisterSignal(owner, COMSIG_LIVING_STAMINA_UPDATE, PROC_REF(check_remove))
/datum/status_effect/incapacitating/stamcrit/on_apply()
if(owner.stat == DEAD)
return FALSE
if(owner.check_stun_immunity(CANKNOCKDOWN))
if(owner.check_stun_immunity(CANSTUN))
return FALSE
if(SEND_SIGNAL(owner, COMSIG_LIVING_ENTER_STAMCRIT) & STAMCRIT_CANCELLED)
return FALSE
@@ -72,7 +72,13 @@
return COMPONENT_IGNORE_CHANGE
/datum/status_effect/incapacitating/stamcrit/proc/check_remove(datum/source, ...)
/datum/status_effect/incapacitating/stamcrit/proc/check_remove(datum/source)
SIGNAL_HANDLER
if (isbasicmob(owner))
var/mob/living/basic/basic_owner = owner
if(basic_owner.staminaloss < basic_owner.stamina_crit_threshold)
qdel(src)
return
if(owner.maxHealth - owner.getStaminaLoss() > owner.crit_threshold)
qdel(src)
@@ -18,6 +18,7 @@
bubble_icon = "alien"
combat_mode = TRUE
faction = list(ROLE_ALIEN)
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
// Going for a dark purple here
lighting_cutoff_red = 30
+19 -9
View File
@@ -4,17 +4,22 @@
icon = 'icons/mob/simple/animal.dmi'
health = 20
maxHealth = 20
max_stamina = BASIC_MOB_STAMINA_MATCH_HEALTH
gender = PLURAL
living_flags = MOVES_ON_ITS_OWN
status_flags = CANPUSH
status_flags = CANPUSH | CANSTUN
fire_stack_decay_rate = -5 // Reasonably fast as NPCs will not usually actively extinguish themselves
var/basic_mob_flags = NONE
///Defines how fast the basic mob can move. This is not a multiplier
var/speed = 1
///How much stamina the mob recovers per second
var/stamina_recovery = 5
///How much stamina the mob recovers per second, if set to >0 stamina loses its normal function of resetting after a set amount of time
var/stamina_recovery = 0
///How slow will we get when we lose all our stamina?
var/max_stamina_slowdown = 3
///Percentage of max stamina loss we need to lose in order to get stunned
var/stamina_crit_threshold = 100
///how much damage this basic mob does to objects, if any.
var/obj_damage = 0
@@ -42,7 +47,7 @@
var/environment_smash = ENVIRONMENT_SMASH_STRUCTURES
/// 1 for full damage, 0 for none, -1 for 1:1 heal from that source.
var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 1, OXY = 1)
///Verbs used for speaking e.g. "Says" or "Chitters". This can be elementized
var/list/speak_emote = list()
@@ -111,6 +116,8 @@
stack_trace("Basic mob being instantiated in nullspace")
update_basic_mob_varspeed()
apply_target_randomisation()
make_stamina_slowable()
if(speak_emote)
speak_emote = string_list(speak_emote)
@@ -121,7 +128,6 @@
return
apply_atmos_requirements(mapload)
apply_temperature_requirements(mapload)
apply_target_randomisation()
/mob/living/basic/proc/on_ssair_init(datum/source)
SIGNAL_HANDLER
@@ -143,6 +149,14 @@
return
AddElement(/datum/element/body_temp_sensitive, minimum_survivable_temperature, maximum_survivable_temperature, unsuitable_cold_damage, unsuitable_heat_damage, mapload)
/// Ensures that this mob can be slowed from taking stamina damage
/mob/living/basic/proc/make_stamina_slowable()
if (max_stamina == BASIC_MOB_STAMINA_MATCH_HEALTH)
max_stamina = maxHealth
if (damage_coeff[STAMINA] <= 0 || max_stamina <= 0 || max_stamina_slowdown <= 0)
return
AddElement(/datum/element/basic_stamina_slowdown, minium_stamina_threshold = max_stamina / 3, maximum_stamina = max_stamina, maximum_slowdown = max_stamina_slowdown)
/mob/living/basic/proc/apply_target_randomisation()
if (basic_mob_flags & PRECISE_ATTACK_ZONES)
return
@@ -285,10 +299,6 @@
/mob/living/basic/compare_sentience_type(compare_type)
return sentience_type == compare_type
/// Updates movement speed based on stamina loss
/mob/living/basic/update_stamina()
set_varspeed(initial(speed) + (staminaloss * 0.06))
/mob/living/basic/on_fire_stack(seconds_per_tick, datum/status_effect/fire_handler/fire_stacks/fire_handler)
adjust_bodytemperature((maximum_survivable_temperature + (fire_handler.stacks * 12)) * 0.5 * seconds_per_tick)
@@ -5,6 +5,7 @@
icon = 'icons/mob/nonhuman-player/blob.dmi'
icon_state = "blob_head"
unique_name = TRUE
status_flags = CANPUSH
pass_flags = PASSBLOB
faction = list(ROLE_BLOB)
combat_mode = TRUE
@@ -18,6 +19,7 @@
lighting_cutoff_blue = 30
initial_language_holder = /datum/language_holder/empty
can_buckle_to = FALSE
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
/mob/living/basic/blob_minion/Initialize(mapload)
. = ..()
@@ -3,6 +3,7 @@
//im using it for stuff both of them get
/mob/living/basic/boss
combat_mode = TRUE
status_flags = NONE
sentience_type = SENTIENCE_BOSS
mob_biotypes = MOB_ORGANIC|MOB_SPECIAL
faction = list(FACTION_MINING, FACTION_BOSS)
+1 -1
View File
@@ -380,7 +380,7 @@
speed = 1
melee_damage_lower = 10
melee_damage_upper = 15
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)
attack_verb_continuous = "slams"
attack_verb_simple = "slam"
loot = list(
@@ -8,6 +8,7 @@
unsuitable_atmos_damage = 0
minimum_survivable_temperature = 0
maximum_survivable_temperature = INFINITY
status_flags = CANPUSH
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0)
pressure_resistance = 100
speed = 0
@@ -9,6 +9,7 @@
mob_biotypes = MOB_SPIRIT
maxHealth = 40
health = 40
status_flags = CANPUSH
speak_emote = list("hisses")
response_help_continuous = "puts their hand through"
response_help_simple = "put your hand through"
@@ -27,6 +28,7 @@
faction = list(FACTION_CULT)
basic_mob_flags = DEL_ON_DEATH
initial_language_holder = /datum/language_holder/construct
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
/// Theme controls color. THEME_CULT is red THEME_WIZARD is purple and THEME_HOLY is blue
var/theme = THEME_CULT
/// The different flavors of goop shades can drop, depending on theme.
@@ -12,7 +12,7 @@
speak_emote = list("roars")
health = 250
maxHealth = 250
damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 1, STAMINA = 0, OXY = 1)
damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 1, STAMINA = 1, OXY = 1)
melee_damage_lower = 25
melee_damage_upper = 25
obj_damage = 40
@@ -27,7 +27,7 @@
melee_attack_cooldown = CLICK_CD_MELEE
melee_damage_lower = 25
melee_damage_upper = 30
damage_coeff = list(BRUTE = 1, BURN = 1.5, TOX = 1.5, STAMINA = 0, OXY = 1.5)
damage_coeff = list(BRUTE = 1, BURN = 1.5, TOX = 1.5, STAMINA = 1, OXY = 1.5)
obj_damage = 40
attack_verb_continuous = "pummels"
attack_verb_simple = "pummel"
@@ -13,6 +13,7 @@
gender = NEUTER
gold_core_spawnable = HOSTILE_SPAWN
basic_mob_flags = DEL_ON_DEATH
status_flags = CANPUSH
response_help_continuous = "rubs"
response_help_simple = "rub"
@@ -38,6 +39,7 @@
death_message = "is hacked into pieces!"
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
ai_controller = /datum/ai_controller/basic_controller/festivus_pole
/mob/living/basic/festivus/Initialize(mapload)
@@ -17,6 +17,7 @@
hud_type = /datum/hud/guardian
faction = list()
speed = 0
status_flags = CANPUSH
maxHealth = INFINITY // The spirit itself is invincible and passes damage to its host
health = INFINITY
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
@@ -59,13 +59,24 @@
if(!can_adjust_stamina_loss(amount, forced, required_biotype))
return 0
. = staminaloss
if(forced)
staminaloss = max(0, min(BASIC_MOB_MAX_STAMINALOSS, staminaloss + amount))
else
staminaloss = max(0, min(BASIC_MOB_MAX_STAMINALOSS, staminaloss + (amount * damage_coeff[STAMINA])))
if(updating_stamina)
var/stamina_delta = forced ? amount : amount * damage_coeff[STAMINA]
staminaloss = max(0, min(max_stamina, staminaloss + stamina_delta))
if(stamina_delta > 0)
received_stamina_damage(staminaloss, -1 * stamina_delta, amount)
if(updating_stamina && stamina_delta)
update_stamina()
. -= staminaloss
/mob/living/basic/received_stamina_damage(current_level, amount_actual, amount)
return
if (stamina_recovery == 0)
return ..()
/mob/living/basic/received_stamina_damage(current_level, amount_actual, amount)
. = ..()
if (stat == DEAD || stamina_crit_threshold == BASIC_MOB_NO_STAMCRIT)
return
if (100 / (max_stamina / current_level) >= stamina_crit_threshold)
apply_status_effect(/datum/status_effect/incapacitating/stamcrit)
@@ -9,6 +9,7 @@
mob_biotypes = NONE
habitable_atmos = null
status_flags = CANPUSH
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, STAMINA = 0, OXY = 0)
speed = 0
melee_attack_cooldown = CLICK_CD_MELEE
@@ -25,7 +25,7 @@
attack_sound = 'sound/items/weapons/bladeslice.ogg'
attack_vis_effect = ATTACK_EFFECT_SLASH
status_flags = NONE
status_flags = CANSTUN
lighting_cutoff_red = 5
lighting_cutoff_green = 20
lighting_cutoff_blue = 25
@@ -22,7 +22,7 @@
environment_smash = ENVIRONMENT_SMASH_WALLS
minimum_survivable_temperature = T0C
maximum_survivable_temperature = T0C + 450
status_flags = NONE
status_flags = CANSTUN
lighting_cutoff_red = 5
lighting_cutoff_green = 20
lighting_cutoff_blue = 25
@@ -13,6 +13,7 @@
lighting_cutoff_red = 25
lighting_cutoff_green = 15
lighting_cutoff_blue = 35
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
/// Message to output if throwing damage is absorbed
var/throw_blocked_message = "bounces off"
/// What crusher trophy this mob drops, if any
@@ -31,6 +31,7 @@
light_on = FALSE
combat_mode = FALSE
ai_controller = /datum/ai_controller/basic_controller/minebot
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
///the gun we use to kill
var/obj/item/gun/energy/recharge/kinetic_accelerator/minebot/stored_gun
///our normal overlay
@@ -90,7 +90,7 @@
health = 50
maxHealth = 50
gender = NEUTER
damage_coeff = list(BRUTE = 3, BURN = 3, TOX = 1, STAMINA = 0, OXY = 1)
damage_coeff = list(BRUTE = 3, BURN = 3, TOX = 1, STAMINA = 1, OXY = 1)
butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/food/breadslice/plain = 3, \
/obj/item/food/meat/slab = 2)
response_harm_continuous = "takes a bite out of"
@@ -8,6 +8,7 @@
icon_living = "orbie"
speed = 0
maxHealth = 100
status_flags = CANPUSH
light_on = FALSE
light_system = OVERLAY_LIGHT
light_range = 6
@@ -25,6 +26,7 @@
maximum_survivable_temperature = INFINITY
death_message = "fades out of existence!"
ai_controller = /datum/ai_controller/basic_controller/orbie
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
///are we happy or not?
var/happy_state = FALSE
///overlay for our neutral eyes
@@ -10,6 +10,7 @@
icon_state = "ai-red"
icon_living = "ai-red"
gender = NEUTER
status_flags = NONE
basic_mob_flags = MOB_ROBOTIC
mob_size = MOB_SIZE_HUGE
basic_mob_flags = DEL_ON_DEATH
@@ -44,6 +44,7 @@
attack_vis_effect = ATTACK_EFFECT_BITE
attack_verb_continuous = "bites"
attack_verb_simple = "bite"
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
ai_controller = /datum/ai_controller/basic_controller/living_floor
melee_attack_cooldown = 0.5 SECONDS // get real
@@ -30,6 +30,7 @@ GLOBAL_LIST_INIT(animatable_blacklist, typecacheof(list(
faction = list(FACTION_MIMIC)
basic_mob_flags = DEL_ON_DEATH
combat_mode = TRUE
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
/// can we stun people on hit
var/knockdown_people = FALSE
@@ -20,6 +20,7 @@
unsuitable_atmos_damage = 7.5
unsuitable_cold_damage = 7.5
unsuitable_heat_damage = 7.5
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1)
ai_controller = /datum/ai_controller/basic_controller/stickman
@@ -15,7 +15,7 @@
attack_vis_effect = ATTACK_EFFECT_BITE
combat_mode = TRUE
speed = 4
status_flags = CANPUSH
status_flags = CANPUSH | CANSTUN
death_message = "rapidly decays into a pile of bones!"
unsuitable_atmos_damage = 0
unsuitable_cold_damage = 0
+1 -1
View File
@@ -26,7 +26,7 @@
wound_bonus = -45
can_buckle_to = FALSE
damage_coeff = list(BRUTE = 1, BURN = -1, TOX = 1, STAMINA = 0, OXY = 1) //Healed by fire
damage_coeff = list(BRUTE = 1, BURN = -1, TOX = 1, STAMINA = 1, OXY = 1) //Healed by fire
unsuitable_cold_damage = 15
unsuitable_heat_damage = 0
maximum_survivable_temperature = INFINITY
@@ -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
+1
View File
@@ -1483,6 +1483,7 @@
return TRUE
/mob/living/proc/update_stamina()
SEND_SIGNAL(src, COMSIG_LIVING_STAMINA_UPDATE)
update_stamina_hud()
/mob/living/carbon/alien/update_stamina()
+3
View File
@@ -24,6 +24,9 @@
/datum/movespeed_modifier/resonance
multiplicative_slowdown = 0.75
/datum/movespeed_modifier/basic_stamina_slowdown
variable = TRUE
/datum/movespeed_modifier/damage_slowdown
blacklisted_movetypes = FLOATING|FLYING
variable = TRUE
+1
View File
@@ -1471,6 +1471,7 @@
#include "code\datums\elements\basic_allergenic_attack.dm"
#include "code\datums\elements\basic_eating.dm"
#include "code\datums\elements\basic_health_examine.dm"
#include "code\datums\elements\basic_stamina_slowdown.dm"
#include "code\datums\elements\beauty.dm"
#include "code\datums\elements\bed_tucking.dm"
#include "code\datums\elements\befriend_petting.dm"