- 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
98 lines
3.4 KiB
Rust
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),
|
|
});
|
|
}
|
|
}
|
|
}
|