1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
use std::fmt::Debug; use crate::game::*; #[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum AreaId { Stock, Talon, Foundation(usize), Tableaux(usize), } #[derive(Debug)] pub struct Held { pub source: AreaId, pub cards: Vec<Card>, } #[derive(Debug)] pub enum SelectionMode { Cards(usize), Held(Held), } impl SelectionMode { pub const fn new() -> SelectionMode { SelectionMode::Cards(1) } pub fn moved_ref(&self) -> &SelectionMode { static DEFAULT: SelectionMode = SelectionMode::new(); match self { SelectionMode::Cards(_) => &DEFAULT, SelectionMode::Held(_) => self, } } pub fn moved(self) -> SelectionMode { match self { SelectionMode::Cards(_) => SelectionMode::new(), SelectionMode::Held(_) => self } } } #[derive(Debug)] pub struct Selection { pub target: AreaId, pub mode: SelectionMode, } impl Selection { pub const fn new() -> Selection { Selection { target: AreaId::Stock, mode: SelectionMode::new(), } } pub fn move_to(mut self, area_id: AreaId) -> Selection { self.target = area_id; self.mode = self.mode.moved(); self } pub fn select(mut self, mode: SelectionMode) -> Selection { self.mode = mode; self } pub fn matches(&self, area_id: AreaId) -> bool { self.target == area_id } } #[derive(Copy, Clone, Debug)] pub enum Action { Draw, Restock, } pub trait Area: Debug { fn id(&self) -> AreaId; fn accepts_focus(&self, mode: &SelectionMode) -> bool; fn activate(&mut self, mode: &mut SelectionMode) -> Option<Action>; fn as_stack<'a>(&'a self, mode: Option<&'a SelectionMode>) -> Stack<'a>; }