function deal(ruleset,seed) local n_usable_cards=ruleset.n_usable_cards local n_usable_slots=ruleset.n_slots-1 local tower_height = n_usable_cards\n_usable_slots local r=rnd() -- srand(seed) local slots={} for i=1,n_usable_slots do slots[i]={} end local cards={} for i=1,#ruleset.deck.cards do add(cards,i) end for a in all(ruleset.deck.aces) do del(cards,a) end assert(#cards==n_usable_cards) local slot=0 while #cards>0 do local arr=slots[1+(slot%#slots)] local i=flr(rnd(#cards)) local card=cards[i+1] if (ruleset.deck.instantly_accepted[card] and #arr==0) then -- do not use else add(arr,card,1) deli(cards,i+1) slot+=1 end end for i=1,#slots do assert(#slots[i]==tower_height) end srand(r) return slots end