Bundles in-flight work on the campaign/missions system (CampaignDef, MissionDef, TerrainPatch, TransformerDef, MissionChecker, CampaignLoader, FlavorBanner, transformer rules), plan files, and matching tests. Baseline commit so the upcoming automation testing harness lands on a clean tree.
157 lines
5.5 KiB
Markdown
157 lines
5.5 KiB
Markdown
# Plan : Level Design - Batiments de Transformation
|
|
|
|
## Concept
|
|
|
|
Les batiments de **transformation** consomment une ressource en entree et produisent une ressource differente en sortie. Le joueur doit construire des chaines logistiques multi-etapes : extraction → transformation → livraison.
|
|
|
|
Exemple : Scierie (produit bois) → Forge (consomme bois, produit outils) → Caserne (demande outils).
|
|
|
|
## Modele Engine
|
|
|
|
### Nouveau type de cellule : Transformer
|
|
|
|
```
|
|
CellType.Transformer
|
|
```
|
|
|
|
Un `TransformerDef` combine une demande (input) et une production (output) :
|
|
|
|
```csharp
|
|
public record TransformerDef(
|
|
Coords Position,
|
|
string Name,
|
|
CargoType InputCargo, // ce qu'il consomme
|
|
int InputRequired, // nb d'unites avant conversion
|
|
CargoType OutputCargo, // ce qu'il produit
|
|
int OutputAmount // nb d'unites produites par cycle
|
|
);
|
|
```
|
|
|
|
### Logique de production
|
|
|
|
Chaque tour, le `TransferResolver` livre du cargo au transformateur comme a une demande normale. Quand le buffer d'entree atteint `InputRequired`, le transformateur :
|
|
1. Vide son buffer d'entree
|
|
2. Remplit son buffer de sortie avec `OutputAmount` unites de `OutputCargo`
|
|
3. Le buffer de sortie est distribue aux pieces adjacentes (comme une production classique)
|
|
|
|
Cela cree un rythme : accumulation → conversion → distribution.
|
|
|
|
### Changements au TerrainPatch
|
|
|
|
Ajouter le type `"transformer"` dans le JSON :
|
|
|
|
```json
|
|
{
|
|
"col": 3, "row": 2,
|
|
"type": "transformer",
|
|
"transformer": {
|
|
"name": "Forge",
|
|
"inputCargo": "wood",
|
|
"inputRequired": 2,
|
|
"outputCargo": "tools",
|
|
"outputAmount": 1
|
|
}
|
|
}
|
|
```
|
|
|
|
### Nouveaux types de cargo
|
|
|
|
Ajouter au `CargoType` enum :
|
|
- `Tools` (outils) — bois transforme
|
|
- `Arms` (armes) — pierre transformee
|
|
- `Gold` (or) — ressource rare de fin de campagne
|
|
|
|
## Evolution de la campagne (10 missions)
|
|
|
|
### Mission 1 : Premier Convoi (4x4)
|
|
- **Deverrouille** : Pion
|
|
- **Batiments** : Scierie → Depot Royal
|
|
- **Objectif** : livrer 3 bois — apprendre le placement de base
|
|
|
|
### Mission 2 : Forger les Tours (6x6)
|
|
- **Deverrouille** : Tour
|
|
- **Batiments** : +Carriere, +Caserne (bois), +Forge (pierre)
|
|
- **Objectif** : livrer bois a la caserne ET pierre a la forge
|
|
- **Defi** : gerer deux routes independantes
|
|
|
|
### Mission 3 : Le Col (6x6)
|
|
- **Deverrouille** : Cavalier
|
|
- **Batiments** : mur bloquant + Depot (bois)
|
|
- **Objectif** : traverser les murs avec des cavaliers
|
|
- **Les demands precedentes restent actives**
|
|
|
|
### Mission 4 : Le Carrefour (8x8)
|
|
- **Deverrouille** : Fou
|
|
- **Batiments** : +Chateau (bois), +Forge Royale (pierre), murs
|
|
- **Objectif** : routes diagonales avec les fous
|
|
|
|
### Mission 5 : La Forge (8x8) -- TRANSFORMATION
|
|
- **Deverrouille** : aucun (nouveau type de cargo : Outils)
|
|
- **Batiments** : Forge *transformee* en transformateur (bois → outils)
|
|
- **Objectif** : livrer des outils a un nouveau batiment (Armurerie)
|
|
- **Defi** : la route bois existante doit continuer, PLUS une branche vers la forge qui produit des outils
|
|
|
|
### Mission 6 : La Dame Blanche (10x10)
|
|
- **Deverrouille** : Dame
|
|
- **Batiments** : +Scierie Nord, +Grand Chantier (bois), +Arsenal (pierre)
|
|
- **Objectif** : routes longue distance avec la dame
|
|
|
|
### Mission 7 : L'Armurerie (10x10) -- TRANSFORMATION
|
|
- **Nouveau cargo** : Armes
|
|
- **Batiments** : Armurerie (transforme pierre → armes)
|
|
- **Objectif** : livrer des armes a une Garnison
|
|
|
|
### Mission 8 : Le Comptoir (12x12)
|
|
- **Batiments** : Comptoir (transforme outils → or)
|
|
- **Objectif** : livrer de l'or au Tresor Royal
|
|
- **Defi** : chaine a 3 etapes : bois → outils → or
|
|
|
|
### Mission 9 : L'Expansion Finale (14x14)
|
|
- **Batiments** : multiples transformateurs, murs complexes
|
|
- **Objectif** : maintenir toutes les chaines tout en s'etendant
|
|
- **Defi** : gestion de la congestion (risque de collisions)
|
|
|
|
### Mission 10 : Le Couronnement (14x14)
|
|
- **Batiments** : Cathedrale (demande or + armes + outils)
|
|
- **Objectif** : livrer les 3 types de cargo transforme
|
|
- **Defi** : orchestrer l'ensemble des chaines logistiques simultanement
|
|
|
|
## Demands recurrentes (futur)
|
|
|
|
Pour que le joueur doive "preserver ses automatisations", les demands pourraient devenir recurrentes :
|
|
- Un batiment de demande **consomme** N unites par tour
|
|
- S'il n'est plus approvisionne, il passe en etat "en penurie"
|
|
- Condition de mission : **aucun** batiment en penurie pendant X tours consecutifs
|
|
|
|
Cela force le joueur a maintenir ses routes existantes quand le terrain s'agrandit, au lieu de tout reconstruire.
|
|
|
|
## Implementation par phases
|
|
|
|
### Phase 1 : Modele Transformer
|
|
- Ajouter `CellType.Transformer` et `TransformerDef`
|
|
- Ajouter `TransformerState` avec buffers input/output
|
|
- Integrer dans `BoardState`
|
|
|
|
### Phase 2 : Logique de conversion
|
|
- Modifier `TurnExecutor` : sous-phase "transformation" entre production et transferts
|
|
- Le transformateur agit comme une demande (recoit) ET une production (emet)
|
|
|
|
### Phase 3 : Nouveaux cargos
|
|
- Ajouter `Tools`, `Arms`, `Gold` a `CargoType`
|
|
- Couleurs visuelles pour chaque cargo
|
|
- Mise a jour du `CampaignLoader` pour parser les transformateurs
|
|
|
|
### Phase 4 : Visuels
|
|
- Couleur de cellule pour les transformateurs (ex: orange cuivre)
|
|
- Animation de conversion (flash input → flash output)
|
|
- Icones de cargo dans les pieces
|
|
|
|
### Phase 5 : Missions 5-10
|
|
- Ecrire les donnees JSON des missions 5 a 10
|
|
- Tester la solvabilite de chaque mission
|
|
- Equilibrer les quantites (input/output ratios)
|
|
|
|
### Phase 6 (optionnel) : Demands recurrentes
|
|
- Modifier `DemandState` pour tracker la consommation par tour
|
|
- Ajouter un flag "en penurie"
|
|
- Condition de victoire : pas de penurie pendant N tours
|