use super::*;
use crate::game_events::{
GameSCmdAbil, GameSCmdData, GameSCmdDataTargetUnit, GameSCmdEvent, GameSMapCoord3D,
};
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct SC2UnitCmd {
pub cmd_flags: i64,
pub abil: Option<SC2UnitCmdAbil>,
pub data: SC2UnitCmdData,
pub sequence: i64,
pub other_unit: Option<u32>,
pub other_unit_name: Option<String>,
pub unit_group: Option<u32>,
}
impl SC2UnitCmd {
pub fn set_data_target_point(&mut self, coord: GameSMapCoord3D) {
self.data = SC2UnitCmdData::TargetPoint(coord.into());
}
pub fn set_data_target_unit(&mut self, target: SC2UnitCmdDataTargetUnit) {
self.data = SC2UnitCmdData::TargetUnit(target);
}
}
impl From<GameSCmdEvent> for SC2UnitCmd {
fn from(event: GameSCmdEvent) -> Self {
SC2UnitCmd {
cmd_flags: event.m_cmd_flags,
abil: event.m_abil.map(|abil| abil.into()),
data: event.m_data.into(),
sequence: event.m_sequence,
other_unit: event.m_other_unit,
other_unit_name: None,
unit_group: event.m_unit_group,
}
}
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct SC2UnitCmdAbil {
pub abil_link: u16,
pub ability: String,
pub abil_cmd_index: i64,
pub abil_cmd_data: Option<u8>,
}
impl From<GameSCmdAbil> for SC2UnitCmdAbil {
fn from(event: GameSCmdAbil) -> Self {
SC2UnitCmdAbil {
abil_link: event.m_abil_link,
ability: event.ability,
abil_cmd_index: event.m_abil_cmd_index,
abil_cmd_data: event.m_abil_cmd_data,
}
}
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub enum SC2UnitCmdData {
#[default]
None,
TargetPoint(Vec3D),
TargetUnit(SC2UnitCmdDataTargetUnit),
Data(u32),
}
impl From<GameSCmdData> for SC2UnitCmdData {
fn from(event: GameSCmdData) -> Self {
match event {
GameSCmdData::None => SC2UnitCmdData::None,
GameSCmdData::TargetPoint(point) => SC2UnitCmdData::TargetPoint(point.into()),
GameSCmdData::TargetUnit(unit) => SC2UnitCmdData::TargetUnit(unit.into()),
GameSCmdData::Data(data) => SC2UnitCmdData::Data(data),
}
}
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct SC2UnitCmdDataTargetUnit {
pub target_unit_flags: u16,
pub timer: u8,
pub tag: u32,
pub snapshot_unit_link: u16,
pub snapshot_control_player_id: Option<i64>,
pub snapshot_upkeep_player_id: Option<i64>,
pub snapshot_point: Vec3D,
}
impl From<GameSCmdDataTargetUnit> for SC2UnitCmdDataTargetUnit {
fn from(event: GameSCmdDataTargetUnit) -> Self {
SC2UnitCmdDataTargetUnit {
target_unit_flags: event.m_target_unit_flags,
timer: event.m_timer,
tag: event.m_tag,
snapshot_unit_link: event.m_snapshot_unit_link,
snapshot_control_player_id: event.m_snapshot_control_player_id,
snapshot_upkeep_player_id: event.m_snapshot_upkeep_player_id,
snapshot_point: event.m_snapshot_point.into(),
}
}
}