From 5357a69930a555690650259cc200f75f35547418 Mon Sep 17 00:00:00 2001 From: popertots Date: Sat, 21 Mar 2026 11:56:51 +0000 Subject: [PATCH] feat: stage 2 collision, TileChangedEvent, path invalidation, rabbit digging - Stage 2 collision: convoy skip when entities move same direction (dot>0.7), E/S yield rule for crossings, W/N right-of-way, head-on unchanged - TileChangedEvent (Message) + PathfindingDirtyChunks (Resource) in new tile_changed module - collect_pathfinding_dirty_chunks / invalidate_paths_on_tile_change / clear_pathfinding_dirty_chunks in PathfindingPlugin FixedUpdate chain - TileMap::remove_floor clears HashMap + ChunkData bitsets + tile_ids - RabbitDigTimer component: rabbits dig floor below every 5s, fires TileChangedEvent and TileOcclusionEvent for path invalidation + rendering --- config.toml | 4 +- src/entities/livestock/rabbit.rs | 57 ++++++++ src/entities/shared_systems/pathfinding.rs | 159 ++++++++++++++++++++- src/main.rs | 1 + src/world/mod.rs | 1 + src/world/tiles/components.rs | 44 ------ src/world/tiles/mod.rs | 2 + src/world/tiles/tile_changed.rs | 17 +++ src/world/tiles/tilemap.rs | 28 ++++ 9 files changed, 263 insertions(+), 50 deletions(-) delete mode 100644 src/world/tiles/components.rs create mode 100644 src/world/tiles/tile_changed.rs diff --git a/config.toml b/config.toml index 0acfd90..d96bbfc 100644 --- a/config.toml +++ b/config.toml @@ -1,9 +1,9 @@ -initial_chunk_radius = 8 +initial_chunk_radius = 5 [display] vsync = "mailbox" [spawn_counts] -dorfs = 5 +dorfs = 50 pigs = 5 rabbits = 5 \ No newline at end of file diff --git a/src/entities/livestock/rabbit.rs b/src/entities/livestock/rabbit.rs index 7cc7006..8de484c 100644 --- a/src/entities/livestock/rabbit.rs +++ b/src/entities/livestock/rabbit.rs @@ -1,19 +1,44 @@ use crate::config::GameConfig; +use crate::constants::ITILE_SIZE; use crate::constants::TILE_SIZE; use crate::constants::*; use crate::entities::shared_components::Ambulatory; use crate::game::SpawnDelay; +use crate::world::tiles::visibility::TileOcclusionEvent; +use crate::world::tiles::{TileChangedEvent, TileMap}; use crate::world::VisibleGameEntity; use bevy::prelude::*; use bevy_rand::prelude::*; use rand::RngExt; +/// How often (in seconds) a rabbit digs. +/// 5 seconds at normal speed — slow enough to observe, fast enough to test. +pub const DIG_INTERVAL_SECS: f32 = 5.0; + +/// Tracks time until next dig action. Debug component — rabbits dig to demonstrate +/// the TileChangedEvent + path invalidation pipeline. Remove or replace when +/// real digging mechanics are implemented. +#[derive(Component)] +pub struct RabbitDigTimer { + /// Seconds remaining until next dig. Reset to DIG_INTERVAL_SECS after each dig. + pub secs_remaining: f32, +} + +impl Default for RabbitDigTimer { + fn default() -> Self { + Self { + secs_remaining: DIG_INTERVAL_SECS, + } + } +} + #[derive(Bundle)] pub struct Rabbit { ambulatory: Ambulatory, sprite: Sprite, transform: Transform, visibility: Visibility, + dig_timer: RabbitDigTimer, } impl Rabbit { @@ -36,6 +61,7 @@ impl Rabbit { }, transform: Transform::from_translation(position).with_scale(Vec3::splat(PIXEL_RATIO)), visibility: Visibility::Hidden, + dig_timer: RabbitDigTimer::default(), } } } @@ -77,3 +103,34 @@ pub fn spawn_rabbits( } } } + +/// Debug system: rabbits periodically dig the floor tile beneath them. +/// +/// Removes the FloorTileData at the tile directly below the rabbit's current +/// z-level. Also clears the corresponding ChunkData bits via TileMap::remove_floor. +/// Fires TileChangedEvent so path invalidation reacts automatically. +pub fn rabbit_dig_system( + mut query: Query<(&Transform, &mut RabbitDigTimer)>, + mut tilemap: ResMut, + mut tile_changed: MessageWriter, + mut occlusion: MessageWriter, + time: Res