diff --git a/src/public/js/burning-service.js b/src/public/js/burning-service.js index 7498921..4891833 100644 --- a/src/public/js/burning-service.js +++ b/src/public/js/burning-service.js @@ -237,6 +237,10 @@ function CharacterStorageService($http) { /**** Class BurningDataService (Angular Service) ****/ // This service is used to load the lifepaths, skills, traits, etc. from the server. function BurningDataService($http) { + + // Used to reference the object from within functions and callbacks + var myself = this; + /* JSON Data structure representing lifepaths. The structure is: stock: setting_name: @@ -264,43 +268,10 @@ function BurningDataService($http) { // A hash of StartingStatPoints objects keyed by stock. this.startingStatPts = {}; - this.events = { - stocksLoaded: { triggered : false, callbacks : [] }, - traitsLoaded: { triggered : false, callbacks : [] }, - skillsLoaded: { triggered : false, callbacks : [] }, - } - - this.registerEvent = function(eventName, callback){ - if(this.events[eventName].triggered) - callback(); - this.events[eventName].callbacks.push(callback); - } - this.triggerEvent = function(eventName) { - myself.events[eventName].triggered = true; - for(var callback of myself.events[eventName].callbacks) { - callback(); - } - } + /* Loading of stocks, skills, and traits begins on initializing the service - this.stockEvents = {}; - this.defineStockEvent = function(stockName, eventName) { - if(!(stockName in myself.stockEvents)) myself.stockEvents[stockName] = {}; - myself.stockEvents[stockName][eventName] = { triggered : false, callbacks : [] } ; - } - this.registerStockEvent = function(stockName, eventName, callback){ - if(myself.stockEvents[stockName][eventName].triggered) - callback(); - myself.stockEvents[stockName][eventName].callbacks.push(callback); - } - this.triggerStockEvent = function(stockName, eventName) { - myself.stockEvents[stockName][eventName].triggered = true; - for(var callback of myself.stockEvents[stockName][eventName].callbacks) { - callback(); - } - } - - - fetch("/stocks") + /* Load stocks from server */ + this.whenStocksLoaded = fetch("/stocks") .then((response) => response.json()) .then((data) => { if(DEBUG) @@ -308,64 +279,67 @@ function BurningDataService($http) { myself.stocks = data; for (var stock of Object.keys(data)) { myself.startingStatPts[stock] = new StartingStatPoints(myself.stocks[stock].starting_stats); - myself.defineStockEvent(stock, "lifepathsLoaded"); - myself.defineStockEvent(stock, "resourcesLoaded"); } - myself.triggerEvent("stocksLoaded"); }) .catch((error) => { console.log("Error: Getting stocks from server failed: "+error); }); /* Load skills from server */ - fetch("/skills") + this.whenSkillsLoaded = fetch("/skills") .then((response) => response.json()) .then((data) => { myself.skills = data; - myself.triggerEvent("skillsLoaded"); + if(DEBUG) + console.log("Loaded skill data: "+data); }) .catch((error) => { console.log("Error: Getting skills from server failed: "+error); }); /* Load traits from server */ - fetch("/traits") + this.whenTraitsLoaded = fetch("/traits") .then((response) => response.json()) .then((data) => { myself.traits = data; - myself.triggerEvent("traitsLoaded"); + if(DEBUG) + console.log("Loaded trait data: "+data); }) .catch((error) => { console.log("Error: Getting traits from server failed: "+error); }); + /* Lifepaths and resources defer until their stock is selected */ + + this.whenLifePathsLoadedForStock = {}; /* Load lifepaths from server */ this.loadLifepathsForStock = function(stock){ - fetch("/lifepaths/" + stock) + return myself.whenLifePathsLoadedForStock[stock] = fetch("/lifepaths/" + stock) .then((response) => response.json()) .then((data) => { myself.lifepaths[stock] = data; - myself.triggerStockEvent(stock, "lifepathsLoaded"); - console.log("Loaded "+stock+" lifepaths. " + Object.keys(myself.lifepaths[stock]).length + " settings"); + if(DEBUG) + console.log("Loaded "+stock+" lifepaths. " + Object.keys(myself.lifepaths[stock]).length + " settings"); }) .catch((error) => { console.log("Error: Getting "+stock+" lifepaths from server failed: "+error); }); - } + }; /* Load resources from server */ + this.whenResourcesLoadedForStock = {}; this.loadResourcesForStock = function(stock){ - fetch("/resources/" + stock) + return myself.whenResourcesLoadedForStock[stock] = fetch("/resources/" + stock) .then((response) => response.json()) .then((data) => { myself.resources[stock] = data; - myself.triggerStockEvent(stock, "resourcesLoaded"); - console.log("Loaded "+stock+" resources. "); + if(DEBUG) + console.log("Loaded "+stock+" resources. "); }) .catch((error) => { console.log("Error: Getting "+stock+" stat points from server failed: "+error); }); - } + }; } /**** End BurningDataService ****/ diff --git a/src/public/js/burning.js b/src/public/js/burning.js index d2515e4..e51b17a 100644 --- a/src/public/js/burning.js +++ b/src/public/js/burning.js @@ -349,7 +349,6 @@ function BurningCtrl($scope, $http, $modal, $timeout, settings, appropriateWeapo return result; } - $scope.onGenderChange = function(){ if ($scope.name.length == 0) { $scope.generateName(); @@ -359,19 +358,21 @@ function BurningCtrl($scope, $http, $modal, $timeout, settings, appropriateWeapo $scope.onStockChange = function(){ if(!$scope.stock) return; - if(!$scope.stockSelected) { + + if(!$scope.stockSelected) { // Removes 'select a stock' after the first selection $scope.stocks.shift(); $scope.stockSelected = true; } - var oldName = $scope.name; - if(!burningData.lifepaths[$scope.stock]) { - burningData.loadLifepathsForStock($scope.stock); - } + + let loadPromises = []; if(!burningData.resources[$scope.stock]) { - burningData.loadResourcesForStock($scope.stock); + loadPromises.push(burningData.loadResourcesForStock($scope.stock)); + } + if(!burningData.lifepaths[$scope.stock]) { + loadPromises.push(burningData.loadLifepathsForStock($scope.stock)); } - // TODO: technically a bug — only want this registered once per stock... - burningData.registerStockEvent($scope.stock, "lifepathsLoaded", function () { + Promise.all(loadPromises).then(() => { + var oldName = $scope.name; // Make a blank character sheet $scope.initialize($scope.stock); @@ -383,6 +384,8 @@ function BurningCtrl($scope, $http, $modal, $timeout, settings, appropriateWeapo calculateSettingNames($scope, burningData); calculateCurrentSettingLifepathNames($scope, burningData); calculateSpecialTraitsForDisplay($scope, burningData); + calculateGearSelectionLists($scope, burningData); + calculatePropertySelectionLists($scope, burningData); }); } @@ -409,10 +412,11 @@ function BurningCtrl($scope, $http, $modal, $timeout, settings, appropriateWeapo calculateUnspentSkillPoints($scope); } - burningData.registerEvent("stocksLoaded", function() { - $scope.stocks = [{ name: "Select a stock" }] + burningData.whenStocksLoaded.then(() => { + $scope.stocks = [{ name: "Select a stock" }]; $scope.stocks = $scope.stocks.concat(Object.values(burningData.stocks)); $scope.stockSelected = false; + $scope.$digest(); }); $scope.$on('$locationChangeStart', function(event, nextUrl, currentUrl) {