44 lines
1.3 KiB
Rust
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 };
|
|
}
|
|
} |