Phase 5: Dame (Queen) piece and network levels 7-8

Dame (Queen):
- Moves 1-2 cells in all 8 directions (orthogonal + diagonal)
- Social status 7 (highest — priority over all other pieces)
- Deep burgundy color, letter "D"
- Rare and powerful, forces strategic placement choices

Levels:
- Level 7 "La Dame Blanche": 10x10, walled arena with central fortress,
  1 queen available as a logistics superweapon
- Level 8 "Le Grand Reseau": 12x10, 4 productions + 4 demands,
  two vertical wall corridors, 2 queens, full network challenge

GDD updated with Dame section and status hierarchy.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Samuel Bouchet 2026-04-10 23:24:14 +02:00
parent 210be72100
commit 8918140114
12 changed files with 96 additions and 3 deletions

28
Data/levels/level_07.json Normal file
View file

@ -0,0 +1,28 @@
{
"id": 7,
"name": "La Dame Blanche",
"description": "La Dame entre en jeu. Sa portee sur 8 directions en fait une piece logistique supreme.",
"width": 10,
"height": 10,
"productions": [
{ "col": 0, "row": 0, "name": "Scierie", "cargo": "wood" },
{ "col": 9, "row": 0, "name": "Carriere", "cargo": "stone" }
],
"demands": [
{ "col": 9, "row": 9, "name": "Chateau", "cargo": "wood", "amount": 4, "deadline": 50 },
{ "col": 0, "row": 9, "name": "Forge Royale", "cargo": "stone", "amount": 4, "deadline": 50 }
],
"walls": [
{ "col": 3, "row": 3 }, { "col": 3, "row": 4 }, { "col": 3, "row": 5 }, { "col": 3, "row": 6 },
{ "col": 6, "row": 3 }, { "col": 6, "row": 4 }, { "col": 6, "row": 5 }, { "col": 6, "row": 6 },
{ "col": 4, "row": 6 }, { "col": 5, "row": 6 },
{ "col": 4, "row": 3 }, { "col": 5, "row": 3 }
],
"stock": [
{ "kind": "pawn", "count": 10 },
{ "kind": "rook", "count": 4 },
{ "kind": "bishop", "count": 2 },
{ "kind": "knight", "count": 2 },
{ "kind": "queen", "count": 1 }
]
}

33
Data/levels/level_08.json Normal file
View file

@ -0,0 +1,33 @@
{
"id": 8,
"name": "Le Grand Reseau",
"description": "Quatre productions, quatre demandes. Construisez un reseau logistique complet a travers un terrain hostile.",
"width": 12,
"height": 10,
"productions": [
{ "col": 0, "row": 0, "name": "Scierie Ouest", "cargo": "wood" },
{ "col": 11, "row": 0, "name": "Carriere Sud", "cargo": "stone" },
{ "col": 0, "row": 9, "name": "Scierie Nord", "cargo": "wood" },
{ "col": 11, "row": 9, "name": "Carriere Nord", "cargo": "stone" }
],
"demands": [
{ "col": 5, "row": 0, "name": "Depot Sud", "cargo": "wood", "amount": 3, "deadline": 60 },
{ "col": 6, "row": 9, "name": "Depot Nord", "cargo": "stone", "amount": 3, "deadline": 60 },
{ "col": 5, "row": 5, "name": "Forge Centrale", "cargo": "stone", "amount": 4, "deadline": 60 },
{ "col": 6, "row": 4, "name": "Chantier Central", "cargo": "wood", "amount": 4, "deadline": 60 }
],
"walls": [
{ "col": 3, "row": 2 }, { "col": 3, "row": 3 }, { "col": 3, "row": 4 },
{ "col": 3, "row": 5 }, { "col": 3, "row": 6 }, { "col": 3, "row": 7 },
{ "col": 8, "row": 2 }, { "col": 8, "row": 3 }, { "col": 8, "row": 4 },
{ "col": 8, "row": 5 }, { "col": 8, "row": 6 }, { "col": 8, "row": 7 },
{ "col": 4, "row": 4 }, { "col": 7, "row": 5 }
],
"stock": [
{ "kind": "pawn", "count": 16 },
{ "kind": "rook", "count": 6 },
{ "kind": "bishop", "count": 3 },
{ "kind": "knight", "count": 4 },
{ "kind": "queen", "count": 2 }
]
}

View file

