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."