use evy_engine_core::{
CommitPolicy, DispatchCtx, DispatchNode, Engine, EngineKind, EvyComponent, Goldilocks,
HasDialect, Namespace, ParticleId, Dialect, ShardRef,
};
struct GameState {
tick: u64,
}
impl HasDialect for GameState {
const DIALECT: Dialect = ParticleId::from_hash([0x01; 32]);
}
impl EvyComponent for GameState {
const NAMESPACE: Namespace = Namespace::Ephemeral;
fn to_goldilocks(&self) -> Vec<Goldilocks> {
vec![Goldilocks::new(self.tick)]
}
fn from_goldilocks(slice: &[Goldilocks]) -> Self {
Self {
tick: slice[0].as_u64(),
}
}
}
struct TickCounterNode {
particle: ParticleId,
}
impl DispatchNode for TickCounterNode {
fn engine(&self) -> EngineKind {
EngineKind::Cpu
}
fn reads(&self) -> &[ShardRef] {
&[]
}
fn writes(&self) -> &[ShardRef] {
&[]
}
fn commit_policy(&self) -> CommitPolicy {
CommitPolicy::None
}
fn dispatch(&mut self, ctx: &mut DispatchCtx<'_>) {
let next = ctx
.storage
.get::<GameState>(self.particle)
.map(|s| s.tick + 1)
.unwrap_or(0);
ctx.storage.put(self.particle, &GameState { tick: next });
}
}
fn main() {
println!("evy hello โ building engine...");
let mut engine = Engine::builder()
.without_radio() .build()
.expect("engine build");
println!(" platform engines: {:?}", engine.capabilities().engines);
println!(
" thermal class: {:?}",
engine.capabilities().thermal_budget
);
println!(
" default tick_hz: {}",
engine.capabilities().tick_rate_hz
);
engine
.dialect_registry_mut()
.register::<GameState>()
.expect("dialect registration");
println!("\nregistered dialects: {}", engine.dialect_registry().len());
let particle = ParticleId::from_entity(42, 0);
engine.add_node(Box::new(TickCounterNode { particle }));
println!("dispatch nodes: {}", engine.node_count());
println!("\nrunning 5 frames...");
for _ in 0..5 {
engine.run_frame().expect("dispatch");
}
println!(" frame counter: {}", engine.frame());
let state = engine.storage().get::<GameState>(particle).expect("state");
println!(" particle tick: {}", state.tick);
let root = engine.commit_tick();
println!("\ntick committed, shard sub-root = {:02x}{:02x}{:02x}{:02x}โฆ",
root[0], root[1], root[2], root[3]);
println!(" tick counter: {}", engine.tick());
println!("\ndone.");
}