Partir du wargame Mukden 1905 (jeu hexagonal au tour par tour, édition 1976, avec sa table de résolution des combats — CRT) et le porter vers une simulation en temps réel continu, sans hexagones, jouable dans le navigateur. L'objectif n'est pas de copier le jeu de plateau : c'est de conserver son esprit — front, ravitaillement, zones de contrôle, incertitude du combat — tout en gagnant la fluidité de la manœuvre continue et la gestion en direct.
Le dossier sert d'arbitrage : il fige ce qui est décidé, argumente pourquoi, et garde en réserve les pistes qu'on veut explorer plus tard sans les perdre.
Les questions difficiles que le passage continu soulève, et qu'il faut trancher une à une.
(x, y) flottantes, distances euclidiennes, terrain évalué analytiquement
(collines, rivière) — plus aucune grille. Pourquoi : c'est la condition même du projet ; la grille était
la contrainte à lever.activationDelai, 1 s par défaut), puis sa vitesse monte progressivement jusqu'au maximum
(activationRampe, 1 s). Un anneau jaune signale l'activation. Pourquoi : latence de commandement
et inertie de mise en marche — une colonne ne s'ébranle pas d'un coup. Les deux valeurs sont des sliders à régler.
À arbitrer : la latence s'applique-t-elle à chaque nouvel ordre, ou seulement au démarrage depuis l'arrêt ?
(actuellement : à chaque ordre joueur, et au premier ordre pour l'IA.)Point central tranché avec Sébastien. La CRT « 1976 » d'origine est un héritage du jeu tour par tour : on y jette une fois par combat, et la convention veut qu'à cote égale (1:1) le dé puisse pousser le défenseur, car le rapport de forces est censé encoder l'effort offensif.
Mais ce jeu est un temps réel (STR) : une mêlée au contact est re-jouée toutes les 20 s tant que les unités se touchent. La létalité cumulée est donc bien supérieure à un tour par tour. Deux conséquences adoptées :
AR attaquant recule ST front stabilisé DR défenseur recule EX échange DE défenseur éliminé
Comparatif chiffré, probabilités et détail de toutes les règles : 📖 Règles essentielles (tableaux) · Notice complète.
Décision de Sébastien, en place, en remplacement de la friction progressive :
Lecture retenue : le défenseur se fige dès qu'il touche la frontière de la ZOC (il ne rampe pas) ; l'attaquant, lui, traverse la ZOC au 1/10 de sa vitesse jusqu'à toucher le corps ennemi, où le combat s'engage. Le ÷10 traduit en continu le « +2 PM pour entrer en ZOC » du jeu original.
Système actuellement en place, tel que demandé, pour qu'on puisse le juger et l'améliorer.
r = 11 + √(force max) × 0,95
(en unités-carte). Une grosse division occupe donc plus d'emprise qu'une petite.On ne sépare désormais que les alliés ; les ennemis peuvent se toucher — c'est le contact qui déclenche le combat pulsé. Rendu nécessaire par le modèle de combat (sans contact, pas de résolution) et cohérent avec la règle « stop au contact ».
Observation (test du 23 sep.). Sur la carte, 3 mêlées sont en cours, mais la fenêtre Combats affiche 6 lignes. La cause est le modèle actuel, centré sur le défenseur : chaque unité assaillie a sa propre résolution. Quand deux unités ennemies sont au contact et toutes deux offensives, chacune est « défenseur » de l'autre → la même mêlée compte deux fois. Trois chocs réciproques ⇒ six lignes.
// une seule résolution par contact ennemi, par tour de combat vus = ensemble vide de paires pour chaque unité a (vivante) : pour chaque ennemi b au contact de a : clé = paire_non_ordonnée(a, b) si clé ∈ vus : continuer // déjà traitée dans l'autre sens vus.ajoute(clé) rôles : a OFF & b DEF → attaquant a, défenseur b b OFF & a DEF → attaquant b, défenseur a a OFF & b OFF → CHOC : attaquant = le plus fort, défenseur = l'autre, mais le résultat AR/DR s'applique comme un recul réciproque a DEF & b DEF → pas de combat (statu quo) minuteur porté par la PAIRE (pas par l'unité) ; à échéance → CRT(attaquant, défenseur)
Conséquence : le nombre de lignes de la fenêtre Combats = le nombre réel de mêlées. Le minuteur devient propre au contact (à la paire), ce qui colle mieux à ta demande initiale.
Aujourd'hui : support(u) = min(plafond, Σ_alliés (1 − d/rayon) × bonus), ajouté en permanence au
facteur de combat. Deux défauts : une unité loin de tout combat soutient quand même, et le soutien ne
« coûte » rien ni ne s'oriente.
Objectif fixé : tenir jusqu'à ~200 unités, sur une carte agrandie, avec navigation.
Le JSON de la version hexagone contient : 40×30 = 1200 hexes (821 plaine, 376 accidenté, 3 ravitaillement), la rivière Hun He (509 arêtes), la voie ferrée (118 segments, du nord au sud par le centre-ouest), un réseau de routes (263 segments), et les points de ravitaillement russe au nord (26,0) et japonais au sud (10,29 et 37,29). Le terrain accidenté est concentré à l'est et au sud — l'ouest et le nord sont des plaines ouvertes, ce qui colle à l'histoire (enveloppement japonais par les collines de l'est).
data/carte.js) construit, à partir du JSON hexagone :
le monde (WORLD épouse la carte), un champ terrain continu (l'accidenté ralentit et protège, la Hun He
ralentit fortement et couvre), les têtes de voie réelles (E nord = Russie, O sud = Japon ×2), et
Moukden sur la voie au nord. La simulation et l'éditeur partagent exactement la même géographie et le même
rendu ; le déploiement par défaut est calé sur la carte (Russes au nord dans la plaine, Japonais au sud, aile est
renforcée). Échantillonnage terrain O(1) via un raster précalculé.size=52) est le seul curseur d'échelle. Comme le relief réel est
dense (rivière + accidenté sur de grandes zones), les portées d'interaction (ZOC, contact, ravito, soutien) et les
vitesses seront à ré-proportionner à cette échelle lors du calibrage — c'est prévu.| Date | Sujet | Décision | Statut |
|---|---|---|---|
| 20 sep. | Espace & boucle | Continu (x,y), pas fixe 30 Hz, rendu interpolé | Adopté |
| 20 sep. | ZOC continue | Rayon projeté, effet mouvement + coupure ravito, annulation par occupation | Adopté |
| 20 sep. | Anti-collision | Séparation par relaxation, ami+ennemi | Adopté (à revoir §5) |
| 21 sep. | Postures & CRT | Posture = rôle attaquant/défenseur ; combat = attrition continue dérivée CRT | Adopté / à calibrer |
| 21 sep. | Soutien | Bonus selon voisins proches (rayon/bonus/plafond) | Adopté |
| 21 sep. | Coef manuel | Multiplicateur ×0,3–2 par unité, temps réel | Adopté |
| 21 sep. | Pion à 2 valeurs | Combat 1–12 + mouvement uniforme ; le nombre d'hommes disparaît | Adopté |
| 21 sep. | Combat pulsé CRT | Minuteur par contact, vrai dé, résolution visible ; DE=élim, EX, DR/AR reculs | Adopté |
| 21 sep. | Attrition continue | Ancien modèle écarté au profit du pulsé (gardé en réserve) | Écartée |
| 21 sep. | Fraction engagée / réserves | Écartée pour l'instant — « on fait simple » | Écartée |
| 21 sep. | ZOC & mouvement | Halo rouge, ÷10, stop au contact ; attaquant avance, défenseur stoppe | Adopté |
| 21 sep. | Fixation & recul | Zéro attrition entre pulses ; repli lent dans un cône ±45° ; recul→ZOC = élim | Adopté |
| 21 sep. | Collisions | Séparation entre alliés seulement ; ennemis au contact | Adopté |
| 21 sep. | Mode HvH | Hot-seat local, camp actif commutable, IA coupée | Adopté |
| 22 sep. | Artillerie | Catégorie ART : val 1, ÷3 en vitesse, sans ZOC, bombarde & pilonne (suppression) | Adopté |
| 23 sep. | Fenêtre Combats | Table des engagements : rapport, colonne CRT, issues au dé, terrain, soutien ; décomposition des valeurs | Adopté |
| 23 sep. | Fiches deux camps | Clic sur toute unité = fiche ; commande RUS (vs IA) ou les deux (HvH) | Adopté |
| 23 sep. | Engagements | Option A : un combat par mêlée (cluster) ; DE=plus faible défenseur, EX, DR/AR par camp | Adopté |
| 23 sep. | Grande carte + zoom | Carte 4800×3000, zoom molette + pan, pions au zoom | Adopté |
| 23 sep. | Grille spatiale | Voisinage O(n) ; ~120 unités à 1,6 ms/pas ; cap visé 200+ | Adopté |
| 23 sep. | Mode d'emploi | Page notice.html : commandes, unités, relief, ZOC/ravito/soutien, combat | Adopté |
| 23 sep. | Soutien (aura) | Conservé tel quel ; S1–S4 en réserve pour le calibrage | En réserve |
| 23 sep. | Activation des unités | Délai (1 s) + montée progressive de vitesse (1 s) après un ordre | Adopté (à calibrer) |
| 23 sep. | Carte réelle — affichage | Import du JSON hexagone affiché dans l'éditeur | Fait |
| 23 sep. | Carte réelle — physique branchée | Module carte partagé : terrain continu, ravito sur les vraies têtes de voie, Moukden, positions historiques | Adopté (échelle à calibrer) |
| 23 sep. | Éditeur de carte au pinceau | Overlay peint : relief/forêt/marais, rivières, routes, rail, villes, forts, ravito, objectif — taille réglable ; lu par la simulation (physique + rendu). Esthétique fine à venir. | Adopté (v1 simple) |
| 23 sep. | Calques & décalquage | Deux calques à transparence réglable : Référence (image importée à décalquer) et Dessin (peinture, en coordonnées du jeu). Le fond de référence se déplace (poignée ✛ / molette), s'agrandit (± ou molette) et se cale au pas fin (flèches). But : décalquer la vraie carte pour peindre le terrain. | Adopté |
| 24 sep. | Retrait du fond hexagonal | Le fond hexagone disparaît de l'éditeur ET de la simulation : seule la carte dessinée existe. La physique ne lit plus que l'overlay peint (hors dessin = plaine ; plus de rivières/routes hexagonales invisibles) — le jouable épouse le visible. La référence n'est plus qu'une image à décalquer. | Adopté |
| 24 sep. | Ordre des niveaux (rendu & palette) | Empilement cohérent, du plus bas au plus haut : plaine · colline · rivière · voie ferrée · route · ville · fort · arbres. La forêt devient un couvert d'arbres dessiné au sommet (masse verte + houppiers) au lieu d'une simple teinte de sol. La palette du pinceau suit le même ordre. | Adopté |
| 25 sep. | Cavalerie (3e catégorie) | Catégorie CAV : combat 3, 2× plus rapide que l'infanterie (vitesse 120 vs 60), projette une ZOC (écran), meilleure en attaque qu'en défense. Symbole OTAN = barre diagonale unique. Paramètres réglables (vitesse, ZOC, bonus). Unités : Cav. Mishchenko (RUS), Cav. Akiyama (JAP). | Adopté |
| 25 sep. | Éditeur — vue de la carte | Contrôles explicites : Zoom +/−, Recentrer, outil Déplacer (glisser gauche = déplacer la vue, sans le clic-milieu). | Adopté |
| 25 sep. | Éditeur — rectitude des tracés | Curseur « sinueux ↔ droit » : après un tracé (rivière/route/rail), simplification (Douglas-Peucker, tolérance croissante) puis lissage (Chaikin). Monté = lignes plus droites ; baissé = suit la main. Corrige l'aspect « moche » du tracé souris. | Adopté |
| 26 sep. | Habillage — carte sur papier beige | Fond de carte parchemin beige (éditeur + simulation). Masses de terrain organiques à bords diffus (dégradés radiaux + irrégularité déterministe) sur une gamme sépia : plaine sable, colline tan, marais olive-beige, arbres vert-olive. Voie ferrée tout en noir. Rivière bleu-gris doux, route terre battue, villes en terre cuite, forts sépia. | Adopté |
| 26 sep. | Couleurs des pions | Japon : fond blanc, encre noire · Russie : fond vert, encre noire. Symboles OTAN (X infanterie, barre cavalerie, disque artillerie) et valeurs en noir. | Adopté |
| 26 sep. | Simulation — outil main | Bouton ✋ Déplacer dans la barre Vue : glisser gauche = déplacer la carte (comme dans l'éditeur), en plus du clic-milieu. | Adopté |
| 26 sep. | Texture parchemin | Grain de papier procédural (tuile mise en cache : mouchetures chaudes/froides + fibres) appliqué au fond de carte des deux modules. | Adopté |
| 26 sep. | Éditeur — texte & tableaux | Deux outils d'annotation posés au clic. Texte : contenu multi-ligne, police, taille, couleur, gras/italique, effet (contour ou ombre). Tableau : lignes/colonnes, taille des cellules, taille du texte, en-tête, bordures, couleurs (fond, en-tête, texte, bordure), contenu par cellule. Déplaçables par glisser, dupliquer/supprimer. Rendus sur le canevas et lus par la simulation. | Adopté |
| 26 sep. | Éditeur — options « vrai éditeur » | Annuler/Rétablir (boutons + Ctrl+Z / Ctrl+Y, historique de 80 pas), Suppr pour l'annotation sélectionnée, aperçu du pinceau (cercle de taille qui suit le curseur — corrige le ressenti « taille inopérante »), cadre de sélection des annotations. | Adopté |
| 27 sep. | Parchemin solidaire de la carte | Le grain suit désormais le zoom/déplacement (motif calé en coordonnées monde) au lieu d'être figé à l'écran. | Corrigé |
| 27 sep. | Texte — rotation, taille 240, typos | Rotation −180…180°, taille jusqu'à 240 px, et polices « d'époque » (Copperplate, Palatino, Book Antiqua, Garamond, Rockwell…). | Adopté |
| 27 sep. | ZOC — ligne au lieu d'aura | La zone de contrôle est tracée par un cercle jaune pointillé qui la délimite (rayon = zocRayon), plus lisible que l'ancien halo diffus. | Adopté |
| 27 sep. | Pions — lisibilité & chef | Valeur de combat des pions japonais cerclée de blanc (se détache du X noir). Nouvelle catégorie Chef d'armée : symbole étoile sur le pion (proportions conservées), un par camp (Kouropatkine / Oyama). | Adopté |
| 27 sep. | Fortifications par camp | Deux types de fort (RUS / JAP), couleur et marque distinctes. Une fortification ne protège que l'armée à qui elle appartient (défense de fort propre à chaque camp dans le champ physique). | Adopté |
| 28 sep. | Déplacement en formation | Un ordre donné à plusieurs unités sélectionnées translate tout le groupe (centroïde → point cliqué) au lieu de les regrouper en éventail : les positions relatives sont conservées. | Adopté |
| 28 sep. | Échelle de temps ×⅛ | Ajout d'une vitesse ×⅛ pour un contrôle plus fin des phases lentes. | Adopté |
| 28 sep. | Multijoueur en ligne | Relais mp.php sur OVH (aucune base de données : un JSON par partie dans mp_rooms/). Modèle hôte fait autorité : l'hôte simule et publie l'état, l'invité envoie ses ordres et affiche. Un code de partie (5 caractères) relie les deux joueurs, chacun sur son camp. Sondage ~0,7 s. Testé de bout en bout (création, jonction, état hôte→invité, ordres invité→hôte). | Adopté |
| 29 sep. | Règles — toutes unités | Route : sur une route, vitesse ×1,5. Rivière : attaquer en traversant une rivière divise la valeur d'attaque par 2 (même si la rivière est coupée par une route). Ravitaillement : hors ravitaillement, combat divisé par 2. | Adopté |
| 29 sep. | Règles — artillerie / cavalerie | Artillerie : ne tire pas au corps à corps. Cavalerie : en défense, elle esquive l'attaquant en reculant ; elle n'est jamais ralentie par les ZOC ennemies. | Adopté |
| 29 sep. | Règles — forts & commandement | Fort : un défenseur sur son propre fort a une défense ×2, cumulative avec les collines (deux types de fort, chacun ne protège que son camp). Chef : portée de commandement réglable (défaut = 2× la portée d'artillerie). Sans bénéfice de chef : −20% mouvement, −30% combat, et interdiction d'attaquer. L'absence de chef pénalise donc fortement. | Adopté |
| 29 sep. | Règles — ravitaillement par rail | Le ravitaillement part des voies ferrées (et des têtes de voie). Une unité est ravitaillée si un tracé ≤ portée (px, réglable) la relie à un rail ami — chemin courbe/contournant (propagation sur grille), coupé par la ZOC ennemie et par les sabotages. Rails marqués par camp (Rail RUS / Rail JAP). | Adopté |
| 29 sep. | Règles — sabotage des rails | Une unité immobile 30 s sur un rail ennemi sans subir de corps à corps (l'artillerie ne compte pas) le détruit : une croix rouge marque la coupure et le ravitaillement ne passe plus par là. Une unité amie immobile 30 s sur une coupure la répare. Durée réglable ; état synchronisé en multijoueur. | Adopté |
| 29 sep. | Divers | Échelle de temps ×⅛. Éditeur : collines assombries pour mieux les distinguer. | Adopté |
| 30 sep. | Éditeur — sauvegarde des unités Correctif | L'éditeur charge le roster depuis localStorage au démarrage et l'enregistre automatiquement à chaque modification (ajout, déplacement, édition). Les unités créées persistent au retour dans l'éditeur (c'était bloquant). | Corrigé |
| 30 sep. | Valeur de combat jusqu'à 20 | Plafond porté de 12 à 20 (éditeur + fiche de la simulation). | Adopté |
| 30 sep. | Colline foncée (cosmétique) | Pinceau « Colline+ » : même effet de jeu que la colline, teinte bien plus sombre pour accentuer le relief. Code terrain 4 = effet du code 1. | Adopté |
| 30 sep. | Simulation — affichage | Bouton Noms (afficher/masquer les noms d'unités). Les objectifs de mouvement ennemis ne sont plus affichés (seuls ceux de son camp). Le terrain est découpé aux bords (plus de débordement). Doublon de l'objectif corrigé (un seul marqueur, qui suit le zoom). | Adopté |
| 30 sep. | Ravitaillement — connexion au bord | Un rail n'alimente que s'il est relié au bord ami (nord = Russie, sud = Japon) ou à une tête de voie amie ; la propagation suit les jonctions (pattes d'oie). Une branche isolée n'alimente pas, et un sabotage isole tout ce qui est en aval. Vérifié. | Corrigé |
| 30 sep. | Noms identiques & identifiants | Chaque pion reçoit un identifiant unique à part le nom ; tous les traitements (combat, ciblage) passent par l'id. Deux unités peuvent donc porter le même nom sans aucun risque. | Confirmé |
| 1 oct. | Ravitaillement sur toute la ligne Correctif | Le ravitaillement rayonne désormais depuis toute la longueur de la voie ferrée amie (et des têtes de voie), plus seulement depuis un point. Un sabotage retire la source du rail localement (brèche). Vérifié : ravitaillé le long de tout un rail, même non collé au bord. | Corrigé |
| 1 oct. | Victoire simplifiée | Condition unique : une unité japonaise sur l'objectif 35 s → victoire japonaise. Suppression des autres conditions (pertes 60%, limite de temps). Durée réglable (curseur, défaut 35 s). | Adopté |
| 1 oct. | Règles complètes (notice.html) | Réécriture de la notice en règles détaillées v2.0 : sommaire, légende visuelle (pions, anneaux, marqueurs, couleurs), tableaux des unités et du terrain, distances clés au pixel, combat (CRT complète + modificateurs), artillerie, commandement, ravitaillement, forts, victoire, multijoueur, paramètres réglables. | Adopté |
| 2 oct. | Rails toujours à un camp | Suppression des rails neutres : un rail est RUS ou JAP. Un rail n'alimente que son propre camp. | Adopté |
| 2 oct. | Ravitaillement — connexion au bord du camp | Une section de rail n'alimente que si elle est reliée au bord de son camp (nord/sud), via les jonctions (pattes d'oie) et têtes de voie. Une branche non reliée n'alimente pas ; un sabotage rompt la section et coupe l'aval. Vérifié. | Adopté |
| 2 oct. | Ravitaillement — exception corps à corps | Une unité engagée qui se retrouve en ZOC ennemie (imbrication de mêlée) reste ravitaillée si elle est sous la ZOC d'un allié lui-même ravitaillé, de proche en proche (chaîne). Empêche une mêlée de couper artificiellement le ravitaillement. Vérifié (unité coupée par le champ, sauvée par la chaîne). | Adopté |
| 3 oct. | Écran de départ | Au lancement : choix du camp (l'IA prend l'autre), de l'adversaire (IA / humain même écran) et du ravitaillement (Avec gestion / Sans = tout le monde ravitaillé). Démarrage en ×⅛. « Rejouer » y ramène. | Adopté |
| 3 oct. | IA revue (doctrine par camp) | L'IA joue le camp opposé au joueur. Japon : colonnes d'assaut vers Moukden, cavalerie de débordement, artillerie qui vise l'ennemi le plus menaçant et se replace pour rester à portée. Russie : défense lâche — chaque unité tient un secteur devant Moukden sur le meilleur terrain (échantillonnage de la défense), contre-attaque locale si supériorité, artillerie en appui. | Adopté |
| 3 oct. | Tir d'artillerie — à revoir | Le pilonnage actuel n'est pas destructeur ; règle de tir/effet à retravailler ultérieurement. | En réserve |
| 27 sep. | Moteur séparé + tests | Extraction du moteur (état + règles) dans data/moteur.js, exécutable sans navigateur (Node). Harnais de régression data/moteur.test.js (toutes les règles isolées). Calque de débogage (champ de ravitaillement, ZOC, commandement, artillerie, mêlées). | Adopté |
| 29 sep. | Débogage & réglages | Coordonnées souris, grille de ravitaillement affinée (35 px), ligne de ravitaillement en surbrillance au clic (vraie route). Portée d'artillerie −25 % (240). Aura du chef russe −50 % (320). Correctif : en JAP vs IA on commande bien son camp. Bundle portable (carte+roster embarqués) pour clé USB / mise en ligne. | Adopté |
| 1 oct. | Ravitaillement — révision ZOC | Nouvelle règle cohérente : une unité est ravitaillée si une partie de sa ZOC touche le champ, ou via une chaîne de ZOC amies jusqu'à une source. Le rail ravitaille du bord jusqu'au sabotage / ZOC ennemie, pas au-delà (plus de « saut » par-dessus la coupure). Plus de résidu du fond : une carte peinte n'utilise que ses propres dépôts. | Adopté |
| 3 oct. | Fortifications — halo ×2 | Le bénéfice défensif d'un fort porte jusqu'à son rayon ×2 (sans changer le visuel), pour que plusieurs petites fortifications collées couvrent correctement les pions dessus et à proximité. | Adopté |
| 3 oct. | CRT : d6 → d12 | Table de combat passée au dé 12, « défenseur favorisé » à cote égale, avec le nouveau résultat ST (front stabilisé). Motivé par le temps réel (re-tir toutes les 20 s → létalité cumulée). Comparatif d6/d12 en présentation CRT classique : voir §3 bis. Lien règles ajouté sous le titre du simulateur. | Adopté |
Le jeu se joue à deux, chacun sur son PC, via le site hébergé chez OVH. Aucun serveur temps réel n'est nécessaire : un simple fichier PHP fait le relais.
simulation.html) : tout le dossier du jeu plus mp.php. Le sous-dossier mp_rooms/ se crée tout seul au premier lancement (le dossier parent doit être inscriptible — c'est le cas par défaut chez OVH). Rien d'autre à configurer : ni base de données, ni réglage PHP particulier.