feat(carcassonne): add base game manifest

A 24-tile base game: one part per tile image (A-X), a board with a
draw pile and an 11x11 grid, and a setup seeding the tile supply.
This commit is contained in:
2026-08-10 08:52:48 +08:00
parent 5a3a9c1fcc
commit 77ffd8ff00
25 changed files with 301 additions and 0 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+229
View File
@@ -0,0 +1,229 @@
# 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 (AX), sized to a
standard `45×45` mm square.
```yaml file=carcassonne.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 (AX). All tiles share the same square
face image and a uniform size; the `$variants` CSV expands them into the 24
tile parts.
```yaml file=tiles.yaml
role: part
type: 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 file=board.yaml
type: board
id: board
role: surface
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 file=main.yaml
role: setup
type: game
id: main
surfaces:
- board#board
setup:
/draw: carcassonne:tile
/grid/5/5: carcassonne:tile#a
/grid/5/6: carcassonne:tile#b
/grid/6/5: carcassonne:tile#c
```