use crate::prelude::*;
use serde::{Deserialize, Serialize};
use std::fmt::Debug;
mod object_behavior;
pub use self::object_behavior::*;
#[derive(Debug, Clone)]
pub struct Object<'a, T> {
pub id: Id,
pub description: ObjectDescription<T>,
pub behavior: &'a dyn ObjectBehavior<T>,
}
#[derive(Debug, Clone)]
pub enum Action<T> {
ApplyForce(Force),
Spawn(ObjectDescription<T>, Box<dyn ObjectBehavior<T>>),
Destroy(Id),
DestroySelf,
}
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ObjectDescription<T> {
pub shape: Polygon,
pub location: Point,
pub rotation: Radians,
pub mobility: Mobility,
pub passable: bool,
pub associated_data: T,
}
pub trait AssociatedObjectData = Clone + Debug + PartialEq + 'static;
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
pub enum Mobility {
Immovable,
Movable(Vector),
}
#[derive(Debug, PartialEq, Clone, Default)]
pub struct Force {
pub linear: Vector,
pub torque: Torque,
}
#[derive(Debug, PartialEq, Clone, Default)]
pub struct Torque(pub f64);