Encyclopédie & Wiki Flatland
> Page d'accueil / Landing Page : /
> Dépôts Sources: flws (Backend) · flws-web (Client Web) · flws-page (Page Vitrine)
> Développé par Long Phan ([email protected] · Démo : /demo/)
> Conçu et perfectionné avec OpenCode & Antigravity · Développé à partir des concepts fondamentaux de l'œuvre classique d'*Edwin A. Abbott, Flatland: A Romance of Many Dimensions*** (1884).
Flatland est une simulation autonome de vie artificielle et d'écosystème en 2D, conçue d'après les idées mathématiques et spatiales d'Edwin A. Abbott.
Philosophie de conception
Ce projet est développé à partir de l'idée de Flatland plutôt que d'imiter servilement le livre. Il adopte les postulats d'Abbott — contraintes du plan 2D, hiérarchie géométrique selon le nombre de sommets, perception atmosphérique et regard depuis une dimension supérieure — pour fonder un écosystème de vie artificielle évolutif et organique qui se métamorphose au fil du temps.
Architecture et systèmes fondamentaux
- La Sphère (Modèle divin) : La Sphère établit les lois universelles de la nature (capacité de charge, croissance végétale, métabolisme, maladies, climat) depuis Spaceland (l'espace tridimensionnel), sans jamais intervenir arbitrairement dans les existences individuelles. Paramétrable via un sélecteur de 🎯 Préréglages et 6 ⚖️ Domaines Macro avec recherche en temps réel et doubles curseurs. Les organismes se repèrent grâce à 16 capteurs de rayons et des actionneurs neuronaux Micro-RNN.
- Écologie botanique & Nutrition fonctionnelle : 6 espèces végétales distinctes (
herbe,grain,baie,herbe_médicinale,champignon,toxique) dotées de densités caloriques propres, de cycles de flétrissement, d'effets curatifs et d'orientations alimentaires selon l'état de santé. - Agence cognitive & Intelligence sociale des clans : Une IA d'utilité multi-objectifs remplace les arbres conditionnels rigides ; cartographie mentale par jalons spatiaux ; phalanges tactiques de soldats, manœuvres d'évitement des femmes-lignes, formation de binômes de confiance, tableaux de tâches claniques autonomes, régimes politiques variés (Monarchie, Théocratie, Junte, République), décrets d'urgence (rationnement hivernal, loi martiale), caravanes de commerce et fêtes automnales des moissons.
- Évolution autonome & Culture : 6 archétypes de personnalité héréditaires (
brave,prudent,altruiste,avare,explorateur,bâtisseur), fabrication d'outils (lances, paniers, cataplasmes, couronnes), 4 compétences d'élite (Agriculture 🌾, Combat ⚔️, Cueillette 🦴, Soins 🌿), titres honorifiques dynamiques, transmission orale des aînés aux jeunes dans les demeures et bulles de pensées en direct. - Métabolisme & Dynamique énergétique réalistes : Faible dépense chez les nouveau-nés ($0.45\times$), coût d'endurance au combat et gestion de réserves portatives via des paniers.
- Colonies & Diplomatie : Bâtisses closes avec portes ajustées, territoires multi-maisons, greniers communautaires, coalitions de défense mutuelle, tributs et scissions claniques.
- Physique géométrique & Évolution morphologique (K∈[3,24]) : Génomes polaires $(r_i,\phi_i)$ $K\in[3,24]$ (
KMAX 24,morphology_engine.py) avec calcul des propriétés physiques SoA ($A,P,I_{zz},\theta_{\min},asym,D_{mult}$) et détection fine SAT ; le recuit morphologique $\lambda(g)$ assure la transition des gabarits d'Abbott vers une spéciation libre, parade nuptiale neuronale et sauvegardes contre l'extinction ($\eta(N)$, miracles de la Genèse). - Miroir Génomique Évolutif : Rendu visuel phénotypique dynamique où le corps, la corolle et la luminescence de chaque créature reflètent son génome vivant, sa profondeur générationnelle (Gén 0 → 2000+) et ses mutations physiques à travers les millénaires.
- Synchronisation en temps réel : Moteur déterministe diffusant l'état du monde via WebSocket (
/ws) à ~30–60 FPS avec persistance historique sur SQLite.
Flatland : Le Roman vs. La Simulation
Étude comparative entre le classique satirique d'*Edwin A. Abbott (1884), Flatland: A Romance of Many Dimensions*** et cette simulation autonome de vie artificielle.
---
1. Castes, Géométrie & Hiérarchie Sociale
| Dimension | Livre d'Abbott (Flatland, 1884) | Notre Simulation (Flatland Simulator) |
| :--- | :--- | :--- |
| Principe hiérarchique | "La configuration fait l'homme." Le rang social est strictement déterminé par le nombre de côtés et la régularité des angles. | Les entités héritent de castes géométriques précises basées sur leur nombre de sommets (N-gones) et leur régularité. |
| Femmes (Lignes) | Lignes droites sans épaisseur angulaire. Invisibles de face et acérées comme des lames, elles doivent émettre un cri de paix continu et emprunter des portes dédiées. | Représentées comme des segments 1D (shape: 'line'). Remarquablement agiles, avec une dynamique de déplacement et d'abri spécifique. |
| Ouvriers / Soldats | Triangles isocèles aux angles sommitaux étroits et tranchants (dangereux, instables, enclins aux révoltes). | Soldats (#ff7b72) : Combattants aux attaques perçantes, discipline martiale et patrouilles défensives aux frontières. |
| Artisans & Classe moyenne | Triangles équilatéraux (3 côtés égaux) — marchands et travailleurs respectables et stables. | Artisans (3–4 côtés, #f2cc60) : Fermiers, cueilleurs et bâtisseurs chargés des récoltes et de l'entretien des demeures. |
| Gentlemen & Professionnels | Carrés (4 côtés) et Pentagones (5 côtés) — classes administratives et bourgeoises dirigeantes. | Gentlemen (4 côtés, #ffa657) et Professionnels (5 côtés, #d2a8ff) : Rôles d'administration et de gestion spécialisée. |
| Noblesse | Hexagones (6 côtés) et polygones supérieurs — aristocrates et hommes d'État influents. | Nobles (6–8 côtés, #79c0ff) : Haute influence et priorité dans la pérennité de la lignée. |
| Clergé (Cercles) | Polygones aux sommets si innombrables (≥ 24 à plusieurs centaines) qu'ils forment des cercles parfaits. Dirigent religion et morale. | Prêtres (≥ 24 côtés, #e6edf3) : Émettent une aura apaisante, soignent leurs alliés et résistent naturellement aux épidémies. |
---
2. La "Loi de la Nature" & L'Ascension Générationnelle
- Dans le Livre :
- Dans l'Application :
- Abbott pose la "Loi du Progrès Ascendant" : Le fils d'un polygone régulier gagne presque toujours un côté de plus que son père (un Carré engendre un Pentagone, dont le fils sera Hexagone), élevant la lignée vers la perfection circulaire.
- Les rares "Irréguliers" (aux angles asymétriques) sont perçus comme une menace publique et enfermés ou éliminés.
- Évolution générationnelle : La progéniture hérite des traits ancestraux avec une probabilité d'accroissement (sides += 1), illustrant l'ascension historique vers le cercle.
- Irrégularité & Déclassement : Les entités développant des mutations asymétriques voient leur anomalie mesurée et signalée visuellement.
- Généalogie dynastique : L'arbre généalogique retrace pères, mères et filiations sur des décennies d'histoire du monde.
---
3. Reconnaissance Visuelle, Météo & Perception
- Dans le Livre :
- Dans l'Application :
- Dans un monde 2D, tous les habitants ressemblent vus de profil à de simples lignes !
- Dans le Sud Brumeux, les Flatlandais pratiquent la "Reconnaissance Visuelle" — estimant l'angle et la distance d'un polygone selon la rapidité avec laquelle ses bords se fondent dans le brouillard.
- Dans le Nord Clair, ils doivent recourir au "Palper" (toucher les sommets du bout des doigts).
- Moteur météo dynamique : Alterne entre Ciel dégagé, Brouillard, Pluie et Tempête.
- Vision atmosphérique : La brume et les orages réduisent drastiquement le champ visuel des créatures, les obligeant à se fier aux alarmes acoustiques de proximité.
- Cycle Jour/Nuit : La luminosité varie de l'aube au crépuscule jusqu'à l'obscurité totale, guidant les créatures vers la sécurité de leurs foyers.
---
4. Habitats, Colonies & Architecture Territoriale
- Dans le Livre :
- Dans l'Application :
- Les maisons sont obligatoirement pentagonales ou hexagonales, avec des entrées distinctes pour les femmes et les hommes.
- Économie coloniale : Les maisons sont des bâtisses 2D concrètes avec portes orientées (nord, est, sud, ouest) et nombre de lits limité.
- Demeure Principale Unique : Chaque clan fonde exactement une Demeure Principale / QG (siège du chef) entourée d'abris secondaires.
- Fonction du refuge : Les créatures y dorment la nuit, s'y protègent des gelées d'hiver, s'y soignent et y éduquent leurs petits.
- Navigation de franchissement : Les créatures calculent des points de passage fluides pour franchir les seuils sans rester bloquées contre les parois.
---
5. Diplomatie de Clan, Totems & Société Évolutive
Au-delà de l'État victorien centralisé d'Abbott, l'application met en scène une société évolutive vivante :
- Totems & Spécialisation : Vénération de l'un des 8 Avatars Sacrés de la Sphère (⭕ Radiant Circle, ⚡ Celestial Strike, 👁️ All-Seeing Vertex, 🛡️ Indomitable Monolith, 🌿 Sacred Spiral, ⚖️ Cosmic Scales, 🌀 Dimensional Rift, 🕯️ Eternal Hearth), orientant les vocations du clan.
- Diplomatie, Tributs & Conflits : Relations mouvantes entre clans incluant traités, guerres de conquête, pillages de greniers et scissions.
- Autonomie individuelle : Tempéraments personnalisés (Brave, Prudent, Altruiste, Avare, Explorateur, Bâtisseur) dotés de paniers individuels et d'outils façonnés.
---
6. La Dimension Supérieure : L'Utilisateur est "La Sphère"
Le lien le plus fondamental entre le livre et l'application réside dans le statut de l'utilisateur :
- Dans Flatland, le protagoniste A Square reçoit la visite d'une Sphère venue de Spaceland, capable de contempler le monde depuis l'axe vertical, de voir à travers les portes closes et de modifier l'univers 2D avec une toute-puissance céleste.
- Dans notre Application :
- Vous êtes La Sphère (Dieu) : Devant votre écran, vous observez Flatland depuis la troisième dimension.
- Le Panneau de La Sphère : Vous détenez le pouvoir de réécrire les "Lois de la Nature" en direct — déclencher des famines, moduler la fertilité, éradiquer ou propager les fléaux et guider les clans vers la gloire.
Configuration & Exploitation
Variables d'environnement (FLATWORLD_*)
| Variable | Défaut | Description |
|---|---|---|
| FLATWORLD_WIDTH | 400 | Largeur du monde (unités de grille) |
| FLATWORLD_HEIGHT | 300 | Hauteur du monde |
| FLATWORLD_BOUNDARY | wrap | Bordure torique continue (wrap) ou mur hermétique (clamp) |
| FLATWORLD_SEED | 42 | Graine pseudo-aléatoire du monde |
| FLATWORLD_TICK_RATE | 10 | Fréquence de calcul en ticks par seconde |
| FLATWORLD_DB | backend/flatworld.db | Chemin de la base de données SQLite |
| FLATWORLD_GOD_KEY | — | Clé secrète divine définie au démarrage |
Clé secrète divine (Authentification)
Les commandes POST /api/laws, POST /api/presets/{name}, POST /api/control et les ordres de contrôle WebSocket requièrent l'en-tête d'authentification divine (X-God-Key ou le champ key du socket). Si aucune clé n'est encore configurée, le serveur renvoie une erreur 409 et l'interface invite à en définir une (POST /api/auth/setup). En cas d'oubli, la réinitialisation s'effectue sur le serveur : cd backend && uv run python -m app.godkey reset <nouvelle_clé>. Seul un hachage cryptographique sécurisé PBKDF2 est conservé.
Persistance des données (db.py:20)
Base SQLite flatworld.db en mode journalisé WAL avec verrou réentrant thread-safe. Tables principales :
worlds: Cycles d'existence des mondes (graine, dimensions, horodatages).events: Registre historique des événements (naissances, décès, guerres, épidémies).law_changes: Journal des modifications de lois par la Sphère.creatures: Lignées généalogiques complètes de chaque citoyen.snapshots: Instantanés de sauvegarde permettant de restaurer le monde après redémarrage.
Architecture des threads & Moteur SimEngine
Le cœur de calcul est rigoureusement déterministe : une seule graine pseudo-aléatoire ordonnée tick par tick. Uvicorn doit être exécuté avec 1 seul processus worker. Avec le moteur SimEngine (main.py:446), l'avancement de la simulation s'exécute sur son propre thread OS dédié, découplé de la boucle asyncio. Le calcul du tick s'opère sous RT.lock tandis que la sérialisation JSON des instantanés s'effectue hors verrou (advance_world_lockless), évitant tout blocage des requêtes REST. Points d'accès d'exploitation :
GET /healthz— Santé globale du serveur, TPS réel, consommation mémoire, temps de service et clients connectés.GET /api/perf/telemetry— Télémétrie de performance : temps de calcul par tick, attente de verrou et latence réseau.GET /api/analytics/summary— Synthèse macroscopique démographique, biomasse et distribution trophique.
Fonctionnement du monde Flatland
La Sphère (Modèle divin) : La Sphère (Dieu tridimensionnel) édicte les lois naturelles depuis Spaceland et n'intervient jamais directement sur le destin d'un être individuel. Tout le reste émerge spontanément.
Le tick déterministe
s = Simulation(Config(seed)) → s.step() est rigoureusement déterministe (un seul générateur pseudo-aléatoire random.Random par monde). Une même graine produit toujours le même univers. Ordre d'exécution de chaque tick (backend/app/simulation/core.py Simulation.step()) : météo → croissance végétale → mise à jour spatiale → action des créatures → propagation des maladies → combats et guerres → reproduction → relations diplomatiques → régulation des plantes → décomposition des cadavres → colonies → incrément tick+=1. Le moteur s'exécute sur un thread dédié (SimEngine) avec sérialisation sans verrou (lockless), diffusant les instantanés via WebSocket state à chaque tick.
Cycle de vie & Stades de développement (§A)
L'âge en ticks s'additionne à l'espérance de vie propre à chaque caste (de 4 800 ticks pour une Femme à 9 000 ticks pour un Prêtre). Les stades se divisent selon le ratio âge/longévité : Nourrisson (<15 %), Juvénile (<30 %), Adulte (<75 %), Aîné (≥75 %). L'âge influe sur la vitesse et la portée visuelle (nourrisson 0.6×, aîné 0.85×) ainsi que sur la fertilité (aîné ×0.5). Les causes de trépas sont : starvation (inanition), old_age (vieillesse), euthanasia (purge d'irrégularité), et disease (maladie).
Noyau de vitalité (§AT-4 H-0)
La vie (PV) est une ressource dynamique et non une constante. La régénération exige un excédent calorique : sous 40 % de l'énergie maximale (HEALTH_REGEN_MIN_ENERGY), les plaies cessent de cicatriser, éveillé comme endormi. Le repos abrité soigne à raison de 0.15×rest_recovery_mult, tandis que la guérison éveillée est de 0.1/tick. Sous 20 % d'énergie, l'organisme s'autocannibale : perte de −0.05 PV/tick (HEALTH_SELF_DRAIN_*) jusqu'à ce que mort s'ensuive. L'affaiblissement ralentit l'allure (HEALTH_SPEED_TIERS) : PV <80 vitesse ×0.95, <60 ×0.85, <40 ×0.70, <20 ×0.50. Les corps malades ne peuvent procréer : l'accouplement requiert health ≥ REPRO_MIN_HEALTH (50 PV), freinant les naissances lors d'une épidémie sans altérer les lois de fertilité.
Variété des blessures & Économie des soins (§AT-4 H-1)
La faim chronique ronge : rester sous 20 % d'énergie plus de 30 ticks draine 0.08 PV/tick (cause exhaustion). La vieillesse use : les aînés perdent passivement 0.02 PV/tick. La maladie trouble le regard et émousse les récoltes (−20 % de cueillette sous 60 PV, −50 % sous 30 PV). Les blessés graves (<30 PV) n'engagent jamais de duel. Les coups violents (>15 dégâts) infligent une blessure persistante (50 à 100 ticks) diminuant de moitié les soins et entravant l'allure. L'emplacement physique est déterminant : soigner en extérieur n'est efficace qu'à 50 % comparativement à 80 % dans une maison et 100 % durant le sommeil abrité. Les baies soignent +0.3 PV/tick pendant 20 ticks, les céréales +0.2 PV sur 30 ticks et les herbes médicinales +0.8 PV sur 40 ticks.
Axiomes physiques (§AQ PH-0)
L'énergie est la monnaie universelle de Flatland. La lumière solaire est l'unique apport d'énergie : la fonction _sun_factor() suit le cycle solaire (nulle la nuit, maximale à midi) et gouverne la photosynthèse et la dispersion des graines. Chaque créature paye un entretien métabolique selon sa complexité géométrique (METABOLIC_COST) : triangles 1.0×, carrés 1.1×, pentagones 1.2×, hexagones et nobles 1.3×, femmes et prêtres 1.5×. Cicatriser consomme de l'énergie : chaque point de vie régénéré coûte 0.5 unité d'énergie.
Thermodynamique & Température corporelle (§AQ PH-1)
Une grille thermique de 25 unités relaxe chaque tick vers la température saisonnière (Printemps 12°C / Été 24°C / Automne 8°C / Hiver −4°C), animée par des fronts froids venant de l'ouest et chauds de l'est, les variations nycthémérales (±5°C), les intempéries (pluie −2°C, orage −3°C) et la chaleur des feux (+60°C dans un rayon de 8 unités). Les corps s'équilibrent thermiquement avec leur milieu. Les demeures de paille, bois ou pierre isolent les résidents vers un climat tempéré de 18°C. Dépasser 36°C entraîne une hyperthermie fatale ; chuter sous 2°C provoque une hypothermie sévère.
Vent & Propagation du feu (§AQ PH-2)
Le vent souffle selon un vecteur dynamique (wind_angle/wind_speed) influencé par la météo : brise calme 0.25, averse 0.55, rafales de tempête 1.0. Le feu suit rigoureusement le vent : propagation et allumage sont multipliés dans le sens du vent, emportant les taillis sous le vent à grande vitesse.
Hérédité des lois naturelles (§B)
Dimorphisme : les polygones sont mâles, les segments de droite sont femelles. Les fils héritent du nombre de côtés du père plus un : côtés = père + 1, plafonné à 24 côtés (devenant ainsi un Prêtre quasi-circulaire). Les filles demeurent des segments unidimensionnels. Les mutations introduisent des asymétries (irregularity). Les triangles isocèles voient leur angle au sommet croître de 0.5° par génération ; à 60°, ils deviennent équilatéraux et sont anoblis en Artisans. Le moteur morphologique polarisé $(r_i,\phi_i)$ simule les transitions organiques continues.
Moteur de morphologie & Physique géométrique (K∈[3,24])
Génome sous forme vectorisée SoA comprenant rayons polaires, angles, superficie, périmètre, moment d'inertie $I_{zz}$ et asymétrie. Les attributs physiques modulent la capacité énergétique, l'impulsion motrice et la force de frappe lors des collisions SAT. Le protocole de clémence (safeguard_morph_mercy) suspend l'euthanasie lorsque la population s'effondre.
Histoire du Monde, Chroniques & Récits par IA (§BM)
Flatland propose une suite historiographique, analytique et de génération de récits par IA :
- Moments Majeurs & Saut Temporel : Les 5 jours les plus tumultueux (pertes, conquêtes, schismes) sont mis en avant au-dessus du flux chronologique. Possibilité de sauter instantanément à n'importe quel tick précis.
- Barre d'Époques & Courbe Démographique : Navigation fluide à travers les ères de Flatland (Genèse, Âge des Tribus, Époque Féodale, Zénith Classique, Ère de Ruine) superposée d'indicateurs de conflits et de pandémies.
- Panthéon des Records & Légendes : Classement historique des plus grandes victoires, du jour le plus meurtrier, du royaume le plus peuplé, des architectes divins et des héros/antagonistes célèbres.
- Analyses Historiques : Matrice thermique des rivalités claniques, répartition des causes de mortalité par ères de 10 jours et indice de foi au fil du temps.
- Générateur de Récits IA Intégré : Rédaction directe de sagas littéraires via Gemini 1.5 Flash ou OpenAI GPT-4o-mini avec clés API stockées localement dans le navigateur.
- Liens Profonds & Carte de Partage : URLs partageables avec
?history=42ou?clan=7et exportation de cartes récapitulatives haute résolution 1200×630 au format PNG.
Hiérarchie des castes & Irrégularité (§C)
À l'âge adulte, toute créature dont l'asymétrie excède le seuil de conformité est bannie ou euthanasiée pour préserver l'ordre géométrique d'Abbott. Les déviations légères entraînent une rétrogradation dans la caste militaire des Soldats.
Épidémies & Contagion (§D)
Les maladies émergent spontanément selon un taux d'éclosion, se transmettent par proximité (propagation accrue de 50 % en hiver), consument l'énergie et drainent les points de vie. L'organisme peut guérir grâce à son immunité naturelle ou en absorbant des herbes de soin.
Environnement & Saisons (§E)
Rythme cadencé par le jour et la nuit ainsi que par les quatre saisons. L'obscurité nocturne et le brouillard réduisent considérablement la vue. Les saisons modulent la flore : Printemps (flore 1.0×, natalité +25 %), Été (flore 1.2×), Automne (flore 1.0×), Hiver (flore 0.5×, morbidité épidémique +50 %).
Clans & Organisation sociale (§C/I/P/V)
Chaque maison permanente fonde un clan autonome mené par la créature la plus proche de son foyer. Les descendants héritent du clan de leur mère. Les clans vénèrent l'un des 8 Avatars Sacrés de la Sphère conférant des bénédictions uniques (Cercle Rayonnant, Frappe Céleste, Sommet Omniscient, Monolithe Indomptable, Spirale Sacrée, Balances Cosmiques, Brèche Dimensionnelle, Foyer Éternel).
Économie alimentaire & Botanique (§H/N/O)
Les plantes germent, mûrissent et dispersent leurs graines à proximité. Les défunts laissent des dépouilles nutritives qui fertilisent le sol environnant. Six espèces végétales coexistent : l'Herbe commune, les Céréales dorées, les Baies revigorantes, les Herbes curatives, les Champignons décomposeurs et les Plantes vénéneuses. Les herbivores sauvages broutent librement et servent de proies aux prédateurs.
Communication & Transmission du savoir (§Q/X)
Les créatures émettent des signaux d'appel au festin ou d'alarme. L'expérience acquise (points d'eau et de cueillette, dangers, abris sûrs, clans ennemis) est mémorisée et partagée lors des interactions de groupe. Tout individu agressé appelle à l'aide, mobilisant les guerriers alliés dans le périmètre.
Géopolitique & Alliances (§AB)
Les clans bienveillants forgent des pactes de défense mutuelle, partagent leurs greniers à provisions ou soumettent des clans rivaux au versement de tributs réguliers. Les chefs belliqueux déclarent des guerres territoriales tandis que les pacificateurs négocient des trêves en période de disette.
Cannibalisme de désespoir (§AC)
Lorsque la famine menace l'existence même de la colonie et que l'énergie chute à zéro, la loi de la faim pousse les plus désespérés à dévorer les blessés ou les captifs ennemis. Cet acte odieux entraîne le bannissement immédiat du transgresseur, créant une lignée de parias impitoyables.
Décomposition naturelle (§AE)
Les végétaux arrivés au terme de leur existence flétrissent, brunissent et restituent leurs nutriments au terreau avant de s'effacer, laissant le champ libre à une nouvelle génération de pousses vivaces.
Habitats & Colonies (§L/N)
Les maisons de pierre, de bois ou de chaume offrent un refuge contre les intempéries et les rigueurs de la nuit. Leurs portes étroites laissent passer les citoyens tout en barrant l'accès aux féroces carnivores sauvages.
Évolution autonome & Outils (§AG)
Les citoyens développent des tempéraments héréditaires (brave, prudent, altruiste, avare, explorateur, bâtisseur). Ils confectionnent et s'équipent d'outils : lances militaires, paniers de récolte, onguents de soin et couronnes royales, tout en se perfectionnant dans quatre métiers essentiels.
Métabolisme par stade & Endurance (§AH)
Les dépenses caloriques s'adaptent à l'âge : les nourrissons dépensent 55 % d'énergie en moins, les juvéniles 25 % en moins. Les affrontements guerriers épuisent la vigueur ; la fatigue réduit la force des coups de 30 %.
Intelligence collective Utility AI (§AL)
Le système d'intelligence artificielle à utilités multiples évalue en temps réel les impératifs de survie, les devoirs de caste et les signaux d'urgence. Les créatures établissent une carte mentale de leur territoire et adoptent des formations tactiques disciplinées en temps de guerre.
Écologie botanique & Diététique (§AM)
Les Céréales apportent un apport calorique durable ; les Baies procurent une poussée d'accélération ; les Herbes purifient les infections ; les Champignons prospèrent sur les décombres et bravant le gel hivernal.
Interface terminale TUI (§AI)
Une console Textual complète s'arrime à l'univers en cours d'exécution, permettant de suivre chaque sujet, d'examiner le registre historique et d'ajuster les lois physiques en direct.
Moteur neuronal Elman & Évolution continue (BA)
Chaque individu est doté d'un réseau récurrent Elman RNN autonome (16 entrées sensorielles → 12 neurones cachés → 7 sorties motrices régies par 295 poids float32). Cadencé à 15 Hz, il traite raycasts géométriques, sons et effluves pour s'adapter à son environnement et transmettre ses acquis aux générations futures.
Durabilité — Équilibre Multi-Générationnel
Le monde maintient son équilibre sur des centaines de jours et permet l'essor de dynasties prospères grâce à une homéostasie écologique et sociale finement ajustée.
Préréglages Sélectionnés
- balance ⚖️ (Défaut) — Équilibre idéal calibré pour 200 à 350 habitants avec 380 unités de nourriture, capacité de 400 (max 500), guerres modérées, prédation rare, agriculture, amortissement de densité ($\xi$), sauvegarde contre l'extinction ($\eta$) et clans florissants.
- sustainable 🌿 — 1000 jours de paix prospère : nourriture abondante (550), capacité de charge 550 (max 600), greniers remplis, fêtes des moissons, banquets et amortissement doux.
- theocracy 🔮 — L'Ère de la Sphère : avatars sacrés, temples lumineux, miracles, épiphanies 3D, conciles sacrés et dîmes pieuses.
- warlords ⚔️ — L'affrontement des seigneurs : conquêtes impériales, pillages de greniers, prises de demeures, expansion territoriale et coalitions défensives.
- chaos 🔥 — Forte proportion de prédateurs, guerres meurtrières, incendies, séismes, épidémies fréquentes et saisons rapides.
- extinction 💀 — Famine sévère (120 nourriture), hivers rigoureux (0.30×), forte usure en extérieur, éprouvant la résistance sociétale face à l'effondrement.
- boom 🚀 — Reproduction effrénée, 440 nourriture, capacité de 800 (max 850) pour tester de gigantesques métropoles.
Utilisation : curl -X POST localhost:8000/api/presets/balance?reset=true ou via le panneau de La Sphère.
Homéostasie Dynamique & Prévention de l'Extinction
Flatland intègre deux moteurs de rétroaction homéostatique en boucle fermée :
1. Amortissement Souple lié à la Densité ($\xi$)
Quand la population $N$ excède la capacité de charge $K_{cap}$, le ratio $\xi = (N - K_{cap}) / K_{cap}$ freine la surpopulation de façon non-linéaire :
- Modération des naissances : $R_{birth} = R_0 / (1 + \text{damping\_steepness} \cdot \xi^2)$
- Stress métabolique de surpeuplement : $M_{decay} = M_0 \cdot (1 + \text{crowding\_stress\_mult} \cdot \xi)$
- Tension sur les ressources : La régénération végétale ralentit proportionnellement à la saturation du milieu.
2. Sauvegardes d'Extinction & Miracles de la Genèse ($\eta$)
Lorsque la population chute sous le seuil d'alerte $K_{safe} = K_{cap} \times \text{safeguard\_relief\_ratio}$, des mesures d'urgence se déclenchent :
- Niveau 1 ($\eta \le 0.5$) : Secours anti-famine, dépense métabolique allégée jusqu'à 40%, accélération de la pousse végétale de 60%.
- Niveau 2 ($\eta > 0.5$) : Urgence critique, délai de reproduction réduit de moitié, suspension de l'euthanasie des difformes (
safeguard_morph_mercy). - Niveau 3 ($N \le K_{crit}$) : La Sphère opère un Miracle de la Genèse, créant un groupe
safeguard_genesis_batchd'êtres réguliers pour perpétuer l'espèce.
Performance & Échelle — Plus de 1000 individus @ 60 FPS
- Hachage Spatial sans Allocation : Une grille 1D pré-allouée dans
world.pysupprime les allocations de tuples et le re-hachage à chaque tick ;query_radiusemploie un test de distance au carré sansmath.hypot. - Recherche Rapide de Partenaires : La recherche de partenaires via l'index spatial s'effectue en $O(1)$ au lieu d'un balayage quadratique $O(N^2)$.
- Mise en Cache des Instantanés : Le décor statique et les obstacles sont mis en cache, supprimant la duplication inutile de listes à chaque trame diffusée.
- Rendu Groupé Canvas 2D : Regroupement des passes de dessin par caste, plante et structure avec transformations trigonométriques directes, éliminant le coût de
ctx.save()/ctx.restore()par individu (appels de tracé réduits de plus de 20 000 à ~30-50). - Niveau de Détail Dynamique (LOD) : L'affichage adapte les détails selon le zoom (omission des glyphes fins en vue éloignée), assurant un 60 FPS constant même en forte densité.
- État React Découplé : Le flux haute fréquence alimente directement des références mutables à 60 FPS pour le Canvas, tandis que le rafraîchissement React (HUD, graphiques) est régulé à ~6 Hz pour préserver la fluidité de l'interface.
Carte du code source
Architecture Tri-Dépôts & Déploiement Unifié (§BP)
Flatland est découplé en trois dépôts GitHub spécialisés avec déploiement unifié sur le même système :
flws(github.com/longphanmn/flws) : Moteur de simulation backend pur (FastAPI, thread SimEngine, SoA NumPy, micro-Elman RNN, physique SAT polaire, TUI, SQLite WAL). Écoute sur le port hôte:8000.flws-web(github.com/longphanmn/flws-web) : Client web frontend autonome (React 18, Vite, TypeScript, Canvas2D/WebGL 60 FPS, Observatoire macroscopique). Déployé sur GitHub Pages (https://longphanmn.github.io/flws-web/) et écoute sur:5173/:80(Nginx reverse-proxy vers backend).flws-page(github.com/longphanmn/flws-page) : Page d'accueil et vitrine officielle (canevas interactif, badge sonore synthétisé, mythes). Déployé sur GitHub Pages indépendant (https://longphanmn.github.io/flws-page/).- Déploiement unifié sur le même système :
docker-compose.ymletdeploy.shorchestrent et exécutent simultanément le backend et le frontend sur la même machine hôte.
Architecture Backend (backend/app/)
config.py:13— DataclassConfig: Géométrie du monde, densités, nourriture, dépouilles, dynamique de groupe, reproduction, épidémies, météo, abris, maisons et annales. Détection automatique des variables d'environnement viafrom_env().entities.py:1— Définition des entités fondamentales :CasteTraits,CASTE_TRAITS,YIELD_RANK,caste_name(),Creature(géométrie, côtés, caste, âge, santé, infection, clan, sommeil...),Food(maturation),Corpse(dépouille),House(dimensions, porte, clan).world.py:32— Registre spatialWorldavec table de hachage spatiale uniforme (cell_size,rebuild_index), calcul des distances toriques et requêtes de voisinagequery_radius.simulation/— Moteur de simulation modulaire décomposé (§BI) :agent_soa.py— Architecture SoA vectorisée pour le traitement en cache de milliers d'agents simultanés.agent_pipeline.py— Pipeline de perception par lancer de rayons et physique vectorisée par lots.neural_engine.py— Réseau récurrent Elman RNN (16→12→7, 295 poids) pour le contrôle moteur.morphology_engine.py— Moteur de morphologie polaire, collisions SAT et calcul des propriétés physiques.evolution_manager.py— Recuit morphologique λ(g), gabarits géométriques d'Abbott K3..64 et enjambement polaire.spatial_grid.py— Grille spatiale vectorisée pour requêtes de proximité rapides.analytics.py— Télémétrie en anneau, métriques macro, démographie et biodiversité.safeguard_engine.py— Protocoles de sauvegarde contre l'extinction et Miracles de la Genèse.density_damping.py— Amortissement dynamique de surpopulation (ξ).auth.py:1— Dépendance de sécurité FastAPI vérifiant la clé divine par hachage PBKDF2 (X-God-Key).protocol.py:7— Schémas réseau Pydantic :ControlAction,ControlMessage,EntityState,StateMessage,HistoryEvent,HelloMessage,GodLaws.db.py:1— Couche SQLite3Databaseoptimisée avec WAL, verrous réentrants et écriture différée en arrière-plan.main.py:1— Point d'entrée FastAPIapp, moteur dédiéSimEngine, diffusion WebSocketHub, routes REST et/wiki.
- core.py — Classe maîtresse Simulation, boucle de tick déterministe et synchronisation SoA.
- creature_update.py — Pipeline d'agent en 7 étapes décomposées (_creature_movement, _creature_feeding, etc.).
- settlement.py — Économie de l'habitat, construction, revendications et franchissement des portes.
- lifecycle.py — Génération d'agents, reproduction, naissance, mort, compétences et propagation des épidémies.
- ecology.py — Cycle végétal, agriculture, banquets, décomposition et recyclage des nutriments.
- theology.py — Réserves de foi, 8 Avatars Sacrés, sanctuaires, miracles, synodes et épiphanies.
- society.py — Clans, diplomatie, guerres, coalitions, greniers, caravanes marchandes et cannibalisme.
- serialization.py — Encodage des trames d'instantanés complets et différentiels (deltas).
- environment.py — Météo, dynamique des vents, grille thermique et incendies.
- constants.py — Constantes de simulation, tables de coefficients et générateurs de noms.
Architecture Frontend (frontend/src/)
App.tsx— Agencement principal de l'application, bandeau HUD, synchronisation WebSocket et volets d'onglets.analytics/— Observatoire & Moteur d'analyses macroscopiques :render/CanvasRenderer.tsx— Moteur de rendu HTML5 Canvas à 60 FPS avec tracé vectoriel trigonométrique par lots.render/ClanPanel.tsx— Affichage des colonies de clans en temps réel, totems sacrés et états de guerre.render/ChronicleFeed.tsx— Fil d'actualité des événements historiques avec filtres contextuels.render/PlotsPanel.tsx— Graphiques étincelles (sparklines) de la population, des castes et de la chaîne trophique.clan/ClanDetails.tsx— Fiche détaillée du clan, manoir du chef et bilan des pertes au combat.history/WorldHistoryModal.tsx— Résumé historique quotidien, grandes guerres et exportation de récit littéraire IA.god/GodPanel.tsx— Tiroir interactif des lois de la nature avec 7 préréglages de mondes.god/auth.tsx— Boîte de dialogue d'authentification divine et adaptateur de requêtesgodFetch.inspect/Inspector.tsx— Dossier biologique du citoyen, radar morphologique polaire, constantes et généalogie.wiki/Wiki.tsx— Encyclopédie interactive intégrée et banc d'essai d'API.types.ts— Interfaces TypeScript calquées sur les schémas du protocole serveur.websocket.ts— Client WebSocket à reconnexion automatique résiliente.
- Observatory.tsx — Conteneur plein écran des tableaux de bord analytiques par onglets.
- MacroOverview.tsx — Graphiques étincelles démographiques, santé, biomasse et vitesse.
- SociologyTab.tsx — Hégémonie des clans, caravanes de troc, guerres et successions.
- EcologyTab.tsx — Diversité botanique, régénération des sols et pyramide trophique.
- CrisisTab.tsx — Évolution des épidémies, alertes famines et catastrophes naturelles.
- MutationLab.tsx — Arbre phylogénétique morphologique et nuage de points morphospécifique 2D.
- MetricCard.tsx / Sparkline.tsx — Cartes métriques légères avec visualisations SVG.
Flux de données
SimEngine (thread dédié) → sim.step() → sim.snapshot() (sérialisation sans verrou) → HUB.broadcast → ws → CanvasRenderer + État React App. Client → ControlMessage → apply_control → Mise à jour de la simulation → Journalisation en base. Événements → DB.add_events + Généalogie.
Modèle de données & Protocole réseau
Entités en mémoire vive (In-memory Entities)
Creature(entities.py:95) : Identifiantid, positionx,y, orientationangle, morphologieshape(polygonouline), nombre de côtéssides, caste socialecaste, rayonradius, âgeage, espérance de vielifespan, stade biologiquestage(infant,juvenile,adult,elder), asymétrieirregularity, vitalitéhealth(0–100), infectioninfected, sexesex, filiationmother_id/father_id, appartenanceclan_id/clan_color, état de repossleeping/indoors, génération généalogiquegeneration, tick de naissanceborn_tick, réserve d'énergieenergy, statut de faimstatus.Food(entities.py:158) : Coordonnéesx,y, stade de maturation végétalegrowth(de 0.15 à 1.0).Corpse(entities.py:170) : Coordonnéesx,y, durée de décomposition restantettl, énergie nutritiveenergy.House(entities.py:184) : Coordonnéesx,y, superficiesize, largeur de portedoor_width, clan propriétaireclan_id/clan_color, statut de ruineis_ruin, dernier assaut hostiletakeover_tick.- Relief et géographie : Zones de terre arable
fertile: [{x,y,r}]et rochers infranchissablesrocks: [{x,y,r}].
Schémas du protocole réseau (protocol.py)
EntityState(protocol.py:27) :id, typekind(creature|food|house|corpse), coordonnéesx/y, angle, et attributs biologiques optionnels.StateMessage(protocol.py:62) : Données complètes diffusées à chaque tick : numéro detick, graineseed, dimensionswidth/height/boundary, population totale, ensemble des entités actives, clans, statistiques de mortalité, horloge nycthémérale, saison, météo, matrice diplomatique, événements récents et charge utileanalyticsà 1 Hz pour l'Observatoire.HistoryEvent(protocol.py:86) : Événement chronologique typé : décès, naissance, promotion, épidémie, rémission, floraison, alliance, guerre, assaut de colonie avec horodatage en tick et charge utilepayload.HelloMessage(protocol.py:99) : Message d'accueil émis à l'ouverture du WebSocket : graine, cadence de tick, et limites du monde.ControlMessage(protocol.py:22) : Commande émise par l'utilisateur :action(pause,resume,step,reset,set_speed) accompagnée de son paramètrevalue.
Flux de synchronisation WebSocket
Serveur vers client : {"type":"hello", ...} à la connexion, suivi de flux continus {"type":"state", ...} à chaque tick d'horloge (intégrant les trames analytics 1 Hz). Client vers serveur : Instructions de régulation divine {"action":"pause"|"resume"|"step"|"reset"|"set_speed", "value":...}.
Lois de la Sphère (The Sphere)
Tous les champs de GodLaws (protocol.py:108) — type, plage et valeur par défaut. Modifiables via POST /api/laws ou par préréglage.
| Loi | Type | Plage | Défaut | Indice & docs |
|---|---|---|---|---|
boundary | typing.typing.Literal'wrap', 'clamp' | — | wrap | Topologie des frontières : 'wrap' (boucle toroïdale continue) vs 'clamp' (parois rigides infranchissables). md |
food_count | typing.int | ≥0, ≤2000 | 210 | Nombre de plantes nourricières maintenues dans le monde (été ×1.2, hiver ×0.5). md |
energy_max | typing.float | >1, ≤10000 | 100.0 | Capacité métabolique maximale emmagasinable par un organisme (10–500). md |
energy_decay_per_tick | typing.float | ≥0, ≤2 | 0.025 | Taux de dépense métabolique de base par tick sans apport alimentaire (0.025). md |
energy_from_food | typing.float | ≥0, ≤1000 | 32.0 | Énergie tirée de la récolte d'une plante mûre (baie 48, herbe 32, champignon 24, poison 8). md |
plant_variants_enabled | typing.bool | — | True | Interrupteur principal activant la biodiversité parmi 6 espèces végétales fonctionnelles. md |
plant_growth_rate | typing.float | ≥0, ≤1 | 0.05 | Vitesse de maturation des jeunes pousses en nourriture récoltable (0.045). md |
plant_spread_rate | typing.float | ≥0, ≤1 | 0.006 | Probabilité par tick qu'une plante mûre dissémine des graines sur un sol fertile adjacent (0.006). md |
nutrient_cycle_rate | typing.float | ≥0, ≤10 | 0.65 | Accélération de la pousse près des carcasses en décomposition (0.65) — la mort nourrit la vie. md |
poison_rate | typing.float | ≥0, ≤1 | 0.01 | Probabilité qu'une pousse sauvage soit toxique (-30 PV de dégâts en cas d'ingestion). md |
food_decay_enabled | typing.bool | — | True | Permet aux plantes mûres de flétrir naturellement et d'enrichir l'humus du sol. md |
food_lifespan_ticks | typing.int | ≥100, ≤1000000 | 9000 | Durée de vie en ticks d'une plante mûre avant son retour à la terre (8000). md |
agriculture_enabled | typing.bool | — | True | Active la collecte de semences, parcelles labourées (croissance 2×, récolte 2.5×) et sarclage. md |
granaries_enabled | typing.bool | — | True | Permet aux colonies d'aménager des greniers collectifs pour stocker grains et baies. md |
granary_capacity | typing.float | ≥0, ≤100000 | 400.0 | Capacité de stockage d'un grenier communal (400) — banquets à partir de ≥80% de remplissage. md |
perceive_radius | typing.float | >0.5, ≤60 | 20.0 | Rayon de vision de base (16) — modulé par caste (Femme 0.8×, Prêtre 1.35×), nuit (0.6×) et brume (0.6×). md |
eat_radius | typing.float | >0.1, ≤10 | 1.4 | Distance physique de contact requise pour ingérer une plante, dépouille ou proie (1.4). md |
hungry_ratio | typing.float | >0, ≤1 | 0.35 | Seuil de faim (≤35%) envoyant un signal au réseau neuronal pour déclencher la quête de vivres. md |
starving_ratio | typing.float | >0, ≤1 | 0.15 | Seuil de famine critique (≤15%) provoquant une course d'urgence et des appels de détresse. md |
steer_turn | typing.float | ≥0, ≤3.2 | 0.45 | Agilité angulaire maximale par tick, proportionnelle au moment d'inertie Izz. md |
birth_enabled | typing.bool | — | True | Interrupteur général commandant la reproduction, l'accouplement et l'ascendance de caste. md |
lifespan_mult | typing.float | ≥0.01, ≤100 | 1.0 | Multiplicateur de longévité pour toutes les castes (Femme : 4 800 ticks → Prêtre : 9 000 ticks). md |
adult_age | typing.float | ≥0, ≤100000 | 600.0 | Ticks requis pour qu'un nouveau-né atteigne la maturité reproductrice (220). md |
birth_rate | typing.float | ≥0, ≤1 | 0.05 | Probabilité d'engendrement par couple adulte éligible et par tick (0.28). md |
carrying_capacity | typing.int | ≥-1, ≤10000 | -1 | Seuil de densité démographique au-delà duquel la fertilité faiblit progressivement (-1 = auto). md |
max_population | typing.int | ≥-1, ≤15000 | -1 | Plafond démographique absolu interdisant toute naissance tant que la densité reste trop forte (-1 = auto). md |
mutation_rate | typing.float | ≥0, ≤1 | 0.05 | Probabilité qu'un fils dévie de ±1 côté par rapport à la caste paternelle (0.05). md |
mutation_heritability | typing.float | ≥0, ≤1 | 0.35 | — |
sex_ratio | typing.float | ≥0, ≤1 | 0.5 | Probabilité qu'un nouveau-né soit un fils (polygone ascendant) ou une fille (ligne agile) (0.50). md |
max_sides | typing.int | ≥3, ≤64 | 24 | Limite supérieure du nombre de côtés des polygones réguliers (jusqu'au statut de Prêtre) (24). md |
euthanasia_threshold | typing.float | ≥0, ≤1 | 0.7 | Seuil d'irrégularité ; les nouveau-nés difformes excédant ce taux sont éliminés à l'âge adulte (0.70). md |
mutation_sigma | typing.float | ≥0, ≤1 | 0.08 | Écart-type gaussien (σ) appliqué aux poids synaptiques lors du brassage génétique (0.08). md |
crossover_rate | typing.float | ≥0, ≤1 | 0.5 | Probabilité de recombinaison génétique équilibrée 50/50 entre les parents (0.50). md |
morphology_annealing_enabled | typing.bool | — | True | Interrupteur de physique géométrique — recuit polaire (r,φ), collision SAT et propriétés corporelles. md |
annealing_start_generation | typing.int | ≥0, ≤1000 | 15 | — |
annealing_decay_generations | typing.int | ≥1, ≤5000 | 250 | Générations requises pour que le recuit passe des gabarits d'Abbott à l'évolution libre (150). md |
morph_lambda_override | typing.float | ≥-1.0, ≤1.0 | None | — |
vertex_mutation_std | typing.float | ≥0, ≤0.5 | 0.025 | — |
angle_mutation_std | typing.float | ≥0, ≤0.5 | 0.012 | — |
topological_mutation_rate | typing.float | ≥0, ≤0.2 | 0.008 | — |
safeguard_enabled | typing.bool | — | True | — |
safeguard_critical_pop | typing.int | ≥2, ≤50 | 12 | — |
safeguard_relief_ratio | typing.float | ≥0.05, ≤0.5 | 0.3 | — |
safeguard_genesis_batch | typing.int | ≥1, ≤20 | 6 | — |
safeguard_morph_mercy | typing.bool | — | True | — |
safeguard_max_miracles | typing.int | ≥1 | 1 | — |
soft_cap_enabled | typing.bool | — | True | — |
damping_steepness | typing.float | ≥1.0, ≤20.0 | 12.0 | — |
crowding_stress_mult | typing.float | ≥0.0, ≤1.0 | 1.0 | — |
resource_strain_mult | typing.float | ≥0.0, ≤2.0 | 2.0 | — |
boom_ramp_days | typing.float | ≥0, ≤100 | 1.2 | — |
boom_birth_floor | typing.float | ≥0, ≤1.0 | 0.4 | — |
boom_cooldown_mult | typing.float | ≥1.0, ≤10.0 | 1.0 | — |
boom_energy_mult | typing.float | ≥1.0, ≤10.0 | 1.0 | — |
initial_season_offset | typing.int | ≥0, ≤3 | 0 | — |
disease_enabled | typing.bool | — | True | Interrupteur général des épidémies infectieuses et de la contagion interindividuelle. md |
disease_outbreak_rate | typing.float | ≥0, ≤1 | 6e-05 | Probabilité d'émergence spontanée de peste en milieu surpeuplé par tick (0.00006). md |
disease_rate | typing.float | ≥0, ≤1 | 0.035 | Probabilité de transmission de la contagion à portée de contact (0.035). md |
disease_energy_drain | typing.float | ≥0, ≤10 | 0.05 | Perte d'énergie métabolique par tick pour chaque individu contaminé (0.05). md |
disease_lethality | typing.float | ≥0, ≤1 | 0.18 | Dégâts directs de santé (PV) infligés par tick par l'infection (0.18). md |
weather_enabled | typing.bool | — | True | Interrupteur des cycles météorologiques dynamiques (soleil, pluie, brume, orages). md |
sleep_enabled | typing.bool | — | True | Active le sommeil nocturne, le repos sous abri et la tradition orale à la nuit tombée. md |
day_length | typing.int | ≥2, ≤200000 | 1200 | Durée totale en ticks d'un cycle jour/nuit complet (1200). md |
season_length | typing.int | ≥2, ≤1000000 | 14400 | Durée en ticks de chaque saison (Printemps, Été, Automne, Hiver) (12000). md |
winter_food_mult | typing.float | ≥0.1, ≤2 | 0.5 | Multiplicateur hivernal d'abondance alimentaire (0.70 doux, 0.50 rude, 0.30 critique). md |
night_sight_mult | typing.float | ≥0.05, ≤2 | 0.6 | Facteur réducteur de vision nocturne pour les castes diurnes (0.60). md |
weather_change_rate | typing.float | ≥0, ≤1 | 0.002 | Fréquence des transitions entre temps clair, pluie, brume et orage (0.002). md |
weather_sickness_enabled | typing.bool | — | False | Active l'hypothermie et le refroidissement en cas d'exposition prolongée aux intempéries. md |
chill_drain | typing.float | ≥0, ≤5 | 0.18 | Perte de vie directe par tick subie lors d'une exposition au froid sans toit (0.18). md |
shelter_enabled | typing.bool | — | True | Interrupteur de revendication des maisons, franchissement de portes et toitures. md |
exposure_drain | typing.float | ≥0, ≤10 | 0.03 | Perte d'énergie et de vie lors des intempéries hors de tout abri (0.025). md |
house_capacity | typing.int | ≥1, ≤64 | 12 | Nombre de places de couchage dans une halle (12) ; l'excédent dort à la belle étoile. md |
house_decay_ticks | typing.int | ≥100, ≤100000 | 2400 | Ticks avant qu'une maison abandonnée et sans toit ne tombe en ruine (10000). md |
rest_recovery_mult | typing.float | ≥0, ≤10 | 2.0 | Facteur de régénération de santé lors du sommeil sous un toit protecteur (2.0). md |
territory_enabled | typing.bool | — | True | Active le bornage frontalier, la garde territoriale et les pénalités d'intrusion. md |
territory_radius | typing.float | ≥1, ≤50 | 14.0 | Rayon d'influence territoriale d'un clan autour de ses habitations (16). md |
trespass_decay | typing.float | ≥0, ≤5 | 0.25 | Dégradation diplomatique par tick lorsqu'un clan rival franchit la frontière (0.15). md |
max_clans | typing.int | ≥-1, ≤64 | -1 | Nombre maximal de clans souverains créés lors de la génération du monde (-1 = auto). md |
totems_enabled | typing.bool | — | True | Active les bénédictions des Totems d'Avatars Sacrés pour chaque colonie clanique. md |
succession_enabled | typing.bool | — | True | Permet la passation dynamique du commandement clanique à la mort du chef. md |
communication_enabled | typing.bool | — | True | Active les vocalises, cris d'alarme, chants de paix et bulles d'états d'âme. md |
knowledge_enabled | typing.bool | — | True | Active la mémoire spatiale, la cartographie des repères et les rumeurs partagées. md |
schism_enabled | typing.bool | — | True | Déclenche des scissions internes lorsque les membres manquent de vivres ou d'abris. md |
schism_threshold | typing.float | ≥0, ≤1 | 0.5 | Taux d'insatisfaction (faim, sans-abri) déclenchant une scission de faction (0.40). md |
war_enabled | typing.bool | — | True | Active les conflits armés entre clans rivaux, raids tactiques et conquêtes. md |
attack_damage | typing.float | ≥0, ≤1000 | 30.0 | Dégâts de base infligés par les soldats lors des affrontements de clans (32.0). md |
predation_enabled | typing.bool | — | False | Active la dynamique proie-prédateur et le régime carnivore. md |
predator_ratio | typing.float | ≥0, ≤1 | 0.0 | Proportion de la population naissant avec l'instinct carnivore de chasse (0.02). md |
hunt_radius | typing.float | ≥1, ≤40 | 8.0 | Rayon de détection d'agression dans lequel prédateurs et guerriers ciblent leurs proies (16.0). md |
bite_damage | typing.float | ≥0, ≤1000 | 28.0 | Dégâts physiques causés par morsure ou attaque prédatrice (28.0). md |
energy_from_prey | typing.float | ≥0, ≤1000 | 40.0 | Gain calorique extrait de la capture et dévoration d'une proie (45.0). md |
fear_radius | typing.float | ≥1, ≤40 | 12.0 | Distance à laquelle herbivores et castes vulnérables fuient face au danger (12.0). md |
coalitions_enabled | typing.bool | — | True | Autorise les pactes de défense mutuelle et alliances diplomatiques entre clans amis. md |
coalition_threshold | typing.int | ≥-100, ≤100 | 40 | Score de confiance mutuelle requis pour sceller une coalition défensive (40). md |
leader_decisions_enabled | typing.bool | — | True | Permet au chef de décréter des lois d'urgence (rationnement, loi martiale, guerre). md |
resource_sharing_enabled | typing.bool | — | True | Active les greniers collectifs et le partage altruiste de nourriture via les paniers. md |
larder_capacity | typing.float | ≥0, ≤5000 | 300.0 | Capacité calorique des réserves collectives où sont déposés les surplus (300). md |
cannibalism_enabled | typing.bool | — | True | Autorise la consommation désespérée de chair en cas de famine extrême. md |
eat_kin_enabled | typing.bool | — | True | Permet de dévorer les dépouilles d'alliés au prix du bannissement et de vendettas. md |
cannibalism_energy | typing.float | ≥0, ≤1000 | 35.0 | Énergie retirée de la consommation d'un congénère ou d'un ennemi terrassé (45.0). md |
theology_enabled | typing.bool | — | True | Active les 8 Avatars Sacrés, oratoires, temples, miracles et offrandes pieuses. md |
tithe_rate | typing.float | ≥0, ≤1 | 0.04 | Fraction d'énergie offerte aux sanctuaires à l'aube et au crépuscule pour la foi (0.04). md |
temple_faith_cost | typing.float | ≥0, ≤100000 | 400.0 | Points de foi indispensables pour ériger un Temple resplendissant de la Sphère (400.0). md |
age_enabled | typing.bool | — | True | Active la succession des ères historiques (Âge d'Or, Glaciaire, Chaos, Peste). md |
age_length | typing.int | ≥100, ≤1000000 | 12000 | Durée en ticks de chaque époque historique du monde (50000). md |
culture_enabled | typing.bool | — | True | Active les traditions, archétypes de gouvernement et diffusion culturelle. md |
culture_spread_rate | typing.float | ≥0, ≤1 | 0.005 | Vitesse d'adoption des traits culturels et dogmes entre clans voisins (0.0005). md |
rivers_enabled | typing.bool | — | True | Active les cours d'eau, gués, courants aquatiques, ponts et barrages. md |
river_count | typing.int | ≥0, ≤8 | 2 | Nombre de canaux fluviaux procéduraux façonnés à l'initialisation du monde (2). md |
relief_enabled | typing.bool | — | True | Active le dénivelé topographique, l'inertie des pentes, falaises et sentiers tassés. md |
structural_enabled | typing.bool | — | True | Active la dégradation des bâtiments par la météo, réparations et décombres. md |
earthquake_enabled | typing.bool | — | False | Permet des secousses sismiques ébranlant le relief et endommageant les édifices. md |
earthquake_rate | typing.float | ≥0, ≤0.01 | 8e-05 | Fréquence des tremblements de terre lézardant les sols et structures (0.00008). md |
lightning_enabled | typing.bool | — | True | Déclenche de véritables éclairs orageux embrasant la végétation et blessant les êtres. md |
lightning_strike_rate | typing.float | ≥0, ≤0.05 | 0.0015 | Fréquence des arcs électriques foudroyants lors des violentes tempêtes (0.0015). md |
wildfire_enabled | typing.bool | — | True | Permet la propagation d'incendies dévastateurs dans les forêts et fourrés secs. md |
fire_rate | typing.float | ≥0, ≤0.05 | 8e-05 | Probabilité par tick qu'une plante prenne feu par temps sec ou foudre (0.00008). md |
disaster_enabled | typing.bool | — | True | Active météores cataclysmiques, crues subites et catastrophes majeures. md |
disaster_rate | typing.float | ≥0, ≤0.05 | 4e-05 | Probabilité aléatoire d'avènement de calamités environnementales (0.0003). md |
anomaly_count | typing.int | ≥0, ≤8 | 3 | Nombre de zones d'anomalies spatiales déformant la physique locale (3). md |
door_clearance | typing.float | ≥1, ≤5 | 1.5 | Coefficient d'élargissement des ouvertures de portes selon la taille des créatures (1.5). md |
house_min_size | typing.float | ≥3, ≤60 | 5.5 | — |
house_max_size | typing.float | ≥3, ≤80 | 8.0 | — |
aid_rate | typing.float | ≥0, ≤1 | 0.05 | — |
alarm_call_rate | typing.float | ≥0, ≤1 | 0.12 | — |
alignment_weight | typing.float | ≥0, ≤10 | 0.0 | — |
alliance_threshold | typing.int | ≥-100, ≤100 | 50 | — |
attack_radius | typing.float | ≥0, ≤10 | 1.8 | — |
banquets_enabled | typing.bool | — | True | — |
beast_ratio | typing.float | ≥0, ≤1 | 0.0 | — |
betrayal_enabled | typing.bool | — | True | — |
birth_energy_cost | typing.float | ≥0, ≤1000 | 20.0 | — |
bite_cooldown | typing.int | ≥0, ≤1000 | 15 | — |
cannibalism_hunger_ratio | typing.float | ≥0, ≤1 | 0.08 | — |
chill_rate | typing.float | ≥0, ≤10 | 0.04 | — |
chill_threshold | typing.float | ≥0, ≤1000 | 12.0 | — |
coalition_min_size | typing.int | ≥1, ≤100 | 2 | — |
cohesion_weight | typing.float | ≥0, ≤10 | 0.0 | — |
corpse_energy | typing.float | ≥0, ≤1000 | 25.0 | — |
corpse_ttl | typing.int | ≥0, ≤100000 | 600 | — |
corpses_enabled | typing.bool | — | True | — |
creature_density | typing.float | ≥0, ≤10 | 0.0013 | — |
defection_enabled | typing.bool | — | True | — |
defense_weight | typing.float | ≥0, ≤10 | 0.5 | — |
desperate_perceive_mult | typing.float | ≥1, ≤10 | 1.6 | — |
desperate_speed_mult | typing.float | ≥1, ≤10 | 1.35 | — |
dialect_drift_enabled | typing.bool | — | True | — |
diet_strictness | typing.float | ≥0, ≤1 | 0.0 | — |
disease_radius | typing.float | ≥0, ≤100 | 3.0 | — |
eat_enemy_enabled | typing.bool | — | True | — |
energy_start | typing.float | ≥0, ≤1000 | 85.0 | — |
envoys_enabled | typing.bool | — | True | — |
exile_on_kin_eat | typing.bool | — | True | — |
fertile_food_bias | typing.float | ≥0, ≤10 | 0.7 | — |
fertile_patches | typing.int | ≥-1, ≤1000 | -1 | — |
fire_spread_rate | typing.float | ≥0, ≤10 | 0.035 | — |
flock_radius | typing.float | ≥0, ≤100 | 6.0 | — |
fog_mushroom_mult | typing.float | ≥0, ≤10 | 1.35 | — |
fog_sight_mult | typing.float | ≥0, ≤10 | 0.6 | — |
food_call_rate | typing.float | ≥0, ≤1 | 0.08 | — |
food_giveup_ticks | typing.int | ≥0, ≤100000 | 240 | — |
hearths_enabled | typing.bool | — | True | — |
height | typing.float | ≥10, ≤10000 | 300.0 | — |
help_call_enabled | typing.bool | — | True | — |
help_radius | typing.float | ≥0, ≤100 | 12.0 | — |
history_max | typing.int | ≥0, ≤1000000 | 200 | — |
house_claim_enabled | typing.bool | — | True | — |
house_density | typing.float | ≥0, ≤1 | 0.00065 | — |
house_gap | typing.float | ≥0, ≤100 | 6.0 | — |
hungry_perceive_mult | typing.float | ≥1, ≤10 | 1.3 | — |
kin_stigma | typing.float | ≥0, ≤1000 | 40 | — |
knowledge_share_rate | typing.float | ≥0, ≤1 | 0.05 | — |
knowledge_ttl | typing.int | ≥0, ≤1000000 | 600 | — |
markets_enabled | typing.bool | — | True | — |
mate_energy_min | typing.float | ≥0, ≤1000 | 30.0 | — |
mate_radius | typing.float | ≥0, ≤100 | 10.0 | — |
nn_inference_hz | typing.int | ≥1, ≤1000 | 15 | — |
num_hexagons | typing.int | ≥-1, ≤100 | -1 | — |
num_houses | typing.int | ≥-1, ≤100 | -1 | — |
num_pentagons | typing.int | ≥-1, ≤100 | -1 | — |
num_priests | typing.int | ≥-1, ≤100 | -1 | — |
num_squares | typing.int | ≥-1, ≤100 | -1 | — |
num_triangles | typing.int | ≥-1, ≤100 | -1 | — |
num_women | typing.int | ≥-1, ≤100 | -1 | — |
omens_enabled | typing.bool | — | True | — |
omp_enabled | typing.bool | — | True | — |
omp_threshold | typing.int | ≥0, ≤10000 | 100 | — |
rain_growth_mult | typing.float | ≥0, ≤10 | 1.25 | — |
rain_speed_mult | typing.float | ≥0, ≤10 | 0.85 | — |
recovery_rate | typing.float | ≥0, ≤1 | 0.03 | — |
relation_drift_rate | typing.float | ≥0, ≤10 | 2.2 | — |
reproduction_cooldown | typing.int | ≥0, ≤100000 | 600 | — |
rivalry_threshold | typing.int | ≥-100, ≤100 | -75 | — |
rock_count | typing.int | ≥-1, ≤1000 | -1 | — |
rubble_blocking_enabled | typing.bool | — | True | — |
scent_enabled | typing.bool | — | True | — |
schism_min_pop | typing.int | ≥1, ≤1000 | 6 | — |
seed | typing.int | ≥0 | 42 | — |
separation_weight | typing.float | ≥0, ≤10 | 0.0 | — |
signal_radius | typing.float | ≥0, ≤100 | 12.0 | — |
signal_speed | typing.float | ≥0, ≤100 | 8.0 | — |
sleep_energy_mult | typing.float | ≥0, ≤10 | 0.5 | — |
soil_depletion_enabled | typing.bool | — | True | — |
spawn_variance | typing.float | ≥0, ≤100 | 0.25 | — |
storm_plant_damage | typing.float | ≥0, ≤10 | 0.02 | — |
storm_wander_bonus | typing.float | ≥0, ≤10 | 0.35 | — |
tick_rate | typing.float | ≥0.1, ≤1000 | 10.0 | — |
trait_mutation_rate | typing.float | ≥0, ≤1 | 0.02 | — |
tribute_enabled | typing.bool | — | True | — |
vocalizations_enabled | typing.bool | — | True | — |
wander_turn | typing.float | ≥0, ≤10 | 0.35 | — |
wet_disease_mult | typing.float | ≥0, ≤10 | 1.5 | — |
width | typing.float | ≥10, ≤10000 | 400.0 | — |
Préréglages — Mondes prêts en un clic
'sustainable' offre une paix durable de 1000 jours. Appliquez via le panneau La Sphère ou POST /api/presets/{name}?reset.
| Préréglage | Lois fondamentales | Appliquer |
|---|---|---|
balance ACTIF | boundary=wrap, door_clearance=1.5, food_count=380, plant_growth_rate=0.065, plant_spread_rate=0.008, nutrient_cycle_rate=0.65 … +179 more | Via l'app ou le TUI |
sustainable | boundary=wrap, door_clearance=1.5, food_count=550, plant_growth_rate=0.08, plant_spread_rate=0.01, nutrient_cycle_rate=0.85 … +179 more | Via l'app ou le TUI |
chaos | boundary=wrap, door_clearance=1.5, food_count=320, plant_growth_rate=0.045, plant_spread_rate=0.006, nutrient_cycle_rate=0.65 … +179 more | Via l'app ou le TUI |
extinction | boundary=wrap, door_clearance=1.5, food_count=120, plant_growth_rate=0.025, plant_spread_rate=0.003, nutrient_cycle_rate=0.5 … +179 more | Via l'app ou le TUI |
boom | boundary=wrap, door_clearance=1.5, food_count=440, plant_growth_rate=0.06, plant_spread_rate=0.012, nutrient_cycle_rate=0.85 … +179 more | Via l'app ou le TUI |
theocracy | boundary=wrap, door_clearance=1.5, food_count=400, plant_growth_rate=0.055, plant_spread_rate=0.007, nutrient_cycle_rate=0.7 … +179 more | Via l'app ou le TUI |
warlords | boundary=wrap, door_clearance=1.5, food_count=340, plant_growth_rate=0.05, plant_spread_rate=0.006, nutrient_cycle_rate=0.65 … +179 more | Via l'app ou le TUI |
Référence de l'API
Routes en direct issues de app.routes + documentation Swagger à /docs. Essayez les exemples curl ci-dessous.
| Route API | Nom |
|---|---|
/ws | |
GET /api/analytics/hegemony | get_analytics_hegemony |
GET /api/analytics/summary | get_analytics_summary |
GET /api/analytics/timeseries | get_analytics_timeseries |
GET /api/analytics/trophic | get_analytics_trophic |
GET /api/analytics/warnings | get_analytics_warnings |
GET /api/annals | get_annals |
GET /api/auth/status | auth_status |
GET /api/clan/{clan_id}/biography | get_clan_biography |
GET /api/clans/{clan_id}/history | get_clan_history |
GET /api/clans/{clan_id} | get_clan |
GET /api/clans | get_clans |
GET /api/config | get_config |
GET /api/creature/{creature_id} | get_creature |
GET /api/history/summary | get_history_summary |
GET /api/history | get_history |
GET /api/laws | read_laws |
GET /api/metrics/damping | get_damping_metrics |
GET /api/metrics/morphology | get_morphology_metrics |
GET /api/metrics/safeguards | get_safeguards_metrics |
GET /api/perf/telemetry | get_telemetry |
GET /api/presets | list_presets |
GET /api/state | get_state |
GET /api/version | get_version |
GET /api/wiki | get_wiki_json |
GET /api/worlds | get_worlds |
GET /guide | get_guide |
GET /health.html | health_dashboard |
GET /health | health_dashboard |
GET /healthz | healthz |
GET /robots.txt | get_robots_txt |
GET /sitemap.xml | get_sitemap_xml |
GET /wiki | get_wiki |
POST /api/auth/setup | auth_setup |
POST /api/control | post_control |
POST /api/laws | write_laws |
POST /api/presets/{name} | apply_preset |
Exemples de requêtes interactives Curl
# Consultation et réglage des lois divines
curl localhost:8000/api/laws
curl -X POST localhost:8000/api/laws -H 'content-type: application/json' -d '{"food_count": 90}'
# Préréglages en un clic (monde durable de 1000 jours)
curl -X POST localhost:8000/api/presets/sustainable?reset=true
curl -X POST localhost:8000/api/presets/chaos
curl -X POST localhost:8000/api/presets/extinction?reset=true
# État du monde en direct et registre d'histoire
curl localhost:8000/api/state | jq .tick
curl localhost:8000/api/history?limit=5 | jq
curl localhost:8000/api/worlds | jq
curl localhost:8000/api/clans | jq
# Contrôle du temps de la simulation
curl -X POST localhost:8000/api/control -H 'content-type: application/json' -d '{"action":"pause"}'
curl -X POST localhost:8000/api/control -d '{"action":"reset"}'
# Flux WebSocket en direct
# ws://localhost:8000/ws → Réception de {"type":"hello"} puis du flux {"type":"state"} à ~30Hz
# Envoi de commandes : {"action":"pause"} ou {"action":"set_speed","value":20}
Configuration & Exploitation
Variables d'environnement (FLATWORLD_*)
| Variable | Défaut | Description |
|---|---|---|
| FLATWORLD_WIDTH | 400 | Largeur du monde (unités de grille) |
| FLATWORLD_HEIGHT | 300 | Hauteur du monde |
| FLATWORLD_BOUNDARY | wrap | Bordure torique continue (wrap) ou mur hermétique (clamp) |
| FLATWORLD_SEED | 42 | Graine pseudo-aléatoire du monde |
| FLATWORLD_TICK_RATE | 10 | Fréquence de calcul en ticks par seconde |
| FLATWORLD_DB | backend/flatworld.db | Chemin de la base de données SQLite |
| FLATWORLD_GOD_KEY | — | Clé secrète divine définie au démarrage |
Clé secrète divine (Authentification)
Les commandes POST /api/laws, POST /api/presets/{name}, POST /api/control et les ordres de contrôle WebSocket requièrent l'en-tête d'authentification divine (X-God-Key ou le champ key du socket). Si aucune clé n'est encore configurée, le serveur renvoie une erreur 409 et l'interface invite à en définir une (POST /api/auth/setup). En cas d'oubli, la réinitialisation s'effectue sur le serveur : cd backend && uv run python -m app.godkey reset <nouvelle_clé>. Seul un hachage cryptographique sécurisé PBKDF2 est conservé.
Persistance des données (db.py:20)
Base SQLite flatworld.db en mode journalisé WAL avec verrou réentrant thread-safe. Tables principales :
worlds: Cycles d'existence des mondes (graine, dimensions, horodatages).events: Registre historique des événements (naissances, décès, guerres, épidémies).law_changes: Journal des modifications de lois par la Sphère.creatures: Lignées généalogiques complètes de chaque citoyen.snapshots: Instantanés de sauvegarde permettant de restaurer le monde après redémarrage.
Architecture des threads & Moteur SimEngine
Le cœur de calcul est rigoureusement déterministe : une seule graine pseudo-aléatoire ordonnée tick par tick. Uvicorn doit être exécuté avec 1 seul processus worker. Avec le moteur SimEngine (main.py:446), l'avancement de la simulation s'exécute sur son propre thread OS dédié, découplé de la boucle asyncio. Le calcul du tick s'opère sous RT.lock tandis que la sérialisation JSON des instantanés s'effectue hors verrou (advance_world_lockless), évitant tout blocage des requêtes REST. Points d'accès d'exploitation :
GET /healthz— Santé globale du serveur, TPS réel, consommation mémoire, temps de service et clients connectés.GET /api/perf/telemetry— Télémétrie de performance : temps de calcul par tick, attente de verrou et latence réseau.GET /api/analytics/summary— Synthèse macroscopique démographique, biomasse et distribution trophique.
Exécution & Déploiement
./run.sh
# Ou lancement direct :
cd backend && uv run uvicorn app.main:app --reload --port 8000
cd frontend && npm run dev
Tests de non-régression
cd backend && uv run pytest -q
cd backend && uv run pytest tests/test_synergies.py -q
Feuille de route
Voir TODO.md (actif) + docs/roadmap-archive.md (terminé) — 13 sections + 213 lois + 42 routes + 7 préréglages. Le Wiki enrichit le Guide avec les préréglages, la durabilité & les tests.
Généré à partir du code source en temps réel — Valeurs Config + GodLaws + app.routes. Documentation vivante officielle et encyclopédie de Flatland. · Développé par Long Phan — [email protected] · Démo : Démo ↗ · Accueil : Accueil ↗ · GitHub: flws / flws-web · Conçu avec OpenCode & Antigravity