Veggerby.Boards.Cards
0.1.0-prerelease0212
dotnet add package Veggerby.Boards.Cards --version 0.1.0-prerelease0212
NuGet\Install-Package Veggerby.Boards.Cards -Version 0.1.0-prerelease0212
<PackageReference Include="Veggerby.Boards.Cards" Version="0.1.0-prerelease0212" />
<PackageVersion Include="Veggerby.Boards.Cards" Version="0.1.0-prerelease0212" />
<PackageReference Include="Veggerby.Boards.Cards" />
paket add Veggerby.Boards.Cards --version 0.1.0-prerelease0212
#r "nuget: Veggerby.Boards.Cards, 0.1.0-prerelease0212"
#:package Veggerby.Boards.Cards@0.1.0-prerelease0212
#addin nuget:?package=Veggerby.Boards.Cards&version=0.1.0-prerelease0212&prerelease
#tool nuget:?package=Veggerby.Boards.Cards&version=0.1.0-prerelease0212&prerelease
Veggerby.Boards.Cards
Deterministic cards and decks module for Veggerby.Boards. Provides card and deck artifacts, ordered piles, and events for create, shuffle, draw, move, and discard. Shuffles use the engine's RNG snapshot for full replay determinism.
Depends on
Veggerby.Boards. Use when you need card mechanics (decks, hands, discard piles) with immutable, event-driven semantics.
Install
dotnet add package Veggerby.Boards.Cards
Scope
Adds:
- Artifacts:
Card,Deckwith named piles - State:
DeckStatewith ordered piles and optional supply counts - Events:
CreateDeckEvent,ShuffleDeckEvent,DrawCardsEvent,MoveCardsEvent,DiscardCardsEvent - Builder:
CardsGameBuilderwiring a minimal open phase and helperCreateInitialDeckEvent()
Not included: UI/AI, network, or game-specific victory logic.
Quick Start
using Veggerby.Boards.Cards;
// Build a minimal cards-capable game
var builder = new CardsGameBuilder();
builder.WithSeed(42UL); // optional: seed RNG for deterministic shuffle
var progress = builder.Compile();
// Initialize deck state (piles)
progress = progress.HandleEvent(builder.CreateInitialDeckEvent());
// Shuffle the draw pile deterministically
var deck = progress.Game.GetArtifact<Deck>("deck-1");
progress = progress.HandleEvent(new ShuffleDeckEvent(deck, CardsGameBuilder.Piles.Draw));
// Draw two cards to hand
progress = progress.HandleEvent(new DrawCardsEvent(deck, CardsGameBuilder.Piles.Draw, CardsGameBuilder.Piles.Hand, 2));
// Inspect state
var ds = progress.State.GetState<DeckState>(deck);
var handCount = ds.Piles[CardsGameBuilder.Piles.Hand].Count; // 2
Key Concepts (Cards Layer)
- Named piles: decks are composed of ordered piles (e.g., draw, hand, discard, in-play). Order is preserved; appends add to the end.
- Deterministic shuffle: uses
GameState.Random(seed viaGameBuilder.WithSeed) so the same inputs produce the same shuffled order. - Immutable snapshots: events never mutate in place; rules gate validity and mutators return a new
GameState. - Declarative intent: events express “what” (draw 2 from draw → hand), rules ensure “can”, mutators implement “how”.
Extending This Module
Examples:
- Multiple decks per game (register additional
Deckartifacts) - Additional piles (e.g., exile, tableau) by declaring them on the
Deck - Supply/gain semantics via a new event (peek, reveal, gain from supply)
- Reshuffle policy when draw is empty (explicit event to move discard → draw and shuffle)
Keep extensions pure and deterministic.
Testing
Run the module tests:
cd test/Veggerby.Boards.Tests
dotnet test --filter "FullyQualifiedName~Cards"
Test Coverage:
- Deck creation and pile initialization
- Deterministic shuffle (parity across runs with same seed)
- Draw operations (single and multiple cards)
- Move and discard operations
- Peek and reveal operations
- Reshuffle mechanics (discard to draw)
- Invalid operation rejection
Known Limitations
- No Visibility Tracking: Revealed cards not tracked by default (extend via extras if needed)
- No Card Effects: Card-specific abilities not implemented (extend for specific games)
- Single Deck Focus: Multi-deck scenarios work but require manual artifact registration
References
- Core Documentation: See /docs/core-concepts.md for engine fundamentals
- Cards Index: See /docs/cards/index.md for detailed module documentation
- Cards Examples: See /docs/cards/examples.md for practical scenarios
- Cards API Reference: See /docs/cards/api-reference.md for complete API
Interop With Core
All transitions are immutable and deterministic. Cards logic is layered on core primitives (events, rules, phases) and does not introduce side effects.
Versioning
Semantic versioning aligned with repository releases. Breaking behavior/API changes bump MAJOR.
Contributing
Open issues & PRs at https://github.com/veggerby/Veggerby.Boards. Follow contribution guidelines and code style.
License
MIT License. See root LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Veggerby.Algorithm (>= 1.0.0)
- Veggerby.Boards (>= 0.1.0-prerelease0212)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Veggerby.Boards.Cards:
| Package | Downloads |
|---|---|
|
Veggerby.Boards.DeckBuilding
Deck-building core scaffolding for Veggerby.Boards: deterministic supply and player zones built on Cards module. |
|
|
Veggerby.Boards.Monopoly
Monopoly implementation components for Veggerby.Boards built atop the core engine. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0-prerelease0212 | 78 | 4/13/2026 |
| 0.1.0-prerelease0211 | 87 | 2/8/2026 |
| 0.1.0-prerelease0210 | 75 | 1/26/2026 |
| 0.1.0-prerelease0209 | 75 | 1/12/2026 |
| 0.1.0-prerelease0208 | 77 | 1/11/2026 |
| 0.1.0-prerelease0207 | 78 | 1/11/2026 |
| 0.1.0-prerelease0206 | 88 | 1/11/2026 |
| 0.1.0-prerelease0205 | 86 | 1/10/2026 |
| 0.1.0-prerelease0204 | 84 | 1/9/2026 |
| 0.1.0-prerelease0203 | 80 | 1/9/2026 |
| 0.1.0-prerelease0202 | 80 | 1/9/2026 |
| 0.1.0-prerelease0201 | 78 | 1/8/2026 |
| 0.1.0-prerelease0200 | 84 | 1/8/2026 |
| 0.1.0-prerelease0199 | 81 | 1/7/2026 |
| 0.1.0-prerelease0198 | 82 | 1/6/2026 |
| 0.1.0-prerelease0197 | 76 | 1/6/2026 |
| 0.1.0-prerelease0196 | 81 | 1/6/2026 |
| 0.1.0-prerelease0195 | 81 | 1/5/2026 |
| 0.1.0-prerelease0194 | 97 | 1/4/2026 |
| 0.1.0-prerelease0193 | 262 | 12/17/2025 |