project-mobile-command/plans/SHARED_MODULES_PLAN.md
StillHammer 45274196ef Add complete planning documentation
Plans créés:
- PROTOTYPE_PLAN.md: Plan détaillé 12 semaines (4 phases)
- SHARED_MODULES_PLAN.md: Architecture modules partagés MC/WF
- MODULES_ARCHITECTURE.md: Vue d'ensemble modules

Phase 1 (Semaines 1-2): Fondations
- GameModule, ResourceModule, StorageModule

Phase 2 (Semaines 3-4): Train & Resources
- TrainBuilderModule, ResourceModule v2

Phase 3 (Semaines 5-8): Combat & Events
- CombatModule, EventModule, ExpeditionModule

Phase 4 (Semaines 9-12): Integration & Polish
- GameModule v2, UI basique, balance pass

Grove-Modules Strategy:
- Core library (ResourceModule, StorageModule, etc.)
- Common modules (CombatModule, TransportModule, etc.)
- Adaptateurs spécifiques MC/WF
- Versioning sémantique
- CI/CD cross-projet

🎯 Success Metric: 30 min gameplay, 10+ décisions impactantes
🔄 Réutilisabilité: 60-95% modules entre MC et WF

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 11:30:18 +08:00

636 lines
15 KiB
Markdown

