diff --git a/aurorastation.dme b/aurorastation.dme
index 141e14ac2d5..d7cd356a0d2 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -203,6 +203,7 @@
#include "code\controllers\subsystems\materials.dm"
#include "code\controllers\subsystems\mob.dm"
#include "code\controllers\subsystems\mob_ai.dm"
+#include "code\controllers\subsystems\mob_fast_ai.dm"
#include "code\controllers\subsystems\news.dm"
#include "code\controllers\subsystems\night_lighting.dm"
#include "code\controllers\subsystems\orbit.dm"
diff --git a/code/__defines/subsystem-defines.dm b/code/__defines/subsystem-defines.dm
index 5ad5ec72588..48344c15c32 100644
--- a/code/__defines/subsystem-defines.dm
+++ b/code/__defines/subsystem-defines.dm
@@ -102,6 +102,9 @@
#define MOB_START_THINKING(mob) if (!mob.thinking_enabled) { SSmob_ai.processing += mob; mob.on_think_enabled(); mob.thinking_enabled = TRUE; }
#define MOB_STOP_THINKING(mob) SSmob_ai.processing -= mob; mob.on_think_disabled(); mob.thinking_enabled = FALSE;
+#define MOB_SHIFT_TO_FAST_THINKING(mob) if(!mob.is_fast_processing) { SSmob_ai.processing -= mob; SSmob_fast_ai.processing += mob; mob.is_fast_processing = TRUE; }
+#define MOB_SHIFT_TO_NORMAL_THINKING(mob) if(mob.is_fast_processing) { SSmob_fast_ai.processing -= mob; SSmob_ai.processing += mob; mob.is_fast_processing = FALSE; }
+
// - SSrecords --
#define RECORD_GENERAL 1
diff --git a/code/controllers/subsystems/mob_fast_ai.dm b/code/controllers/subsystems/mob_fast_ai.dm
new file mode 100644
index 00000000000..ace6b022827
--- /dev/null
+++ b/code/controllers/subsystems/mob_fast_ai.dm
@@ -0,0 +1,8 @@
+/var/datum/controller/subsystem/mob_ai/fast/SSmob_fast_ai
+
+/datum/controller/subsystem/mob_ai/fast
+ name = "Mobs - Fast AI"
+ wait = 5
+
+/datum/controller/subsystem/mob_ai/fast/New()
+ NEW_SS_GLOBAL(SSmob_fast_ai)
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 3ab6f780b04..b750afb1307 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -91,6 +91,7 @@
var/previous = stance
stance = input
if (stance != previous)
+ change_stance(stance)
stance_step = 0
/mob/living/simple_animal/hostile/bear/think()
diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm
index 5bd64575fbd..eb1fca96264 100644
--- a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm
@@ -56,7 +56,7 @@
//WE DANCE!
/mob/living/simple_animal/hostile/commanded/bear/misc_command(var/mob/speaker,var/text)
stay_command()
- stance = COMMANDED_MISC //nothing can stop this ride
+ change_stance(COMMANDED_MISC) //nothing can stop this ride
INVOKE_ASYNC(src, PROC_REF(command_dance))
/mob/living/simple_animal/hostile/commanded/bear/proc/command_dance()
@@ -78,6 +78,6 @@
set_dir(EAST)
visible_message("\The [src] [message]")
sleep(30)
- stance = COMMANDED_STOP
+ change_stance(COMMANDED_STOP)
set_dir(SOUTH)
visible_message("\The [src] bows, finished with [get_pronoun("his")] dance.")
diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm b/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm
index d44c3493768..2bf73f92d09 100644
--- a/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm
+++ b/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm
@@ -68,6 +68,19 @@
if(COMMANDED_STOP)
commanded_stop()
+/mob/living/simple_animal/hostile/commanded/change_stance(var/new_stance)
+ . = ..()
+ if(!.)
+ return
+
+ switch(stance)
+ if(COMMANDED_STOP)
+ MOB_SHIFT_TO_NORMAL_THINKING(src)
+ if(COMMANDED_FOLLOW)
+ MOB_SHIFT_TO_FAST_THINKING(src)
+ if(COMMANDED_MISC)
+ MOB_SHIFT_TO_NORMAL_THINKING(src)
+
/mob/living/simple_animal/hostile/commanded/on_think_disabled()
..()
command_buffer.Cut()
@@ -89,12 +102,12 @@
if(mode == "specific")
if(!(A in allowed_targets))
continue
- stance = new_stance
+ change_stance(new_stance)
return A
else
if(M == master || (M in friends))
continue
- stance = new_stance
+ change_stance(new_stance)
return A
@@ -154,7 +167,7 @@
/mob/living/simple_animal/hostile/commanded/proc/attack_command(var/mob/speaker,var/text)
target_mob = null //want me to attack something? Well I better forget my old target.
walk_to(src,0)
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
if(text == "attack" || findtext(text,"everyone") || findtext(text,"anybody") || findtext(text, "somebody") || findtext(text, "someone")) //if its just 'attack' then just attack anybody, same for if they say 'everyone', somebody, anybody. Assuming non-pickiness.
allowed_targets = list("everyone")//everyone? EVERYONE
return 1
@@ -166,7 +179,7 @@
/mob/living/simple_animal/hostile/commanded/proc/stay_command(var/mob/speaker,var/text)
target_mob = null
- stance = COMMANDED_STOP
+ change_stance(COMMANDED_STOP)
stop_automated_movement = 1
walk_to(src,0)
if(emote_hear && emote_hear.len)
@@ -177,7 +190,7 @@
allowed_targets = list()
walk_to(src,0)
target_mob = null //gotta stop SOMETHIN
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
stop_automated_movement = 0
if(emote_hear && emote_hear.len)
audible_emote("[pick(emote_hear)].",0)
@@ -186,7 +199,7 @@
/mob/living/simple_animal/hostile/commanded/proc/follow_command(var/mob/speaker,var/text)
//we can assume 'stop following' is handled by stop_command
if(findtext(text,"me"))
- stance = COMMANDED_FOLLOW
+ change_stance(COMMANDED_FOLLOW)
target_mob = speaker //this wont bite me in the ass later.
return 1
var/list/targets = get_targets_by_name(text)
@@ -195,7 +208,7 @@
if(emote_hear && emote_hear.len)
audible_emote("[pick(emote_hear)].",0)
- stance = COMMANDED_FOLLOW //GOT SOMEBODY. BETTER FOLLOW EM.
+ change_stance(COMMANDED_FOLLOW) //GOT SOMEBODY. BETTER FOLLOW EM.
target_mob = targets[1] //YEAH GOOD IDEA
return 1
@@ -210,12 +223,12 @@
// We forgive our master
if(user == master)
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
target_mob = null
audible_emote("[pick(sad_emote)].",0)
return
if(. && retribution)
- stance = HOSTILE_STANCE_ATTACK
+ change_stance(HOSTILE_STANCE_ATTACK)
target_mob = user
allowed_targets += user //fuck this guy in particular.
if(user in friends) //We were buds :'(
@@ -227,13 +240,13 @@
// We forgive our master
if(M == master)
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
target_mob = null
if(M.a_intent == I_HURT)
audible_emote("[pick(sad_emote)].",0)
return
if(M.a_intent == I_HELP && prob(40)) //chance that they won't immediately kill anyone who pets them. But only a chance.
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
target_mob = null
audible_emote("growls at [M].")
to_chat(M, SPAN_WARNING("Maybe you should keep your hands to yourself..."))
@@ -243,7 +256,7 @@
target_mob = M
allowed_targets += M
- stance = HOSTILE_STANCE_ATTACK
+ change_stance(HOSTILE_STANCE_ATTACK)
if(M in friends)
friends -= M
@@ -253,7 +266,7 @@
// We forgive our master
if(user == master)
target_mob = null
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
audible_emote("[pick(sad_emote)].",0)
/mob/living/simple_animal/hostile/commanded/bullet_act(var/obj/item/projectile/P, var/def_zone)
@@ -262,7 +275,7 @@
// We forgive our master
if (ismob(P.firer) && P.firer == master)
target_mob = null
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
audible_emote("[pick(sad_emote)].",0)
/mob/living/simple_animal/hostile/commanded/attackby(var/obj/item/O, var/mob/user)
@@ -271,7 +284,7 @@
// We forgive our master
if(user == master)
target_mob = null
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
if(!istype(O, brush)) //we don't get sad if we're brushed!
audible_emote("[pick(sad_emote)].",0)
@@ -283,5 +296,5 @@
if(ismob(O.thrower))
if(O.thrower == master)
target_mob = null
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
audible_emote("[pick(sad_emote)].",0)
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm
index 87160c0a9b3..143b422f82d 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot.dm
@@ -94,7 +94,7 @@
/mob/living/simple_animal/hostile/hivebot/bomber/AttackingTarget()
..()
LoseTarget()
- stance = HOSTILE_STANCE_TIRED
+ change_stance(HOSTILE_STANCE_TIRED)
stop_automated_movement = 1
wander = 0
if(!has_exploded)
@@ -167,7 +167,7 @@
/mob/living/simple_animal/hostile/hivebot/emp_act(severity)
LoseTarget()
- stance = HOSTILE_STANCE_TIRED
+ change_stance(HOSTILE_STANCE_TIRED)
addtimer(CALLBACK(src, PROC_REF(wakeup)), 50)
visible_message(SPAN_DANGER("[src] suffers a teleportation malfunction!"))
playsound(src.loc, 'sound/effects/teleport.ogg', 25, 1)
@@ -175,4 +175,4 @@
do_teleport(src, random_turf)
/mob/living/simple_animal/hostile/hivebot/proc/wakeup()
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_beacon.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_beacon.dm
index 09e85afb577..f5d1cf5c5bc 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_beacon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_beacon.dm
@@ -157,7 +157,7 @@
/mob/living/simple_animal/hostile/hivebotbeacon/emp_act()
if(activated != -1)
LoseTarget()
- stance = HOSTILE_STANCE_TIRED
+ change_stance(HOSTILE_STANCE_TIRED)
icon_state = "hivebotbeacon_off"
activated = -1
addtimer(CALLBACK(src, PROC_REF(wakeup)), 900)
@@ -174,7 +174,7 @@
do_teleport(src, random_turf)
/mob/living/simple_animal/hostile/hivebotbeacon/proc/wakeup()
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
activated = 0
activate_beacon()
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester.dm
index b41e28cf50b..c98214e8988 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester.dm
@@ -42,7 +42,7 @@
mob_bump_flag = HEAVY
mob_swap_flags = ~HEAVY
mob_push_flags = 0
-
+
psi_pingable = FALSE
/mob/living/simple_animal/hostile/retaliate/hivebotharvester/Initialize(mapload,mob/living/simple_animal/hostile/hivebot/hivebotbeacon)
@@ -83,7 +83,7 @@
/mob/living/simple_animal/hostile/retaliate/hivebotharvester/emp_act(severity)
LoseTarget()
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
visible_message(SPAN_DANGER("[src] suffers a teleportation malfunction!"))
playsound(src.loc, 'sound/effects/teleport.ogg', 25, 1)
var/turf/random_turf = get_turf(pick(orange(src,7)))
@@ -341,4 +341,4 @@
if(see_target())
Shoot(target, location, user)
target_mob = null
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index d984444494a..475129792bd 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -32,6 +32,12 @@
var/smart_ranged = FALSE // This makes ranged mob check for friendly fire and obstacles
var/hostile_nameable = FALSE //If we can rename this hostile mob. Mostly to prevent repeat checks with guard dogs and hostile/retaliate farm animals
+ var/is_fast_processing = FALSE
+
+ // actions measured in deciseconds
+ var/hostile_time_between_attacks = 10
+ var/hostile_last_attack = 0
+
/mob/living/simple_animal/hostile/Initialize()
. = ..()
setup_target_type_validators()
@@ -59,6 +65,7 @@
return null
var/atom/T = null
+ var/target_range = INFINITY
for (var/atom/A in targets)
if(A == src)
continue
@@ -71,20 +78,23 @@
if (!cb)
continue
else if (!istype(cb) || cb.Invoke(A, T))
- T = A
+ var/range_to_atom = get_dist(src, A)
+ if(range_to_atom < target_range)
+ T = A
+ target_range = range_to_atom
stop_automated_movement = 0
if (T != target_mob)
target_mob = T
FoundTarget()
+ if(isliving(T))
+ visible_message(SPAN_WARNING("\The [src] [attack_emote] [T]."))
+ if(istype(T, /mob/living/simple_animal/hostile))
+ var/mob/living/simple_animal/hostile/H = T
+ H.being_targeted(src)
if(!isnull(T))
- stance = HOSTILE_STANCE_ATTACK
- if(isliving(T))
- visible_message(SPAN_WARNING("\The [src] [attack_emote] [T]."))
- if(istype(T, /mob/living/simple_animal/hostile))
- var/mob/living/simple_animal/hostile/H = T
- H.being_targeted(src)
+ change_stance(HOSTILE_STANCE_ATTACK)
return T
// This proc is used when one hostile mob targets another hostile mob.
@@ -93,20 +103,20 @@
return
target_mob = H
FoundTarget()
- stance = HOSTILE_STANCE_ATTACKING
+ change_stance(HOSTILE_STANCE_ATTACKING)
visible_message(SPAN_WARNING("\The [src] gets taunted by \the [H] and begins to retaliate!"))
/mob/living/simple_animal/hostile/bullet_act(var/obj/item/projectile/P, var/def_zone)
..()
if (ismob(P.firer) && target_mob != P.firer)
target_mob = P.firer
- stance = HOSTILE_STANCE_ATTACK
+ change_stance(HOSTILE_STANCE_ATTACK)
/mob/living/simple_animal/hostile/attackby(var/obj/item/O, var/mob/user)
..()
if(target_mob != user)
target_mob = user
- stance = HOSTILE_STANCE_ATTACK
+ change_stance(HOSTILE_STANCE_ATTACK)
mob/living/simple_animal/hostile/hitby(atom/movable/AM as mob|obj,var/speed = THROWFORCE_SPEED_DIVISOR)//Standardization and logging -Sieve
..()
@@ -114,19 +124,19 @@ mob/living/simple_animal/hostile/hitby(atom/movable/AM as mob|obj,var/speed = TH
var/obj/O = AM
if((target_mob != O.thrower) && ismob(O.thrower))
target_mob = O.thrower
- stance = HOSTILE_STANCE_ATTACK
+ change_stance(HOSTILE_STANCE_ATTACK)
/mob/living/simple_animal/hostile/attack_generic(var/mob/user, var/damage, var/attack_message)
..()
if(target_mob != user)
target_mob = user
- stance = HOSTILE_STANCE_ATTACK
+ change_stance(HOSTILE_STANCE_ATTACK)
/mob/living/simple_animal/hostile/attack_hand(mob/living/carbon/human/M as mob)
..()
if(target_mob != M)
target_mob = M
- stance = HOSTILE_STANCE_ATTACK
+ change_stance(HOSTILE_STANCE_ATTACK)
//This proc is called after a target is acquired
/mob/living/simple_animal/hostile/proc/FoundTarget()
@@ -152,9 +162,8 @@ mob/living/simple_animal/hostile/hitby(atom/movable/AM as mob|obj,var/speed = TH
else
walk_to(src, target_mob, 6, move_to_delay)
else
- stance = HOSTILE_STANCE_ATTACKING
- var/move_distance = smart_melee ? 2 : 1
- walk_to(src, target_mob, move_distance, move_to_delay)
+ change_stance(HOSTILE_STANCE_ATTACKING)
+ walk_to(src, target_mob, 1, move_to_delay)
/mob/living/simple_animal/hostile/proc/AttackTarget()
stop_automated_movement = 1
@@ -166,11 +175,12 @@ mob/living/simple_animal/hostile/hitby(atom/movable/AM as mob|obj,var/speed = TH
return 0
if(!see_target())
LoseTarget()
- if(!ranged)
- step_to(src, target_mob, 1)
+ if(world.time < hostile_time_between_attacks + hostile_last_attack)
+ return
if(get_dist(src, target_mob) <= 1) //Attacking
AttackingTarget()
attacked_times += 1
+ hostile_last_attack = world.time
return 1
else
return 0
@@ -234,7 +244,7 @@ mob/living/simple_animal/hostile/hitby(atom/movable/AM as mob|obj,var/speed = TH
facing_dir = null
/mob/living/simple_animal/hostile/proc/LoseTarget()
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
target_mob = null
walk(src, 0)
LostTarget()
@@ -276,6 +286,24 @@ mob/living/simple_animal/hostile/hitby(atom/movable/AM as mob|obj,var/speed = TH
target_mob = FindTarget()
attacked_times = 0
+/mob/living/simple_animal/hostile/proc/change_stance(var/new_stance)
+ if(new_stance == stance)
+ return FALSE
+
+ stance = new_stance
+ switch(stance)
+ if(HOSTILE_STANCE_IDLE)
+ MOB_SHIFT_TO_NORMAL_THINKING(src)
+ if(HOSTILE_STANCE_ALERT)
+ MOB_SHIFT_TO_FAST_THINKING(src)
+ if(HOSTILE_STANCE_ATTACK)
+ MOB_SHIFT_TO_FAST_THINKING(src)
+ if(HOSTILE_STANCE_ATTACKING)
+ MOB_SHIFT_TO_FAST_THINKING(src)
+ if(HOSTILE_STANCE_TIRED)
+ MOB_SHIFT_TO_NORMAL_THINKING(src)
+
+ return TRUE
/mob/living/simple_animal/hostile/proc/OpenFire(target_mob)
if(!see_target())
@@ -294,7 +322,7 @@ mob/living/simple_animal/hostile/hitby(atom/movable/AM as mob|obj,var/speed = TH
else
shoot_wrapper(target, loc, src)
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
target_mob = null
/mob/living/simple_animal/hostile/proc/check_fire(target_mob)
@@ -340,7 +368,7 @@ mob/living/simple_animal/hostile/hitby(atom/movable/AM as mob|obj,var/speed = TH
visible_message(SPAN_DANGER("[capitalize_first_letters(src.name)] [attacktext] \the [e]!"))
src.do_attack_animation(e)
target_mob = e
- stance = HOSTILE_STANCE_ATTACKING
+ change_stance(HOSTILE_STANCE_ATTACKING)
return TRUE
for(var/obj/structure/window/obstacle in get_step(src, dir))
if(obstacle.dir == reverse_dir[dir]) // So that windows get smashed in the right order
diff --git a/code/modules/mob/living/simple_animal/hostile/morph.dm b/code/modules/mob/living/simple_animal/hostile/morph.dm
index a9a8c011611..7c31685db4a 100644
--- a/code/modules/mob/living/simple_animal/hostile/morph.dm
+++ b/code/modules/mob/living/simple_animal/hostile/morph.dm
@@ -209,12 +209,6 @@
return
return ..()
-/mob/living/simple_animal/hostile/bullet_act(obj/item/projectile/P, def_zone)
- ..()
- if (ismob(P.firer) && target_mob != P.firer)
- target_mob = P.firer
- stance = HOSTILE_STANCE_ATTACK
-
/mob/living/simple_animal/hostile/morph/attackby(obj/item/O, mob/user)
..()
if(morphed && user != src)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm
index df9c14d7435..6525ee8446a 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm
@@ -9,7 +9,7 @@
if(isliving(A))
var/mob/living/L = A
if(!L.stat)
- stance = HOSTILE_STANCE_ATTACK
+ change_stance(HOSTILE_STANCE_ATTACK)
return L
else
enemies -= L
@@ -49,4 +49,4 @@
to_chat(usr,"This species will be known from now on as '[newname]'.")
else
to_chat(usr,"This species has already been named!")
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/living/simple_animal/hostile/space_fauna.dm b/code/modules/mob/living/simple_animal/hostile/space_fauna.dm
index da563d7e611..5073c83b6a7 100644
--- a/code/modules/mob/living/simple_animal/hostile/space_fauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/space_fauna.dm
@@ -65,7 +65,7 @@
/mob/living/simple_animal/hostile/carp/MoveToTarget()
stop_automated_movement = 1
if(istype(target_mob, /obj/effect/energy_field) && !QDELETED(target_mob) && (target_mob in targets))
- stance = HOSTILE_STANCE_ATTACKING
+ change_stance(HOSTILE_STANCE_ATTACKING)
walk_to(src, target_mob, 1, move_to_delay)
return 1
..()
@@ -100,7 +100,7 @@
visible_message("\the [src] bites \the [e]!")
src.do_attack_animation(e)
target_mob = e
- stance = HOSTILE_STANCE_ATTACKING
+ change_stance(HOSTILE_STANCE_ATTACKING)
return 1
for(var/obj/structure/window/obstacle in get_step(src, dir))
if(obstacle.dir == reverse_dir[dir]) // So that windows get smashed in the right order
@@ -189,8 +189,8 @@
melee_damage_lower = 20
melee_damage_upper = 20
armor_penetration = 25
-
-/mob/living/simple_animal/hostile/carp/bloater
+
+/mob/living/simple_animal/hostile/carp/bloater
name = "bloater"
desc = "A fat, mineral-devouring creature frequently herded for mining expeditions. Its actual ability to dig is less valuable than its volatile nature, however."
icon = 'icons/mob/npc/large_space_xenofauna.dmi'
@@ -212,7 +212,7 @@
/mob/living/simple_animal/hostile/carp/bloater/AttackingTarget()
..()
LoseTarget()
- stance = HOSTILE_STANCE_TIRED
+ change_stance(HOSTILE_STANCE_TIRED)
stop_automated_movement = 1
wander = 0
if(!has_exploded)
diff --git a/code/modules/mob/living/simple_animal/hostile/viscerator.dm b/code/modules/mob/living/simple_animal/hostile/viscerator.dm
index 905363b86c4..0bf88d96eb4 100644
--- a/code/modules/mob/living/simple_animal/hostile/viscerator.dm
+++ b/code/modules/mob/living/simple_animal/hostile/viscerator.dm
@@ -47,11 +47,11 @@
return FALSE
/mob/living/simple_animal/hostile/viscerator/proc/wakeup()
- stance = HOSTILE_STANCE_IDLE
+ change_stance(HOSTILE_STANCE_IDLE)
/mob/living/simple_animal/hostile/viscerator/emp_act(severity)
LoseTarget()
- stance = HOSTILE_STANCE_TIRED
+ change_stance(HOSTILE_STANCE_TIRED)
addtimer(CALLBACK(src, PROC_REF(wakeup)), 150)
if(severity == 1.0)
apply_damage(5)
diff --git a/html/changelogs/geeves-cooler_combat_mobs.yml b/html/changelogs/geeves-cooler_combat_mobs.yml
new file mode 100644
index 00000000000..66766400a12
--- /dev/null
+++ b/html/changelogs/geeves-cooler_combat_mobs.yml
@@ -0,0 +1,7 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - rscadd: "Hostile mobs now think and react faster while in a combat state."
+ - tweak: "Hostile mobs now attack the target nearest to them."