use super::Keys;
use super::PlayerId;
#[cfg(test)]
use super::{Game, Headless, Next};
use crate::Pointer;
pub struct Context<'a> {
pub keys: &'a Keys,
pub pointer: &'a Pointer,
pub dt: f32,
pub tick: u64,
pub size: (u32, u32),
pub seed: u64,
pub players: usize,
pub me: PlayerId,
}
impl Context<'_> {
pub fn time(&self) -> f32 {
self.tick as f32 * self.dt
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn local_play_is_one_player_and_i_am_the_first() {
use std::cell::Cell;
use std::rc::Rc;
struct Ask(Rc<Cell<Option<(usize, PlayerId)>>>);
impl Game for Ask {
fn update(&mut self, ctx: &mut Context<'_>) -> Next {
self.0.set(Some((ctx.players, ctx.me)));
Next::stay()
}
}
let seen = Rc::new(Cell::new(None));
Headless::new(Ask(Rc::clone(&seen))).step(1);
assert_eq!(seen.get(), Some((1, PlayerId(0))));
}
#[test]
fn time_is_the_tick_count_times_the_step() {
let keys = Keys::new();
let pointer = Pointer::default();
let ctx = Context {
keys: &keys,
pointer: &pointer,
dt: 0.5,
tick: 7,
size: (80, 24),
seed: 1,
players: 1,
me: PlayerId(0),
};
assert_eq!(ctx.time(), 3.5);
}
}