# Plan de Modules Partagés - Mobile Command & WarFactory
**Objectif**: Créer une bibliothèque de modules GroveEngine réutilisables entre les deux projets.
**Date**: 1er décembre 2025
**Version**: grove-modules v0.1.0
---
## Vision
### Problème
- Mobile Command et WarFactory partagent de nombreux systèmes (ressources, économie, combat)
- Dupliquer le code = 2x bugs, 2x maintenance, 2x développement
- GroveEngine permet modules hot-reloadable indépendants
### Solution
Créer une **bibliothèque de modules core** partagée entre les projets, avec des **adaptateurs spécifiques** par jeu.
---
## Architecture Proposée
### Structure
```
../grove-modules/ # Bibliothèque partagée
├── core/ # Modules 100% réutilisables
│ ├── ResourceModule/
│ ├── StorageModule/
│ ├── EconomyModule/
│ └── EventModule/
├── common/ # Modules 60-80% réutilisables
│ ├── CombatModule/
│ ├── TransportModule/
│ ├── TechTreeModule/
│ └── MapModule/
├── CMakeLists.txt
└── README.md
../mobilecommand/
├── src/modules/
│ ├── mc_adapters/ # Adaptateurs MC-spécifiques
│ │ ├── MCResourceAdapter.cpp
│ │ └── MCCombatAdapter.cpp
│ ├── TrainBuilderModule/ # MC-only
│ ├── ExpeditionModule/ # MC-only
│ └── DroneModule/ # MC-only
└── external/
├── GroveEngine/ # Symlink
└── grove-modules/ # Symlink
../warfactoryracine/
├── modules/
│ ├── wf_adapters/ # Adaptateurs WF-spécifiques
│ │ ├── WFResourceAdapter.cpp
│ │ └── WFCombatAdapter.cpp
│ ├── factory/ # WF-only
│ ├── vehicle_design/ # WF-only
│ └── doctrine/ # WF-only
└── external/
└── grove-modules/ # Symlink
```
---
## Modules Core (grove-modules/core/)
### ResourceModule
**Réutilisabilité: 90%**
**Responsabilités communes**:
- Inventaire (add/remove/query)
- Stack management
- Quality grades (poor/normal/good/excellent)
- Craft system (inputs → outputs)
- Resource constraints
**Interface commune**:
```cpp
class IResourceManager {
virtual bool addResource(string id, int quantity, Quality quality) = 0;
virtual bool removeResource(string id, int quantity) = 0;
virtual int getResourceCount(string id) = 0;
virtual bool canCraft(string recipe_id) = 0;
virtual void craft(string recipe_id) = 0;
};
```
**Configuration commune**:
```json
{
"resources": {
"resource_id": {
"name": "Display Name",
"maxStack": 100,
"weight": 1.5,
"baseValue": 10,
"category": "material"
}
},
"recipes": {
"recipe_id": {
"inputs": {"resource_a": 2, "resource_b": 1},
"outputs": {"resource_c": 1},
"craftTime": 30.0
}
}
}
```
**Adaptateurs spécifiques**:
- **MC**: Scavenge, munitions, fuel, timeline evolution (2022→2025)
- **WF**: Minerais, composants industriels, quality impact production
**Fichiers**:
- `grove-modules/core/ResourceModule/ResourceModule.cpp`
- `grove-modules/core/ResourceModule/ResourceModule.h`
- `grove-modules/core/ResourceModule/IResourceManager.h`
---
### StorageModule
**Réutilisabilité: 95%**
**Responsabilités communes**:
- Save game complet (JSON)
- Load game complet
- Auto-save périodique
- Versioning
- State serialization
**Interface commune**:
```cpp
class IStorageManager {
virtual bool saveGame(string filename) = 0;
virtual bool loadGame(string filename) = 0;
virtual void collectModuleStates(vector<IDataNode*> states) = 0;
virtual void restoreModuleStates(const IDataNode& saveData) = 0;
};
```
**Format universel**:
```json
{
"version": "1.0.0",
"game": "MobileCommand", // ou "WarFactory"
"timestamp": "2025-12-01T10:00:00Z",
"gameTime": 3600.0,
"modules": {
"ModuleName": { /* module state */ }
}
}
```
**Adaptateurs spécifiques**:
- **MC**: Expedition history, commander deaths
- **WF**: Factory blueprints, tech tree progress
**Fichiers**:
- `grove-modules/core/StorageModule/StorageModule.cpp`
- `grove-modules/core/StorageModule/IStorageManager.h`
---
### EconomyModule
**Réutilisabilité: 85%**
**Responsabilités communes**:
- Prix dynamiques (offre/demande)
- Marchés/trading
- Inflation/deflation
- Transaction history
**Interface commune**:
```cpp
class IEconomyManager {
virtual float getPrice(string resource_id) = 0;
virtual void updateMarket(string resource_id, int supply_delta) = 0;
virtual bool buy(string resource_id, int quantity, float& total_cost) = 0;
virtual bool sell(string resource_id, int quantity, float& total_revenue) = 0;
};
```
**Modèle économique**:
```cpp
// Prix = base * (demand / supply)^elasticity
float price = basePrice * pow(demand / supply, elasticity);
// Avec bounds
price = clamp(price, basePrice * 0.1, basePrice * 10.0);
```
**Adaptateurs spécifiques**:
- **MC**: Marché noir, dons, fame impact prices
- **WF**: Contracts PMC, military-industrial complex
**Fichiers**:
- `grove-modules/core/EconomyModule/EconomyModule.cpp`
- `grove-modules/core/EconomyModule/IEconomyManager.h`
---
### EventModule
**Réutilisabilité: 80%**
**Responsabilités communes**:
- Event scripting (JSON)
- Condition evaluation
- Choice handling
- Outcome application
**Interface commune**:
```cpp
class IEventManager {
virtual void checkTriggers() = 0;
virtual void triggerEvent(string event_id) = 0;
virtual void handleChoice(string event_id, string choice_id) = 0;
virtual bool evaluateConditions(const IDataNode& conditions) = 0;
};
```
**Format événement universel**:
```json
{
"event_id": "unique_id",
"title": "Event Title",
"description": "Event description text",
"conditions": {
"game_time_min": 600,
"resource_min": {"fuel": 50},
"custom_flag": "value"
},
"choices": [
{
"id": "choice_1",
"text": "Choice text",
"requirements": {"reputation": 20},
"outcomes": {
"resources": {"fuel": -10, "ammo": +50},
"flags": {"quest_complete": true},
"trigger_event": "next_event_id"
}
}
]
}
```
**Adaptateurs spécifiques**:
- **MC**: Survival events, moral impact, commander death
- **WF**: Diplomatic events, faction relations
**Fichiers**:
- `grove-modules/core/EventModule/EventModule.cpp`
- `grove-modules/core/EventModule/IEventManager.h`
---
## Modules Common (grove-modules/common/)
### CombatModule
**Réutilisabilité: 60%**
**Responsabilités communes**:
- Damage calculations
- Armor/penetration
- Hit probability
- Unit health
- Combat resolution
**Interface commune**:
```cpp
class ICombatResolver {
virtual CombatResult resolveCombat(
const CombatSetup& setup,
int maxRounds
) = 0;
virtual float calculateDamage(
float firepower,
float armor,
float penetration
) = 0;
virtual bool checkHit(
float accuracy,
float evasion,
float cover
) = 0;
};
struct CombatResult {
bool victory;
vector<Casualty> casualties;
vector<Resource> loot;
int roundsElapsed;
};
```
**Formules partagées**:
```cpp
// Hit chance
float hit = base_accuracy * (1.0 - cover) * (1.0 - evasion);
// Damage
float damage = max(0, firepower * penetration - armor);
// Casualty check
if (unit_health <= 0) {
casualties.push_back(unit);
}
```
**Adaptateurs spécifiques**:
- **MC**: Pertes permanentes, moral, drones vs humans
- **WF**: Auto-battler, frontlines, doctrine modifiers
**Fichiers**:
- `grove-modules/common/CombatModule/CombatModule.cpp`
- `grove-modules/common/CombatModule/ICombatResolver.h`
---
### TransportModule
**Réutilisabilité: 70%**
**Responsabilités communes**:
- Pathfinding (A*)
- Route optimization
- Travel time calculation
- Convoy management
**Interface commune**:
```cpp
class ITransportManager {
virtual Path findPath(Point from, Point to) = 0;
virtual float calculateTravelTime(Path path, float speed) = 0;
virtual bool moveConvoy(string convoy_id, Point destination) = 0;
};
struct Path {
vector<Point> waypoints;
float totalDistance;
float estimatedTime;
int dangerLevel;
};
```
**Adaptateurs spécifiques**:
- **MC**: Train movement, expedition routes
- **WF**: Supply chains, factory logistics
**Fichiers**:
- `grove-modules/common/TransportModule/TransportModule.cpp`
- `grove-modules/common/TransportModule/ITransportManager.h`
---
### TechTreeModule
**Réutilisabilité: 75%**
**Responsabilités communes**:
- Tech progression
- Unlock system
- Dependencies
- Research time/cost
**Interface commune**:
```cpp
class ITechTreeManager {
virtual bool canResearch(string tech_id) = 0;
virtual void startResearch(string tech_id) = 0;
virtual bool isUnlocked(string tech_id) = 0;
virtual vector<string> getAvailableTechs() = 0;
};
```
**Configuration universelle**:
```json
{
"technologies": {
"tech_id": {
"name": "Technology Name",
"cost": {"research_points": 100, "credits": 1000},
"time": 3600.0,
"prerequisites": ["tech_a", "tech_b"],
"unlocks": ["feature_x", "recipe_y"]
}
}
}
```
**Adaptateurs spécifiques**:
- **MC**: Timeline 2022→2025 (forced progression)
- **WF**: 3000+ techs, player choice
**Fichiers**:
- `grove-modules/common/TechTreeModule/TechTreeModule.cpp`
- `grove-modules/common/TechTreeModule/ITechTreeManager.h`
---
### MapModule
**Réutilisabilité: 50%**
**Responsabilités communes**:
- Chunk system (64x64 tiles)
- Streaming/loading
- Multi-scale (world/regional/local)
- Tile properties
**Interface commune**:
```cpp
class IMapManager {
virtual Chunk* getChunk(int x, int y) = 0;
virtual void loadChunk(int x, int y) = 0;
virtual void unloadChunk(int x, int y) = 0;
virtual Tile getTile(int x, int y) = 0;
};
struct Chunk {
int x, y;
Tile tiles[64][64];
bool loaded;
bool modified;
};
```
**Adaptateurs spécifiques**:
- **MC**: Ukraine map statique, expedition sites
- **WF**: Procedural generation, geological sim
**Fichiers**:
- `grove-modules/common/MapModule/MapModule.cpp`
- `grove-modules/common/MapModule/IMapManager.h`
---
## Roadmap de Développement
### Phase 1: Mobile Command Prototype (Mois 1-3)
**Objectif**: Créer modules pour MC, les garder réutilisables
1. **ResourceModule** - Développer pour MC avec interface claire
2. **StorageModule** - Format universel dès le départ
3. **EventModule** - Scripting JSON générique
4. **CombatModule** - Formulas paramétrées
**Livrable**: MC prototype fonctionnel, code dans `src/modules/`
### Phase 2: Extraction Core Library (Mois 4)
**Objectif**: Identifier et extraire le core stable
1. **Audit code MC** - Identifier parties 100% réutilisables
2. **Créer grove-modules/** - Structure de base
3. **Extraire ResourceModule** - Première extraction
4. **Tester réintégration** - MC utilise grove-modules/ResourceModule
**Livrable**: grove-modules/ avec 1 module stable
### Phase 3: Stabilisation Core (Mois 5-6)
**Objectif**: Tous les core modules extraits et stables
1. **Extraire StorageModule** - Save/load universel
2. **Extraire EconomyModule** - Marché dynamique
3. **Extraire EventModule** - Event system
4. **Versioning v1.0.0** - Premier release stable
**Livrable**: grove-modules/core/ complet et versionné
### Phase 4: Common Modules (Mois 7-9)
**Objectif**: Modules partagés avec adaptateurs
1. **CombatModule** - Combat resolver + adaptateurs MC/WF
2. **TransportModule** - Pathfinding + logistics
3. **TechTreeModule** - Progression system
4. **MapModule** - Chunk system base
**Livrable**: grove-modules/common/ complet
### Phase 5: WarFactory Integration (Mois 10-12)
**Objectif**: WF utilise grove-modules
1. **WF setup** - Symlink grove-modules/
2. **Adaptateurs WF** - wf_adapters/ pour customisation
3. **Tests cross-projet** - Valider compatibilité
4. **CI/CD** - Tests automatiques MC + WF
**Livrable**: Les deux projets partagent grove-modules/
---
## Conventions de Code
### Namespaces
```cpp
namespace grove::modules::core {
class ResourceModule { };
}
namespace grove::modules::common {
class CombatModule { };
}
```
### Versioning
```cpp
// ResourceModule v1.2.3
#define RESOURCE_MODULE_VERSION_MAJOR 1
#define RESOURCE_MODULE_VERSION_MINOR 2
#define RESOURCE_MODULE_VERSION_PATCH 3
```
### Configuration
```json
{
"module_version": "1.2.3",
"game_specific": {
"mobile_command": { /* MC config */ },
"war_factory": { /* WF config */ }
},
"common": { /* Shared config */ }
}
```
### Topics Pub/Sub
```cpp
// Namespace par module
"resource:craft_complete"
"storage:save_complete"
"economy:price_changed"
"event:triggered"
"combat:ended"
```
---
## Tests Cross-Projet
### Test Framework
```cpp
// grove-modules/tests/ResourceModuleTest.cpp
TEST_CASE("ResourceModule - MC Scenario") {
ResourceModule module;
// Test MC-specific behavior
}
TEST_CASE("ResourceModule - WF Scenario") {
ResourceModule module;
// Test WF-specific behavior
}
```
### CI/CD Pipeline
```yaml
# .github/workflows/grove-modules.yml
jobs:
test-mobile-command:
runs-on: ubuntu-latest
steps:
- Checkout grove-modules
- Checkout mobilecommand
- Build & test MC with grove-modules
test-war-factory:
runs-on: ubuntu-latest
steps:
- Checkout grove-modules
- Checkout warfactoryracine
- Build & test WF with grove-modules
```
---
## Maintenance
### Semantic Versioning
- **Major**: Breaking changes (interface changes)
- **Minor**: New features (backward compatible)
- **Patch**: Bug fixes
### Release Process
1. Tests passent (MC + WF)
2. Update CHANGELOG.md
3. Tag version (v1.2.3)
4. Update both projects
### Bug Fixes
1. Fix in grove-modules/
2. Test MC
3. Test WF
4. Release patch version
---
## Metrics de Succès
### Court Terme (6 mois)
- [ ] 4 core modules extraits
- [ ] MC utilise grove-modules/
- [ ] 0 duplication code entre MC et grove-modules/
### Moyen Terme (12 mois)
- [ ] 8 modules total (core + common)
- [ ] WF utilise grove-modules/
- [ ] CI/CD tests cross-projet
- [ ] Documentation API complète
### Long Terme (18+ mois)
- [ ] grove-modules/ stable (v2.0+)
- [ ] 3rd party usage possible (open source?)
- [ ] Community contributions
- [ ] Grove ecosystem
---
## Conclusion
**Objectif**: Ne pas réinventer la roue deux fois.
**Stratégie**:
1. Développer pour MC d'abord (focus prototype)
2. Identifier patterns réutilisables
3. Extraire core library progressivement
4. WF bénéficie du travail MC
**Bénéfices**:
- ✅ Moins de code à maintenir
- ✅ Bugs fixés une seule fois
- ✅ Features profitent aux deux projets
- ✅ Validation GroveEngine en production
---
*Plan créé le 1er décembre 2025*
*Prochaine review: Fin MC Prototype (Mois 3)*