FLATLAND
⚖️ 213 lois 🌐 42 routes API 🎯 7 préréglages
La Sphère dicte les lois, jamais une vie 🌐 Landing Page ↗ 📄 Swagger /docs ← Démo

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 :
  • - 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.

  • Dans l'Application :
  • - É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 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).

  • Dans l'Application :
  • - 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 :
  • - Les maisons sont obligatoirement pentagonales ou hexagonales, avec des entrées distinctes pour les femmes et les hommes.

  • Dans l'Application :
  • - É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=42 ou ?clan=7 et 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_batch d'ê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.py supprime les allocations de tuples et le re-hachage à chaque tick ; query_radius emploie un test de distance au carré sans math.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.yml et deploy.sh orchestrent et exécutent simultanément le backend et le frontend sur la même machine hôte.

Architecture Backend (backend/app/)

  • config.py:13 — Dataclass Config : 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 via from_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 spatial World avec table de hachage spatiale uniforme (cell_size, rebuild_index), calcul des distances toriques et requêtes de voisinage query_radius.
  • simulation/ — Moteur de simulation modulaire décomposé (§BI) :
  • - 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.

  • 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 SQLite3 Database optimisée avec WAL, verrous réentrants et écriture différée en arrière-plan.
  • main.py:1 — Point d'entrée FastAPI app, moteur dédié SimEngine, diffusion WebSocket Hub, routes REST et /wiki.

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 :
  • - 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.

  • 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êtes godFetch.
  • 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.

Flux de données

SimEngine (thread dédié) → sim.step()sim.snapshot() (sérialisation sans verrou) → HUB.broadcastwsCanvasRenderer + État React App. Client → ControlMessageapply_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) : Identifiant id, position x, y, orientation angle, morphologie shape (polygon ou line), nombre de côtés sides, caste sociale caste, rayon radius, âge age, espérance de vie lifespan, stade biologique stage (infant, juvenile, adult, elder), asymétrie irregularity, vitalité health (0–100), infection infected, sexe sex, filiation mother_id/father_id, appartenance clan_id/clan_color, état de repos sleeping/indoors, génération généalogique generation, tick de naissance born_tick, réserve d'énergie energy, statut de faim status.
  • Food (entities.py:158) : Coordonnées x, y, stade de maturation végétale growth (de 0.15 à 1.0).
  • Corpse (entities.py:170) : Coordonnées x, y, durée de décomposition restante ttl, énergie nutritive energy.
  • House (entities.py:184) : Coordonnées x, y, superficie size, largeur de porte door_width, clan propriétaire clan_id/clan_color, statut de ruine is_ruin, dernier assaut hostile takeover_tick.
  • Relief et géographie : Zones de terre arable fertile: [{x,y,r}] et rochers infranchissables rocks: [{x,y,r}].

Schémas du protocole réseau (protocol.py)

  • EntityState (protocol.py:27) : id, type kind (creature | food | house | corpse), coordonnées x/y, angle, et attributs biologiques optionnels.
  • StateMessage (protocol.py:62) : Données complètes diffusées à chaque tick : numéro de tick, graine seed, dimensions width/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 utile analytics à 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 utile payload.
  • 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ètre value.

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.

