#![warn(missing_docs)]
#![recursion_limit = "1024"]
#[macro_use]
extern crate error_chain;
extern crate bytes;
extern crate organelle;
extern crate ctrlc;
extern crate futures;
extern crate glob;
extern crate nalgebra as na;
extern crate protobuf;
extern crate rand;
extern crate regex;
extern crate sc2_proto;
extern crate tokio_core;
extern crate tokio_timer;
extern crate tokio_tungstenite;
extern crate tungstenite;
extern crate url;
extern crate uuid;
mod agent;
mod client;
mod computer;
mod ctrlc_breaker;
mod data;
mod frame;
mod instance;
mod launcher;
mod melee;
mod observer;
use std::collections::HashMap;
use std::path::PathBuf;
use std::rc::Rc;
use futures::sync::mpsc::{ Sender };
use url::Url;
use uuid::Uuid;
pub use self::agent::{ AgentCell };
pub use self::client::{ ClientRequest, ClientResult };
pub use self::computer::{ ComputerCell };
pub use self::ctrlc_breaker::{ CtrlcBreakerCell };
pub use self::data::{
Color,
Rect,
Rect2,
Point2,
Point3,
Vector2,
Vector3,
UnitType,
Ability,
Upgrade,
Buff,
Alliance,
ActionTarget,
Tag,
ImageData,
Visibility,
BuffData,
UpgradeData,
AbilityData,
Effect,
UnitTypeData,
Score,
Unit,
TerrainInfo,
PowerSource,
DisplayType,
SpatialAction,
Action,
Map,
GamePorts,
PortSet,
PlayerSetup,
GameSettings,
Race,
Difficulty,
};
pub use self::frame::{
FrameData,
Command,
DebugCommand,
DebugTextTarget,
MapState,
GameEvent,
GameState,
GameData,
};
pub use self::launcher::{ LauncherCell, LauncherSettings };
pub use self::melee::{ MeleeSuite, MeleeSettings, MeleeCell };
error_chain! {
links {
Organelle(organelle::Error, organelle::ErrorKind) #[doc="organelle glue"];
}
foreign_links {
Io(std::io::Error) #[doc="link io errors"];
UrlParseError(url::ParseError) #[doc="link to url parse errors"];
Protobuf(protobuf::ProtobufError) #[doc="link to protobuf errors"];
}
errors {
ExeNotSpecified {
description("exe not specified")
display("StarCraft II exe was not specified")
}
ExeDoesNotExist(exe: PathBuf) {
description("exe file does not exist")
display("StarCraft II exe does not exist at {:?}", exe)
}
ClientOpenFailed {
description("unable to open connection to the game instance")
display("client open failed")
}
ClientSendFailed {
description("unable to send message to the game instance")
display("client send failed")
}
ClientRecvFailed {
description("unable to receive message from game instance")
display("client recv failed")
}
ClientCloseFailed {
description("unable to initiate close handshake")
display("client close failed")
}
GameErrors(errors: Vec<String>) {
description("errors in game response")
display("received errors: {:?}", errors)
}
AgentError {
description("error occurred in agent callback")
display("error occurred in agent callback")
}
InvalidProtobuf(msg: String) {
description("unable to convert protobuf data to game data")
display("unable to convert protobuf data: {}", msg)
}
}
}
trait FromProto<T> where Self: Sized {
fn from_proto(p: T) -> Result<Self>;
}
trait IntoSc2<T> {
fn into_sc2(self) -> Result<T>;
}
impl<T, U> IntoSc2<U> for T where U: FromProto<T> {
fn into_sc2(self) -> Result<U> {
U::from_proto(self)
}
}
trait IntoProto<T> {
fn into_proto(self) -> Result<T>;
}
#[derive(Debug)]
pub enum Message {
GetInstancePool,
GetPortsPool,
LaunchInstance,
InstancePool(HashMap<Uuid, (Url, PortSet)>),
PortsPool(Vec<GamePorts>),
ProvideInstance(Uuid, Url),
ClientAttemptConnect(Url),
ClientConnected(Sender<tungstenite::Message>),
ClientReceive(tungstenite::Message),
ClientRequest(ClientRequest),
ClientResult(ClientResult),
ClientTimeout(Uuid),
ClientDisconnect,
ClientClosed,
ClientError(Rc<Error>),
Ready,
RequestPlayerSetup(GameSettings),
PlayerSetup(PlayerSetup),
CreateGame(GameSettings, Vec<PlayerSetup>),
GameCreated,
GameReady(PlayerSetup, Option<GamePorts>),
JoinGame(GamePorts),
FetchGameData,
GameDataReady,
RequestUpdateInterval,
UpdateInterval(u32),
GameStarted,
Observe,
Observation(Rc<FrameData>),
Command(Command),
DebugCommand(DebugCommand),
UpdateComplete,
GameEnded,
}
#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)]
pub enum Role {
Launcher,
InstancePool,
InstanceProvider,
Controller,
Agent,
Client,
Observer,
}
pub type Organelle = organelle::Organelle<Message, Role>;
pub type Soma = organelle::Soma<Message, Role>;
pub type Eukaryote<T> = organelle::Eukaryote<Message, Role, T>;