From 891fb62a77b9a86f2bc71cc02a82089412982b2f Mon Sep 17 00:00:00 2001 From: notoraptor Date: Thu, 1 Aug 2019 15:53:23 -0400 Subject: Refactored SVG map into a React component - Create link to diplomacy map folder into web/src/diplomacy/maps - Remove old web/src/gui/map folder. - [web] Handle click only on current map. - [web/game] Remove useless `wait` state. - Remove unused nodejs modules. - [web] Use queue to handle game notifications in sequential order. - Make all calls to setState() asynchronous in Page and ContentGame components. - Make sure notifications are handled in the order in which they come. --- diplomacy/web/src/gui/utils/load_game_from_disk.js | 158 ++++++++++++--------- 1 file changed, 88 insertions(+), 70 deletions(-) (limited to 'diplomacy/web/src/gui/utils/load_game_from_disk.js') 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 ca49aa0..a65e1df 100644 --- a/diplomacy/web/src/gui/utils/load_game_from_disk.js +++ b/diplomacy/web/src/gui/utils/load_game_from_disk.js @@ -1,83 +1,101 @@ +// ============================================================================== +// Copyright (C) 2019 - Philip Paquette, Steven Bocco +// +// This program is free software: you can redistribute it and/or modify it under +// the terms of the GNU Affero General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) any +// later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +// details. +// +// You should have received a copy of the GNU Affero General Public License along +// with this program. If not, see . +// ============================================================================== import $ from "jquery"; import {STRINGS} from "../../diplomacy/utils/strings"; import {Game} from "../../diplomacy/engine/game"; -export function loadGameFromDisk(onLoad, onError) { - const input = $(document.createElement('input')); - input.attr("type", "file"); - input.trigger('click'); - input.change(event => { - const file = event.target.files[0]; - if (!file.name.match(/\.json$/i)) { - onError(`Invalid JSON filename ${file.name}`); - return; - } - 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 = {}; +export function loadGameFromDisk() { + return new Promise((onLoad, onError) => { + const input = $(document.createElement('input')); + input.attr("type", "file"); + input.trigger('click'); + input.change(event => { + const file = event.target.files[0]; + if (!file.name.match(/\.json$/i)) { + onError(`Invalid JSON filename ${file.name}`); + return; + } + 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 = {}; - // Load all saved phases (expect the latest one) to history fields. - 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; + // Load all saved phases (expect the latest one) to history fields. + 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; + } } + 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; } - 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; - } - // Load latest phase separately and use it later to define the current game 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; + // Load latest phase separately and use it later to define the current game 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; + } } - } - if (!latestGameState.name) - latestGameState.name = latestPhase.name; - // TODO: NB: What is latest phase in loaded JSON contains order results? Not sure if it is well handled. - gameObject.result_history[latestGameState.name] = latestPhaseResults; + 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; - gameObject.messages = []; - gameObject.role = STRINGS.OBSERVER_TYPE; - gameObject.status = STRINGS.COMPLETED; - gameObject.timestamp_created = 0; - gameObject.deadline = 0; - gameObject.n_controls = 0; - gameObject.registration_password = ''; - const game = new Game(gameObject); + gameObject.messages = []; + gameObject.role = STRINGS.OBSERVER_TYPE; + gameObject.status = STRINGS.COMPLETED; + gameObject.timestamp_created = 0; + 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. - game.setPhaseData({ - name: latestGameState.name, - state: latestGameState, - orders: latestPhaseOrders, - messages: latestPhaseMessages - }); - onLoad(game); - }; - reader.readAsText(file); + // Set game current phase and state using latest phase found in JSON file. + game.setPhaseData({ + name: latestGameState.name, + state: latestGameState, + orders: latestPhaseOrders, + messages: latestPhaseMessages + }); + onLoad(game); + }; + reader.readAsText(file); + }); }); } -- cgit v1.2.3