Files
dorf/src/world/mod.rs
T
popertots 5357a69930 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
2026-03-21 11:56:51 +00:00

98 lines
3.4 KiB
Rust

use crate::{
camera,
config::{GameConfig, VsyncMode},
world::generation::{
apply_terrain_blobs, generate_chunk_fauna, generate_chunk_foliage,
generate_chunk_forrestry, generate_chunk_weathering_and_precipitation, spawn_terrain_tasks,
TerrainBlobStorage,
},
};
use bevy::prelude::*;
pub mod chunks;
pub mod generation;
pub mod textures;
pub mod tiles;
pub use chunks::management::*;
pub use textures::management::*;
pub use tiles::{rendering::*, visibility::*};
pub fn apply_vsync_setting(config: Res<GameConfig>, mut windows: Query<&mut Window>) {
if config.is_changed() {
if let Ok(mut window) = windows.single_mut() {
window.present_mode = match config.display.vsync {
VsyncMode::Vsync => bevy::window::PresentMode::AutoVsync,
VsyncMode::Mailbox => bevy::window::PresentMode::Mailbox,
VsyncMode::Uncapped => bevy::window::PresentMode::AutoNoVsync,
};
}
}
}
pub struct WorldPlugin;
impl Plugin for WorldPlugin {
fn build(&self, app: &mut App) {
app.init_resource::<ChunkMap>()
.init_resource::<TerrainBlobStorage>()
.init_resource::<tiles::TilemapBenchmark>()
.init_resource::<tiles::TilemapChunkRegistry>()
.init_resource::<tiles::TilemapChunkStates>()
.init_resource::<tiles::TilemapChunkSpawner>()
.init_resource::<tiles::PreviousZIndex>()
.add_message::<GenerateChunkEvent>()
.add_message::<ChunkTerrainEvent>()
.add_message::<ChunkWeatheringAndPrecipitationEvent>()
.add_message::<ChunkForrestryEvent>()
.add_message::<ChunkFoliageEvent>()
.add_message::<ChunkFaunaEvent>()
.add_message::<TileOcclusionEvent>()
.add_message::<tiles::TileChangedEvent>()
.add_systems(Startup, (setup_chunk_system, setup_initial_chunks).chain())
.add_systems(
FixedUpdate,
(
handle_chunk_events,
update_chunk_connectivity,
tiles::despawn_tilemap_chunks,
spawn_terrain_tasks,
apply_terrain_blobs,
generate_chunk_weathering_and_precipitation,
generate_chunk_forrestry,
generate_chunk_foliage,
generate_chunk_fauna,
),
)
.add_systems(
Update,
(
compute_visibility_of_game_entities
.after(crate::entities::item::item_tile_management_system),
tiles::track_benchmark,
tiles::render_bench_report_system,
apply_vsync_setting,
handle_tile_occlusion_updates,
tiles::spawn_tilemap_chunks,
tiles::on_camera_z_changed,
tiles::update_tilemap_chunk_visibility,
tiles::populate_tilemap_chunk_data,
),
);
}
}
fn setup_initial_chunks(
mut event_writer: MessageWriter<GenerateChunkEvent>,
config: Res<GameConfig>,
) {
let radius = config.initial_chunk_radius;
for x in -radius..=radius {
for y in -radius..=radius {
event_writer.write(GenerateChunkEvent {
chunk_position: IVec2::new(x, y),
});
}
}
}