From 90a7aaff286b5bde4e93b9cb8e4675f3e9be5893 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sun, 12 Dec 2021 00:33:59 +0100 Subject: [PATCH] [MIRROR] Reduces the move delay buffer to 1 tick, fixes "Flash stepping" (Is that what the kids are calling it?) [MDB IGNORE] (#10013) * Reduces the move delay buffer to 1 tick (#63332) We've got this delay buffer behavior Idea is basically, if we're just holding down the key, just keep adding to the old delay This way, fractional move delays make sense Was added in this commit 491bdac When it was added, movement was triggered by verbs sent by the client So we needed a big grace window to account for networking delay Don't need that anymore cause we use keyLoop, so let's just cut it all the way down Why? Because right now if you somehow manage to input a move afer move_delay is up but before the window runs out, you will be elidgable for a new move before you visually reach the tile Got a dm from mothblocks about this last night, something about flash stepping? IDK I don't play here Seems silly though, let's sweep this up Oh and mothblocks owes me a pizza, please add this to the commit history so it can be certified as a part of the blockchain * Reduces the move delay buffer to 1 tick, fixes "Flash stepping" (Is that what the kids are calling it?) Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> --- code/modules/mob/mob_movement.dm | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 00885308073..7d75a7323e6 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -27,9 +27,6 @@ else mob.control_object.forceMove(get_step(mob.control_object,direct)) -#define MOVEMENT_DELAY_BUFFER 0.75 -#define MOVEMENT_DELAY_BUFFER_DELTA 1.25 - /** * Move a client in a direction * @@ -69,9 +66,9 @@ /client/Move(new_loc, direct) if(world.time < move_delay) //do not move anything ahead of this check please return FALSE - else - next_move_dir_add = 0 - next_move_dir_sub = 0 + next_move_dir_add = 0 + next_move_dir_sub = 0 + var/old_move_delay = move_delay move_delay = world.time + world.tick_lag //this is here because Move() can now be called mutiple times per tick if(!mob || !mob.loc) @@ -130,7 +127,11 @@ //We are now going to move var/add_delay = mob.cached_multiplicative_slowdown mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay * ( (NSCOMPONENT(direct) && EWCOMPONENT(direct)) ? SQRT_2 : 1 ) )) // set it now in case of pulled objects - if(old_move_delay + (add_delay*MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time) + //If the move was recent, count using old_move_delay + //We want fractional behavior and all + if(old_move_delay + world.tick_lag > world.time) + //Yes this makes smooth movement stutter if add_delay is too fractional + //Yes this is better then the alternative move_delay = old_move_delay else move_delay = world.time @@ -152,6 +153,7 @@ if((direct & (direct - 1)) && mob.loc == new_loc) //moved diagonally successfully add_delay *= SQRT_2 + mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay)) move_delay += add_delay if(.) // If mob is null here, we deserve the runtime