//! Task executor system — the dispatcher that drives entity behaviour. //! //! Runs in FixedUpdate. For each entity with TaskQueue: //! 1. If no active task, pop front of queue → set TaskState::Active //! 2. Match on active Task variant, execute corresponding logic //! 3. On completion/failure, update TaskState, fire event, pop task //! 4. If queue empty after pop, assign default Task::Idle //! //! Uses Changed + Changed to minimize queries. use crate::constants::ITILE_SIZE; use crate::entities::shared_components::Ambulatory; use crate::entities::tasks::components::{Task, TaskQueue, TaskState}; use crate::entities::tasks::events::{TaskClaimed, TaskCompleted, TaskFailed}; use crate::entities::tasks::idle::execute_idle; use crate::world::tiles::tilemap::TileMap; use bevy::prelude::*; use bevy_rand::prelude::*; use rand::{RngExt, SeedableRng}; /// Main task executor. Runs in FixedUpdate. pub fn task_executor_system( mut commands: Commands, tilemap: Res, time: Res