use titan::Payload; use crate::battle::logic_game_object_ref::LogicGameObjectRef; use crate::data::LogicDataRef; pub const COMPONENT_PASSES: usize = 4; pub const OBJECT_TYPE_COUNT: usize = 6; pub const CHARACTER_OBJECT_TYPE: i32 = 5; #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Payload)] pub struct LogicVector2 { #[codec(vint)] pub x: i32, #[codec(vint)] pub y: i32, } impl LogicVector2 { pub fn new(x: i32, y: i32) -> Self { Self { x, y } } } #[derive(Debug, Default, Clone, PartialEq, Eq, Payload)] pub struct LogicGameObject { #[codec(vint)] pub field_28: i32, #[codec(vint)] pub field_56: i32, pub position: LogicVector2, #[codec(vint)] pub owner_index: i32, } impl LogicGameObject { pub fn encode_base(&self, writer: &mut titan::ByteStreamWriter) -> titan::Result<()> { ::encode(self, writer) } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum LogicObjectBody { Character(Box), Summoner(Box), } impl LogicObjectBody { pub fn encode(&self, writer: &mut titan::ByteStreamWriter) -> titan::Result<()> { match self { LogicObjectBody::Character(character) => character.encode(writer), LogicObjectBody::Summoner(summoner) => summoner.encode(writer), } } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct LogicGameObjectEntry { pub data: LogicDataRef, pub global_id: LogicGameObjectRef, pub body: LogicObjectBody, pub components: [Option; COMPONENT_PASSES], } impl LogicGameObjectEntry { pub fn object_type(&self) -> i32 { self.global_id.0.map(|id| id.class_id - 1).unwrap_or(-1) } }