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:
@@ -30,7 +30,6 @@ impl Pig {
|
|||||||
path_index: 0,
|
path_index: 0,
|
||||||
step_recovery: 0,
|
step_recovery: 0,
|
||||||
validation_cooldown: 0,
|
validation_cooldown: 0,
|
||||||
collision_delay: 0,
|
|
||||||
},
|
},
|
||||||
sprite: Sprite {
|
sprite: Sprite {
|
||||||
image: asset_server.load("pig.png"),
|
image: asset_server.load("pig.png"),
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ impl Rabbit {
|
|||||||
path_index: 0,
|
path_index: 0,
|
||||||
step_recovery: 0,
|
step_recovery: 0,
|
||||||
validation_cooldown: 0,
|
validation_cooldown: 0,
|
||||||
collision_delay: 0,
|
|
||||||
},
|
},
|
||||||
sprite: Sprite {
|
sprite: Sprite {
|
||||||
image: asset_server.load("rabbit.png"),
|
image: asset_server.load("rabbit.png"),
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ impl Dorf {
|
|||||||
path_index: 0,
|
path_index: 0,
|
||||||
step_recovery: 0,
|
step_recovery: 0,
|
||||||
validation_cooldown: 0,
|
validation_cooldown: 0,
|
||||||
collision_delay: 0,
|
|
||||||
},
|
},
|
||||||
sprite: Sprite {
|
sprite: Sprite {
|
||||||
image: asset_server.load("dorf.png"),
|
image: asset_server.load("dorf.png"),
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ pub struct Ambulatory {
|
|||||||
pub target: Option<Vec3>,
|
pub target: Option<Vec3>,
|
||||||
pub step_recovery: u32,
|
pub step_recovery: u32,
|
||||||
pub validation_cooldown: u8,
|
pub validation_cooldown: u8,
|
||||||
pub collision_delay: u8,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Ambulatory {
|
impl Default for Ambulatory {
|
||||||
@@ -23,7 +22,6 @@ impl Default for Ambulatory {
|
|||||||
target: None,
|
target: None,
|
||||||
step_recovery: 0,
|
step_recovery: 0,
|
||||||
validation_cooldown: 0,
|
validation_cooldown: 0,
|
||||||
collision_delay: 0,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 let Some(path) = &ambulatory.current_path {
|
||||||
if ambulatory.path_index < path.len() {
|
if ambulatory.path_index < path.len() {
|
||||||
let next_point = path[ambulatory.path_index];
|
let next_point = path[ambulatory.path_index];
|
||||||
@@ -624,24 +619,21 @@ pub fn movement(
|
|||||||
transform.scale.x = -PIXEL_RATIO;
|
transform.scale.x = -PIXEL_RATIO;
|
||||||
}
|
}
|
||||||
transform.translation = left_point;
|
transform.translation = left_point;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ambulatory.collision_delay = 1;
|
} else {
|
||||||
return;
|
let direction = (next_point - transform.translation).normalize();
|
||||||
}
|
transform.translation = next_point;
|
||||||
|
|
||||||
let direction = (next_point - transform.translation).normalize();
|
if direction.x > 0.0 {
|
||||||
transform.translation = next_point;
|
transform.scale.x = PIXEL_RATIO;
|
||||||
|
} else if direction.x < 0.0 {
|
||||||
|
transform.scale.x = -PIXEL_RATIO;
|
||||||
|
}
|
||||||
|
|
||||||
if direction.x > 0.0 {
|
if transform.translation.distance(next_point) < TILE_SIZE {
|
||||||
transform.scale.x = PIXEL_RATIO;
|
ambulatory.path_index += 1;
|
||||||
} else if direction.x < 0.0 {
|
}
|
||||||
transform.scale.x = -PIXEL_RATIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
if transform.translation.distance(next_point) < TILE_SIZE {
|
|
||||||
ambulatory.path_index += 1;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ambulatory.current_path = None;
|
ambulatory.current_path = None;
|
||||||
|
|||||||
Reference in New Issue
Block a user