Files
hypercross 13b3eaed78 feat(bgm): derive definition names from role.type
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=.
2026-08-10 16:36:57 +08:00

226 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 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 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
```