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>
15 KiB
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:
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:
{
"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.cppgrove-modules/core/ResourceModule/ResourceModule.hgrove-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:
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:
{
"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.cppgrove-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:
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:
// 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.cppgrove-modules/core/EconomyModule/IEconomyManager.h
EventModule
Réutilisabilité: 80%
Responsabilités communes:
- Event scripting (JSON)
- Condition evaluation
- Choice handling
- Outcome application
Interface commune:
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:
{
"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.cppgrove-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:
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:
// 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.cppgrove-modules/common/CombatModule/ICombatResolver.h
TransportModule
Réutilisabilité: 70%
Responsabilités communes:
- Pathfinding (A*)
- Route optimization
- Travel time calculation
- Convoy management
Interface commune:
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.cppgrove-modules/common/TransportModule/ITransportManager.h
TechTreeModule
Réutilisabilité: 75%
Responsabilités communes:
- Tech progression
- Unlock system
- Dependencies
- Research time/cost
Interface commune:
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:
{
"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.cppgrove-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:
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.cppgrove-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
- ResourceModule - Développer pour MC avec interface claire
- StorageModule - Format universel dès le départ
- EventModule - Scripting JSON générique
- 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
- Audit code MC - Identifier parties 100% réutilisables
- Créer grove-modules/ - Structure de base
- Extraire ResourceModule - Première extraction
- 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
- Extraire StorageModule - Save/load universel
- Extraire EconomyModule - Marché dynamique
- Extraire EventModule - Event system
- 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
- CombatModule - Combat resolver + adaptateurs MC/WF
- TransportModule - Pathfinding + logistics
- TechTreeModule - Progression system
- MapModule - Chunk system base
Livrable: grove-modules/common/ complet
Phase 5: WarFactory Integration (Mois 10-12)
Objectif: WF utilise grove-modules
- WF setup - Symlink grove-modules/
- Adaptateurs WF - wf_adapters/ pour customisation
- Tests cross-projet - Valider compatibilité
- CI/CD - Tests automatiques MC + WF
Livrable: Les deux projets partagent grove-modules/
Conventions de Code
Namespaces
namespace grove::modules::core {
class ResourceModule { };
}
namespace grove::modules::common {
class CombatModule { };
}
Versioning
// ResourceModule v1.2.3
#define RESOURCE_MODULE_VERSION_MAJOR 1
#define RESOURCE_MODULE_VERSION_MINOR 2
#define RESOURCE_MODULE_VERSION_PATCH 3
Configuration
{
"module_version": "1.2.3",
"game_specific": {
"mobile_command": { /* MC config */ },
"war_factory": { /* WF config */ }
},
"common": { /* Shared config */ }
}
Topics Pub/Sub
// Namespace par module
"resource:craft_complete"
"storage:save_complete"
"economy:price_changed"
"event:triggered"
"combat:ended"
Tests Cross-Projet
Test Framework
// 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
# .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
- Tests passent (MC + WF)
- Update CHANGELOG.md
- Tag version (v1.2.3)
- Update both projects
Bug Fixes
- Fix in grove-modules/
- Test MC
- Test WF
- 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:
- Développer pour MC d'abord (focus prototype)
- Identifier patterns réutilisables
- Extraire core library progressivement
- 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)