use serde_derive::{Deserialize, Serialize};
pub mod input;
pub mod output;
pub mod runtime;
pub mod serial;
use input::*;
use output::*;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Info {
name: String,
step_interval: u32,
players: Vec<Player>,
}
impl Info {
pub fn new(
name: &str,
steps_per_second: i32,
number_of_players: i32,
input: InputDeviceType,
) -> Self {
let player = Player { input };
let mut players = Vec::with_capacity(number_of_players as usize);
for _ in 0..number_of_players {
players.push(player.clone());
}
Self {
name: name.to_string(),
step_interval: Self::steps_per_second_to_interval(steps_per_second),
players,
}
}
pub fn name(&self) -> &str {
&self.name
}
pub fn step_interval(&self) -> u32 {
self.step_interval
}
pub fn steps_per_second(&self) -> u32 {
1_000_000_000 / self.step_interval
}
pub fn steps_per_second_to_interval(steps: i32) -> u32 {
1_000_000_000 / steps as u32
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
struct Player {
input: InputDeviceType,
}
pub trait Game {
fn step(&mut self, arguments: &StepArguments);
fn draw(&self, arguments: &DrawArguments) -> Image;
fn render_audio(&self, arguments: &RenderAudioArguments) -> Sound;
}
#[derive(Serialize, Deserialize, Default)]
pub struct StepArguments {
input: InputArguments,
}
impl StepArguments {
pub fn new(input: InputArguments) -> Self {
Self { input }
}
pub fn input(&self) -> &InputArguments {
&self.input
}
}
#[derive(Serialize, Deserialize, Default)]
pub struct InputArguments {
players: Vec<Option<PlayerInputArguments>>,
}
impl InputArguments {
pub fn new(players: Vec<Option<PlayerInputArguments>>) -> Self {
Self { players }
}
pub fn player(&self, player: i32) -> Option<&PlayerInputArguments> {
let player = self.players.get(player as usize);
if let Some(player) = player {
return player.as_ref();
}
None
}
}
#[derive(Serialize, Deserialize)]
pub struct PlayerInputArguments {
input: InputDevice,
}
impl PlayerInputArguments {
pub fn nes(&self) -> Option<&Nes> {
if let InputDevice::Nes(ref nes) = self.input {
return Some(nes);
}
None
}
pub fn controller(&self) -> Option<&Controller> {
if let InputDevice::Controller(ref nes) = self.input {
return Some(nes);
}
None
}
pub fn keyboard(&self) -> Option<&Keyboard> {
if let InputDevice::Keyboard(ref nes) = self.input {
return Some(nes);
}
None
}
}
#[derive(Serialize, Deserialize, Debug)]
pub struct DrawArguments {
width: i32,
height: i32,
step_offset: f32,
}
impl DrawArguments {
pub fn new(width: i32, height: i32, step_offset: f32) -> Self {
Self {
width,
height,
step_offset,
}
}
pub fn width(&self) -> i32 {
self.width
}
pub fn height(&self) -> i32 {
self.height
}
pub fn step_offset(&self) -> f32 {
self.step_offset
}
}
#[derive(Serialize, Deserialize, Debug)]
pub struct RenderAudioArguments {}