// StarKingdoms.IO, a browser game about drifting through space
// Copyright (C) 2023 ghostly_zsh, TerraMaster85, core
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use crate::component::{PartType, PlanetType};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
pub struct ProtoTransform {
pub x: f32,
pub y: f32,
pub rot: f32,
}
#[macro_export]
macro_rules! proto_transform {
($e:expr) => {
$crate::packet::ProtoTransform {
x: $e.translation.x,
y: $e.translation.y,
rot: $e.rotation.to_euler(bevy::math::EulerRot::ZYX).0,
}
};
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Planet {
pub planet_type: PlanetType,
pub transform: ProtoTransform,
pub radius: f32,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Part {
pub part_type: PartType,
pub transform: ProtoTransform,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum MessageType {
Server,
Error,
Chat,
Direct,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "t", content = "c")]
pub enum Packet {
// serverbound
ClientLogin {
username: String,
jwt: Option<String>,
},
SendMessage {
target: Option<String>,
content: String,
},
PlayerInput {
up: bool,
down: bool,
left: bool,
right: bool,
},
// clientbound
SpawnPlayer {
id: u32,
username: String,
},
PlayerList {
players: Vec<(u32, String)>,
},
PlanetPositions {
planets: Vec<(u32, Planet)>,
},
PartPositions {
parts: Vec<(u32, Part)>,
},
PlayerLeave {
id: u32,
},
Message {
message_type: MessageType,
actor: String,
content: String,
},
}