);
+ // Guard referencing engine.phase_summaries
+ const phaseSummaries = engine.phase_summaries || {};
+ const currentPhase = engine.phase || "(unknown phase)";
+ let summaryText = "";
+ // Attempt to get a prior phase or fallback to current if prior is not available
+ const priorPhase = engine.phasePrior;
+ if (engine.phase_summaries) {
+ if (priorPhase && engine.phase_summaries.hasOwnProperty(priorPhase)) {
+ summaryText = engine.phase_summaries[priorPhase];
+ } else if (engine.phase && engine.phase_summaries.hasOwnProperty(engine.phase)) {
+ summaryText = engine.phase_summaries[engine.phase];
+ }
+ }
+ const summaryForCurrentPhase =
+ phaseSummaries.hasOwnProperty(currentPhase) ? phaseSummaries[currentPhase] : "";
+
+ // Example: Flatten messages from all known phases
+ let allMessages = [];
+ if (engine.message_history) {
+ for (const phaseName of Object.keys(engine.message_history)) {
+ const phaseMsgsDict = engine.message_history[phaseName];
+ // Convert { time_sent: messageObj, ... } to an array
+ const phaseMsgsArray = Object.values(phaseMsgsDict);
+ allMessages = allMessages.concat(phaseMsgsArray);
+ }
+ console.log('engine.message_history =>', engine.message_history);
+ for (const [key, value] of Object.entries(engine.message_history)) {
+ console.log('key =>', key, 'value =>', value);
+ }
+ }
+
+ console.log("DEBUG: content_game messages =>", allMessages, "length:", allMessages.length);
+
return (
@@ -1367,14 +1428,29 @@ export class ContentGame extends React.Component {
currentTabOrderCreation
)) || ''}
+ {/* Debug log before rendering the bottom sheet */}
+ {console.log("Rendering PhaseSummaryBottomSheet with phase:", currentPhase, "summary length:", summaryForCurrentPhase.length)}
+
+ this.setState({ summaryVisible: false })}
+ />
);
}
componentDidMount() {
+ this._isMounted = true;
window.scrollTo(0, 0);
- if (this.props.data.client)
- this.reloadDeadlineTimer(this.props.data.client);
+ if (this.props.data.client) {
+ this.reloadDeadlineTimer(this.props.data.client).then(() => {
+ if (this._isMounted) {
+ this.setState({ doneLoading: true });
+ }
+ });
+ }
this.props.data.displayed = true;
// Try to prevent scrolling when pressing keys Home and End.
document.onkeydown = (event) => {
@@ -1395,6 +1471,7 @@ export class ContentGame extends React.Component {
}
componentWillUnmount() {
+ this._isMounted = false;
this.clearScheduleTimeout();
this.props.data.displayed = false;
document.onkeydown = null;
diff --git a/diplomacy/web/src/gui/utils/load_game_from_disk.js b/diplomacy/web/src/gui/utils/load_game_from_disk.js
index a65e1df..984f91a 100644
--- a/diplomacy/web/src/gui/utils/load_game_from_disk.js
+++ b/diplomacy/web/src/gui/utils/load_game_from_disk.js
@@ -31,52 +31,107 @@ export function loadGameFromDisk() {
}
const reader = new FileReader();
reader.onload = () => {
- const savedData = JSON.parse(reader.result);
- const gameObject = {};
- gameObject.game_id = `(local) ${savedData.id}`;
- gameObject.map_name = savedData.map;
- gameObject.rules = savedData.rules;
- gameObject.state_history = {};
- gameObject.message_history = {};
- gameObject.order_history = {};
- gameObject.result_history = {};
+ console.log('[loadGameFromDisk] Reading JSON file...');
+ let savedData;
+ try {
+ savedData = JSON.parse(reader.result);
+ } catch (e) {
+ onError('Could not parse JSON file: ' + e);
+ return;
+ }
- // Load all saved phases (expect the latest one) to history fields.
+ const gameObject = {
+ game_id: `(local) ${savedData.id}`,
+ map_name: savedData.map,
+ rules: savedData.rules,
+ state_history: {},
+ message_history: {},
+ order_history: {},
+ result_history: {},
+ phase_summaries: {}
+ };
+
+ // Load older phases into history
for (let i = 0; i < savedData.phases.length - 1; ++i) {
const savedPhase = savedData.phases[i];
const gameState = savedPhase.state;
const phaseOrders = savedPhase.orders || {};
const phaseResults = savedPhase.results || {};
- const phaseMessages = {};
- if (savedPhase.messages) {
- for (let message of savedPhase.messages) {
- phaseMessages[message.time_sent] = message;
+
+ // 1) Fix or parse messages if they're a string
+ let phaseMessages = savedPhase.messages;
+ if (typeof phaseMessages === 'string') {
+ console.warn('[loadGameFromDisk] Phase', savedPhase.name,
+ 'has messages as string. Attempting fallback parse...');
+ // If it starts with "SortedDict", we can't trivially parse.
+ // Minimal fallback: set to empty object or parse if you have a custom parser.
+ if (phaseMessages.startsWith('SortedDict{')) {
+ phaseMessages = {};
}
+ } else if (!phaseMessages) {
+ phaseMessages = {};
+ } else {
+ // Convert array -> object keyed by time_sent
+ const obj = {};
+ for (const msg of phaseMessages) {
+ if (msg && msg.time_sent !== undefined) {
+ obj[msg.time_sent] = msg;
+ }
+ }
+ phaseMessages = obj;
}
- if (!gameState.name)
- gameState.name = savedPhase.name;
+
+ if (!gameState.name) gameState.name = savedPhase.name;
+
gameObject.state_history[gameState.name] = gameState;
gameObject.message_history[gameState.name] = phaseMessages;
gameObject.order_history[gameState.name] = phaseOrders;
gameObject.result_history[gameState.name] = phaseResults;
+
+ // Summaries
+ if (savedPhase.summary) {
+ console.log(`[loadGameFromDisk] Loading summaries for phase`, gameState.name);
+ gameObject.phase_summaries[gameState.name] = savedPhase.summary;
+ } else {
+ console.log(`[loadGameFromDisk] No summary for phase ${savedPhase.name}`);
+ }
}
- // Load latest phase separately and use it later to define the current game phase.
+ // Load latest phase
const latestPhase = savedData.phases[savedData.phases.length - 1];
const latestGameState = latestPhase.state;
const latestPhaseOrders = latestPhase.orders || {};
const latestPhaseResults = latestPhase.results || {};
- const latestPhaseMessages = {};
- if (latestPhase.messages) {
- for (let message of latestPhase.messages) {
- latestPhaseMessages[message.time_sent] = message;
+ let latestPhaseMessages = latestPhase.messages;
+ if (typeof latestPhaseMessages === 'string') {
+ console.warn('[loadGameFromDisk] Latest phase has messages as string. Fallback parse...');
+ if (latestPhaseMessages.startsWith('SortedDict{')) {
+ latestPhaseMessages = {};
}
+ } else if (!latestPhaseMessages) {
+ latestPhaseMessages = {};
+ } else {
+ const obj = {};
+ for (const msg of latestPhaseMessages) {
+ if (msg && msg.time_sent !== undefined) {
+ obj[msg.time_sent] = msg;
+ }
+ }
+ latestPhaseMessages = obj;
}
+
if (!latestGameState.name)
latestGameState.name = latestPhase.name;
- // TODO: NB: What if latest phase in loaded JSON contains order results? Not sure if it is well handled.
gameObject.result_history[latestGameState.name] = latestPhaseResults;
+ if (latestPhase.summary) {
+ console.log(`[loadGameFromDisk] Loading summary for latest phase ${latestGameState.name}:`, latestPhase.summary);
+ gameObject.phase_summaries[latestGameState.name] = latestPhase.summary;
+ } else {
+ console.log(`[loadGameFromDisk] No summary for latest phase ${latestGameState.name}`);
+ }
+
+ // Final game metadata
gameObject.messages = [];
gameObject.role = STRINGS.OBSERVER_TYPE;
gameObject.status = STRINGS.COMPLETED;
@@ -84,15 +139,17 @@ export function loadGameFromDisk() {
gameObject.deadline = 0;
gameObject.n_controls = 0;
gameObject.registration_password = '';
+
const game = new Game(gameObject);
- // Set game current phase and state using latest phase found in JSON file.
+ // Set the current phase to the latest
game.setPhaseData({
name: latestGameState.name,
state: latestGameState,
orders: latestPhaseOrders,
messages: latestPhaseMessages
});
+
onLoad(game);
};
reader.readAsText(file);
diff --git a/lm_game.py b/lm_game.py
index f2dc009..dfaac65 100644
--- a/lm_game.py
+++ b/lm_game.py
@@ -164,7 +164,7 @@ def main():
# Map each power to its chosen LLM
game.power_model_map = assign_models_to_powers()
- max_year = 2000
+ max_year = 1901
while not game.is_game_done:
phase_start = time.time()
@@ -245,7 +245,7 @@ def main():
logger.info(f"{border}\nPHASE SUMMARY for {phase_data.name}:\n{summary_text}\n{border}")
# Optionally append it to the same text file, so we keep a log
- with open("/results/game_manifesto.txt", "a") as f:
+ with open("./results/game_manifesto.txt", "a") as f:
f.write(f"=== {phase_data.name} ===\n{summary_text}\n\n")
# End-of-loop checks
@@ -259,7 +259,7 @@ def main():
duration = time.time() - start_whole
logger.info(f"Game ended after {duration:.2f}s. Saving to 'lmvsgame.json'.")
# Save the game to a JSON file
- output_path = '/results/lmvsgame.json'
+ output_path = './results/lmvsgame.json'
if not os.path.exists(output_path):
to_saved_game_format(game, output_path=output_path)
else:
diff --git a/lm_service_versus.py b/lm_service_versus.py
index 6cd2ee3..f98b013 100644
--- a/lm_service_versus.py
+++ b/lm_service_versus.py
@@ -669,5 +669,5 @@ def get_visible_messages_for_power(conversation_messages, power_name):
def load_prompt(filename: str) -> str:
"""Helper to load prompt text from file"""
- with open(f"AI_Diplomacy/prompts/{filename}", "r") as f:
+ with open(f"./prompts/{filename}", "r") as f:
return f.read().strip()
\ No newline at end of file
diff --git a/prompts/build_conversation_reply.txt b/prompts/build_conversation_reply.txt
index 2deaf67..7617b7f 100644
--- a/prompts/build_conversation_reply.txt
+++ b/prompts/build_conversation_reply.txt
@@ -1,25 +1,25 @@
You are playing a power named {power_name} in a Diplomacy game during the {game_phase} phase.
Here are the past phase summaries:
-{phase_summaries}
+{{phase_summaries}}
Here is the conversation so far:
-{conversation_so_far}
+{{conversation_so_far}}
You must now respond with exactly ONE JSON object.
Example response formats:
1. For a global message:
-{
+{{
"message_type": "global",
"content": "I propose we all work together against Turkey."
-}
+}}
2. For a private message:
-{
+{{
"message_type": "private",
"recipient": "FRANCE",
"content": "Let's form a secret alliance against Germany."
-}
+}}
Think strategically about your diplomatic position the past phase summaries and respond with your message in the correct JSON format:
\ No newline at end of file
diff --git a/prompts/few_shot_example.txt b/prompts/few_shot_example.txt
index f3cd5e7..2f4935c 100644
--- a/prompts/few_shot_example.txt
+++ b/prompts/few_shot_example.txt
@@ -12,7 +12,8 @@ Think about the enemy units and centers and how they might move, think about you
Aim for best strategic moves based on the possible orders,
and produce an output in PARSABLE JSON format as shown below.]
-PARSABLE OUTPUT:{
+PARSABLE OUTPUT:
+{{
"orders": ["A PAR - BUR","F BRE - MAO"]
-}
+}}
--- END EXAMPLE ---
\ No newline at end of file
diff --git a/prompts/instructions.txt b/prompts/instructions.txt
index c69a8c5..f13c1ce 100644
--- a/prompts/instructions.txt
+++ b/prompts/instructions.txt
@@ -1,8 +1,9 @@
IMPORTANT:
For your chain of thought, think about the enemy units and centers and how they might move, think about your units and centers, the conversation that's happened, the game phase summaries so far, any public and private goals you have or others might have based on conversation and reality of positions.
Return your chain-of-thought and end with EXACTLY one JSON block:
-PARSABLE OUTPUT:{
+PARSABLE OUTPUT:
+{{
"orders": [ ... ]
-}
+}}
No extra braces outside that block.
The most important thing is to make SURE to include your orders in the JSON block.
\ No newline at end of file
diff --git a/prompts/system_prompt_conversation.txt b/prompts/system_prompt_conversation.txt
index 137f567..6e17b23 100644
--- a/prompts/system_prompt_conversation.txt
+++ b/prompts/system_prompt_conversation.txt
@@ -4,17 +4,17 @@ REQUIRED FORMAT:
For any message, you must respond with one of these exact JSON structures:
1. For global messages:
-{
+{{
"message_type": "global",
"content": "Your message here"
-}
+}}
2. For private messages:
-{
+{{
"message_type": "private",
"recipient": "POWER_NAME",
"content": "Your message here"
-}
+}}
IMPORTANT RULES:
- Your response must be ONLY the JSON object, nothing else
@@ -24,13 +24,13 @@ IMPORTANT RULES:
- For private messages, recipient must be one of: AUSTRIA, FRANCE, GERMANY, ITALY, RUSSIA, TURKEY, ENGLAND
Example valid responses:
-{
+{{
"message_type": "global",
"content": "I propose we all work together against Turkey."
-}
+}}
-{
+{{
"message_type": "private",
"recipient": "FRANCE",
"content": "Let's form a secret alliance against Germany."
-}
\ No newline at end of file
+}}
\ No newline at end of file
diff --git a/prompts/system_prompt_response.txt b/prompts/system_prompt_response.txt
index 6d1307b..02cf24f 100644
--- a/prompts/system_prompt_response.txt
+++ b/prompts/system_prompt_response.txt
@@ -13,7 +13,7 @@ You are a Diplomacy expert.
After thinking about the information, you must produce a list of orders.
You must respond with a JSON object in the format:
PARSABLE OUTPUT:
- {
+ {{
"orders": ["Your move 1","Your move 2"]
- }
+ }}
it's paramount that you include the parsable output block.
\ No newline at end of file
diff --git a/results/game_manifesto.txt b/results/game_manifesto.txt
index 4cf167e..9b35e63 100644
--- a/results/game_manifesto.txt
+++ b/results/game_manifesto.txt
@@ -2645,3 +2645,71 @@ PARSABLE OUTPUT:
]
}
+=== S1901M ===
+PARSABLE OUTPUT:
+{
+ "orders": [
+ "Austria’s turn saw mixed results: the army from Bud successfully advanced toward Serbia while the army from Vienna attempting to move into Bohemia was bounced, leaving Vienna in place. The fleet in Trieste held its position.",
+ "England executed an aggressive push with its fleets and army: the fleet from London moved into the English Channel, the fleet from Edinburgh moved toward the North Sea, and the army from Liverpool advanced into Wales.",
+ "France kept a defensive posture as all its units (the fleet in Brest and the armies in Marseilles and Paris) held.",
+ "Germany’s orders were partially frustrated: the army from Munich trying to enter Bohemia was bounced (so Munich remained unchanged) while the army from Berlin and the fleet in Kiel held.",
+ "Italy achieved its maneuvers; the fleet from Naples successfully moved to the Tyrrhenian Sea, the army from Rome advanced into Apulia, and the army in Venice held.",
+ "Russia advanced on two fronts: the army from Moscow moved toward Ukraine and the army from Warsaw pushed into Galicia, while the fleet from Sevastopol’s move was bounced and the fleet in the St. Petersburg South Coast held.",
+ "Turkey experienced mixed outcomes: the fleet from Ankara attempting to move was bounced, but the army from Constantinople moved into Bulgaria and the army in Smyrna held."
+ ]
+}
+
+=== F1901M ===
+PARSABLE OUTPUT:
+{
+ "orders": [
+ "In phase F1901M, Austria’s aggressive attempts to capture Albania via moves from Serbia and Trieste both failed (bounced), and their support from Vienna went void. Despite these setbacks, the build phase changes are evident as Austria now fields a unit in Serbia in place of the lost unit in Budapest.",
+ "England enjoyed successful moves with its fleet from the North Sea advancing to Belgium and its army from Wales moving to York, while its fleet in the English Channel held. These changes accompany a complete turnover of units from the previous phase.",
+ "France largely held the line with all orders involving the Brest fleet and armies in Marseilles and Paris holding, maintaining their existing positions.",
+ "Germany saw its fleet from Kiel successfully move into Denmark while its armies in Berlin and Munich held, preserving its defensive setup.",
+ "Italy’s orders included a support from the Venice army for the fleet build in Apulia, while the Tyrrhenian Sea fleet advanced to Tunis. The build phase is reflected by Italy now controlling new units in Tyrrhenia and Apulia instead of the previous units lost in Rome and Naples.",
+ "Russia attempted to secure Rumania through a support order from the Galician army and moves by other units, but with the fleet from Sevastopol and the Ukrainian army’s orders bouncing, only the fleet in the St. Petersburg convoy held. Meanwhile, the build changes are visible with new units now in Galicia and Ukraine replacing the former holdings in Warsaw and Moscow.",
+ "Turkey managed to push its Ankle fleet forward into the Black Sea (BLA) and held orders with its armies in Smyrna and newly built Bulgaria, reflecting a shift from losing the unit in Constantinople to gaining influence along the Bulgarian coast."
+ ]
+}
+
+=== W1901A ===
+PARSABLE OUTPUT:
+{
+ "orders": [
+ "In the winter phase W1901A, several significant changes occurred. Austria, without issuing orders, secured the center SER, reinforcing its influence. England's order to move its army to Edinburgh succeeded, whereas its fleet move from London was void, contributing to the loss of A WAL and F NTH but allowing England to add new units—F BEL and A YOR—and capture the BEL center. In Germany, the fleet from Kiel successfully moved, leading to the loss of F KIE and the construction of F DEN alongside the gain of the DEN center. Italy achieved success with its Naples army move while its fleet move from Rome was void, resulting in the replacement of F TYS with a new F TUN and acquisition of the TUN center. Turkey saw its order from Ankara succeed, but the move from Constantinople went void—this produced the loss of F ANK but allowed Turkey to bring in a new fleet F BLA and secure the BUL center. France and Russia remained inactive this phase, and all unit adjustments are now reflected in the current board state."
+ ]
+}
+
+=== S1901M ===
+PARSABLE OUTPUT:
+{
+ "orders": [
+ "In the Spring 1901 movement phase, many powers attempted aggressive moves and supports, but ultimately the board remained unchanged.",
+ "Austria tried to support a move into Trieste with both its army in Budapest and in Vienna, yet the Vienna support was nullified while the fleet in Trieste held its position.",
+ "England ordered movements from Edinburgh toward NWG, from London toward the North Sea, and an army from Liverpool to Yorkshire, but none of these moves altered unit locations.",
+ "France pushed from Brest to ENG and from Paris toward BUR while ordering its Marseilles unit to hold, but all French units stayed in place.",
+ "Germany kept all its units on hold in Berlin, Kiel, and Munich, maintaining their positions without engagement.",
+ "Italy attempted to move its fleet from Naples to Tyrrhenian Sea and its army from Rome toward Apulia, but these moves did not succeed; the fleet and armies remained at their original centers.",
+ "Russia's fleet from Sevastopol tried to move to the Black Sea but bounced, and its attempt to push its unit from Warsaw to Ukraine failed; meanwhile, its other units held.",
+ "Turkey’s fleet in Ankara similarly experienced a bounce when trying to move to the Black Sea, and its other units held undisturbed.",
+ "Overall, despite several attempted advances and support maneuvers, no unit relocated or captured a new center, leaving the board state exactly as it was before this phase."
+ ]
+}
+
+=== F1901M ===
+PARSABLE OUTPUT:
+{
+ "orders": [
+ "In the Fall 1901 movement phase, several key maneuvers and adjustments defined the board. Austria’s orders were partially frustrated: its fleet in Trieste attempted to move to Venice but bounced, and its support attempts from Bud and Vienna ended up void, leaving its three units (A BUD, A VIE, F TRI) in place. England’s reorganization was evident as it replaced its old units (F EDI, F LON, A LVP) with new forces; the fleet from the North Sea successfully advanced toward Belgium, while its other fleet in the English Channel (NWG) and the army in York held firm. France maintained a defensive posture with holds in Marseille and its other positions, even as it added a new fleet (F ENG) and army (A BUR) replacing lost units, adjusting its influence on ENG and BUR. Germany saw its fleet from Kiel successfully move to Holland (HOL) while its armies in Munich and Berlin supported each other and held their positions. Italy managed a similar update by introducing both a new fleet (F TYS) moving toward Tunis and an additional army (A APU) while holding its unit in Venice—the losses in Naples and Rome reflecting changes from previous supply center adjustments. Russia’s orders were mixed; although its fleet in Sevastopol moved toward Black Sea territory and it held firm with its fleet in St. Petersburg and army in Moscow, the support order from its new army in Ukraine for an advance from Budapest to Rumania went void. This change coincided with the replacement of its unit in Warsaw by the newly added A UKR. Finally, Turkey held all its positions with its fleet in Ankara and armies in Constantinople and Smyrna remaining unmoved. Overall, while several orders (notably Austria’s and Russia’s support actions) failed to have the intended effect, the phase was marked by significant unit turnover for England, France, Italy, and Russia as they adjusted their forces based on captured centers and supply changes."
+ ]
+}
+
+=== W1901A ===
+PARSABLE OUTPUT:
+{
+ "orders": [
+ "In phase W1901A, several build orders led to notable shifts in unit positions and supply center control. England’s build orders from EDI, LON, and LVP only produced one new fleet – with the successful build now located at BEL – while an existing unit at NTH was removed. Germany’s single build order from KIE resulted in a repositioned fleet showing up at HOL, thereby marking a shift in their naval placement. Italy’s orders saw the build order from ROM succeed and the order from NAP fail, which is reflected by their replacement of the fleet originally at TYS with a new fleet at TUN as they secured the TUN center. Russia similarly replaced its fleet at SEV with a new fleet now at BLA. Meanwhile, Austria, France, and Turkey did not issue orders this turn – though France’s unit composition was adjusted as they lost a fleet at ENG and gained one at PIC. Overall, these changes illustrate a series of successful and voided build orders that have subtly reconfigured the board, with several powers adjusting their naval positions and control over key centers."
+ ]
+}
+
diff --git a/results/lmvsgame.json_20250208_122901.json b/results/lmvsgame.json_20250208_122901.json
new file mode 100644
index 0000000..e69de29
diff --git a/results/lmvsgame.json_20250208_123903.json b/results/lmvsgame.json_20250208_123903.json
new file mode 100644
index 0000000..efb5319
--- /dev/null
+++ b/results/lmvsgame.json_20250208_123903.json
@@ -0,0 +1 @@
+{"id":"h0xMu0r9Z5PUjUZQ","map":"standard","rules":["NO_PRESS","POWER_CHOICE"],"phases":[{"name":"S1901M","state":{"timestamp":1739018220736725,"zobrist_hash":"1919110489198082658","note":"","name":"S1901M","units":{"AUSTRIA":["A BUD","A VIE","F TRI"],"ENGLAND":["F EDI","F LON","A LVP"],"FRANCE":["F BRE","A MAR","A PAR"],"GERMANY":["F KIE","A BER","A MUN"],"ITALY":["F NAP","A ROM","A VEN"],"RUSSIA":["A WAR","A MOS","F SEV","F STP\/SC"],"TURKEY":["F ANK","A CON","A SMY"]},"retreats":{"AUSTRIA":{},"ENGLAND":{},"FRANCE":{},"GERMANY":{},"ITALY":{},"RUSSIA":{},"TURKEY":{}},"centers":{"AUSTRIA":["BUD","TRI","VIE"],"ENGLAND":["EDI","LON","LVP"],"FRANCE":["BRE","MAR","PAR"],"GERMANY":["BER","KIE","MUN"],"ITALY":["NAP","ROM","VEN"],"RUSSIA":["MOS","SEV","STP","WAR"],"TURKEY":["ANK","CON","SMY"]},"homes":{"AUSTRIA":["BUD","TRI","VIE"],"ENGLAND":["EDI","LON","LVP"],"FRANCE":["BRE","MAR","PAR"],"GERMANY":["BER","KIE","MUN"],"ITALY":["NAP","ROM","VEN"],"RUSSIA":["MOS","SEV","STP","WAR"],"TURKEY":["ANK","CON","SMY"]},"influence":{"AUSTRIA":["BUD","VIE","TRI"],"ENGLAND":["EDI","LON","LVP"],"FRANCE":["BRE","MAR","PAR"],"GERMANY":["KIE","BER","MUN"],"ITALY":["NAP","ROM","VEN"],"RUSSIA":["WAR","MOS","SEV","STP"],"TURKEY":["ANK","CON","SMY"]},"civil_disorder":{"AUSTRIA":0,"ENGLAND":0,"FRANCE":0,"GERMANY":0,"ITALY":0,"RUSSIA":0,"TURKEY":0},"builds":{"AUSTRIA":{"count":0,"homes":[]},"ENGLAND":{"count":0,"homes":[]},"FRANCE":{"count":0,"homes":[]},"GERMANY":{"count":0,"homes":[]},"ITALY":{"count":0,"homes":[]},"RUSSIA":{"count":0,"homes":[]},"TURKEY":{"count":0,"homes":[]}},"phase":"S1901M","game_id":"h0xMu0r9Z5PUjUZQ","map":"standard","rules":["NO_PRESS","POWER_CHOICE"]},"orders":{"AUSTRIA":["A BUD S F TRI","A VIE S A BUD - TRI","F TRI H"],"ENGLAND":["F EDI - NWG","F LON - NTH","A LVP - YOR"],"FRANCE":["F BRE - ENG","A PAR - BUR","A MAR H"],"GERMANY":["A BER H","F KIE H","A MUN H"],"ITALY":["F NAP - TYS","A ROM - APU","A VEN H"],"RUSSIA":["F SEV - BLA","A MOS H","F STP\/SC H","A WAR - UKR"],"TURKEY":["F ANK - BLA","A CON H","A SMY H"]},"results":{"A BUD":[],"A VIE":["void"],"F TRI":[],"F EDI":[],"F LON":[],"A LVP":[],"F BRE":[],"A MAR":[],"A PAR":[],"F KIE":[],"A BER":[],"A MUN":[],"F NAP":[],"A ROM":[],"A VEN":[],"A WAR":[],"A MOS":[],"F SEV":["bounce"],"F STP\/SC":[],"F ANK":["bounce"],"A CON":[],"A SMY":[]},"messages":"SortedDict{1739018159660512:[1739018159660512\/S1901M\/AUSTRIA->GLOBAL](Austria is open to discussing a united front against potential threats. Let's coordinate our actions for mutual benefit.), 1739018161071365:[1739018161071365\/S1901M\/ENGLAND->FRANCE](France, given Germany's move into Belgium, I think it's imperative we coordinate. I'm open to a strong alliance, but at minimum, let's ensure we're not working against each other. I'd like to support you in Brest and secure the Channel. What are your thoughts on Germany's aggression and how we should respond?), 1739018166390413:[1739018166390413\/S1901M\/FRANCE->GLOBAL](Greetings to all, FRANCE is determined to secure her borders and ensure stability in the region. I propose a non-aggression pact and coordinated moves, especially with those interested in curbing any undue aggression along our shared fronts. Let us work together to maintain peace and balance, and avoid unwelcome surprises as we shape the future of our shared map.), 1739018168584941:[1739018168584941\/S1901M\/GERMANY->GLOBAL](Greetings to all! I am looking forward to working with my fellow European powers. As Germany, I aim to maintain peaceful and productive relationships with my neighbors. I'm open to diplomatic discussions and potential alliances.), 1739018170121909:[1739018170121909\/S1901M\/ITALY->FRANCE](I am considering moving to Piedmont. Can you assure me of peace on our border? I seek to avoid any conflict with you.), 1739018170918479:[1739018170918479\/S1901M\/RUSSIA->TURKEY](I suggest we coordinate our moves in the Black Sea. I'm moving Sev-Rum and would like your support for the same. Let me know your plans.), 1739018173703500:[1739018173703500\/S1901M\/TURKEY->AUSTRIA](I believe we have a mutual interest in cooperating against Russia's potential expansion. My fleet in Ankara and your forces in the Balkans could create an effective defensive and potentially offensive strategy together. Are you interested in discussing a potential alliance?), 1739018174577175:[1739018174577175\/S1901M\/AUSTRIA->GLOBAL](I believe it's crucial for us to establish a united front. Let's focus on collective security and avoid letting any one power dominate the board.), 1739018175836367:[1739018175836367\/S1901M\/ENGLAND->FRANCE](Bonjour France! Given Germany's aggression in Belgium, I believe a strong Anglo-French understanding is crucial. I intend to move to the Channel. Would you be amenable to supporting this, and potentially coordinating against German expansion? Perhaps Brest to Brittany?), 1739018180618887:[1739018180618887\/S1901M\/FRANCE->GLOBAL](Greetings to all, FRANCE speaking. As we transition into S1901M, I remain committed to securing our frontiers and ensuring stability along the Iberian coast. I propose that we work together to prevent unnecessary conflicts and maintain a balanced power structure in the region. I am open to discussions and alliances that safeguard our mutual interests and pave the way for a peaceful spring. Please share your thoughts.), 1739018182280733:[1739018182280733\/S1901M\/GERMANY->GLOBAL](Greetings to all powers! As Germany, I seek peaceful and productive relationships with my neighbors. I believe in open communication and mutually beneficial arrangements. Who would like to discuss potential collaboration?), 1739018184338265:[1739018184338265\/S1901M\/ITALY->AUSTRIA](It seems beneficial for both of us to work together to secure our borders. I propose a DMZ in Tyrolia to ensure mutual trust and prevent any unwanted surprises. What do you say?), 1739018185332816:[1739018185332816\/S1901M\/RUSSIA->AUSTRIA](I am concerned about the potential for a conflict in the Balkans. Let's coordinate our moves in the region to avoid any misunderstandings and ensure mutual security. Specifically, I suggest we both support each other's moves in the region. I will support your move to Trieste. What do you think?), 1739018190226181:[1739018190226181\/S1901M\/TURKEY->RUSSIA](I believe we can have mutual interests in the Balkans and Black Sea region. Would you be interested in discussing a potential non-aggression understanding that could benefit both our positions?), 1739018191566978:[1739018191566978\/S1901M\/AUSTRIA->GLOBAL](I believe a strong alliance between Austria, Italy, and Germany could neutralize any threats from Turkey and solidify our positions in the Balkans. Let's discuss potential cooperation.), 1739018192867718:[1739018192867718\/S1901M\/ENGLAND->FRANCE](Bonjour France! Given Germany's aggression in Belgium, I propose we coordinate our fleets. I intend to move my fleet in the English Channel to the North Sea to deter further German expansion. Would you be willing to move your Brest fleet to the English Channel to cover my move and deter Germany from attacking Brest?), 1739018198177391:[1739018198177391\/S1901M\/FRANCE->GLOBAL](Fellow powers, as France we are focused on securing our borders and maintaining a balance of power. In S1901, our stride is defensive yet opportunistic\u2014we seek stability and peaceful borders while remaining alert to any threats. I welcome dialogue on mutual non-aggression and even strategic coordination, especially with those who value a stable Western front. Let us ensure that our moves are deliberate and cooperative, keeping the overall balance intact.), 1739018200315107:[1739018200315107\/S1901M\/GERMANY->GLOBAL](Greetings everyone! I'm Germany and I look forward to working together. I believe in open communication and fair deals. Let me know if anyone would like to discuss potential arrangements - my door is open for diplomacy!), 1739018202549990:[1739018202549990\/S1901M\/ITALY->FRANCE](Bonjour! I'm interested in securing a peaceful Western Mediterranean. Are you open to discussing a non-aggression pact and possibly working together against any mutual threats? Let me know your thoughts.), 1739018203270867:[1739018203270867\/S1901M\/RUSSIA->AUSTRIA](Austria, I am interested in a discussion about the future. Perhaps we could work together against Germany. Are you interested in such an alliance?), 1739018204924730:[1739018204924730\/S1901M\/TURKEY->RUSSIA](I believe we have a mutual interest in preventing Austria-Hungary from becoming too powerful. I propose a non-aggression pact that would allow us to focus on our strategic objectives in the Balkans and Black Sea region. What are your thoughts?)}","summary":"PARSABLE OUTPUT:\n{\n \"orders\": [\n \"In the Spring 1901 movement phase, many powers attempted aggressive moves and supports, but ultimately the board remained unchanged.\",\n \"Austria tried to support a move into Trieste with both its army in Budapest and in Vienna, yet the Vienna support was nullified while the fleet in Trieste held its position.\",\n \"England ordered movements from Edinburgh toward NWG, from London toward the North Sea, and an army from Liverpool to Yorkshire, but none of these moves altered unit locations.\",\n \"France pushed from Brest to ENG and from Paris toward BUR while ordering its Marseilles unit to hold, but all French units stayed in place.\",\n \"Germany kept all its units on hold in Berlin, Kiel, and Munich, maintaining their positions without engagement.\",\n \"Italy attempted to move its fleet from Naples to Tyrrhenian Sea and its army from Rome toward Apulia, but these moves did not succeed; the fleet and armies remained at their original centers.\",\n \"Russia's fleet from Sevastopol tried to move to the Black Sea but bounced, and its attempt to push its unit from Warsaw to Ukraine failed; meanwhile, its other units held.\",\n \"Turkey\u2019s fleet in Ankara similarly experienced a bounce when trying to move to the Black Sea, and its other units held undisturbed.\",\n \"Overall, despite several attempted advances and support maneuvers, no unit relocated or captured a new center, leaving the board state exactly as it was before this phase.\"\n ]\n}"},{"name":"F1901M","state":{"timestamp":1739018304180314,"zobrist_hash":"5145199831952902617","note":"","name":"F1901M","units":{"AUSTRIA":["A BUD","A VIE","F TRI"],"ENGLAND":["F NWG","F NTH","A YOR"],"FRANCE":["A MAR","F ENG","A BUR"],"GERMANY":["F KIE","A BER","A MUN"],"ITALY":["A VEN","F TYS","A APU"],"RUSSIA":["A MOS","F SEV","F STP\/SC","A UKR"],"TURKEY":["F ANK","A CON","A SMY"]},"retreats":{"AUSTRIA":{},"ENGLAND":{},"FRANCE":{},"GERMANY":{},"ITALY":{},"RUSSIA":{},"TURKEY":{}},"centers":{"AUSTRIA":["BUD","TRI","VIE"],"ENGLAND":["EDI","LON","LVP"],"FRANCE":["BRE","MAR","PAR"],"GERMANY":["BER","KIE","MUN"],"ITALY":["NAP","ROM","VEN"],"RUSSIA":["MOS","SEV","STP","WAR"],"TURKEY":["ANK","CON","SMY"]},"homes":{"AUSTRIA":["BUD","TRI","VIE"],"ENGLAND":["EDI","LON","LVP"],"FRANCE":["BRE","MAR","PAR"],"GERMANY":["BER","KIE","MUN"],"ITALY":["NAP","ROM","VEN"],"RUSSIA":["MOS","SEV","STP","WAR"],"TURKEY":["ANK","CON","SMY"]},"influence":{"AUSTRIA":["BUD","VIE","TRI"],"ENGLAND":["EDI","LON","LVP","NWG","NTH","YOR"],"FRANCE":["BRE","MAR","PAR","ENG","BUR"],"GERMANY":["KIE","BER","MUN"],"ITALY":["NAP","ROM","VEN","TYS","APU"],"RUSSIA":["WAR","MOS","SEV","STP","UKR"],"TURKEY":["ANK","CON","SMY"]},"civil_disorder":{"AUSTRIA":0,"ENGLAND":0,"FRANCE":0,"GERMANY":0,"ITALY":0,"RUSSIA":0,"TURKEY":0},"builds":{"AUSTRIA":{"count":0,"homes":[]},"ENGLAND":{"count":0,"homes":[]},"FRANCE":{"count":0,"homes":[]},"GERMANY":{"count":0,"homes":[]},"ITALY":{"count":0,"homes":[]},"RUSSIA":{"count":0,"homes":[]},"TURKEY":{"count":0,"homes":[]}},"phase":"F1901M","game_id":"h0xMu0r9Z5PUjUZQ","map":"standard","rules":["NO_PRESS","POWER_CHOICE"]},"orders":{"AUSTRIA":["A BUD S A VIE - TRI","F TRI - VEN","A VIE S A BUD - TRI"],"ENGLAND":["F NTH - BEL","F NWG H","A YOR H"],"FRANCE":["A MAR H","F ENG - PIC","A BUR H"],"GERMANY":["A MUN H","A BER S A MUN","F KIE - HOL"],"ITALY":["F TYS - TUN","A VEN H","A APU H"],"RUSSIA":["F SEV - BLA","A UKR S A BUD - RUM","A MOS H","F STP\/SC H"],"TURKEY":["F ANK H","A CON H","A SMY H"]},"results":{"A BUD":["void"],"A VIE":["void"],"F TRI":["bounce"],"F NWG":[],"F NTH":[],"A YOR":[],"A MAR":[],"F ENG":[],"A BUR":[],"F KIE":[],"A BER":[],"A MUN":[],"A VEN":[],"F TYS":[],"A APU":[],"A MOS":[],"F SEV":[],"F STP\/SC":[],"A UKR":["void"],"F ANK":[],"A CON":[],"A SMY":[]},"messages":"SortedDict{1739018235178456:[1739018235178456\/F1901M\/AUSTRIA->ITALY](I believe we can benefit from a partnership. Let's discuss how we can coordinate our moves for mutual advantage.), 1739018236401961:[1739018236401961\/F1901M\/ENGLAND->FRANCE](Bonjour France! Given Germany's aggression towards Belgium, I think it would be wise for us to coordinate our moves. I plan to move ENG: London to North Sea and ENG: Edinburgh to Liverpool. How do you plan on moving this turn? Perhaps we can agree to support each other in Belgium if necessary?), 1739018241428897:[1739018241428897\/F1901M\/FRANCE->GLOBAL](As FRANCE, I aim for stability on the Western front. I intend to secure our core territories in Picardy and Brittany and encourage all players to commit to a balanced power dynamic. Let\u2019s avoid unnecessary aggression and consider mutually beneficial arrangements to maintain equilibrium. Open to further dialogue on non-aggression pacts to ensure that our shared borders remain secure.), 1739018242839425:[1739018242839425\/F1901M\/GERMANY->GLOBAL](I'd like to have open, honest communication with all powers to maintain stability in our early relations. Anyone who wants to discuss specific tactical or strategic opportunities, please feel free to reach out privately.), 1739018246559813:[1739018246559813\/F1901M\/ITALY->AUSTRIA](I believe cooperation between Italy and Austria is essential. Let's focus on securing the Balkans together. I suggest we agree to a DMZ in Tyrolia and support each other's moves in the coming turns.), 1739018247386409:[1739018247386409\/F1901M\/RUSSIA->AUSTRIA](I am moving to Rumania. I suggest you support my move to Rumania. I will support your move to Serbia.), 1739018249578558:[1739018249578558\/F1901M\/TURKEY->GLOBAL](As Turkey, I'm looking to establish peaceful relations in the Balkans. I believe Austria and I could benefit from cooperation and mutual understanding. My initial goal is to secure my position and potentially consider a strategic alliance that could help us both expand.), 1739018251530840:[1739018251530840\/F1901M\/AUSTRIA->GLOBAL](As Austria, I believe it's crucial for us to establish a cooperative front to ensure stability in the region. I'm open to discussing mutual interests and forming alliances that can benefit us all.), 1739018252883331:[1739018252883331\/F1901M\/ENGLAND->FRANCE](France, I believe we have mutual interests in keeping Germany contained. I'm planning to move to the English Channel. Would you be amenable to supporting this, and perhaps coordinating a move into Belgium to keep Germany from expanding North? I am also open to discussing how we might work together to keep Germany in check in the long term.), 1739018257531178:[1739018257531178\/F1901M\/FRANCE->GLOBAL](France stands firm in her commitment to securing the Western front. To ensure stability and safeguard our supply centers, I propose a general understanding among all powers to refrain from aggressive moves against our borders. I welcome discussions on coordinated non-aggression measures and balanced moves, especially along the Channel and the Rhine. Let us work together to maintain equilibrium and prevent unnecessary conflict.), 1739018259004941:[1739018259004941\/F1901M\/GERMANY->GLOBAL](Greetings everyone! I enjoyed our opening moves and look forward to productive negotiations. My interests lie in ensuring stability in the west while being watchful in the east. I'm happy to discuss opportunities for cooperation with any interested parties.), 1739018260478845:[1739018260478845\/F1901M\/ITALY->AUSTRIA](Let's solidify our understanding. I am committed to leaving you alone in Trieste and will not engage aggressively in the Balkans this turn. In return, I hope we can continue focusing on common threats and maintain our cooperation.), 1739018261195534:[1739018261195534\/F1901M\/RUSSIA->GLOBAL](To all powers, I propose a focus on the Mediterranean. Let's discuss our plans for the upcoming moves in that region. We can secure our interests there together.), 1739018265510836:[1739018265510836\/F1901M\/TURKEY->RUSSIA](I noticed our borders are relatively calm right now. Given the potential threats from Austria and potentially other powers, I believe we could benefit from a non-aggression pact. Would you be interested in discussing coordinated moves that protect both our interests?), 1739018266802058:[1739018266802058\/F1901M\/AUSTRIA->GLOBAL](I believe it's essential for us to maintain open communication and alliances early on. I suggest we consider cooperative strategies to stabilize the region and avert any potential threats.), 1739018267837487:[1739018267837487\/F1901M\/ENGLAND->FRANCE](France, given Germany's aggression towards Belgium, it seems we share a common threat. Would you be open to coordinating our fleet movements to deter further German expansion? Perhaps a joint effort in the Channel or a show of force in the North Sea?), 1739018279184979:[1739018279184979\/F1901M\/FRANCE->GLOBAL](Fellow powers, as we approach F1901M, France is committed to a stance of careful defense and measured offense. We intend to secure our borders and maintain flexibility on both our northern and southern fronts. In the spirit of a stable equilibrium, I propose a non-aggression understanding with any power interested in mutual coexistence, while remaining cautious of any early aggressive maneuvers. Let us discuss how we can all benefit from a peaceful and balanced phase.), 1739018281459847:[1739018281459847\/F1901M\/GERMANY->GLOBAL](Hello everyone! Germany here. After a productive Spring 1901, I'm interested in establishing clear communication channels with all powers. I want to ensure stable and mutually beneficial relationships as we move forward. Who would like to discuss their plans and potential areas of cooperation?), 1739018283273111:[1739018283273111\/F1901M\/ITALY->AUSTRIA](I propose we strengthen our alliance by focusing together on attacking Turkey. If we coordinate, we can use this move to both of our advantages.), 1739018284021835:[1739018284021835\/F1901M\/RUSSIA->AUSTRIA](I propose we coordinate our moves. I will support your move to Trieste, and you support my move to Rumania. This will help us both against Turkey.), 1739018286523291:[1739018286523291\/F1901M\/TURKEY->RUSSIA](I see potential for mutual cooperation. Would you be interested in coordinating our moves in the Black Sea region to prevent Austrian expansion? A joint understanding could be beneficial for both of us.)}","summary":"PARSABLE OUTPUT:\n{\n \"orders\": [\n \"In the Fall 1901 movement phase, several key maneuvers and adjustments defined the board. Austria\u2019s orders were partially frustrated: its fleet in Trieste attempted to move to Venice but bounced, and its support attempts from Bud and Vienna ended up void, leaving its three units (A BUD, A VIE, F TRI) in place. England\u2019s reorganization was evident as it replaced its old units (F EDI, F LON, A LVP) with new forces; the fleet from the North Sea successfully advanced toward Belgium, while its other fleet in the English Channel (NWG) and the army in York held firm. France maintained a defensive posture with holds in Marseille and its other positions, even as it added a new fleet (F ENG) and army (A BUR) replacing lost units, adjusting its influence on ENG and BUR. Germany saw its fleet from Kiel successfully move to Holland (HOL) while its armies in Munich and Berlin supported each other and held their positions. Italy managed a similar update by introducing both a new fleet (F TYS) moving toward Tunis and an additional army (A APU) while holding its unit in Venice\u2014the losses in Naples and Rome reflecting changes from previous supply center adjustments. Russia\u2019s orders were mixed; although its fleet in Sevastopol moved toward Black Sea territory and it held firm with its fleet in St. Petersburg and army in Moscow, the support order from its new army in Ukraine for an advance from Budapest to Rumania went void. This change coincided with the replacement of its unit in Warsaw by the newly added A UKR. Finally, Turkey held all its positions with its fleet in Ankara and armies in Constantinople and Smyrna remaining unmoved. Overall, while several orders (notably Austria\u2019s and Russia\u2019s support actions) failed to have the intended effect, the phase was marked by significant unit turnover for England, France, Italy, and Russia as they adjusted their forces based on captured centers and supply changes.\"\n ]\n}"},{"name":"W1901A","state":{"timestamp":1739018328530180,"zobrist_hash":"6483516199393605148","note":"","name":"W1901A","units":{"AUSTRIA":["A BUD","A VIE","F TRI"],"ENGLAND":["F NWG","A YOR","F BEL"],"FRANCE":["A MAR","A BUR","F PIC"],"GERMANY":["A BER","A MUN","F HOL"],"ITALY":["A VEN","A APU","F TUN"],"RUSSIA":["A MOS","F STP\/SC","A UKR","F BLA"],"TURKEY":["F ANK","A CON","A SMY"]},"retreats":{"AUSTRIA":{},"ENGLAND":{},"FRANCE":{},"GERMANY":{},"ITALY":{},"RUSSIA":{},"TURKEY":{}},"centers":{"AUSTRIA":["BUD","TRI","VIE"],"ENGLAND":["EDI","LON","LVP","BEL"],"FRANCE":["BRE","MAR","PAR"],"GERMANY":["BER","KIE","MUN","HOL"],"ITALY":["NAP","ROM","VEN","TUN"],"RUSSIA":["MOS","SEV","STP","WAR"],"TURKEY":["ANK","CON","SMY"]},"homes":{"AUSTRIA":["BUD","TRI","VIE"],"ENGLAND":["EDI","LON","LVP"],"FRANCE":["BRE","MAR","PAR"],"GERMANY":["BER","KIE","MUN"],"ITALY":["NAP","ROM","VEN"],"RUSSIA":["MOS","SEV","STP","WAR"],"TURKEY":["ANK","CON","SMY"]},"influence":{"AUSTRIA":["BUD","VIE","TRI"],"ENGLAND":["EDI","LON","LVP","NWG","NTH","YOR","BEL"],"FRANCE":["BRE","MAR","PAR","ENG","BUR","PIC"],"GERMANY":["KIE","BER","MUN","HOL"],"ITALY":["NAP","ROM","VEN","TYS","APU","TUN"],"RUSSIA":["WAR","MOS","SEV","STP","UKR","BLA"],"TURKEY":["ANK","CON","SMY"]},"civil_disorder":{"AUSTRIA":0,"ENGLAND":0,"FRANCE":0,"GERMANY":0,"ITALY":0,"RUSSIA":0,"TURKEY":0},"builds":{"AUSTRIA":{"count":0,"homes":[]},"ENGLAND":{"count":1,"homes":["EDI","LON","LVP"]},"FRANCE":{"count":0,"homes":[]},"GERMANY":{"count":1,"homes":["KIE"]},"ITALY":{"count":1,"homes":["NAP","ROM"]},"RUSSIA":{"count":0,"homes":[]},"TURKEY":{"count":0,"homes":[]}},"phase":"W1901A","game_id":"h0xMu0r9Z5PUjUZQ","map":"standard","rules":["NO_PRESS","POWER_CHOICE"]},"orders":{"AUSTRIA":[],"ENGLAND":["F EDI B","F LON B","F LVP B"],"FRANCE":[],"GERMANY":["F KIE B"],"ITALY":["A ROM B","A NAP B"],"RUSSIA":[],"TURKEY":[]},"results":{"F EDI":[""],"F LON":["void"],"F LVP":["void"],"F KIE":[""],"A ROM":[""],"A NAP":["void"]},"messages":"SortedDict{}","summary":"PARSABLE OUTPUT:\n{\n \"orders\": [\n \"In phase W1901A, several build orders led to notable shifts in unit positions and supply center control. England\u2019s build orders from EDI, LON, and LVP only produced one new fleet \u2013 with the successful build now located at BEL \u2013 while an existing unit at NTH was removed. Germany\u2019s single build order from KIE resulted in a repositioned fleet showing up at HOL, thereby marking a shift in their naval placement. Italy\u2019s orders saw the build order from ROM succeed and the order from NAP fail, which is reflected by their replacement of the fleet originally at TYS with a new fleet at TUN as they secured the TUN center. Russia similarly replaced its fleet at SEV with a new fleet now at BLA. Meanwhile, Austria, France, and Turkey did not issue orders this turn \u2013 though France\u2019s unit composition was adjusted as they lost a fleet at ENG and gained one at PIC. Overall, these changes illustrate a series of successful and voided build orders that have subtly reconfigured the board, with several powers adjusting their naval positions and control over key centers.\"\n ]\n}"},{"name":"S1902M","state":{"timestamp":1739018343036405,"zobrist_hash":"2460937390791032094","note":"","name":"S1902M","units":{"AUSTRIA":["A BUD","A VIE","F TRI"],"ENGLAND":["F NWG","A YOR","F BEL","F EDI"],"FRANCE":["A MAR","A BUR","F PIC"],"GERMANY":["A BER","A MUN","F HOL","F KIE"],"ITALY":["A VEN","A APU","F TUN","A ROM"],"RUSSIA":["A MOS","F STP\/SC","A UKR","F BLA"],"TURKEY":["F ANK","A CON","A SMY"]},"retreats":{"AUSTRIA":{},"ENGLAND":{},"FRANCE":{},"GERMANY":{},"ITALY":{},"RUSSIA":{},"TURKEY":{}},"centers":{"AUSTRIA":["BUD","TRI","VIE"],"ENGLAND":["EDI","LON","LVP","BEL"],"FRANCE":["BRE","MAR","PAR"],"GERMANY":["BER","KIE","MUN","HOL"],"ITALY":["NAP","ROM","VEN","TUN"],"RUSSIA":["MOS","SEV","STP","WAR"],"TURKEY":["ANK","CON","SMY"]},"homes":{"AUSTRIA":["BUD","TRI","VIE"],"ENGLAND":["EDI","LON","LVP"],"FRANCE":["BRE","MAR","PAR"],"GERMANY":["BER","KIE","MUN"],"ITALY":["NAP","ROM","VEN"],"RUSSIA":["MOS","SEV","STP","WAR"],"TURKEY":["ANK","CON","SMY"]},"influence":{"AUSTRIA":["BUD","VIE","TRI"],"ENGLAND":["EDI","LON","LVP","NWG","NTH","YOR","BEL"],"FRANCE":["BRE","MAR","PAR","ENG","BUR","PIC"],"GERMANY":["KIE","BER","MUN","HOL"],"ITALY":["NAP","ROM","VEN","TYS","APU","TUN"],"RUSSIA":["WAR","MOS","SEV","STP","UKR","BLA"],"TURKEY":["ANK","CON","SMY"]},"civil_disorder":{"AUSTRIA":0,"ENGLAND":0,"FRANCE":0,"GERMANY":0,"ITALY":0,"RUSSIA":0,"TURKEY":0},"builds":{"AUSTRIA":{"count":0,"homes":[]},"ENGLAND":{"count":0,"homes":[]},"FRANCE":{"count":0,"homes":[]},"GERMANY":{"count":0,"homes":[]},"ITALY":{"count":0,"homes":[]},"RUSSIA":{"count":0,"homes":[]},"TURKEY":{"count":0,"homes":[]}},"phase":"S1902M","game_id":"h0xMu0r9Z5PUjUZQ","map":"standard","rules":["NO_PRESS","POWER_CHOICE"]},"orders":{"AUSTRIA":null,"ENGLAND":null,"FRANCE":null,"GERMANY":null,"ITALY":null,"RUSSIA":null,"TURKEY":null},"results":{},"messages":"SortedDict{}","summary":""}]}