@ -46,7 +46,7 @@ public partial class Main : Node2D
private bool _running; private bool _running;
private bool _panning; private bool _panning;
private static readonly string[] LevelFiles = ["level_01.json", "level_02.json", "level_03.json", "level_04.json", "level_05.json", "level_06.json"]; private static readonly string[] LevelFiles = ["level_01.json", "level_02.json", "level_03.json", "level_04.json", "level_05.json", "level_06.json", "level_07.json", "level_08.json"];
private const float SidePanelWidth = 280f; private const float SidePanelWidth = 280f;
private const float ControlBarHeight = 48f; private const float ControlBarHeight = 48f;

View file

@ -22,6 +22,7 @@ public partial class PieceView : Node2D
private static readonly Color RookColor = new("#3D6B8E"); // deep teal private static readonly Color RookColor = new("#3D6B8E"); // deep teal
private static readonly Color BishopColor = new("#8E5A6B"); // dusty rose private static readonly Color BishopColor = new("#8E5A6B"); // dusty rose
private static readonly Color KnightColor = new("#8E7A3D"); // burnt sienna private static readonly Color KnightColor = new("#8E7A3D"); // burnt sienna
private static readonly Color QueenColor = new("#8E3D5A"); // deep burgundy
private static readonly Color WoodCargoColor = new("#A67C32"); private static readonly Color WoodCargoColor = new("#A67C32");
private static readonly Color StoneCargoColor = new("#7A7A7A"); private static readonly Color StoneCargoColor = new("#7A7A7A");
private static readonly Color ShadowColor = new Color(0, 0, 0, 0.18f); private static readonly Color ShadowColor = new Color(0, 0, 0, 0.18f);
@ -77,6 +78,7 @@ public partial class PieceView : Node2D
PieceKind.Rook => "T", PieceKind.Rook => "T",
PieceKind.Bishop => "F", PieceKind.Bishop => "F",
PieceKind.Knight => "C", PieceKind.Knight => "C",
PieceKind.Queen => "D",
_ => "?" _ => "?"
}, },
HorizontalAlignment = HorizontalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center,
@ -113,6 +115,7 @@ public partial class PieceView : Node2D
PieceKind.Rook => RookColor, PieceKind.Rook => RookColor,
PieceKind.Bishop => BishopColor, PieceKind.Bishop => BishopColor,
PieceKind.Knight => KnightColor, PieceKind.Knight => KnightColor,
PieceKind.Queen => QueenColor,
_ => Colors.White _ => Colors.White
}; };

View file

@ -66,6 +66,7 @@ public partial class DetailPanel : PanelContainer
PieceKind.Rook => "Tour II", PieceKind.Rook => "Tour II",
PieceKind.Bishop => "Fou II", PieceKind.Bishop => "Fou II",
PieceKind.Knight => "Cavalier", PieceKind.Knight => "Cavalier",
PieceKind.Queen => "Dame",
_ => piece.Kind.ToString() _ => piece.Kind.ToString()
}; };

View file

@ -15,7 +15,9 @@ public partial class LevelSelectScreen : Control
("Le Col", "Franchissez le mur et gerez deux types de cargaison."), ("Le Col", "Franchissez le mur et gerez deux types de cargaison."),
("Le Carrefour", "Deux productions, deux demandes, et un carrefour au centre."), ("Le Carrefour", "Deux productions, deux demandes, et un carrefour au centre."),
("Le Labyrinthe", "Un couloir etroit serpente a travers les murs."), ("Le Labyrinthe", "Un couloir etroit serpente a travers les murs."),
("Trois Royaumes", "Trois productions, trois demandes. Gerez un reseau complet.") ("Trois Royaumes", "Trois productions, trois demandes. Gerez un reseau complet."),
("La Dame Blanche", "La Dame entre en jeu. Portee supreme sur 8 directions."),
("Le Grand Reseau", "Quatre productions, quatre demandes. Reseau complet.")
]; ];
public override void _Ready() public override void _Ready()

View file

@ -154,6 +154,7 @@ public partial class PieceStockPanel : VBoxContainer
PieceKind.Rook => "Tour II", PieceKind.Rook => "Tour II",
PieceKind.Bishop => "Fou II", PieceKind.Bishop => "Fou II",
PieceKind.Knight => "Cavalier", PieceKind.Knight => "Cavalier",
PieceKind.Queen => "Dame",
_ => kind.ToString() _ => kind.ToString()
}; };
} }

View file

@ -56,6 +56,7 @@ public static class LevelLoader
"rook" => PieceKind.Rook, "rook" => PieceKind.Rook,
"bishop" => PieceKind.Bishop, "bishop" => PieceKind.Bishop,
"knight" => PieceKind.Knight, "knight" => PieceKind.Knight,
"queen" => PieceKind.Queen,
_ => throw new JsonException($"Unknown piece kind: '{kind}'") _ => throw new JsonException($"Unknown piece kind: '{kind}'")
}; };

