Merge branch 'stock-ruby-class' into custom-stocks

pull/11/head
Daniel Asher Resnick 2 years ago
commit a3fe5f508a
  1. 47
      src/public/js/burning-serialize.js
  2. 186
      src/public/js/burning-service.js
  3. 36
      src/public/js/burning.js

@ -1,8 +1,8 @@
function loadCurrentCharacterFromStruct($scope, charStruct, burningData, appropriateWeapons){
$scope.name = charStruct.name;
$scope.gender = charStruct.gender;
$scope.stock = charStruct.stock;
$scope.name = charStruct.name;
$scope.gender = charStruct.gender;
$scope.stock = charStruct.stock;
$scope.ensureStockLoaded($scope.stock).then(() => {
// Appropriate weapons must be loaded before calculateLifepathSkills is called.
if(serverSettings.storageType != 'server'){
appropriateWeapons.appropriateWeapons = charStruct.approp_weapons;
@ -15,8 +15,8 @@ function loadCurrentCharacterFromStruct($scope, charStruct, burningData, appropr
var selectedLifepaths = [];
for(var i = 0; i < charStruct.lifepaths.length; i++){
var lp = charStruct.lifepaths[i];
// lp[0] is setting name, lp[1] is lifepath name.
// lp[2] is brutalLifeDOF, lp[3] is brutalLifeTraitName,
// lp[0] is setting name, lp[1] is lifepath name.
// lp[2] is brutalLifeDOF, lp[3] is brutalLifeTraitName,
// lp[4] is lifepath time, if it's variable and the user selected a value
// lp[5] is the replacement skill for 'Weapon Of Choice' if it's present.
// lp[6] is the replacement stat array, if present. This is needed if the
@ -128,19 +128,19 @@ function loadCurrentCharacterFromStruct($scope, charStruct, burningData, appropr
// Load Resources
$scope.gear = {};
for(var i = 0; i < charStruct.gear.length; i++){
for(var i = 0; i < charStruct.gear.length; i++){
var gear = charStruct.gear[i];
$scope.gear[gear.desc] = new DisplayGear(gear.desc, gear.cost);
}
$scope.property = {};
for(var i = 0; i < charStruct.property.length; i++){
for(var i = 0; i < charStruct.property.length; i++){
var property = charStruct.property[i];
$scope.property[property.desc] = new DisplayGear(property.desc, property.cost);
}
$scope.relationships = {};
for(var i = 0; i < charStruct.relationships.length; i++){
for(var i = 0; i < charStruct.relationships.length; i++){
var rel = charStruct.relationships[i];
$scope.relationships[rel.desc] = new DisplayRelationship(
rel.desc,
@ -154,13 +154,13 @@ function loadCurrentCharacterFromStruct($scope, charStruct, burningData, appropr
}
$scope.affiliations = {};
for(var i = 0; i < charStruct.affiliations.length; i++){
for(var i = 0; i < charStruct.affiliations.length; i++){
var affil = charStruct.affiliations[i];
$scope.affiliations[affil.desc] = new DisplayAffiliation(affil.desc, affil.importance);
}
$scope.reputations = {};
for(var i = 0; i < charStruct.reputations.length; i++){
for(var i = 0; i < charStruct.reputations.length; i++){
var rep = charStruct.reputations[i];
$scope.reputations[rep.desc] = new DisplayReputation(rep.desc, rep.importance);
}
@ -173,14 +173,15 @@ function loadCurrentCharacterFromStruct($scope, charStruct, burningData, appropr
$scope.attributeModifierQuestionResults = loadAttributeModifierQuestionResultsFromSave($scope, charStruct.attr_mod_questions);
$scope.brutalLifeWithdrawn = charStruct.brutal_life_withdrawn;
$scope.$digest();
});
}
function convertCurrentCharacterToStruct($scope, appropriateWeapons) {
// To serialize:
// - Serialized version
// - Character name
// - Stock
// - Stock
// - Gender
// - A list Lifepath names, with setting: [setting, lifepath]
// - How many points were spent on which stat
@ -225,10 +226,10 @@ function convertCurrentCharacterToStruct($scope, appropriateWeapons) {
var displayStat = $scope.stats[i];
stats.push({
"name" : displayStat.name,
"shade" : displayStat.shade,
"mentalPoints" : displayStat.mentalPointsSpent,
"physicalPoints" : displayStat.physicalPointsSpent,
"name" : displayStat.name,
"shade" : displayStat.shade,
"mentalPoints" : displayStat.mentalPointsSpent,
"physicalPoints" : displayStat.physicalPointsSpent,
"eitherPoints" : displayStat.eitherPointsSpent
});
}
@ -277,7 +278,7 @@ function convertCurrentCharacterToStruct($scope, appropriateWeapons) {
}
var res = serializeResource( $scope.gear, function(display){
return {
return {
"cost" : display.cost,
"desc" : display.desc
};
@ -285,7 +286,7 @@ function convertCurrentCharacterToStruct($scope, appropriateWeapons) {
chardata.gear = res;
var res = serializeResource( $scope.property, function(display){
return {
return {
"cost" : display.cost,
"desc" : display.desc
};
@ -293,7 +294,7 @@ function convertCurrentCharacterToStruct($scope, appropriateWeapons) {
chardata.property = res;
var res = serializeResource( $scope.relationships, function(display){
return {
return {
"desc" : display.desc,
"importance" : display.importance,
"isImmedFam" : display.isImmedFam,
@ -306,7 +307,7 @@ function convertCurrentCharacterToStruct($scope, appropriateWeapons) {
chardata.relationships = res;
var res = serializeResource( $scope.affiliations, function(display){
return {
return {
"desc" : display.desc,
"importance" : display.importance
};
@ -314,7 +315,7 @@ function convertCurrentCharacterToStruct($scope, appropriateWeapons) {
chardata.affiliations = res;
var res = serializeResource( $scope.reputations, function(display){
return {
return {
"desc" : display.desc,
"importance" : display.importance
};

@ -1,4 +1,4 @@
var DEBUG = false;
/**** Class Settings (Angular Service) ****/
function Settings() {
this.enforceLifepathReqts = true;
@ -218,13 +218,14 @@ function CharacterStorageService($http) {
/* Load character names from server */
this.loadCharacterNames = function(){
$http.get("/list_chars/user1", {'timeout': 3000} ).
success(function(data,status,headers,config){
fetch("/list_chars/user1")
.then((response) => response.json())
.then((data) => {
myself.characterIdAndNames = data;
console.log("Loaded saved character names");
}).
error(function(data,status,headers,config){
console.log("Error: Loading saved character names from server failed: HTTP code " + status + ": " + data);
})
.catch((error) => {
console.log("Error: Loading saved character names from server failed: "+error);
});
}
@ -236,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:
@ -263,135 +268,78 @@ 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 : [] },
}
/* Loading of stocks, skills, and traits begins on initializing the service
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();
}
}
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();
}
}
var myself = this;
// Log events
this.registerEvent("stocksLoaded", function() {
console.log("Stocks fetched from server: ", Object.keys(myself.stocks))
// DEBUG:
// console.log("Stocks fetched from server: ", myself.stocks)
});
this.registerEvent("skillsLoaded", function() {
console.log("Loaded " + Object.keys(myself.skills).length + " skills.");
// DEBUG:
// console.log("Loaded skills: ", myself.skills);
});
this.registerEvent("traitsLoaded", function() {
console.log("Loaded " + Object.keys(myself.traits).length + " traits.");
// DEBUG:
// console.log("Loaded traits: ", myself.traits);
});
$http.get("/stocks", {'timeout': 3000}).
success(function(data,status,headers,config){
// DEBUG:
// console.log(data);
/* Load stocks from server */
this.whenStocksLoaded = fetch("/stocks")
.then((response) => response.json())
.then((data) => {
if(DEBUG)
console.log("Loaded stock data: "+data);
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");
}).
error(function(data,status,headers,config){
console.log("Error: Getting stocks from server failed: HTTP code " + status + ": " + data);
})
.catch((error) => {
console.log("Error: Getting stocks from server failed: "+error);
});
/* Load skills from server */
this.whenSkillsLoaded = fetch("/skills")
.then((response) => response.json())
.then((data) => {
myself.skills = data;
if(DEBUG)
console.log("Loaded skill data: "+data);
})
.catch((error) => {
console.log("Error: Getting skills from server failed: "+error);
});
/* Load traits from server */
this.whenTraitsLoaded = fetch("/traits")
.then((response) => response.json())
.then((data) => {
myself.traits = data;
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){
$http.get("/lifepaths/" + stock, {'timeout': 3000} ).
success(function(data,status,headers,config){
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");
}).
error(function(data,status,headers,config){
console.log("Error: Getting "+stock+" lifepaths from server failed: HTTP code " + status + ": " + data);
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){
$http.get("/resources/" + stock, {'timeout': 3000} ).
success(function(data,status,headers,config){
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. ");
}).
error(function(data,status,headers,config){
console.log("Error: Getting "+stock+" stat points from server failed: HTTP code " + status + ": " + data);
if(DEBUG)
console.log("Loaded "+stock+" resources. ");
})
.catch((error) => {
console.log("Error: Getting "+stock+" stat points from server failed: "+error);
});
}
/* Load skills from server */
$http.get("/skills", {'timeout': 3000} ).
success(function(data,status,headers,config){
myself.skills = data;
myself.triggerEvent("skillsLoaded");
}).
error(function(data,status,headers,config){
console.log("Error: Getting skills from server failed: HTTP code " + status + ": " + data);
});
/* Load traits from server */
$http.get("/traits", {'timeout': 3000} ).
success(function(data,status,headers,config){
myself.traits = data;
myself.triggerEvent("traitsLoaded");
}).
error(function(data,status,headers,config){
console.log("Error: Getting traits from server failed: HTTP code " + status + ": " + data);
});
// DEBUG:
// setTimeout(() => testStockLoading(myself), (2 * 1000));
}
function testStockLoading(dataService) {
console.log(dataService);
for (var stock in dataService.stocks) {
console.log(stock);
dataService.loadLifepathsForStock(stock);
dataService.loadResourcesForStock(stock);
}
};
}
/**** End BurningDataService ****/

@ -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,14 @@ 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);
}
if(!burningData.resources[$scope.stock]) {
burningData.loadResourcesForStock($scope.stock);
}
// TODO: technically a bug — only want this registered once per stock...
burningData.registerStockEvent($scope.stock, "lifepathsLoaded", function () {
$scope.ensureStockLoaded($scope.stock).then(() => {
var oldName = $scope.name;
// Make a blank character sheet
$scope.initialize($scope.stock);
@ -383,9 +377,23 @@ function BurningCtrl($scope, $http, $modal, $timeout, settings, appropriateWeapo
calculateSettingNames($scope, burningData);
calculateCurrentSettingLifepathNames($scope, burningData);
calculateSpecialTraitsForDisplay($scope, burningData);
calculateGearSelectionLists($scope, burningData);
calculatePropertySelectionLists($scope, burningData);
$scope.$digest();
});
}
$scope.ensureStockLoaded = function(stock) {
let loadPromises = [];
if(!burningData.lifepaths[stock]) {
loadPromises.push(burningData.loadLifepathsForStock(stock));
}
if(!burningData.resources[stock]) {
loadPromises.push(burningData.loadResourcesForStock(stock));
}
return Promise.all(loadPromises);
};
$scope.onSettingChange = function(){
calculateCurrentSettingLifepathNames($scope, burningData);
@ -409,10 +417,10 @@ function BurningCtrl($scope, $http, $modal, $timeout, settings, appropriateWeapo
calculateUnspentSkillPoints($scope);
}
burningData.registerEvent("stocksLoaded", function() {
$scope.stocks = [{ name: "Select a stock" }]
$scope.stocks = $scope.stocks.concat(Object.values(burningData.stocks));
burningData.whenStocksLoaded.then(() => {
$scope.stocks = [{ name: "Select a stock" }, ...Object.values(burningData.stocks)];
$scope.stockSelected = false;
$scope.$digest();
});
$scope.$on('$locationChangeStart', function(event, nextUrl, currentUrl) {

Loading…
Cancel
Save