use std::path::PathBuf;
use sc2_proto::sc2api;
use super::super::{ Result, FromProto, IntoSc2 };
use super::{ Point2, Rect2, ImageData };
#[allow(missing_docs)]
#[derive(Debug, Copy, Clone)]
pub enum GameResult {
Win,
Loss,
Tie,
Undecided,
}
#[derive(Debug, Copy, Clone)]
pub struct PlayerResult {
pub player_id: u32,
pub result: GameResult
}
impl FromProto<sc2api::Result> for GameResult {
fn from_proto(r: sc2api::Result) -> Result<GameResult> {
Ok(
match r {
sc2api::Result::Victory => GameResult::Win,
sc2api::Result::Defeat => GameResult::Loss,
sc2api::Result::Tie => GameResult::Tie,
sc2api::Result::Undecided => GameResult::Undecided,
}
)
}
}
#[derive(Debug, Clone)]
pub enum Map {
LocalMap(PathBuf),
BlizzardMap(String),
}
#[allow(missing_docs)]
#[derive(Debug, Copy, Clone)]
pub struct PortSet {
pub game_port: u16,
pub base_port: u16
}
#[allow(missing_docs)]
#[derive(Debug, Clone)]
pub struct GamePorts {
pub shared_port: u16,
pub server_ports: PortSet,
pub client_ports: Vec<PortSet>
}
#[derive(Debug, Clone)]
pub struct GameSettings {
pub map: Map,
}
#[derive(Debug, Clone)]
pub struct TerrainInfo {
pub width: i32,
pub height: i32,
pub pathing_grid: ImageData,
pub placement_grid: ImageData,
pub terrain_height: ImageData,
pub playable_area: Rect2,
pub enemy_start_locations: Vec<Point2>,
}
impl FromProto<sc2api::ResponseGameInfo> for TerrainInfo {
fn from_proto(mut info: sc2api::ResponseGameInfo) -> Result<Self> {
let mut start_raw = info.take_start_raw();
Ok(
Self {
width: start_raw.get_map_size().get_x(),
height: start_raw.get_map_size().get_y(),
pathing_grid: start_raw.take_pathing_grid().into_sc2()?,
placement_grid: start_raw.take_placement_grid().into_sc2()?,
terrain_height: start_raw.take_terrain_height().into_sc2()?,
playable_area: {
let area = start_raw.get_playable_area();
Rect2 {
from: Point2::new(
area.get_p0().get_x() as f32,
area.get_p0().get_y() as f32
),
to: Point2::new(
area.get_p1().get_x() as f32,
area.get_p1().get_y() as f32
)
}
},
enemy_start_locations: start_raw.take_start_locations()
.into_iter().map(
|p| Point2::new(p.get_x() as f32, p.get_y() as f32)
).collect(),
}
)
}
}