use bevy_ecs::prelude::*;
use rig_ecs::agent::CallOf;
use rig_ecs::stage::{Effect, EffectRequest, ForAgent, Settled, SupersededBy};
use rig_ecs::tools::ToolRequest;
use rig_ecs::turn::{ModelRequest, SideCall, TurnCall};
use crate::load::ProvidedBy;
pub fn resend(effect: Entity) -> impl Command {
move |world: &mut World| {
let Ok(old) = world.get_entity(effect) else {
return;
};
let Some(was) = old.get::<Effect>() else {
return;
};
if old.contains::<Settled>() || old.contains::<SupersededBy>() {
return;
}
let mut again = Effect::with_parent_id(was.parent);
again.purpose.clone_from(&was.purpose);
let turn_call = old.contains::<TurnCall>();
let build_from = old.get::<SideCall>().copied();
let copied = if turn_call || build_from.is_some() {
(None, None, None)
} else {
(
old.get::<ModelRequest>().cloned(),
old.get::<EffectRequest>().cloned(),
old.get::<ToolRequest>().cloned(),
)
};
let call_of = old.get::<CallOf>().map(|&CallOf(turn)| CallOf(turn));
let agent = old
.get::<ForAgent>()
.map(|&ForAgent(agent)| ForAgent(agent));
let child_of = old.get::<ChildOf>().map(|of| ChildOf(of.parent()));
let provided = old
.get::<ProvidedBy>()
.map(|&ProvidedBy(by)| ProvidedBy(by));
let name = old.get::<Name>().cloned();
let mut successor = world.spawn(again);
successor.add_related::<SupersededBy>(&[effect]);
if turn_call {
successor.insert(TurnCall);
}
let (model, request, tool) = copied;
insert(&mut successor, build_from);
insert(&mut successor, model);
insert(&mut successor, request);
insert(&mut successor, tool);
insert(&mut successor, call_of);
insert(&mut successor, agent);
insert(&mut successor, child_of);
insert(&mut successor, provided);
insert(&mut successor, name);
}
}
fn insert(entity: &mut EntityWorldMut, component: Option<impl Component>) {
if let Some(component) = component {
entity.insert(component);
}
}
#[cfg(test)]
mod tests;