use bevy::ecs::entity::MapEntities;
use crate::prelude::*;
use serde::{Deserialize, Serialize};
use std::ops::Deref;
#[derive(Component, Serialize, Deserialize)]
/// The primary component for a ship structure
pub struct Ship;
#[derive(Component, Serialize, Deserialize, MapEntities)]
#[relationship_target(relationship = PartInShip, linked_spawn)]
pub struct Parts(#[entities] Vec<Entity>);
#[derive(Component, Serialize, Deserialize, MapEntities)]
#[relationship(relationship_target = Parts)]
pub struct PartInShip(#[entities] pub Entity);
#[derive(Component, Serialize, Deserialize)]
#[require(Transform)]
pub struct Joint {
pub id: JointId,
pub transform: Transform,
}
#[derive(Component, Serialize, Deserialize, MapEntities)]
pub struct Peer {
#[entities]
pub peer_joint_entity_id: Entity,
pub processed: bool,
#[entities]
pub physics_joint: Entity
}
#[derive(Component, Serialize, Deserialize, MapEntities)]
#[relationship(relationship_target = Joints)]
pub struct JointOf(#[entities] pub Entity);
#[derive(Component, Serialize, Deserialize, MapEntities, Debug, Clone)]
#[relationship_target(relationship = JointOf)]
pub struct Joints(#[entities] Vec<Entity>);
impl Deref for Joints {
type Target = Vec<Entity>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[derive(Component, Serialize, Deserialize, MapEntities)]
#[relationship(relationship_target = Snaps)]
pub struct SnapOf(#[entities] pub Entity);
#[derive(Component, Serialize, Deserialize, MapEntities)]
#[relationship_target(relationship = SnapOf)]
pub struct Snaps(#[entities] Vec<Entity>);
impl Deref for Snaps {
type Target = Vec<Entity>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[derive(Serialize, Deserialize, PartialEq, Eq, Clone)]
pub struct JointId(pub String);
impl JointId {
#[must_use]
pub fn from_part_and_joint_id(part: impl AsRef<str>, joint: impl AsRef<str>) -> Self {
Self(format!("{}:{}", part.as_ref(), joint.as_ref()))
}
}
#[derive(Serialize, Deserialize, Component, MapEntities)]
pub struct SnapOfJoint(#[entities] pub Entity);