IA / Simulations /world_generator.py
Barouia's picture
Update Simulations/world_generator.py
ac17ad6 verified
Raw
History Blame Contribute Delete
17 kB
import asyncio
import random
import math
from typing import Dict, List, Any, Tuple
import logging
class WorldGenerator:
"""
Générateur de mondes virtuels avec paramètres quantiques
Crée des écosystèmes, physiques et réalités procédurales
"""
def __init__(self):
self.logger = logging.getLogger("world_generator")
self.reality_engine_active = False
self.quantum_parameters = {}
self.world_templates = {}
self.generated_worlds = []
async def initialize(self):
"""Initialise le générateur de mondes"""
self.logger.info("🌍 Initialisation du générateur de mondes...")
try:
await self._load_world_templates()
await self._setup_quantum_physics()
await self._calibrate_reality_engine()
self.reality_engine_active = True
self.logger.info("✅ Générateur de mondes activé")
return True
except Exception as e:
self.logger.error(f"❌ Erreur d'initialisation du générateur: {e}")
return False
async def generate_from_concept(self, concept: str, complexity: float) -> Dict[str, Any]:
"""Génère un monde complet basé sur un concept"""
if not self.reality_engine_active:
await self.initialize()
self.logger.info(f"🎲 Génération du monde: {concept} (complexité: {complexity})")
# Analyse du concept
concept_analysis = await self._analyze_concept(concept)
world_type = concept_analysis["primary_type"]
# Génération procédurale
world_data = {
"metadata": await self._generate_metadata(concept, complexity),
"physical_properties": await self._generate_physics(world_type, complexity),
"geography": await self._generate_geography(world_type, complexity),
"ecosystem": await self._generate_ecosystem(world_type, complexity),
"civilization": await self._generate_civilization(world_type, complexity),
"quantum_parameters": await self._generate_quantum_parameters(complexity),
"temporal_properties": await self._generate_temporal_properties(complexity)
}
# Calcul de la stabilité de la réalité
stability = await self._calculate_reality_stability(world_data)
world_data["reality_stability"] = stability
# Ajout aux mondes générés
self.generated_worlds.append({
"concept": concept,
"timestamp": __import__('time').time(),
"complexity": complexity,
"stability": stability
})
self.logger.info(f"✅ Monde généré: {concept} (stabilité: {stability:.3f})")
return world_data
async def _load_world_templates(self):
"""Charge les templates de mondes prédéfinis"""
self.world_templates = {
"quantum_forest": {
"name": "Forêt Quantique",
"description": "Forêt où les arbres existent en superposition",
"physics": "quantum_botany",
"colors": ["#00ff88", "#88ff00", "#0088ff"],
"sounds": ["résonance cristalline", "chuchotements quantiques"]
},
"crystal_city": {
"name": "Cité Cristalline",
"description": "Ville construite en cristaux vivants",
"physics": "crystal_growth",
"colors": ["#ff00ff", "#00ffff", "#ffff00"],
"sounds": ["vibrations cristallines", "harmonies géométriques"]
},
"floating_islands": {
"name": "Îles Flottantes",
"description": "Îles flottant dans un ciel quantique",
"physics": "anti_gravity",
"colors": ["#ff8800", "#88ff00", "#0088ff"],
"sounds": ["vents dimensionnels", "lévitation harmonique"]
},
"digital_realm": {
"name": "Royaume Numérique",
"description": "Monde fait de code et de données vivantes",
"physics": "computational",
"colors": ["#00ff00", "#0000ff", "#ff0000"],
"sounds": ["bits dansants", "algorithmes chantants"]
},
"time_garden": {
"name": "Jardin Temporel",
"description": "Jardin où le temps s'écoule de manière non-linéaire",
"physics": "temporal_fluid",
"colors": ["#ff0088", "#8800ff", "#00ff88"],
"sounds": ["échos du futur", "souffle du passé"]
}
}
self.logger.info(f"📚 {len(self.world_templates)} templates de mondes chargés")
async def _setup_quantum_physics(self):
"""Configure les paramètres de physique quantique"""
self.quantum_parameters = {
"superposition_threshold": 0.7,
"entanglement_range": 100.0,
"quantum_tunneling_probability": 0.3,
"wavefunction_collapse_time": 2.5,
"decoherence_resistance": 0.8,
"quantum_fluctuation_amplitude": 0.15
}
async def _calibrate_reality_engine(self):
"""Calibre le moteur de réalité"""
self.logger.info("⚙️ Calibration du moteur de réalité...")
await asyncio.sleep(0.5)
self.reality_engine = {
"dimensionality": random.randint(4, 11),
"entropy_level": random.uniform(0.2, 0.8),
"causal_structure": "quantum_indeterminate",
"reality_fabric_strength": random.uniform(0.75, 0.98)
}
async def _analyze_concept(self, concept: str) -> Dict[str, Any]:
"""Analyse le concept pour déterminer le type de monde"""
concept_lower = concept.lower()
# Détection du type basée sur les mots-clés
if any(word in concept_lower for word in ['forêt', 'arbre', 'nature', 'jungle']):
primary_type = "quantum_forest"
elif any(word in concept_lower for word in ['ville', 'cité', 'urbain', 'bâtiment']):
primary_type = "crystal_city"
elif any(word in concept_lower for word in ['île', 'flottant', 'ciel', 'air']):
primary_type = "floating_islands"
elif any(word in concept_lower for word in ['digital', 'code', 'donnée', 'virtuel']):
primary_type = "digital_realm"
elif any(word in concept_lower for word in ['temps', 'temporal', 'futur', 'passé']):
primary_type = "time_garden"
else:
primary_type = random.choice(list(self.world_templates.keys()))
return {
"primary_type": primary_type,
"complexity_score": len(concept) / 100,
"theme_coherence": random.uniform(0.6, 0.95),
"innovation_potential": random.uniform(0.5, 0.9)
}
async def _generate_metadata(self, concept: str, complexity: float) -> Dict[str, Any]:
"""Génère les métadonnées du monde"""
template = self.world_templates.get(
await self._analyze_concept(concept)["primary_type"],
self.world_templates["quantum_forest"]
)
return {
"name": f"{template['name']} de {concept}",
"original_concept": concept,
"description": f"{template['description']} - Concept: {concept}",
"creation_timestamp": __import__('time').time(),
"world_id": f"WORLD_{random.randint(10000, 99999)}",
"version": "1.0.0",
"template_used": template["name"],
"complexity_rating": complexity,
"exploration_status": "uncharted"
}
async def _generate_physics(self, world_type: str, complexity: float) -> Dict[str, Any]:
"""Génère les propriétés physiques du monde"""
base_physics = {
"gravity_type": random.choice(["standard", "variable", "selective", "negative"]),
"time_flow": random.choice(["linear", "variable", "multidirectional", "quantum"]),
"spatial_geometry": random.choice(["euclidean", "non_euclidean", "fractal", "quantum"]),
"light_behavior": random.choice(["standard", "quantum", "conscious", "emotional"]),
"matter_states": random.choice(["solid_liquid_gas", "quantum_superposition", "energy_patterns", "information_only"])
}
# Ajustements basés sur la complexité
if complexity > 0.8:
base_physics["dimensionality"] = random.randint(5, 11)
base_physics["quantum_effects"] = "macroscopic"
else:
base_physics["dimensionality"] = 4
base_physics["quantum_effects"] = "microscopic"
# Propriétés spécifiques au type
if world_type == "quantum_forest":
base_physics["botany_physics"] = "quantum_photosynthesis"
base_physics["animal_movement"] = "quantum_teleportation"
elif world_type == "crystal_city":
base_physics["architecture_physics"] = "crystal_growth"
base_physics["transportation"] = "light_refraction"
elif world_type == "floating_islands":
base_physics["gravity_type"] = "variable"
base_physics["atmosphere"] = "breathable_void"
return base_physics
async def _generate_geography(self, world_type: str, complexity: float) -> Dict[str, Any]:
"""Génère la géographie du monde"""
geography_types = {
"quantum_forest": ["forêts superposées", "rivières temporelles", "clairières quantiques"],
"crystal_city": ["districts cristallins", "avenues lumineuses", "places géométriques"],
"floating_islands": ["îles flottantes", "ponts de nuages", "cascades célestes"],
"digital_realm": ["paysages algorithmiques", "forêts de données", "lacs de code"],
"time_garden": ["jardins temporaires", "allées du futur", "bosquets du passé"]
}
features = geography_types.get(world_type, ["paysages quantiques", "géométries variables"])
# Ajout de caractéristiques basées sur la complexité
num_features = min(len(features), max(2, int(complexity * 6)))
selected_features = random.sample(features, num_features)
return {
"primary_biome": world_type,
"notable_features": selected_features,
"climate": random.choice(["tempéré", "variable", "quantum", "émotionnel"]),
"topology": random.choice(["variée", "extrême", "changeante", "superposée"]),
"water_bodies": await self._generate_water_bodies(world_type),
"mountain_ranges": await self._generate_mountains(world_type, complexity)
}
async def _generate_ecosystem(self, world_type: str, complexity: float) -> Dict[str, Any]:
"""Génère l'écosystème du monde"""
flora_types = {
"quantum_forest": ["Arbres superposés", "Fleurs temporelles", "Fougères quantiques"],
"crystal_city": ["Cristaux vivants", "Plantes lumineuses", "Fleurs géométriques"],
"floating_islands": ["Plantes volantes", "Arbres à lévitation", "Fleurs nuageuses"],
"digital_realm": ["Arbres de code", "Fleurs algorithmiques", "Plantes de données"],
"time_garden": ["Fleurs du futur", "Arbres du passé", "Plantes présentes"]
}
fauna_types = {
"quantum_forest": ["Oiseaux superposés", "Animaux quantiques", "Insectes temporels"],
"crystal_city": ["Créatures cristallines", "Animaux lumineux", "Êtres géométriques"],
"floating_islands": ["Oiseaux des nuages", "Créatures aériennes", "Animaux volants"],
"digital_realm": ["Entités de code", "Animaux algorithmiques", "Créatures de données"],
"time_garden": ["Animaux du futur", "Créatures du passé", "Êtres intemporels"]
}
flora = flora_types.get(world_type, ["Plantes quantiques", "Végétation étrange"])
fauna = fauna_types.get(world_type, ["Animaux mystérieux", "Créatures uniques"])
return {
"flora": random.sample(flora, min(3, len(flora))),
"fauna": random.sample(fauna, min(3, len(fauna))),
"food_chain": random.choice(["standard", "quantum", "symbiotique", "informationnelle"]),
"adaptation_level": "high" if complexity > 0.7 else "medium",
"biodiversity": round(complexity * 100, 1)
}
async def _generate_civilization(self, world_type: str, complexity: float) -> Dict[str, Any]:
"""Génère la civilisation du monde"""
if complexity < 0.4:
return {"development_level": "primitive", "inhabitants": []}
inhabitant_types = {
"quantum_forest": ["Êtres des forêts", "Gardien quantiques", "Esprits de la nature"],
"crystal_city": ["Habitant cristallins", "Architectes de lumière", "Gardiens géométriques"],
"floating_islands": ["Navigateurs des cieux", "Maîtres du vent", "Explorateurs célestes"],
"digital_realm": ["Entités de code", "Programmeurs conscients", "Archivistes de données"],
"time_garden": ["Jardiniers du temps", "Observateurs temporels", "Gardiens des époques"]
}
inhabitants = inhabitant_types.get(world_type, ["Êtres intelligents", "Habitant mystérieux"])
return {
"development_level": random.choice(["primitive", "medieval", "advanced", "transcendent"]),
"inhabitants": random.sample(inhabitants, min(2, len(inhabitants))),
"culture": random.choice(["spirituelle", "scientifique", "artistique", "philosophique"]),
"technology_level": await self._calculate_tech_level(complexity),
"government_type": random.choice(["démocratie", "théocratie", "technocratie", "anarchie"])
}
async def _generate_quantum_parameters(self, complexity: float) -> Dict[str, Any]:
"""Génère les paramètres quantiques du monde"""
return {
"superposition_scale": "microscopic" if complexity < 0.6 else "macroscopic",
"entanglement_density": round(complexity * 0.9, 3),
"quantum_coherence": round(random.uniform(0.7, 0.99), 3),
"reality_flexibility": round(complexity * 0.8, 3),
"observer_effect": "strong" if complexity > 0.7 else "weak",
"multiverse_connections": random.randint(3, 11) if complexity > 0.8 else 0
}
async def _generate_temporal_properties(self, complexity: float) -> Dict[str, Any]:
"""Génère les propriétés temporelles du monde"""
return {
"time_flow_rate": random.uniform(0.5, 2.0),
"causal_structure": "linear" if complexity < 0.5 else "quantum",
"time_travel_possibility": complexity > 0.7,
"temporal_anomalies": random.randint(0, 5) if complexity > 0.6 else 0,
"age_of_universe": f"{random.randint(1, 100)} milliards d'années"
}
async def _generate_water_bodies(self, world_type: str) -> List[str]:
"""Génère les plans d'eau"""
water_types = {
"quantum_forest": ["rivières superposées", "lacs quantiques", "cascades temporelles"],
"crystal_city": ["canaux de lumière", "fontaines cristallines", "bassins géométriques"],
"floating_islands": ["océans célestes", "rivières de nuages", "chutes d'air"],
"digital_realm": ["mers de données", "rivières de code", "lacs algorithmiques"],
"time_garden": ["rivières du temps", "lacs éternels", "océans du présent"]
}
return water_types.get(world_type, ["océans", "rivières", "lacs"])
async def _generate_mountains(self, world_type: str, complexity: float) -> List[str]:
"""Génère les chaînes de montagnes"""
mountain_types = {
"quantum_forest": ["montagnes superposées", "pic quantiques", "collines temporelles"],
"crystal_city": ["structures cristallines", "tours de lumière", "pyramides géométriques"],
"floating_islands": ["montagnes flottantes", "pics célestes", "plateaux aériens"],
"digital_realm": ["montagnes de code", "collines algorithmiques", "pics de données"],
"time_garden": ["montagnes du futur", "collines du passé", "pics éternels"]
}
mountains = mountain_types.get(world_type, ["montagnes", "collines", "plateaux"])
num_mountains = min(len(mountains), max(1, int(complexity * 3)))