Actually fixes strange mob delays: BEEPSKY IS TOO FAST edition (#64351)

* Revert " Properly speeds up a lot of things, mostly mobs (#64270)"

This reverts commit a836574388.
THE BYOND REF WAS A LIE, THE PLAYERS ARE FOOLS, HELP, HELPPPPPPP

It turns out that despite what the byond ref says, the walk proc's delays were not in fact in ticks, but in deciseconds.
This means when I "fixed" mob movement by doubling all walk delays, what I actually did was double the speed of anything that used walk()

I have a feeling that the actual issue players were seeing was just move_to having fucked up distance logic, and the movement of slow mobs being smoothed out. I've changed that, so hopefully this puts a seal on the whole problem

I've had a request put in to make beepsky faster, but I think that's best done in a seperate pr

* Adds a flag to disable smooth moveloop movement
Applies it to hostile mob's Goto()
Backports the fixes to move_to and move_away from the previous pr
This commit is contained in:
LemonInTheDark
2022-01-27 17:50:08 -08:00
committed by GitHub
parent 3d319f6157
commit 934a5ea498
46 changed files with 79 additions and 75 deletions
@@ -309,7 +309,7 @@
/// Spawned mob's melee damage = this multiplier * seed potency.
var/mob_melee_multiplier = 1
/// Spawned mob's move delay = this multiplier * seed potency.
var/mob_speed_multiplier = 0.5
var/mob_speed_multiplier = 1
/datum/plant_gene/trait/mob_transformation/on_new_plant(obj/item/our_plant, newloc)
. = ..()
@@ -416,14 +416,14 @@
killer_plant = /mob/living/simple_animal/hostile/killertomato
mob_health_multiplier = 0.33
mob_melee_multiplier = 0.1
mob_speed_multiplier = 0.01
mob_speed_multiplier = 0.02
/// Walking Mushroom's transformation gene
/datum/plant_gene/trait/mob_transformation/shroom
killer_plant = /mob/living/simple_animal/hostile/mushroom
mob_health_multiplier = 0.25
mob_melee_multiplier = 0.05
mob_speed_multiplier = 0.01
mob_speed_multiplier = 0.02
/// Traiit for plants eaten in 1 bite.
/datum/plant_gene/trait/one_bite
+2 -2
View File
@@ -15,7 +15,7 @@
combat_mode = TRUE
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
move_to_delay = 5
move_to_delay = 10
health = 125
maxHealth = 125
melee_damage_lower = 15
@@ -308,7 +308,7 @@
sentience_type = SENTIENCE_MINEBOT
var/base_health_add = 5 //sentient minebots are penalized for beign sentient; they have their stats reset to normal plus these values
var/base_damage_add = 1 //this thus disables other minebot upgrades
var/base_speed_add = 0.5
var/base_speed_add = 1
var/base_cooldown_add = 10 //base cooldown isn't reset to normal, it's just added on, since it's not practical to disable the cooldown module
/obj/item/slimepotion/slime/sentience/mining/after_success(mob/living/user, mob/living/simple_animal/simple_mob)
@@ -83,7 +83,7 @@
return
else // not next to perp
var/turf/olddist = get_dist(src, target)
SSmove_manager.move_to(src, target, 1, 2)
SSmove_manager.move_to(src, target, 1, 4)
if((get_dist(src, target)) >= (olddist))
frustration++
else
@@ -22,8 +22,8 @@
///The human target the bot is trying to wash.
var/mob/living/carbon/human/target
///The mob's current speed, which varies based on how long the bot chases it's target. Measured in deciseconds
var/currentspeed = 2.5
///The mob's current speed, which varies based on how long the bot chases it's target.
var/currentspeed = 5
///Is the bot currently washing it's target/everything else that crosses it?
var/washing = FALSE
///Have the target evaded the bot for long enough that it will swear at it like kirk did to kahn?
@@ -109,16 +109,16 @@
if(BOT_HUNT) // hunting for stinkman
if(bot_cover_flags & BOT_COVER_EMAGGED) //lol fuck em up
currentspeed = 1.5
currentspeed = 3.5
start_washing()
mad = TRUE
else
switch(frustration)
if(0 to 4)
currentspeed = 2.5
currentspeed = 5
mad = FALSE
if(5 to INFINITY)
currentspeed = 1
currentspeed = 2.5
mad = TRUE
if(target && !check_purity(target))
if(target.loc == loc && isturf(target.loc)) //LADIES AND GENTLEMAN WE GOTEM PREPARE TO DUMP
@@ -355,7 +355,7 @@
// not next to perp
var/turf/olddist = get_dist(src, target)
SSmove_manager.move_to(src, target, 1, 2)
SSmove_manager.move_to(src, target, 1, 4)
if((get_dist(src, target)) >= (olddist))
frustration++
else
@@ -260,7 +260,7 @@
break
if(movement_target)
stop_automated_movement = 1
SSmove_manager.move_to(src, movement_target, 0, 1.5)
SSmove_manager.move_to(src, movement_target, 0, 3)
/mob/living/simple_animal/pet/cat/jerry //Holy shit we left jerry on donut ~ Arcane ~Fikou
name = "Jerry"
@@ -83,7 +83,7 @@
ranged = 1
retreat_distance = 5
minimum_distance = 5
move_to_delay = 2
move_to_delay = 4
butcher_results = list(/obj/item/food/meat/slab/xeno = 4,
/obj/item/stack/sheet/animalhide/xeno = 1)
projectiletype = /obj/projectile/neurotox
@@ -132,7 +132,7 @@
icon_dead = "alienq_dead"
health_doll_icon = "alienq"
bubble_icon = "alienroyal"
move_to_delay = 2
move_to_delay = 4
maxHealth = 400
health = 400
butcher_results = list(/obj/item/food/meat/slab/xeno = 10,
@@ -177,7 +177,7 @@
melee_damage_lower += rand(2, 10)
melee_damage_upper += rand(10,20)
maxHealth += rand(30,60)
move_to_delay = rand(1.5,3.5)
move_to_delay = rand(3,7)
/mob/living/simple_animal/hostile/carp/megacarp/add_cell_sample()
@@ -4,7 +4,7 @@
icon = 'icons/mob/simple_human.dmi'
icon_state = "dark_wizard"
icon_living = "dark_wizard"
move_to_delay = 5
move_to_delay = 10
projectiletype = /obj/projectile/temp/earth_bolt
projectilesound = 'sound/magic/ethereal_enter.ogg'
ranged = TRUE
@@ -36,7 +36,7 @@
combat_mode = TRUE
faction = list("spiders")
pass_flags = PASSTABLE
move_to_delay = 3
move_to_delay = 6
attack_verb_continuous = "bites"
attack_verb_simple = "bite"
attack_sound = 'sound/weapons/bite.ogg'
@@ -108,7 +108,7 @@
melee_damage_lower = 15
melee_damage_upper = 20
poison_per_bite = 5
move_to_delay = 2.5
move_to_delay = 5
speed = -0.1
menu_description = "Fast spider variant specializing in catching running prey and toxin injection, but has less health and damage. Toxin injection of 10u per bite."
@@ -188,7 +188,7 @@
obj_damage = 100
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
poison_per_bite = 0
move_to_delay = 4
move_to_delay = 8
speed = 1
status_flags = NONE
mob_size = MOB_SIZE_LARGE
@@ -242,7 +242,7 @@
melee_damage_lower = 5
melee_damage_upper = 5
poison_per_bite = 5
move_to_delay = 2
move_to_delay = 4
poison_type = /datum/reagent/toxin/venom
speed = -0.5
gold_core_spawnable = NO_SPAWN
@@ -18,8 +18,7 @@
var/projectiletype //set ONLY it and NULLIFY casingtype var, if we have ONLY projectile
var/projectilesound
var/casingtype //set ONLY it and NULLIFY projectiletype, if we have projectile IN CASING
///Delay for automated movement, measured in deciseconds
var/move_to_delay = 1.5
var/move_to_delay = 3 //delay for the automated movement.
var/list/friends = list()
var/list/emote_taunt = list()
var/taunt_chance = 0
@@ -99,7 +98,7 @@
/mob/living/simple_animal/hostile/update_stamina()
. = ..()
move_to_delay = (initial(move_to_delay) + (staminaloss * 0.03))
move_to_delay = (initial(move_to_delay) + (staminaloss * 0.06))
/mob/living/simple_animal/hostile/proc/sidestep()
if(!target || !isturf(target.loc) || !isturf(loc) || stat == DEAD)
@@ -127,7 +126,7 @@
if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client)
if(P.firer && get_dist(src, P.firer) <= aggro_vision_range)
FindTarget(list(P.firer), 1)
Goto(P.starting, move_to_delay, 1.5)
Goto(P.starting, move_to_delay, 3)
return ..()
//////////////HOSTILE MOB TARGETTING AND AGGRESSION////////////
@@ -288,7 +287,7 @@
return 1
if(retreat_distance != null) //If we have a retreat distance, check if we need to run from our target
if(target_distance <= retreat_distance) //If target's closer than our retreat distance, run
SSmove_manager.move_away(src, target, retreat_distance, move_to_delay)
SSmove_manager.move_away(src, target, retreat_distance, move_to_delay, flags = MOVEMENT_LOOP_IGNORE_GLIDE)
else
Goto(target,move_to_delay,minimum_distance) //Otherwise, get to our minimum distance so we chase them
else
@@ -321,7 +320,7 @@
approaching_target = TRUE
else
approaching_target = FALSE
SSmove_manager.move_to(src, target, minimum_distance, delay)
SSmove_manager.move_to(src, target, minimum_distance, delay, flags = MOVEMENT_LOOP_IGNORE_GLIDE)
/mob/living/simple_animal/hostile/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
. = ..()
@@ -16,7 +16,7 @@
ranged = 1
pixel_x = -16
base_pixel_x = -16
move_to_delay = 5
move_to_delay = 10
aggro_vision_range = 9
speak_emote = list("chitters")
attack_sound = 'sound/weapons/bladeslice.ogg'
@@ -23,7 +23,7 @@
pixel_y = -14
base_pixel_y = -14
minimum_distance = 3
move_to_delay = 10
move_to_delay = 20
vision_range = 9
aggro_vision_range = 15
ranged = TRUE
@@ -32,7 +32,7 @@ Difficulty: Medium
movement_type = GROUND
speak_emote = list("roars")
speed = 3
move_to_delay = 1.5
move_to_delay = 3
ranged = TRUE
ranged_cooldown_time = 1.6 SECONDS
pixel_x = -16
@@ -191,7 +191,7 @@ Difficulty: Medium
name = "hostile-environment miner"
desc = "A miner destined to hop across dimensions for all eternity, hunting anomalous creatures."
speed = 8
move_to_delay = 4
move_to_delay = 8
ranged_cooldown_time = 0.8 SECONDS
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom/Initialize(mapload)
@@ -47,7 +47,7 @@ Difficulty: Hard
melee_damage_lower = 40
melee_damage_upper = 40
speed = 5
move_to_delay = 2.5
move_to_delay = 5
retreat_distance = 5
minimum_distance = 5
rapid_melee = 8 // every 1/4 second
@@ -248,7 +248,7 @@ Difficulty: Hard
return FALSE
enrage_till = world.time + enrage_time
update_approach()
INVOKE_ASYNC(src, .proc/change_move_delay, 2)
INVOKE_ASYNC(src, .proc/change_move_delay, 3.75)
add_atom_colour(COLOR_BUBBLEGUM_RED, TEMPORARY_COLOUR_PRIORITY)
var/datum/callback/cb = CALLBACK(src, .proc/blood_enrage_end)
addtimer(cb, enrage_time)
@@ -26,7 +26,7 @@ I'd rather there be something than the clockwork ruin be entirely empty though s
vision_range = 9
aggro_vision_range = 9
speed = 5
move_to_delay = 2.5
move_to_delay = 5
rapid_melee = 2 // every second
melee_queue_distance = 20
ranged = TRUE
@@ -40,7 +40,7 @@
melee_damage_lower = 40
melee_damage_upper = 40
speed = 10
move_to_delay = 5
move_to_delay = 10
ranged = TRUE
pixel_x = -32
base_pixel_x = -32
@@ -100,7 +100,7 @@
ranged_cooldown = world.time + 30
telegraph()
dir_shots.fire_in_directions(src, target, GLOB.alldirs)
move_to_delay = 1.5
move_to_delay = 3
return
else
move_to_delay = initial(move_to_delay)
@@ -29,7 +29,7 @@ Difficulty: Extremely Hard
vision_range = 18 // large vision range so combat doesn't abruptly end when someone runs a bit away
rapid_melee = 4
speed = 20
move_to_delay = 10
move_to_delay = 20
gps_name = "Bloodchilling Signal"
ranged = TRUE
crusher_loot = list(/obj/effect/decal/remains/plasma, /obj/item/crusher_trophy/ice_block_talisman, /obj/item/ice_energy_crystal)
@@ -54,7 +54,7 @@
melee_damage_lower = 40
melee_damage_upper = 40
speed = 5
move_to_delay = 2.5
move_to_delay = 5
ranged = TRUE
pixel_x = -16
base_pixel_x = -16
@@ -54,7 +54,7 @@ Difficulty: Hard
melee_damage_lower = 15
melee_damage_upper = 15
speed = 10
move_to_delay = 5
move_to_delay = 10
ranged = TRUE
ranged_cooldown_time = 4 SECONDS
aggro_vision_range = 21 //so it can see to one side of the arena to the other
@@ -33,7 +33,7 @@ Difficulty: Hard
vision_range = 9
aggro_vision_range = 18 // man-eating for a reason
speed = 6
move_to_delay = 3
move_to_delay = 6
rapid_melee = 8 // every 1/4 second
melee_queue_distance = 18 // as far as possible really, need this because of charging and teleports
ranged = TRUE
@@ -102,7 +102,7 @@ Difficulty: Hard
update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 10 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 10 SECONDS))
if(WENDIGO_ENRAGED)
speed = 4
move_to_delay = 2
move_to_delay = 4
else
stomp_range = initial(stomp_range)
speed = initial(speed)
@@ -28,7 +28,7 @@
minbodytemp = 0
faction = list("mimic")
move_to_delay = 4.5
move_to_delay = 9
del_on_death = 1
///A cap for items in the mimic. Prevents the mimic from eating enough stuff to cause lag when opened.
var/storage_capacity = 50
@@ -170,7 +170,7 @@ GLOBAL_LIST_INIT(mimic_blacklist, list(/obj/structure/table, /obj/structure/cabl
health = 15 * I.w_class
melee_damage_lower = 2 + I.force
melee_damage_upper = 2 + I.force
move_to_delay = I.w_class + 1
move_to_delay = 2 * I.w_class + 1
maxHealth = health
if(user)
creator = user
@@ -224,7 +224,7 @@ GLOBAL_LIST_INIT(mimic_blacklist, list(/obj/structure/table, /obj/structure/cabl
var/obj/item/gun/G = O
melee_damage_upper = G.force
melee_damage_lower = G.force - max(0, (G.force / 2))
move_to_delay = G.w_class + 1
move_to_delay = 2 * G.w_class + 1
projectilesound = G.fire_sound
TrueGun = G
if(istype(G, /obj/item/gun/magic))
@@ -9,7 +9,7 @@
icon_dead = "Basilisk_dead"
icon_gib = "syndicate_gib"
mob_biotypes = MOB_ORGANIC|MOB_BEAST
move_to_delay = 10
move_to_delay = 20
projectiletype = /obj/projectile/temp/basilisk
projectilesound = 'sound/weapons/pierce.ogg'
ranged = 1
@@ -6,7 +6,7 @@
icon_living = "curseblob"
icon_aggro = "curseblob"
mob_biotypes = MOB_SPIRIT
move_to_delay = 2.5
move_to_delay = 5
vision_range = 20
aggro_vision_range = 20
maxHealth = 40 //easy to kill, but oh, will you be seeing a lot of them.
@@ -36,7 +36,7 @@
attack_sound = 'sound/weapons/punch1.ogg'
throw_message = "does nothing to the rocky hide of the"
speed = 2
move_to_delay = 2.5
move_to_delay = 5
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
deathmessage = "explodes into gore!"
@@ -138,13 +138,13 @@
visible_message(span_warning("[src] starts picking up speed!"))
color = "#FF0000"
set_varspeed(0)
move_to_delay = 1.5
move_to_delay = 3
addtimer(CALLBACK(src, .proc/reset_rage), 65)
/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/reset_rage()
color = "#FFFFFF"
set_varspeed(2)
move_to_delay = 2.5
move_to_delay = 5
/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/call_children()
ranged_cooldown = world.time + 60
@@ -176,7 +176,7 @@
attack_sound = 'sound/weapons/punch1.ogg'
throw_message = "does nothing to the rocky hide of the"
speed = 2
move_to_delay = 2.5
move_to_delay = 5
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
butcher_results = list()
@@ -34,7 +34,7 @@
attack_sound = 'sound/magic/clockwork/ratvar_attack.ogg'
throw_message = "doesn't affect the purity of"
speed = 2
move_to_delay = 5
move_to_delay = 10
mouse_opacity = MOUSE_OPACITY_ICON
deathsound = 'sound/magic/demon_dies.ogg'
deathmessage = "begins to shudder as it becomes transparent..."
@@ -35,7 +35,7 @@
attack_vis_effect = ATTACK_EFFECT_SLASH
throw_message = "doesn't affect the sturdiness of"
speed = 1
move_to_delay = 1.5
move_to_delay = 3
mouse_opacity = MOUSE_OPACITY_ICON
deathsound = 'sound/magic/curse.ogg'
deathmessage = "'s arms reach out before it falls apart onto the floor, lifeless."
@@ -253,7 +253,7 @@
attack_vis_effect = ATTACK_EFFECT_BITE
throw_message = "simply misses"
speed = 0
move_to_delay = 1
move_to_delay = 2
del_on_death = 1
deathmessage = "crumbles away!"
faction = list()
@@ -34,7 +34,7 @@
attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
throw_message = "merely dinks off of the"
speed = 3
move_to_delay = 5
move_to_delay = 10
mouse_opacity = MOUSE_OPACITY_ICON
deathsound = 'sound/magic/repulse.ogg'
deathmessage = "'s lights flicker, before its top part falls down."
@@ -11,7 +11,7 @@
mob_biotypes = MOB_ORGANIC|MOB_BEAST
vision_range = 2
aggro_vision_range = 9
move_to_delay = 2.5
move_to_delay = 5
friendly_verb_continuous = "harmlessly rolls into"
friendly_verb_simple = "harmlessly roll into"
maxHealth = 45
@@ -10,7 +10,7 @@
icon_gib = "syndicate_gib"
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
move_to_delay = 20
move_to_delay = 40
ranged = 1
ranged_cooldown_time = 120
friendly_verb_continuous = "wails at"
@@ -17,7 +17,7 @@
turns_per_move = 8
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
move_to_delay = 7.5
move_to_delay = 15
response_help_continuous = "pets"
response_help_simple = "pet"
response_disarm_continuous = "gently pushes aside"
@@ -8,7 +8,7 @@
icon_dead = "Hivelord_dead"
icon_gib = "syndicate_gib"
mob_biotypes = MOB_ORGANIC
move_to_delay = 7
move_to_delay = 14
ranged = 1
vision_range = 5
aggro_vision_range = 9
@@ -70,7 +70,7 @@
icon_aggro = "Hivelordbrood"
icon_dead = "Hivelordbrood"
icon_gib = "syndicate_gib"
move_to_delay = 1.5
move_to_delay = 1
friendly_verb_continuous = "buzzes near"
friendly_verb_simple = "buzz near"
vision_range = 10
@@ -268,7 +268,7 @@
del_on_death = TRUE
sentience_type = SENTIENCE_BOSS
loot = list(/obj/item/organ/regenerative_core/legion = 3, /obj/effect/mob_spawn/corpse/human/legioninfested = 5)
move_to_delay = 7
move_to_delay = 14
vision_range = 5
aggro_vision_range = 9
speed = 3
@@ -10,7 +10,7 @@
mouse_opacity = MOUSE_OPACITY_ICON
speak_emote = list("telepathically cries")
speed = 2
move_to_delay = 1
move_to_delay = 2
projectiletype = /obj/projectile/temp/basilisk/ice
projectilesound = 'sound/weapons/pierce.ogg'
ranged = TRUE
@@ -11,7 +11,7 @@
friendly_verb_simple = "stare down"
speak_emote = list("roars")
speed = 12
move_to_delay = 6
move_to_delay = 12
ranged = TRUE
ranged_cooldown_time = 5 SECONDS
maxHealth = 300
@@ -15,7 +15,7 @@
friendly_verb_simple = "chits at"
speak_emote = list("chitters")
speed = 3
move_to_delay = 10
move_to_delay = 20
maxHealth = 150
health = 150
obj_damage = 15
@@ -11,7 +11,7 @@
friendly_verb_simple = "growl at"
speak_emote = list("growls")
speed = 3
move_to_delay = 4
move_to_delay = 8
maxHealth = 300
health = 300
obj_damage = 40
@@ -11,7 +11,7 @@
friendly_verb_simple = "howl at"
speak_emote = list("howls")
speed = 5
move_to_delay = 2.5
move_to_delay = 5
maxHealth = 130
health = 130
obj_damage = 15
@@ -58,7 +58,7 @@
melee_damage_lower += rand(3, 5)
melee_damage_upper += rand(10,20)
maxHealth += rand(40,60)
move_to_delay = rand(1.5, 5.5)
move_to_delay = rand(3,11)
cap_living = cap_living || mutable_appearance(icon, "mushroom_cap")
cap_dead = cap_dead || mutable_appearance(icon, "mushroom_cap_dead")
@@ -298,7 +298,7 @@
/mob/living/simple_animal/hostile/retaliate/clown/mutant/slow
speed = 20
move_to_delay = 30
move_to_delay = 60
/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton
name = "banana glutton"
@@ -21,7 +21,7 @@
health_doll_icon = "Fugu0"
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
move_to_delay = 2.5
move_to_delay = 5
friendly_verb_continuous = "floats near"
friendly_verb_simple = "float near"
speak_emote = list("puffs")
@@ -103,7 +103,7 @@
F.throw_message = "is absorbed by the girth of the"
F.retreat_distance = null
F.minimum_distance = 1
F.move_to_delay = 3
F.move_to_delay = 6
F.environment_smash = ENVIRONMENT_SMASH_WALLS
F.mob_size = MOB_SIZE_LARGE
F.speed = 1
@@ -121,7 +121,7 @@
throw_message = "is avoided by the"
retreat_distance = 9
minimum_distance = 9
move_to_delay = 1
move_to_delay = 2
inflate_cooldown = 4
environment_smash = ENVIRONMENT_SMASH_NONE
mob_size = MOB_SIZE_SMALL
@@ -72,7 +72,7 @@
var/parrot_sleep_dur = 25 //Same as above, this is the var that physically counts down
var/parrot_dam_zone = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_ARM, BODY_ZONE_R_LEG) //For humans, select a bodypart to attack
var/parrot_speed = 2.5 //Delay in deciseconds between movement
var/parrot_speed = 5 //"Delay in world ticks between movement." according to byond. Yeah, that's BS but it does directly affect movement. Higher number = slower.
var/parrot_lastmove = null //Updates/Stores position of the parrot while it's moving
var/parrot_stuck = 0 //If parrot_lastmove hasn't changed, this will increment until it reaches parrot_stuck_threshold
var/parrot_stuck_threshold = 10 //if this == parrot_stuck, it'll force the parrot back to wandering
@@ -695,7 +695,7 @@
return
if(!Adjacent(hunted))
stop_automated_movement = TRUE
SSmove_manager.move_to(src, hunted, 0, 1.5)
SSmove_manager.move_to(src, hunted, 0, 3)
if(Adjacent(hunted))
hunt(hunted) // In case it gets next to the target immediately, skip the scan timer and kill it.
return