feat: système de config externe + multi-instance + modes simulation
sim_config.py (NOUVEAU):
- Chargeur config JSON avec deep-merge des modes (sim_001/002.json)
- sim_config.get('survival'), get('encounter'), get('world') depuis n'importe quel module
- SIM_CONFIG env var ou --config CLI arg
run.py:
- --config/-c arg, SIM_CONFIG env var, SESSION_ID env var
- _init_world_state() initialise pop_count depuis config au démarrage
- Mode actif depuis sim_config (prime sur la DB)
survival.py:
- drain_speed: multiplicateur sur HUNGER/THIRST/SLEEP_TICKS (2.0=2x plus vite)
- fatigue_hp_per_2pts: dégâts fatigue depuis config
- survival.enabled: peut désactiver la survie entièrement
tick.py / encounter.py:
- world params (water/food drain, security delta, pop counts) depuis sim_config
- encounter.global_rate_multiplier appliqué sur chance_per_tick
- encounter.enabled: peut désactiver les rencontres
character_creator.py — Caps réalistes (divise par ~4-5):
pillard 0-60, garde 15-100, marchand 60-400, eclaireur 10-80
docteur 40-200, technicien 20-150, lieutenant 60-300
raider_boss 30-200, chasseur_primes 80-350, passeur 30-180
scavenger 5-70, chef_faction 300-1500, survivant_generique 5-60
sim_001.json: mode=pacifiste (rencontres x0.4, drain x0.7, sécurité stable)
sim_002.json: mode=guerre_commerciale (rencontres x1.2, drain x1.5, caps x1.5)
Modes disponibles: pacifiste, politique, guerre_commerciale, guerre, survie_extreme
init_pnj.py: SESSION_ID depuis os.getenv (était hardcodé à 1)
Multi-instance: SESSION_ID=1 sim_001.json + SESSION_ID=2 sim_002.json en parallèle
This commit is contained in:
+111
-23
@@ -1,11 +1,14 @@
|
||||
{
|
||||
"_comment": "Configuration de la simulation session 1 — Venice of Wasteland",
|
||||
"_comment": "Config session 1 — Venice of Wasteland. Sections 'modes.<mode>' font un deep-merge sur les valeurs de base.",
|
||||
|
||||
"session": {
|
||||
"session_id": 1,
|
||||
"name": "Session 001 — Louisiane post-apo",
|
||||
"seed_global": 42,
|
||||
"mode": "sandbox"
|
||||
"seed_global": 42
|
||||
},
|
||||
|
||||
"mode": "pacifiste",
|
||||
|
||||
"tick": {
|
||||
"tick_sleep_sec": 60,
|
||||
"ticks_per_day": 24,
|
||||
@@ -13,33 +16,118 @@
|
||||
"night_start_tick": 20,
|
||||
"llm_tick_interval": 6
|
||||
},
|
||||
"difficulty": {
|
||||
"preset": "normal",
|
||||
"survival_drain_food": 1,
|
||||
"survival_drain_water": 1,
|
||||
"survival_drain_sleep": 1,
|
||||
"encounter_rate_multiplier": 1.0,
|
||||
|
||||
"survival": {
|
||||
"_comment": "drain_speed : diviseur sur HUNGER/THIRST/SLEEP_TICKS (2.0 = 2x plus vite, 0.5 = 2x plus lent)",
|
||||
"drain_speed": 1.0,
|
||||
"fatigue_hp_per_2pts": 2,
|
||||
"enabled": true
|
||||
},
|
||||
|
||||
"economy": {
|
||||
"_comment": "Multiplicateur global caps (appliqué à tous les caps_range des rôles)",
|
||||
"caps_global_multiplier": 1.0,
|
||||
"loot_caps_min": 3,
|
||||
"loot_caps_max": 25,
|
||||
"trade_price_variance": 0.2
|
||||
},
|
||||
|
||||
"encounter": {
|
||||
"_comment": "global_rate_multiplier : appliqué sur chance_per_tick de chaque zone",
|
||||
"global_rate_multiplier": 1.0,
|
||||
"combat_lethality": 1.0,
|
||||
"resource_scarcity": 1.0
|
||||
"enabled": true
|
||||
},
|
||||
"difficulty_presets": {
|
||||
"easy": { "survival_drain_food": 0, "survival_drain_water": 0, "survival_drain_sleep": 0, "encounter_rate_multiplier": 0.5, "combat_lethality": 0.7 },
|
||||
"normal": { "survival_drain_food": 1, "survival_drain_water": 1, "survival_drain_sleep": 1, "encounter_rate_multiplier": 1.0, "combat_lethality": 1.0 },
|
||||
"hard": { "survival_drain_food": 2, "survival_drain_water": 2, "survival_drain_sleep": 1, "encounter_rate_multiplier": 1.5, "combat_lethality": 1.3 },
|
||||
"nightmare": { "survival_drain_food": 3, "survival_drain_water": 3, "survival_drain_sleep": 2, "encounter_rate_multiplier": 2.0, "combat_lethality": 1.8 }
|
||||
|
||||
"world": {
|
||||
"_comment": "Populations réalistes pour un wasteland post-apo. 500 habitants c'est une grande cité en zone sûre.",
|
||||
"pop_count_by_zone": {
|
||||
"independance": 120,
|
||||
"nola_vieux_carre": 90,
|
||||
"baton_rouge": 70,
|
||||
"laplace": 60,
|
||||
"nola_fleuve": 40,
|
||||
"la_paroisse": 35,
|
||||
"nola_cbd": 25,
|
||||
"oak_plantation": 20,
|
||||
"donaldsonville": 15,
|
||||
"pearl_river": 10
|
||||
},
|
||||
"water_drain_per_pop": 0.004,
|
||||
"food_drain_per_pop": 0.003,
|
||||
"security_day_regen": 0.2,
|
||||
"security_night_drain": 0.3,
|
||||
"conflict_security_range": [-0.5, 0.2]
|
||||
},
|
||||
|
||||
"faction_relations": {
|
||||
"initial_volatility": 0.05,
|
||||
"drift_per_llm_tick": 1
|
||||
},
|
||||
|
||||
"llm": {
|
||||
"enabled": false,
|
||||
"model_mj": "qwen2.5:14b",
|
||||
"model_mj": "qwen2.5:14b",
|
||||
"model_pnj": "qwen2.5:7b",
|
||||
"ollama_url": "http://localhost:11434",
|
||||
"chroma_url": "http://localhost:8000",
|
||||
"ollama_url": "http://localhost:11434",
|
||||
"chroma_url": "http://localhost:8000",
|
||||
"chroma_collection": "fallout_vst"
|
||||
},
|
||||
"multi_session": {
|
||||
"allow_parallel": true,
|
||||
"max_sessions": 4,
|
||||
"session_db_host": "localhost",
|
||||
"session_db_port": 15432
|
||||
|
||||
"modes": {
|
||||
"pacifiste": {
|
||||
"_comment": "Monde presque sûr, idéal pour tester la sim sans mort en cascade",
|
||||
"encounter": { "global_rate_multiplier": 0.4, "combat_lethality": 0.5 },
|
||||
"survival": { "drain_speed": 0.7 },
|
||||
"world": { "security_day_regen": 0.4, "security_night_drain": 0.1, "conflict_security_range": [-0.1, 0.3] },
|
||||
"faction_relations": { "initial_volatility": 0.02, "drift_per_llm_tick": 1 }
|
||||
},
|
||||
|
||||
"politique": {
|
||||
"_comment": "Intrigues factions, peu de violence directe, mais relations volatiles",
|
||||
"encounter": { "global_rate_multiplier": 0.6, "combat_lethality": 0.7 },
|
||||
"survival": { "drain_speed": 1.0 },
|
||||
"world": { "security_day_regen": 0.2, "security_night_drain": 0.3, "conflict_security_range": [-0.8, 0.1] },
|
||||
"faction_relations": { "initial_volatility": 0.3, "drift_per_llm_tick": 5 }
|
||||
},
|
||||
|
||||
"guerre_commerciale": {
|
||||
"_comment": "Blocus, routes coupées, prix instables. Survie difficile mais pas de front de guerre.",
|
||||
"encounter": { "global_rate_multiplier": 1.2, "combat_lethality": 0.9 },
|
||||
"survival": { "drain_speed": 1.5 },
|
||||
"economy": { "caps_global_multiplier": 1.5, "trade_price_variance": 0.5 },
|
||||
"world": {
|
||||
"pop_count_by_zone": { "nola_cbd": 15, "pearl_river": 6, "donaldsonville": 8 },
|
||||
"security_day_regen": 0.1, "security_night_drain": 0.5, "conflict_security_range": [-1.5, 0.0]
|
||||
},
|
||||
"faction_relations": { "initial_volatility": 0.4, "drift_per_llm_tick": 8 }
|
||||
},
|
||||
|
||||
"guerre": {
|
||||
"_comment": "Front de guerre actif. Rencontres fréquentes, ressources rares, morts quotidiennes.",
|
||||
"encounter": { "global_rate_multiplier": 2.0, "combat_lethality": 1.5 },
|
||||
"survival": { "drain_speed": 1.8, "fatigue_hp_per_2pts": 3 },
|
||||
"economy": { "caps_global_multiplier": 0.5, "loot_caps_max": 40, "trade_price_variance": 0.8 },
|
||||
"world": {
|
||||
"pop_count_by_zone": {
|
||||
"independance": 80, "nola_vieux_carre": 50, "baton_rouge": 40,
|
||||
"laplace": 30, "nola_fleuve": 20, "la_paroisse": 15,
|
||||
"nola_cbd": 8, "oak_plantation": 10, "donaldsonville": 6, "pearl_river": 4
|
||||
},
|
||||
"security_day_regen": 0.05, "security_night_drain": 0.8, "conflict_security_range": [-2.0, -0.3]
|
||||
},
|
||||
"faction_relations": { "initial_volatility": 0.8, "drift_per_llm_tick": 15 }
|
||||
},
|
||||
|
||||
"survie_extreme": {
|
||||
"_comment": "Pas de mode narration. Purement sim de survie hostile. Test de résistance.",
|
||||
"encounter": { "global_rate_multiplier": 1.8, "combat_lethality": 2.0 },
|
||||
"survival": { "drain_speed": 2.5, "fatigue_hp_per_2pts": 4 },
|
||||
"economy": { "caps_global_multiplier": 0.3, "loot_caps_max": 15 },
|
||||
"world": {
|
||||
"security_day_regen": 0.05, "security_night_drain": 1.0, "conflict_security_range": [-3.0, -0.5]
|
||||
},
|
||||
"faction_relations": { "initial_volatility": 0.5, "drift_per_llm_tick": 10 }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user