View file

@ -5,5 +5,6 @@ public enum PieceKind
Pawn, Pawn,
Rook, Rook,
Bishop, Bishop,
Knight Knight,
Queen
} }

View file

@ -8,6 +8,7 @@ public static class PieceRules
PieceKind.Rook => 5, PieceKind.Rook => 5,
PieceKind.Bishop => 3, PieceKind.Bishop => 3,
PieceKind.Knight => 3, PieceKind.Knight => 3,
PieceKind.Queen => 7,
_ => throw new ArgumentOutOfRangeException(nameof(kind)) _ => throw new ArgumentOutOfRangeException(nameof(kind))
}; };
@ -17,6 +18,7 @@ public static class PieceRules
PieceKind.Rook => 2, PieceKind.Rook => 2,
PieceKind.Bishop => 2, PieceKind.Bishop => 2,
PieceKind.Knight => 0, // Knight uses L-shape, not range PieceKind.Knight => 0, // Knight uses L-shape, not range
PieceKind.Queen => 2,
_ => throw new ArgumentOutOfRangeException(nameof(kind)) _ => throw new ArgumentOutOfRangeException(nameof(kind))
}; };
} }

View file

@ -6,6 +6,7 @@ public static class MoveValidator
{ {
private static readonly (int dc, int dr)[] OrthogonalDirs = [(0, 1), (0, -1), (1, 0), (-1, 0)]; private static readonly (int dc, int dr)[] OrthogonalDirs = [(0, 1), (0, -1), (1, 0), (-1, 0)];
private static readonly (int dc, int dr)[] DiagonalDirs = [(1, 1), (1, -1), (-1, 1), (-1, -1)]; private static readonly (int dc, int dr)[] DiagonalDirs = [(1, 1), (1, -1), (-1, 1), (-1, -1)];
private static readonly (int dc, int dr)[] AllDirs = [(0, 1), (0, -1), (1, 0), (-1, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)];
private static readonly (int dc, int dr)[] KnightOffsets = private static readonly (int dc, int dr)[] KnightOffsets =
[ [
(1, 2), (2, 1), (2, -1), (1, -2), (1, 2), (2, 1), (2, -1), (1, -2),
@ -23,6 +24,7 @@ public static class MoveValidator
PieceKind.Rook => GetSlidingMoves(start, OrthogonalDirs, 2, board), PieceKind.Rook => GetSlidingMoves(start, OrthogonalDirs, 2, board),
PieceKind.Bishop => GetSlidingMoves(start, DiagonalDirs, 2, board), PieceKind.Bishop => GetSlidingMoves(start, DiagonalDirs, 2, board),
PieceKind.Knight => GetKnightMoves(start, board), PieceKind.Knight => GetKnightMoves(start, board),
PieceKind.Queen => GetSlidingMoves(start, AllDirs, 2, board),
_ => [] _ => []
}; };
} }

View file

@ -145,6 +145,24 @@ C'est tout. Pas de programmation, pas de route multi-etapes. La piece fait l'all
- **Saute par-dessus** les murs et les autres pieces - **Saute par-dessus** les murs et les autres pieces
- Statut social : **3** - Statut social : **3**
#### Dame
```
X X X
X X X
X X X
X X X [Dame] X X X
X X X
X X X
X X X
```
- Se deplace de **1 ou 2 cases** dans les **8 directions** (horizontal, vertical et diagonal)
- Combine les mouvements de la Tour et du Fou
- Ne peut pas traverser les murs ni les autres pieces
- Statut social : **7** (le plus eleve — prioritaire sur toutes les autres pieces)
- Piece la plus puissante mais rare — force des choix strategiques
> A statut egal, la piece de **niveau le plus eleve** est consideree superieure (ex: Tour II > Tour I, Fou III > Cavalier II). En cas d'egalite parfaite, le departage se fait par **direction en sens horaire** depuis la piece qui donne (voir 4.3). > A statut egal, la piece de **niveau le plus eleve** est consideree superieure (ex: Tour II > Tour I, Fou III > Cavalier II). En cas d'egalite parfaite, le departage se fait par **direction en sens horaire** depuis la piece qui donne (voir 4.3).
### 3.3 Occupation et collision ### 3.3 Occupation et collision
@ -188,6 +206,7 @@ Quand plusieurs transferts sont possibles au meme point, la priorite determine l
``` ```
Hierarchie de statut social (proto) : Hierarchie de statut social (proto) :
Dame 7
Tour 5 Tour 5
Fou 3 Fou 3
Cavalier 3 Cavalier 3