@mcptoolshop/sovereign 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +60 -0
- package/README.es.md +10 -9
- package/README.fr.md +10 -9
- package/README.hi.md +10 -9
- package/README.it.md +9 -8
- package/README.ja.md +10 -9
- package/README.md +10 -9
- package/README.pt-BR.md +10 -9
- package/README.zh.md +10 -9
- package/package.json +1 -1
- package/release/CHANGELOG.md +60 -0
- package/release/digital-mode/sovereign-solo.html +172 -107
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,66 @@
|
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
+
## v1.1.2 — Circuit victory + human voice — 2026-05-20
|
|
9
|
+
|
|
10
|
+
**Beta.** Same day as v1.1.1, but a meaningfully different shape. After the v1.1.1 cold playthrough the game still felt too short and the ending too arbitrary — it ended because the clock ran out, not because someone won the Republic. v1.1.2 replaces the round-cap-with-mandate end condition with a **circuit-based** end condition tied to physical movement around the board.
|
|
11
|
+
|
|
12
|
+
**The new end condition:**
|
|
13
|
+
|
|
14
|
+
The game ends when one player has carried their faction around the Republic four times — i.e., completed their fourth crossing of Treasury Opens. At that moment, Final Accounting fires and the highest-Influence player wins, *not necessarily the player who got around first*. Hard cap stays at round 30 (a safety; essentially never fires — diagnostic showed 100 / 100 CANONICAL × 100 games complete by round 28).
|
|
15
|
+
|
|
16
|
+
**Why this is structurally different from v1.1.1:**
|
|
17
|
+
|
|
18
|
+
- v1.1.1: 12-round cap with mandate (15 IP + 5 lead) as early-trigger. Median 9 rounds, 36 turns. Ended by clock.
|
|
19
|
+
- v1.1.2: no round cap that anyone hits in practice. Median **23 rounds / 67 turns** — about 1.9× the previous game length. Ends when somebody physically rounds the board for the fourth time.
|
|
20
|
+
|
|
21
|
+
**CANONICAL × 100 (in-HTML batch sim):**
|
|
22
|
+
|
|
23
|
+
| Metric | v1.1.1 (mandate) | v1.1.2 (circuit) |
|
|
24
|
+
|---|---:|---:|
|
|
25
|
+
| Triggered | 62 / 100 | 100 / 100 |
|
|
26
|
+
| Median rounds | 9 | 23 |
|
|
27
|
+
| Median turns | ~27 | 67 |
|
|
28
|
+
| Treasury wins | 52 % | 56 % |
|
|
29
|
+
| Merchant wins | 32 % | 19 % |
|
|
30
|
+
| Manufacturer wins | 16 % | 25 % |
|
|
31
|
+
| Avg winning IP | ~16 | 28.7 |
|
|
32
|
+
| Avg lead margin | 5 | 7.9 |
|
|
33
|
+
| Bankruptcy events | 7 | observed |
|
|
34
|
+
| Safety-cap fires | n/a | 0 / 100 |
|
|
35
|
+
|
|
36
|
+
Trade-off worth naming: Merchant share drops (32 → 19) while Manufacturer rises (16 → 25). Longer games give Treasury and Manufacturer time to compound industrial / financial scoring, where Merchant's route-rent advantage matures faster in shorter games. Treasury still doesn't run away — share stays in the band.
|
|
37
|
+
|
|
38
|
+
**Trigger ≠ winner.** The player who completes the fourth circuit wins by Influence only 33 / 100 games. The other 67, somebody else holds the heavier ledger at termination. This is intentional — it preserves the "carry it across the line" feel while still rewarding economic depth. Endgame copy makes this explicit in both branches.
|
|
39
|
+
|
|
40
|
+
**Human voice copy pass.** All circuit / endgame narration rewritten away from gameplay-jargon ("Circuit Victory", "trigger player", "claimed the Republic") toward narrative-voice ("Hamilton has been around four times. The books close.", "Hamilton rounded the Republic four times — but the heaviest ledger belonged to Morris."). Per-circuit ledger entries vary by circuit number — first lap, two circuits in, three deep, books close.
|
|
41
|
+
|
|
42
|
+
**What's preserved from v1.1.1:**
|
|
43
|
+
|
|
44
|
+
- All Pass 1 / Pass 2 chrome (action rail above board, positions strip, portfolio strip, collapsed sidebar, 26 px tokens, designer gate, dice overlay)
|
|
45
|
+
- Pass 3 rent surfacing band
|
|
46
|
+
- All v0.18 mechanics: card effects, Acts (still firing rounds 1-7), scoring math, rent math, profile decision functions, RNG, deck order, Credit Crisis / Default / Rebellion triggers
|
|
47
|
+
- Designer URL flag: `?designer=1&circuit_target=N` for tuning the circuit threshold
|
|
48
|
+
|
|
49
|
+
**What changed:**
|
|
50
|
+
|
|
51
|
+
- `SAVE_VERSION = 'v0.21-circuit-candidate'`. v0.20 (v1.1.1) saves refuse to load with a friendly non-crash message.
|
|
52
|
+
- Mandate threshold removed. No more 15-IP + 5-lead trigger; the game ends on the fourth circuit only.
|
|
53
|
+
- Round counter on the chrome no longer reads "Round N of 12" — just "Round N" (and "· Late Republic" after round 7).
|
|
54
|
+
- Acts still fire in rounds 1-7; rounds 8-onward are Late Republic with no new political shocks. **Open risk**: median play has ~16 rounds of Late Republic with no Acts firing. If cold play finds this stretch feels empty, the v1.1.3 fix is an Acts redistribution pass, not a return to mandate.
|
|
55
|
+
|
|
56
|
+
**Beta caveats:**
|
|
57
|
+
|
|
58
|
+
- Not yet cold-walked end-to-end by a fresh human player. Beta tag is the safety net.
|
|
59
|
+
- Behavioral adaptation unmeasured: AI profiles still play current decision functions, not circuit-aware ones (e.g., Treasury doesn't yet race to hit the fourth circuit).
|
|
60
|
+
- The Late Republic stretch (~16 rounds in median play with no Acts firing) is a known open risk. Worth flagging in any playtest notes.
|
|
61
|
+
|
|
62
|
+
**npm history note:**
|
|
63
|
+
|
|
64
|
+
v1.1.0 remains on npm as the historical withdrawn version. v1.1.1 (mandate beta) and v1.1.2 (circuit beta) are both published. `npm install @mcptoolshop/sovereign` resolves to v1.1.2 (`latest`).
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
8
68
|
## v1.1.1 — Digital mode beta: human playability rebuild + 12-round pacing + mandate victory — 2026-05-20
|
|
9
69
|
|
|
10
70
|
**Beta release.** Second attempt at the digital mode after v1.1.0 was withdrawn the same day it shipped (2026-05-20). v1.1.0 simulation-verified but failed first cold human play; v1.1.1 fixes the structural human-playability gaps that audit could not catch. Not fully cold-validated end-to-end; shipping as beta so anyone who wants the digital mode can opt in while the player experience continues to settle.
|
package/README.es.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
**Estado — v1.1.
|
|
22
|
+
**Estado — v1.1.2 (beta).** La versión v1.1.0 fue retirada el mismo día de su lanzamiento (20 de mayo de 2026). La versión v1.1.1 reconstruyó el modo digital con correcciones de jugabilidad, un ritmo de 12 rondas y un umbral de victoria por mandato, pero aún se sentía demasiado corta. La versión v1.1.2 reemplaza la condición de finalización basada en el número de rondas por una condición de finalización **basada en circuitos**: el juego termina cuando un jugador ha hecho girar su facción alrededor de la República cuatro veces. La duración media del juego es de aproximadamente 23 rondas / 67 turnos (1.9 veces la v1.1.1). El jugador que desencadena el final no gana automáticamente; el jugador con la mayor influencia en el cálculo final es el que gana. El juego de mesa imprimible sigue siendo estable en la versión v0.2. Consulte el archivo `CHANGELOG.md` para obtener los detalles completos de los cambios y las advertencias de la versión beta.
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
|
|
28
28
|
Sovereign es un **juego de mesa al estilo "Monopoly" basado en el sistema de Hamilton**, sobre la creación del crédito público estadounidense, además de una **adaptación completa para un solo jugador / digital** que ejecuta las mismas reglas localmente en un navegador contra dos oponentes simulados y deterministas.
|
|
29
29
|
|
|
30
|
-
- **Juego de mesa** —
|
|
31
|
-
- **Modo digital** —
|
|
32
|
-
- **Punto de referencia de equilibrio** —
|
|
30
|
+
- **Juego de mesa** — edición imprimible de 34 hojas. Tablero de 40 casillas, 22 propiedades + 4 rutas + 2 instituciones, 8 sistemas de colores, 7 Actas del Congreso en orden histórico fijo, 4 roles de jugador, 3 pistas compartidas (Crédito Público · Resistencia Pública · Capacidad Industrial), 12+12 cartas de evento. Dos vías económicas viables además del Tesoro: Comerciante y Fabricante. Equilibrio de la versión v0.2, congelado.
|
|
31
|
+
- **Modo digital** — un único archivo HTML autocontenido. Condición de finalización basada en circuitos: el juego termina cuando un jugador completa su cuarta vez alrededor del Tesoro. La duración media del juego es de aproximadamente 23 rondas (67 turnos). Al final, el jugador con la mayor influencia es el que gana, *no necesariamente el que ha dado la vuelta al tablero primero*. El límite máximo de rondas se mantiene en 30 como medida de seguridad (nunca se alcanza en la configuración CANÓNICA × 100). Generador de números aleatorios mulberry32 determinista, oponentes controlados por IA (Tesoro / Finanzas, Comerciante / Infraestructura, Fabricante / Industria), guardar / cargar con integridad de hash, herramienta de simulación por lotes para el diseñador.
|
|
32
|
+
- **Punto de referencia de equilibrio** — modelo de circuitos (versión v1.1.2 beta): Tesoro 56 % · Comerciante 19 % · Fabricante 25 % (CANÓNICA × 100). Los tres perfiles tienen posibilidades significativas de ganar; el Fabricante aumenta en juegos más largos a medida que los conjuntos industriales tienen tiempo para madurar; la cuota del Comerciante disminuye a medida que las rutas son menos dominantes cuando se gasta dinero en mejoras a lo largo de un período más largo. Las mecánicas subyacentes de la versión v0.18 (Crisis de Crédito, puntuación de IP en efectivo, Carta Industrial, bonificaciones por completar conjuntos) se conservan idénticas en bytes desde el ciclo de diseño v0.3 → v0.10 → v0.18, impulsado por más de 1000 simulaciones deterministas.
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
@@ -127,11 +127,12 @@ El cuarto perfil conceptual (Oportunista/Efectivo) se pospone. El conjunto compe
|
|
|
127
127
|
|
|
128
128
|
## Limitaciones conocidas
|
|
129
129
|
|
|
130
|
-
- **La versión v1.1.
|
|
131
|
-
- **Los perfiles de IA aún no compiten por
|
|
132
|
-
- **
|
|
133
|
-
- **
|
|
134
|
-
- **
|
|
130
|
+
- **La versión v1.1.2 es una beta.** Los datos provienen de la simulación por lotes integrada en el HTML (100 / 100 juegos terminan por circuito, duración media de 23 rondas, división de ganadores 56 / 19 / 25). **No** ha sido jugada completamente por un jugador humano. Trátela como una opción a elegir hasta que la hayas probado tú mismo.
|
|
131
|
+
- **Los perfiles de IA aún no compiten por circuitos.** Utilizan las funciones de decisión de la versión v0.18: juegan para acumular influencia en lugar de competir para llegar al cuarto circuito. Los jugadores humanos reales pueden comportarse de manera muy diferente una vez que comprendan la condición de finalización.
|
|
132
|
+
- **Desencadenar ≠ ganar.** El jugador que completa el cuarto circuito solo gana por influencia en aproximadamente un tercio de los juegos. Esto es intencional: el cálculo final recompensa la profundidad económica, no la velocidad alrededor del tablero. La copia del final del juego hace que esta distinción sea explícita.
|
|
133
|
+
- **La parte final de la República es larga y no tiene Actas.** Las Actas siguen activándose en las rondas 1-7. El juego medio dura aproximadamente 23 rondas, dejando aproximadamente 16 rondas de la República tardía sin nuevos eventos políticos. Si esto parece vacío en un juego sin intervención, la siguiente solución es una redistribución de las Actas, no un retorno al mandato.
|
|
134
|
+
- **El Tesoro / Finanzas sigue siendo intencionalmente el más fuerte**, dentro del rango objetivo. Esto coincide con la tesis histórica: el crédito público y las finanzas federales fueron el principal instrumento económico de Hamilton.
|
|
135
|
+
- **Los eventos de fallo (Impago / Rebelión) siguen siendo principalmente decorativos.** La Crisis de Crédito se activa ocasionalmente; el Impago y la Rebelión casi nunca. El sistema de escalada tiene más tiempo para desarrollarse, pero aún así rara vez alcanza los niveles superiores. Las versiones futuras podrían revisar la presión de los estados de fallo.
|
|
135
136
|
|
|
136
137
|
---
|
|
137
138
|
|
package/README.fr.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
**Statut — v1.1.
|
|
22
|
+
**Statut — v1.1.2 (bêta).** La version v1.1.0 a été retirée le jour même de sa sortie (2026-05-20). La version v1.1.1 a refait le mode numérique avec des corrections de jouabilité, un rythme de 12 tours, et un seuil de victoire par mandat, mais elle restait toujours trop courte. La version v1.1.2 remplace la condition de fin basée sur le nombre de tours par une condition de fin basée sur un circuit : la partie se termine lorsque l'un des joueurs a fait le tour de la République quatre fois. La durée moyenne d'une partie est d'environ 23 tours / 67 tours (1,9 fois la v1.1.1). Le joueur qui déclenche la fin ne gagne pas automatiquement ; c'est le joueur avec la plus grande influence lors du décompte final qui gagne. La version imprimable du jeu de plateau reste stable à la version v0.2. Consultez le fichier `CHANGELOG.md` pour connaître les modifications complètes et les limitations de la version bêta.
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
|
|
28
28
|
Sovereign est un **jeu de société du type Monopoly, basé sur le système Hamilton**, qui traite de la création du crédit public américain, ainsi qu'une **adaptation complète pour un mode solo / numérique** qui exécute les mêmes règles localement dans un navigateur, contre deux adversaires simulés et déterministes.
|
|
29
29
|
|
|
30
|
-
- **Jeu de plateau** — édition imprimable
|
|
31
|
-
- **Mode numérique** — un seul fichier HTML autonome.
|
|
32
|
-
- **Équilibre de base** — modèle de
|
|
30
|
+
- **Jeu de plateau** — édition imprimable de 34 feuilles. Plateau de 40 cases, 22 propriétés + 4 routes + 2 institutions, 8 systèmes de couleurs, 7 actes du Congrès dans un ordre historique fixe, 4 rôles de joueurs, 3 pistes communes (Crédit public · Résistance publique · Capacité industrielle), 12 + 12 cartes d'événements. Deux voies économiques viables en dehors du Trésor : le commerçant et le fabricant. Équilibrage de la version v0.2, figé.
|
|
31
|
+
- **Mode numérique** — un seul fichier HTML autonome. Condition de fin basée sur un circuit : la partie se termine lorsque l'un des joueurs effectue son quatrième passage par "Trésor ouvert". La durée moyenne d'une partie est d'environ 23 tours (67 tours). Lors du décompte final, le joueur avec la plus grande influence gagne, *et non nécessairement celui qui a fait le tour du plateau en premier*. La limite maximale de tours reste à 30 pour des raisons de sécurité (elle ne se déclenche jamais dans le mode CANONIQUE × 100). Générateur de nombres aléatoires mulberry32 déterministe, adversaires IA scriptés (Trésor / Finances, Commerçant / Infrastructures, Fabricant / Industrie), sauvegarde / chargement avec intégrité des données, outil de simulation par lots pour les concepteurs.
|
|
32
|
+
- **Équilibre de base** — modèle de circuit (v1.1.2 bêta) : Trésor 56 % · Commerçant 19 % · Fabricant 25 % (CANONIQUE × 100). Les trois profils ont une chance de gagner de manière significative ; le fabricant gagne plus souvent dans les parties plus longues, car les ensembles industriels ont le temps de se développer ; la part du commerçant diminue à mesure que les routes deviennent moins dominantes lorsque l'argent est dépensé pour des améliorations sur une période plus longue. Les mécanismes sous-jacents de la version v0.18 (Crise du crédit, notation des points de propriété, Charte industrielle, bonus pour l'achèvement des ensembles) sont conservés de manière identique, provenant de la conception v0.3 → v0.10 → v0.18, basée sur plus de 1000 simulations de jeux déterministes.
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
@@ -127,11 +127,12 @@ Le quatrième profil conceptuel (Opportuniste / Trésorerie) est reporté. L'ens
|
|
|
127
127
|
|
|
128
128
|
## Limitations connues
|
|
129
129
|
|
|
130
|
-
- **La version v1.1.
|
|
131
|
-
- **Les profils d'IA ne
|
|
132
|
-
- **
|
|
133
|
-
- **
|
|
134
|
-
- **
|
|
130
|
+
- **La version v1.1.2 est une bêta.** Les chiffres proviennent du diagnostic effectué lors de la simulation par lots intégrée (100 % des parties déclenchent la fin par circuit, durée moyenne de 23 tours, répartition des gagnants 56 % / 19 % / 25 %). Elle n'a **pas** été testée de bout en bout par un joueur humain. Considérez-la comme une version à tester sur demande jusqu'à ce que vous l'ayez vous-même testée.
|
|
131
|
+
- **Les profils d'IA ne se font pas encore la course pour les circuits.** Ils utilisent les fonctions de décision de la version v0.18, qui visent à accumuler de l'influence plutôt qu'à faire la course vers le quatrième circuit. Les joueurs humains peuvent se comporter très différemment une fois qu'ils comprennent la condition de fin.
|
|
132
|
+
- **Déclencheur ≠ gagnant.** Le joueur qui effectue le quatrième circuit ne gagne que par influence dans environ un tiers des parties. C'est intentionnel : le décompte final récompense la profondeur économique, et non la vitesse autour du plateau. La copie de fin de partie rend cette distinction explicite.
|
|
133
|
+
- **La partie tardive de la République est longue et ne comporte aucun acte.** Les actes sont toujours actifs pendant les tours 1 à 7. La durée moyenne d'une partie est d'environ 23 tours, ce qui laisse environ 16 tours de la partie tardive de la République sans nouveaux événements politiques. Si cela vous semble vide en mode "jeu froid", la prochaine correction consistera à redistribuer les actes, et non à revenir à un système de mandat.
|
|
134
|
+
- **Le Trésor / Finances reste intentionnellement le plus puissant**, dans la plage cible. Cela correspond à la thèse historique : le crédit public et les finances fédérales étaient les principaux leviers économiques de Hamilton.
|
|
135
|
+
- **Les événements de défaillance (Défaut / Rébellion) restent principalement décoratifs.** La Crise du crédit se déclenche occasionnellement ; le Défaut et la Rébellion se déclarent presque jamais. Le système d'escalade a plus de temps pour s'accumuler, mais atteint rarement les niveaux supérieurs. Les versions futures pourraient revoir la pression des états de défaillance.
|
|
135
136
|
|
|
136
137
|
---
|
|
137
138
|
|
package/README.hi.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
**स्थिति — v1.1.
|
|
22
|
+
**स्थिति — v1.1.2 (बीटा)।** v1.1.0 को उसी दिन वापस ले लिया गया जिस दिन इसे जारी किया गया था (2026-05-20)। v1.1.1 ने डिजिटल मोड को फिर से बनाया, जिसमें खेलने की समस्याओं को ठीक किया गया, 12 राउंड की गति, और एक अनिवार्य जीत की सीमा जोड़ी गई, लेकिन फिर भी यह बहुत कम समय का लगा। v1.1.2 में, राउंड की सीमा को समाप्त करने की शर्त को बदलकर "सर्किट-आधारित" समाप्ति शर्त कर दिया गया है: खेल तब समाप्त होता है जब कोई एक खिलाड़ी अपनी गुट को गणराज्य के चारों ओर चार बार ले जाता है। औसत खेल की अवधि लगभग 23 राउंड / 67 चालें (v1.1.1 से 1.9 गुना अधिक)। वह खिलाड़ी जो खेल को समाप्त करता है, वह स्वचालित रूप से नहीं जीतता है—अंतिम गणना में सबसे अधिक प्रभाव (इन्फ्लुएंस) वाला खिलाड़ी जीतता है। मुद्रित बोर्ड गेम v0.2 पर स्थिर है। पूर्ण परिवर्तनों और बीटा संबंधी सीमाओं के लिए `CHANGELOG.md` देखें।
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
|
|
28
28
|
"सोवरिन" एक **हैमिल्टन-सिस्टम मोनोपोली-शैली का बोर्ड गेम** है जो अमेरिकी सार्वजनिक ऋण की स्थापना के बारे में है, साथ ही एक **पूर्ण एकल/डिजिटल संस्करण** भी है जो समान नियमों को दो पूर्वनिर्धारित स्क्रिप्टेड विरोधियों के खिलाफ ब्राउज़र में स्थानीय रूप से चलाता है।
|
|
29
29
|
|
|
30
|
-
- **बोर्ड गेम** — मुद्रित करने योग्य 34 पृष्ठों का संस्करण। 40 स्थानों वाला बोर्ड, 22
|
|
31
|
-
- **डिजिटल मोड** — एक एकल, आत्मनिर्भर HTML फ़ाइल।
|
|
32
|
-
- **संतुलन आधार** —
|
|
30
|
+
- **बोर्ड गेम** — मुद्रित करने योग्य 34 पृष्ठों का संस्करण। 40 स्थानों वाला बोर्ड, 22 संपत्ति, 4 मार्ग और 2 संस्थान, 8 रंग प्रणाली, 7 कांग्रेस के अधिनियम (ऐक्ट्स) जो एक निश्चित ऐतिहासिक क्रम में हैं, 4 खिलाड़ी भूमिकाएं, 3 साझा ट्रैक (सार्वजनिक ऋण, सार्वजनिक प्रतिरोध, औद्योगिक क्षमता), 12+12 घटना कार्ड। खजाने (ट्रेजरी) के अलावा दो व्यवहार्य आर्थिक रास्ते हैं: व्यापारी और निर्माता। v0.2 का संतुलन, जो अपरिवर्तित है।
|
|
31
|
+
- **डिजिटल मोड** — एक एकल, आत्मनिर्भर HTML फ़ाइल। सर्किट-आधारित समाप्ति शर्त: खेल तब समाप्त होता है जब कोई एक खिलाड़ी "ट्रेजरी ओपन" को चौथी बार पार करता है। औसत खेल की अवधि लगभग 23 राउंड (67 चालें)। अंतिम गणना में, सबसे अधिक प्रभाव (इन्फ्लुएंस) वाला खिलाड़ी जीतता है, *ज़रूरी नहीं कि वह जो पहले बोर्ड के चारों ओर घूमता है*। सुरक्षा के लिए अधिकतम राउंड 30 पर ही सीमित है (यह कभी भी "मानक" स्थिति में सक्रिय नहीं होता)। एक नियतात्मक mulberry32 रैंडम नंबर जनरेटर (RNG), स्क्रिप्टेड AI विरोधी (खजाना/वित्त, व्यापारी/बुनियादी ढांचा, निर्माता/उद्योग), हैश अखंडता के साथ सहेजें/लोड करें, रीप्ले स्क्रबर, डिजाइनर-नियंत्रित बैच सिमुलेशन टूल।
|
|
32
|
+
- **संतुलन आधार** — सर्किट मॉडल (v1.1.2 बीटा): खजाना 56%, व्यापारी 19%, निर्माता 25% (मानक × 100)। तीनों प्रोफाइल महत्वपूर्ण रूप से जीत सकते हैं; लंबे खेलों में निर्माता का प्रभाव बढ़ता है क्योंकि औद्योगिक सेटों को विकसित होने का समय मिलता है; मार्गों का प्रभुत्व कम होने के कारण व्यापारी का हिस्सा घटता है, क्योंकि लंबे समय तक उन्नयन पर नकदी खर्च होती है। v0.18 की अंतर्निहित यांत्रिकी (क्रेडिट संकट, नकदी IP स्कोरिंग, औद्योगिक चार्टर, सेट पूर्णता बोनस) को v0.3 → v0.10 → v0.18 डिज़ाइन चक्र से बिल्कुल समान रखा गया है, जो 1,000 से अधिक नियतात्मक सिमुलेशन खेलों द्वारा संचालित है।
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
@@ -127,11 +127,12 @@ npx @mcptoolshop/sovereign --help # All flags
|
|
|
127
127
|
|
|
128
128
|
## ज्ञात सीमाएं
|
|
129
129
|
|
|
130
|
-
- **v1.1.
|
|
131
|
-
- **AI प्रोफाइल अभी तक
|
|
132
|
-
-
|
|
133
|
-
-
|
|
134
|
-
-
|
|
130
|
+
- **v1.1.2 एक बीटा संस्करण है।** निदान से प्राप्त आंकड़े (100/100 गेम में सर्किट समाप्ति, औसत 23 राउंड, 56/19/25 का विजेता विभाजन) इंगित करते हैं। इसे अभी तक किसी नए मानव खिलाड़ी द्वारा शुरू से अंत तक नहीं खेला गया है। इसे तब तक "ऑप्ट-इन" के रूप में मानें जब तक कि आप स्वयं इसे नहीं खेल लेते।
|
|
131
|
+
- **AI प्रोफाइल अभी तक सर्किट के लिए प्रतिस्पर्धा नहीं करते हैं।** वे v0.18 के निर्णय कार्यों का उपयोग करते हैं—प्रभाव (इन्फ्लुएंस) जमा करने के लिए, सर्किट की दौड़ में भाग लेने के लिए नहीं। वास्तविक मानव खिलाड़ी समाप्ति शर्त को समझने के बाद बहुत अलग व्यवहार कर सकते हैं।
|
|
132
|
+
- **ट्रिगर ≠ विजेता।** वह खिलाड़ी जो चौथे सर्किट को पूरा करता है, केवल लगभग एक-तिहाई खेलों में प्रभाव (इन्फ्लुएंस) के आधार पर जीतता है। यह जानबूझकर किया गया है—अंतिम गणना बोर्ड के चारों ओर की गति के बजाय, आर्थिक गहराई को पुरस्कृत करती है। अंतिम गेम में, यह अंतर स्पष्ट किया गया है।
|
|
133
|
+
- **गणराज्य के अंतिम चरण लंबा है और इसमें कोई अधिनियम (ऐक्ट्स) नहीं है।** अधिनियम अभी भी राउंड 1-7 में सक्रिय होते हैं। औसत खेल लगभग 23 राउंड का होता है, जिससे गणराज्य के अंतिम चरण में लगभग 16 राउंड बिना किसी नए राजनीतिक झटके के होते हैं। यदि यह खाली लगता है, तो अगला सुधार अधिनियमों का पुनर्वितरण होगा, न कि अनिवार्य जीत प्रणाली पर वापस जाना।
|
|
134
|
+
- **खजाना/वित्त (ट्रेजरी/फाइनेंस) अभी भी जानबूझकर सबसे मजबूत है**, लक्षित सीमा के भीतर। यह ऐतिहासिक सिद्धांत से मेल खाता है: सार्वजनिक ऋण और संघीय वित्त, हैमिल्टन के लिए सबसे महत्वपूर्ण आर्थिक उपकरण थे।
|
|
135
|
+
- **विफलता की घटनाएं (डिफ़ॉल्ट/बगावत) ज्यादातर सजावटी हैं।** क्रेडिट संकट कभी-कभी सक्रिय होता है; डिफ़ॉल्ट और बगावत लगभग कभी नहीं होते। वृद्धि प्रणाली में अधिक समय है, लेकिन फिर भी यह शायद ही कभी शीर्ष स्तर तक पहुंचती है। भविष्य के संस्करणों में विफलता की स्थिति पर दबाव को फिर से देखा जा सकता है।
|
|
135
136
|
|
|
136
137
|
---
|
|
137
138
|
|
package/README.it.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
**Stato — v1.1.
|
|
22
|
+
**Stato — v1.1.2 (beta).** La versione v1.1.0 è stata ritirata lo stesso giorno in cui è stata rilasciata (2026-05-20). La versione v1.1.1 ha ricostruito la modalità digitale con correzioni per migliorare la giocabilità, un ritmo di 12 turni e una soglia di vittoria obbligatoria, ma risultava comunque troppo breve. La versione v1.1.2 sostituisce la condizione di fine basata sul numero di turni con una condizione di fine basata su un "circuito": il gioco termina quando un giocatore ha fatto percorrere alla sua fazione l'intero territorio della Repubblica per quattro volte. La durata media di una partita è di circa 23 turni / 67 mosse (1,9 volte la v1.1.1). Il giocatore che fa scattare la fine non vince automaticamente; vince chi ha la maggiore influenza al conteggio finale. La versione stampabile del gioco da tavolo rimane stabile alla versione v0.2. Consultare il file `CHANGELOG.md` per i dettagli completi delle modifiche e le avvertenze relative alla versione beta.
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
|
|
28
28
|
Sovereign è un **gioco da tavolo "Hamilton System" ispirato a Monopoly**, incentrato sulla nascita del credito pubblico statunitense, e include un **adattamento completo per giocatore singolo / digitale** che esegue le stesse regole localmente in un browser, contro due avversari simulati e deterministici.
|
|
29
29
|
|
|
30
|
-
- **Gioco da tavolo** — edizione stampabile
|
|
31
|
-
- **Modalità digitale** — singolo file HTML autonomo.
|
|
32
|
-
- **Bilanciamento di base** — modello
|
|
30
|
+
- **Gioco da tavolo** — edizione stampabile composta da 34 fogli. Tabellone con 40 caselle, 22 proprietà + 4 percorsi + 2 istituzioni, 8 sistemi di colori, 7 atti del Congresso in ordine storico fisso, 4 ruoli per giocatore, 3 tracciati condivisi (Credito Pubblico · Resistenza Pubblica · Capacità Industriale), 12+12 carte evento. Due percorsi economici validi oltre al Tesoro: Mercante e Produttore. Bilanciamento della versione v0.2, bloccato.
|
|
31
|
+
- **Modalità digitale** — singolo file HTML autonomo. Condizione di fine basata su circuito: il gioco termina quando un giocatore completa il suo quarto passaggio attraverso il Tesoro. La durata media di una partita è di circa 23 turni (67 mosse). Al conteggio finale, vince il giocatore con la maggiore influenza, *non necessariamente quello che ha percorso il tabellone per primo*. Il limite massimo di turni rimane fissato a 30 per sicurezza (non viene mai raggiunto nella modalità CANONICAL × 100). Generatore di numeri casuali deterministico mulberry32, avversari controllati dall'IA (Tesoro / Finanza, Mercante / Infrastrutture, Produttore / Industria), salvataggio / caricamento con verifica dell'integrità, strumento di simulazione batch per il designer.
|
|
32
|
+
- **Bilanciamento di base** — modello a circuito (v1.1.2 beta): Tesoro 56 % · Mercante 19 % · Produttore 25 % (CANONICAL × 100). Tutti e tre i profili hanno buone possibilità di vittoria; il Produttore aumenta di importanza nelle partite più lunghe, poiché i set industriali hanno il tempo di svilupparsi; la quota del Mercante diminuisce poiché i percorsi sono meno dominanti quando si spendono soldi per miglioramenti in un arco di tempo più lungo. Le meccaniche di base della versione v0.18 (Crisi del Credito, punteggio dei crediti, Carta Industriale, bonus per il completamento dei set) sono state preservate byte-per-byte dalla sequenza di sviluppo v0.3 → v0.10 → v0.18, basata su oltre 1000 simulazioni deterministiche.
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
@@ -127,11 +127,12 @@ Il quarto profilo concettuale (Opportunista / Cash) è stato posticipato. Il set
|
|
|
127
127
|
|
|
128
128
|
## Avvertenze note
|
|
129
129
|
|
|
130
|
-
- **La versione v1.1.
|
|
131
|
-
- **I profili dell'IA non competono ancora per
|
|
132
|
-
- **
|
|
130
|
+
- **La versione v1.1.2 è una beta.** I dati provengono da una simulazione batch eseguita all'interno del file HTML (100 / 100 partite terminano con il circuito, durata media di 23 turni, distribuzione dei vincitori 56 / 19 / 25). **Non** è stata testata completamente da un giocatore umano. Consideratela una versione "opt-in" fino a quando non l'avrete provata voi stessi.
|
|
131
|
+
- **I profili dell'IA non competono ancora per i circuiti.** Utilizzano le funzioni decisionali della versione v0.18, che mirano ad accumulare influenza piuttosto che a correre verso il quarto circuito. I giocatori umani reali potrebbero comportarsi in modo molto diverso una volta compresa la condizione di fine partita.
|
|
132
|
+
- **Attivare il circuito non significa vincere.** Il giocatore che completa il quarto circuito vince solo per influenza in circa un terzo dei casi. Questo è intenzionale: il conteggio finale premia la profondità economica, non la velocità nel percorrere il tabellone. La schermata finale chiarisce questa distinzione.
|
|
133
|
+
- **La parte finale della Repubblica è lunga e senza atti.** Gli atti continuano a essere attivati nei turni 1-7. La durata media di una partita è di circa 23 turni, lasciando circa 16 turni nella parte finale della Repubblica senza nuovi eventi politici. Se questo vi sembra vuoto durante il gioco, la prossima modifica sarà una redistribuzione degli atti, non un ritorno al sistema di obiettivi.
|
|
133
134
|
- **Il Tesoro / Finanza rimane intenzionalmente il più forte**, all'interno della fascia prevista. Questo riflette la tesi storica: il credito pubblico e la finanza federale erano i principali strumenti economici di Hamilton.
|
|
134
|
-
- **Gli eventi di fallimento (Default / Ribellione) rimangono principalmente decorativi.** La Crisi del Credito si verifica
|
|
135
|
+
- **Gli eventi di fallimento (Default / Ribellione) rimangono principalmente decorativi.** La Crisi del Credito si verifica occasionalmente; il Default e la Ribellione quasi mai. Il sistema di escalation ha più tempo per svilupparsi, ma raramente raggiunge i livelli più alti. Le versioni future potrebbero rivedere la pressione sugli stati di fallimento.
|
|
135
136
|
|
|
136
137
|
---
|
|
137
138
|
|
package/README.ja.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
**ステータス — v1.1.2 (ベータ版)。** v1.1.0は、リリースされた当日(2026年5月20日)に配布が中止されました。v1.1.1では、ゲームプレイの改善、12ラウンドのゲーム進行、勝利条件の変更が行われましたが、それでも短すぎると感じられました。v1.1.2では、ラウンド数の上限を設ける代わりに、**回路ベース**の終了条件に変更されました。ゲームは、あるプレイヤーが自勢力を共和国内を4回周回したときに終了します。平均ゲームラウンド数は約23ラウンド/67ターン(v1.1.1の約1.9倍)。ゲーム終了を引き起こしたプレイヤーが自動的に勝利するわけではなく、最終的な集計で最も高い影響力を持つプレイヤーが勝利します。印刷版のボードゲームは、v0.2で安定しています。詳細な変更点とベータ版に関する注意点は、`CHANGELOG.md`ファイルを参照してください。
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
|
|
28
28
|
Sovereignは、**アメリカの公的信用に関するハミルトン・システムを基にしたボードゲーム**であり、さらに、**完全なソロ/デジタル版**も付属しています。このデジタル版は、同じルールに基づいて、ブラウザ上で2つの決定的なAI対戦相手とローカルで動作します。
|
|
29
29
|
|
|
30
|
-
- **ボードゲーム** — 34
|
|
31
|
-
-
|
|
32
|
-
- **バランスの基準** —
|
|
30
|
+
- **ボードゲーム** — 印刷可能な34ページの版。40マス、22の物件、4つのルート、2つの機関、8つのカラーシステム、7つの議会法(歴史的な順序で固定)、4つのプレイヤー役割、3つの共通トラック(公的信用、公的抵抗、工業生産力)、12+12枚のイベントカード。財務省以外にも、商人道と製造業者道という2つの有効な経済的戦略が存在します。v0.2のバランス調整は完了しており、変更はありません。
|
|
31
|
+
- **デジタルモード** — 単一の自己完結型のHTMLファイル。回路ベースの終了条件:あるプレイヤーが財務省のオープンを4回完了したときにゲームが終了します。平均ゲームラウンド数は約23ラウンド(67ターン)。最終的な集計で、最も高い影響力を持つプレイヤーが勝利します。*必ずしも最初にボードを一周したプレイヤーが勝利するわけではありません*。安全のために、ラウンド数の上限は30のままです(通常のプレイではこの上限に達することはありません)。決定論的な mulberry32 ランダムナンバージェネレーター、スクリプトによるAI対戦相手(財務省/金融、商人/インフラ、製造業者/産業)、ハッシュ整合性によるセーブ/ロード機能、リプレイの削除機能、開発者限定のバッチシミュレーションツール。
|
|
32
|
+
- **バランスの基準** — 回路モデル(v1.1.2ベータ版):財務省 56%、商人 19%、製造業者 25%(標準値 × 100)。3つの戦略すべてが意味のある勝利を得られるように設計されています。製造業者は、ゲームが長くなるほど、工業セットが成熟するにつれて、その割合が上昇します。ルートが優位な場合、商人の割合は低下します。v0.18の基本的なメカニズム(信用危機、キャッシュIPスコアリング、工業特許、セット完了ボーナス)は、1,000以上の決定論的なシミュレーションゲームによって駆動されたv0.3 → v0.10 → v0.18のデザインアーキテクチャから、バイト単位で完全に引き継がれています。
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
@@ -127,11 +127,12 @@ Sovereignは、スタンドアロンで動作するブラウザベースのボ
|
|
|
127
127
|
|
|
128
128
|
## 既知の制限事項
|
|
129
129
|
|
|
130
|
-
- **v1.1.
|
|
131
|
-
- **AI
|
|
132
|
-
-
|
|
133
|
-
-
|
|
134
|
-
-
|
|
130
|
+
- **v1.1.2はベータ版です。** 診断テストの結果(HTML内蔵のバッチシミュレーション、100ゲーム中100ゲームで回路終了、平均23ラウンド、勝者構成:財務省 56%、商人 19%、製造業者 25%)。まだ、熟練したプレイヤーによる完全なプレイテストは行われていません。ご自身の責任で試していただくものとして、まずは実際にプレイしていただくことをお勧めします。
|
|
131
|
+
- **AIはまだ回路を巡回するための競争をしていません。** v0.18の意思決定関数を使用しており、影響力を獲得することに重点を置いています。実際のプレイヤーは、終了条件を理解すると、全く異なる行動をとる可能性があります。
|
|
132
|
+
- **終了条件を満たしても、必ずしも勝利するわけではありません。** 4回目の回路を完了したプレイヤーが勝利するのは、ゲームの約3分の1の場合のみです。これは意図的なものであり、最終的な集計では、ボードを速く一周するだけでなく、経済的な深さが評価されます。エンドゲームの説明では、この点が明確に示されています。
|
|
133
|
+
- **共和国内の後半部分は、新しい議会法がないため、長く感じられるかもしれません。** 議会法は、1〜7ラウンドで発動されます。平均的なプレイ時間は約23ラウンドで、共和国内の後半約16ラウンドは、新しい政治的な変化がありません。もし、この部分が単調に感じられる場合は、次回のアップデートで議会法の再配置を検討しますが、現在のシステムに戻すことはありません。
|
|
134
|
+
- **財務省/金融は、意図的に最も強力なものとして設計されています。** これは、目標範囲内に収まるように調整されています。これは、歴史的な背景に基づいています。公的信用と連邦金融は、ハミルトンの経済政策における主要な要素でした。
|
|
135
|
+
- **失敗イベント(デフォルト/反乱)は、主に装飾的なものです。** 信用危機は時々発生しますが、デフォルトと反乱はほとんど発生しません。エスカレーションシステムは、より多くの時間で影響を及ぼしますが、それでもほとんどの場合、上位の段階には到達しません。今後のバージョンでは、失敗状態の発生頻度について再検討する可能性があります。
|
|
135
136
|
|
|
136
137
|
---
|
|
137
138
|
|
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
> **Status — v1.1.
|
|
22
|
+
> **Status — v1.1.2 (beta).** v1.1.0 was withdrawn the same day it shipped (2026-05-20). v1.1.1 rebuilt the digital mode with playability fixes + 12-round pacing + a mandate victory threshold but still felt too short. v1.1.2 swaps the round-cap end condition for a **circuit-based** end condition: the game ends when one player has carried their faction around the Republic four times. Median game length ~23 rounds / 67 turns (1.9× v1.1.1). The player who triggers the end doesn't automatically win — the highest Influence at Final Accounting does. The printable board game remains stable at v0.2. See `CHANGELOG.md` for the full delta and beta caveats.
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
Sovereign is a **Hamilton-system Monopoly-grammar board game** about the founding of US public credit, plus a **solo / digital adaptation** that runs the same rules locally in a browser against two deterministic scripted opponents.
|
|
29
29
|
|
|
30
30
|
- **Board game** — printable 34-sheet edition. 40-space board, 22 properties + 4 routes + 2 institutions, 8 color systems, 7 Acts of Congress in fixed historical order, 4 player roles, 3 shared tracks (Public Credit · Public Resistance · Industrial Capacity), 12+12 event cards. Two viable economic paths beyond Treasury: Merchant and Manufacturer. v0.2 balance, frozen.
|
|
31
|
-
- **Digital mode** — single self-contained HTML file.
|
|
32
|
-
- **Balance baseline** —
|
|
31
|
+
- **Digital mode** — single self-contained HTML file. Circuit-based end condition: the game ends when one player completes their fourth crossing of Treasury Opens. Median game length ~23 rounds (67 turns). At Final Accounting the highest-Influence player wins, *not necessarily the one who got around the board first*. Hard cap stays at round 30 as safety (never fires in CANONICAL × 100). Deterministic mulberry32 RNG, scripted AI opponents (Treasury / Finance, Merchant / Infrastructure, Manufacturer / Industry), save / load with hash integrity, replay scrubber, designer-gated batch simulation tool.
|
|
32
|
+
- **Balance baseline** — circuit model (v1.1.2 beta): Treasury 56 % · Merchant 19 % · Manufacturer 25 % (CANONICAL × 100). All three profiles win meaningfully; Manufacturer rises in longer games as industrial sets have time to mature; Merchant share drops as routes are less dominant when cash gets spent on upgrades over a longer arc. The underlying v0.18 mechanics (Credit Crisis, cash IP scoring, Industrial Charter, set completion bonuses) are preserved byte-identical from the v0.3 → v0.10 → v0.18 design arc driven by 1,000+ deterministic simulation games.
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
@@ -101,7 +101,7 @@ See [`SECURITY.md`](./SECURITY.md) for vulnerability reporting and the full secu
|
|
|
101
101
|
|
|
102
102
|
## Features
|
|
103
103
|
|
|
104
|
-
- **Solo
|
|
104
|
+
- **Solo circuit-victory game** vs. two scripted opponents (Treasury / Finance and Merchant / Infrastructure by default; Manufacturer / Industry available for batch play). The game ends when one player completes their fourth crossing of Treasury Opens. Median ~23 rounds / 67 turns. Highest Influence at Final Accounting wins.
|
|
105
105
|
- **Deterministic AI** — every opponent decision is a pure function of visible state with a ledgered reason. No LLM, no opaque magic.
|
|
106
106
|
- **8 game surfaces** — Board, Treasury Panel, Asset Inspector, Event Drawer, Acts of Congress, Shared Tracks, Turn Log / Ledger, Endgame Report.
|
|
107
107
|
- **Auctions** — declined assets go to multi-player auction with profile-driven scripted bidding.
|
|
@@ -127,11 +127,12 @@ The fourth concept-doc profile (Opportunist / Cash) is deferred. The locked v0.1
|
|
|
127
127
|
|
|
128
128
|
## Known caveats
|
|
129
129
|
|
|
130
|
-
- **v1.1.
|
|
131
|
-
- **AI profiles do not yet race for
|
|
132
|
-
- **
|
|
133
|
-
- **
|
|
134
|
-
- **
|
|
130
|
+
- **v1.1.2 is a beta.** Numbers from the diagnostic held on the in-HTML batch sim (100 / 100 games trigger circuit-end, median 23 rounds, 56 / 19 / 25 winner split). It has **not** been cold-walked end-to-end by a fresh human player. Treat it as opt-in until you've walked it yourself.
|
|
131
|
+
- **AI profiles do not yet race for circuits.** They run v0.18 decision functions — playing to accumulate Influence rather than racing to the fourth circuit. Real human players may behave very differently once they understand the end condition.
|
|
132
|
+
- **Trigger ≠ winner.** The player who completes the fourth circuit only wins by Influence in about a third of games. This is intentional — Final Accounting rewards economic depth, not speed around the board. Endgame copy makes the distinction explicit.
|
|
133
|
+
- **Late Republic stretch is long with no Acts.** Acts still fire in rounds 1-7. Median play is ~23 rounds, leaving ~16 rounds of Late Republic with no new political shocks. If this feels empty in cold play, the next fix is an Acts redistribution pass, not a return to mandate.
|
|
134
|
+
- **Treasury / Finance remains intentionally strongest**, within the target band. Matches the historical thesis: public credit + federal finance were Hamilton's dominant economic lever.
|
|
135
|
+
- **Failure events (Default / Rebellion) remain mostly decorative.** Credit Crisis fires occasionally; Default and Rebellion almost never. The escalation system has more time to compound but still rarely reaches the top tiers. Future versions may revisit fail-state pressure.
|
|
135
136
|
|
|
136
137
|
---
|
|
137
138
|
|
package/README.pt-BR.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
**Status — v1.1.
|
|
22
|
+
**Status — v1.1.2 (beta).** A versão v1.1.0 foi descontinuada no mesmo dia do lançamento (20 de maio de 2026). A v1.1.1 reformulou o modo digital com correções de jogabilidade + ritmo de 12 rodadas + um limite de vitória por mandato, mas ainda parecia muito curto. A v1.1.2 substitui a condição de término por limite de rodadas por uma condição de término baseada em "circuitos": o jogo termina quando um jogador faz com que sua facção complete quatro voltas pela República. A duração média do jogo é de ~23 rodadas / 67 turnos (1,9 vezes a v1.1.1). O jogador que dispara o fim não vence automaticamente — vence quem tiver a maior influência no balanço final. A versão física do jogo permanece estável na versão v0.2. Consulte o arquivo `CHANGELOG.md` para obter todos os detalhes das alterações e as ressalvas da versão beta.
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
|
|
28
28
|
Sovereign é um **jogo de tabuleiro do tipo Monopoly, inspirado no sistema Hamilton**, sobre a fundação do crédito público dos EUA, além de uma **adaptação completa para jogar sozinho / digitalmente** que executa as mesmas regras localmente em um navegador contra dois oponentes programados e determinísticos.
|
|
29
29
|
|
|
30
|
-
- **Jogo de tabuleiro** — edição impressa
|
|
31
|
-
- **Modo digital** — um único arquivo HTML autônomo.
|
|
32
|
-
- **
|
|
30
|
+
- **Jogo de tabuleiro** — edição impressa de 34 páginas. Tabuleiro com 40 espaços, 22 propriedades + 4 rotas + 2 instituições, 8 sistemas de cores, 7 Atos do Congresso em ordem histórica fixa, 4 papéis de jogador, 3 trilhas compartilhadas (Crédito Público · Resistência Pública · Capacidade Industrial), 12+12 cartas de evento. Dois caminhos econômicos viáveis além do Tesouro: Comerciante e Fabricante. Equilíbrio da versão v0.2, congelado.
|
|
31
|
+
- **Modo digital** — um único arquivo HTML autônomo. Condição de término baseada em "circuitos": o jogo termina quando um jogador completa sua quarta passagem pelo Tesouro. A duração média do jogo é de ~23 rodadas (67 turnos). No balanço final, o jogador com a maior influência vence, *não necessariamente aquele que completou o tabuleiro primeiro*. O limite máximo permanece em 30 rodadas como medida de segurança (nunca é atingido no modo CANONICAL × 100). Gerador de números aleatórios mulberry32 determinístico, oponentes de IA programados (Tesouro / Finanças, Comerciante / Infraestrutura, Fabricante / Indústria), salvar / carregar com integridade de hash, ferramenta de simulação em lote para o designer.
|
|
32
|
+
- **Ponto de referência de equilíbrio** — modelo de "circuitos" (versão beta v1.1.2): Tesouro 56% · Comerciante 19% · Fabricante 25% (CANONICAL × 100). Todos os três perfis têm chances significativas de vitória; o Fabricante se torna mais relevante em jogos mais longos, pois os conjuntos industriais têm tempo para se desenvolver; a participação do Comerciante diminui à medida que as rotas se tornam menos dominantes quando o dinheiro é gasto em melhorias ao longo de um período mais longo. As mecânicas subjacentes da versão v0.18 (Crise de Crédito, pontuação de propriedade de dinheiro, Carta Industrial, bônus de conclusão de conjuntos) são preservadas de forma idêntica em bytes, desde o ciclo de design v0.3 → v0.10 → v0.18, baseado em mais de 1.000 simulações determinísticas.
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
@@ -127,11 +127,12 @@ O quarto perfil conceitual (Oportunista / Caixa) está adiado. O conjunto compet
|
|
|
127
127
|
|
|
128
128
|
## Observações
|
|
129
129
|
|
|
130
|
-
- **A
|
|
131
|
-
- **Os perfis de IA ainda não competem
|
|
132
|
-
- **
|
|
133
|
-
- **
|
|
134
|
-
- **
|
|
130
|
+
- **A v1.1.2 é uma versão beta.** Os números vêm da simulação em lote dentro do HTML (100 / 100 jogos terminam pelo "circuito", duração média de 23 rodadas, divisão de vencedores 56 / 19 / 25). Ela **não** foi testada completamente por um jogador humano. Considere-a como uma versão opcional até que você a experimente você mesmo.
|
|
131
|
+
- **Os perfis de IA ainda não competem pelos "circuitos".** Eles usam as funções de decisão da versão v0.18 — jogando para acumular influência, em vez de competir para completar o quarto "circuito". Jogadores humanos reais podem se comportar de maneira muito diferente assim que entenderem a condição de término.
|
|
132
|
+
- **Acionar ≠ vencer.** O jogador que completa o quarto "circuito" só vence por influência em cerca de um terço dos jogos. Isso é intencional — o balanço final recompensa a profundidade econômica, não a velocidade ao redor do tabuleiro. A cópia do final do jogo torna essa distinção explícita.
|
|
133
|
+
- **A parte final da República é longa e não tem Atos.** Os Atos ainda são ativados nas rodadas de 1 a 7. A duração média do jogo é de ~23 rodadas, deixando ~16 rodadas da parte final da República sem novos eventos políticos. Se isso parecer vazio em um jogo "frio", a próxima correção será uma redistribuição dos Atos, e não um retorno ao sistema de mandatos.
|
|
134
|
+
- **O Tesouro / Finanças permanece intencionalmente o mais forte**, dentro da faixa alvo. Isso corresponde à tese histórica: o crédito público + as finanças federais eram o principal instrumento econômico de Hamilton.
|
|
135
|
+
- **Os eventos de falha (Inadimplência / Rebelião) permanecem principalmente decorativos.** A Crise de Crédito ocorre ocasionalmente; a Inadimplência e a Rebelião quase nunca ocorrem. O sistema de escalada tem mais tempo para se desenvolver, mas ainda raramente atinge os níveis mais altos. Versões futuras podem reavaliar a pressão dos estados de falha.
|
|
135
136
|
|
|
136
137
|
---
|
|
137
138
|
|
package/README.zh.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
**状态 — v1.1.
|
|
22
|
+
**状态 — v1.1.2 (beta)。** v1.1.0 版本在发布当天就被撤回(2026年5月20日)。v1.1.1 版本对数字模式进行了改进,修复了游戏体验问题,增加了12轮的游戏流程,并设置了强制胜利的条件,但仍然感觉太短。v1.1.2 版本将回合限制的结束条件替换为基于“电路”的结束条件:当一名玩家使自己的派系在共和国境内完成了四次循环时,游戏结束。平均游戏时长约为23轮/67回合(比 v1.1.1 版本长 1.9 倍)。触发游戏结束的玩家不一定获胜,最终根据“最终结算”时的影响力值来决定胜负。可打印的桌面游戏版本仍然稳定在 v0.2 版本。请参阅 `CHANGELOG.md` 文件以获取完整的变更记录和 beta 版本的注意事项。
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
|
|
28
28
|
Sovereign是一款**基于“汉密尔顿系统”的“大富翁”风格棋盘游戏**,讲述的是美国公共信贷的建立,同时还提供一个**完整的单人/数字版本**,它可以在浏览器中本地运行,与两个具有固定行为的AI对手对战。
|
|
29
29
|
|
|
30
|
-
-
|
|
31
|
-
- **数字模式** — 单个独立的 HTML
|
|
32
|
-
- **平衡性基准** —
|
|
30
|
+
- **桌面游戏** — 可打印的 34 页版本。游戏棋盘包含 40 个格子,22 处地产 + 4 条路线 + 2 个机构,8 个颜色系统,7 项国会法案按照固定的历史顺序排列,4 个玩家角色,3 条共享进度条(公共信用、公共抵抗、工业能力),12+12 张事件卡。除了财政部之外,还有两种可行的经济发展路径:商人路径和制造商路径。v0.2 版本的平衡性已确定,不再进行调整。
|
|
31
|
+
- **数字模式** — 单个独立的 HTML 文件。基于“电路”的结束条件:当一名玩家完成第四次“财政部开放”时,游戏结束。平均游戏时长约为 23 轮(67 回合)。在“最终结算”时,拥有最高影响力的玩家获胜,*不一定是最先绕完棋盘的玩家*。为了安全起见,回合上限仍然设置为 30 回合(在标准模式下几乎不会达到)。使用确定性的 mulberry32 随机数生成器,包含脚本化的 AI 对手(财政部/金融、商人/基础设施、制造商/工业),支持保存/加载功能,并具有哈希完整性校验、回放清除功能以及设计师提供的批量模拟工具。
|
|
32
|
+
- **平衡性基准** — 基于“电路”模型的 v1.1.2 beta 版本:财政部 56%,商人 19%,制造商 25%(标准模式下)。这三种发展模式都有可能获胜;在较长的游戏中,制造商的发展会更加突出,因为工业组合有时间成熟;随着路线的重要性下降,以及玩家将资金用于升级,商人的份额可能会下降。底层 v0.18 的机制(信用危机、现金 IP 得分、工业特许、完成组合的奖励)与 v0.3 → v0.10 → v0.18 版本设计保持完全一致,并通过 1000 多场确定性模拟游戏进行验证。
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
@@ -127,11 +127,12 @@ Sovereign 是一款独立的、基于浏览器的棋盘游戏。命令行界面
|
|
|
127
127
|
|
|
128
128
|
## 已知问题
|
|
129
129
|
|
|
130
|
-
- **v1.1.
|
|
131
|
-
- **AI
|
|
132
|
-
-
|
|
133
|
-
-
|
|
134
|
-
-
|
|
130
|
+
- **v1.1.2 是一个 beta 版本。** 诊断数据来自 HTML 批量模拟(100/100 场游戏触发“电路”结束,平均 23 轮,获胜者比例为 56%/19%/25%)。它**尚未**由全新的人类玩家进行完整的体验测试。请将其视为可选版本,直到您亲自体验过它为止。
|
|
131
|
+
- **AI 角色目前尚未争夺“电路”。** 它们运行的是 v0.18 的决策函数,目标是积累影响力,而不是争夺第四个“电路”。真正的玩家在理解结束条件后,可能会表现出不同的行为。
|
|
132
|
+
- **触发 ≠ 获胜。** 只有大约三分之一的游戏中,完成第四个“电路”的玩家会获胜。这是有意为之——“最终结算”奖励的是经济深度,而不是在棋盘上的速度。游戏结束时的提示会明确这一点。
|
|
133
|
+
- **共和国晚期阶段的棋盘很长,没有新的法案。** 法案仍然在 1-7 回合生效。平均游戏时长约为 23 轮,这意味着在共和国晚期阶段,有大约 16 轮没有新的政治事件发生。如果这部分内容在体验中感觉空洞,下一个改进方向是重新分配法案,而不是恢复强制胜利的条件。
|
|
134
|
+
- **财政部/金融仍然是最强大的,** 并且在目标范围内。这符合历史背景:公共信用和联邦金融是汉密尔顿的主要经济杠杆。
|
|
135
|
+
- **失败事件(违约/叛乱)仍然主要起到装饰作用。** 信用危机偶尔会触发;违约和叛乱几乎从不发生。升级系统有更多时间来累积,但仍然很少达到最高等级。未来的版本可能会重新考虑失败状态的压力。
|
|
135
136
|
|
|
136
137
|
---
|
|
137
138
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcptoolshop/sovereign",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "Sovereign — a Hamilton-system economic board game and its solo / digital adaptation. Browser-based, deterministic, self-contained.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "bin/sovereign.js",
|
package/release/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,66 @@
|
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
+
## v1.1.2 — Circuit victory + human voice — 2026-05-20
|
|
9
|
+
|
|
10
|
+
**Beta.** Same day as v1.1.1, but a meaningfully different shape. After the v1.1.1 cold playthrough the game still felt too short and the ending too arbitrary — it ended because the clock ran out, not because someone won the Republic. v1.1.2 replaces the round-cap-with-mandate end condition with a **circuit-based** end condition tied to physical movement around the board.
|
|
11
|
+
|
|
12
|
+
**The new end condition:**
|
|
13
|
+
|
|
14
|
+
The game ends when one player has carried their faction around the Republic four times — i.e., completed their fourth crossing of Treasury Opens. At that moment, Final Accounting fires and the highest-Influence player wins, *not necessarily the player who got around first*. Hard cap stays at round 30 (a safety; essentially never fires — diagnostic showed 100 / 100 CANONICAL × 100 games complete by round 28).
|
|
15
|
+
|
|
16
|
+
**Why this is structurally different from v1.1.1:**
|
|
17
|
+
|
|
18
|
+
- v1.1.1: 12-round cap with mandate (15 IP + 5 lead) as early-trigger. Median 9 rounds, 36 turns. Ended by clock.
|
|
19
|
+
- v1.1.2: no round cap that anyone hits in practice. Median **23 rounds / 67 turns** — about 1.9× the previous game length. Ends when somebody physically rounds the board for the fourth time.
|
|
20
|
+
|
|
21
|
+
**CANONICAL × 100 (in-HTML batch sim):**
|
|
22
|
+
|
|
23
|
+
| Metric | v1.1.1 (mandate) | v1.1.2 (circuit) |
|
|
24
|
+
|---|---:|---:|
|
|
25
|
+
| Triggered | 62 / 100 | 100 / 100 |
|
|
26
|
+
| Median rounds | 9 | 23 |
|
|
27
|
+
| Median turns | ~27 | 67 |
|
|
28
|
+
| Treasury wins | 52 % | 56 % |
|
|
29
|
+
| Merchant wins | 32 % | 19 % |
|
|
30
|
+
| Manufacturer wins | 16 % | 25 % |
|
|
31
|
+
| Avg winning IP | ~16 | 28.7 |
|
|
32
|
+
| Avg lead margin | 5 | 7.9 |
|
|
33
|
+
| Bankruptcy events | 7 | observed |
|
|
34
|
+
| Safety-cap fires | n/a | 0 / 100 |
|
|
35
|
+
|
|
36
|
+
Trade-off worth naming: Merchant share drops (32 → 19) while Manufacturer rises (16 → 25). Longer games give Treasury and Manufacturer time to compound industrial / financial scoring, where Merchant's route-rent advantage matures faster in shorter games. Treasury still doesn't run away — share stays in the band.
|
|
37
|
+
|
|
38
|
+
**Trigger ≠ winner.** The player who completes the fourth circuit wins by Influence only 33 / 100 games. The other 67, somebody else holds the heavier ledger at termination. This is intentional — it preserves the "carry it across the line" feel while still rewarding economic depth. Endgame copy makes this explicit in both branches.
|
|
39
|
+
|
|
40
|
+
**Human voice copy pass.** All circuit / endgame narration rewritten away from gameplay-jargon ("Circuit Victory", "trigger player", "claimed the Republic") toward narrative-voice ("Hamilton has been around four times. The books close.", "Hamilton rounded the Republic four times — but the heaviest ledger belonged to Morris."). Per-circuit ledger entries vary by circuit number — first lap, two circuits in, three deep, books close.
|
|
41
|
+
|
|
42
|
+
**What's preserved from v1.1.1:**
|
|
43
|
+
|
|
44
|
+
- All Pass 1 / Pass 2 chrome (action rail above board, positions strip, portfolio strip, collapsed sidebar, 26 px tokens, designer gate, dice overlay)
|
|
45
|
+
- Pass 3 rent surfacing band
|
|
46
|
+
- All v0.18 mechanics: card effects, Acts (still firing rounds 1-7), scoring math, rent math, profile decision functions, RNG, deck order, Credit Crisis / Default / Rebellion triggers
|
|
47
|
+
- Designer URL flag: `?designer=1&circuit_target=N` for tuning the circuit threshold
|
|
48
|
+
|
|
49
|
+
**What changed:**
|
|
50
|
+
|
|
51
|
+
- `SAVE_VERSION = 'v0.21-circuit-candidate'`. v0.20 (v1.1.1) saves refuse to load with a friendly non-crash message.
|
|
52
|
+
- Mandate threshold removed. No more 15-IP + 5-lead trigger; the game ends on the fourth circuit only.
|
|
53
|
+
- Round counter on the chrome no longer reads "Round N of 12" — just "Round N" (and "· Late Republic" after round 7).
|
|
54
|
+
- Acts still fire in rounds 1-7; rounds 8-onward are Late Republic with no new political shocks. **Open risk**: median play has ~16 rounds of Late Republic with no Acts firing. If cold play finds this stretch feels empty, the v1.1.3 fix is an Acts redistribution pass, not a return to mandate.
|
|
55
|
+
|
|
56
|
+
**Beta caveats:**
|
|
57
|
+
|
|
58
|
+
- Not yet cold-walked end-to-end by a fresh human player. Beta tag is the safety net.
|
|
59
|
+
- Behavioral adaptation unmeasured: AI profiles still play current decision functions, not circuit-aware ones (e.g., Treasury doesn't yet race to hit the fourth circuit).
|
|
60
|
+
- The Late Republic stretch (~16 rounds in median play with no Acts firing) is a known open risk. Worth flagging in any playtest notes.
|
|
61
|
+
|
|
62
|
+
**npm history note:**
|
|
63
|
+
|
|
64
|
+
v1.1.0 remains on npm as the historical withdrawn version. v1.1.1 (mandate beta) and v1.1.2 (circuit beta) are both published. `npm install @mcptoolshop/sovereign` resolves to v1.1.2 (`latest`).
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
8
68
|
## v1.1.1 — Digital mode beta: human playability rebuild + 12-round pacing + mandate victory — 2026-05-20
|
|
9
69
|
|
|
10
70
|
**Beta release.** Second attempt at the digital mode after v1.1.0 was withdrawn the same day it shipped (2026-05-20). v1.1.0 simulation-verified but failed first cold human play; v1.1.1 fixes the structural human-playability gaps that audit could not catch. Not fully cold-validated end-to-end; shipping as beta so anyone who wants the digital mode can opt in while the player experience continues to settle.
|
|
@@ -1187,15 +1187,32 @@ html, body { font-size:15px; }
|
|
|
1187
1187
|
font-family:var(--ui); font-size:10.5px; letter-spacing:.06em;
|
|
1188
1188
|
font-weight:800; color:var(--foil); margin-left:4px;
|
|
1189
1189
|
}
|
|
1190
|
-
.positions-strip .pos-
|
|
1190
|
+
.positions-strip .pos-circuits {
|
|
1191
1191
|
font-family:var(--ui); font-size:9.5px; letter-spacing:.12em;
|
|
1192
1192
|
text-transform:uppercase; font-weight:800;
|
|
1193
|
+
color:var(--neutral);
|
|
1193
1194
|
margin-top:3px;
|
|
1194
|
-
|
|
1195
|
+
display:inline-flex; align-items:center; gap:5px;
|
|
1196
|
+
}
|
|
1197
|
+
.positions-strip .pos-circuits .v {
|
|
1198
|
+
font-family:var(--mono); font-weight:700; font-size:10.5px; letter-spacing:.04em;
|
|
1199
|
+
color:var(--ink);
|
|
1200
|
+
padding:1px 5px 1px;
|
|
1201
|
+
background:var(--parchment-2);
|
|
1202
|
+
box-shadow:inset 0 0 0 1px var(--rule-soft);
|
|
1203
|
+
border-radius:2px;
|
|
1204
|
+
}
|
|
1205
|
+
.positions-strip .pos-row.is-active .pos-circuits .v {
|
|
1206
|
+
background:var(--ink); color:var(--parchment);
|
|
1207
|
+
box-shadow:inset 0 0 0 1px var(--ink);
|
|
1208
|
+
}
|
|
1209
|
+
.positions-strip .pos-row.circuit-warning .pos-circuits {
|
|
1210
|
+
color:var(--foil);
|
|
1211
|
+
}
|
|
1212
|
+
.positions-strip .pos-row.circuit-warning .pos-circuits .v {
|
|
1195
1213
|
background:var(--foil); color:var(--ink);
|
|
1196
|
-
|
|
1214
|
+
box-shadow:inset 0 0 0 1px var(--foil);
|
|
1197
1215
|
}
|
|
1198
|
-
|
|
1199
1216
|
/* =====================================================================
|
|
1200
1217
|
PORTFOLIO STRIP — compact "your holdings" near the action rail
|
|
1201
1218
|
===================================================================== */
|
|
@@ -1821,7 +1838,7 @@ body.sidebar-collapsed .sidebar-toggle:hover { animation:none; }
|
|
|
1821
1838
|
<header class="topbar">
|
|
1822
1839
|
<div class="brand">
|
|
1823
1840
|
<div class="eyebrow">Solo / Digital Mode · The Hamilton System</div>
|
|
1824
|
-
<div class="title">Sovereign<span class="title-mode">Federal economy
|
|
1841
|
+
<div class="title">Sovereign<span class="title-mode">Federal economy · first to four circuits</span></div>
|
|
1825
1842
|
<div class="sub">Steer the early American republic through debt, credit, public resistance, and industrial capacity. The ledger on the right records every payment, vote, track shift, and event.</div>
|
|
1826
1843
|
</div>
|
|
1827
1844
|
<div class="controls">
|
|
@@ -1835,7 +1852,7 @@ body.sidebar-collapsed .sidebar-toggle:hover { animation:none; }
|
|
|
1835
1852
|
<button id="btnBatch" title="Run a scripted batch of 10 / 50 / 100 games">Balance Sweep</button>
|
|
1836
1853
|
<button id="btnNewSeed">New game</button>
|
|
1837
1854
|
<button id="btnReset">Restart this game</button>
|
|
1838
|
-
<span class="version-pill" title="Build provenance ·
|
|
1855
|
+
<span class="version-pill" title="Build provenance · circuit-victory candidate · v0.21">v0.21 · circuit-victory · target <span id="circuitTargetPill">4</span></span>
|
|
1839
1856
|
</div>
|
|
1840
1857
|
</header>
|
|
1841
1858
|
|
|
@@ -1915,7 +1932,7 @@ body.sidebar-collapsed .sidebar-toggle:hover { animation:none; }
|
|
|
1915
1932
|
<div class="lap-recap-overlay hidden" id="lapRecapOverlay" role="dialog" aria-modal="true">
|
|
1916
1933
|
<div class="lap-recap">
|
|
1917
1934
|
<div class="eyebrow">§ Round closes</div>
|
|
1918
|
-
<h2 id="lapRecapTitle">Round 1
|
|
1935
|
+
<h2 id="lapRecapTitle">Round 1</h2>
|
|
1919
1936
|
<div class="lap-sub" id="lapRecapSub">After round 1</div>
|
|
1920
1937
|
<div class="recap-body" id="lapRecapBody"></div>
|
|
1921
1938
|
<div class="recap-meta" id="lapRecapMeta"></div>
|
|
@@ -2006,7 +2023,7 @@ body.sidebar-collapsed .sidebar-toggle:hover { animation:none; }
|
|
|
2006
2023
|
</div>
|
|
2007
2024
|
<div class="tour-row">
|
|
2008
2025
|
<div class="tour-num">2</div>
|
|
2009
|
-
<div><strong>Each round, every player takes one turn
|
|
2026
|
+
<div><strong>Each round, every player takes one turn.</strong> The game does not end by a turn-counter — it ends by state. Pass Treasury Opens to complete a board circuit; build income and influence between crossings.</div>
|
|
2010
2027
|
</div>
|
|
2011
2028
|
<div class="tour-row">
|
|
2012
2029
|
<div class="tour-num">3</div>
|
|
@@ -2018,7 +2035,7 @@ body.sidebar-collapsed .sidebar-toggle:hover { animation:none; }
|
|
|
2018
2035
|
</div>
|
|
2019
2036
|
<div class="tour-row">
|
|
2020
2037
|
<div class="tour-num">5</div>
|
|
2021
|
-
<div><strong>
|
|
2038
|
+
<div><strong>Four times around ends it.</strong> The game ends when one of you has carried your faction around the Republic four times. Whoever holds the strongest ledger at that moment wins — not necessarily the one who got there first.</div>
|
|
2022
2039
|
</div>
|
|
2023
2040
|
</div>
|
|
2024
2041
|
|
|
@@ -2457,7 +2474,7 @@ const NARRATION = {
|
|
|
2457
2474
|
x: '',
|
|
2458
2475
|
},
|
|
2459
2476
|
'endgame · republic-summary': {
|
|
2460
|
-
h: 'Your Republic,
|
|
2477
|
+
h: 'Your Republic, at Final Accounting',
|
|
2461
2478
|
d: '',
|
|
2462
2479
|
x: '',
|
|
2463
2480
|
},
|
|
@@ -2811,11 +2828,11 @@ function initialState(seed) {
|
|
|
2811
2828
|
const rng = makeRng(seed);
|
|
2812
2829
|
const players = [
|
|
2813
2830
|
{ idx:0, name:'You', profile:'human', role:'Treasury Architect',
|
|
2814
|
-
cash:1500, position:0, ownedAssets:[], influencePoints:0, bankruptLaps:0, bankruptThisLap:false, keptHamilton:false, inCrisis:false },
|
|
2831
|
+
cash:1500, position:0, ownedAssets:[], influencePoints:0, bankruptLaps:0, bankruptThisLap:false, keptHamilton:false, inCrisis:false, circuitsCompleted:0 },
|
|
2815
2832
|
{ idx:1, name:'Hamilton', profile:'treasury-finance', role:'Treasury / Finance',
|
|
2816
|
-
cash:1500, position:0, ownedAssets:[], influencePoints:0, bankruptLaps:0, bankruptThisLap:false, keptHamilton:false, inCrisis:false },
|
|
2833
|
+
cash:1500, position:0, ownedAssets:[], influencePoints:0, bankruptLaps:0, bankruptThisLap:false, keptHamilton:false, inCrisis:false, circuitsCompleted:0 },
|
|
2817
2834
|
{ idx:2, name:'Morris', profile:'merchant-infrastructure', role:'Merchant / Infrastructure',
|
|
2818
|
-
cash:1500, position:0, ownedAssets:[], influencePoints:0, bankruptLaps:0, bankruptThisLap:false, keptHamilton:false, inCrisis:false },
|
|
2835
|
+
cash:1500, position:0, ownedAssets:[], influencePoints:0, bankruptLaps:0, bankruptThisLap:false, keptHamilton:false, inCrisis:false, circuitsCompleted:0 },
|
|
2819
2836
|
];
|
|
2820
2837
|
return {
|
|
2821
2838
|
rngSeed: seed, rng, lap: 1, turnIndex: 0, activePlayerIndex: 0,
|
|
@@ -2878,24 +2895,26 @@ let TURN_SNAPSHOTS = [];
|
|
|
2878
2895
|
let NARRATION_LOG = [];
|
|
2879
2896
|
let NARRATION_ENABLED = true;
|
|
2880
2897
|
const AUTOSAVE_KEY = 'sovereign.autosave';
|
|
2881
|
-
const SAVE_VERSION = 'v0.
|
|
2882
|
-
|
|
2898
|
+
const SAVE_VERSION = 'v0.21-circuit-candidate';
|
|
2899
|
+
/* HARD_CAP_ROUNDS is a safety net for pathological games; the diagnostic
|
|
2900
|
+
showed 100 % of CANONICAL games complete Race N=4 by round 28. The game
|
|
2901
|
+
ends by state (first to N circuits), not by clock. */
|
|
2902
|
+
const HARD_CAP_ROUNDS = 30;
|
|
2883
2903
|
const LATE_REPUBLIC_START = 8;
|
|
2884
2904
|
|
|
2885
|
-
/*
|
|
2886
|
-
|
|
2887
|
-
|
|
2905
|
+
/* Circuit victory model — designer-overridable via URL in ?designer=1 mode.
|
|
2906
|
+
target = number of board circuits required to trigger Final Accounting.
|
|
2907
|
+
A circuit is one PASS_TREASURY_OPENS event (landed or passed).
|
|
2908
|
+
Default 4 — chosen because (a) 100 % of CANONICAL games complete by
|
|
2909
|
+
round 28, (b) median ~23 rounds / ~67 turns feels right, (c) N=5 has
|
|
2910
|
+
~22 % hard-cap fallback, (d) N=6 almost never triggers. */
|
|
2911
|
+
const CIRCUIT_VICTORY = (function() {
|
|
2912
|
+
const def = { target: 4, hardCap: HARD_CAP_ROUNDS };
|
|
2888
2913
|
try {
|
|
2889
2914
|
const params = new URLSearchParams(window.location.search);
|
|
2890
2915
|
if (params.get('designer') === '1') {
|
|
2891
|
-
const
|
|
2892
|
-
|
|
2893
|
-
const m = parseInt(params.get('mandate_min_round'), 10);
|
|
2894
|
-
const c = parseInt(params.get('mandate_hard_cap'), 10);
|
|
2895
|
-
if (Number.isFinite(t)) def.threshold = t;
|
|
2896
|
-
if (Number.isFinite(l)) def.lead = l;
|
|
2897
|
-
if (Number.isFinite(m)) def.minRound = m;
|
|
2898
|
-
if (Number.isFinite(c)) def.hardCap = c;
|
|
2916
|
+
const n = parseInt(params.get('circuit_target'), 10);
|
|
2917
|
+
if (Number.isFinite(n) && n >= 1 && n <= 10) def.target = n;
|
|
2899
2918
|
}
|
|
2900
2919
|
} catch (e) {}
|
|
2901
2920
|
return def;
|
|
@@ -3093,6 +3112,35 @@ function reduce(s, action) {
|
|
|
3093
3112
|
const pIdx = s.activePlayerIndex;
|
|
3094
3113
|
const amount = action.landed ? 400 : 200;
|
|
3095
3114
|
s = adjustCash(s, amount, action.landed ? 'Treasury Opens: landed' : 'Treasury Opens: passed', pIdx);
|
|
3115
|
+
/* v0.21 circuit-victory model — every PASS_TREASURY_OPENS is one
|
|
3116
|
+
board circuit for the active player. The payday math above is
|
|
3117
|
+
unchanged from v0.20; circuit counting is layered on top. */
|
|
3118
|
+
s.players[pIdx].circuitsCompleted += 1;
|
|
3119
|
+
const c = s.players[pIdx].circuitsCompleted;
|
|
3120
|
+
const T = CIRCUIT_VICTORY.target;
|
|
3121
|
+
const pName = s.players[pIdx].name;
|
|
3122
|
+
/* Per-circuit narration in human voice — only for circuits below the trigger.
|
|
3123
|
+
Circuit T fires its own MANDATE row below; emitting both would be redundant. */
|
|
3124
|
+
if (c < T) {
|
|
3125
|
+
const circuitDetail = (c === 1)
|
|
3126
|
+
? pName + ' finishes their first lap around the Republic.'
|
|
3127
|
+
: (c === 2)
|
|
3128
|
+
? pName + ' is two circuits in.'
|
|
3129
|
+
: pName + ' is three deep. One more pass and the books close.';
|
|
3130
|
+
s = logRow(s, { actor:'System', event:'CIRCUIT', detail: circuitDetail, cls:'event' });
|
|
3131
|
+
}
|
|
3132
|
+
if (c >= T) {
|
|
3133
|
+
s.circuitTrigger = {
|
|
3134
|
+
playerIdx: pIdx, playerName: pName,
|
|
3135
|
+
round: s.lap, turn: s.turnIndex,
|
|
3136
|
+
circuits: c, target: T,
|
|
3137
|
+
influence: scorePlayer(s, pIdx).total,
|
|
3138
|
+
};
|
|
3139
|
+
s = logRow(s, { actor:'System', event:'MANDATE',
|
|
3140
|
+
detail: pName + ' has been around four times. The books close. Final Accounting.',
|
|
3141
|
+
cls:'event' });
|
|
3142
|
+
return reduce(s, { type:'END_GAME' });
|
|
3143
|
+
}
|
|
3096
3144
|
return s;
|
|
3097
3145
|
}
|
|
3098
3146
|
|
|
@@ -3300,35 +3348,19 @@ function reduce(s, action) {
|
|
|
3300
3348
|
}
|
|
3301
3349
|
|
|
3302
3350
|
case 'END_TURN': {
|
|
3351
|
+
if (s.status === 'gameOver') return s;
|
|
3303
3352
|
s.activePlayerIndex = (s.activePlayerIndex + 1) % s.players.length;
|
|
3304
3353
|
s.phase = 'awaiting-roll';
|
|
3305
3354
|
if (s.activePlayerIndex === 0) {
|
|
3306
|
-
/*
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
const scored = s.players.map((p, idx) => ({ idx, name: p.name, total: scorePlayer(s, idx).total }));
|
|
3312
|
-
const sorted = scored.slice().sort((a, b) => b.total - a.total);
|
|
3313
|
-
const top = sorted[0], second = sorted[1];
|
|
3314
|
-
const eligible = top.total >= MANDATE.threshold && (top.total - second.total) >= MANDATE.lead;
|
|
3315
|
-
const sharedTop = scored.filter(x => x.total === top.total).length > 1;
|
|
3316
|
-
if (eligible && !sharedTop) {
|
|
3317
|
-
s.mandateTrigger = {
|
|
3318
|
-
playerIdx: top.idx, playerName: top.name,
|
|
3319
|
-
round: s.lap, influence: top.total, lead: top.total - second.total,
|
|
3320
|
-
threshold: MANDATE.threshold, leadRequired: MANDATE.lead,
|
|
3321
|
-
};
|
|
3322
|
-
s = logRow(s, { actor:'System', event:'MANDATE',
|
|
3323
|
-
detail: top.name + ' claims the mandate · ' + top.total + ' Influence · lead ' + (top.total - second.total) + ' over ' + second.name,
|
|
3324
|
-
cls:'event' });
|
|
3325
|
-
return reduce(s, { type:'END_GAME' });
|
|
3326
|
-
}
|
|
3327
|
-
}
|
|
3328
|
-
/* Full round done · advance lap */
|
|
3355
|
+
/* v0.21 — Victory is now state-based (first to CIRCUIT_VICTORY.target
|
|
3356
|
+
circuits, evaluated inside PASS_TREASURY_OPENS). No end-of-round
|
|
3357
|
+
mandate check. We still keep a hard cap at HARD_CAP_ROUNDS as a
|
|
3358
|
+
safety net against pathological games; the diagnostic showed
|
|
3359
|
+
this essentially never fires. */
|
|
3329
3360
|
s.lap += 1;
|
|
3330
|
-
if (s.lap >
|
|
3331
|
-
s = logRow(s, { actor:'System', event:'GAME OVER',
|
|
3361
|
+
if (s.lap > HARD_CAP_ROUNDS) {
|
|
3362
|
+
s = logRow(s, { actor:'System', event:'GAME OVER',
|
|
3363
|
+
detail: HARD_CAP_ROUNDS + ' rounds in. No one made it around four times. The books close anyway.', cls:'event' });
|
|
3332
3364
|
return reduce(s, { type:'END_GAME' });
|
|
3333
3365
|
}
|
|
3334
3366
|
s = logRow(s, { actor:'System', event:'LAP', detail:'Begin lap ' + s.lap, cls:'event' });
|
|
@@ -3350,6 +3382,8 @@ function reduce(s, action) {
|
|
|
3350
3382
|
}
|
|
3351
3383
|
|
|
3352
3384
|
function finishLanding(s) {
|
|
3385
|
+
/* v0.21 — short-circuit if circuit victory already fired during this move */
|
|
3386
|
+
if (s.status === 'gameOver') return s;
|
|
3353
3387
|
/* Preserve live sub-phases set by cards (auctions, choices). */
|
|
3354
3388
|
if (s.phase === 'auction') return s;
|
|
3355
3389
|
if (s.phase === 'card-choice' && s.pendingCard) return s;
|
|
@@ -3558,7 +3592,7 @@ function renderBoard() {
|
|
|
3558
3592
|
<div class="bc-eyebrow">Sovereign · Hamilton System</div>
|
|
3559
3593
|
<div class="bc-title">Founding Credit</div>
|
|
3560
3594
|
<div class="bc-sub">Fund the debt. Build the bank. Industrialize the republic.</div>
|
|
3561
|
-
<div class="bc-lap" id="bcLap">Round 1
|
|
3595
|
+
<div class="bc-lap" id="bcLap">Round 1</div>
|
|
3562
3596
|
<div class="bc-tracks">
|
|
3563
3597
|
<span class="t credit">Credit<span class="v" id="bcCredit">5</span></span>
|
|
3564
3598
|
<span class="t resist">Resist<span class="v" id="bcResist">2</span></span>
|
|
@@ -3616,7 +3650,7 @@ function applyOwnership() {
|
|
|
3616
3650
|
/* Your own active space pulse */
|
|
3617
3651
|
if (youCell) youCell.classList.add('active-space');
|
|
3618
3652
|
}
|
|
3619
|
-
document.getElementById('bcLap').textContent = 'Round ' +
|
|
3653
|
+
document.getElementById('bcLap').textContent = 'Round ' + STATE.lap + (STATE.lap >= LATE_REPUBLIC_START ? ' · Late Republic' : '');
|
|
3620
3654
|
document.getElementById('bcCredit').textContent = STATE.tracks.credit.value;
|
|
3621
3655
|
document.getElementById('bcResist').textContent = STATE.tracks.resistance.value;
|
|
3622
3656
|
document.getElementById('bcIndust').textContent = STATE.tracks.capacity.value;
|
|
@@ -3920,39 +3954,27 @@ function renderControls() {
|
|
|
3920
3954
|
if (phase !== 'game-over') {
|
|
3921
3955
|
const strip = el('div', 'positions-strip');
|
|
3922
3956
|
STATE.players.forEach((p, idx) => {
|
|
3923
|
-
const
|
|
3957
|
+
const circuitsDone = p.circuitsCompleted || 0;
|
|
3958
|
+
const target = CIRCUIT_VICTORY.target;
|
|
3959
|
+
const oneFromVictory = circuitsDone === target - 1;
|
|
3960
|
+
const rowCls = 'pos-row p' + idx
|
|
3961
|
+
+ (STATE.activePlayerIndex === idx ? ' is-active' : '')
|
|
3962
|
+
+ (oneFromVictory && STATE.phase !== 'game-over' ? ' circuit-warning' : '');
|
|
3963
|
+
const row = el('div', rowCls);
|
|
3924
3964
|
const glyph = idx === 0 ? (p.glyph || '§') : (p.name?.[0] || ['Y','H','M'][idx]);
|
|
3925
3965
|
const where = SPACES[p.position]?.name || ('space ' + p.position);
|
|
3926
|
-
/* Show current Influence
|
|
3966
|
+
/* Show current Influence inline */
|
|
3927
3967
|
const ip = scorePlayer(STATE, idx).total;
|
|
3928
|
-
/*
|
|
3929
|
-
|
|
3930
|
-
|
|
3931
|
-
|
|
3932
|
-
const sorted = scored.slice().sort((a, b) => b.total - a.total);
|
|
3933
|
-
const top = sorted[0], second = sorted[1];
|
|
3934
|
-
if (idx === top.idx && top.total > second.total) {
|
|
3935
|
-
const fromThreshold = MANDATE.threshold - top.total;
|
|
3936
|
-
const fromLead = MANDATE.lead - (top.total - second.total);
|
|
3937
|
-
let badgeText;
|
|
3938
|
-
if (fromThreshold > 0 && fromLead > 0) {
|
|
3939
|
-
badgeText = fromThreshold + ' from threshold · +' + fromLead + ' lead needed';
|
|
3940
|
-
} else if (fromThreshold > 0) {
|
|
3941
|
-
badgeText = fromThreshold + ' from threshold';
|
|
3942
|
-
} else if (fromLead > 0) {
|
|
3943
|
-
badgeText = 'lead ' + (top.total - second.total) + ' of ' + MANDATE.lead;
|
|
3944
|
-
} else {
|
|
3945
|
-
badgeText = 'mandate eligible';
|
|
3946
|
-
}
|
|
3947
|
-
mandateBadge = '<div class="pos-mandate">' + badgeText + '</div>';
|
|
3948
|
-
}
|
|
3949
|
-
}
|
|
3968
|
+
/* Circuit badge — every player, always visible. Active player highlighted;
|
|
3969
|
+
brightens to foil when one circuit from victory. */
|
|
3970
|
+
const circuitBadge = '<div class="pos-circuits" title="Board circuits completed">'
|
|
3971
|
+
+ 'Circuits <span class="v">' + circuitsDone + ' / ' + target + '</span></div>';
|
|
3950
3972
|
row.innerHTML = '<div class="pos-tok"><span>' + glyph + '</span></div>' +
|
|
3951
3973
|
'<div>' +
|
|
3952
3974
|
'<div class="pos-name">' + p.name + '</div>' +
|
|
3953
3975
|
'<div class="pos-space">' + where + '</div>' +
|
|
3954
3976
|
'<div class="pos-cash">' + p.cash.toLocaleString('en-US') + ' \u00b7 <span class="pos-ip">' + ip + ' IP</span></div>' +
|
|
3955
|
-
|
|
3977
|
+
circuitBadge +
|
|
3956
3978
|
'</div>';
|
|
3957
3979
|
strip.appendChild(row);
|
|
3958
3980
|
});
|
|
@@ -4163,7 +4185,12 @@ function renderControls() {
|
|
|
4163
4185
|
}
|
|
4164
4186
|
else if (phase === 'game-over') {
|
|
4165
4187
|
document.body.classList.add('endgame-active');
|
|
4166
|
-
|
|
4188
|
+
const _ct = STATE.circuitTrigger;
|
|
4189
|
+
const eyebrow = _ct ? 'Final Accounting' : 'Thirty rounds in';
|
|
4190
|
+
const prompt = _ct
|
|
4191
|
+
? _ct.playerName + ' rounded the Republic for the fourth time at round ' + _ct.round + '.'
|
|
4192
|
+
: 'No one made it around four times. The books close anyway.';
|
|
4193
|
+
addBanner(eyebrow, prompt, 'Final tally posted in the report.', [
|
|
4167
4194
|
{ label:'View final report', primary:true, onClick: () => document.getElementById('endgameView')?.scrollIntoView({behavior:'smooth', block:'start'}) },
|
|
4168
4195
|
], { endgame:true });
|
|
4169
4196
|
}
|
|
@@ -4208,11 +4235,15 @@ function renderEndgame() {
|
|
|
4208
4235
|
const _rebellionChip = _rebellionFired
|
|
4209
4236
|
? '<span class="posture-chip collapsed">Rebellion fired</span>'
|
|
4210
4237
|
: '<span class="posture-chip avoided">No Rebellion</span>';
|
|
4211
|
-
const
|
|
4212
|
-
const _endTitle =
|
|
4213
|
-
const
|
|
4214
|
-
|
|
4215
|
-
|
|
4238
|
+
const _ct = STATE.circuitTrigger;
|
|
4239
|
+
const _endTitle = _ct ? 'Final Accounting' : 'Thirty rounds in';
|
|
4240
|
+
const _winnerName = STATE.players[winner.idx].name;
|
|
4241
|
+
const _triggerWon = _ct && _ct.playerIdx === winner.idx;
|
|
4242
|
+
const _endSub = _ct
|
|
4243
|
+
? (_triggerWon
|
|
4244
|
+
? _ct.playerName + ' carried the Republic around four times — and the ledger agreed.'
|
|
4245
|
+
: _ct.playerName + ' rounded the Republic four times — but the heaviest ledger belonged to ' + _winnerName + '.')
|
|
4246
|
+
: 'After ' + HARD_CAP_ROUNDS + ' rounds, none of you had carried the Republic around four times. The strongest ledger takes the day.';
|
|
4216
4247
|
let html = `
|
|
4217
4248
|
<h2>${_endTitle} <span class="surface-id">H</span></h2>
|
|
4218
4249
|
<div class="sub">${_endSub}</div>
|
|
@@ -4475,6 +4506,9 @@ document.addEventListener('keydown', (e) => {
|
|
|
4475
4506
|
const params = new URLSearchParams(window.location.search);
|
|
4476
4507
|
if (params.get('designer') === '1') document.body.classList.add('designer-mode');
|
|
4477
4508
|
} catch (e) {}
|
|
4509
|
+
/* Always sync the circuit-target pill so designer chrome reflects the URL flag */
|
|
4510
|
+
const t = document.getElementById('circuitTargetPill');
|
|
4511
|
+
if (t) t.textContent = String(CIRCUIT_VICTORY.target);
|
|
4478
4512
|
})();
|
|
4479
4513
|
|
|
4480
4514
|
/* Sidebar collapse — defaults to COLLAPSED so the board takes the stage. Persists to localStorage. */
|
|
@@ -4705,14 +4739,40 @@ function scanLedgerForToasts() {
|
|
|
4705
4739
|
pushToast({ cls:'rebellion', eyebrow:'Catastrophe', title:'Rebellion', body:'Public Resistance reaches twelve. Revenue upgrades destroyed; Resistance resets to 6.' });
|
|
4706
4740
|
} else if (row.event === 'AUCTION WIN' || (row.event === 'AUCTION' && /wins/i.test(row.detail || ''))) {
|
|
4707
4741
|
pushToast({ eyebrow:'Auction settled', title: row.detail || 'Auction won', body:'' });
|
|
4742
|
+
} else if (row.event === 'CIRCUIT') {
|
|
4743
|
+
/* v0.21 — quiet circuit progress toast. Foil eyebrow on the
|
|
4744
|
+
penultimate circuit so the player feels the noose tightening. */
|
|
4745
|
+
const T = CIRCUIT_VICTORY.target;
|
|
4746
|
+
const m = (row.detail || '').match(/circuit\s+(\d+)\s+of\s+(\d+)/i);
|
|
4747
|
+
const completed = m ? parseInt(m[1], 10) : 0;
|
|
4748
|
+
const oneShort = completed === T - 1;
|
|
4749
|
+
if (oneShort) {
|
|
4750
|
+
const actorName = row.actor === 'System' ? (STATE.players[STATE.activePlayerIndex]?.name || '') : row.actor;
|
|
4751
|
+
const subject = (row.detail || '').split(' is three')[0].split(' is two')[0].split(' finishes')[0] || actorName;
|
|
4752
|
+
pushToast({ cls:'pass', eyebrow:'Three deep',
|
|
4753
|
+
title: row.detail,
|
|
4754
|
+
body: subject + ' is one pass from closing the books.' });
|
|
4755
|
+
} else {
|
|
4756
|
+
pushToast({ eyebrow:'Board circuit', title: row.detail, body:'' });
|
|
4757
|
+
}
|
|
4708
4758
|
} else if (row.event === 'MANDATE') {
|
|
4709
|
-
|
|
4759
|
+
/* v0.21 — fired when a player completes their target circuit. */
|
|
4760
|
+
const ct = STATE.circuitTrigger;
|
|
4761
|
+
const title = ct
|
|
4762
|
+
? ct.playerName + ' has been around four times. The books close.'
|
|
4763
|
+
: row.detail;
|
|
4764
|
+
pushToast({ cls:'pass', eyebrow:'The books close', title,
|
|
4765
|
+
body:'Final Accounting decides the rest.' });
|
|
4710
4766
|
} else if (row.event === 'GAME OVER') {
|
|
4711
|
-
const
|
|
4712
|
-
if (
|
|
4713
|
-
pushToast({ eyebrow:'Final Accounting',
|
|
4767
|
+
const hadCircuit = STATE.circuitTrigger;
|
|
4768
|
+
if (hadCircuit) {
|
|
4769
|
+
pushToast({ eyebrow:'Final Accounting',
|
|
4770
|
+
title: hadCircuit.playerName + ' rounded the Republic four times',
|
|
4771
|
+
body: hadCircuit.influence + ' Influence at round ' + hadCircuit.round + '. View the report.' });
|
|
4714
4772
|
} else {
|
|
4715
|
-
pushToast({ eyebrow:
|
|
4773
|
+
pushToast({ eyebrow: HARD_CAP_ROUNDS + ' rounds in',
|
|
4774
|
+
title:'No one made it four times around',
|
|
4775
|
+
body:'The strongest ledger decides. View the report.' });
|
|
4716
4776
|
}
|
|
4717
4777
|
}
|
|
4718
4778
|
/* Opponent narration — verbose play-by-play with profile-flavored voice */
|
|
@@ -4805,21 +4865,19 @@ function buildLapRecap(lap) {
|
|
|
4805
4865
|
const youCash = STATE.players[0].cash;
|
|
4806
4866
|
const sentences = [];
|
|
4807
4867
|
sentences.push('Round ' + lap + ' closes.');
|
|
4808
|
-
/*
|
|
4809
|
-
|
|
4810
|
-
|
|
4811
|
-
|
|
4812
|
-
|
|
4813
|
-
|
|
4814
|
-
|
|
4815
|
-
|
|
4816
|
-
sentences.push(
|
|
4868
|
+
/* v0.21 — circuit progress instead of mandate status */
|
|
4869
|
+
const circuitLeader = STATE.players
|
|
4870
|
+
.map((p, idx) => ({ idx, name: p.name, circuits: p.circuitsCompleted || 0 }))
|
|
4871
|
+
.sort((a, b) => b.circuits - a.circuits)[0];
|
|
4872
|
+
const T = CIRCUIT_VICTORY.target;
|
|
4873
|
+
if (circuitLeader && circuitLeader.circuits > 0) {
|
|
4874
|
+
const tied = STATE.players.filter(p => (p.circuitsCompleted || 0) === circuitLeader.circuits).length > 1;
|
|
4875
|
+
if (circuitLeader.circuits === T - 1 && !tied) {
|
|
4876
|
+
sentences.push(circuitLeader.name + ' is three deep — one more pass and the books close.');
|
|
4877
|
+
} else if (tied) {
|
|
4878
|
+
sentences.push('The leaders are tied at ' + circuitLeader.circuits + ' circuits each.');
|
|
4817
4879
|
} else {
|
|
4818
|
-
|
|
4819
|
-
const need = [];
|
|
4820
|
-
if (top.total < MANDATE.threshold) need.push((MANDATE.threshold - top.total) + ' more Influence');
|
|
4821
|
-
if (lead < MANDATE.lead) need.push((MANDATE.lead - lead) + ' more lead');
|
|
4822
|
-
sentences.push(top.name + ' leads with ' + top.total + ' Influence, but ' + need.join(' and ') + ' — no mandate yet.');
|
|
4880
|
+
sentences.push(circuitLeader.name + ' leads with ' + circuitLeader.circuits + ' circuits.');
|
|
4823
4881
|
}
|
|
4824
4882
|
}
|
|
4825
4883
|
if (passed.length > 0) {
|
|
@@ -4845,7 +4903,7 @@ function showLapRecap(lapEnded) {
|
|
|
4845
4903
|
if (!STATE || STATE.status === 'gameOver') return;
|
|
4846
4904
|
const overlay = document.getElementById('lapRecapOverlay');
|
|
4847
4905
|
if (!overlay) return;
|
|
4848
|
-
const title = 'Round ' + lapEnded + '
|
|
4906
|
+
const title = 'Round ' + lapEnded + (lapEnded >= LATE_REPUBLIC_START ? ' · Late Republic' : '');
|
|
4849
4907
|
const sub = 'A federalist accounting';
|
|
4850
4908
|
const body = buildLapRecap(lapEnded);
|
|
4851
4909
|
document.getElementById('lapRecapTitle').textContent = title;
|
|
@@ -5023,7 +5081,10 @@ function buildRepublicSummary(state) {
|
|
|
5023
5081
|
|
|
5024
5082
|
const paras = [];
|
|
5025
5083
|
/* Para 1 — verdict + headline numbers */
|
|
5026
|
-
|
|
5084
|
+
const _ct = state.circuitTrigger;
|
|
5085
|
+
let p1 = _ct
|
|
5086
|
+
? ('At round ' + _ct.round + ', ' + _ct.playerName + ' carried the Republic around for the fourth time, and the books closed. ')
|
|
5087
|
+
: ('After ' + state.lap + ' rounds, none of you had carried the Republic around four times. The books closed anyway, and the strongest ledger took the day. ');
|
|
5027
5088
|
if (won) {
|
|
5028
5089
|
p1 += 'You hold the largest Influence position, with ' + score.total + ' points against ' + state.finalScores[1].total + ' for Hamilton and ' + state.finalScores[2].total + ' for Morris. ';
|
|
5029
5090
|
} else {
|
|
@@ -5141,11 +5202,15 @@ function hideResumePill() { document.getElementById('resumePill').classList.add(
|
|
|
5141
5202
|
|
|
5142
5203
|
function loadFromPayload(payload) {
|
|
5143
5204
|
if (payload && payload.version === 'v0.18-candidate') {
|
|
5144
|
-
showIoPill('This save is from an earlier game length and cannot be loaded. Start a new game to play the
|
|
5205
|
+
showIoPill('This save is from an earlier game length and cannot be loaded. Start a new game to play the circuit-victory model.', true);
|
|
5145
5206
|
return false;
|
|
5146
5207
|
}
|
|
5147
5208
|
if (payload && payload.version === 'v0.19-pacing-candidate') {
|
|
5148
|
-
showIoPill('This save is from before the
|
|
5209
|
+
showIoPill('This save is from before the circuit-victory model and cannot be loaded. Start a new game.', true);
|
|
5210
|
+
return false;
|
|
5211
|
+
}
|
|
5212
|
+
if (payload && payload.version === 'v0.20-mandate-candidate') {
|
|
5213
|
+
showIoPill('This save is from the withdrawn mandate-victory model and cannot be loaded. Start a new game to play the circuit-victory candidate.', true);
|
|
5149
5214
|
return false;
|
|
5150
5215
|
}
|
|
5151
5216
|
if (!payload || (payload.version !== SAVE_VERSION && payload.version !== 'v0.10' && payload.version !== 'v0.11-candidate' && payload.version !== 'v0.12-candidate' && payload.version !== 'v0.13-candidate' && payload.version !== 'v0.14-candidate' && payload.version !== 'v0.15-candidate' && payload.version !== 'v0.16-candidate' && payload.version !== 'v0.17-candidate')) {
|