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=.
226 lines
4.1 KiB
Markdown
226 lines
4.1 KiB
Markdown
# Carcassonne
|
||
|
||
The base game's 24 landscape tiles, laid out on a table with a draw pile and a
|
||
grid of placed tiles. Each tile is a single `110×110` image (A–X), sized to a
|
||
standard `45×45` mm square.
|
||
|
||
```yaml role=package
|
||
id: carcassonne
|
||
title: Carcassonne
|
||
designer: Klaus-Jürgen Wrede
|
||
publisher: Hans im Glück
|
||
players: 5
|
||
language: en
|
||
include: ['./**/*.yaml']
|
||
```
|
||
|
||
## Parts
|
||
|
||
One `tile` part per distinct tile type (A–X). All tiles share the same square
|
||
face image and a uniform size; the `$variants` CSV expands them into the 24
|
||
tile parts.
|
||
|
||
```yaml role=part.tile
|
||
face: ./20AE_Base_Game_C2_Tile_A.png
|
||
size: [45, 45, 3]
|
||
fillet: 1
|
||
$variants: ./tiles.csv
|
||
```
|
||
|
||
```csv file=tiles.csv
|
||
id,face
|
||
string,string
|
||
a,./20AE_Base_Game_C2_Tile_A.png
|
||
b,./20AE_Base_Game_C2_Tile_B.png
|
||
c,./20AE_Base_Game_C2_Tile_C.png
|
||
d,./20AE_Base_Game_C2_Tile_D.png
|
||
e,./20AE_Base_Game_C2_Tile_E.png
|
||
f,./20AE_Base_Game_C2_Tile_F.png
|
||
g,./20AE_Base_Game_C2_Tile_G.png
|
||
h,./20AE_Base_Game_C2_Tile_H.png
|
||
i,./20AE_Base_Game_C2_Tile_I.png
|
||
j,./20AE_Base_Game_C2_Tile_J.png
|
||
k,./20AE_Base_Game_C2_Tile_K.png
|
||
l,./20AE_Base_Game_C2_Tile_L.png
|
||
m,./20AE_Base_Game_C2_Tile_M.png
|
||
n,./20AE_Base_Game_C2_Tile_N.png
|
||
o,./20AE_Base_Game_C2_Tile_O.png
|
||
p,./20AE_Base_Game_C2_Tile_P.png
|
||
q,./20AE_Base_Game_C2_Tile_Q.png
|
||
r,./20AE_Base_Game_C2_Tile_R.png
|
||
s,./20AE_Base_Game_C2_Tile_S.png
|
||
t,./20AE_Base_Game_C2_Tile_T.png
|
||
u,./20AE_Base_Game_C2_Tile_U.png
|
||
v,./20AE_Base_Game_C2_Tile_V.png
|
||
w,./20AE_Base_Game_C2_Tile_W.png
|
||
x,./20AE_Base_Game_C2_Tile_X.png
|
||
```
|
||
|
||
## Board
|
||
|
||
A table with a draw pile on the left and an `11×11` grid of placed tiles in the
|
||
middle. The grid routes each tile to its `col,row` cell, spaced `45` mm apart
|
||
so tiles sit edge to edge.
|
||
|
||
```yaml role=surface.board
|
||
id: board
|
||
size: [600, 600]
|
||
layout:
|
||
- route: /draw
|
||
x: -280
|
||
y: 0
|
||
rotation: 0
|
||
stacking:
|
||
align: center
|
||
zStart: 0
|
||
curve: M -50 -200 C 50 -150 450 -150 550 -200
|
||
- route: /grid/:col/:row
|
||
candidates:
|
||
$variants: ./grid.csv
|
||
```
|
||
|
||
```csv file=grid.csv
|
||
col,row,x,y,rotation
|
||
string,string,number,number,number
|
||
0,0,-225,-225,0
|
||
0,1,-225,-180,0
|
||
0,2,-225,-135,0
|
||
0,3,-225,-90,0
|
||
0,4,-225,-45,0
|
||
0,5,-225,0,0
|
||
0,6,-225,45,0
|
||
0,7,-225,90,0
|
||
0,8,-225,135,0
|
||
0,9,-225,180,0
|
||
0,10,-225,225,0
|
||
1,0,-180,-225,0
|
||
1,1,-180,-180,0
|
||
1,2,-180,-135,0
|
||
1,3,-180,-90,0
|
||
1,4,-180,-45,0
|
||
1,5,-180,0,0
|
||
1,6,-180,45,0
|
||
1,7,-180,90,0
|
||
1,8,-180,135,0
|
||
1,9,-180,180,0
|
||
1,10,-180,225,0
|
||
2,0,-135,-225,0
|
||
2,1,-135,-180,0
|
||
2,2,-135,-135,0
|
||
2,3,-135,-90,0
|
||
2,4,-135,-45,0
|
||
2,5,-135,0,0
|
||
2,6,-135,45,0
|
||
2,7,-135,90,0
|
||
2,8,-135,135,0
|
||
2,9,-135,180,0
|
||
2,10,-135,225,0
|
||
3,0,-90,-225,0
|
||
3,1,-90,-180,0
|
||
3,2,-90,-135,0
|
||
3,3,-90,-90,0
|
||
3,4,-90,-45,0
|
||
3,5,-90,0,0
|
||
3,6,-90,45,0
|
||
3,7,-90,90,0
|
||
3,8,-90,135,0
|
||
3,9,-90,180,0
|
||
3,10,-90,225,0
|
||
4,0,-45,-225,0
|
||
4,1,-45,-180,0
|
||
4,2,-45,-135,0
|
||
4,3,-45,-90,0
|
||
4,4,-45,-45,0
|
||
4,5,-45,0,0
|
||
4,6,-45,45,0
|
||
4,7,-45,90,0
|
||
4,8,-45,135,0
|
||
4,9,-45,180,0
|
||
4,10,-45,225,0
|
||
5,0,0,-225,0
|
||
5,1,0,-180,0
|
||
5,2,0,-135,0
|
||
5,3,0,-90,0
|
||
5,4,0,-45,0
|
||
5,5,0,0,0
|
||
5,6,0,45,0
|
||
5,7,0,90,0
|
||
5,8,0,135,0
|
||
5,9,0,180,0
|
||
5,10,0,225,0
|
||
6,0,45,-225,0
|
||
6,1,45,-180,0
|
||
6,2,45,-135,0
|
||
6,3,45,-90,0
|
||
6,4,45,-45,0
|
||
6,5,45,0,0
|
||
6,6,45,45,0
|
||
6,7,45,90,0
|
||
6,8,45,135,0
|
||
6,9,45,180,0
|
||
6,10,45,225,0
|
||
7,0,90,-225,0
|
||
7,1,90,-180,0
|
||
7,2,90,-135,0
|
||
7,3,90,-90,0
|
||
7,4,90,-45,0
|
||
7,5,90,0,0
|
||
7,6,90,45,0
|
||
7,7,90,90,0
|
||
7,8,90,135,0
|
||
7,9,90,180,0
|
||
7,10,90,225,0
|
||
8,0,135,-225,0
|
||
8,1,135,-180,0
|
||
8,2,135,-135,0
|
||
8,3,135,-90,0
|
||
8,4,135,-45,0
|
||
8,5,135,0,0
|
||
8,6,135,45,0
|
||
8,7,135,90,0
|
||
8,8,135,135,0
|
||
8,9,135,180,0
|
||
8,10,135,225,0
|
||
9,0,180,-225,0
|
||
9,1,180,-180,0
|
||
9,2,180,-135,0
|
||
9,3,180,-90,0
|
||
9,4,180,-45,0
|
||
9,5,180,0,0
|
||
9,6,180,45,0
|
||
9,7,180,90,0
|
||
9,8,180,135,0
|
||
9,9,180,180,0
|
||
9,10,180,225,0
|
||
10,0,225,-225,0
|
||
10,1,225,-180,0
|
||
10,2,225,-135,0
|
||
10,3,225,-90,0
|
||
10,4,225,-45,0
|
||
10,5,225,0,0
|
||
10,6,225,45,0
|
||
10,7,225,90,0
|
||
10,8,225,135,0
|
||
10,9,225,180,0
|
||
10,10,225,225,0
|
||
```
|
||
|
||
## Setup
|
||
|
||
Start with the full tile supply on the draw pile (`carcassonne:tile` expands to
|
||
every tile of that type), then seed the grid with a few opening tiles.
|
||
|
||
```yaml role=setup.game
|
||
id: main
|
||
surfaces:
|
||
- board#board
|
||
setup:
|
||
- path: /draw
|
||
parts: carcassonne:tile
|
||
- path: /grid/5/5
|
||
parts: carcassonne:tile#a
|
||
- path: /grid/5/6
|
||
parts: carcassonne:tile#b
|
||
- path: /grid/6/5
|
||
parts: carcassonne:tile#c
|
||
``` |