fix: remove collision_delay to eliminate movement deadlock

collision_delay was causing entities to skip step_recovery ticks, freezing
movement whenever the next tile was occupied. Combined with the ordering fix
(collision_delay placed before step_recovery), entities were stuck at
path_index=0 indefinitely in spawn clusters.

Remove collision_delay entirely — step_recovery already provides the
per-tick pacing, and the natural next-tick retry (via left-step or
normal movement) handles occupied tiles without an artificial delay.

Actual thresholds (grass weight=50): dorfs move after 6 ticks, pigs after
26 ticks, rabbits after 2 ticks. Without collision_delay interference,
movement is now governed purely by step_recovery.
This commit is contained in:
2026-03-21 10:21:44 +00:00
parent e60d057276
commit dd703f05f3
5 changed files with 11 additions and 24 deletions
+11 -19
View File
@@ -592,11 +592,6 @@ pub fn movement(
}
}
if ambulatory.collision_delay > 0 {
ambulatory.collision_delay -= 1;
return;
}
if let Some(path) = &ambulatory.current_path {
if ambulatory.path_index < path.len() {
let next_point = path[ambulatory.path_index];
@@ -624,24 +619,21 @@ pub fn movement(
transform.scale.x = -PIXEL_RATIO;
}
transform.translation = left_point;
return;
}
}
ambulatory.collision_delay = 1;
return;
}
} else {
let direction = (next_point - transform.translation).normalize();
transform.translation = next_point;
let direction = (next_point - transform.translation).normalize();
transform.translation = next_point;
if direction.x > 0.0 {
transform.scale.x = PIXEL_RATIO;
} else if direction.x < 0.0 {
transform.scale.x = -PIXEL_RATIO;
}
if direction.x > 0.0 {
transform.scale.x = PIXEL_RATIO;
} else if direction.x < 0.0 {
transform.scale.x = -PIXEL_RATIO;
}
if transform.translation.distance(next_point) < TILE_SIZE {
ambulatory.path_index += 1;
if transform.translation.distance(next_point) < TILE_SIZE {
ambulatory.path_index += 1;
}
}
} else {
ambulatory.current_path = None;