A definition is identified by role.type and named role.type.lang (package.lang for packages). Code blocks declare it via role= on the info string; real files by their filename. Blocks and files without a matching role.type are ignored. file= still overrides the auto-name. Relative asset and $variants paths now resolve against the markdown file's directory (baseDir) rather than the virtual name. Same role.type with different ids groups under one name; duplicate type#id still errors. Migrate fixtures and example games to role=.
146 lines
3.7 KiB
Markdown
146 lines
3.7 KiB
Markdown
# Poker
|
||
|
||
A standard 52-card poker deck, laid out on a table with a draw pile and
|
||
community-card slots. Exercises the bgm loader's `$variants` expansion to
|
||
generate a full deck from a single part definition.
|
||
|
||
```yaml role=package
|
||
id: poker
|
||
title: Poker
|
||
designer: Public Domain
|
||
players: 9
|
||
language: en
|
||
include: ['./**/*.yaml']
|
||
```
|
||
|
||
## Parts
|
||
|
||
A single `card` part expanded into 52 cards by the `$variants` CSV. Each row
|
||
picks a cell from the `13×4` face sheet (`cards-13x4.jpg`) — 13 ranks across,
|
||
4 suits down. All cards share the same back from the `4×1` back sheet
|
||
(`back-4x1.png`).
|
||
|
||
```yaml role=part.card
|
||
face: ./cards-13x4.jpg
|
||
back: ./back-4x1.png
|
||
size: [63, 88, 0.3]
|
||
fillet: 2
|
||
$variants: ./cards.csv
|
||
```
|
||
|
||
```csv file=cards.csv
|
||
id,rank,suit,faceCrop,backCrop
|
||
string,string,string,[number;number;number;number],[number;number;number;number]
|
||
2s,2,spades,[0;0;13;4],[0;0;4;1]
|
||
3s,3,spades,[1;0;13;4],[0;0;4;1]
|
||
4s,4,spades,[2;0;13;4],[0;0;4;1]
|
||
5s,5,spades,[3;0;13;4],[0;0;4;1]
|
||
6s,6,spades,[4;0;13;4],[0;0;4;1]
|
||
7s,7,spades,[5;0;13;4],[0;0;4;1]
|
||
8s,8,spades,[6;0;13;4],[0;0;4;1]
|
||
9s,9,spades,[7;0;13;4],[0;0;4;1]
|
||
10s,10,spades,[8;0;13;4],[0;0;4;1]
|
||
js,J,spades,[9;0;13;4],[0;0;4;1]
|
||
qs,Q,spades,[10;0;13;4],[0;0;4;1]
|
||
ks,K,spades,[11;0;13;4],[0;0;4;1]
|
||
as,A,spades,[12;0;13;4],[0;0;4;1]
|
||
2h,2,hearts,[0;1;13;4],[0;0;4;1]
|
||
3h,3,hearts,[1;1;13;4],[0;0;4;1]
|
||
4h,4,hearts,[2;1;13;4],[0;0;4;1]
|
||
5h,5,hearts,[3;1;13;4],[0;0;4;1]
|
||
6h,6,hearts,[4;1;13;4],[0;0;4;1]
|
||
7h,7,hearts,[5;1;13;4],[0;0;4;1]
|
||
8h,8,hearts,[6;1;13;4],[0;0;4;1]
|
||
9h,9,hearts,[7;1;13;4],[0;0;4;1]
|
||
10h,10,hearts,[8;1;13;4],[0;0;4;1]
|
||
jh,J,hearts,[9;1;13;4],[0;0;4;1]
|
||
qh,Q,hearts,[10;1;13;4],[0;0;4;1]
|
||
kh,K,hearts,[11;1;13;4],[0;0;4;1]
|
||
ah,A,hearts,[12;1;13;4],[0;0;4;1]
|
||
2d,2,diamonds,[0;2;13;4],[0;0;4;1]
|
||
3d,3,diamonds,[1;2;13;4],[0;0;4;1]
|
||
4d,4,diamonds,[2;2;13;4],[0;0;4;1]
|
||
5d,5,diamonds,[3;2;13;4],[0;0;4;1]
|
||
6d,6,diamonds,[4;2;13;4],[0;0;4;1]
|
||
7d,7,diamonds,[5;2;13;4],[0;0;4;1]
|
||
8d,8,diamonds,[6;2;13;4],[0;0;4;1]
|
||
9d,9,diamonds,[7;2;13;4],[0;0;4;1]
|
||
10d,10,diamonds,[8;2;13;4],[0;0;4;1]
|
||
jd,J,diamonds,[9;2;13;4],[0;0;4;1]
|
||
qd,Q,diamonds,[10;2;13;4],[0;0;4;1]
|
||
kd,K,diamonds,[11;2;13;4],[0;0;4;1]
|
||
ad,A,diamonds,[12;2;13;4],[0;0;4;1]
|
||
2c,2,clubs,[0;3;13;4],[0;0;4;1]
|
||
3c,3,clubs,[1;3;13;4],[0;0;4;1]
|
||
4c,4,clubs,[2;3;13;4],[0;0;4;1]
|
||
5c,5,clubs,[3;3;13;4],[0;0;4;1]
|
||
6c,6,clubs,[4;3;13;4],[0;0;4;1]
|
||
7c,7,clubs,[5;3;13;4],[0;0;4;1]
|
||
8c,8,clubs,[6;3;13;4],[0;0;4;1]
|
||
9c,9,clubs,[7;3;13;4],[0;0;4;1]
|
||
10c,10,clubs,[8;3;13;4],[0;0;4;1]
|
||
jc,J,clubs,[9;3;13;4],[0;0;4;1]
|
||
qc,Q,clubs,[10;3;13;4],[0;0;4;1]
|
||
kc,K,clubs,[11;3;13;4],[0;0;4;1]
|
||
ac,A,clubs,[12;3;13;4],[0;0;4;1]
|
||
```
|
||
|
||
## Board
|
||
|
||
A table with a draw pile on the left and five community-card slots across the
|
||
middle. The deck pile fans its stacked cards along a curve.
|
||
|
||
```yaml role=surface.board
|
||
id: poker
|
||
size: [600, 400]
|
||
layout:
|
||
- route: /deck
|
||
x: -250
|
||
y: 0
|
||
rotation: 0
|
||
stacking:
|
||
align: center
|
||
zStart: 0
|
||
#zEnd: 100
|
||
curve: M -50 -200 C 50 -150 450 -150 550 -200
|
||
- route: /community/:slot
|
||
candidates:
|
||
$variants: ./community.csv
|
||
```
|
||
|
||
```csv file=community.csv
|
||
slot,x,y,rotation
|
||
string,number,number,number
|
||
0,-100,0,0
|
||
1,-50,0,0
|
||
2,0,0,0
|
||
3,50,0,0
|
||
4,100,0,0
|
||
```
|
||
|
||
## Setup
|
||
|
||
Deal the whole deck facedown onto the draw pile (`poker:card` expands to every
|
||
card of that type, `facing: back`), then flip a flop onto the community slots
|
||
and stand a couple of drawn cards on their bottom edge.
|
||
|
||
```yaml role=setup.game
|
||
id: main
|
||
setup:
|
||
- path: /deck
|
||
parts: poker:card
|
||
facing: back
|
||
- path: /community/0
|
||
parts: poker:card#as
|
||
- path: /community/1
|
||
parts: poker:card#kh
|
||
- path: /community/2
|
||
parts: poker:card#7d
|
||
- path: /community/3
|
||
parts: poker:card#jc
|
||
facing: standing
|
||
- path: /community/4
|
||
parts: poker:card#2h
|
||
facing: standing
|
||
```
|