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); #[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)] #[relationship_target(relationship = JointOf)] pub struct Joints(#[entities] Vec); impl Deref for Joints { type Target = Vec; 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); impl Deref for Snaps { type Target = Vec; 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, joint: impl AsRef) -> Self { Self(format!("{}:{}", part.as_ref(), joint.as_ref())) } } #[derive(Serialize, Deserialize, Component, MapEntities)] pub struct SnapOfJoint(#[entities] pub Entity);