use crate::mouse::MouseState;
use crate::gameplay_modes::{ModeId,StageId};

#[derive(Clone,Copy,Hash,Eq,PartialEq,Ord,PartialOrd,Debug)]
pub enum TimeInner{}
pub type Time=crate::integer::Time<TimeInner>;

#[derive(Clone,Debug)]
pub enum Instruction{
	Mouse(MouseInstruction),
	SetControl(SetControlInstruction),
	Mode(ModeInstruction),
	Misc(MiscInstruction),
	/// Idle: there were no input events, but the simulation is safe to advance to this timestep
	Idle,
}
impl Instruction{
	pub const IDLE:Self=Self::Idle;
}
#[derive(Clone,Debug)]
pub enum MouseInstruction{
	/// Replace the entire interpolation state to avoid dividing by zero when replacing twice
	ReplaceMouse{
		m0:MouseState<TimeInner>,
		m1:MouseState<TimeInner>,
	},
	SetNextMouse(MouseState<TimeInner>),
}
#[derive(Clone,Debug)]
pub enum SetControlInstruction{
	SetMoveRight(bool),
	SetMoveUp(bool),
	SetMoveBack(bool),
	SetMoveLeft(bool),
	SetMoveDown(bool),
	SetMoveForward(bool),
	SetJump(bool),
	SetZoom(bool),
	SetSprint(bool),
}
#[derive(Clone,Debug)]
pub enum ModeInstruction{
	/// Reset: fully replace the physics state.
	/// This forgets all inputs and settings which need to be reapplied.
	Reset,
	/// Restart: Teleport to the start zone.
	/// This runs when you press R or teleport to a bonus
	Restart(ModeId),
	/// Spawn: Teleport to a specific mode's spawn
	/// This runs when the map loads to put you at the map lobby
	Spawn(ModeId,StageId),
}
#[derive(Clone,Debug)]
pub enum MiscInstruction{
	PracticeFly,
	SetSensitivity(crate::integer::Ratio64Vec2),
}
