44 lines
1.3 KiB
Rust

use crate::{pico_rng::PicoRng, ruleset::{Card, Setup}};
pub struct Deal {
pub slots: Vec<Vec<Card>>,
}
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<Card>> = 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 };
}
}