use crate::{pico_rng::PicoRng, ruleset::{Card, Setup}}; pub struct Deal { pub slots: Vec>, } impl Deal { pub fn deal(setup: &Setup, seed: u32) -> Deal { let n_usable_cards = setup.ruleset.usable_n_cards(); let n_usable_slots = setup.ruleset.n_slots - 1; let tower_height = n_usable_cards / n_usable_slots; let mut rng = PicoRng::srand(seed); let mut slots: Vec> = vec![vec![]; n_usable_slots as usize]; let mut cards= vec![]; for i in 0..setup.deck.cards.len() { let card = Card(i as u8); if !setup.deck.aces.contains(&card) { cards.push(card); } } let mut slot= 0; while cards.len() > 0 { let n = slots.len(); let arr = &mut slots[slot % n]; let i = (rng.rnd((cards.len() * 0x10000) as u32) / 0x10000) as usize; let card = cards[i]; if setup.deck.instantly_accepted.contains(&card) && arr.len() == 0 { // do not use } else { arr.insert(0, card); cards.remove(i); slot += 1; } } for i in 0..slots.len() { assert_eq!(tower_height as usize, slots[i].len()); } return Deal { slots }; } }