LoiTypePlageDéfautIndice & docs
boundarytyping.typing.Literal'wrap', 'clamp'wrapTopologie des frontières : 'wrap' (boucle toroïdale continue) vs 'clamp' (parois rigides infranchissables). md
food_counttyping.int≥0, ≤2000210Nombre de plantes nourricières maintenues dans le monde (été ×1.2, hiver ×0.5). md
energy_maxtyping.float>1, ≤10000100.0Capacité métabolique maximale emmagasinable par un organisme (10–500). md
energy_decay_per_ticktyping.float≥0, ≤20.025Taux de dépense métabolique de base par tick sans apport alimentaire (0.025). md
energy_from_foodtyping.float≥0, ≤100032.0Énergie tirée de la récolte d'une plante mûre (baie 48, herbe 32, champignon 24, poison 8). md
plant_variants_enabledtyping.boolTrueInterrupteur principal activant la biodiversité parmi 6 espèces végétales fonctionnelles. md
plant_growth_ratetyping.float≥0, ≤10.05Vitesse de maturation des jeunes pousses en nourriture récoltable (0.045). md
plant_spread_ratetyping.float≥0, ≤10.006Probabilité par tick qu'une plante mûre dissémine des graines sur un sol fertile adjacent (0.006). md
nutrient_cycle_ratetyping.float≥0, ≤100.65Accélération de la pousse près des carcasses en décomposition (0.65) — la mort nourrit la vie. md
poison_ratetyping.float≥0, ≤10.01Probabilité qu'une pousse sauvage soit toxique (-30 PV de dégâts en cas d'ingestion). md
food_decay_enabledtyping.boolTruePermet aux plantes mûres de flétrir naturellement et d'enrichir l'humus du sol. md
food_lifespan_tickstyping.int≥100, ≤10000009000Durée de vie en ticks d'une plante mûre avant son retour à la terre (8000). md
agriculture_enabledtyping.boolTrueActive la collecte de semences, parcelles labourées (croissance 2×, récolte 2.5×) et sarclage. md
granaries_enabledtyping.boolTruePermet aux colonies d'aménager des greniers collectifs pour stocker grains et baies. md
granary_capacitytyping.float≥0, ≤100000400.0Capacité de stockage d'un grenier communal (400) — banquets à partir de ≥80% de remplissage. md
perceive_radiustyping.float>0.5, ≤6020.0Rayon de vision de base (16) — modulé par caste (Femme 0.8×, Prêtre 1.35×), nuit (0.6×) et brume (0.6×). md
eat_radiustyping.float>0.1, ≤101.4Distance physique de contact requise pour ingérer une plante, dépouille ou proie (1.4). md
hungry_ratiotyping.float>0, ≤10.35Seuil de faim (≤35%) envoyant un signal au réseau neuronal pour déclencher la quête de vivres. md
starving_ratiotyping.float>0, ≤10.15Seuil de famine critique (≤15%) provoquant une course d'urgence et des appels de détresse. md
steer_turntyping.float≥0, ≤3.20.45Agilité angulaire maximale par tick, proportionnelle au moment d'inertie Izz. md
birth_enabledtyping.boolTrueInterrupteur général commandant la reproduction, l'accouplement et l'ascendance de caste. md
lifespan_multtyping.float≥0.01, ≤1001.0Multiplicateur de longévité pour toutes les castes (Femme : 4 800 ticks → Prêtre : 9 000 ticks). md
adult_agetyping.float≥0, ≤100000600.0Ticks requis pour qu'un nouveau-né atteigne la maturité reproductrice (220). md
birth_ratetyping.float≥0, ≤10.05Probabilité d'engendrement par couple adulte éligible et par tick (0.28). md
carrying_capacitytyping.int≥-1, ≤10000-1Seuil de densité démographique au-delà duquel la fertilité faiblit progressivement (-1 = auto). md
max_populationtyping.int≥-1, ≤15000-1Plafond démographique absolu interdisant toute naissance tant que la densité reste trop forte (-1 = auto). md
mutation_ratetyping.float≥0, ≤10.05Probabilité qu'un fils dévie de ±1 côté par rapport à la caste paternelle (0.05). md
mutation_heritabilitytyping.float≥0, ≤10.35
sex_ratiotyping.float≥0, ≤10.5Probabilité qu'un nouveau-né soit un fils (polygone ascendant) ou une fille (ligne agile) (0.50). md
max_sidestyping.int≥3, ≤6424Limite supérieure du nombre de côtés des polygones réguliers (jusqu'au statut de Prêtre) (24). md
euthanasia_thresholdtyping.float≥0, ≤10.7Seuil d'irrégularité ; les nouveau-nés difformes excédant ce taux sont éliminés à l'âge adulte (0.70). md
mutation_sigmatyping.float≥0, ≤10.08Écart-type gaussien (σ) appliqué aux poids synaptiques lors du brassage génétique (0.08). md
crossover_ratetyping.float≥0, ≤10.5Probabilité de recombinaison génétique équilibrée 50/50 entre les parents (0.50). md
morphology_annealing_enabledtyping.boolTrueInterrupteur de physique géométrique — recuit polaire (r,φ), collision SAT et propriétés corporelles. md
annealing_start_generationtyping.int≥0, ≤100015
annealing_decay_generationstyping.int≥1, ≤5000250Générations requises pour que le recuit passe des gabarits d'Abbott à l'évolution libre (150). md
morph_lambda_overridetyping.float≥-1.0, ≤1.0None
vertex_mutation_stdtyping.float≥0, ≤0.50.025
angle_mutation_stdtyping.float≥0, ≤0.50.012
topological_mutation_ratetyping.float≥0, ≤0.20.008
safeguard_enabledtyping.boolTrue
safeguard_critical_poptyping.int≥2, ≤5012
safeguard_relief_ratiotyping.float≥0.05, ≤0.50.3
safeguard_genesis_batchtyping.int≥1, ≤206
safeguard_morph_mercytyping.boolTrue
safeguard_max_miraclestyping.int≥11
soft_cap_enabledtyping.boolTrue
damping_steepnesstyping.float≥1.0, ≤20.012.0
crowding_stress_multtyping.float≥0.0, ≤1.01.0
resource_strain_multtyping.float≥0.0, ≤2.02.0
boom_ramp_daystyping.float≥0, ≤1001.2
boom_birth_floortyping.float≥0, ≤1.00.4
boom_cooldown_multtyping.float≥1.0, ≤10.01.0
boom_energy_multtyping.float≥1.0, ≤10.01.0
initial_season_offsettyping.int≥0, ≤30
disease_enabledtyping.boolTrueInterrupteur général des épidémies infectieuses et de la contagion interindividuelle. md
disease_outbreak_ratetyping.float≥0, ≤16e-05Probabilité d'émergence spontanée de peste en milieu surpeuplé par tick (0.00006). md
disease_ratetyping.float≥0, ≤10.035Probabilité de transmission de la contagion à portée de contact (0.035). md
disease_energy_draintyping.float≥0, ≤100.05Perte d'énergie métabolique par tick pour chaque individu contaminé (0.05). md
disease_lethalitytyping.float≥0, ≤10.18Dégâts directs de santé (PV) infligés par tick par l'infection (0.18). md
weather_enabledtyping.boolTrueInterrupteur des cycles météorologiques dynamiques (soleil, pluie, brume, orages). md
sleep_enabledtyping.boolTrueActive le sommeil nocturne, le repos sous abri et la tradition orale à la nuit tombée. md
day_lengthtyping.int≥2, ≤2000001200Durée totale en ticks d'un cycle jour/nuit complet (1200). md
season_lengthtyping.int≥2, ≤100000014400Durée en ticks de chaque saison (Printemps, Été, Automne, Hiver) (12000). md
winter_food_multtyping.float≥0.1, ≤20.5Multiplicateur hivernal d'abondance alimentaire (0.70 doux, 0.50 rude, 0.30 critique). md
night_sight_multtyping.float≥0.05, ≤20.6Facteur réducteur de vision nocturne pour les castes diurnes (0.60). md
weather_change_ratetyping.float≥0, ≤10.002Fréquence des transitions entre temps clair, pluie, brume et orage (0.002). md
weather_sickness_enabledtyping.boolFalseActive l'hypothermie et le refroidissement en cas d'exposition prolongée aux intempéries. md
chill_draintyping.float≥0, ≤50.18Perte de vie directe par tick subie lors d'une exposition au froid sans toit (0.18). md
shelter_enabledtyping.boolTrueInterrupteur de revendication des maisons, franchissement de portes et toitures. md
exposure_draintyping.float≥0, ≤100.03Perte d'énergie et de vie lors des intempéries hors de tout abri (0.025). md
house_capacitytyping.int≥1, ≤6412Nombre de places de couchage dans une halle (12) ; l'excédent dort à la belle étoile. md
house_decay_tickstyping.int≥100, ≤1000002400Ticks avant qu'une maison abandonnée et sans toit ne tombe en ruine (10000). md
rest_recovery_multtyping.float≥0, ≤102.0Facteur de régénération de santé lors du sommeil sous un toit protecteur (2.0). md
territory_enabledtyping.boolTrueActive le bornage frontalier, la garde territoriale et les pénalités d'intrusion. md
territory_radiustyping.float≥1, ≤5014.0Rayon d'influence territoriale d'un clan autour de ses habitations (16). md
trespass_decaytyping.float≥0, ≤50.25Dégradation diplomatique par tick lorsqu'un clan rival franchit la frontière (0.15). md
max_clanstyping.int≥-1, ≤64-1Nombre maximal de clans souverains créés lors de la génération du monde (-1 = auto). md
totems_enabledtyping.boolTrueActive les bénédictions des Totems d'Avatars Sacrés pour chaque colonie clanique. md
succession_enabledtyping.boolTruePermet la passation dynamique du commandement clanique à la mort du chef. md
communication_enabledtyping.boolTrueActive les vocalises, cris d'alarme, chants de paix et bulles d'états d'âme. md
knowledge_enabledtyping.boolTrueActive la mémoire spatiale, la cartographie des repères et les rumeurs partagées. md
schism_enabledtyping.boolTrueDéclenche des scissions internes lorsque les membres manquent de vivres ou d'abris. md
schism_thresholdtyping.float≥0, ≤10.5Taux d'insatisfaction (faim, sans-abri) déclenchant une scission de faction (0.40). md
war_enabledtyping.boolTrueActive les conflits armés entre clans rivaux, raids tactiques et conquêtes. md
attack_damagetyping.float≥0, ≤100030.0Dégâts de base infligés par les soldats lors des affrontements de clans (32.0). md
predation_enabledtyping.boolFalseActive la dynamique proie-prédateur et le régime carnivore. md
predator_ratiotyping.float≥0, ≤10.0Proportion de la population naissant avec l'instinct carnivore de chasse (0.02). md
hunt_radiustyping.float≥1, ≤408.0Rayon de détection d'agression dans lequel prédateurs et guerriers ciblent leurs proies (16.0). md
bite_damagetyping.float≥0, ≤100028.0Dégâts physiques causés par morsure ou attaque prédatrice (28.0). md
energy_from_preytyping.float≥0, ≤100040.0Gain calorique extrait de la capture et dévoration d'une proie (45.0). md
fear_radiustyping.float≥1, ≤4012.0Distance à laquelle herbivores et castes vulnérables fuient face au danger (12.0). md
coalitions_enabledtyping.boolTrueAutorise les pactes de défense mutuelle et alliances diplomatiques entre clans amis. md
coalition_thresholdtyping.int≥-100, ≤10040Score de confiance mutuelle requis pour sceller une coalition défensive (40). md
leader_decisions_enabledtyping.boolTruePermet au chef de décréter des lois d'urgence (rationnement, loi martiale, guerre). md
resource_sharing_enabledtyping.boolTrueActive les greniers collectifs et le partage altruiste de nourriture via les paniers. md
larder_capacitytyping.float≥0, ≤5000300.0Capacité calorique des réserves collectives où sont déposés les surplus (300). md
cannibalism_enabledtyping.boolTrueAutorise la consommation désespérée de chair en cas de famine extrême. md
eat_kin_enabledtyping.boolTruePermet de dévorer les dépouilles d'alliés au prix du bannissement et de vendettas. md
cannibalism_energytyping.float≥0, ≤100035.0Énergie retirée de la consommation d'un congénère ou d'un ennemi terrassé (45.0). md
theology_enabledtyping.boolTrueActive les 8 Avatars Sacrés, oratoires, temples, miracles et offrandes pieuses. md
tithe_ratetyping.float≥0, ≤10.04Fraction d'énergie offerte aux sanctuaires à l'aube et au crépuscule pour la foi (0.04). md
temple_faith_costtyping.float≥0, ≤100000400.0Points de foi indispensables pour ériger un Temple resplendissant de la Sphère (400.0). md
age_enabledtyping.boolTrueActive la succession des ères historiques (Âge d'Or, Glaciaire, Chaos, Peste). md
age_lengthtyping.int≥100, ≤100000012000Durée en ticks de chaque époque historique du monde (50000). md
culture_enabledtyping.boolTrueActive les traditions, archétypes de gouvernement et diffusion culturelle. md
culture_spread_ratetyping.float≥0, ≤10.005Vitesse d'adoption des traits culturels et dogmes entre clans voisins (0.0005). md
rivers_enabledtyping.boolTrueActive les cours d'eau, gués, courants aquatiques, ponts et barrages. md
river_counttyping.int≥0, ≤82Nombre de canaux fluviaux procéduraux façonnés à l'initialisation du monde (2). md
relief_enabledtyping.boolTrueActive le dénivelé topographique, l'inertie des pentes, falaises et sentiers tassés. md
structural_enabledtyping.boolTrueActive la dégradation des bâtiments par la météo, réparations et décombres. md
earthquake_enabledtyping.boolFalsePermet des secousses sismiques ébranlant le relief et endommageant les édifices. md
earthquake_ratetyping.float≥0, ≤0.018e-05Fréquence des tremblements de terre lézardant les sols et structures (0.00008). md
lightning_enabledtyping.boolTrueDéclenche de véritables éclairs orageux embrasant la végétation et blessant les êtres. md
lightning_strike_ratetyping.float≥0, ≤0.050.0015Fréquence des arcs électriques foudroyants lors des violentes tempêtes (0.0015). md
wildfire_enabledtyping.boolTruePermet la propagation d'incendies dévastateurs dans les forêts et fourrés secs. md
fire_ratetyping.float≥0, ≤0.058e-05Probabilité par tick qu'une plante prenne feu par temps sec ou foudre (0.00008). md
disaster_enabledtyping.boolTrueActive météores cataclysmiques, crues subites et catastrophes majeures. md
disaster_ratetyping.float≥0, ≤0.054e-05Probabilité aléatoire d'avènement de calamités environnementales (0.0003). md
anomaly_counttyping.int≥0, ≤83Nombre de zones d'anomalies spatiales déformant la physique locale (3). md
door_clearancetyping.float≥1, ≤51.5Coefficient d'élargissement des ouvertures de portes selon la taille des créatures (1.5). md
house_min_sizetyping.float≥3, ≤605.5
house_max_sizetyping.float≥3, ≤808.0
aid_ratetyping.float≥0, ≤10.05
alarm_call_ratetyping.float≥0, ≤10.12
alignment_weighttyping.float≥0, ≤100.0
alliance_thresholdtyping.int≥-100, ≤10050
attack_radiustyping.float≥0, ≤101.8
banquets_enabledtyping.boolTrue
beast_ratiotyping.float≥0, ≤10.0
betrayal_enabledtyping.boolTrue
birth_energy_costtyping.float≥0, ≤100020.0
bite_cooldowntyping.int≥0, ≤100015
cannibalism_hunger_ratiotyping.float≥0, ≤10.08
chill_ratetyping.float≥0, ≤100.04
chill_thresholdtyping.float≥0, ≤100012.0
coalition_min_sizetyping.int≥1, ≤1002
cohesion_weighttyping.float≥0, ≤100.0
corpse_energytyping.float≥0, ≤100025.0
corpse_ttltyping.int≥0, ≤100000600
corpses_enabledtyping.boolTrue
creature_densitytyping.float≥0, ≤100.0013
defection_enabledtyping.boolTrue
defense_weighttyping.float≥0, ≤100.5
desperate_perceive_multtyping.float≥1, ≤101.6
desperate_speed_multtyping.float≥1, ≤101.35
dialect_drift_enabledtyping.boolTrue
diet_strictnesstyping.float≥0, ≤10.0
disease_radiustyping.float≥0, ≤1003.0
eat_enemy_enabledtyping.boolTrue
energy_starttyping.float≥0, ≤100085.0
envoys_enabledtyping.boolTrue
exile_on_kin_eattyping.boolTrue
fertile_food_biastyping.float≥0, ≤100.7
fertile_patchestyping.int≥-1, ≤1000-1
fire_spread_ratetyping.float≥0, ≤100.035
flock_radiustyping.float≥0, ≤1006.0
fog_mushroom_multtyping.float≥0, ≤101.35
fog_sight_multtyping.float≥0, ≤100.6
food_call_ratetyping.float≥0, ≤10.08
food_giveup_tickstyping.int≥0, ≤100000240
hearths_enabledtyping.boolTrue
heighttyping.float≥10, ≤10000300.0
help_call_enabledtyping.boolTrue
help_radiustyping.float≥0, ≤10012.0
history_maxtyping.int≥0, ≤1000000200
house_claim_enabledtyping.boolTrue
house_densitytyping.float≥0, ≤10.00065
house_gaptyping.float≥0, ≤1006.0
hungry_perceive_multtyping.float≥1, ≤101.3
kin_stigmatyping.float≥0, ≤100040
knowledge_share_ratetyping.float≥0, ≤10.05
knowledge_ttltyping.int≥0, ≤1000000600
markets_enabledtyping.boolTrue
mate_energy_mintyping.float≥0, ≤100030.0
mate_radiustyping.float≥0, ≤10010.0
nn_inference_hztyping.int≥1, ≤100015
num_hexagonstyping.int≥-1, ≤100-1
num_housestyping.int≥-1, ≤100-1
num_pentagonstyping.int≥-1, ≤100-1
num_prieststyping.int≥-1, ≤100-1
num_squarestyping.int≥-1, ≤100-1
num_trianglestyping.int≥-1, ≤100-1
num_womentyping.int≥-1, ≤100-1
omens_enabledtyping.boolTrue
omp_enabledtyping.boolTrue
omp_thresholdtyping.int≥0, ≤10000100
rain_growth_multtyping.float≥0, ≤101.25
rain_speed_multtyping.float≥0, ≤100.85
recovery_ratetyping.float≥0, ≤10.03
relation_drift_ratetyping.float≥0, ≤102.2
reproduction_cooldowntyping.int≥0, ≤100000600
rivalry_thresholdtyping.int≥-100, ≤100-75
rock_counttyping.int≥-1, ≤1000-1
rubble_blocking_enabledtyping.boolTrue
scent_enabledtyping.boolTrue
schism_min_poptyping.int≥1, ≤10006
seedtyping.int≥042
separation_weighttyping.float≥0, ≤100.0
signal_radiustyping.float≥0, ≤10012.0
signal_speedtyping.float≥0, ≤1008.0
sleep_energy_multtyping.float≥0, ≤100.5
soil_depletion_enabledtyping.boolTrue
spawn_variancetyping.float≥0, ≤1000.25
storm_plant_damagetyping.float≥0, ≤100.02
storm_wander_bonustyping.float≥0, ≤100.35
tick_ratetyping.float≥0.1, ≤100010.0
trait_mutation_ratetyping.float≥0, ≤10.02
tribute_enabledtyping.boolTrue
vocalizations_enabledtyping.boolTrue
wander_turntyping.float≥0, ≤100.35
wet_disease_multtyping.float≥0, ≤101.5
widthtyping.float≥10, ≤10000400.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églageLois fondamentalesAppliquer
balance ACTIFboundary=wrap, door_clearance=1.5, food_count=380, plant_growth_rate=0.065, plant_spread_rate=0.008, nutrient_cycle_rate=0.65 … +179 moreVia l'app ou le TUI
sustainableboundary=wrap, door_clearance=1.5, food_count=550, plant_growth_rate=0.08, plant_spread_rate=0.01, nutrient_cycle_rate=0.85 … +179 moreVia l'app ou le TUI
chaosboundary=wrap, door_clearance=1.5, food_count=320, plant_growth_rate=0.045, plant_spread_rate=0.006, nutrient_cycle_rate=0.65 … +179 moreVia l'app ou le TUI
extinctionboundary=wrap, door_clearance=1.5, food_count=120, plant_growth_rate=0.025, plant_spread_rate=0.003, nutrient_cycle_rate=0.5 … +179 moreVia l'app ou le TUI
boomboundary=wrap, door_clearance=1.5, food_count=440, plant_growth_rate=0.06, plant_spread_rate=0.012, nutrient_cycle_rate=0.85 … +179 moreVia l'app ou le TUI
theocracyboundary=wrap, door_clearance=1.5, food_count=400, plant_growth_rate=0.055, plant_spread_rate=0.007, nutrient_cycle_rate=0.7 … +179 moreVia l'app ou le TUI
warlordsboundary=wrap, door_clearance=1.5, food_count=340, plant_growth_rate=0.05, plant_spread_rate=0.006, nutrient_cycle_rate=0.65 … +179 moreVia 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 APINom
/ws
GET /api/analytics/hegemonyget_analytics_hegemony
GET /api/analytics/summaryget_analytics_summary
GET /api/analytics/timeseriesget_analytics_timeseries
GET /api/analytics/trophicget_analytics_trophic
GET /api/analytics/warningsget_analytics_warnings
GET /api/annalsget_annals
GET /api/auth/statusauth_status
GET /api/clan/{clan_id}/biographyget_clan_biography
GET /api/clans/{clan_id}/historyget_clan_history
GET /api/clans/{clan_id}get_clan
GET /api/clansget_clans
GET /api/configget_config
GET /api/creature/{creature_id}get_creature
GET /api/history/summaryget_history_summary
GET /api/historyget_history
GET /api/lawsread_laws
GET /api/metrics/dampingget_damping_metrics
GET /api/metrics/morphologyget_morphology_metrics
GET /api/metrics/safeguardsget_safeguards_metrics
GET /api/perf/telemetryget_telemetry
GET /api/presetslist_presets
GET /api/stateget_state
GET /api/versionget_version
GET /api/wikiget_wiki_json
GET /api/worldsget_worlds
GET /guideget_guide
GET /health.htmlhealth_dashboard
GET /healthhealth_dashboard
GET /healthzhealthz
GET /robots.txtget_robots_txt
GET /sitemap.xmlget_sitemap_xml
GET /wikiget_wiki
POST /api/auth/setupauth_setup
POST /api/controlpost_control
POST /api/lawswrite_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