Dossier de conception & d'arbitrage

Mukden 1905 — wargame temps réel continu
v1.0 · 23 septembre 2026
document vivant — mis à jour à chaque décision
Adopté décidé et en place Ouvert décidé, reste à implémenter À explorer piste à tester & comparer Idée non tranchée

0 · Intention

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.

1 · Problématiques

Les questions difficiles que le passage continu soulève, et qu'il faut trancher une à une.

2 · Décisions arrêtées

Espace continu Adopté
Positions (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.
Boucle à pas fixe + rendu interpolé Adopté
30 pas logiques/seconde, accumulateur, affichage interpolé. Pourquoi : une simulation stable et reproductible quelle que soit la vitesse (×¼ à ×4), indispensable pour comparer des réglages.
Posture = rôle dans la CRT Adopté
Offensive = attaquant (engage, avance, subit le « ÷2 » du terrain adverse) ; défensive = défenseur (tient, profite du terrain et d'un bonus). Pourquoi : la CRT se décide sur le rapport de forces ET sur le rôle ; la posture est donc la façon la plus naturelle de brancher le joueur sur la table.
Combat pulsé à la CRT (vrai dé, résolution visible) Adopté
Au contact, un minuteur propre à chaque unité assaillie monte ; au bout du « tour de combat » (≈ 20 s, réglable) la vraie CRT 1976 tranche : rapport de forces → colonne (arrondi en faveur du défenseur), tir d'un dé → AR / DR / EX / DE, affiché sur la carte (rapport, dé, résultat). Aucune usure entre deux pulses. Pourquoi : restaure l'incertitude — un 5:1 peut ne donner qu'un recul (défense héroïque), un 1:1 peut coûter cher à l'attaquant. L'issue vient de la table, pas du nombre.
Le nombre n'est plus roi : pion à 2 valeurs Adopté
Chaque pion n'a que deux valeurs : une valeur de combat entière 1–12 et un facteur de mouvement (uniforme pour l'infanterie). Fini l'effectif qu'on grignote. Le rapport de forces de la CRT se calcule sur ces valeurs (modulées par posture, terrain, ravito, soutien, coef). Pourquoi : abstraction assumée, calibrage simple, fidèle à l'esprit des facteurs de combat du jeu de plateau.
Résultats discrets : DE / EX / DR / AR Adopté
DE = élimination directe du défenseur ; EX = défenseur éliminé + le plus fort assaillant ; DR = le défenseur recule ; AR = les assaillants reculent. Un recul dans une ZOC ennemie = élimination (règle Mukden). Le recul se fait dans l'axe unité→ennemi (cône ±45°).
Ravitaillement continu Adopté
Rayonne depuis les têtes de voie ferrée (Russie vers le nord, portée courte ~16 ; Japon vers le sud, portée ~25 ; plus l'« Hexagone A » pour 4 divisions japonaises). La ligne est coupée si elle traverse une ZOC ennemie, sauf occupation amie. Le ravito affecte la force de combat, jamais le mouvement. Pourquoi : fidèle à la règle 4.
Soutien entre unités proches Adopté
Une unité gagne un bonus de coefficient croissant avec le nombre et la proximité d'alliés (rayon, bonus/allié, plafond réglables). Pourquoi : récompense la cohésion d'une ligne, punit l'isolement — sans passer par le nombre d'hommes.
Coefficient manuel par unité Adopté
Un multiplicateur ×0,3 à ×2 réglable en direct sur chaque pion (bonus/malus). Pourquoi : outil d'arbitrage et de scénarisation — représenter une spécificité, un moral, un ordre, sans nouvelle règle.
Séparation des paramètres Adopté
Deux familles distinctes : paramètres d'unité (fiche : force, mouvement, posture, coef, position) et paramètres de règle par catégorie (Infanterie pour l'instant) + global. Pourquoi : régler une catégorie sans toucher chaque pion, et inversement.
Fixation au contact + zéro attrition entre pulses Adopté
Entre deux résolutions, aucune perte de valeur. Une unité au contact est fixée : elle ne peut se désengager qu'au ralenti (vitesse fortement réduite) et seulement vers l'arrière (cône ±45° opposé à l'ennemi). Pourquoi : rompre le combat doit être un choix coûteux, pas une esquive latérale gratuite.
Mode Humain contre Humain (hot-seat) Adopté
En plus du jeu contre l'IA, un mode HvH local : l'IA est coupée, on commute le camp actif (RUS / JAP) et on commande les deux bords tour à tour. Pourquoi : pousser les tests et confronter les réglages à un adversaire humain. (Réseau en ligne : plus tard.)
Journal, bilan & situations Adopté
Journal horodaté des événements, bilan d'après-bataille exportable, puces de situation en direct, table de tous les paramètres des deux camps. Pourquoi : comprendre pourquoi une partie a tourné ainsi, condition d'un bon calibrage.

3 · Arbitrages en cours

Attrition continue (ancien modèle) Écartée — en réserve
La première version transformait la CRT en pertes/seconde. Mise de côté au profit du combat pulsé, qui restitue l'incertitude. Conservée ici comme point de comparaison si l'on veut un jour mesurer les deux approches.
Fraction engagée / réserves / qualité Écartée pour l'instant
L'idée d'engager seulement une part d'une unité, avec réserves et modificateurs de qualité, est volontairement écartée : décision « on fait simple » (2 valeurs par pion). À rouvrir seulement si le besoin de finesse se fait sentir après calibrage.
Calibrage de la CRT & des tours Table tranchée (d12) — reste à peaufiner
La table de combat est arrêtée : passage au d12 « défenseur favorisé » (voir §3 bis ci-dessous pour le comparatif d6/d12 en présentation CRT classique). Restent réglables par l'expérience : durée du tour de combat, distance de recul, poids des bonus de posture, de terrain, du ravitaillement et du soutien. Tous exposés en sliders, ajustables en partie et testables en HvH.
Réseau en ligne (humain vs humain à distance) Idée
Le jeu original avait un mode en ligne à code. Le HvH est pour l'instant local (hot-seat) ; le distant viendra plus tard.
Activation des unités (délai + démarrage progressif) Adopté — à calibrer
Une unité qui reçoit un ordre ne part pas instantanément : elle s'active après un délai (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.)
Carte réelle importée (version hexagone) À explorer
La carte hexagonale d'origine (40×30, 1200 hexes) est importée et affichée dans l'éditeur : terrain plaine/accidenté, rivière Hun He, voie ferrée, points de ravitaillement. Reste à décider si on branche la physique dessus (le relief réel agit sur mouvement/combat, le ravito trace le long de la vraie voie) — voir §9.

3 bis · Arbitrage majeur — la table de combat passe du d6 au d12

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 :

Ancien — d6 (CRT 1976)

Nouveau — d12 (STR, défenseur favorisé) Adopté

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.

4 · Règle détaillée — Zones de contrôle & mouvement

Règle — ZOC & mouvement Adopté (implémenté)

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.

Point à confirmer : pour l'attaquant, « stop au contact » = contact avec le pion ennemi (là où le combat démarre), pas avec la ZOC — c'est bien ça ? Et le défenseur qui reçoit l'ordre d'avancer malgré tout : on respecte le stop (il faut le repasser en offensive pour bouger), ou l'ordre manuel prime ?

5 · Règle détaillée — Collisions / empilement

Système actuellement en place, tel que demandé, pour qu'on puisse le juger et l'améliorer.

Ce qui est implémenté

Pourquoi ce choix : simple, stable, sans pathfinding, déterministe, et il garde les pions lisibles comme des jetons distincts. Suffisant pour une douzaine d'unités.

Évolution adoptée : séparation entre alliés seulement Adopté

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 ».

Ce qui reste perfectible Idée

À trancher ensemble : garde-t-on la séparation ami+ennemi actuelle, ou passe-t-on à « séparation entre alliés + contact libre entre ennemis » (mon intuition : la seconde, elle sert ta règle de ZOC) ? Et veut-on introduire tout de suite une largeur de front limitant les assaillants ?

6 · Révision — engagements & soutien À décider

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.

Problème 1 — compter/regrouper les engagements

A · Un combat par mêlée (cluster) Adopté & implémenté
Décision de Sébastien : une unité n'engage qu'un seul corps-à-corps (contre un ou plusieurs ennemis) et peut y être soutenue par plusieurs alliés. On construit le graphe des contacts, on en extrait les mêlées (composantes connexes), et on résout une fois par mêlée. Le camp au plus fort total offensif attaque ; l'autre défend en totalité. Un seul dé par mêlée. 3 mêlées = 3 combats. Application : DE élimine le défenseur le plus faible, EX le plus faible de chaque camp, DR/AR font reculer tout le camp concerné. Minuteur porté par la mêlée.
B · Défenseur-centré dédupliqué Écartée
Rejetée par Sébastien : deux résolutions distinctes pour un même choc peuvent donner des résultats différents voire opposés ; intéressant pour la « friction », mais trop complexe à suivre pour le joueur.

Algorithme proposé (option B)

// 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.

Problème 2 — la règle de soutien

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.

Options de soutien Idée
S1 — non-engagés seulement : une unité déjà en combat ne peut pas soutenir.
S2 — directionnel : ne comptent que les alliés situés du côté du combat (arc vers l'ennemi).
S3 — participation réelle : un allié adjacent au défenseur ajoute sa valeur au camp (comme les « combats multi-hexagones » du jeu de plateau) au lieu d'un simple bonus d'aura.
S4 — plafond par largeur de front : au plus N alliés comptent sur un même combat.
Recommandation : S3 pour l'engagement (le soutien devient de la vraie force apportée au combat) + une petite aura de cohésion S1 pour le moral hors combat.
Statut : engagements = option A adoptée et implémentée. Soutien : l'aura actuelle est conservée pour l'instant (le soutien s'ajoute au facteur de combat de l'unité engagée) ; les variantes S1–S4 restent en réserve, à rouvrir au calibrage.

7 · Montée en charge Adopté

Objectif fixé : tenir jusqu'à ~200 unités, sur une carte agrandie, avec navigation.

Grande carte + zoom/pan Adopté
Carte portée à 4800×3000 (≈9× la surface). Caméra zoom molette (vers le curseur), déplacement au clic-milieu, boutons 🔍+ / 🔍− / Ajuster ; les pions se dimensionnent avec le zoom. Éditeur aligné sur la même carte.
Grille spatiale (optimisation) Adopté
Les recherches de voisinage (contacts, collisions, ZOC, soutien, mêlées) passent d'un balayage O(n²) à une grille par cellules O(n). Mesuré : 120 unités ≈ 1,6 ms/pas (budget 33 ms à 30 Hz), soit une marge confortable pour viser 200+.

9 · Carte réelle — ce qu'on en tire À décider

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).

Fait — physique branchée Adopté
Un module carte partagé (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é.
À ajuster : l'échelle Ouvert
La taille des hexes (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.

10 · Journal des décisions

DateSujetDécisionStatut
20 sep.Espace & boucleContinu (x,y), pas fixe 30 Hz, rendu interpoléAdopté
20 sep.ZOC continueRayon projeté, effet mouvement + coupure ravito, annulation par occupationAdopté
20 sep.Anti-collisionSéparation par relaxation, ami+ennemiAdopté (à revoir §5)
21 sep.Postures & CRTPosture = rôle attaquant/défenseur ; combat = attrition continue dérivée CRTAdopté / à calibrer
21 sep.SoutienBonus selon voisins proches (rayon/bonus/plafond)Adopté
21 sep.Coef manuelMultiplicateur ×0,3–2 par unité, temps réelAdopté
21 sep.Pion à 2 valeursCombat 1–12 + mouvement uniforme ; le nombre d'hommes disparaîtAdopté
21 sep.Combat pulsé CRTMinuteur par contact, vrai dé, résolution visible ; DE=élim, EX, DR/AR reculsAdopté
21 sep.Attrition continueAncien 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 & mouvementHalo rouge, ÷10, stop au contact ; attaquant avance, défenseur stoppeAdopté
21 sep.Fixation & reculZéro attrition entre pulses ; repli lent dans un cône ±45° ; recul→ZOC = élimAdopté
21 sep.CollisionsSéparation entre alliés seulement ; ennemis au contactAdopté
21 sep.Mode HvHHot-seat local, camp actif commutable, IA coupéeAdopté
22 sep.ArtillerieCatégorie ART : val 1, ÷3 en vitesse, sans ZOC, bombarde & pilonne (suppression)Adopté
23 sep.Fenêtre CombatsTable des engagements : rapport, colonne CRT, issues au dé, terrain, soutien ; décomposition des valeursAdopté
23 sep.Fiches deux campsClic sur toute unité = fiche ; commande RUS (vs IA) ou les deux (HvH)Adopté
23 sep.EngagementsOption A : un combat par mêlée (cluster) ; DE=plus faible défenseur, EX, DR/AR par campAdopté
23 sep.Grande carte + zoomCarte 4800×3000, zoom molette + pan, pions au zoomAdopté
23 sep.Grille spatialeVoisinage O(n) ; ~120 unités à 1,6 ms/pas ; cap visé 200+Adopté
23 sep.Mode d'emploiPage notice.html : commandes, unités, relief, ZOC/ravito/soutien, combatAdopté
23 sep.Soutien (aura)Conservé tel quel ; S1–S4 en réserve pour le calibrageEn réserve
23 sep.Activation des unitésDélai (1 s) + montée progressive de vitesse (1 s) après un ordreAdopté (à calibrer)
23 sep.Carte réelle — affichageImport du JSON hexagone affiché dans l'éditeurFait
23 sep.Carte réelle — physique branchéeModule carte partagé : terrain continu, ravito sur les vraies têtes de voie, Moukden, positions historiquesAdopté (échelle à calibrer)
23 sep.Éditeur de carte au pinceauOverlay 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écalquageDeux 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 hexagonalLe 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 carteContrôles explicites : Zoom +/−, Recentrer, outil Déplacer (glisser gauche = déplacer la vue, sans le clic-milieu).Adopté
25 sep.Éditeur — rectitude des tracésCurseur « 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 beigeFond 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 pionsJapon : 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 mainBouton ✋ 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 parcheminGrain 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 & tableauxDeux 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 carteLe 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, typosRotation −180…180°, taille jusqu'à 240 px, et polices « d'époque » (Copperplate, Palatino, Book Antiqua, Garamond, Rockwell…).Adopté
27 sep.ZOC — ligne au lieu d'auraLa 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é & chefValeur 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 campDeux 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 formationUn 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 ligneRelais 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ésRoute : 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 / cavalerieArtillerie : 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 & commandementFort : 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 railLe 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 railsUne 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 CorrectifL'é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'à 20Plafond 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 — affichageBouton 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 bordUn 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 & identifiantsChaque 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 CorrectifLe 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éeCondition 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 campSuppression 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 campUne 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 à corpsUne 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épartAu 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 — à revoirLe pilonnage actuel n'est pas destructeur ; règle de tir/effet à retravailler ultérieurement.En réserve
27 sep.Moteur séparé + testsExtraction 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églagesCoordonné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 ZOCNouvelle 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 ×2Le 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 → d12Table 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é

11 · Déploiement multijoueur (OVH)

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.

Fichiers à déposer sur l'hébergement
Par FTP, à la racine du site (au même niveau que 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.
Lancer une partie
Un joueur ouvre la simulation, clique Créer (en choisissant son camp) : un code s'affiche. Il le transmet à son adversaire (SMS, mail…). L'autre ouvre la même page, saisit le code, clique Rejoindre : il reçoit automatiquement le camp opposé. La partie démarre, synchronisée.
Comment ça marche
L'hôte exécute la simulation (physique, combats, CRT) et publie l'état de toutes les unités environ toutes les 0,7 s. L'invité n'exécute pas la physique : il affiche l'état reçu et envoie seulement ses ordres (déplacements en formation, postures, tirs d'artillerie), que l'hôte applique aux unités de l'invité. Ainsi les deux écrans montrent la même partie, sans risque de désynchronisation. L'IA est désactivée en ligne.
Limites de la v1 & pistes Idée
L'invité voit la partie avec ~1 s de latence (sondage) et un léger « saut » à chaque rafraîchissement — à lisser par interpolation. L'hôte doit rester connecté (c'est lui qui simule). À venir si besoin : reprise après déconnexion, victoire/défaite affichée aussi côté invité, salon d'attente listant les parties, et passage à un vrai temps réel (WebSocket) si l'on veut plus de fluidité.
Mukden 1905 · dossier de conception — hexmap.fr. Prochaine mise à jour au prochain arbitrage.