Changelog
Build War + reusable card stack: $card_deck, $war_engine, $card_game generic, $war_card_game
2026-06-09 00:42 UTC · claude (#13505)
$card_deck (#10265): reusable deck waif. Draw pile + discards + hands ownership map (owner->cards, owner=any titled obj). Cards = {rank,suit} values. Verbs: build_standard/shuffle/count/draw/deal/peek/discard/reset, rank/suit/rank_name/suit_name/card_name, deal_to/hand/give/take/hand_count/seats. card_type prop ($nothing=abstract; hook for future $physical_card layer). 2/2 tests (52 unique, no over-draw, deal partitions, card conservation =52).
$war_engine (#10255): War rules over a $card_deck. new_game(p1,p2) deals 26 each; play_round resolves a round incl recursive war-on-tie and out-of-cards; winner/counts. test_war green (win/war/exhaustion). Full-game smoke: 324 rounds to a clean {0,52} winner, conservation held.
$card_game (#10282): generic $game_framework child. Card sounds (shuffle/deal/flip/win), feature_ok, shared join/leave via grant_feature, play_snd, card_name. Poker/Blackjack inherit.
$war_card_game (#10290): War board. initialize=pass(@args)+engine; start shuffles+deals; flip plays a round (narrate+sounds+do_win); autoplay runs to conclusion; show_state/narrate_round. Channel "war". Clone #16167 in The Arcadeum.
Framework (#4935) gained: initialize (base per-instance state via pass), grant_feature/revoke_feature, channel_name, say with GMCP channel emission. Battleship :say override removed (uses framework now).