/// Game solving mode.
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SolvingMode {
/// Forward solving mode
///
/// - pusher is allowed to push single box at the time
/// - pusher can't pull boxes
/// - pusher can't jump over boxes or walls
#[default]
Forward,
/// Reverse solving mode
///
/// When game is started, positions of box and goal are switched and game
/// starts in solved state.
///
/// Pusher can only pull boxes, not push them. If position allows a pull,
/// that pull is optional (pusher is allowed to move without pull even if
/// pull is possible).
///
/// Pusher is allowed to jump over boxes, walls and other pushers. Jumps are
/// allowed only before first box had been pulled.
///
/// When game is started in reverse solving mode, pusher may end up standing
/// "on top" of a box. I that case first move for that pusher must be jump.
///
/// Jumping after first pull can be optionally enabled if that helps
/// searching for board solution.
Reverse,
}