aboutsummaryrefslogtreecommitdiff
path: root/diplomacy/web/src/gui/utils/load_game_from_disk.js
diff options
context:
space:
mode:
authornotoraptor <stevenbocco@gmail.com>2019-08-01 15:53:23 -0400
committerPhilip Paquette <pcpaquette@gmail.com>2019-08-01 16:32:55 -0400
commit891fb62a77b9a86f2bc71cc02a82089412982b2f (patch)
tree7152ec4ef8186741695a921d6cc7bac78102b0dd /diplomacy/web/src/gui/utils/load_game_from_disk.js
parent904ea5bcfab0ffe2b87d00fd0b938a8907c44842 (diff)
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.
Diffstat (limited to 'diplomacy/web/src/gui/utils/load_game_from_disk.js')
-rw-r--r--diplomacy/web/src/gui/utils/load_game_from_disk.js158
1 files changed, 88 insertions, 70 deletions
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 <https://www.gnu.org/licenses/>.
+// ==============================================================================
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);
+ });
});
}